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.
- 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/__tests__/test_apply_prompt_args.js +104 -0
- package/build/index.js +106 -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",
|
|
@@ -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.
|
|
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 {
|
|
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: [
|
|
580
|
+
content: [
|
|
581
|
+
{ type: "text", text: `Error executing tool: ${error.message}` },
|
|
582
|
+
],
|
|
522
583
|
isError: true,
|
|
523
584
|
};
|
|
524
585
|
}
|
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);
|