superkit-mcp-server 1.2.4 → 1.2.5

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 (161) 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/index.js +88 -45
  20. package/build/tools/todoTools.js +39 -39
  21. package/build/tools/validators/__tests__/apiSchema.test.js +23 -23
  22. package/build/tools/validators/__tests__/convertRules.test.js +5 -5
  23. package/build/tools/validators/__tests__/frontendDesign.test.js +12 -12
  24. package/build/tools/validators/__tests__/geoChecker.test.js +19 -19
  25. package/build/tools/validators/__tests__/mobileAudit.test.js +12 -12
  26. package/build/tools/validators/__tests__/reactPerformanceChecker.test.js +17 -17
  27. package/build/tools/validators/__tests__/securityScan.test.js +6 -6
  28. package/build/tools/validators/__tests__/seoChecker.test.js +16 -16
  29. package/build/tools/validators/__tests__/typeCoverage.test.js +14 -14
  30. package/commands/README.md +122 -122
  31. package/commands/ask.toml +72 -72
  32. package/commands/brainstorm.toml +119 -119
  33. package/commands/chat.toml +77 -77
  34. package/commands/code-preview.toml +37 -37
  35. package/commands/code.toml +28 -28
  36. package/commands/content.toml +200 -200
  37. package/commands/cook.toml +77 -77
  38. package/commands/copywrite.toml +131 -131
  39. package/commands/db.toml +192 -192
  40. package/commands/debug.toml +166 -166
  41. package/commands/design.toml +158 -158
  42. package/commands/dev-rules.toml +14 -14
  43. package/commands/do.toml +117 -117
  44. package/commands/doc-rules.toml +14 -14
  45. package/commands/docs.toml +148 -148
  46. package/commands/fix.toml +440 -440
  47. package/commands/fullstack.toml +175 -175
  48. package/commands/git.toml +235 -235
  49. package/commands/help.toml +84 -84
  50. package/commands/integrate.toml +127 -127
  51. package/commands/journal.toml +136 -136
  52. package/commands/kit-setup.toml +40 -40
  53. package/commands/mcp.toml +183 -183
  54. package/commands/orchestration.toml +15 -15
  55. package/commands/plan.toml +206 -172
  56. package/commands/pm.toml +148 -148
  57. package/commands/pr.toml +50 -50
  58. package/commands/project.toml +32 -32
  59. package/commands/research.toml +117 -117
  60. package/commands/review-pr.toml +63 -63
  61. package/commands/review.toml +190 -190
  62. package/commands/scout-ext.toml +97 -97
  63. package/commands/scout.toml +79 -79
  64. package/commands/screenshot.toml +65 -65
  65. package/commands/session.toml +102 -102
  66. package/commands/skill.toml +384 -384
  67. package/commands/status.toml +22 -22
  68. package/commands/team.toml +56 -56
  69. package/commands/test.toml +164 -164
  70. package/commands/ticket.toml +70 -70
  71. package/commands/use.toml +106 -106
  72. package/commands/video.toml +83 -83
  73. package/commands/watzup.toml +71 -71
  74. package/commands/workflow.toml +14 -14
  75. package/package.json +35 -35
  76. package/skills/meta/README.md +30 -30
  77. package/skills/meta/api-design/SKILL.md +134 -134
  78. package/skills/meta/code-review/SKILL.md +44 -44
  79. package/skills/meta/code-review/checklists/pre-merge.md +25 -25
  80. package/skills/meta/code-review/workflows/architecture-pass.md +26 -26
  81. package/skills/meta/code-review/workflows/performance-pass.md +27 -27
  82. package/skills/meta/code-review/workflows/security-pass.md +29 -29
  83. package/skills/meta/compound-docs/SKILL.md +133 -133
  84. package/skills/meta/debug/SKILL.md +40 -40
  85. package/skills/meta/debug/templates/bug-report.template.md +31 -31
  86. package/skills/meta/debug/workflows/reproduce-issue.md +20 -20
  87. package/skills/meta/docker/SKILL.md +126 -126
  88. package/skills/meta/examples/supabase/SKILL.md +46 -46
  89. package/skills/meta/examples/supabase/references/best-practices.md +319 -319
  90. package/skills/meta/examples/supabase/references/common-patterns.md +373 -373
  91. package/skills/meta/examples/supabase/templates/migration-template.sql +49 -49
  92. package/skills/meta/examples/supabase/templates/rls-policy-template.sql +77 -77
  93. package/skills/meta/examples/supabase/workflows/debugging.md +260 -260
  94. package/skills/meta/examples/supabase/workflows/migration-workflow.md +211 -211
  95. package/skills/meta/examples/supabase/workflows/rls-policies.md +244 -244
  96. package/skills/meta/examples/supabase/workflows/schema-design.md +321 -321
  97. package/skills/meta/file-todos/SKILL.md +88 -88
  98. package/skills/meta/mobile/SKILL.md +140 -140
  99. package/skills/meta/nextjs/SKILL.md +101 -101
  100. package/skills/meta/performance/SKILL.md +130 -130
  101. package/skills/meta/react-patterns/SKILL.md +83 -83
  102. package/skills/meta/security/SKILL.md +114 -114
  103. package/skills/meta/session-resume/SKILL.md +96 -96
  104. package/skills/meta/tailwind/SKILL.md +139 -139
  105. package/skills/meta/testing/SKILL.md +43 -43
  106. package/skills/meta/testing/references/vitest-patterns.md +45 -45
  107. package/skills/meta/testing/templates/component-test.template.tsx +37 -37
  108. package/skills/tech/alpha-vantage/SKILL.md +142 -142
  109. package/skills/tech/alpha-vantage/references/commodities.md +153 -153
  110. package/skills/tech/alpha-vantage/references/economic-indicators.md +158 -158
  111. package/skills/tech/alpha-vantage/references/forex-crypto.md +154 -154
  112. package/skills/tech/alpha-vantage/references/fundamentals.md +223 -223
  113. package/skills/tech/alpha-vantage/references/intelligence.md +138 -138
  114. package/skills/tech/alpha-vantage/references/options.md +93 -93
  115. package/skills/tech/alpha-vantage/references/technical-indicators.md +374 -374
  116. package/skills/tech/alpha-vantage/references/time-series.md +157 -157
  117. package/skills/tech/financial-modeling/SKILL.md +18 -18
  118. package/skills/tech/financial-modeling/skills/3-statements/SKILL.md +368 -368
  119. package/skills/tech/financial-modeling/skills/3-statements/references/formatting.md +118 -118
  120. package/skills/tech/financial-modeling/skills/3-statements/references/formulas.md +292 -292
  121. package/skills/tech/financial-modeling/skills/3-statements/references/sec-filings.md +125 -125
  122. package/skills/tech/financial-modeling/skills/dcf-model/SKILL.md +1210 -1210
  123. package/skills/tech/financial-modeling/skills/dcf-model/TROUBLESHOOTING.md +40 -40
  124. package/skills/tech/financial-modeling/skills/dcf-model/requirements.txt +8 -8
  125. package/skills/tech/financial-modeling/skills/dcf-model/scripts/validate_dcf.py +292 -292
  126. package/skills/tech/financial-modeling/skills/lbo-model/SKILL.md +236 -236
  127. package/skills/tech/financial-modeling/skills/merger-model/SKILL.md +108 -108
  128. package/skills/workflows/README.md +203 -203
  129. package/skills/workflows/adr.md +174 -174
  130. package/skills/workflows/changelog.md +74 -74
  131. package/skills/workflows/compound.md +323 -323
  132. package/skills/workflows/compound_health.md +74 -74
  133. package/skills/workflows/create-agent-skill.md +138 -138
  134. package/skills/workflows/cycle.md +144 -144
  135. package/skills/workflows/deploy-docs.md +84 -84
  136. package/skills/workflows/development-rules.md +42 -42
  137. package/skills/workflows/doc.md +95 -95
  138. package/skills/workflows/documentation-management.md +34 -34
  139. package/skills/workflows/explore.md +146 -146
  140. package/skills/workflows/generate_command.md +106 -106
  141. package/skills/workflows/heal-skill.md +97 -97
  142. package/skills/workflows/housekeeping.md +229 -229
  143. package/skills/workflows/kit-setup.md +102 -102
  144. package/skills/workflows/map-codebase.md +78 -78
  145. package/skills/workflows/orchestration-protocol.md +43 -43
  146. package/skills/workflows/plan-compound.md +439 -439
  147. package/skills/workflows/plan_review.md +269 -269
  148. package/skills/workflows/primary-workflow.md +37 -37
  149. package/skills/workflows/promote_pattern.md +86 -86
  150. package/skills/workflows/release-docs.md +82 -82
  151. package/skills/workflows/report-bug.md +135 -135
  152. package/skills/workflows/reproduce-bug.md +118 -118
  153. package/skills/workflows/resolve_pr.md +133 -133
  154. package/skills/workflows/resolve_todo.md +128 -128
  155. package/skills/workflows/review-compound.md +376 -376
  156. package/skills/workflows/skill-review.md +127 -127
  157. package/skills/workflows/specs.md +257 -257
  158. package/skills/workflows/triage-sprint.md +102 -102
  159. package/skills/workflows/triage.md +152 -152
  160. package/skills/workflows/work.md +399 -399
  161. 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",
@@ -369,7 +403,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
369
403
  if (args.action === "nextId")
370
404
  res = String(await getNextTodoId(args.projectPath));
371
405
  else if (args.action === "create")
372
- res = await createTodo(args.title, args.description, args.priority, args.projectPath);
406
+ res = await createTodo(String(args.priority ?? "p3"), args.title, args.description, args.criteria || [], args.projectPath);
373
407
  else if (args.action === "start")
374
408
  res = await startTodo(args.todoId, args.force, args.projectPath);
375
409
  else if (args.action === "done")
@@ -497,7 +531,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
497
531
  const fallbackSafePath = getSafePath(path.join(superKitRoot, "skills"), path.join(args.category, args.skillName));
498
532
  if (fallbackSafePath) {
499
533
  const items = await listDirectorySafe(fallbackSafePath);
500
- return { content: [{ type: "text", text: `SKILL.md not found. Directory contains: ${items.join(', ')}` }] };
534
+ return {
535
+ content: [
536
+ {
537
+ type: "text",
538
+ text: `SKILL.md not found. Directory contains: ${items.join(", ")}`,
539
+ },
540
+ ],
541
+ };
501
542
  }
502
543
  throw e;
503
544
  }
@@ -518,7 +559,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
518
559
  }
519
560
  catch (error) {
520
561
  return {
521
- content: [{ type: "text", text: `Error executing tool: ${error.message}` }],
562
+ content: [
563
+ { type: "text", text: `Error executing tool: ${error.message}` },
564
+ ],
522
565
  isError: true,
523
566
  };
524
567
  }
@@ -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);
@@ -11,14 +11,14 @@ describe('reactPerformanceChecker', () => {
11
11
  name: 'Home.tsx',
12
12
  isDirectory: () => false
13
13
  }]);
14
- vi.mocked(fs.readFile).mockResolvedValue(`
15
- import { something } from '@/components/index';
16
-
17
- async function loadData() {
18
- const a = await fetchA();
19
- const b = await fetchB();
20
- return { a, b };
21
- }
14
+ vi.mocked(fs.readFile).mockResolvedValue(`
15
+ import { something } from '@/components/index';
16
+
17
+ async function loadData() {
18
+ const a = await fetchA();
19
+ const b = await fetchB();
20
+ return { a, b };
21
+ }
22
22
  `);
23
23
  const res = await runReactPerformanceChecker('.');
24
24
  console.log("RPC BAD REPORT:", res.report);
@@ -31,15 +31,15 @@ describe('reactPerformanceChecker', () => {
31
31
  name: 'App.tsx',
32
32
  isDirectory: () => false
33
33
  }]);
34
- vi.mocked(fs.readFile).mockResolvedValue(`
35
- import { useQuery } from '@tanstack/react-query';
36
- import Image from 'next/image';
37
-
38
- const App = React.memo((props: Props) => {
39
- const q = useQuery('data', fetchParallel);
40
- return <Image src="foo" alt="bar" />
41
- });
42
- export default App;
34
+ vi.mocked(fs.readFile).mockResolvedValue(`
35
+ import { useQuery } from '@tanstack/react-query';
36
+ import Image from 'next/image';
37
+
38
+ const App = React.memo((props: Props) => {
39
+ const q = useQuery('data', fetchParallel);
40
+ return <Image src="foo" alt="bar" />
41
+ });
42
+ export default App;
43
43
  `);
44
44
  const res = await runReactPerformanceChecker('.');
45
45
  console.log("RPC GOOD REPORT:", res.report);
@@ -13,8 +13,8 @@ describe('securityScan', () => {
13
13
  name: 'config.json',
14
14
  isDirectory: () => false
15
15
  }]);
16
- vi.mocked(fs.readFile).mockResolvedValue(`
17
- { "aws_key": "AKIA1234567890123456" }
16
+ vi.mocked(fs.readFile).mockResolvedValue(`
17
+ { "aws_key": "AKIA1234567890123456" }
18
18
  `);
19
19
  const result = await scanSecrets('/mock');
20
20
  expect(result.findings).toBeDefined();
@@ -28,10 +28,10 @@ describe('securityScan', () => {
28
28
  name: 'bad_code.js',
29
29
  isDirectory: () => false
30
30
  }]);
31
- vi.mocked(fs.readFile).mockResolvedValue(`
32
- eval('2 + 2');
33
- import { exec } from 'child_process';
34
- child_process.exec('rm -rf /');
31
+ vi.mocked(fs.readFile).mockResolvedValue(`
32
+ eval('2 + 2');
33
+ import { exec } from 'child_process';
34
+ child_process.exec('rm -rf /');
35
35
  `);
36
36
  const result = await scanCodePatterns('/mock');
37
37
  expect(result.findings.length).toBeGreaterThan(1);