Skip to content

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 name
  • prompt — 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

PropertyTypeDescription
idnumberAuto-increment ID
uuidstringUnique identifier
namestringBoard name
promptstring | nullBoard-level agent system prompt
workingDirectoryUUIDstring | nullFolder UUID to restrict agents to
defaultLLMProfileUUIDstring | nullDefault LLM provider profile for agent runs
columnsKanbanColumn[]Columns (populated by findBoard)

KanbanColumn

PropertyTypeDescription
uuidstringUnique identifier
namestringColumn name
onIdeaAddedNotifyAgentbooleanTrigger agent on idea add
onIdeaAddedSystemPromptstring | nullSystem prompt template
ideasstring[]Idea UUIDs (ordered by position)

KanbanIdea

PropertyTypeDescription
idnumberAuto-increment ID
uuidstringUnique identifier
titlestringIdea title
descriptionstring | nullMarkdown description
createdAtnumberCreation timestamp (epoch millis)
lastModifiedAtnumberLast modified timestamp
agentRunUUIDstring | nullAssociated agent run UUID
agentRunStatusstring | nullResolved agent status (PENDING, RUNNING, COMPLETED, FAILED, CANCELLED)
needsClarificationbooleanAgent flagged this idea as needing human input
parentIdeaUUIDstring | nullParent idea (set when split from a larger idea)
llmProfileUUIDstring | nullLLM provider profile override for this idea
createdByIdnumberUser ID (0 = agent)
subTaskCountnumberNumber of child ideas (transient, not persisted)
commentsKanbanIdeaComment[]Comments on the idea

KanbanIdeaComment

PropertyTypeDescription
idnumberComment ID
commentedBynumberUser ID (0 = agent)
commentedAtnumberTimestamp (epoch millis)
commentstringComment text
typestring | nullComment type: null = plain, "question" = structured
questionTypestring | nullQuestion kind: single_select, multi_select, yes_no, free_text
questionTextstring | nullQuestion prompt text
optionsstring[] | nullSelectable options for select questions
answerstring[] | nullUser's answer(s)
answeredboolean | nullWhether the user has responded

Full API Reference

MethodDescription
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

DieselEngine Scripting Documentation