create-claude-kanban 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/templates/kanban.cjs +53 -16
package/package.json
CHANGED
package/templates/kanban.cjs
CHANGED
|
@@ -12,21 +12,20 @@ delete process.env.CLAUDECODE;
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
var config;
|
|
15
|
-
var _configPath = require("path").join(__dirname, "..", "kanban.config.json");
|
|
16
15
|
try {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
var configPath = require("path").join(__dirname, "..", "kanban.config.json");
|
|
17
|
+
if (require("fs").existsSync(configPath)) {
|
|
18
|
+
var raw = JSON.parse(require("fs").readFileSync(configPath, "utf8"));
|
|
20
19
|
config = {
|
|
21
|
-
port:
|
|
22
|
-
projectName: (
|
|
20
|
+
port: raw.port || 4040,
|
|
21
|
+
projectName: (raw.projects && raw.projects[0] && raw.projects[0].name) || "Project",
|
|
23
22
|
slack: {
|
|
24
23
|
webhookUrl: process.env.SLACK_AGENT_WEBHOOK || "",
|
|
25
24
|
botToken: process.env.SLACK_BOT_TOKEN || "",
|
|
26
25
|
appToken: process.env.SLACK_APP_TOKEN || "",
|
|
27
26
|
channelId: process.env.SLACK_CHANNEL_ID || "",
|
|
28
27
|
adminUsers: (process.env.SLACK_ADMIN_USERS || "").split(",").filter(Boolean),
|
|
29
|
-
command: (
|
|
28
|
+
command: (raw.slack && raw.slack.command) || "/kanban",
|
|
30
29
|
},
|
|
31
30
|
};
|
|
32
31
|
} else { throw new Error("no config"); }
|
|
@@ -34,7 +33,7 @@ try {
|
|
|
34
33
|
try { require("dotenv").config({ path: require("path").join(__dirname, "..", ".env") }); } catch {}
|
|
35
34
|
config = {
|
|
36
35
|
port: parseInt(process.env.PORT) || 4040,
|
|
37
|
-
projectName:
|
|
36
|
+
projectName: "Project",
|
|
38
37
|
slack: {
|
|
39
38
|
webhookUrl: process.env.SLACK_AGENT_WEBHOOK || "",
|
|
40
39
|
botToken: process.env.SLACK_BOT_TOKEN || "",
|
|
@@ -71,7 +70,7 @@ function readProjects() {
|
|
|
71
70
|
return JSON.parse(fs.readFileSync(PROJECTS_FILE, "utf-8"));
|
|
72
71
|
}
|
|
73
72
|
} catch {}
|
|
74
|
-
var defaults = [{ id: "default", name:
|
|
73
|
+
var defaults = [{ id: "default", name: PROJECT_NAME, dir: "kanban", color: "#3B82F6" }];
|
|
75
74
|
writeProjects(defaults);
|
|
76
75
|
return defaults;
|
|
77
76
|
}
|
|
@@ -271,7 +270,7 @@ function executeAction(action) {
|
|
|
271
270
|
return results;
|
|
272
271
|
}
|
|
273
272
|
|
|
274
|
-
function buildChatSystemPrompt(tasks, projectName) {
|
|
273
|
+
function buildChatSystemPrompt(tasks, projectName, currentProjectId) {
|
|
275
274
|
var orchestratorPrompt = readOrchestratorPrompt();
|
|
276
275
|
var history = readOrchestratorHistory(5);
|
|
277
276
|
var taskDetail = tasks.map(function (t) {
|
|
@@ -284,6 +283,36 @@ function buildChatSystemPrompt(tasks, projectName) {
|
|
|
284
283
|
return line;
|
|
285
284
|
}).join("\n");
|
|
286
285
|
|
|
286
|
+
// Cross-project awareness
|
|
287
|
+
var allProjects = readProjects();
|
|
288
|
+
var otherProjects = allProjects.filter(function(p) { return p.id !== currentProjectId; });
|
|
289
|
+
var crossProjectInfo = "";
|
|
290
|
+
if (otherProjects.length > 0) {
|
|
291
|
+
crossProjectInfo += "## All Projects\n";
|
|
292
|
+
crossProjectInfo += "| ID | Name | Color |\n|---|---|---|\n";
|
|
293
|
+
for (var pi = 0; pi < allProjects.length; pi++) {
|
|
294
|
+
var p = allProjects[pi];
|
|
295
|
+
var marker = p.id === currentProjectId ? " ← current" : "";
|
|
296
|
+
crossProjectInfo += "| " + p.id + " | " + p.name + marker + " | " + (p.color || "") + " |\n";
|
|
297
|
+
}
|
|
298
|
+
crossProjectInfo += "\n";
|
|
299
|
+
// Include summary of other projects' tasks
|
|
300
|
+
for (var oi = 0; oi < otherProjects.length; oi++) {
|
|
301
|
+
var op = otherProjects[oi];
|
|
302
|
+
var otherTasks = readAllTasks(op.id);
|
|
303
|
+
var pending = otherTasks.filter(function(t) { return t.status === "pending"; }).length;
|
|
304
|
+
var inProg = otherTasks.filter(function(t) { return t.status === "in_progress"; }).length;
|
|
305
|
+
var done = otherTasks.filter(function(t) { return t.status === "completed"; }).length;
|
|
306
|
+
crossProjectInfo += "### " + op.name + " (" + op.id + "): " + pending + " pending, " + inProg + " in_progress, " + done + " completed\n";
|
|
307
|
+
var activeTasks = otherTasks.filter(function(t) { return t.status !== "completed"; });
|
|
308
|
+
for (var at = 0; at < Math.min(activeTasks.length, 10); at++) {
|
|
309
|
+
var ot = activeTasks[at];
|
|
310
|
+
crossProjectInfo += " #" + ot.id + " [" + ot.status + "] " + ot.subject + (ot.agent ? " (agent:" + ot.agent + ")" : "") + "\n";
|
|
311
|
+
}
|
|
312
|
+
crossProjectInfo += "\n";
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
287
316
|
var prompt = "";
|
|
288
317
|
if (orchestratorPrompt) {
|
|
289
318
|
prompt += orchestratorPrompt + "\n\n";
|
|
@@ -291,20 +320,26 @@ function buildChatSystemPrompt(tasks, projectName) {
|
|
|
291
320
|
prompt += "You are the Orchestrator for the " + projectName + " Kanban board.\n\n";
|
|
292
321
|
}
|
|
293
322
|
prompt += "## Current Board State\n";
|
|
294
|
-
prompt += "Project: " + projectName + "\n";
|
|
323
|
+
prompt += "Active Project: " + projectName + " (" + (currentProjectId || "") + ")\n";
|
|
295
324
|
prompt += "Working directory: " + path.join(__dirname, "..") + "\n\n";
|
|
296
325
|
prompt += (taskDetail || "(보드 비어있음)") + "\n\n";
|
|
326
|
+
if (crossProjectInfo) {
|
|
327
|
+
prompt += crossProjectInfo;
|
|
328
|
+
}
|
|
297
329
|
if (history) {
|
|
298
330
|
prompt += "## Recent Orchestrator Decisions\n" + history + "\n\n";
|
|
299
331
|
}
|
|
300
332
|
|
|
301
333
|
// Action block instructions
|
|
302
334
|
prompt += "## Task Actions\n";
|
|
303
|
-
prompt += "You can create, update, delete, and execute tasks
|
|
335
|
+
prompt += "You can create, update, delete, and execute tasks across ALL projects.\n";
|
|
304
336
|
prompt += "Include action blocks in your response to manipulate the board:\n\n";
|
|
305
|
-
prompt += "Create task:\n:::action\n";
|
|
337
|
+
prompt += "Create task (current project):\n:::action\n";
|
|
306
338
|
prompt += '{"type":"task_create","data":{"subject":"제목","description":"상세 설명","priority":"medium","agent":"frontend"}}\n';
|
|
307
339
|
prompt += ":::\n\n";
|
|
340
|
+
prompt += "Create task (cross-project — specify project ID):\n:::action\n";
|
|
341
|
+
prompt += '{"type":"task_create","data":{"subject":"제목","description":"설명","agent":"backend","project":"lms"}}\n';
|
|
342
|
+
prompt += ":::\n\n";
|
|
308
343
|
prompt += "Update task:\n:::action\n";
|
|
309
344
|
prompt += '{"type":"task_update","id":"15","data":{"status":"in_progress","activeForm":"진행 중 메시지"}}\n';
|
|
310
345
|
prompt += ":::\n\n";
|
|
@@ -319,7 +354,8 @@ function buildChatSystemPrompt(tasks, projectName) {
|
|
|
319
354
|
prompt += ":::\n\n";
|
|
320
355
|
prompt += "After each action block, write a natural language confirmation.\n";
|
|
321
356
|
prompt += "When the user says '실행해', '시작해', 'execute' — create tasks and execute immediately.\n";
|
|
322
|
-
prompt += "For broad/ambiguous requests, present a plan and wait for confirmation.\n
|
|
357
|
+
prompt += "For broad/ambiguous requests, present a plan and wait for confirmation.\n";
|
|
358
|
+
prompt += "When the user mentions another project by name or ID, use the project field in actions.\n\n";
|
|
323
359
|
|
|
324
360
|
prompt += "## Agent Roles & Models\n";
|
|
325
361
|
prompt += "| Agent | Model | Role |\n";
|
|
@@ -1268,7 +1304,8 @@ function buildAddTaskModal() {
|
|
|
1268
1304
|
function handleSlackAsk(question, channelId, client) {
|
|
1269
1305
|
slackAskActive = true;
|
|
1270
1306
|
var tasks = readAllTasks();
|
|
1271
|
-
var
|
|
1307
|
+
var defaultProjId = readProjects()[0].id || "default";
|
|
1308
|
+
var prompt = buildChatSystemPrompt(tasks, PROJECT_NAME, defaultProjId);
|
|
1272
1309
|
prompt += "\n\n[User via Slack]: " + question;
|
|
1273
1310
|
appendOrchestratorHistory("user-slack", question);
|
|
1274
1311
|
|
|
@@ -1767,7 +1804,7 @@ const server = http.createServer(async (req, res) => {
|
|
|
1767
1804
|
|
|
1768
1805
|
var tasks = readAllTasks(chatProject);
|
|
1769
1806
|
var projInfo = readProjects().find(function(p) { return p.id === chatProject; });
|
|
1770
|
-
var chatPrompt = buildChatSystemPrompt(tasks, projInfo ? projInfo.name : PROJECT_NAME);
|
|
1807
|
+
var chatPrompt = buildChatSystemPrompt(tasks, projInfo ? projInfo.name : PROJECT_NAME, chatProject);
|
|
1771
1808
|
|
|
1772
1809
|
// Build CLI args
|
|
1773
1810
|
var chatArgs = ["-p", "--verbose", "--output-format", "stream-json",
|