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.
- package/ARCHITECTURE.md +102 -102
- package/README.md +71 -71
- package/SUPERKIT.md +168 -168
- package/agents/code-archaeologist.md +106 -106
- package/agents/coder.md +90 -90
- package/agents/data-engineer.md +28 -28
- package/agents/devops-engineer.md +242 -242
- package/agents/git-manager.md +203 -203
- package/agents/orchestrator.md +420 -420
- package/agents/penetration-tester.md +188 -188
- package/agents/performance-optimizer.md +187 -187
- package/agents/planner.md +270 -270
- package/agents/qa-automation-engineer.md +103 -103
- package/agents/quant-developer.md +32 -32
- package/agents/reviewer.md +100 -100
- package/agents/scout.md +222 -222
- package/agents/tester.md +274 -274
- package/agents/ui-designer.md +208 -208
- package/build/index.js +88 -45
- package/build/tools/todoTools.js +39 -39
- package/build/tools/validators/__tests__/apiSchema.test.js +23 -23
- package/build/tools/validators/__tests__/convertRules.test.js +5 -5
- package/build/tools/validators/__tests__/frontendDesign.test.js +12 -12
- package/build/tools/validators/__tests__/geoChecker.test.js +19 -19
- package/build/tools/validators/__tests__/mobileAudit.test.js +12 -12
- package/build/tools/validators/__tests__/reactPerformanceChecker.test.js +17 -17
- package/build/tools/validators/__tests__/securityScan.test.js +6 -6
- package/build/tools/validators/__tests__/seoChecker.test.js +16 -16
- package/build/tools/validators/__tests__/typeCoverage.test.js +14 -14
- package/commands/README.md +122 -122
- package/commands/ask.toml +72 -72
- package/commands/brainstorm.toml +119 -119
- package/commands/chat.toml +77 -77
- package/commands/code-preview.toml +37 -37
- package/commands/code.toml +28 -28
- package/commands/content.toml +200 -200
- package/commands/cook.toml +77 -77
- package/commands/copywrite.toml +131 -131
- package/commands/db.toml +192 -192
- package/commands/debug.toml +166 -166
- package/commands/design.toml +158 -158
- package/commands/dev-rules.toml +14 -14
- package/commands/do.toml +117 -117
- package/commands/doc-rules.toml +14 -14
- package/commands/docs.toml +148 -148
- package/commands/fix.toml +440 -440
- package/commands/fullstack.toml +175 -175
- package/commands/git.toml +235 -235
- package/commands/help.toml +84 -84
- package/commands/integrate.toml +127 -127
- package/commands/journal.toml +136 -136
- package/commands/kit-setup.toml +40 -40
- package/commands/mcp.toml +183 -183
- package/commands/orchestration.toml +15 -15
- package/commands/plan.toml +206 -172
- package/commands/pm.toml +148 -148
- package/commands/pr.toml +50 -50
- package/commands/project.toml +32 -32
- package/commands/research.toml +117 -117
- package/commands/review-pr.toml +63 -63
- package/commands/review.toml +190 -190
- package/commands/scout-ext.toml +97 -97
- package/commands/scout.toml +79 -79
- package/commands/screenshot.toml +65 -65
- package/commands/session.toml +102 -102
- package/commands/skill.toml +384 -384
- package/commands/status.toml +22 -22
- package/commands/team.toml +56 -56
- package/commands/test.toml +164 -164
- package/commands/ticket.toml +70 -70
- package/commands/use.toml +106 -106
- package/commands/video.toml +83 -83
- package/commands/watzup.toml +71 -71
- package/commands/workflow.toml +14 -14
- package/package.json +35 -35
- package/skills/meta/README.md +30 -30
- package/skills/meta/api-design/SKILL.md +134 -134
- package/skills/meta/code-review/SKILL.md +44 -44
- package/skills/meta/code-review/checklists/pre-merge.md +25 -25
- package/skills/meta/code-review/workflows/architecture-pass.md +26 -26
- package/skills/meta/code-review/workflows/performance-pass.md +27 -27
- package/skills/meta/code-review/workflows/security-pass.md +29 -29
- package/skills/meta/compound-docs/SKILL.md +133 -133
- package/skills/meta/debug/SKILL.md +40 -40
- package/skills/meta/debug/templates/bug-report.template.md +31 -31
- package/skills/meta/debug/workflows/reproduce-issue.md +20 -20
- package/skills/meta/docker/SKILL.md +126 -126
- package/skills/meta/examples/supabase/SKILL.md +46 -46
- package/skills/meta/examples/supabase/references/best-practices.md +319 -319
- package/skills/meta/examples/supabase/references/common-patterns.md +373 -373
- package/skills/meta/examples/supabase/templates/migration-template.sql +49 -49
- package/skills/meta/examples/supabase/templates/rls-policy-template.sql +77 -77
- package/skills/meta/examples/supabase/workflows/debugging.md +260 -260
- package/skills/meta/examples/supabase/workflows/migration-workflow.md +211 -211
- package/skills/meta/examples/supabase/workflows/rls-policies.md +244 -244
- package/skills/meta/examples/supabase/workflows/schema-design.md +321 -321
- package/skills/meta/file-todos/SKILL.md +88 -88
- package/skills/meta/mobile/SKILL.md +140 -140
- package/skills/meta/nextjs/SKILL.md +101 -101
- package/skills/meta/performance/SKILL.md +130 -130
- package/skills/meta/react-patterns/SKILL.md +83 -83
- package/skills/meta/security/SKILL.md +114 -114
- package/skills/meta/session-resume/SKILL.md +96 -96
- package/skills/meta/tailwind/SKILL.md +139 -139
- package/skills/meta/testing/SKILL.md +43 -43
- package/skills/meta/testing/references/vitest-patterns.md +45 -45
- package/skills/meta/testing/templates/component-test.template.tsx +37 -37
- package/skills/tech/alpha-vantage/SKILL.md +142 -142
- package/skills/tech/alpha-vantage/references/commodities.md +153 -153
- package/skills/tech/alpha-vantage/references/economic-indicators.md +158 -158
- package/skills/tech/alpha-vantage/references/forex-crypto.md +154 -154
- package/skills/tech/alpha-vantage/references/fundamentals.md +223 -223
- package/skills/tech/alpha-vantage/references/intelligence.md +138 -138
- package/skills/tech/alpha-vantage/references/options.md +93 -93
- package/skills/tech/alpha-vantage/references/technical-indicators.md +374 -374
- package/skills/tech/alpha-vantage/references/time-series.md +157 -157
- package/skills/tech/financial-modeling/SKILL.md +18 -18
- package/skills/tech/financial-modeling/skills/3-statements/SKILL.md +368 -368
- package/skills/tech/financial-modeling/skills/3-statements/references/formatting.md +118 -118
- package/skills/tech/financial-modeling/skills/3-statements/references/formulas.md +292 -292
- package/skills/tech/financial-modeling/skills/3-statements/references/sec-filings.md +125 -125
- package/skills/tech/financial-modeling/skills/dcf-model/SKILL.md +1210 -1210
- package/skills/tech/financial-modeling/skills/dcf-model/TROUBLESHOOTING.md +40 -40
- package/skills/tech/financial-modeling/skills/dcf-model/requirements.txt +8 -8
- package/skills/tech/financial-modeling/skills/dcf-model/scripts/validate_dcf.py +292 -292
- package/skills/tech/financial-modeling/skills/lbo-model/SKILL.md +236 -236
- package/skills/tech/financial-modeling/skills/merger-model/SKILL.md +108 -108
- package/skills/workflows/README.md +203 -203
- package/skills/workflows/adr.md +174 -174
- package/skills/workflows/changelog.md +74 -74
- package/skills/workflows/compound.md +323 -323
- package/skills/workflows/compound_health.md +74 -74
- package/skills/workflows/create-agent-skill.md +138 -138
- package/skills/workflows/cycle.md +144 -144
- package/skills/workflows/deploy-docs.md +84 -84
- package/skills/workflows/development-rules.md +42 -42
- package/skills/workflows/doc.md +95 -95
- package/skills/workflows/documentation-management.md +34 -34
- package/skills/workflows/explore.md +146 -146
- package/skills/workflows/generate_command.md +106 -106
- package/skills/workflows/heal-skill.md +97 -97
- package/skills/workflows/housekeeping.md +229 -229
- package/skills/workflows/kit-setup.md +102 -102
- package/skills/workflows/map-codebase.md +78 -78
- package/skills/workflows/orchestration-protocol.md +43 -43
- package/skills/workflows/plan-compound.md +439 -439
- package/skills/workflows/plan_review.md +269 -269
- package/skills/workflows/primary-workflow.md +37 -37
- package/skills/workflows/promote_pattern.md +86 -86
- package/skills/workflows/release-docs.md +82 -82
- package/skills/workflows/report-bug.md +135 -135
- package/skills/workflows/reproduce-bug.md +118 -118
- package/skills/workflows/resolve_pr.md +133 -133
- package/skills/workflows/resolve_todo.md +128 -128
- package/skills/workflows/review-compound.md +376 -376
- package/skills/workflows/skill-review.md +127 -127
- package/skills/workflows/specs.md +257 -257
- package/skills/workflows/triage-sprint.md +102 -102
- package/skills/workflows/triage.md +152 -152
- package/skills/workflows/work.md +399 -399
- 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) =>
|
|
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: {
|
|
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: {
|
|
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: "
|
|
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: {
|
|
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: {
|
|
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: {
|
|
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: {
|
|
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.
|
|
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 {
|
|
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: [
|
|
562
|
+
content: [
|
|
563
|
+
{ type: "text", text: `Error executing tool: ${error.message}` },
|
|
564
|
+
],
|
|
522
565
|
isError: true,
|
|
523
566
|
};
|
|
524
567
|
}
|
package/build/tools/todoTools.js
CHANGED
|
@@ -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);
|