maxsimcli 3.10.3 → 3.12.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 +26 -0
- package/dist/assets/dashboard/client/assets/index-CxFKStBk.css +32 -0
- package/dist/assets/dashboard/client/assets/{index-CZ8WC97G.js → index-wtQDvXzr.js} +64 -64
- package/dist/assets/dashboard/client/index.html +2 -2
- package/dist/assets/dashboard/server.js +5 -1
- package/dist/assets/templates/agents/AGENTS.md +82 -0
- package/dist/assets/templates/commands/maxsim/settings.md +1 -1
- package/dist/assets/templates/skills/code-review/SKILL.md +151 -0
- package/dist/assets/templates/skills/memory-management/SKILL.md +174 -0
- package/dist/assets/templates/skills/simplify/SKILL.md +137 -0
- package/dist/assets/templates/skills/using-maxsim/SKILL.md +115 -0
- package/dist/assets/templates/templates/config.json +1 -1
- package/dist/assets/templates/workflows/add-tests.md +3 -3
- package/dist/assets/templates/workflows/complete-milestone.md +1 -1
- package/dist/assets/templates/workflows/execute-phase.md +4 -14
- package/dist/assets/templates/workflows/execute-plan.md +10 -0
- package/dist/assets/templates/workflows/init-existing.md +7 -3
- package/dist/assets/templates/workflows/new-milestone.md +4 -0
- package/dist/assets/templates/workflows/new-project.md +6 -2
- package/dist/assets/templates/workflows/plan-phase.md +2 -2
- package/dist/assets/templates/workflows/settings.md +8 -4
- package/dist/assets/templates/workflows/verify-work.md +1 -1
- package/dist/cli.cjs +818 -599
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +78 -204
- package/dist/cli.js.map +1 -1
- package/dist/core/commands.d.ts +7 -0
- package/dist/core/commands.d.ts.map +1 -1
- package/dist/core/commands.js +40 -35
- package/dist/core/commands.js.map +1 -1
- package/dist/core/core.d.ts +39 -1
- package/dist/core/core.d.ts.map +1 -1
- package/dist/core/core.js +122 -47
- package/dist/core/core.js.map +1 -1
- package/dist/core/dashboard-launcher.d.ts +56 -0
- package/dist/core/dashboard-launcher.d.ts.map +1 -0
- package/dist/core/dashboard-launcher.js +243 -0
- package/dist/core/dashboard-launcher.js.map +1 -0
- package/dist/core/index.d.ts +4 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +20 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/init.d.ts +2 -3
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/init.js +33 -52
- package/dist/core/init.js.map +1 -1
- package/dist/core/milestone.d.ts.map +1 -1
- package/dist/core/milestone.js +15 -20
- package/dist/core/milestone.js.map +1 -1
- package/dist/core/phase.d.ts +33 -0
- package/dist/core/phase.d.ts.map +1 -1
- package/dist/core/phase.js +282 -225
- package/dist/core/phase.js.map +1 -1
- package/dist/core/roadmap.d.ts.map +1 -1
- package/dist/core/roadmap.js +17 -18
- package/dist/core/roadmap.js.map +1 -1
- package/dist/core/state.d.ts +5 -0
- package/dist/core/state.d.ts.map +1 -1
- package/dist/core/state.js +51 -42
- package/dist/core/state.js.map +1 -1
- package/dist/core/template.d.ts.map +1 -1
- package/dist/core/template.js +1 -1
- package/dist/core/template.js.map +1 -1
- package/dist/core/types.d.ts +4 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +1 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/verify.d.ts.map +1 -1
- package/dist/core/verify.js +61 -80
- package/dist/core/verify.js.map +1 -1
- package/dist/install/adapters.d.ts +15 -0
- package/dist/install/adapters.d.ts.map +1 -0
- package/dist/install/adapters.js +203 -0
- package/dist/install/adapters.js.map +1 -0
- package/dist/install/copy.d.ts +15 -0
- package/dist/install/copy.d.ts.map +1 -0
- package/dist/install/copy.js +191 -0
- package/dist/install/copy.js.map +1 -0
- package/dist/install/dashboard.d.ts +16 -0
- package/dist/install/dashboard.d.ts.map +1 -0
- package/dist/install/dashboard.js +273 -0
- package/dist/install/dashboard.js.map +1 -0
- package/dist/install/hooks.d.ts +32 -0
- package/dist/install/hooks.d.ts.map +1 -0
- package/dist/install/hooks.js +285 -0
- package/dist/install/hooks.js.map +1 -0
- package/dist/install/index.d.ts +2 -0
- package/dist/install/index.d.ts.map +1 -0
- package/dist/install/index.js +598 -0
- package/dist/install/index.js.map +1 -0
- package/dist/install/manifest.d.ts +20 -0
- package/dist/install/manifest.d.ts.map +1 -0
- package/dist/install/manifest.js +135 -0
- package/dist/install/manifest.js.map +1 -0
- package/dist/install/patches.d.ts +11 -0
- package/dist/install/patches.d.ts.map +1 -0
- package/dist/install/patches.js +136 -0
- package/dist/install/patches.js.map +1 -0
- package/dist/install/shared.d.ts +50 -0
- package/dist/install/shared.d.ts.map +1 -0
- package/dist/install/shared.js +142 -0
- package/dist/install/shared.js.map +1 -0
- package/dist/install/uninstall.d.ts +6 -0
- package/dist/install/uninstall.d.ts.map +1 -0
- package/dist/install/uninstall.js +280 -0
- package/dist/install/uninstall.js.map +1 -0
- package/dist/install.cjs +782 -705
- package/dist/install.cjs.map +1 -1
- package/dist/mcp/index.d.ts +12 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +21 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/phase-tools.d.ts +13 -0
- package/dist/mcp/phase-tools.d.ts.map +1 -0
- package/dist/mcp/phase-tools.js +164 -0
- package/dist/mcp/phase-tools.js.map +1 -0
- package/dist/mcp/state-tools.d.ts +13 -0
- package/dist/mcp/state-tools.d.ts.map +1 -0
- package/dist/mcp/state-tools.js +185 -0
- package/dist/mcp/state-tools.js.map +1 -0
- package/dist/mcp/todo-tools.d.ts +13 -0
- package/dist/mcp/todo-tools.d.ts.map +1 -0
- package/dist/mcp/todo-tools.js +143 -0
- package/dist/mcp/todo-tools.js.map +1 -0
- package/dist/mcp/utils.d.ts +27 -0
- package/dist/mcp/utils.d.ts.map +1 -0
- package/dist/mcp/utils.js +82 -0
- package/dist/mcp/utils.js.map +1 -0
- package/dist/mcp-server.cjs +11806 -0
- package/dist/mcp-server.cjs.map +1 -0
- package/dist/mcp-server.d.cts +2 -0
- package/dist/mcp-server.d.ts +12 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +31 -0
- package/dist/mcp-server.js.map +1 -0
- package/package.json +5 -3
- package/dist/assets/dashboard/client/assets/index-DzJChB-D.css +0 -32
- package/dist/install.d.ts +0 -2
- package/dist/install.d.ts.map +0 -1
- package/dist/install.js +0 -1804
- package/dist/install.js.map +0 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Registration — Orchestrates all tool registrations
|
|
3
|
+
*
|
|
4
|
+
* This is the single entry point for registering MCP tools on the server.
|
|
5
|
+
* Later plans will add registerTodoTools, registerStateTools, etc.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
/**
|
|
9
|
+
* Register all MCP tools on the given server instance.
|
|
10
|
+
*/
|
|
11
|
+
export declare function registerAllTools(server: McpServer): void;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAIxD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Tool Registration — Orchestrates all tool registrations
|
|
4
|
+
*
|
|
5
|
+
* This is the single entry point for registering MCP tools on the server.
|
|
6
|
+
* Later plans will add registerTodoTools, registerStateTools, etc.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.registerAllTools = registerAllTools;
|
|
10
|
+
const phase_tools_js_1 = require("./phase-tools.js");
|
|
11
|
+
const todo_tools_js_1 = require("./todo-tools.js");
|
|
12
|
+
const state_tools_js_1 = require("./state-tools.js");
|
|
13
|
+
/**
|
|
14
|
+
* Register all MCP tools on the given server instance.
|
|
15
|
+
*/
|
|
16
|
+
function registerAllTools(server) {
|
|
17
|
+
(0, phase_tools_js_1.registerPhaseTools)(server);
|
|
18
|
+
(0, todo_tools_js_1.registerTodoTools)(server);
|
|
19
|
+
(0, state_tools_js_1.registerStateTools)(server);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAUH,4CAIC;AAXD,qDAAsD;AACtD,mDAAoD;AACpD,qDAAsD;AAEtD;;GAEG;AACH,SAAgB,gBAAgB,CAAC,MAAiB;IAChD,IAAA,mCAAkB,EAAC,MAAM,CAAC,CAAC;IAC3B,IAAA,iCAAiB,EAAC,MAAM,CAAC,CAAC;IAC1B,IAAA,mCAAkB,EAAC,MAAM,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase CRUD MCP Tools — Phase operations exposed as MCP tools
|
|
3
|
+
*
|
|
4
|
+
* CRITICAL: Never import output() or error() from core — they call process.exit().
|
|
5
|
+
* CRITICAL: Never write to stdout — it is reserved for MCP JSON-RPC protocol.
|
|
6
|
+
* CRITICAL: Never call process.exit() — the server must stay alive after every tool call.
|
|
7
|
+
*/
|
|
8
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
9
|
+
/**
|
|
10
|
+
* Register all phase CRUD tools on the MCP server.
|
|
11
|
+
*/
|
|
12
|
+
export declare function registerPhaseTools(server: McpServer): void;
|
|
13
|
+
//# sourceMappingURL=phase-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase-tools.d.ts","sourceRoot":"","sources":["../../src/mcp/phase-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkBzE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2M1D"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Phase CRUD MCP Tools — Phase operations exposed as MCP tools
|
|
4
|
+
*
|
|
5
|
+
* CRITICAL: Never import output() or error() from core — they call process.exit().
|
|
6
|
+
* CRITICAL: Never write to stdout — it is reserved for MCP JSON-RPC protocol.
|
|
7
|
+
* CRITICAL: Never call process.exit() — the server must stay alive after every tool call.
|
|
8
|
+
*/
|
|
9
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
10
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.registerPhaseTools = registerPhaseTools;
|
|
14
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
15
|
+
const zod_1 = require("zod");
|
|
16
|
+
const core_js_1 = require("../core/core.js");
|
|
17
|
+
const phase_js_1 = require("../core/phase.js");
|
|
18
|
+
const utils_js_1 = require("./utils.js");
|
|
19
|
+
/**
|
|
20
|
+
* Register all phase CRUD tools on the MCP server.
|
|
21
|
+
*/
|
|
22
|
+
function registerPhaseTools(server) {
|
|
23
|
+
// ── mcp_find_phase ──────────────────────────────────────────────────────────
|
|
24
|
+
server.tool('mcp_find_phase', 'Find a phase directory by number or name. Returns phase details including plans, summaries, and status.', {
|
|
25
|
+
phase: zod_1.z.string().describe('Phase number or name (e.g. "01", "1", "01A", "1.1")'),
|
|
26
|
+
}, async ({ phase }) => {
|
|
27
|
+
try {
|
|
28
|
+
const cwd = (0, utils_js_1.detectProjectRoot)();
|
|
29
|
+
if (!cwd) {
|
|
30
|
+
return (0, utils_js_1.mcpError)('No .planning/ directory found', 'Project not detected');
|
|
31
|
+
}
|
|
32
|
+
const result = (0, core_js_1.findPhaseInternal)(cwd, phase);
|
|
33
|
+
if (!result) {
|
|
34
|
+
return (0, utils_js_1.mcpError)(`Phase ${phase} not found`, 'Phase not found');
|
|
35
|
+
}
|
|
36
|
+
return (0, utils_js_1.mcpSuccess)({
|
|
37
|
+
found: result.found,
|
|
38
|
+
directory: result.directory,
|
|
39
|
+
phase_number: result.phase_number,
|
|
40
|
+
phase_name: result.phase_name,
|
|
41
|
+
phase_slug: result.phase_slug,
|
|
42
|
+
plans: result.plans,
|
|
43
|
+
summaries: result.summaries,
|
|
44
|
+
incomplete_plans: result.incomplete_plans,
|
|
45
|
+
has_research: result.has_research,
|
|
46
|
+
has_context: result.has_context,
|
|
47
|
+
has_verification: result.has_verification,
|
|
48
|
+
archived: result.archived ?? null,
|
|
49
|
+
}, `Found phase ${result.phase_number}: ${result.phase_name ?? 'unnamed'}`);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
return (0, utils_js_1.mcpError)(e.message, 'Operation failed');
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// ── mcp_list_phases ─────────────────────────────────────────────────────────
|
|
56
|
+
server.tool('mcp_list_phases', 'List all phase directories, sorted correctly. Optionally include archived phases from milestones.', {
|
|
57
|
+
include_archived: zod_1.z
|
|
58
|
+
.boolean()
|
|
59
|
+
.optional()
|
|
60
|
+
.default(false)
|
|
61
|
+
.describe('Include archived phases from completed milestones'),
|
|
62
|
+
}, async ({ include_archived }) => {
|
|
63
|
+
try {
|
|
64
|
+
const cwd = (0, utils_js_1.detectProjectRoot)();
|
|
65
|
+
if (!cwd) {
|
|
66
|
+
return (0, utils_js_1.mcpError)('No .planning/ directory found', 'Project not detected');
|
|
67
|
+
}
|
|
68
|
+
const phasesDir = (0, core_js_1.phasesPath)(cwd);
|
|
69
|
+
if (!node_fs_1.default.existsSync(phasesDir)) {
|
|
70
|
+
return (0, utils_js_1.mcpSuccess)({ directories: [], count: 0 }, 'No phases directory found');
|
|
71
|
+
}
|
|
72
|
+
let dirs = (0, core_js_1.listSubDirs)(phasesDir);
|
|
73
|
+
if (include_archived) {
|
|
74
|
+
const archived = (0, core_js_1.getArchivedPhaseDirs)(cwd);
|
|
75
|
+
for (const a of archived) {
|
|
76
|
+
dirs.push(`${a.name} [${a.milestone}]`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
dirs.sort((a, b) => (0, core_js_1.comparePhaseNum)(a, b));
|
|
80
|
+
return (0, utils_js_1.mcpSuccess)({ directories: dirs, count: dirs.length }, `Found ${dirs.length} phase(s)`);
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
return (0, utils_js_1.mcpError)(e.message, 'Operation failed');
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// ── mcp_create_phase ────────────────────────────────────────────────────────
|
|
87
|
+
server.tool('mcp_create_phase', 'Create a new phase. Adds the next sequential phase directory and appends to ROADMAP.md.', {
|
|
88
|
+
name: zod_1.z.string().describe('Phase description/name (e.g. "Authentication System")'),
|
|
89
|
+
}, async ({ name }) => {
|
|
90
|
+
try {
|
|
91
|
+
const cwd = (0, utils_js_1.detectProjectRoot)();
|
|
92
|
+
if (!cwd) {
|
|
93
|
+
return (0, utils_js_1.mcpError)('No .planning/ directory found', 'Project not detected');
|
|
94
|
+
}
|
|
95
|
+
if (!name || !name.trim()) {
|
|
96
|
+
return (0, utils_js_1.mcpError)('Phase name must not be empty', 'Validation failed');
|
|
97
|
+
}
|
|
98
|
+
const result = (0, phase_js_1.phaseAddCore)(cwd, name, { includeStubs: true });
|
|
99
|
+
return (0, utils_js_1.mcpSuccess)({
|
|
100
|
+
phase_number: result.phase_number,
|
|
101
|
+
padded: result.padded,
|
|
102
|
+
name: result.description,
|
|
103
|
+
slug: result.slug,
|
|
104
|
+
directory: result.directory,
|
|
105
|
+
}, `Created Phase ${result.phase_number}: ${result.description}`);
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
return (0, utils_js_1.mcpError)(e.message, 'Operation failed');
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
// ── mcp_insert_phase ────────────────────────────────────────────────────────
|
|
112
|
+
server.tool('mcp_insert_phase', 'Insert a decimal phase after a specified phase (e.g. 01.1 after 01). Creates directory and updates ROADMAP.md.', {
|
|
113
|
+
name: zod_1.z.string().describe('Phase description/name'),
|
|
114
|
+
after: zod_1.z.string().describe('Phase number to insert after (e.g. "01", "1")'),
|
|
115
|
+
}, async ({ name, after }) => {
|
|
116
|
+
try {
|
|
117
|
+
const cwd = (0, utils_js_1.detectProjectRoot)();
|
|
118
|
+
if (!cwd) {
|
|
119
|
+
return (0, utils_js_1.mcpError)('No .planning/ directory found', 'Project not detected');
|
|
120
|
+
}
|
|
121
|
+
if (!name || !name.trim()) {
|
|
122
|
+
return (0, utils_js_1.mcpError)('Phase name must not be empty', 'Validation failed');
|
|
123
|
+
}
|
|
124
|
+
const result = (0, phase_js_1.phaseInsertCore)(cwd, after, name, { includeStubs: true });
|
|
125
|
+
return (0, utils_js_1.mcpSuccess)({
|
|
126
|
+
phase_number: result.phase_number,
|
|
127
|
+
after_phase: result.after_phase,
|
|
128
|
+
name: result.description,
|
|
129
|
+
slug: result.slug,
|
|
130
|
+
directory: result.directory,
|
|
131
|
+
}, `Inserted Phase ${result.phase_number}: ${result.description} after Phase ${result.after_phase}`);
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
return (0, utils_js_1.mcpError)(e.message, 'Operation failed');
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
// ── mcp_complete_phase ──────────────────────────────────────────────────────
|
|
138
|
+
server.tool('mcp_complete_phase', 'Mark a phase as complete. Updates ROADMAP.md checkbox, progress table, plan count, STATE.md, and REQUIREMENTS.md.', {
|
|
139
|
+
phase: zod_1.z.string().describe('Phase number to complete (e.g. "01", "1", "1.1")'),
|
|
140
|
+
}, async ({ phase }) => {
|
|
141
|
+
try {
|
|
142
|
+
const cwd = (0, utils_js_1.detectProjectRoot)();
|
|
143
|
+
if (!cwd) {
|
|
144
|
+
return (0, utils_js_1.mcpError)('No .planning/ directory found', 'Project not detected');
|
|
145
|
+
}
|
|
146
|
+
const result = (0, phase_js_1.phaseCompleteCore)(cwd, phase);
|
|
147
|
+
return (0, utils_js_1.mcpSuccess)({
|
|
148
|
+
completed_phase: result.completed_phase,
|
|
149
|
+
phase_name: result.phase_name,
|
|
150
|
+
plans_executed: result.plans_executed,
|
|
151
|
+
next_phase: result.next_phase,
|
|
152
|
+
next_phase_name: result.next_phase_name,
|
|
153
|
+
is_last_phase: result.is_last_phase,
|
|
154
|
+
date: result.date,
|
|
155
|
+
roadmap_updated: result.roadmap_updated,
|
|
156
|
+
state_updated: result.state_updated,
|
|
157
|
+
}, `Phase ${phase} marked as complete${result.next_phase ? `, next: Phase ${result.next_phase}` : ''}`);
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
return (0, utils_js_1.mcpError)(e.message, 'Operation failed');
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=phase-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase-tools.js","sourceRoot":"","sources":["../../src/mcp/phase-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Management MCP Tools — STATE.md operations exposed as MCP tools
|
|
3
|
+
*
|
|
4
|
+
* CRITICAL: Never import output() or error() from core — they call process.exit().
|
|
5
|
+
* CRITICAL: Never write to stdout — it is reserved for MCP JSON-RPC protocol.
|
|
6
|
+
* CRITICAL: Never call process.exit() — the server must stay alive after every tool call.
|
|
7
|
+
*/
|
|
8
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
9
|
+
/**
|
|
10
|
+
* Register all state management tools on the MCP server.
|
|
11
|
+
*/
|
|
12
|
+
export declare function registerStateTools(server: McpServer): void;
|
|
13
|
+
//# sourceMappingURL=state-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-tools.d.ts","sourceRoot":"","sources":["../../src/mcp/state-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuQ1D"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* State Management MCP Tools — STATE.md operations exposed as MCP tools
|
|
4
|
+
*
|
|
5
|
+
* CRITICAL: Never import output() or error() from core — they call process.exit().
|
|
6
|
+
* CRITICAL: Never write to stdout — it is reserved for MCP JSON-RPC protocol.
|
|
7
|
+
* CRITICAL: Never call process.exit() — the server must stay alive after every tool call.
|
|
8
|
+
*/
|
|
9
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
10
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.registerStateTools = registerStateTools;
|
|
14
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
15
|
+
const zod_1 = require("zod");
|
|
16
|
+
const escape_string_regexp_1 = __importDefault(require("escape-string-regexp"));
|
|
17
|
+
const core_js_1 = require("../core/core.js");
|
|
18
|
+
const state_js_1 = require("../core/state.js");
|
|
19
|
+
const utils_js_1 = require("./utils.js");
|
|
20
|
+
/**
|
|
21
|
+
* Register all state management tools on the MCP server.
|
|
22
|
+
*/
|
|
23
|
+
function registerStateTools(server) {
|
|
24
|
+
// ── mcp_get_state ───────────────────────────────────────────────────────────
|
|
25
|
+
server.tool('mcp_get_state', 'Read STATE.md content — full file, a specific **field:** value, or a ## section.', {
|
|
26
|
+
field: zod_1.z
|
|
27
|
+
.string()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe('Specific field or section name, or omit for full STATE.md'),
|
|
30
|
+
}, async ({ field }) => {
|
|
31
|
+
try {
|
|
32
|
+
const cwd = (0, utils_js_1.detectProjectRoot)();
|
|
33
|
+
if (!cwd) {
|
|
34
|
+
return (0, utils_js_1.mcpError)('No .planning/ directory found', 'Project not detected');
|
|
35
|
+
}
|
|
36
|
+
const stPath = (0, core_js_1.statePath)(cwd);
|
|
37
|
+
if (!node_fs_1.default.existsSync(stPath)) {
|
|
38
|
+
return (0, utils_js_1.mcpError)('STATE.md not found', 'STATE.md missing');
|
|
39
|
+
}
|
|
40
|
+
const content = node_fs_1.default.readFileSync(stPath, 'utf-8');
|
|
41
|
+
if (!field) {
|
|
42
|
+
return (0, utils_js_1.mcpSuccess)({ content }, 'Full STATE.md retrieved');
|
|
43
|
+
}
|
|
44
|
+
// Try **field:** value pattern first
|
|
45
|
+
const fieldValue = (0, state_js_1.stateExtractField)(content, field);
|
|
46
|
+
if (fieldValue) {
|
|
47
|
+
return (0, utils_js_1.mcpSuccess)({ content: fieldValue, field }, `State field retrieved: ${field}`);
|
|
48
|
+
}
|
|
49
|
+
// Try ## Section pattern
|
|
50
|
+
const fieldEscaped = (0, escape_string_regexp_1.default)(field);
|
|
51
|
+
const sectionPattern = new RegExp(`##\\s*${fieldEscaped}\\s*\n([\\s\\S]*?)(?=\\n##|$)`, 'i');
|
|
52
|
+
const sectionMatch = content.match(sectionPattern);
|
|
53
|
+
if (sectionMatch) {
|
|
54
|
+
return (0, utils_js_1.mcpSuccess)({ content: sectionMatch[1].trim(), field }, `State section retrieved: ${field}`);
|
|
55
|
+
}
|
|
56
|
+
return (0, utils_js_1.mcpError)(`Section or field "${field}" not found in STATE.md`, 'Field not found');
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
return (0, utils_js_1.mcpError)(e.message, 'Operation failed');
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
// ── mcp_update_state ────────────────────────────────────────────────────────
|
|
63
|
+
server.tool('mcp_update_state', 'Update a **field:** value in STATE.md (e.g., "Status", "Current focus").', {
|
|
64
|
+
field: zod_1.z.string().describe('Field name (e.g., "Status", "Current focus")'),
|
|
65
|
+
value: zod_1.z.string().describe('New value for the field'),
|
|
66
|
+
}, async ({ field, value }) => {
|
|
67
|
+
try {
|
|
68
|
+
const cwd = (0, utils_js_1.detectProjectRoot)();
|
|
69
|
+
if (!cwd) {
|
|
70
|
+
return (0, utils_js_1.mcpError)('No .planning/ directory found', 'Project not detected');
|
|
71
|
+
}
|
|
72
|
+
const stPath = (0, core_js_1.statePath)(cwd);
|
|
73
|
+
if (!node_fs_1.default.existsSync(stPath)) {
|
|
74
|
+
return (0, utils_js_1.mcpError)('STATE.md not found', 'STATE.md missing');
|
|
75
|
+
}
|
|
76
|
+
const content = node_fs_1.default.readFileSync(stPath, 'utf-8');
|
|
77
|
+
const updated = (0, state_js_1.stateReplaceField)(content, field, value);
|
|
78
|
+
if (!updated) {
|
|
79
|
+
return (0, utils_js_1.mcpError)(`Field "${field}" not found in STATE.md`, 'Field not found');
|
|
80
|
+
}
|
|
81
|
+
node_fs_1.default.writeFileSync(stPath, updated, 'utf-8');
|
|
82
|
+
return (0, utils_js_1.mcpSuccess)({ updated: true, field, value }, `State updated: ${field}`);
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
return (0, utils_js_1.mcpError)(e.message, 'Operation failed');
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
// ── mcp_add_decision ────────────────────────────────────────────────────────
|
|
89
|
+
server.tool('mcp_add_decision', 'Record a decision in the Decisions section of STATE.md.', {
|
|
90
|
+
summary: zod_1.z.string().describe('Decision summary'),
|
|
91
|
+
rationale: zod_1.z.string().optional().describe('Optional rationale'),
|
|
92
|
+
phase: zod_1.z.string().optional().describe('Associated phase number'),
|
|
93
|
+
}, async ({ summary, rationale, phase }) => {
|
|
94
|
+
try {
|
|
95
|
+
const cwd = (0, utils_js_1.detectProjectRoot)();
|
|
96
|
+
if (!cwd) {
|
|
97
|
+
return (0, utils_js_1.mcpError)('No .planning/ directory found', 'Project not detected');
|
|
98
|
+
}
|
|
99
|
+
const stPath = (0, core_js_1.statePath)(cwd);
|
|
100
|
+
if (!node_fs_1.default.existsSync(stPath)) {
|
|
101
|
+
return (0, utils_js_1.mcpError)('STATE.md not found', 'STATE.md missing');
|
|
102
|
+
}
|
|
103
|
+
const content = node_fs_1.default.readFileSync(stPath, 'utf-8');
|
|
104
|
+
const entry = `- [Phase ${phase || '?'}]: ${summary}${rationale ? ` -- ${rationale}` : ''}`;
|
|
105
|
+
const sectionPattern = /(###?\s*(?:Decisions|Decisions Made|Accumulated.*Decisions)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i;
|
|
106
|
+
const updated = (0, state_js_1.appendToStateSection)(content, sectionPattern, entry, [/None yet\.?\s*\n?/gi, /No decisions yet\.?\s*\n?/gi]);
|
|
107
|
+
if (!updated) {
|
|
108
|
+
return (0, utils_js_1.mcpError)('Decisions section not found in STATE.md', 'Section not found');
|
|
109
|
+
}
|
|
110
|
+
node_fs_1.default.writeFileSync(stPath, updated, 'utf-8');
|
|
111
|
+
return (0, utils_js_1.mcpSuccess)({ added: true, decision: entry }, 'Decision recorded');
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
return (0, utils_js_1.mcpError)(e.message, 'Operation failed');
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
// ── mcp_add_blocker ─────────────────────────────────────────────────────────
|
|
118
|
+
server.tool('mcp_add_blocker', 'Add a blocker entry to the Blockers section of STATE.md.', {
|
|
119
|
+
text: zod_1.z.string().describe('Blocker description'),
|
|
120
|
+
}, async ({ text }) => {
|
|
121
|
+
try {
|
|
122
|
+
const cwd = (0, utils_js_1.detectProjectRoot)();
|
|
123
|
+
if (!cwd) {
|
|
124
|
+
return (0, utils_js_1.mcpError)('No .planning/ directory found', 'Project not detected');
|
|
125
|
+
}
|
|
126
|
+
const stPath = (0, core_js_1.statePath)(cwd);
|
|
127
|
+
if (!node_fs_1.default.existsSync(stPath)) {
|
|
128
|
+
return (0, utils_js_1.mcpError)('STATE.md not found', 'STATE.md missing');
|
|
129
|
+
}
|
|
130
|
+
const content = node_fs_1.default.readFileSync(stPath, 'utf-8');
|
|
131
|
+
const entry = `- ${text}`;
|
|
132
|
+
const sectionPattern = /(###?\s*(?:Blockers|Blockers\/Concerns|Concerns)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i;
|
|
133
|
+
const updated = (0, state_js_1.appendToStateSection)(content, sectionPattern, entry, [/None\.?\s*\n?/gi, /None yet\.?\s*\n?/gi]);
|
|
134
|
+
if (!updated) {
|
|
135
|
+
return (0, utils_js_1.mcpError)('Blockers section not found in STATE.md', 'Section not found');
|
|
136
|
+
}
|
|
137
|
+
node_fs_1.default.writeFileSync(stPath, updated, 'utf-8');
|
|
138
|
+
return (0, utils_js_1.mcpSuccess)({ added: true, blocker: text }, 'Blocker added');
|
|
139
|
+
}
|
|
140
|
+
catch (e) {
|
|
141
|
+
return (0, utils_js_1.mcpError)(e.message, 'Operation failed');
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
// ── mcp_resolve_blocker ─────────────────────────────────────────────────────
|
|
145
|
+
server.tool('mcp_resolve_blocker', 'Remove a blocker from STATE.md by matching text (case-insensitive partial match).', {
|
|
146
|
+
text: zod_1.z
|
|
147
|
+
.string()
|
|
148
|
+
.describe('Text to match against blocker entries (case-insensitive partial match)'),
|
|
149
|
+
}, async ({ text }) => {
|
|
150
|
+
try {
|
|
151
|
+
const cwd = (0, utils_js_1.detectProjectRoot)();
|
|
152
|
+
if (!cwd) {
|
|
153
|
+
return (0, utils_js_1.mcpError)('No .planning/ directory found', 'Project not detected');
|
|
154
|
+
}
|
|
155
|
+
const stPath = (0, core_js_1.statePath)(cwd);
|
|
156
|
+
if (!node_fs_1.default.existsSync(stPath)) {
|
|
157
|
+
return (0, utils_js_1.mcpError)('STATE.md not found', 'STATE.md missing');
|
|
158
|
+
}
|
|
159
|
+
let content = node_fs_1.default.readFileSync(stPath, 'utf-8');
|
|
160
|
+
const sectionPattern = /(###?\s*(?:Blockers|Blockers\/Concerns|Concerns)\s*\n)([\s\S]*?)(?=\n###?|\n##[^#]|$)/i;
|
|
161
|
+
const match = content.match(sectionPattern);
|
|
162
|
+
if (!match) {
|
|
163
|
+
return (0, utils_js_1.mcpError)('Blockers section not found in STATE.md', 'Section not found');
|
|
164
|
+
}
|
|
165
|
+
const sectionBody = match[2];
|
|
166
|
+
const lines = sectionBody.split('\n');
|
|
167
|
+
const filtered = lines.filter((line) => {
|
|
168
|
+
if (!line.startsWith('- '))
|
|
169
|
+
return true;
|
|
170
|
+
return !line.toLowerCase().includes(text.toLowerCase());
|
|
171
|
+
});
|
|
172
|
+
let newBody = filtered.join('\n');
|
|
173
|
+
if (!newBody.trim() || !newBody.includes('- ')) {
|
|
174
|
+
newBody = 'None\n';
|
|
175
|
+
}
|
|
176
|
+
content = content.replace(sectionPattern, (_match, header) => `${header}${newBody}`);
|
|
177
|
+
node_fs_1.default.writeFileSync(stPath, content, 'utf-8');
|
|
178
|
+
return (0, utils_js_1.mcpSuccess)({ resolved: true, blocker: text }, 'Blocker resolved');
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
return (0, utils_js_1.mcpError)(e.message, 'Operation failed');
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=state-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-tools.js","sourceRoot":"","sources":["../../src/mcp/state-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Todo CRUD MCP Tools — Todo operations exposed as MCP tools
|
|
3
|
+
*
|
|
4
|
+
* CRITICAL: Never import output() or error() from core — they call process.exit().
|
|
5
|
+
* CRITICAL: Never write to stdout — it is reserved for MCP JSON-RPC protocol.
|
|
6
|
+
* CRITICAL: Never call process.exit() — the server must stay alive after every tool call.
|
|
7
|
+
*/
|
|
8
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
9
|
+
/**
|
|
10
|
+
* Register all todo CRUD tools on the MCP server.
|
|
11
|
+
*/
|
|
12
|
+
export declare function registerTodoTools(server: McpServer): void;
|
|
13
|
+
//# sourceMappingURL=todo-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo-tools.d.ts","sourceRoot":"","sources":["../../src/mcp/todo-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyKzD"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Todo CRUD MCP Tools — Todo operations exposed as MCP tools
|
|
4
|
+
*
|
|
5
|
+
* CRITICAL: Never import output() or error() from core — they call process.exit().
|
|
6
|
+
* CRITICAL: Never write to stdout — it is reserved for MCP JSON-RPC protocol.
|
|
7
|
+
* CRITICAL: Never call process.exit() — the server must stay alive after every tool call.
|
|
8
|
+
*/
|
|
9
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
10
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.registerTodoTools = registerTodoTools;
|
|
14
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
15
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
16
|
+
const zod_1 = require("zod");
|
|
17
|
+
const core_js_1 = require("../core/core.js");
|
|
18
|
+
const commands_js_1 = require("../core/commands.js");
|
|
19
|
+
const utils_js_1 = require("./utils.js");
|
|
20
|
+
/**
|
|
21
|
+
* Register all todo CRUD tools on the MCP server.
|
|
22
|
+
*/
|
|
23
|
+
function registerTodoTools(server) {
|
|
24
|
+
// ── mcp_add_todo ────────────────────────────────────────────────────────────
|
|
25
|
+
server.tool('mcp_add_todo', 'Create a new todo item in .planning/todos/pending/ with frontmatter metadata.', {
|
|
26
|
+
title: zod_1.z.string().describe('Title of the todo item'),
|
|
27
|
+
description: zod_1.z.string().optional().describe('Optional description body'),
|
|
28
|
+
area: zod_1.z.string().optional().default('general').describe('Area/category (default: general)'),
|
|
29
|
+
phase: zod_1.z.string().optional().describe('Associated phase number'),
|
|
30
|
+
}, async ({ title, description, area, phase }) => {
|
|
31
|
+
try {
|
|
32
|
+
const cwd = (0, utils_js_1.detectProjectRoot)();
|
|
33
|
+
if (!cwd) {
|
|
34
|
+
return (0, utils_js_1.mcpError)('No .planning/ directory found', 'Project not detected');
|
|
35
|
+
}
|
|
36
|
+
const pendingDir = (0, core_js_1.planningPath)(cwd, 'todos', 'pending');
|
|
37
|
+
node_fs_1.default.mkdirSync(pendingDir, { recursive: true });
|
|
38
|
+
const today = (0, core_js_1.todayISO)();
|
|
39
|
+
const slug = (0, core_js_1.generateSlugInternal)(title) || 'untitled';
|
|
40
|
+
const timestamp = Date.now();
|
|
41
|
+
const filename = `${timestamp}-${slug}.md`;
|
|
42
|
+
const filePath = node_path_1.default.join(pendingDir, filename);
|
|
43
|
+
const content = `---\ncreated: ${today}\ntitle: ${title}\narea: ${area || 'general'}\nphase: ${phase || 'unassigned'}\n---\n${description || ''}\n`;
|
|
44
|
+
node_fs_1.default.writeFileSync(filePath, content, 'utf-8');
|
|
45
|
+
return (0, utils_js_1.mcpSuccess)({
|
|
46
|
+
file: filename,
|
|
47
|
+
path: `.planning/todos/pending/${filename}`,
|
|
48
|
+
title,
|
|
49
|
+
area: area || 'general',
|
|
50
|
+
}, `Todo created: ${title}`);
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
return (0, utils_js_1.mcpError)(e.message, 'Operation failed');
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
// ── mcp_complete_todo ───────────────────────────────────────────────────────
|
|
57
|
+
server.tool('mcp_complete_todo', 'Mark a pending todo as completed by moving it from pending/ to completed/ with a completion timestamp.', {
|
|
58
|
+
todo_id: zod_1.z.string().describe('Filename of the todo (e.g., 1234567890-my-task.md)'),
|
|
59
|
+
}, async ({ todo_id }) => {
|
|
60
|
+
try {
|
|
61
|
+
const cwd = (0, utils_js_1.detectProjectRoot)();
|
|
62
|
+
if (!cwd) {
|
|
63
|
+
return (0, utils_js_1.mcpError)('No .planning/ directory found', 'Project not detected');
|
|
64
|
+
}
|
|
65
|
+
const pendingDir = (0, core_js_1.planningPath)(cwd, 'todos', 'pending');
|
|
66
|
+
const completedDir = (0, core_js_1.planningPath)(cwd, 'todos', 'completed');
|
|
67
|
+
const sourcePath = node_path_1.default.join(pendingDir, todo_id);
|
|
68
|
+
if (!node_fs_1.default.existsSync(sourcePath)) {
|
|
69
|
+
return (0, utils_js_1.mcpError)(`Todo not found in pending: ${todo_id}`, 'Todo not found');
|
|
70
|
+
}
|
|
71
|
+
node_fs_1.default.mkdirSync(completedDir, { recursive: true });
|
|
72
|
+
let content = node_fs_1.default.readFileSync(sourcePath, 'utf-8');
|
|
73
|
+
const today = (0, core_js_1.todayISO)();
|
|
74
|
+
content = `completed: ${today}\n` + content;
|
|
75
|
+
node_fs_1.default.writeFileSync(node_path_1.default.join(completedDir, todo_id), content, 'utf-8');
|
|
76
|
+
node_fs_1.default.unlinkSync(sourcePath);
|
|
77
|
+
return (0, utils_js_1.mcpSuccess)({ completed: true, file: todo_id, date: today }, `Todo completed: ${todo_id}`);
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
return (0, utils_js_1.mcpError)(e.message, 'Operation failed');
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
// ── mcp_list_todos ──────────────────────────────────────────────────────────
|
|
84
|
+
server.tool('mcp_list_todos', 'List todo items, optionally filtered by area and status (pending, completed, or all).', {
|
|
85
|
+
area: zod_1.z.string().optional().describe('Filter by area/category'),
|
|
86
|
+
status: zod_1.z
|
|
87
|
+
.enum(['pending', 'completed', 'all'])
|
|
88
|
+
.optional()
|
|
89
|
+
.default('pending')
|
|
90
|
+
.describe('Which todos to list (default: pending)'),
|
|
91
|
+
}, async ({ area, status }) => {
|
|
92
|
+
try {
|
|
93
|
+
const cwd = (0, utils_js_1.detectProjectRoot)();
|
|
94
|
+
if (!cwd) {
|
|
95
|
+
return (0, utils_js_1.mcpError)('No .planning/ directory found', 'Project not detected');
|
|
96
|
+
}
|
|
97
|
+
const todosBase = (0, core_js_1.planningPath)(cwd, 'todos');
|
|
98
|
+
const dirs = [];
|
|
99
|
+
if (status === 'pending' || status === 'all') {
|
|
100
|
+
dirs.push(node_path_1.default.join(todosBase, 'pending'));
|
|
101
|
+
}
|
|
102
|
+
if (status === 'completed' || status === 'all') {
|
|
103
|
+
dirs.push(node_path_1.default.join(todosBase, 'completed'));
|
|
104
|
+
}
|
|
105
|
+
const todos = [];
|
|
106
|
+
for (const dir of dirs) {
|
|
107
|
+
const dirStatus = dir.endsWith('pending') ? 'pending' : 'completed';
|
|
108
|
+
let files = [];
|
|
109
|
+
try {
|
|
110
|
+
files = node_fs_1.default.readdirSync(dir).filter((f) => f.endsWith('.md'));
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Directory may not exist
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
for (const file of files) {
|
|
117
|
+
try {
|
|
118
|
+
const content = node_fs_1.default.readFileSync(node_path_1.default.join(dir, file), 'utf-8');
|
|
119
|
+
const fm = (0, commands_js_1.parseTodoFrontmatter)(content);
|
|
120
|
+
if (area && fm.area !== area)
|
|
121
|
+
continue;
|
|
122
|
+
todos.push({
|
|
123
|
+
file,
|
|
124
|
+
created: fm.created,
|
|
125
|
+
title: fm.title,
|
|
126
|
+
area: fm.area,
|
|
127
|
+
status: dirStatus,
|
|
128
|
+
path: `.planning/todos/${dirStatus}/${file}`,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Skip unreadable files
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return (0, utils_js_1.mcpSuccess)({ count: todos.length, todos }, `${todos.length} todos found`);
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
return (0, utils_js_1.mcpError)(e.message, 'Operation failed');
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=todo-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo-tools.js","sourceRoot":"","sources":["../../src/mcp/todo-tools.ts"],"names":[],"mappings":"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"}
|