maxsimcli 4.1.0 → 4.2.0

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.
Files changed (79) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/assets/CHANGELOG.md +8 -0
  3. package/dist/assets/dashboard/client/assets/{index-C_eAetZJ.js → index-BcRHShXD.js} +59 -59
  4. package/dist/assets/dashboard/client/assets/index-C199D4Eb.css +32 -0
  5. package/dist/assets/dashboard/client/index.html +2 -2
  6. package/dist/assets/dashboard/server.js +26 -11
  7. package/dist/assets/templates/agents/AGENTS.md +18 -69
  8. package/dist/assets/templates/agents/maxsim-code-reviewer.md +17 -92
  9. package/dist/assets/templates/agents/maxsim-codebase-mapper.md +57 -694
  10. package/dist/assets/templates/agents/maxsim-debugger.md +80 -925
  11. package/dist/assets/templates/agents/maxsim-executor.md +94 -431
  12. package/dist/assets/templates/agents/maxsim-integration-checker.md +51 -319
  13. package/dist/assets/templates/agents/maxsim-phase-researcher.md +63 -429
  14. package/dist/assets/templates/agents/maxsim-plan-checker.md +79 -568
  15. package/dist/assets/templates/agents/maxsim-planner.md +125 -855
  16. package/dist/assets/templates/agents/maxsim-project-researcher.md +32 -472
  17. package/dist/assets/templates/agents/maxsim-research-synthesizer.md +25 -134
  18. package/dist/assets/templates/agents/maxsim-roadmapper.md +66 -480
  19. package/dist/assets/templates/agents/maxsim-spec-reviewer.md +13 -55
  20. package/dist/assets/templates/agents/maxsim-verifier.md +95 -450
  21. package/dist/assets/templates/commands/maxsim/artefakte.md +122 -0
  22. package/dist/assets/templates/commands/maxsim/batch.md +42 -0
  23. package/dist/assets/templates/commands/maxsim/check-todos.md +1 -0
  24. package/dist/assets/templates/commands/maxsim/sdd.md +39 -0
  25. package/dist/assets/templates/references/thinking-partner.md +33 -0
  26. package/dist/assets/templates/workflows/batch.md +420 -0
  27. package/dist/assets/templates/workflows/check-todos.md +85 -1
  28. package/dist/assets/templates/workflows/discuss-phase.md +31 -0
  29. package/dist/assets/templates/workflows/execute-plan.md +96 -27
  30. package/dist/assets/templates/workflows/help.md +47 -0
  31. package/dist/assets/templates/workflows/sdd.md +426 -0
  32. package/dist/backend-server.cjs +174 -51
  33. package/dist/backend-server.cjs.map +1 -1
  34. package/dist/cli.cjs +310 -146
  35. package/dist/cli.cjs.map +1 -1
  36. package/dist/cli.js +5 -5
  37. package/dist/cli.js.map +1 -1
  38. package/dist/core/artefakte.d.ts.map +1 -1
  39. package/dist/core/artefakte.js +16 -0
  40. package/dist/core/artefakte.js.map +1 -1
  41. package/dist/core/context-loader.d.ts +1 -0
  42. package/dist/core/context-loader.d.ts.map +1 -1
  43. package/dist/core/context-loader.js +58 -0
  44. package/dist/core/context-loader.js.map +1 -1
  45. package/dist/core/core.d.ts +6 -0
  46. package/dist/core/core.d.ts.map +1 -1
  47. package/dist/core/core.js +238 -0
  48. package/dist/core/core.js.map +1 -1
  49. package/dist/core/index.d.ts +1 -1
  50. package/dist/core/index.d.ts.map +1 -1
  51. package/dist/core/index.js +5 -3
  52. package/dist/core/index.js.map +1 -1
  53. package/dist/core/phase.d.ts +11 -11
  54. package/dist/core/phase.d.ts.map +1 -1
  55. package/dist/core/phase.js +88 -73
  56. package/dist/core/phase.js.map +1 -1
  57. package/dist/core/roadmap.d.ts +2 -2
  58. package/dist/core/roadmap.d.ts.map +1 -1
  59. package/dist/core/roadmap.js +11 -10
  60. package/dist/core/roadmap.js.map +1 -1
  61. package/dist/core/state.d.ts +11 -11
  62. package/dist/core/state.d.ts.map +1 -1
  63. package/dist/core/state.js +60 -54
  64. package/dist/core/state.js.map +1 -1
  65. package/dist/core-RRjCSt0G.cjs.map +1 -1
  66. package/dist/{lifecycle-D4E9yP6E.cjs → lifecycle-0M4VqOMm.cjs} +2 -2
  67. package/dist/{lifecycle-D4E9yP6E.cjs.map → lifecycle-0M4VqOMm.cjs.map} +1 -1
  68. package/dist/mcp/context-tools.d.ts.map +1 -1
  69. package/dist/mcp/context-tools.js +7 -3
  70. package/dist/mcp/context-tools.js.map +1 -1
  71. package/dist/mcp/phase-tools.js +3 -3
  72. package/dist/mcp/phase-tools.js.map +1 -1
  73. package/dist/mcp-server.cjs +163 -40
  74. package/dist/mcp-server.cjs.map +1 -1
  75. package/dist/{server-pvY2WbKj.cjs → server-G1MIg_Oe.cjs} +7 -7
  76. package/dist/server-G1MIg_Oe.cjs.map +1 -0
  77. package/package.json +1 -1
  78. package/dist/assets/dashboard/client/assets/index-CmiJKqOU.css +0 -32
  79. package/dist/server-pvY2WbKj.cjs.map +0 -1
@@ -84,7 +84,7 @@ async function startBackend(projectCwd, opts) {
84
84
  writeLockFile(projectCwd, lockData);
85
85
  return lockData;
86
86
  } else {
87
- const { createBackendServer } = await Promise.resolve().then(() => require("./server-pvY2WbKj.cjs"));
87
+ const { createBackendServer } = await Promise.resolve().then(() => require("./server-G1MIg_Oe.cjs"));
88
88
  const server = createBackendServer({
89
89
  port,
90
90
  host: "127.0.0.1",
@@ -133,4 +133,4 @@ async function getBackendStatus(projectCwd) {
133
133
  exports.getBackendStatus = getBackendStatus;
134
134
  exports.startBackend = startBackend;
135
135
  exports.stopBackend = stopBackend;
136
- //# sourceMappingURL=lifecycle-D4E9yP6E.cjs.map
136
+ //# sourceMappingURL=lifecycle-0M4VqOMm.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle-D4E9yP6E.cjs","names":["path","fs"],"sources":["../src/backend/lifecycle.ts"],"sourcesContent":["/**\n * Backend Lifecycle — Start, stop, health check, discovery\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { spawn } from 'node:child_process';\nimport type { BackendLockFile, BackendStatus } from './types.js';\n\nconst LOCK_FILE = '.planning/.backend-lock';\n\n/**\n * Derive a deterministic port for a project path (range 3100-3199).\n * Simple hash mapped to 100-port range.\n */\nfunction projectPort(projectCwd: string): number {\n let hash = 0;\n for (const ch of projectCwd) {\n hash = ((hash << 5) - hash + ch.charCodeAt(0)) | 0;\n }\n return 3100 + (Math.abs(hash) % 100);\n}\n\nfunction lockFilePath(projectCwd: string): string {\n return path.join(projectCwd, LOCK_FILE);\n}\n\nfunction readLockFile(projectCwd: string): BackendLockFile | null {\n try {\n return JSON.parse(fs.readFileSync(lockFilePath(projectCwd), 'utf-8'));\n } catch {\n return null;\n }\n}\n\nfunction writeLockFile(projectCwd: string, data: BackendLockFile): void {\n const lockPath = lockFilePath(projectCwd);\n fs.mkdirSync(path.dirname(lockPath), { recursive: true });\n fs.writeFileSync(lockPath, JSON.stringify(data, null, 2), 'utf-8');\n}\n\nfunction removeLockFile(projectCwd: string): void {\n const lockPath = lockFilePath(projectCwd);\n try {\n fs.unlinkSync(lockPath);\n } catch {\n // may not exist\n }\n}\n\n/**\n * Make an HTTP request and return the parsed JSON body.\n * Uses native fetch (Node 22+).\n */\nasync function httpJson(\n method: string,\n url: string,\n timeoutMs: number = 5000,\n): Promise<Record<string, unknown> | null> {\n try {\n const res = await fetch(url, {\n method,\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!res.ok) return null;\n return await res.json() as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport async function startBackend(\n projectCwd: string,\n opts?: { port?: number; background?: boolean },\n): Promise<BackendLockFile> {\n // 1. Check if already running\n const existing = await getBackendStatus(projectCwd);\n if (existing && existing.status === 'ok') {\n return readLockFile(projectCwd)!;\n }\n\n // 2. Choose port\n const port = opts?.port ?? projectPort(projectCwd);\n const background = opts?.background ?? true;\n\n if (background) {\n // Spawn detached child process running backend-server.cjs\n const serverScript = path.join(__dirname, 'backend-server.cjs');\n const child = spawn(process.execPath, [serverScript], {\n cwd: projectCwd,\n detached: true,\n stdio: 'ignore',\n env: {\n ...process.env,\n MAXSIM_PORT: String(port),\n MAXSIM_PROJECT_CWD: projectCwd,\n },\n ...(process.platform === 'win32' ? { shell: true } : {}),\n });\n child.unref();\n\n const lockData: BackendLockFile = {\n pid: child.pid ?? 0,\n port,\n startedAt: Date.now(),\n cwd: projectCwd,\n };\n\n writeLockFile(projectCwd, lockData);\n return lockData;\n } else {\n // Foreground mode — import and start directly\n const { createBackendServer } = await import('./server.js');\n const server = createBackendServer({\n port,\n host: '127.0.0.1',\n projectCwd,\n enableTerminal: true,\n enableFileWatcher: true,\n enableMcp: true,\n logDir: path.join(projectCwd, '.planning', 'logs'),\n });\n\n await server.start();\n\n const lockData: BackendLockFile = {\n pid: process.pid,\n port: server.getPort(),\n startedAt: Date.now(),\n cwd: projectCwd,\n };\n\n writeLockFile(projectCwd, lockData);\n return lockData;\n }\n}\n\nexport async function stopBackend(projectCwd: string): Promise<boolean> {\n const lock = readLockFile(projectCwd);\n if (!lock) return false;\n\n // Try graceful shutdown via HTTP\n const result = await httpJson('POST', `http://127.0.0.1:${lock.port}/api/shutdown`);\n if (result) {\n removeLockFile(projectCwd);\n return true;\n }\n\n // Fallback: kill by PID\n try {\n process.kill(lock.pid, 'SIGTERM');\n } catch {\n // Process may already be dead\n }\n\n removeLockFile(projectCwd);\n return true;\n}\n\nexport async function getBackendStatus(projectCwd: string): Promise<BackendStatus | null> {\n const lock = readLockFile(projectCwd);\n if (!lock) return null;\n\n const data = await httpJson('GET', `http://127.0.0.1:${lock.port}/api/health`);\n if (!data || data.status !== 'ok') {\n // Stale lock file — clean up\n removeLockFile(projectCwd);\n return null;\n }\n\n return data as unknown as BackendStatus;\n}\n\nexport async function isBackendRunning(projectCwd: string): Promise<boolean> {\n const status = await getBackendStatus(projectCwd);\n return status !== null && status.status === 'ok';\n}\n\nexport function findBackendPort(projectCwd: string): number | null {\n const lock = readLockFile(projectCwd);\n return lock ? lock.port : null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"lifecycle-0M4VqOMm.cjs","names":["path","fs"],"sources":["../src/backend/lifecycle.ts"],"sourcesContent":["/**\n * Backend Lifecycle — Start, stop, health check, discovery\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { spawn } from 'node:child_process';\nimport type { BackendLockFile, BackendStatus } from './types.js';\n\nconst LOCK_FILE = '.planning/.backend-lock';\n\n/**\n * Derive a deterministic port for a project path (range 3100-3199).\n * Simple hash mapped to 100-port range.\n */\nfunction projectPort(projectCwd: string): number {\n let hash = 0;\n for (const ch of projectCwd) {\n hash = ((hash << 5) - hash + ch.charCodeAt(0)) | 0;\n }\n return 3100 + (Math.abs(hash) % 100);\n}\n\nfunction lockFilePath(projectCwd: string): string {\n return path.join(projectCwd, LOCK_FILE);\n}\n\nfunction readLockFile(projectCwd: string): BackendLockFile | null {\n try {\n return JSON.parse(fs.readFileSync(lockFilePath(projectCwd), 'utf-8'));\n } catch {\n return null;\n }\n}\n\nfunction writeLockFile(projectCwd: string, data: BackendLockFile): void {\n const lockPath = lockFilePath(projectCwd);\n fs.mkdirSync(path.dirname(lockPath), { recursive: true });\n fs.writeFileSync(lockPath, JSON.stringify(data, null, 2), 'utf-8');\n}\n\nfunction removeLockFile(projectCwd: string): void {\n const lockPath = lockFilePath(projectCwd);\n try {\n fs.unlinkSync(lockPath);\n } catch {\n // may not exist\n }\n}\n\n/**\n * Make an HTTP request and return the parsed JSON body.\n * Uses native fetch (Node 22+).\n */\nasync function httpJson(\n method: string,\n url: string,\n timeoutMs: number = 5000,\n): Promise<Record<string, unknown> | null> {\n try {\n const res = await fetch(url, {\n method,\n signal: AbortSignal.timeout(timeoutMs),\n });\n if (!res.ok) return null;\n return await res.json() as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport async function startBackend(\n projectCwd: string,\n opts?: { port?: number; background?: boolean },\n): Promise<BackendLockFile> {\n // 1. Check if already running\n const existing = await getBackendStatus(projectCwd);\n if (existing && existing.status === 'ok') {\n return readLockFile(projectCwd)!;\n }\n\n // 2. Choose port\n const port = opts?.port ?? projectPort(projectCwd);\n const background = opts?.background ?? true;\n\n if (background) {\n // Spawn detached child process running backend-server.cjs\n const serverScript = path.join(__dirname, 'backend-server.cjs');\n const child = spawn(process.execPath, [serverScript], {\n cwd: projectCwd,\n detached: true,\n stdio: 'ignore',\n env: {\n ...process.env,\n MAXSIM_PORT: String(port),\n MAXSIM_PROJECT_CWD: projectCwd,\n },\n ...(process.platform === 'win32' ? { shell: true } : {}),\n });\n child.unref();\n\n const lockData: BackendLockFile = {\n pid: child.pid ?? 0,\n port,\n startedAt: Date.now(),\n cwd: projectCwd,\n };\n\n writeLockFile(projectCwd, lockData);\n return lockData;\n } else {\n // Foreground mode — import and start directly\n const { createBackendServer } = await import('./server.js');\n const server = createBackendServer({\n port,\n host: '127.0.0.1',\n projectCwd,\n enableTerminal: true,\n enableFileWatcher: true,\n enableMcp: true,\n logDir: path.join(projectCwd, '.planning', 'logs'),\n });\n\n await server.start();\n\n const lockData: BackendLockFile = {\n pid: process.pid,\n port: server.getPort(),\n startedAt: Date.now(),\n cwd: projectCwd,\n };\n\n writeLockFile(projectCwd, lockData);\n return lockData;\n }\n}\n\nexport async function stopBackend(projectCwd: string): Promise<boolean> {\n const lock = readLockFile(projectCwd);\n if (!lock) return false;\n\n // Try graceful shutdown via HTTP\n const result = await httpJson('POST', `http://127.0.0.1:${lock.port}/api/shutdown`);\n if (result) {\n removeLockFile(projectCwd);\n return true;\n }\n\n // Fallback: kill by PID\n try {\n process.kill(lock.pid, 'SIGTERM');\n } catch {\n // Process may already be dead\n }\n\n removeLockFile(projectCwd);\n return true;\n}\n\nexport async function getBackendStatus(projectCwd: string): Promise<BackendStatus | null> {\n const lock = readLockFile(projectCwd);\n if (!lock) return null;\n\n const data = await httpJson('GET', `http://127.0.0.1:${lock.port}/api/health`);\n if (!data || data.status !== 'ok') {\n // Stale lock file — clean up\n removeLockFile(projectCwd);\n return null;\n }\n\n return data as unknown as BackendStatus;\n}\n\nexport async function isBackendRunning(projectCwd: string): Promise<boolean> {\n const status = await getBackendStatus(projectCwd);\n return status !== null && status.status === 'ok';\n}\n\nexport function findBackendPort(projectCwd: string): number | null {\n const lock = readLockFile(projectCwd);\n return lock ? lock.port : null;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"context-tools.d.ts","sourceRoot":"","sources":["../../src/mcp/context-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4M5D"}
1
+ {"version":3,"file":"context-tools.d.ts","sourceRoot":"","sources":["../../src/mcp/context-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgN5D"}
@@ -85,15 +85,19 @@ function registerContextTools(server) {
85
85
  }
86
86
  });
87
87
  // ── mcp_get_context_for_task ────────────────────────────────────────────────
88
- server.tool('mcp_get_context_for_task', 'Load context files for a task, including project context, roadmap, and optionally phase-specific and topic-specific files.', {
88
+ server.tool('mcp_get_context_for_task', 'Load context files for a task. Includes project context, roadmap, artefakte, and codebase docs filtered by topic. ' +
89
+ 'Topic keywords select relevant codebase docs: "ui/frontend" loads CONVENTIONS+STRUCTURE, ' +
90
+ '"api/backend" loads ARCHITECTURE+CONVENTIONS, "testing" loads TESTING+CONVENTIONS, ' +
91
+ '"database" loads ARCHITECTURE+STACK, "refactor" loads CONCERNS+ARCHITECTURE. ' +
92
+ 'Without topic, defaults to STACK+ARCHITECTURE.', {
89
93
  phase: zod_1.z
90
94
  .string()
91
95
  .optional()
92
- .describe('Optional phase number to scope context to'),
96
+ .describe('Phase number to scope context to'),
93
97
  topic: zod_1.z
94
98
  .string()
95
99
  .optional()
96
- .describe('Optional topic to filter context by'),
100
+ .describe('Topic keywords to filter codebase docs (e.g. "frontend", "api", "testing", "database", "refactor")'),
97
101
  }, async ({ phase, topic }) => {
98
102
  try {
99
103
  const cwd = (0, utils_js_1.detectProjectRoot)();
@@ -1 +1 @@
1
- {"version":3,"file":"context-tools.js","sourceRoot":"","sources":["../../src/mcp/context-tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-tools.js","sourceRoot":"","sources":["../../src/mcp/context-tools.ts"],"names":[],"mappings":"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"}
@@ -95,7 +95,7 @@ function registerPhaseTools(server) {
95
95
  if (!name || !name.trim()) {
96
96
  return (0, utils_js_1.mcpError)('Phase name must not be empty', 'Validation failed');
97
97
  }
98
- const result = (0, phase_js_1.phaseAddCore)(cwd, name, { includeStubs: true });
98
+ const result = await (0, phase_js_1.phaseAddCore)(cwd, name, { includeStubs: true });
99
99
  return (0, utils_js_1.mcpSuccess)({
100
100
  phase_number: result.phase_number,
101
101
  padded: result.padded,
@@ -121,7 +121,7 @@ function registerPhaseTools(server) {
121
121
  if (!name || !name.trim()) {
122
122
  return (0, utils_js_1.mcpError)('Phase name must not be empty', 'Validation failed');
123
123
  }
124
- const result = (0, phase_js_1.phaseInsertCore)(cwd, after, name, { includeStubs: true });
124
+ const result = await (0, phase_js_1.phaseInsertCore)(cwd, after, name, { includeStubs: true });
125
125
  return (0, utils_js_1.mcpSuccess)({
126
126
  phase_number: result.phase_number,
127
127
  after_phase: result.after_phase,
@@ -143,7 +143,7 @@ function registerPhaseTools(server) {
143
143
  if (!cwd) {
144
144
  return (0, utils_js_1.mcpError)('No .planning/ directory found', 'Project not detected');
145
145
  }
146
- const result = (0, phase_js_1.phaseCompleteCore)(cwd, phase);
146
+ const result = await (0, phase_js_1.phaseCompleteCore)(cwd, phase);
147
147
  return (0, utils_js_1.mcpSuccess)({
148
148
  completed_phase: result.completed_phase,
149
149
  phase_name: result.phase_name,
@@ -1 +1 @@
1
- {"version":3,"file":"phase-tools.js","sourceRoot":"","sources":["../../src/mcp/phase-tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"phase-tools.js","sourceRoot":"","sources":["../../src/mcp/phase-tools.ts"],"names":[],"mappings":"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"}
@@ -27037,6 +27037,77 @@ function generateSlugInternal(text) {
27037
27037
  strict: true
27038
27038
  });
27039
27039
  }
27040
+ async function pathExistsAsync(p) {
27041
+ try {
27042
+ await node_fs.promises.access(p);
27043
+ return true;
27044
+ } catch {
27045
+ return false;
27046
+ }
27047
+ }
27048
+ async function searchPhaseInDirAsync(baseDir, relBase, normalized) {
27049
+ try {
27050
+ const match = (await listSubDirsAsync(baseDir, true)).find((d) => d.startsWith(normalized));
27051
+ if (!match) return null;
27052
+ const dirMatch = match.match(/^(\d+[A-Z]?(?:\.\d+)?)-?(.*)/i);
27053
+ const phaseNumber = dirMatch ? dirMatch[1] : normalized;
27054
+ const phaseName = dirMatch && dirMatch[2] ? dirMatch[2] : null;
27055
+ const phaseDir = node_path.default.join(baseDir, match);
27056
+ const phaseFiles = await node_fs.promises.readdir(phaseDir);
27057
+ const plans = phaseFiles.filter(isPlanFile).sort();
27058
+ const summaries = phaseFiles.filter(isSummaryFile).sort();
27059
+ const hasResearch = phaseFiles.some((f) => f.endsWith("-RESEARCH.md") || f === "RESEARCH.md");
27060
+ const hasContext = phaseFiles.some((f) => f.endsWith("-CONTEXT.md") || f === "CONTEXT.md");
27061
+ const hasVerification = phaseFiles.some((f) => f.endsWith("-VERIFICATION.md") || f === "VERIFICATION.md");
27062
+ const completedPlanIds = new Set(summaries.map(summaryId));
27063
+ const incompletePlans = plans.filter((p) => !completedPlanIds.has(planId(p)));
27064
+ return {
27065
+ found: true,
27066
+ directory: node_path.default.join(relBase, match),
27067
+ phase_number: phaseNumber,
27068
+ phase_name: phaseName,
27069
+ phase_slug: phaseName ? phaseName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") : null,
27070
+ plans,
27071
+ summaries,
27072
+ incomplete_plans: incompletePlans,
27073
+ has_research: hasResearch,
27074
+ has_context: hasContext,
27075
+ has_verification: hasVerification
27076
+ };
27077
+ } catch (e) {
27078
+ debugLog("search-phase-in-dir-async-failed", {
27079
+ dir: baseDir,
27080
+ phase: normalized,
27081
+ error: errorMsg(e)
27082
+ });
27083
+ return null;
27084
+ }
27085
+ }
27086
+ async function findPhaseInternalAsync(cwd, phase) {
27087
+ if (!phase) return null;
27088
+ const pd = phasesPath(cwd);
27089
+ const normalized = normalizePhaseName(phase);
27090
+ const current = await searchPhaseInDirAsync(pd, node_path.default.join(".planning", "phases"), normalized);
27091
+ if (current) return current;
27092
+ const milestonesDir = planningPath(cwd, "milestones");
27093
+ if (!await pathExistsAsync(milestonesDir)) return null;
27094
+ try {
27095
+ const archiveDirs = (await node_fs.promises.readdir(milestonesDir, { withFileTypes: true })).filter((e) => e.isDirectory() && /^v[\d.]+-phases$/.test(e.name)).map((e) => e.name).sort().reverse();
27096
+ for (const archiveName of archiveDirs) {
27097
+ const versionMatch = archiveName.match(/^(v[\d.]+)-phases$/);
27098
+ if (!versionMatch) continue;
27099
+ const version = versionMatch[1];
27100
+ const result = await searchPhaseInDirAsync(node_path.default.join(milestonesDir, archiveName), node_path.default.join(".planning", "milestones", archiveName), normalized);
27101
+ if (result) {
27102
+ result.archived = version;
27103
+ return result;
27104
+ }
27105
+ }
27106
+ } catch (e) {
27107
+ debugLog("find-phase-async-milestone-search-failed", e);
27108
+ }
27109
+ return null;
27110
+ }
27040
27111
 
27041
27112
  //#endregion
27042
27113
  //#region ../../node_modules/yaml/dist/nodes/identity.js
@@ -33720,15 +33791,18 @@ function cmdErr(error) {
33720
33791
  *
33721
33792
  * Ported from maxsim/bin/lib/phase.cjs
33722
33793
  */
33723
- function scaffoldPhaseStubs(dirPath, phaseId, name) {
33794
+ async function scaffoldPhaseStubs(dirPath, phaseId, name) {
33724
33795
  const today = todayISO();
33725
- node_fs.default.writeFileSync(node_path.default.join(dirPath, `${phaseId}-CONTEXT.md`), `# Phase ${phaseId} Context: ${name}\n\n**Created:** ${today}\n**Phase goal:** [To be defined during /maxsim:discuss-phase]\n\n---\n\n_Context will be populated by /maxsim:discuss-phase_\n`);
33726
- node_fs.default.writeFileSync(node_path.default.join(dirPath, `${phaseId}-RESEARCH.md`), `# Phase ${phaseId}: ${name} - Research\n\n**Researched:** Not yet\n**Domain:** TBD\n**Confidence:** TBD\n\n---\n\n_Research will be populated by /maxsim:research-phase_\n`);
33796
+ await Promise.all([node_fs.promises.writeFile(node_path.default.join(dirPath, `${phaseId}-CONTEXT.md`), `# Phase ${phaseId} Context: ${name}\n\n**Created:** ${today}\n**Phase goal:** [To be defined during /maxsim:discuss-phase]\n\n---\n\n_Context will be populated by /maxsim:discuss-phase_\n`), node_fs.promises.writeFile(node_path.default.join(dirPath, `${phaseId}-RESEARCH.md`), `# Phase ${phaseId}: ${name} - Research\n\n**Researched:** Not yet\n**Domain:** TBD\n**Confidence:** TBD\n\n---\n\n_Research will be populated by /maxsim:research-phase_\n`)]);
33727
33797
  }
33728
- function phaseAddCore(cwd, description, options) {
33798
+ async function phaseAddCore(cwd, description, options) {
33729
33799
  const rmPath = roadmapPath(cwd);
33730
- if (!node_fs.default.existsSync(rmPath)) throw new Error("ROADMAP.md not found");
33731
- const content = node_fs.default.readFileSync(rmPath, "utf-8");
33800
+ let content;
33801
+ try {
33802
+ content = await node_fs.promises.readFile(rmPath, "utf-8");
33803
+ } catch {
33804
+ throw new Error("ROADMAP.md not found");
33805
+ }
33732
33806
  const slug = generateSlugInternal(description);
33733
33807
  const phasePattern = getPhasePattern();
33734
33808
  let maxPhase = 0;
@@ -33741,15 +33815,15 @@ function phaseAddCore(cwd, description, options) {
33741
33815
  const paddedNum = String(newPhaseNum).padStart(2, "0");
33742
33816
  const dirName = `${paddedNum}-${slug}`;
33743
33817
  const dirPath = planningPath(cwd, "phases", dirName);
33744
- node_fs.default.mkdirSync(dirPath, { recursive: true });
33745
- node_fs.default.writeFileSync(node_path.default.join(dirPath, ".gitkeep"), "");
33746
- if (options?.includeStubs) scaffoldPhaseStubs(dirPath, paddedNum, description);
33818
+ await node_fs.promises.mkdir(dirPath, { recursive: true });
33819
+ await node_fs.promises.writeFile(node_path.default.join(dirPath, ".gitkeep"), "");
33820
+ if (options?.includeStubs) await scaffoldPhaseStubs(dirPath, paddedNum, description);
33747
33821
  const phaseEntry = `\n### Phase ${newPhaseNum}: ${description}\n\n**Goal:** [To be planned]\n**Requirements**: TBD\n**Depends on:** Phase ${maxPhase}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /maxsim:plan-phase ${newPhaseNum} to break down)\n`;
33748
33822
  let updatedContent;
33749
33823
  const lastSeparator = content.lastIndexOf("\n---");
33750
33824
  if (lastSeparator > 0) updatedContent = content.slice(0, lastSeparator) + phaseEntry + content.slice(lastSeparator);
33751
33825
  else updatedContent = content + phaseEntry;
33752
- node_fs.default.writeFileSync(rmPath, updatedContent, "utf-8");
33826
+ await node_fs.promises.writeFile(rmPath, updatedContent, "utf-8");
33753
33827
  return {
33754
33828
  phase_number: newPhaseNum,
33755
33829
  padded: paddedNum,
@@ -33758,10 +33832,14 @@ function phaseAddCore(cwd, description, options) {
33758
33832
  description
33759
33833
  };
33760
33834
  }
33761
- function phaseInsertCore(cwd, afterPhase, description, options) {
33835
+ async function phaseInsertCore(cwd, afterPhase, description, options) {
33762
33836
  const rmPath = roadmapPath(cwd);
33763
- if (!node_fs.default.existsSync(rmPath)) throw new Error("ROADMAP.md not found");
33764
- const content = node_fs.default.readFileSync(rmPath, "utf-8");
33837
+ let content;
33838
+ try {
33839
+ content = await node_fs.promises.readFile(rmPath, "utf-8");
33840
+ } catch {
33841
+ throw new Error("ROADMAP.md not found");
33842
+ }
33765
33843
  const slug = generateSlugInternal(description);
33766
33844
  const afterPhaseEscaped = "0*" + normalizePhaseName(afterPhase).replace(/^0+/, "").replace(/\./g, "\\.");
33767
33845
  if (!getPhasePattern(afterPhaseEscaped, "i").test(content)) throw new Error(`Phase ${afterPhase} not found in ROADMAP.md`);
@@ -33769,7 +33847,7 @@ function phaseInsertCore(cwd, afterPhase, description, options) {
33769
33847
  const normalizedBase = normalizePhaseName(afterPhase);
33770
33848
  const existingDecimals = [];
33771
33849
  try {
33772
- const dirs = listSubDirs(phasesDirPath);
33850
+ const dirs = await listSubDirsAsync(phasesDirPath);
33773
33851
  const decimalPattern = new RegExp(`^${normalizedBase}\\.(\\d+)`);
33774
33852
  for (const dir of dirs) {
33775
33853
  const dm = dir.match(decimalPattern);
@@ -33781,9 +33859,9 @@ function phaseInsertCore(cwd, afterPhase, description, options) {
33781
33859
  const decimalPhase = `${normalizedBase}.${existingDecimals.length === 0 ? 1 : Math.max(...existingDecimals) + 1}`;
33782
33860
  const dirName = `${decimalPhase}-${slug}`;
33783
33861
  const dirPath = planningPath(cwd, "phases", dirName);
33784
- node_fs.default.mkdirSync(dirPath, { recursive: true });
33785
- node_fs.default.writeFileSync(node_path.default.join(dirPath, ".gitkeep"), "");
33786
- if (options?.includeStubs) scaffoldPhaseStubs(dirPath, decimalPhase, description);
33862
+ await node_fs.promises.mkdir(dirPath, { recursive: true });
33863
+ await node_fs.promises.writeFile(node_path.default.join(dirPath, ".gitkeep"), "");
33864
+ if (options?.includeStubs) await scaffoldPhaseStubs(dirPath, decimalPhase, description);
33787
33865
  const phaseEntry = `\n### Phase ${decimalPhase}: ${description} (INSERTED)\n\n**Goal:** [Urgent work - to be planned]\n**Requirements**: TBD\n**Depends on:** Phase ${afterPhase}\n**Plans:** 0 plans\n\nPlans:\n- [ ] TBD (run /maxsim:plan-phase ${decimalPhase} to break down)\n`;
33788
33866
  const headerPattern = new RegExp(`(#{2,4}\\s*Phase\\s+0*${afterPhaseEscaped}:[^\\n]*\\n)`, "i");
33789
33867
  const headerMatch = content.match(headerPattern);
@@ -33794,7 +33872,7 @@ function phaseInsertCore(cwd, afterPhase, description, options) {
33794
33872
  if (nextPhaseMatch) insertIdx = headerIdx + headerMatch[0].length + nextPhaseMatch.index;
33795
33873
  else insertIdx = content.length;
33796
33874
  const updatedContent = content.slice(0, insertIdx) + phaseEntry + content.slice(insertIdx);
33797
- node_fs.default.writeFileSync(rmPath, updatedContent, "utf-8");
33875
+ await node_fs.promises.writeFile(rmPath, updatedContent, "utf-8");
33798
33876
  return {
33799
33877
  phase_number: decimalPhase,
33800
33878
  after_phase: afterPhase,
@@ -33803,18 +33881,19 @@ function phaseInsertCore(cwd, afterPhase, description, options) {
33803
33881
  description
33804
33882
  };
33805
33883
  }
33806
- function phaseCompleteCore(cwd, phaseNum) {
33884
+ async function phaseCompleteCore(cwd, phaseNum) {
33807
33885
  const rmPath = roadmapPath(cwd);
33808
33886
  const stPath = statePath(cwd);
33809
33887
  const phasesDirPath = phasesPath(cwd);
33810
33888
  const today = todayISO();
33811
- const phaseInfo = findPhaseInternal(cwd, phaseNum);
33889
+ const phaseInfo = await findPhaseInternalAsync(cwd, phaseNum);
33812
33890
  if (!phaseInfo) throw new Error(`Phase ${phaseNum} not found`);
33813
33891
  const planCount = phaseInfo.plans.length;
33814
33892
  const summaryCount = phaseInfo.summaries.length;
33815
33893
  let requirementsUpdated = false;
33816
- if (node_fs.default.existsSync(rmPath)) {
33817
- let roadmapContent = node_fs.default.readFileSync(rmPath, "utf-8");
33894
+ const rmExists = await pathExistsAsync(rmPath);
33895
+ if (rmExists) {
33896
+ let roadmapContent = await node_fs.promises.readFile(rmPath, "utf-8");
33818
33897
  const checkboxPattern = new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${escapePhaseNum(phaseNum)}[:\\s][^\\n]*)`, "i");
33819
33898
  roadmapContent = roadmapContent.replace(checkboxPattern, `$1x$2 (completed ${today})`);
33820
33899
  const phaseEscaped = escapePhaseNum(phaseNum);
@@ -33823,20 +33902,20 @@ function phaseCompleteCore(cwd, phaseNum) {
33823
33902
  const planCountPattern = new RegExp(`(#{2,4}\\s*Phase\\s+${phaseEscaped}[\\s\\S]*?\\*\\*Plans:\\*\\*\\s*)[^\\n]+`, "i");
33824
33903
  roadmapContent = roadmapContent.replace(planCountPattern, `$1${summaryCount}/${planCount} plans complete`);
33825
33904
  debugLog("phase-complete-write", `writing ROADMAP.md for phase ${phaseNum}`);
33826
- node_fs.default.writeFileSync(rmPath, roadmapContent, "utf-8");
33905
+ await node_fs.promises.writeFile(rmPath, roadmapContent, "utf-8");
33827
33906
  debugLog("phase-complete-write", `ROADMAP.md updated for phase ${phaseNum}`);
33828
33907
  const reqPath = planningPath(cwd, "REQUIREMENTS.md");
33829
- if (node_fs.default.existsSync(reqPath)) {
33908
+ if (await pathExistsAsync(reqPath)) {
33830
33909
  const reqMatch = roadmapContent.match(new RegExp(`Phase\\s+${escapePhaseNum(phaseNum)}[\\s\\S]*?\\*\\*Requirements:\\*\\*\\s*([^\\n]+)`, "i"));
33831
33910
  if (reqMatch) {
33832
33911
  const reqIds = reqMatch[1].replace(/[\[\]]/g, "").split(/[,\s]+/).map((r) => r.trim()).filter(Boolean);
33833
- let reqContent = node_fs.default.readFileSync(reqPath, "utf-8");
33912
+ let reqContent = await node_fs.promises.readFile(reqPath, "utf-8");
33834
33913
  for (const reqId of reqIds) {
33835
33914
  reqContent = reqContent.replace(new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${reqId}\\*\\*)`, "gi"), "$1x$2");
33836
33915
  reqContent = reqContent.replace(new RegExp(`(\\|\\s*${reqId}\\s*\\|[^|]+\\|)\\s*Pending\\s*(\\|)`, "gi"), "$1 Complete $2");
33837
33916
  }
33838
33917
  debugLog("phase-complete-write", `writing REQUIREMENTS.md for phase ${phaseNum}`);
33839
- node_fs.default.writeFileSync(reqPath, reqContent, "utf-8");
33918
+ await node_fs.promises.writeFile(reqPath, reqContent, "utf-8");
33840
33919
  debugLog("phase-complete-write", `REQUIREMENTS.md updated for phase ${phaseNum}`);
33841
33920
  requirementsUpdated = true;
33842
33921
  }
@@ -33846,7 +33925,7 @@ function phaseCompleteCore(cwd, phaseNum) {
33846
33925
  let nextPhaseName = null;
33847
33926
  let isLastPhase = true;
33848
33927
  try {
33849
- const dirs = listSubDirs(phasesDirPath, true);
33928
+ const dirs = await listSubDirsAsync(phasesDirPath, true);
33850
33929
  for (const dir of dirs) {
33851
33930
  const dm = dir.match(/^(\d+[A-Z]?(?:\.\d+)?)-?(.*)/i);
33852
33931
  if (dm) {
@@ -33861,8 +33940,9 @@ function phaseCompleteCore(cwd, phaseNum) {
33861
33940
  } catch (e) {
33862
33941
  debugLog("phase-complete-next-phase-scan-failed", e);
33863
33942
  }
33864
- if (node_fs.default.existsSync(stPath)) {
33865
- let stateContent = node_fs.default.readFileSync(stPath, "utf-8");
33943
+ const stExists = await pathExistsAsync(stPath);
33944
+ if (stExists) {
33945
+ let stateContent = await node_fs.promises.readFile(stPath, "utf-8");
33866
33946
  stateContent = stateContent.replace(/(\*\*Current Phase:\*\*\s*).*/, `$1${nextPhaseNum || phaseNum}`);
33867
33947
  if (nextPhaseName) stateContent = stateContent.replace(/(\*\*Current Phase Name:\*\*\s*).*/, `$1${nextPhaseName.replace(/-/g, " ")}`);
33868
33948
  stateContent = stateContent.replace(/(\*\*Status:\*\*\s*).*/, `$1${isLastPhase ? "Milestone complete" : "Ready to plan"}`);
@@ -33870,7 +33950,7 @@ function phaseCompleteCore(cwd, phaseNum) {
33870
33950
  stateContent = stateContent.replace(/(\*\*Last Activity:\*\*\s*).*/, `$1${today}`);
33871
33951
  stateContent = stateContent.replace(/(\*\*Last Activity Description:\*\*\s*).*/, `$1Phase ${phaseNum} complete${nextPhaseNum ? `, transitioned to Phase ${nextPhaseNum}` : ""}`);
33872
33952
  debugLog("phase-complete-write", `writing STATE.md for phase ${phaseNum}`);
33873
- node_fs.default.writeFileSync(stPath, stateContent, "utf-8");
33953
+ await node_fs.promises.writeFile(stPath, stateContent, "utf-8");
33874
33954
  debugLog("phase-complete-write", `STATE.md updated for phase ${phaseNum}`);
33875
33955
  }
33876
33956
  return {
@@ -33881,8 +33961,8 @@ function phaseCompleteCore(cwd, phaseNum) {
33881
33961
  next_phase_name: nextPhaseName,
33882
33962
  is_last_phase: isLastPhase,
33883
33963
  date: today,
33884
- roadmap_updated: node_fs.default.existsSync(rmPath),
33885
- state_updated: node_fs.default.existsSync(stPath),
33964
+ roadmap_updated: rmExists,
33965
+ state_updated: stExists,
33886
33966
  requirements_updated: requirementsUpdated
33887
33967
  };
33888
33968
  }
@@ -34016,7 +34096,7 @@ function registerPhaseTools(server) {
34016
34096
  const cwd = detectProjectRoot();
34017
34097
  if (!cwd) return mcpError("No .planning/ directory found", "Project not detected");
34018
34098
  if (!name || !name.trim()) return mcpError("Phase name must not be empty", "Validation failed");
34019
- const result = phaseAddCore(cwd, name, { includeStubs: true });
34099
+ const result = await phaseAddCore(cwd, name, { includeStubs: true });
34020
34100
  return mcpSuccess({
34021
34101
  phase_number: result.phase_number,
34022
34102
  padded: result.padded,
@@ -34036,7 +34116,7 @@ function registerPhaseTools(server) {
34036
34116
  const cwd = detectProjectRoot();
34037
34117
  if (!cwd) return mcpError("No .planning/ directory found", "Project not detected");
34038
34118
  if (!name || !name.trim()) return mcpError("Phase name must not be empty", "Validation failed");
34039
- const result = phaseInsertCore(cwd, after, name, { includeStubs: true });
34119
+ const result = await phaseInsertCore(cwd, after, name, { includeStubs: true });
34040
34120
  return mcpSuccess({
34041
34121
  phase_number: result.phase_number,
34042
34122
  after_phase: result.after_phase,
@@ -34052,7 +34132,7 @@ function registerPhaseTools(server) {
34052
34132
  try {
34053
34133
  const cwd = detectProjectRoot();
34054
34134
  if (!cwd) return mcpError("No .planning/ directory found", "Project not detected");
34055
- const result = phaseCompleteCore(cwd, phase);
34135
+ const result = await phaseCompleteCore(cwd, phase);
34056
34136
  return mcpSuccess({
34057
34137
  completed_phase: result.completed_phase,
34058
34138
  phase_name: result.phase_name,
@@ -34427,7 +34507,7 @@ async function cmdRoadmapAnalyze(cwd) {
34427
34507
  try {
34428
34508
  const dirMatch = allDirs.find((d) => d.startsWith(p.normalized + "-") || d === p.normalized);
34429
34509
  if (dirMatch) {
34430
- const phaseFiles = await node_fs.default.promises.readdir(node_path.default.join(phasesDir, dirMatch));
34510
+ const phaseFiles = await node_fs.promises.readdir(node_path.default.join(phasesDir, dirMatch));
34431
34511
  planCount = phaseFiles.filter((f) => isPlanFile(f)).length;
34432
34512
  summaryCount = phaseFiles.filter((f) => isSummaryFile(f)).length;
34433
34513
  hasContext = phaseFiles.some((f) => f.endsWith("-CONTEXT.md") || f === "CONTEXT.md");
@@ -34513,6 +34593,36 @@ function addIfExists(files, cwd, relPath, role) {
34513
34593
  const entry = fileEntry(cwd, relPath, role);
34514
34594
  if (entry) files.push(entry);
34515
34595
  }
34596
+ const TOPIC_TO_CODEBASE_DOCS = {
34597
+ ui: ["CONVENTIONS.md", "STRUCTURE.md"],
34598
+ frontend: ["CONVENTIONS.md", "STRUCTURE.md"],
34599
+ component: ["CONVENTIONS.md", "STRUCTURE.md"],
34600
+ api: ["ARCHITECTURE.md", "CONVENTIONS.md"],
34601
+ backend: ["ARCHITECTURE.md", "CONVENTIONS.md"],
34602
+ server: ["ARCHITECTURE.md", "CONVENTIONS.md"],
34603
+ database: ["ARCHITECTURE.md", "STACK.md"],
34604
+ schema: ["ARCHITECTURE.md", "STACK.md"],
34605
+ data: ["ARCHITECTURE.md", "STACK.md"],
34606
+ testing: ["TESTING.md", "CONVENTIONS.md"],
34607
+ test: ["TESTING.md", "CONVENTIONS.md"],
34608
+ integration: ["INTEGRATIONS.md", "STACK.md"],
34609
+ deploy: ["INTEGRATIONS.md", "STACK.md"],
34610
+ refactor: ["CONCERNS.md", "ARCHITECTURE.md"],
34611
+ cleanup: ["CONCERNS.md", "ARCHITECTURE.md"],
34612
+ setup: ["STACK.md", "STRUCTURE.md"],
34613
+ config: ["STACK.md", "STRUCTURE.md"],
34614
+ auth: ["ARCHITECTURE.md", "INTEGRATIONS.md"],
34615
+ performance: ["ARCHITECTURE.md", "STACK.md"],
34616
+ install: ["STACK.md", "STRUCTURE.md"]
34617
+ };
34618
+ const DEFAULT_CODEBASE_DOCS = ["STACK.md", "ARCHITECTURE.md"];
34619
+ function selectCodebaseDocs(topic) {
34620
+ if (!topic) return DEFAULT_CODEBASE_DOCS;
34621
+ const topicLower = topic.toLowerCase();
34622
+ const matched = /* @__PURE__ */ new Set();
34623
+ for (const [keyword, docs] of Object.entries(TOPIC_TO_CODEBASE_DOCS)) if (topicLower.includes(keyword)) for (const doc of docs) matched.add(doc);
34624
+ return matched.size > 0 ? Array.from(matched) : DEFAULT_CODEBASE_DOCS;
34625
+ }
34516
34626
  function loadProjectContext(cwd) {
34517
34627
  const files = [];
34518
34628
  addIfExists(files, cwd, ".planning/PROJECT.md", "project-vision");
@@ -34561,6 +34671,16 @@ function loadArtefakteContext(cwd, phase) {
34561
34671
  }
34562
34672
  return files;
34563
34673
  }
34674
+ function loadCodebaseContext(cwd, topic) {
34675
+ const files = [];
34676
+ const codebaseDir = planningPath(cwd, "codebase");
34677
+ try {
34678
+ const existing = node_fs.default.readdirSync(codebaseDir).filter((f) => f.endsWith(".md"));
34679
+ const selected = selectCodebaseDocs(topic);
34680
+ for (const filename of selected) if (existing.includes(filename)) addIfExists(files, cwd, `.planning/codebase/${filename}`, `codebase-${filename.replace(".md", "").toLowerCase()}`);
34681
+ } catch {}
34682
+ return files;
34683
+ }
34564
34684
  function loadHistoryContext(cwd, currentPhase) {
34565
34685
  const files = [];
34566
34686
  const pd = phasesPath(cwd);
@@ -34584,6 +34704,8 @@ function cmdContextLoad(cwd, phase, topic, includeHistory) {
34584
34704
  allFiles.push(...loadProjectContext(cwd));
34585
34705
  allFiles.push(...loadRoadmapContext(cwd));
34586
34706
  allFiles.push(...loadArtefakteContext(cwd, phase));
34707
+ const selectedDocs = selectCodebaseDocs(topic);
34708
+ allFiles.push(...loadCodebaseContext(cwd, topic));
34587
34709
  if (phase) allFiles.push(...loadPhaseContext(cwd, phase));
34588
34710
  if (includeHistory) allFiles.push(...loadHistoryContext(cwd, phase));
34589
34711
  const seen = /* @__PURE__ */ new Set();
@@ -34596,7 +34718,8 @@ function cmdContextLoad(cwd, phase, topic, includeHistory) {
34596
34718
  files: deduped,
34597
34719
  total_size: deduped.reduce((sum, f) => sum + f.size, 0),
34598
34720
  phase: phase ?? null,
34599
- topic: topic ?? null
34721
+ topic: topic ?? null,
34722
+ codebase_docs_selected: selectedDocs
34600
34723
  });
34601
34724
  }
34602
34725
 
@@ -34664,9 +34787,9 @@ function registerContextTools(server) {
34664
34787
  return mcpError("Failed: " + e.message, "Error occurred");
34665
34788
  }
34666
34789
  });
34667
- server.tool("mcp_get_context_for_task", "Load context files for a task, including project context, roadmap, and optionally phase-specific and topic-specific files.", {
34668
- phase: stringType().optional().describe("Optional phase number to scope context to"),
34669
- topic: stringType().optional().describe("Optional topic to filter context by")
34790
+ server.tool("mcp_get_context_for_task", "Load context files for a task. Includes project context, roadmap, artefakte, and codebase docs filtered by topic. Topic keywords select relevant codebase docs: \"ui/frontend\" loads CONVENTIONS+STRUCTURE, \"api/backend\" loads ARCHITECTURE+CONVENTIONS, \"testing\" loads TESTING+CONVENTIONS, \"database\" loads ARCHITECTURE+STACK, \"refactor\" loads CONCERNS+ARCHITECTURE. Without topic, defaults to STACK+ARCHITECTURE.", {
34791
+ phase: stringType().optional().describe("Phase number to scope context to"),
34792
+ topic: stringType().optional().describe("Topic keywords to filter codebase docs (e.g. \"frontend\", \"api\", \"testing\", \"database\", \"refactor\")")
34670
34793
  }, async ({ phase, topic }) => {
34671
34794
  try {
34672
34795
  const cwd = detectProjectRoot();