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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/assets/CHANGELOG.md +8 -0
- package/dist/assets/dashboard/client/assets/{index-C_eAetZJ.js → index-BcRHShXD.js} +59 -59
- package/dist/assets/dashboard/client/assets/index-C199D4Eb.css +32 -0
- package/dist/assets/dashboard/client/index.html +2 -2
- package/dist/assets/dashboard/server.js +26 -11
- package/dist/assets/templates/agents/AGENTS.md +18 -69
- package/dist/assets/templates/agents/maxsim-code-reviewer.md +17 -92
- package/dist/assets/templates/agents/maxsim-codebase-mapper.md +57 -694
- package/dist/assets/templates/agents/maxsim-debugger.md +80 -925
- package/dist/assets/templates/agents/maxsim-executor.md +94 -431
- package/dist/assets/templates/agents/maxsim-integration-checker.md +51 -319
- package/dist/assets/templates/agents/maxsim-phase-researcher.md +63 -429
- package/dist/assets/templates/agents/maxsim-plan-checker.md +79 -568
- package/dist/assets/templates/agents/maxsim-planner.md +125 -855
- package/dist/assets/templates/agents/maxsim-project-researcher.md +32 -472
- package/dist/assets/templates/agents/maxsim-research-synthesizer.md +25 -134
- package/dist/assets/templates/agents/maxsim-roadmapper.md +66 -480
- package/dist/assets/templates/agents/maxsim-spec-reviewer.md +13 -55
- package/dist/assets/templates/agents/maxsim-verifier.md +95 -450
- package/dist/assets/templates/commands/maxsim/artefakte.md +122 -0
- package/dist/assets/templates/commands/maxsim/batch.md +42 -0
- package/dist/assets/templates/commands/maxsim/check-todos.md +1 -0
- package/dist/assets/templates/commands/maxsim/sdd.md +39 -0
- package/dist/assets/templates/references/thinking-partner.md +33 -0
- package/dist/assets/templates/workflows/batch.md +420 -0
- package/dist/assets/templates/workflows/check-todos.md +85 -1
- package/dist/assets/templates/workflows/discuss-phase.md +31 -0
- package/dist/assets/templates/workflows/execute-plan.md +96 -27
- package/dist/assets/templates/workflows/help.md +47 -0
- package/dist/assets/templates/workflows/sdd.md +426 -0
- package/dist/backend-server.cjs +174 -51
- package/dist/backend-server.cjs.map +1 -1
- package/dist/cli.cjs +310 -146
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +5 -5
- package/dist/cli.js.map +1 -1
- package/dist/core/artefakte.d.ts.map +1 -1
- package/dist/core/artefakte.js +16 -0
- package/dist/core/artefakte.js.map +1 -1
- package/dist/core/context-loader.d.ts +1 -0
- package/dist/core/context-loader.d.ts.map +1 -1
- package/dist/core/context-loader.js +58 -0
- package/dist/core/context-loader.js.map +1 -1
- package/dist/core/core.d.ts +6 -0
- package/dist/core/core.d.ts.map +1 -1
- package/dist/core/core.js +238 -0
- package/dist/core/core.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +5 -3
- package/dist/core/index.js.map +1 -1
- package/dist/core/phase.d.ts +11 -11
- package/dist/core/phase.d.ts.map +1 -1
- package/dist/core/phase.js +88 -73
- package/dist/core/phase.js.map +1 -1
- package/dist/core/roadmap.d.ts +2 -2
- package/dist/core/roadmap.d.ts.map +1 -1
- package/dist/core/roadmap.js +11 -10
- package/dist/core/roadmap.js.map +1 -1
- package/dist/core/state.d.ts +11 -11
- package/dist/core/state.d.ts.map +1 -1
- package/dist/core/state.js +60 -54
- package/dist/core/state.js.map +1 -1
- package/dist/core-RRjCSt0G.cjs.map +1 -1
- package/dist/{lifecycle-D4E9yP6E.cjs → lifecycle-0M4VqOMm.cjs} +2 -2
- package/dist/{lifecycle-D4E9yP6E.cjs.map → lifecycle-0M4VqOMm.cjs.map} +1 -1
- package/dist/mcp/context-tools.d.ts.map +1 -1
- package/dist/mcp/context-tools.js +7 -3
- package/dist/mcp/context-tools.js.map +1 -1
- package/dist/mcp/phase-tools.js +3 -3
- package/dist/mcp/phase-tools.js.map +1 -1
- package/dist/mcp-server.cjs +163 -40
- package/dist/mcp-server.cjs.map +1 -1
- package/dist/{server-pvY2WbKj.cjs → server-G1MIg_Oe.cjs} +7 -7
- package/dist/server-G1MIg_Oe.cjs.map +1 -0
- package/package.json +1 -1
- package/dist/assets/dashboard/client/assets/index-CmiJKqOU.css +0 -32
- 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-
|
|
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-
|
|
136
|
+
//# sourceMappingURL=lifecycle-0M4VqOMm.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-
|
|
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,
|
|
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
|
|
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('
|
|
96
|
+
.describe('Phase number to scope context to'),
|
|
93
97
|
topic: zod_1.z
|
|
94
98
|
.string()
|
|
95
99
|
.optional()
|
|
96
|
-
.describe('
|
|
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":";AAAA;;;;;;GAMG;;;;;AAsBH,
|
|
1
|
+
{"version":3,"file":"context-tools.js","sourceRoot":"","sources":["../../src/mcp/context-tools.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/phase-tools.js
CHANGED
|
@@ -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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"}
|
package/dist/mcp-server.cjs
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
33731
|
-
|
|
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.
|
|
33745
|
-
node_fs.
|
|
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.
|
|
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
|
-
|
|
33764
|
-
|
|
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 =
|
|
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.
|
|
33785
|
-
node_fs.
|
|
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.
|
|
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 =
|
|
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
|
-
|
|
33817
|
-
|
|
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.
|
|
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 (
|
|
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.
|
|
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.
|
|
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 =
|
|
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
|
-
|
|
33865
|
-
|
|
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.
|
|
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:
|
|
33885
|
-
state_updated:
|
|
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.
|
|
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
|
|
34668
|
-
phase: stringType().optional().describe("
|
|
34669
|
-
topic: stringType().optional().describe("
|
|
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();
|