Appearance
Kanban API
DieselEngine includes a built-in Kanban system for managing boards, columns, and ideas. Columns can optionally trigger autonomous agent runs when ideas are added to them.
Getting the Service
javascript
const kanban = diesel.getKanbanService();Boards
Create a Board
New boards come with four default columns: Backlog, Planned, Working, and Done.
javascript
kanban.createBoard("Sprint 1", null, null);name— board nameprompt— board-level system prompt for agent runs (nullable)workingDirectoryUUID— UUID of a folder to restrict agents to (nullable for unrestricted)
List All Boards
Returns lightweight board objects (columns are not populated).
javascript
const boards = kanban.listBoards();
for (const board of boards) {
console.log(board.uuid, board.name);
}Find a Board
Returns the board with its columns populated.
javascript
const board = kanban.findBoard(boardUUID);
console.log(board.name);
console.log(board.columns.length, "columns");Update a Board
javascript
// Basic update (4 params)
kanban.updateBoard(boardUUID, "Sprint 2", null, null);
// With default LLM profile (5 params)
kanban.updateBoard(boardUUID, "Sprint 2", null, null, llmProfileUUID);Delete a Board
Cascade-deletes all columns and ideas in the board.
javascript
kanban.deleteBoard(boardUUID);Columns
List Columns
Returns columns ordered by position, with idea UUIDs populated.
javascript
const columns = kanban.listColumns(boardUUID);
for (const col of columns) {
console.log(col.name, "->", col.ideas.length, "ideas");
}Create a Column
javascript
const DieselKanbanColumn = Java.type(
'com.dieselengine.diesel.models.kanban.DieselKanbanColumn'
);
const col = new DieselKanbanColumn();
col.name = "Review";
kanban.createColumn(boardUUID, col);Agent-Triggered Columns
Set onIdeaAddedNotifyAgent to true to trigger an agent run whenever an idea is added to the column. Use __IDEA_UUID__ as a placeholder in the system prompt.
javascript
const col = new DieselKanbanColumn();
col.name = "Working";
col.onIdeaAddedNotifyAgent = true;
col.onIdeaAddedSystemPrompt = `
An idea has been added to the Working column.
Read the idea at __IDEA_UUID__ and implement the feature described.
When done, move the idea to the Done column and add a comment with a summary.
`;
kanban.createColumn(boardUUID, col);When an idea is dropped into this column, an autonomous agent run starts with the configured system prompt (with __IDEA_UUID__ replaced by the actual idea UUID). The agent has access to all MCP tools.
Find a Column
javascript
const column = kanban.findColumn(columnUUID);
console.log(column.name, column.ideas.length, "ideas");Update a Column
javascript
const column = kanban.findColumn(columnUUID);
column.name = "In Review";
column.onIdeaAddedNotifyAgent = false;
kanban.updateColumn(columnUUID, column);Delete a Column
Ideas in the column are not deleted.
javascript
kanban.deleteColumn(columnUUID);Reorder Columns
javascript
kanban.reorderColumns(boardUUID, [col1UUID, col2UUID, col3UUID]);Ideas
Create an Idea
javascript
const DieselKanbanIdea = Java.type(
'com.dieselengine.diesel.models.kanban.DieselKanbanIdea'
);
const idea = new DieselKanbanIdea();
idea.title = "Implement user search endpoint";
idea.description = `
Create a GET endpoint at /api/users/search that accepts
a 'q' query parameter and returns matching users.
`;
kanban.createIdea(columnUUID, idea);Bulk Create Ideas
javascript
const DieselKanbanIdea = Java.type(
'com.dieselengine.diesel.models.kanban.DieselKanbanIdea'
);
const ideas = [
Object.assign(new DieselKanbanIdea(), { title: "Task A", description: "Do A" }),
Object.assign(new DieselKanbanIdea(), { title: "Task B", description: "Do B" })
];
const created = kanban.createIdeas(columnUUID, ideas);Find an Idea
javascript
const idea = kanban.findIdea(ideaUUID);
console.log(idea.title);
console.log(idea.description);
console.log("Created at:", new Date(idea.createdAt));
console.log("Comments:", idea.comments.length);
console.log("Agent status:", idea.agentRunStatus);
console.log("Needs clarification:", idea.needsClarification);Update an Idea
javascript
const idea = kanban.findIdea(ideaUUID);
idea.title = "Implement user search endpoint (v2)";
idea.description += "\n\nAlso support filtering by role.";
kanban.updateIdea(ideaUUID, idea);Move an Idea
javascript
kanban.moveIdeaToColumn(ideaUUID, targetColumnUUID);Bulk Move Ideas
javascript
const moved = kanban.moveIdeasToColumn([idea1UUID, idea2UUID], targetColumnUUID);Reorder Ideas
javascript
kanban.reorderIdeas(columnUUID, [idea1UUID, idea3UUID, idea2UUID]);Find Which Column an Idea Is In
javascript
const column = kanban.findColumnOfIdea(ideaUUID);
console.log("Idea is in column:", column.name);List Ideas in a Column
Returns ideas ordered by position.
javascript
const ideas = kanban.listIdeas(columnUUID);
for (const idea of ideas) {
console.log(`- ${idea.title} (${idea.uuid})`);
}Delete an Idea
javascript
kanban.deleteIdea(ideaUUID);Bulk Delete Ideas
javascript
const deleted = kanban.deleteIdeas([idea1UUID, idea2UUID, idea3UUID]);Agent Operations
Trigger Agent for Idea
Manually trigger (or re-trigger) the agent for an idea. Uses the column's configured system prompt.
javascript
kanban.triggerAgentForIdea(ideaUUID);Continue Agent for Idea
Continue a previous agent run, inheriting its conversation transcript.
javascript
kanban.continueAgentForIdea(ideaUUID);Cancel Agent for Idea
Cancel the currently running agent for an idea.
javascript
kanban.cancelAgentForIdea(ideaUUID);Split Idea
Split an idea into smaller sub-tasks using the AI agent. Creates 2-6 sub-tasks in the same column with parentIdeaUUID set.
javascript
kanban.splitIdea(ideaUUID);Comments
Add a Comment
Append a comment to an idea without reading and re-sending the full idea.
javascript
const DieselKanbanIdeaComment = Java.type(
'com.dieselengine.diesel.models.kanban.DieselKanbanIdeaComment'
);
const comment = new DieselKanbanIdeaComment();
comment.comment = "This looks good, please proceed.";
kanban.addComment(ideaUUID, comment, null);The needsClarification parameter is optional. Set it to true to flag the idea as needing human input, or false to clear the flag.
javascript
// Agent flags idea as needing clarification
kanban.addComment(ideaUUID, comment, true);
// Human responds and clears the flag (re-triggers agent)
kanban.addComment(ideaUUID, humanReplyComment, false);Data Types
KanbanBoard
| Property | Type | Description |
|---|---|---|
id | number | Auto-increment ID |
uuid | string | Unique identifier |
name | string | Board name |
prompt | string | null | Board-level agent system prompt |
workingDirectoryUUID | string | null | Folder UUID to restrict agents to |
defaultLLMProfileUUID | string | null | Default LLM provider profile for agent runs |
columns | KanbanColumn[] | Columns (populated by findBoard) |
KanbanColumn
| Property | Type | Description |
|---|---|---|
uuid | string | Unique identifier |
name | string | Column name |
onIdeaAddedNotifyAgent | boolean | Trigger agent on idea add |
onIdeaAddedSystemPrompt | string | null | System prompt template |
ideas | string[] | Idea UUIDs (ordered by position) |
KanbanIdea
| Property | Type | Description |
|---|---|---|
id | number | Auto-increment ID |
uuid | string | Unique identifier |
title | string | Idea title |
description | string | null | Markdown description |
createdAt | number | Creation timestamp (epoch millis) |
lastModifiedAt | number | Last modified timestamp |
agentRunUUID | string | null | Associated agent run UUID |
agentRunStatus | string | null | Resolved agent status (PENDING, RUNNING, COMPLETED, FAILED, CANCELLED) |
needsClarification | boolean | Agent flagged this idea as needing human input |
parentIdeaUUID | string | null | Parent idea (set when split from a larger idea) |
llmProfileUUID | string | null | LLM provider profile override for this idea |
createdById | number | User ID (0 = agent) |
subTaskCount | number | Number of child ideas (transient, not persisted) |
comments | KanbanIdeaComment[] | Comments on the idea |
KanbanIdeaComment
| Property | Type | Description |
|---|---|---|
id | number | Comment ID |
commentedBy | number | User ID (0 = agent) |
commentedAt | number | Timestamp (epoch millis) |
comment | string | Comment text |
type | string | null | Comment type: null = plain, "question" = structured |
questionType | string | null | Question kind: single_select, multi_select, yes_no, free_text |
questionText | string | null | Question prompt text |
options | string[] | null | Selectable options for select questions |
answer | string[] | null | User's answer(s) |
answered | boolean | null | Whether the user has responded |
Full API Reference
| Method | Description |
|---|---|
kanban.createBoard(name, prompt, workingDirectoryUUID) | Create a board with default columns |
kanban.listBoards() | List all boards (lightweight) |
kanban.findBoard(uuid) | Get board with columns |
kanban.updateBoard(uuid, name, prompt, workingDirectoryUUID) | Update board settings |
kanban.updateBoard(uuid, name, prompt, workingDirectoryUUID, defaultLLMProfileUUID) | Update board with LLM profile |
kanban.deleteBoard(uuid) | Delete board (cascades) |
kanban.createColumn(boardUUID, column) | Add column to board |
kanban.listColumns(boardUUID) | List columns for board |
kanban.findColumn(uuid) | Get column with idea UUIDs |
kanban.updateColumn(uuid, column) | Update column properties |
kanban.deleteColumn(uuid) | Delete column |
kanban.reorderColumns(boardUUID, columnUUIDs) | Reorder columns within board |
kanban.createIdea(columnUUID, idea) | Add idea to column |
kanban.createIdeas(columnUUID, ideas) | Bulk create ideas |
kanban.listIdeas(columnUUID) | List ideas in column |
kanban.findIdea(uuid) | Get idea with comments |
kanban.updateIdea(uuid, idea) | Update idea |
kanban.moveIdeaToColumn(ideaUUID, columnUUID) | Move idea |
kanban.moveIdeasToColumn(ideaUUIDs, columnUUID) | Bulk move ideas |
kanban.reorderIdeas(columnUUID, ideaUUIDs) | Reorder ideas within column |
kanban.findColumnOfIdea(ideaUUID) | Find column of idea |
kanban.deleteIdea(uuid) | Delete idea |
kanban.deleteIdeas(uuids) | Bulk delete ideas |
kanban.triggerAgentForIdea(ideaUUID) | Trigger agent for idea |
kanban.continueAgentForIdea(ideaUUID) | Continue previous agent run |
kanban.cancelAgentForIdea(ideaUUID) | Cancel running agent |
kanban.addComment(ideaUUID, comment, needsClarification) | Append comment to idea |
kanban.splitIdea(ideaUUID) | Split idea into sub-tasks |