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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-claude-kanban",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "description": "Scaffold a multi-agent kanban system for Claude Code projects",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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
- if (require("fs").existsSync(_configPath)) {
18
- var _kanbanCfg = JSON.parse(require("fs").readFileSync(_configPath, "utf-8"));
19
- try { require("dotenv").config({ path: require("path").join(__dirname, "..", ".env") }); } catch {}
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: _kanbanCfg.port || parseInt(process.env.PORT) || 4040,
22
- projectName: (_kanbanCfg.projects && _kanbanCfg.projects[0] && _kanbanCfg.projects[0].name) || "Project",
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: (_kanbanCfg.slack && _kanbanCfg.slack.command) || process.env.SLACK_COMMAND || "/kanban",
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: process.env.PROJECT_NAME || "Project",
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: config.projectName, dir: "kanban", color: "#3B82F6" }];
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 directly using action blocks.\n";
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\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 prompt = buildChatSystemPrompt(tasks, PROJECT_NAME);
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",