superkit-mcp-server 1.2.4 → 1.2.6

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 (162) hide show
  1. package/ARCHITECTURE.md +102 -102
  2. package/README.md +71 -71
  3. package/SUPERKIT.md +168 -168
  4. package/agents/code-archaeologist.md +106 -106
  5. package/agents/coder.md +90 -90
  6. package/agents/data-engineer.md +28 -28
  7. package/agents/devops-engineer.md +242 -242
  8. package/agents/git-manager.md +203 -203
  9. package/agents/orchestrator.md +420 -420
  10. package/agents/penetration-tester.md +188 -188
  11. package/agents/performance-optimizer.md +187 -187
  12. package/agents/planner.md +270 -270
  13. package/agents/qa-automation-engineer.md +103 -103
  14. package/agents/quant-developer.md +32 -32
  15. package/agents/reviewer.md +100 -100
  16. package/agents/scout.md +222 -222
  17. package/agents/tester.md +274 -274
  18. package/agents/ui-designer.md +208 -208
  19. package/build/__tests__/test_apply_prompt_args.js +104 -0
  20. package/build/index.js +106 -45
  21. package/build/tools/todoTools.js +39 -39
  22. package/build/tools/validators/__tests__/apiSchema.test.js +23 -23
  23. package/build/tools/validators/__tests__/convertRules.test.js +5 -5
  24. package/build/tools/validators/__tests__/frontendDesign.test.js +12 -12
  25. package/build/tools/validators/__tests__/geoChecker.test.js +19 -19
  26. package/build/tools/validators/__tests__/mobileAudit.test.js +12 -12
  27. package/build/tools/validators/__tests__/reactPerformanceChecker.test.js +17 -17
  28. package/build/tools/validators/__tests__/securityScan.test.js +6 -6
  29. package/build/tools/validators/__tests__/seoChecker.test.js +16 -16
  30. package/build/tools/validators/__tests__/typeCoverage.test.js +14 -14
  31. package/commands/README.md +122 -122
  32. package/commands/ask.toml +72 -72
  33. package/commands/brainstorm.toml +119 -119
  34. package/commands/chat.toml +77 -77
  35. package/commands/code-preview.toml +37 -37
  36. package/commands/code.toml +28 -28
  37. package/commands/content.toml +200 -200
  38. package/commands/cook.toml +77 -77
  39. package/commands/copywrite.toml +131 -131
  40. package/commands/db.toml +192 -192
  41. package/commands/debug.toml +166 -166
  42. package/commands/design.toml +158 -158
  43. package/commands/dev-rules.toml +14 -14
  44. package/commands/do.toml +117 -117
  45. package/commands/doc-rules.toml +14 -14
  46. package/commands/docs.toml +148 -148
  47. package/commands/fix.toml +440 -440
  48. package/commands/fullstack.toml +175 -175
  49. package/commands/git.toml +235 -235
  50. package/commands/help.toml +84 -84
  51. package/commands/integrate.toml +127 -127
  52. package/commands/journal.toml +136 -136
  53. package/commands/kit-setup.toml +40 -40
  54. package/commands/mcp.toml +183 -183
  55. package/commands/orchestration.toml +15 -15
  56. package/commands/plan.toml +206 -172
  57. package/commands/pm.toml +148 -148
  58. package/commands/pr.toml +50 -50
  59. package/commands/project.toml +32 -32
  60. package/commands/research.toml +117 -117
  61. package/commands/review-pr.toml +63 -63
  62. package/commands/review.toml +190 -190
  63. package/commands/scout-ext.toml +97 -97
  64. package/commands/scout.toml +79 -79
  65. package/commands/screenshot.toml +65 -65
  66. package/commands/session.toml +102 -102
  67. package/commands/skill.toml +384 -384
  68. package/commands/status.toml +22 -22
  69. package/commands/team.toml +56 -56
  70. package/commands/test.toml +164 -164
  71. package/commands/ticket.toml +70 -70
  72. package/commands/use.toml +106 -106
  73. package/commands/video.toml +83 -83
  74. package/commands/watzup.toml +71 -71
  75. package/commands/workflow.toml +14 -14
  76. package/package.json +35 -35
  77. package/skills/meta/README.md +30 -30
  78. package/skills/meta/api-design/SKILL.md +134 -134
  79. package/skills/meta/code-review/SKILL.md +44 -44
  80. package/skills/meta/code-review/checklists/pre-merge.md +25 -25
  81. package/skills/meta/code-review/workflows/architecture-pass.md +26 -26
  82. package/skills/meta/code-review/workflows/performance-pass.md +27 -27
  83. package/skills/meta/code-review/workflows/security-pass.md +29 -29
  84. package/skills/meta/compound-docs/SKILL.md +133 -133
  85. package/skills/meta/debug/SKILL.md +40 -40
  86. package/skills/meta/debug/templates/bug-report.template.md +31 -31
  87. package/skills/meta/debug/workflows/reproduce-issue.md +20 -20
  88. package/skills/meta/docker/SKILL.md +126 -126
  89. package/skills/meta/examples/supabase/SKILL.md +46 -46
  90. package/skills/meta/examples/supabase/references/best-practices.md +319 -319
  91. package/skills/meta/examples/supabase/references/common-patterns.md +373 -373
  92. package/skills/meta/examples/supabase/templates/migration-template.sql +49 -49
  93. package/skills/meta/examples/supabase/templates/rls-policy-template.sql +77 -77
  94. package/skills/meta/examples/supabase/workflows/debugging.md +260 -260
  95. package/skills/meta/examples/supabase/workflows/migration-workflow.md +211 -211
  96. package/skills/meta/examples/supabase/workflows/rls-policies.md +244 -244
  97. package/skills/meta/examples/supabase/workflows/schema-design.md +321 -321
  98. package/skills/meta/file-todos/SKILL.md +88 -88
  99. package/skills/meta/mobile/SKILL.md +140 -140
  100. package/skills/meta/nextjs/SKILL.md +101 -101
  101. package/skills/meta/performance/SKILL.md +130 -130
  102. package/skills/meta/react-patterns/SKILL.md +83 -83
  103. package/skills/meta/security/SKILL.md +114 -114
  104. package/skills/meta/session-resume/SKILL.md +96 -96
  105. package/skills/meta/tailwind/SKILL.md +139 -139
  106. package/skills/meta/testing/SKILL.md +43 -43
  107. package/skills/meta/testing/references/vitest-patterns.md +45 -45
  108. package/skills/meta/testing/templates/component-test.template.tsx +37 -37
  109. package/skills/tech/alpha-vantage/SKILL.md +142 -142
  110. package/skills/tech/alpha-vantage/references/commodities.md +153 -153
  111. package/skills/tech/alpha-vantage/references/economic-indicators.md +158 -158
  112. package/skills/tech/alpha-vantage/references/forex-crypto.md +154 -154
  113. package/skills/tech/alpha-vantage/references/fundamentals.md +223 -223
  114. package/skills/tech/alpha-vantage/references/intelligence.md +138 -138
  115. package/skills/tech/alpha-vantage/references/options.md +93 -93
  116. package/skills/tech/alpha-vantage/references/technical-indicators.md +374 -374
  117. package/skills/tech/alpha-vantage/references/time-series.md +157 -157
  118. package/skills/tech/financial-modeling/SKILL.md +18 -18
  119. package/skills/tech/financial-modeling/skills/3-statements/SKILL.md +368 -368
  120. package/skills/tech/financial-modeling/skills/3-statements/references/formatting.md +118 -118
  121. package/skills/tech/financial-modeling/skills/3-statements/references/formulas.md +292 -292
  122. package/skills/tech/financial-modeling/skills/3-statements/references/sec-filings.md +125 -125
  123. package/skills/tech/financial-modeling/skills/dcf-model/SKILL.md +1210 -1210
  124. package/skills/tech/financial-modeling/skills/dcf-model/TROUBLESHOOTING.md +40 -40
  125. package/skills/tech/financial-modeling/skills/dcf-model/requirements.txt +8 -8
  126. package/skills/tech/financial-modeling/skills/dcf-model/scripts/validate_dcf.py +292 -292
  127. package/skills/tech/financial-modeling/skills/lbo-model/SKILL.md +236 -236
  128. package/skills/tech/financial-modeling/skills/merger-model/SKILL.md +108 -108
  129. package/skills/workflows/README.md +203 -203
  130. package/skills/workflows/adr.md +174 -174
  131. package/skills/workflows/changelog.md +74 -74
  132. package/skills/workflows/compound.md +323 -323
  133. package/skills/workflows/compound_health.md +74 -74
  134. package/skills/workflows/create-agent-skill.md +138 -138
  135. package/skills/workflows/cycle.md +144 -144
  136. package/skills/workflows/deploy-docs.md +84 -84
  137. package/skills/workflows/development-rules.md +42 -42
  138. package/skills/workflows/doc.md +95 -95
  139. package/skills/workflows/documentation-management.md +34 -34
  140. package/skills/workflows/explore.md +146 -146
  141. package/skills/workflows/generate_command.md +106 -106
  142. package/skills/workflows/heal-skill.md +97 -97
  143. package/skills/workflows/housekeeping.md +229 -229
  144. package/skills/workflows/kit-setup.md +102 -102
  145. package/skills/workflows/map-codebase.md +78 -78
  146. package/skills/workflows/orchestration-protocol.md +43 -43
  147. package/skills/workflows/plan-compound.md +439 -439
  148. package/skills/workflows/plan_review.md +269 -269
  149. package/skills/workflows/primary-workflow.md +37 -37
  150. package/skills/workflows/promote_pattern.md +86 -86
  151. package/skills/workflows/release-docs.md +82 -82
  152. package/skills/workflows/report-bug.md +135 -135
  153. package/skills/workflows/reproduce-bug.md +118 -118
  154. package/skills/workflows/resolve_pr.md +133 -133
  155. package/skills/workflows/resolve_todo.md +128 -128
  156. package/skills/workflows/review-compound.md +376 -376
  157. package/skills/workflows/skill-review.md +127 -127
  158. package/skills/workflows/specs.md +257 -257
  159. package/skills/workflows/triage-sprint.md +102 -102
  160. package/skills/workflows/triage.md +152 -152
  161. package/skills/workflows/work.md +399 -399
  162. package/skills/workflows/xcode-test.md +93 -93
package/build/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
- import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema } from "@modelcontextprotocol/sdk/types.js";
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
5
5
  import * as path from "path";
6
6
  import * as fs from "fs/promises";
7
7
  import * as toml from "@iarna/toml";
@@ -11,11 +11,11 @@ import { manageSession } from "./tools/sessionManager.js";
11
11
  import { runChecklist } from "./tools/checklist.js";
12
12
  import { runVerifyAll } from "./tools/verifyAll.js";
13
13
  import { logSkill, logWorkflow, rotateLogs } from "./tools/loggerTools.js";
14
- import { getNextTodoId, createTodo, startTodo, doneTodo, completeTodo } from "./tools/todoTools.js";
15
- import { compoundSearch, updateSolutionRef, validateCompound, auditStateDrift, suggestSkills, compoundHealth, compoundDashboard, compoundMetrics } from "./tools/compoundTools.js";
16
- import { bootstrapFolderDocs, checkDocsFreshness, discoverUndocumentedFolders, validateFolderDocs } from "./tools/docsTools.js";
17
- import { generateChangelog, validateChangelog, archiveCompleted, prePushHousekeeping } from "./tools/gitTools.js";
18
- import { validateSpecConsistency, completePlan, validateArchitecture, syncSpec, updateSpecPhase } from "./tools/archTools.js";
14
+ import { getNextTodoId, createTodo, startTodo, doneTodo, completeTodo, } from "./tools/todoTools.js";
15
+ import { compoundSearch, updateSolutionRef, validateCompound, auditStateDrift, suggestSkills, compoundHealth, compoundDashboard, compoundMetrics, } from "./tools/compoundTools.js";
16
+ import { bootstrapFolderDocs, checkDocsFreshness, discoverUndocumentedFolders, validateFolderDocs, } from "./tools/docsTools.js";
17
+ import { generateChangelog, validateChangelog, archiveCompleted, prePushHousekeeping, } from "./tools/gitTools.js";
18
+ import { validateSpecConsistency, completePlan, validateArchitecture, syncSpec, updateSpecPhase, } from "./tools/archTools.js";
19
19
  const __filename = fileURLToPath(import.meta.url);
20
20
  const __dirname = path.dirname(__filename);
21
21
  const superKitRoot = path.resolve(__dirname, "../");
@@ -32,7 +32,7 @@ const server = new Server({
32
32
  async function listDirectorySafe(dirPath) {
33
33
  try {
34
34
  const entries = await fs.readdir(dirPath, { withFileTypes: true });
35
- return entries.map((entry) => (entry.isDirectory() ? `${entry.name}/` : entry.name));
35
+ return entries.map((entry) => entry.isDirectory() ? `${entry.name}/` : entry.name);
36
36
  }
37
37
  catch (err) {
38
38
  return [];
@@ -56,10 +56,10 @@ const TOOLS = [
56
56
  type: "object",
57
57
  properties: {
58
58
  action: { type: "string", enum: ["start", "stop", "status"] },
59
- port: { type: "number", default: 3000 }
59
+ port: { type: "number", default: 3000 },
60
60
  },
61
61
  required: ["action"],
62
- }
62
+ },
63
63
  },
64
64
  {
65
65
  name: "call_tool_session_manager",
@@ -68,10 +68,10 @@ const TOOLS = [
68
68
  type: "object",
69
69
  properties: {
70
70
  command: { type: "string", enum: ["status", "info"] },
71
- path: { type: "string", default: "." }
71
+ path: { type: "string", default: "." },
72
72
  },
73
73
  required: ["command"],
74
- }
74
+ },
75
75
  },
76
76
  {
77
77
  name: "call_tool_checklist",
@@ -81,10 +81,10 @@ const TOOLS = [
81
81
  properties: {
82
82
  projectPath: { type: "string", default: "." },
83
83
  url: { type: "string" },
84
- skipPerformance: { type: "boolean", default: false }
84
+ skipPerformance: { type: "boolean", default: false },
85
85
  },
86
- required: ["projectPath"]
87
- }
86
+ required: ["projectPath"],
87
+ },
88
88
  },
89
89
  {
90
90
  name: "call_tool_verify_all",
@@ -95,10 +95,10 @@ const TOOLS = [
95
95
  projectPath: { type: "string", default: "." },
96
96
  url: { type: "string" },
97
97
  skipE2E: { type: "boolean", default: false },
98
- stopOnFail: { type: "boolean", default: false }
98
+ stopOnFail: { type: "boolean", default: false },
99
99
  },
100
- required: ["projectPath", "url"]
101
- }
100
+ required: ["projectPath", "url"],
101
+ },
102
102
  },
103
103
  {
104
104
  name: "call_tool_logger_manager",
@@ -106,13 +106,16 @@ const TOOLS = [
106
106
  inputSchema: {
107
107
  type: "object",
108
108
  properties: {
109
- action: { type: "string", enum: ["logSkill", "logWorkflow", "rotateLogs"] },
109
+ action: {
110
+ type: "string",
111
+ enum: ["logSkill", "logWorkflow", "rotateLogs"],
112
+ },
110
113
  name: { type: "string" },
111
114
  outcome: { type: "string" },
112
- projectPath: { type: "string", default: "." }
115
+ projectPath: { type: "string", default: "." },
113
116
  },
114
- required: ["action", "projectPath"]
115
- }
117
+ required: ["action", "projectPath"],
118
+ },
116
119
  },
117
120
  {
118
121
  name: "call_tool_todo_manager",
@@ -120,16 +123,20 @@ const TOOLS = [
120
123
  inputSchema: {
121
124
  type: "object",
122
125
  properties: {
123
- action: { type: "string", enum: ["nextId", "create", "start", "done", "complete"] },
126
+ action: {
127
+ type: "string",
128
+ enum: ["nextId", "create", "start", "done", "complete"],
129
+ },
124
130
  title: { type: "string" },
125
131
  description: { type: "string" },
126
- priority: { type: "number" },
132
+ priority: { type: "string" },
133
+ criteria: { type: "array", items: { type: "string" } },
127
134
  todoId: { type: "string" },
128
135
  force: { type: "boolean", default: false },
129
- projectPath: { type: "string", default: "." }
136
+ projectPath: { type: "string", default: "." },
130
137
  },
131
- required: ["action", "projectPath"]
132
- }
138
+ required: ["action", "projectPath"],
139
+ },
133
140
  },
134
141
  {
135
142
  name: "call_tool_compound_manager",
@@ -137,15 +144,27 @@ const TOOLS = [
137
144
  inputSchema: {
138
145
  type: "object",
139
146
  properties: {
140
- action: { type: "string", enum: ["search", "updateRef", "validate", "auditDrift", "suggestSkills", "health", "dashboard", "metrics"] },
147
+ action: {
148
+ type: "string",
149
+ enum: [
150
+ "search",
151
+ "updateRef",
152
+ "validate",
153
+ "auditDrift",
154
+ "suggestSkills",
155
+ "health",
156
+ "dashboard",
157
+ "metrics",
158
+ ],
159
+ },
141
160
  terms: { type: "array", items: { type: "string" } },
142
161
  files: { type: "array", items: { type: "string" } },
143
162
  fix: { type: "boolean", default: false },
144
163
  force: { type: "boolean", default: false },
145
- projectPath: { type: "string", default: "." }
164
+ projectPath: { type: "string", default: "." },
146
165
  },
147
- required: ["action", "projectPath"]
148
- }
166
+ required: ["action", "projectPath"],
167
+ },
149
168
  },
150
169
  {
151
170
  name: "call_tool_docs_manager",
@@ -153,15 +172,18 @@ const TOOLS = [
153
172
  inputSchema: {
154
173
  type: "object",
155
174
  properties: {
156
- action: { type: "string", enum: ["bootstrap", "freshness", "discover", "validate"] },
175
+ action: {
176
+ type: "string",
177
+ enum: ["bootstrap", "freshness", "discover", "validate"],
178
+ },
157
179
  folder: { type: "string" },
158
180
  skipDocs: { type: "boolean", default: false },
159
181
  strict: { type: "boolean", default: false },
160
182
  targetFolders: { type: "array", items: { type: "string" } },
161
- projectPath: { type: "string", default: "." }
183
+ projectPath: { type: "string", default: "." },
162
184
  },
163
- required: ["action", "projectPath"]
164
- }
185
+ required: ["action", "projectPath"],
186
+ },
165
187
  },
166
188
  {
167
189
  name: "call_tool_git_manager",
@@ -169,12 +191,15 @@ const TOOLS = [
169
191
  inputSchema: {
170
192
  type: "object",
171
193
  properties: {
172
- action: { type: "string", enum: ["changelog", "validateChangelog", "archive", "housekeeping"] },
194
+ action: {
195
+ type: "string",
196
+ enum: ["changelog", "validateChangelog", "archive", "housekeeping"],
197
+ },
173
198
  applyFix: { type: "boolean", default: false },
174
- projectPath: { type: "string", default: "." }
199
+ projectPath: { type: "string", default: "." },
175
200
  },
176
- required: ["action", "projectPath"]
177
- }
201
+ required: ["action", "projectPath"],
202
+ },
178
203
  },
179
204
  {
180
205
  name: "call_tool_arch_manager",
@@ -182,17 +207,26 @@ const TOOLS = [
182
207
  inputSchema: {
183
208
  type: "object",
184
209
  properties: {
185
- action: { type: "string", enum: ["validateSpecs", "completePlan", "validateArch", "syncSpec", "updatePhase"] },
210
+ action: {
211
+ type: "string",
212
+ enum: [
213
+ "validateSpecs",
214
+ "completePlan",
215
+ "validateArch",
216
+ "syncSpec",
217
+ "updatePhase",
218
+ ],
219
+ },
186
220
  planFile: { type: "string" },
187
221
  force: { type: "boolean", default: false },
188
222
  specDir: { type: "string" },
189
223
  specName: { type: "string" },
190
224
  phaseNum: { type: "string" },
191
225
  status: { type: "string" },
192
- projectPath: { type: "string", default: "." }
226
+ projectPath: { type: "string", default: "." },
193
227
  },
194
- required: ["action", "projectPath"]
195
- }
228
+ required: ["action", "projectPath"],
229
+ },
196
230
  },
197
231
  {
198
232
  name: "list_superkit_assets",
@@ -268,6 +302,13 @@ server.setRequestHandler(ListPromptsRequestSchema, async () => {
268
302
  prompts.push({
269
303
  name: file.replace(".toml", ""),
270
304
  description: description,
305
+ arguments: [
306
+ {
307
+ name: "args",
308
+ description: "Arguments to pass to the command",
309
+ required: false,
310
+ },
311
+ ],
271
312
  });
272
313
  }
273
314
  catch (e) {
@@ -282,8 +323,18 @@ server.setRequestHandler(ListPromptsRequestSchema, async () => {
282
323
  return { prompts: [] };
283
324
  }
284
325
  });
326
+ export function apply_prompt_args(promptText, userArgs) {
327
+ // Substitute {{#if args}} ... {{else}} ... {{/if}} Handlebars blocks
328
+ promptText = promptText.replace(/\{\{#if args\}\}([\s\S]*?)\{\{else\}\}([\s\S]*?)\{\{\/if\}\}/g, (_, ifBlock, elseBlock) => userArgs.trim() ? ifBlock : elseBlock);
329
+ // Substitute {{#if args}} ... {{/if}} blocks (no else branch)
330
+ promptText = promptText.replace(/\{\{#if args\}\}([\s\S]*?)\{\{\/if\}\}/g, (_, ifBlock) => (userArgs.trim() ? ifBlock : ""));
331
+ // Substitute all {{args}} occurrences with the actual user-provided args
332
+ promptText = promptText.replace(/\{\{args\}\}/g, userArgs);
333
+ return promptText;
334
+ }
285
335
  server.setRequestHandler(GetPromptRequestSchema, async (request) => {
286
336
  const promptName = request.params.name;
337
+ const userArgs = request.params.arguments?.args ?? "";
287
338
  const commandFile = `${promptName}.toml`;
288
339
  const basePath = path.join(superKitRoot, "commands");
289
340
  const safePath = getSafePath(basePath, commandFile);
@@ -294,6 +345,7 @@ server.setRequestHandler(GetPromptRequestSchema, async (request) => {
294
345
  const content = await fs.readFile(safePath, "utf-8");
295
346
  const parsed = toml.parse(content);
296
347
  let promptText = parsed?.prompt || `Execute the ${promptName} command.`;
348
+ promptText = apply_prompt_args(promptText, userArgs);
297
349
  // Resolve @{path} includes from super-kit package root
298
350
  const includePattern = /@\{([^}]+)\}/g;
299
351
  let match;
@@ -369,7 +421,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
369
421
  if (args.action === "nextId")
370
422
  res = String(await getNextTodoId(args.projectPath));
371
423
  else if (args.action === "create")
372
- res = await createTodo(args.title, args.description, args.priority, args.projectPath);
424
+ res = await createTodo(String(args.priority ?? "p3"), args.title, args.description, args.criteria || [], args.projectPath);
373
425
  else if (args.action === "start")
374
426
  res = await startTodo(args.todoId, args.force, args.projectPath);
375
427
  else if (args.action === "done")
@@ -497,7 +549,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
497
549
  const fallbackSafePath = getSafePath(path.join(superKitRoot, "skills"), path.join(args.category, args.skillName));
498
550
  if (fallbackSafePath) {
499
551
  const items = await listDirectorySafe(fallbackSafePath);
500
- return { content: [{ type: "text", text: `SKILL.md not found. Directory contains: ${items.join(', ')}` }] };
552
+ return {
553
+ content: [
554
+ {
555
+ type: "text",
556
+ text: `SKILL.md not found. Directory contains: ${items.join(", ")}`,
557
+ },
558
+ ],
559
+ };
501
560
  }
502
561
  throw e;
503
562
  }
@@ -518,7 +577,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
518
577
  }
519
578
  catch (error) {
520
579
  return {
521
- content: [{ type: "text", text: `Error executing tool: ${error.message}` }],
580
+ content: [
581
+ { type: "text", text: `Error executing tool: ${error.message}` },
582
+ ],
522
583
  isError: true,
523
584
  };
524
585
  }
@@ -35,49 +35,49 @@ export async function createTodo(priority, title, problemStatement, criteriaArgs
35
35
  const filename = `${nextId}-pending-${priority}-${sanitizedDesc}.md`;
36
36
  const filePath = path.join(todosDir, filename);
37
37
  const dateStr = new Date().toISOString().split('T')[0];
38
- let content = `---
39
- status: pending
40
- priority: ${priority}
41
- issue_id: "${nextId}"
42
- tags: [generated, cleanup]
43
- dependencies: []
44
- ---
45
-
46
- # ${title}
47
-
48
- ## Problem Statement
49
-
50
- **What's broken/missing:**
51
- ${problemStatement}
52
-
53
- **Impact:**
54
- This issue currently affects the system quality or functionality and needs to be addressed.
55
-
56
- ## Findings
57
- - **Status:** Identified during workflow execution.
58
- - **Priority:** ${priority}
59
- - **System Impact:** This item is tracked to ensure continuous improvement of the codebase. Addressing it will contribute to overall system stability and feature completeness. The findings section provides context on origin and importance.
60
-
61
- ## Recommended Action
62
- Implement the solution according to the acceptance criteria below.
63
-
64
- ## Acceptance Criteria
38
+ let content = `---
39
+ status: pending
40
+ priority: ${priority}
41
+ issue_id: "${nextId}"
42
+ tags: [generated, cleanup]
43
+ dependencies: []
44
+ ---
45
+
46
+ # ${title}
47
+
48
+ ## Problem Statement
49
+
50
+ **What's broken/missing:**
51
+ ${problemStatement}
52
+
53
+ **Impact:**
54
+ This issue currently affects the system quality or functionality and needs to be addressed.
55
+
56
+ ## Findings
57
+ - **Status:** Identified during workflow execution.
58
+ - **Priority:** ${priority}
59
+ - **System Impact:** This item is tracked to ensure continuous improvement of the codebase. Addressing it will contribute to overall system stability and feature completeness. The findings section provides context on origin and importance.
60
+
61
+ ## Recommended Action
62
+ Implement the solution according to the acceptance criteria below.
63
+
64
+ ## Acceptance Criteria
65
65
  `;
66
66
  for (const criteria of criteriaArgs) {
67
67
  content += `- [ ] ${criteria}\n`;
68
68
  }
69
- content += `
70
-
71
- ## Work Log
72
-
73
- ### ${dateStr} - Created
74
-
75
- **By:** Agent
76
- **Actions:**
77
- - Auto-generated via createTodo MCP tool
78
-
79
- ## Notes
80
- Source: Workflow automation
69
+ content += `
70
+
71
+ ## Work Log
72
+
73
+ ### ${dateStr} - Created
74
+
75
+ **By:** Agent
76
+ **Actions:**
77
+ - Auto-generated via createTodo MCP tool
78
+
79
+ ## Notes
80
+ Source: Workflow automation
81
81
  `;
82
82
  await fs.writeFile(filePath, content);
83
83
  return `✅ Created todo: ${filePath}\n ID: ${nextId}\n Priority: ${priority}\n Title: ${title}`;
@@ -9,16 +9,16 @@ describe('schemaValidator', () => {
9
9
  });
10
10
  describe('validatePrismaSchema', () => {
11
11
  it('should detect bad model names and missing fields', async () => {
12
- vi.mocked(fs.readFile).mockResolvedValue(`
13
- model user {
14
- name String
15
- }
16
- model Post {
17
- id String @id
18
- userId String
19
- createdAt DateTime
20
- }
21
- enum role { ADMIN, USER }
12
+ vi.mocked(fs.readFile).mockResolvedValue(`
13
+ model user {
14
+ name String
15
+ }
16
+ model Post {
17
+ id String @id
18
+ userId String
19
+ createdAt DateTime
20
+ }
21
+ enum role { ADMIN, USER }
22
22
  `);
23
23
  const issues = await validatePrismaSchema('/mock.prisma');
24
24
  expect(issues.some(i => i.includes("Model 'user' should be PascalCase"))).toBe(true);
@@ -47,11 +47,11 @@ describe('apiValidator', () => {
47
47
  });
48
48
  describe('checkApiCode', () => {
49
49
  it('should detect missing api practices', async () => {
50
- vi.mocked(fs.readFile).mockResolvedValue(`
51
- function handler() {
52
- // no try, no status, no security check
53
- return "hello";
54
- }
50
+ vi.mocked(fs.readFile).mockResolvedValue(`
51
+ function handler() {
52
+ // no try, no status, no security check
53
+ return "hello";
54
+ }
55
55
  `);
56
56
  const res = await checkApiCode('route.ts');
57
57
  expect(res.issues.some(i => i.includes('No error handling'))).toBe(true);
@@ -59,14 +59,14 @@ describe('apiValidator', () => {
59
59
  expect(res.passed.length).toBe(0);
60
60
  });
61
61
  it('should pass good practices', async () => {
62
- vi.mocked(fs.readFile).mockResolvedValue(`
63
- import { z } from 'zod';
64
- function handler(req, res) {
65
- try {
66
- const jwtToken = "123";
67
- return res.status(200).send("hello");
68
- } catch(e) {}
69
- }
62
+ vi.mocked(fs.readFile).mockResolvedValue(`
63
+ import { z } from 'zod';
64
+ function handler(req, res) {
65
+ try {
66
+ const jwtToken = "123";
67
+ return res.status(200).send("hello");
68
+ } catch(e) {}
69
+ }
70
70
  `);
71
71
  const res = await checkApiCode('route.ts');
72
72
  expect(res.passed.some(i => i.includes('Error handling'))).toBe(true);
@@ -15,11 +15,11 @@ describe('convertRules', () => {
15
15
  it('should correctly parse frontmatter and generate rules', async () => {
16
16
  vi.mocked(fs.stat).mockResolvedValue({ isDirectory: () => true });
17
17
  vi.mocked(fs.readdir).mockResolvedValue(['async-waterfall.md']);
18
- vi.mocked(fs.readFile).mockResolvedValue(`---
19
- title: Waterfall check
20
- impact: HIGH
21
- tags: perf
22
- ---
18
+ vi.mocked(fs.readFile).mockResolvedValue(`---
19
+ title: Waterfall check
20
+ impact: HIGH
21
+ tags: perf
22
+ ---
23
23
  Content body of the rule here.`);
24
24
  vi.mocked(fs.mkdir).mockResolvedValue(undefined);
25
25
  vi.mocked(fs.writeFile).mockResolvedValue(undefined);
@@ -9,20 +9,20 @@ describe('accessibilityChecker', () => {
9
9
  });
10
10
  describe('checkAccessibility', () => {
11
11
  it('should detect input without label and img without alt', async () => {
12
- vi.mocked(fs.readFile).mockResolvedValue(`
13
- <input type="text" name="bad" />
14
- <button>Click me</button>
12
+ vi.mocked(fs.readFile).mockResolvedValue(`
13
+ <input type="text" name="bad" />
14
+ <button>Click me</button>
15
15
  `);
16
16
  const issues = await checkAccessibility('test.html');
17
17
  expect(issues.some(i => i.includes('Input without label'))).toBe(true);
18
18
  expect(issues.some(i => i.includes('Missing lang'))).toBe(false); // only checks if <html> exists
19
19
  });
20
20
  it('should pass good inputs', async () => {
21
- vi.mocked(fs.readFile).mockResolvedValue(`
22
- <html lang="en">
23
- <input type="text" aria-label="Good" />
24
- <button aria-label="Close">X</button>
25
- </html>
21
+ vi.mocked(fs.readFile).mockResolvedValue(`
22
+ <html lang="en">
23
+ <input type="text" aria-label="Good" />
24
+ <button aria-label="Close">X</button>
25
+ </html>
26
26
  `);
27
27
  const issues = await checkAccessibility('test.html');
28
28
  expect(issues).toEqual([]); // Skip link is only requested if <main> or <body> is present
@@ -39,10 +39,10 @@ describe('uxAudit', () => {
39
39
  name: 'test.tsx',
40
40
  isDirectory: () => false
41
41
  }]);
42
- vi.mocked(fs.readFile).mockResolvedValue(`
43
- <button onClick={() => {}}>Submit</button>
44
- <img src="foo.jpg">
45
- <p style="color: #000000; font-family: purple;">Hello</p>
42
+ vi.mocked(fs.readFile).mockResolvedValue(`
43
+ <button onClick={() => {}}>Submit</button>
44
+ <img src="foo.jpg">
45
+ <p style="color: #000000; font-family: purple;">Hello</p>
46
46
  `);
47
47
  const res = await runUxAudit('.');
48
48
  expect(res.passed).toBe(false);
@@ -8,21 +8,21 @@ describe('geoChecker', () => {
8
8
  });
9
9
  describe('checkGeoPage', () => {
10
10
  it('should detect structured schema and H1s', async () => {
11
- vi.mocked(fs.readFile).mockResolvedValue(`
12
- <html lang="en">
13
- <head>
14
- <script type="application/ld+json">
15
- {
16
- "@type": "Article",
17
- "author": "Test Author"
18
- }
19
- </script>
20
- </head>
21
- <body>
22
- <h1>Main Title</h1>
23
- <p>Some content with numbers like 50% and $100.</p>
24
- </body>
25
- </html>
11
+ vi.mocked(fs.readFile).mockResolvedValue(`
12
+ <html lang="en">
13
+ <head>
14
+ <script type="application/ld+json">
15
+ {
16
+ "@type": "Article",
17
+ "author": "Test Author"
18
+ }
19
+ </script>
20
+ </head>
21
+ <body>
22
+ <h1>Main Title</h1>
23
+ <p>Some content with numbers like 50% and $100.</p>
24
+ </body>
25
+ </html>
26
26
  `);
27
27
  const result = await checkGeoPage('/mock/page.html');
28
28
  expect(result.passed.some(m => m.includes('JSON-LD structured data'))).toBe(true);
@@ -31,10 +31,10 @@ describe('geoChecker', () => {
31
31
  expect(result.score).toBeGreaterThan(0);
32
32
  });
33
33
  it('should flag missing structural tags', async () => {
34
- vi.mocked(fs.readFile).mockResolvedValue(`
35
- <body>
36
- <p>No headings, no structure, no stats.</p>
37
- </body>
34
+ vi.mocked(fs.readFile).mockResolvedValue(`
35
+ <body>
36
+ <p>No headings, no structure, no stats.</p>
37
+ </body>
38
38
  `);
39
39
  const result = await checkGeoPage('/mock/bad.html');
40
40
  expect(result.issues.some(m => m.includes('No JSON-LD'))).toBe(true);
@@ -11,16 +11,16 @@ describe('mobileAudit', () => {
11
11
  name: 'Screen.tsx',
12
12
  isDirectory: () => false
13
13
  }]);
14
- vi.mocked(fs.readFile).mockResolvedValue(`
15
- import React from 'react';
16
- import { View, ScrollView } from 'react-native';
17
- export const Screen = () => {
18
- return (
19
- <ScrollView>
20
- {data.map(d => <View key={index} />)}
21
- </ScrollView>
22
- )
23
- }
14
+ vi.mocked(fs.readFile).mockResolvedValue(`
15
+ import React from 'react';
16
+ import { View, ScrollView } from 'react-native';
17
+ export const Screen = () => {
18
+ return (
19
+ <ScrollView>
20
+ {data.map(d => <View key={index} />)}
21
+ </ScrollView>
22
+ )
23
+ }
24
24
  `);
25
25
  const res = await runMobileAudit('.');
26
26
  expect(res.passed).toBe(false);
@@ -31,8 +31,8 @@ describe('mobileAudit', () => {
31
31
  name: 'regular.tsx',
32
32
  isDirectory: () => false
33
33
  }]);
34
- vi.mocked(fs.readFile).mockResolvedValue(`
35
- export const App = () => <div>Hello Web</div>
34
+ vi.mocked(fs.readFile).mockResolvedValue(`
35
+ export const App = () => <div>Hello Web</div>
36
36
  `);
37
37
  const res = await runMobileAudit('.');
38
38
  expect(res.passed).toBe(true);