@mcp-graph-workflow/mcp-graph 5.3.0 → 5.5.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 (144) hide show
  1. package/dist/api/router.js +1 -1
  2. package/dist/api/router.js.map +1 -1
  3. package/dist/api/routes/code-graph.js +2 -2
  4. package/dist/api/routes/code-graph.js.map +1 -1
  5. package/dist/api/routes/context.d.ts.map +1 -1
  6. package/dist/api/routes/context.js +75 -0
  7. package/dist/api/routes/context.js.map +1 -1
  8. package/dist/api/routes/folder.js +2 -2
  9. package/dist/api/routes/folder.js.map +1 -1
  10. package/dist/api/routes/skills.d.ts +2 -1
  11. package/dist/api/routes/skills.d.ts.map +1 -1
  12. package/dist/api/routes/skills.js +139 -3
  13. package/dist/api/routes/skills.js.map +1 -1
  14. package/dist/cli/commands/update.d.ts +3 -0
  15. package/dist/cli/commands/update.d.ts.map +1 -0
  16. package/dist/cli/commands/update.js +60 -0
  17. package/dist/cli/commands/update.js.map +1 -0
  18. package/dist/cli/index.js +2 -0
  19. package/dist/cli/index.js.map +1 -1
  20. package/dist/core/code/code-indexer.d.ts +2 -2
  21. package/dist/core/code/code-indexer.d.ts.map +1 -1
  22. package/dist/core/code/code-indexer.js +3 -3
  23. package/dist/core/code/code-indexer.js.map +1 -1
  24. package/dist/core/code/code-types.d.ts +1 -1
  25. package/dist/core/code/code-types.d.ts.map +1 -1
  26. package/dist/core/code/ts-analyzer.d.ts +7 -1
  27. package/dist/core/code/ts-analyzer.d.ts.map +1 -1
  28. package/dist/core/code/ts-analyzer.js +105 -72
  29. package/dist/core/code/ts-analyzer.js.map +1 -1
  30. package/dist/core/config/ai-memory-generator.d.ts.map +1 -1
  31. package/dist/core/config/ai-memory-generator.js +78 -7
  32. package/dist/core/config/ai-memory-generator.js.map +1 -1
  33. package/dist/core/events/event-types.d.ts +18 -1
  34. package/dist/core/events/event-types.d.ts.map +1 -1
  35. package/dist/core/graph/graph-types.d.ts +1 -0
  36. package/dist/core/graph/graph-types.d.ts.map +1 -1
  37. package/dist/core/importer/prd-to-graph.d.ts.map +1 -1
  38. package/dist/core/importer/prd-to-graph.js +49 -12
  39. package/dist/core/importer/prd-to-graph.js.map +1 -1
  40. package/dist/core/parser/classify.d.ts +1 -0
  41. package/dist/core/parser/classify.d.ts.map +1 -1
  42. package/dist/core/parser/classify.js +1 -0
  43. package/dist/core/parser/classify.js.map +1 -1
  44. package/dist/core/skills/built-in-skills.d.ts +1 -1
  45. package/dist/core/skills/built-in-skills.d.ts.map +1 -1
  46. package/dist/core/skills/built-in-skills.js +265 -1
  47. package/dist/core/skills/built-in-skills.js.map +1 -1
  48. package/dist/core/skills/self-healing-listener.d.ts +22 -0
  49. package/dist/core/skills/self-healing-listener.d.ts.map +1 -0
  50. package/dist/core/skills/self-healing-listener.js +102 -0
  51. package/dist/core/skills/self-healing-listener.js.map +1 -0
  52. package/dist/core/skills/skill-store.d.ts +14 -0
  53. package/dist/core/skills/skill-store.d.ts.map +1 -0
  54. package/dist/core/skills/skill-store.js +109 -0
  55. package/dist/core/skills/skill-store.js.map +1 -0
  56. package/dist/core/store/migrations.d.ts.map +1 -1
  57. package/dist/core/store/migrations.js +39 -0
  58. package/dist/core/store/migrations.js.map +1 -1
  59. package/dist/core/store/path-resolver.d.ts +38 -0
  60. package/dist/core/store/path-resolver.d.ts.map +1 -0
  61. package/dist/core/store/path-resolver.js +92 -0
  62. package/dist/core/store/path-resolver.js.map +1 -0
  63. package/dist/core/store/sqlite-store.d.ts +21 -0
  64. package/dist/core/store/sqlite-store.d.ts.map +1 -1
  65. package/dist/core/store/sqlite-store.js +109 -40
  66. package/dist/core/store/sqlite-store.js.map +1 -1
  67. package/dist/core/utils/constants.d.ts +10 -0
  68. package/dist/core/utils/constants.d.ts.map +1 -1
  69. package/dist/core/utils/constants.js +12 -0
  70. package/dist/core/utils/constants.js.map +1 -1
  71. package/dist/mcp/init-project.d.ts +14 -0
  72. package/dist/mcp/init-project.d.ts.map +1 -1
  73. package/dist/mcp/init-project.js +140 -36
  74. package/dist/mcp/init-project.js.map +1 -1
  75. package/dist/mcp/lifecycle-wrapper.d.ts +2 -1
  76. package/dist/mcp/lifecycle-wrapper.d.ts.map +1 -1
  77. package/dist/mcp/lifecycle-wrapper.js +20 -1
  78. package/dist/mcp/lifecycle-wrapper.js.map +1 -1
  79. package/dist/mcp/server.js +18 -16
  80. package/dist/mcp/server.js.map +1 -1
  81. package/dist/mcp/tools/add-node.d.ts +3 -0
  82. package/dist/mcp/tools/add-node.d.ts.map +1 -1
  83. package/dist/mcp/tools/add-node.js +7 -3
  84. package/dist/mcp/tools/add-node.js.map +1 -1
  85. package/dist/mcp/tools/delete-node.d.ts +3 -0
  86. package/dist/mcp/tools/delete-node.d.ts.map +1 -1
  87. package/dist/mcp/tools/delete-node.js +7 -3
  88. package/dist/mcp/tools/delete-node.js.map +1 -1
  89. package/dist/mcp/tools/index.d.ts.map +1 -1
  90. package/dist/mcp/tools/index.js +21 -10
  91. package/dist/mcp/tools/index.js.map +1 -1
  92. package/dist/mcp/tools/list-skills.d.ts +1 -2
  93. package/dist/mcp/tools/list-skills.d.ts.map +1 -1
  94. package/dist/mcp/tools/list-skills.js +6 -4
  95. package/dist/mcp/tools/list-skills.js.map +1 -1
  96. package/dist/mcp/tools/manage-skill.d.ts +8 -0
  97. package/dist/mcp/tools/manage-skill.d.ts.map +1 -0
  98. package/dist/mcp/tools/manage-skill.js +202 -0
  99. package/dist/mcp/tools/manage-skill.js.map +1 -0
  100. package/dist/mcp/tools/node.d.ts +9 -0
  101. package/dist/mcp/tools/node.d.ts.map +1 -0
  102. package/dist/mcp/tools/node.js +195 -0
  103. package/dist/mcp/tools/node.js.map +1 -0
  104. package/dist/mcp/tools/update-node.d.ts +3 -0
  105. package/dist/mcp/tools/update-node.d.ts.map +1 -1
  106. package/dist/mcp/tools/update-node.js +7 -3
  107. package/dist/mcp/tools/update-node.js.map +1 -1
  108. package/dist/mcp/tools/validate-ac.d.ts +3 -0
  109. package/dist/mcp/tools/validate-ac.d.ts.map +1 -1
  110. package/dist/mcp/tools/validate-ac.js +6 -2
  111. package/dist/mcp/tools/validate-ac.js.map +1 -1
  112. package/dist/mcp/tools/validate-task.d.ts +3 -0
  113. package/dist/mcp/tools/validate-task.d.ts.map +1 -1
  114. package/dist/mcp/tools/validate-task.js +6 -1
  115. package/dist/mcp/tools/validate-task.js.map +1 -1
  116. package/dist/mcp/tools/validate.d.ts +9 -0
  117. package/dist/mcp/tools/validate.d.ts.map +1 -0
  118. package/dist/mcp/tools/validate.js +70 -0
  119. package/dist/mcp/tools/validate.js.map +1 -0
  120. package/dist/schemas/graph.schema.d.ts +2 -0
  121. package/dist/schemas/graph.schema.d.ts.map +1 -1
  122. package/dist/schemas/graph.schema.js +1 -0
  123. package/dist/schemas/graph.schema.js.map +1 -1
  124. package/dist/schemas/skill.schema.d.ts +57 -0
  125. package/dist/schemas/skill.schema.d.ts.map +1 -0
  126. package/dist/schemas/skill.schema.js +24 -0
  127. package/dist/schemas/skill.schema.js.map +1 -0
  128. package/dist/web/dashboard/dist/assets/{benchmark-tab-B5Sr8Cah.js → benchmark-tab-BW4QxI49.js} +1 -1
  129. package/dist/web/dashboard/dist/assets/context-tab-C5RAlXNW.js +1 -0
  130. package/dist/web/dashboard/dist/assets/{gitnexus-tab-DqmbSdzV.js → gitnexus-tab-BnxxYl2F.js} +1 -1
  131. package/dist/web/dashboard/dist/assets/{graph-tab-BKns5HdW.js → graph-tab-Cv_wQ6Az.js} +1 -1
  132. package/dist/web/dashboard/dist/assets/{graph-utils-BxUWNvsI.js → graph-utils-Ds1zJyD1.js} +1 -1
  133. package/dist/web/dashboard/dist/assets/{index-CZOiKbTP.js → index-BAeZDWWy.js} +11 -11
  134. package/dist/web/dashboard/dist/assets/{index-Dd4vKyDX.js → index-Bic_URMs.js} +1 -1
  135. package/dist/web/dashboard/dist/assets/index-DQqYFXms.css +1 -0
  136. package/dist/web/dashboard/dist/assets/{insights-tab-B1kPckBM.js → insights-tab-U_ATOqPu.js} +1 -1
  137. package/dist/web/dashboard/dist/assets/{logs-tab-BWfsrRlB.js → logs-tab-B8psCXuB.js} +1 -1
  138. package/dist/web/dashboard/dist/assets/{memories-tab-D3zm-1Sq.js → memories-tab-DcWok2by.js} +1 -1
  139. package/dist/web/dashboard/dist/assets/{prd-backlog-tab-DXP4dFP-.js → prd-backlog-tab-CjftveTc.js} +1 -1
  140. package/dist/web/dashboard/dist/assets/skills-tab-Ddp1w4vS.js +1 -0
  141. package/dist/web/dashboard/dist/index.html +2 -2
  142. package/package.json +1 -1
  143. package/dist/web/dashboard/dist/assets/index-xyMN-_UV.css +0 -1
  144. package/dist/web/dashboard/dist/assets/skills-tab-CAlVL80S.js +0 -1
@@ -0,0 +1,202 @@
1
+ /**
2
+ * MCP Tool — manage_skill
3
+ * Enable/disable skills and CRUD custom skills via agent.
4
+ */
5
+ import { z } from "zod/v4";
6
+ import { setSkillEnabled, getSkillPreferences, createCustomSkill, updateCustomSkill, deleteCustomSkill, getCustomSkills, getCustomSkillByName, } from "../../core/skills/skill-store.js";
7
+ import { getBuiltInSkills, getSkillsByPhase, getSkillByName } from "../../core/skills/built-in-skills.js";
8
+ import { CustomSkillInputSchema } from "../../schemas/skill.schema.js";
9
+ import { logger } from "../../core/utils/logger.js";
10
+ export function registerManageSkill(server, store) {
11
+ server.tool("manage_skill", "Manage skills: list built-in skills, enable/disable, CRUD custom skills.", {
12
+ action: z
13
+ .enum(["list", "enable", "disable", "create", "update", "delete", "list_custom", "get_preferences"])
14
+ .describe("Action to perform"),
15
+ skillName: z
16
+ .string()
17
+ .optional()
18
+ .describe("Skill name (for list: get full instructions; enable/disable/delete_by_name)"),
19
+ skillId: z
20
+ .string()
21
+ .optional()
22
+ .describe("Skill ID (for update/delete)"),
23
+ phase: z
24
+ .enum(["ANALYZE", "DESIGN", "PLAN", "IMPLEMENT", "VALIDATE", "REVIEW", "HANDOFF", "LISTENING"])
25
+ .optional()
26
+ .describe("Filter skills by lifecycle phase (list only)"),
27
+ data: z
28
+ .object({
29
+ name: z.string().optional(),
30
+ description: z.string().optional(),
31
+ category: z.string().optional(),
32
+ phases: z.array(z.string()).optional(),
33
+ instructions: z.string().optional(),
34
+ })
35
+ .optional()
36
+ .describe("Skill data (for create/update)"),
37
+ }, async ({ action, skillName, skillId, phase, data }) => {
38
+ logger.debug("tool:manage_skill", { action, skillName, skillId });
39
+ const project = store.getProject();
40
+ if (!project) {
41
+ return {
42
+ content: [{ type: "text", text: JSON.stringify({ error: "No active project. Run init first." }) }],
43
+ isError: true,
44
+ };
45
+ }
46
+ const db = store.getDb();
47
+ const projectId = project.id;
48
+ try {
49
+ switch (action) {
50
+ case "list": {
51
+ // Single skill lookup with full instructions
52
+ if (skillName) {
53
+ const skill = getSkillByName(skillName);
54
+ if (!skill) {
55
+ return {
56
+ content: [{
57
+ type: "text",
58
+ text: JSON.stringify({ error: `Skill '${skillName}' not found` }, null, 2),
59
+ }],
60
+ isError: true,
61
+ };
62
+ }
63
+ return {
64
+ content: [{
65
+ type: "text",
66
+ text: JSON.stringify({
67
+ name: skill.name,
68
+ description: skill.description,
69
+ category: skill.category,
70
+ phases: skill.phases,
71
+ instructions: skill.instructions,
72
+ }, null, 2),
73
+ }],
74
+ };
75
+ }
76
+ // List skills (optionally filtered by phase)
77
+ const skills = phase
78
+ ? getSkillsByPhase(phase)
79
+ : getBuiltInSkills();
80
+ const summary = skills.map((s) => ({
81
+ name: s.name,
82
+ description: s.description,
83
+ category: s.category,
84
+ phases: s.phases,
85
+ }));
86
+ logger.info("tool:manage_skill:list:ok", { count: summary.length, phase: phase ?? "all" });
87
+ return {
88
+ content: [{
89
+ type: "text",
90
+ text: JSON.stringify({
91
+ total: summary.length,
92
+ ...(phase ? { phase } : {}),
93
+ skills: summary,
94
+ }, null, 2),
95
+ }],
96
+ };
97
+ }
98
+ case "enable":
99
+ case "disable": {
100
+ if (!skillName) {
101
+ return {
102
+ content: [{ type: "text", text: JSON.stringify({ error: "skillName required for enable/disable" }) }],
103
+ isError: true,
104
+ };
105
+ }
106
+ setSkillEnabled(db, projectId, skillName, action === "enable");
107
+ return {
108
+ content: [{ type: "text", text: JSON.stringify({ ok: true, skillName, enabled: action === "enable" }) }],
109
+ };
110
+ }
111
+ case "create": {
112
+ if (!data) {
113
+ return {
114
+ content: [{ type: "text", text: JSON.stringify({ error: "data required for create" }) }],
115
+ isError: true,
116
+ };
117
+ }
118
+ const parsed = CustomSkillInputSchema.safeParse(data);
119
+ if (!parsed.success) {
120
+ return {
121
+ content: [{ type: "text", text: JSON.stringify({ error: "Validation failed", details: parsed.error.issues }) }],
122
+ isError: true,
123
+ };
124
+ }
125
+ const created = createCustomSkill(db, projectId, parsed.data);
126
+ logger.info("tool:manage_skill:created", { id: created.id, name: created.name });
127
+ return {
128
+ content: [{ type: "text", text: JSON.stringify(created, null, 2) }],
129
+ };
130
+ }
131
+ case "update": {
132
+ if (!skillId || !data) {
133
+ return {
134
+ content: [{ type: "text", text: JSON.stringify({ error: "skillId and data required for update" }) }],
135
+ isError: true,
136
+ };
137
+ }
138
+ const updated = updateCustomSkill(db, projectId, skillId, data);
139
+ return {
140
+ content: [{ type: "text", text: JSON.stringify(updated, null, 2) }],
141
+ };
142
+ }
143
+ case "delete": {
144
+ if (!skillId && !skillName) {
145
+ return {
146
+ content: [{ type: "text", text: JSON.stringify({ error: "skillId or skillName required for delete" }) }],
147
+ isError: true,
148
+ };
149
+ }
150
+ if (skillId) {
151
+ deleteCustomSkill(db, projectId, skillId);
152
+ }
153
+ else if (skillName) {
154
+ const skill = getCustomSkillByName(db, projectId, skillName);
155
+ if (!skill) {
156
+ return {
157
+ content: [{ type: "text", text: JSON.stringify({ error: `Custom skill '${skillName}' not found` }) }],
158
+ isError: true,
159
+ };
160
+ }
161
+ deleteCustomSkill(db, projectId, skill.id);
162
+ }
163
+ return {
164
+ content: [{ type: "text", text: JSON.stringify({ ok: true, deleted: skillId ?? skillName }) }],
165
+ };
166
+ }
167
+ case "list_custom": {
168
+ const customs = getCustomSkills(db, projectId);
169
+ return {
170
+ content: [{
171
+ type: "text",
172
+ text: JSON.stringify({ total: customs.length, skills: customs }, null, 2),
173
+ }],
174
+ };
175
+ }
176
+ case "get_preferences": {
177
+ const prefs = getSkillPreferences(db, projectId);
178
+ const obj = {};
179
+ for (const [k, v] of prefs)
180
+ obj[k] = v;
181
+ return {
182
+ content: [{ type: "text", text: JSON.stringify({ preferences: obj }, null, 2) }],
183
+ };
184
+ }
185
+ default:
186
+ return {
187
+ content: [{ type: "text", text: JSON.stringify({ error: `Unknown action: ${action}` }) }],
188
+ isError: true,
189
+ };
190
+ }
191
+ }
192
+ catch (err) {
193
+ const message = err instanceof Error ? err.message : String(err);
194
+ logger.error("tool:manage_skill:error", { action, error: message });
195
+ return {
196
+ content: [{ type: "text", text: JSON.stringify({ error: message }) }],
197
+ isError: true,
198
+ };
199
+ }
200
+ });
201
+ }
202
+ //# sourceMappingURL=manage-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manage-skill.js","sourceRoot":"","sources":["../../../src/mcp/tools/manage-skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * MCP Tool — node
3
+ * Consolidated CRUD for graph nodes (add, update, delete).
4
+ * Replaces separate add_node, update_node, delete_node tools.
5
+ */
6
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ import type { SqliteStore } from "../../core/store/sqlite-store.js";
8
+ export declare function registerNode(server: McpServer, store: SqliteStore): void;
9
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/node.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAQpE,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAiMxE"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * MCP Tool — node
3
+ * Consolidated CRUD for graph nodes (add, update, delete).
4
+ * Replaces separate add_node, update_node, delete_node tools.
5
+ */
6
+ import { z } from "zod/v4";
7
+ import { NodeTypeSchema, NodeStatusSchema, XpSizeSchema, PrioritySchema } from "../../schemas/node.schema.js";
8
+ import { NodeNotFoundError } from "../../core/utils/errors.js";
9
+ import { generateId } from "../../core/utils/id.js";
10
+ import { now } from "../../core/utils/time.js";
11
+ import { logger } from "../../core/utils/logger.js";
12
+ export function registerNode(server, store) {
13
+ server.tool("node", "Manage graph nodes: add, update, or delete", {
14
+ action: z.enum(["add", "update", "delete"]).describe("Action to perform"),
15
+ // add params
16
+ type: NodeTypeSchema.optional().describe("Node type — required for add (epic, task, subtask, etc.)"),
17
+ title: z.string().optional().describe("Node title — required for add"),
18
+ description: z.string().optional().describe("Node description (add/update)"),
19
+ status: NodeStatusSchema.optional().describe("Node status (add: default backlog, update: new status)"),
20
+ priority: PrioritySchema.optional().describe("Priority 1-5 (add: default 3, update)"),
21
+ xpSize: XpSizeSchema.optional().describe("Size: XS, S, M, L, XL (add/update)"),
22
+ estimateMinutes: z.number().optional().describe("Time estimate in minutes (add/update)"),
23
+ tags: z.array(z.string()).optional().describe("Tags for categorization (add/update)"),
24
+ parentId: z.string().nullable().optional().describe("Parent node ID (add/update)"),
25
+ sprint: z.string().nullable().optional().describe("Sprint identifier (add/update)"),
26
+ acceptanceCriteria: z.array(z.string()).optional().describe("Acceptance criteria (add/update)"),
27
+ blocked: z.boolean().optional().describe("Whether the node is blocked (add)"),
28
+ metadata: z.record(z.string(), z.unknown()).optional().describe("Custom metadata (add)"),
29
+ // update/delete params
30
+ id: z.string().optional().describe("Node ID — required for update/delete"),
31
+ }, async ({ action, id, type, title, description, status, priority, xpSize, estimateMinutes, tags, parentId, sprint, acceptanceCriteria, blocked, metadata }) => {
32
+ logger.debug("tool:node", { action, id, type, title });
33
+ if (action === "add") {
34
+ if (!type || !title) {
35
+ return {
36
+ content: [{ type: "text", text: JSON.stringify({ error: "type and title are required for add action" }) }],
37
+ isError: true,
38
+ };
39
+ }
40
+ if (parentId) {
41
+ const parent = store.getNodeById(parentId);
42
+ if (!parent) {
43
+ const err = new NodeNotFoundError(parentId);
44
+ return {
45
+ content: [{ type: "text", text: JSON.stringify({ error: `Parent not found: ${err.message}` }) }],
46
+ isError: true,
47
+ };
48
+ }
49
+ }
50
+ const timestamp = now();
51
+ const node = {
52
+ id: generateId("node"),
53
+ type,
54
+ title,
55
+ description,
56
+ status: status ?? "backlog",
57
+ priority: priority ?? 3,
58
+ xpSize,
59
+ estimateMinutes,
60
+ tags,
61
+ parentId,
62
+ sprint,
63
+ acceptanceCriteria,
64
+ blocked,
65
+ metadata,
66
+ createdAt: timestamp,
67
+ updatedAt: timestamp,
68
+ };
69
+ store.insertNode(node);
70
+ if (parentId) {
71
+ store.insertEdge({
72
+ id: generateId("edge"),
73
+ from: parentId,
74
+ to: node.id,
75
+ relationType: "parent_of",
76
+ createdAt: timestamp,
77
+ });
78
+ store.insertEdge({
79
+ id: generateId("edge"),
80
+ from: node.id,
81
+ to: parentId,
82
+ relationType: "child_of",
83
+ createdAt: timestamp,
84
+ });
85
+ }
86
+ logger.info("tool:node:add:ok", { nodeId: node.id, type: node.type });
87
+ return {
88
+ content: [{ type: "text", text: JSON.stringify({ ok: true, node }, null, 2) }],
89
+ };
90
+ }
91
+ if (action === "update") {
92
+ if (!id) {
93
+ return {
94
+ content: [{ type: "text", text: JSON.stringify({ error: "id is required for update action" }) }],
95
+ isError: true,
96
+ };
97
+ }
98
+ const fields = {};
99
+ if (title !== undefined)
100
+ fields.title = title;
101
+ if (description !== undefined)
102
+ fields.description = description;
103
+ if (type !== undefined)
104
+ fields.type = type;
105
+ if (priority !== undefined)
106
+ fields.priority = priority;
107
+ if (xpSize !== undefined)
108
+ fields.xpSize = xpSize;
109
+ if (estimateMinutes !== undefined)
110
+ fields.estimateMinutes = estimateMinutes;
111
+ if (tags !== undefined)
112
+ fields.tags = tags;
113
+ if (sprint !== undefined)
114
+ fields.sprint = sprint;
115
+ if (parentId !== undefined)
116
+ fields.parentId = parentId;
117
+ if (acceptanceCriteria !== undefined)
118
+ fields.acceptanceCriteria = acceptanceCriteria;
119
+ // If parentId is changing, manage edges
120
+ if (parentId !== undefined) {
121
+ const existingNode = store.getNodeById(id);
122
+ if (existingNode) {
123
+ const oldParentId = existingNode.parentId;
124
+ // Remove old parent/child edges
125
+ if (oldParentId) {
126
+ const edgesFromOldParent = store.getEdgesFrom(oldParentId);
127
+ for (const edge of edgesFromOldParent) {
128
+ if (edge.to === id && edge.relationType === "parent_of") {
129
+ store.deleteEdge(edge.id);
130
+ }
131
+ }
132
+ const edgesFromNode = store.getEdgesFrom(id);
133
+ for (const edge of edgesFromNode) {
134
+ if (edge.to === oldParentId && edge.relationType === "child_of") {
135
+ store.deleteEdge(edge.id);
136
+ }
137
+ }
138
+ }
139
+ // Create new parent/child edges
140
+ if (parentId !== null) {
141
+ const timestamp = now();
142
+ store.insertEdge({
143
+ id: generateId("edge"),
144
+ from: parentId,
145
+ to: id,
146
+ relationType: "parent_of",
147
+ createdAt: timestamp,
148
+ });
149
+ store.insertEdge({
150
+ id: generateId("edge"),
151
+ from: id,
152
+ to: parentId,
153
+ relationType: "child_of",
154
+ createdAt: timestamp,
155
+ });
156
+ }
157
+ }
158
+ }
159
+ const updated = store.updateNode(id, fields);
160
+ if (!updated) {
161
+ const err = new NodeNotFoundError(id);
162
+ logger.warn("tool:node:update:fail", { error: err.message });
163
+ return {
164
+ content: [{ type: "text", text: JSON.stringify({ error: err.message }) }],
165
+ isError: true,
166
+ };
167
+ }
168
+ logger.info("tool:node:update:ok", { id });
169
+ return {
170
+ content: [{ type: "text", text: JSON.stringify({ ok: true, node: updated }, null, 2) }],
171
+ };
172
+ }
173
+ // action === "delete"
174
+ if (!id) {
175
+ return {
176
+ content: [{ type: "text", text: JSON.stringify({ error: "id is required for delete action" }) }],
177
+ isError: true,
178
+ };
179
+ }
180
+ const deleted = store.deleteNode(id);
181
+ if (!deleted) {
182
+ const err = new NodeNotFoundError(id);
183
+ logger.warn("tool:node:delete:fail", { error: err.message });
184
+ return {
185
+ content: [{ type: "text", text: JSON.stringify({ error: err.message }) }],
186
+ isError: true,
187
+ };
188
+ }
189
+ logger.info("tool:node:delete:ok", { id });
190
+ return {
191
+ content: [{ type: "text", text: JSON.stringify({ ok: true, deletedId: id }, null, 2) }],
192
+ };
193
+ });
194
+ }
195
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/mcp/tools/node.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,6 @@
1
+ /**
2
+ * @deprecated Use `node` tool with action:"update" instead. Will be removed in v7.0.
3
+ */
1
4
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
5
  import type { SqliteStore } from "../../core/store/sqlite-store.js";
3
6
  export declare function registerUpdateNode(server: McpServer, store: SqliteStore): void;
@@ -1 +1 @@
1
- {"version":3,"file":"update-node.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/update-node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAKpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CA8C9E"}
1
+ {"version":3,"file":"update-node.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/update-node.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAKpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CA+C9E"}
@@ -1,9 +1,12 @@
1
+ /**
2
+ * @deprecated Use `node` tool with action:"update" instead. Will be removed in v7.0.
3
+ */
1
4
  import { z } from "zod/v4";
2
5
  import { NodeTypeSchema, XpSizeSchema, PrioritySchema } from "../../schemas/node.schema.js";
3
6
  import { NodeNotFoundError } from "../../core/utils/errors.js";
4
7
  import { logger } from "../../core/utils/logger.js";
5
8
  export function registerUpdateNode(server, store) {
6
- server.tool("update_node", "Update arbitrary fields of a node (title, description, priority, sprint, tags, xpSize, etc.)", {
9
+ server.tool("update_node", "Update arbitrary fields of a node (DEPRECATED use `node` with action:\"update\")", {
7
10
  id: z.string().describe("The node ID to update"),
8
11
  title: z.string().optional().describe("New title"),
9
12
  description: z.string().optional().describe("New description"),
@@ -19,6 +22,7 @@ export function registerUpdateNode(server, store) {
19
22
  .optional()
20
23
  .describe("New acceptance criteria"),
21
24
  }, async ({ id, ...fields }) => {
25
+ logger.warn("tool:update_node:deprecated", { message: "Use 'node' tool with action:'update' instead" });
22
26
  logger.debug("tool:update_node", { id, fields: Object.keys(fields) });
23
27
  const updated = store.updateNode(id, fields);
24
28
  if (!updated) {
@@ -26,7 +30,7 @@ export function registerUpdateNode(server, store) {
26
30
  logger.warn("tool:update_node:fail", { error: err.message });
27
31
  return {
28
32
  content: [
29
- { type: "text", text: JSON.stringify({ error: err.message }) },
33
+ { type: "text", text: JSON.stringify({ error: err.message, _deprecated: "Use 'node' tool with action:'update'" }) },
30
34
  ],
31
35
  isError: true,
32
36
  };
@@ -36,7 +40,7 @@ export function registerUpdateNode(server, store) {
36
40
  content: [
37
41
  {
38
42
  type: "text",
39
- text: JSON.stringify({ ok: true, node: updated }, null, 2),
43
+ text: JSON.stringify({ ok: true, node: updated, _deprecated: "Use 'node' tool with action:'update'" }, null, 2),
40
44
  },
41
45
  ],
42
46
  };
@@ -1 +1 @@
1
- {"version":3,"file":"update-node.js","sourceRoot":"","sources":["../../../src/mcp/tools/update-node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-node.js","sourceRoot":"","sources":["../../../src/mcp/tools/update-node.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,6 @@
1
+ /**
2
+ * @deprecated Use `validate` tool with action:"ac" instead. Will be removed in v7.0.
3
+ */
1
4
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
5
  import type { SqliteStore } from "../../core/store/sqlite-store.js";
3
6
  export declare function registerValidateAc(server: McpServer, store: SqliteStore): void;
@@ -1 +1 @@
1
- {"version":3,"file":"validate-ac.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/validate-ac.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAIpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAwB9E"}
1
+ {"version":3,"file":"validate-ac.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/validate-ac.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAIpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAyB9E"}
@@ -1,11 +1,15 @@
1
+ /**
2
+ * @deprecated Use `validate` tool with action:"ac" instead. Will be removed in v7.0.
3
+ */
1
4
  import { z } from "zod/v4";
2
5
  import { validateAcQuality } from "../../core/analyzer/ac-validator.js";
3
6
  import { logger } from "../../core/utils/logger.js";
4
7
  export function registerValidateAc(server, store) {
5
- server.tool("validate_ac", "Validate acceptance criteria quality using INVEST checks (Independent, Negotiable, Valuable, Estimable, Small, Testable). Detects GWT format (EN/PT), vague terms, and testability.", {
8
+ server.tool("validate_ac", "Validate acceptance criteria quality (DEPRECATED use `validate` with action:\"ac\")", {
6
9
  nodeId: z.string().optional().describe("Validate AC for a specific node"),
7
10
  all: z.boolean().optional().describe("Validate all nodes with AC (default: true if no nodeId)"),
8
11
  }, async ({ nodeId, all }) => {
12
+ logger.warn("tool:validate_ac:deprecated", { message: "Use 'validate' tool with action:'ac' instead" });
9
13
  logger.debug("tool:validate_ac", { nodeId, all });
10
14
  const doc = store.toGraphDocument();
11
15
  const report = validateAcQuality(doc, nodeId, all ?? !nodeId);
@@ -14,7 +18,7 @@ export function registerValidateAc(server, store) {
14
18
  content: [
15
19
  {
16
20
  type: "text",
17
- text: JSON.stringify({ ok: true, ...report }, null, 2),
21
+ text: JSON.stringify({ ok: true, ...report, _deprecated: "Use 'validate' tool with action:'ac'" }, null, 2),
18
22
  },
19
23
  ],
20
24
  };
@@ -1 +1 @@
1
- {"version":3,"file":"validate-ac.js","sourceRoot":"","sources":["../../../src/mcp/tools/validate-ac.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAG3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEpD,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,KAAkB;IACtE,MAAM,CAAC,IAAI,CACT,aAAa,EACb,qLAAqL,EACrL;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QACzE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;KAChG,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;QACxB,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAE9D,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAC/F,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvD;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"validate-ac.js","sourceRoot":"","sources":["../../../src/mcp/tools/validate-ac.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAG3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEpD,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,KAAkB;IACtE,MAAM,CAAC,IAAI,CACT,aAAa,EACb,uFAAuF,EACvF;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QACzE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;KAChG,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;QACxB,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAC,CAAC;QACxG,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAE9D,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAC/F,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,sCAAsC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC5G;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,3 +1,6 @@
1
+ /**
2
+ * @deprecated Use `validate` tool with action:"task" instead. Will be removed in v7.0.
3
+ */
1
4
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
5
  import type { SqliteStore } from "../../core/store/sqlite-store.js";
3
6
  export declare function registerValidateTask(server: McpServer, store: SqliteStore): void;
@@ -1 +1 @@
1
- {"version":3,"file":"validate-task.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/validate-task.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAMpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CA4DhF"}
1
+ {"version":3,"file":"validate-task.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/validate-task.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAMpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CA8DhF"}
@@ -1,10 +1,13 @@
1
+ /**
2
+ * @deprecated Use `validate` tool with action:"task" instead. Will be removed in v7.0.
3
+ */
1
4
  import { z } from "zod/v4";
2
5
  import { runValidation } from "../../core/capture/validate-runner.js";
3
6
  import { KnowledgeStore } from "../../core/store/knowledge-store.js";
4
7
  import { indexCapture } from "../../core/rag/capture-indexer.js";
5
8
  import { logger } from "../../core/utils/logger.js";
6
9
  export function registerValidateTask(server, store) {
7
- server.tool("validate_task", "Run browser-based validation for a task. Captures a URL, optionally compares with a second URL (A/B), and indexes the captured content into the knowledge store.", {
10
+ server.tool("validate_task", "Run browser-based validation for a task (DEPRECATED use `validate` with action:\"task\")", {
8
11
  url: z.string().url().describe("URL to validate"),
9
12
  compareUrl: z
10
13
  .string()
@@ -20,6 +23,7 @@ export function registerValidateTask(server, store) {
20
23
  .optional()
21
24
  .describe("Associate validation with a graph node"),
22
25
  }, async ({ url, compareUrl, selector, nodeId }) => {
26
+ logger.warn("tool:validate_task:deprecated", { message: "Use 'validate' tool with action:'task' instead" });
23
27
  logger.debug("tool:validate_task", { nodeId });
24
28
  const result = await runValidation(url, { compareUrl, selector });
25
29
  // Index captured content into knowledge store
@@ -34,6 +38,7 @@ export function registerValidateTask(server, store) {
34
38
  wordCount: result.primary.wordCount,
35
39
  title: result.primary.title,
36
40
  timestamp: result.timestamp,
41
+ _deprecated: "Use 'validate' tool with action:'task'",
37
42
  };
38
43
  if (nodeId) {
39
44
  response.nodeId = nodeId;
@@ -1 +1 @@
1
- {"version":3,"file":"validate-task.js","sourceRoot":"","sources":["../../../src/mcp/tools/validate-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAG3B,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEpD,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,KAAkB;IACxE,MAAM,CAAC,IAAI,CACT,eAAe,EACf,kKAAkK,EAClK;QACE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACjD,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,GAAG,EAAE;aACL,QAAQ,EAAE;aACV,QAAQ,CAAC,+BAA+B,CAAC;QAC5C,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,0CAA0C,CAAC;QACvD,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,wCAAwC,CAAC;KACtD,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;QAC9C,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QAElE,8CAA8C;QAC9C,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACzD,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,QAAQ,GAA4B;YACxC,EAAE,EAAE,IAAI;YACR,GAAG;YACH,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;YACnC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;QAC3B,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,QAAQ,CAAC,UAAU,GAAG;gBACpB,UAAU;gBACV,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc;gBAC1C,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW;aACrC,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACtD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxC,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"validate-task.js","sourceRoot":"","sources":["../../../src/mcp/tools/validate-task.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAG3B,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEpD,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,KAAkB;IACxE,MAAM,CAAC,IAAI,CACT,eAAe,EACf,4FAA4F,EAC5F;QACE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACjD,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,GAAG,EAAE;aACL,QAAQ,EAAE;aACV,QAAQ,CAAC,+BAA+B,CAAC;QAC5C,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,0CAA0C,CAAC;QACvD,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,wCAAwC,CAAC;KACtD,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;QAC9C,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC,CAAC;QAC5G,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QAElE,8CAA8C;QAC9C,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACzD,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,QAAQ,GAA4B;YACxC,EAAE,EAAE,IAAI;YACR,GAAG;YACH,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;YACnC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,WAAW,EAAE,wCAAwC;SACtD,CAAC;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;QAC3B,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,QAAQ,CAAC,UAAU,GAAG;gBACpB,UAAU;gBACV,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc;gBAC1C,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW;aACrC,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACtD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxC,CAAC;SACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * MCP Tool — validate
3
+ * Consolidated validation tool (task browser validation + AC quality check).
4
+ * Replaces separate validate_task and validate_ac tools.
5
+ */
6
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ import type { SqliteStore } from "../../core/store/sqlite-store.js";
8
+ export declare function registerValidate(server: McpServer, store: SqliteStore): void;
9
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAOpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAuE5E"}