@launchsecure/launch-kit 0.0.30 → 0.0.31
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/dist/beacon/beacon.mjs +934 -865
- package/dist/beacon/beacon.mjs.map +1 -1
- package/dist/beacon/beacon.umd.js +9 -9
- package/dist/beacon/beacon.umd.js.map +1 -1
- package/dist/beacon/types/internal/screenshot.d.ts +19 -1
- package/dist/beacon/types/internal/screenshot.d.ts.map +1 -1
- package/dist/beacon/types/plugins/domEle.d.ts.map +1 -1
- package/dist/chart-client/assets/{index-CJ4mgRRF.css → index-CDIhdgWg.css} +1 -1
- package/dist/chart-client/index.html +2 -2
- package/dist/client/assets/{index-DI5qSR_w.css → index-CfW4n40I.css} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/council-client/assets/{index-C_-vAM9L.css → index-CZim6x1u.css} +1 -1
- package/dist/council-client/index.html +2 -2
- package/dist/deck-client/assets/{_baseUniq-DCt2IMRR.js → _baseUniq-DdHaBFYO.js} +1 -1
- package/dist/deck-client/assets/{arc-h-ifqmNR.js → arc-D98e_18X.js} +1 -1
- package/dist/deck-client/assets/{architectureDiagram-Q4EWVU46-C9dITSPv.js → architectureDiagram-Q4EWVU46-DNFZzh-4.js} +1 -1
- package/dist/deck-client/assets/{blockDiagram-DXYQGD6D-BHuJT34t.js → blockDiagram-DXYQGD6D-DeQvGUdX.js} +1 -1
- package/dist/deck-client/assets/{c4Diagram-AHTNJAMY-CpvMGtDG.js → c4Diagram-AHTNJAMY-B6ekZf1n.js} +1 -1
- package/dist/deck-client/assets/channel-DmR7Tyyt.js +1 -0
- package/dist/deck-client/assets/{chunk-4BX2VUAB-B6md1VIm.js → chunk-4BX2VUAB-9aDWymq2.js} +1 -1
- package/dist/deck-client/assets/{chunk-4TB4RGXK-BmEnX8ik.js → chunk-4TB4RGXK-DtKQqaI7.js} +1 -1
- package/dist/deck-client/assets/{chunk-55IACEB6-BZPUyZAZ.js → chunk-55IACEB6-COy9hEae.js} +1 -1
- package/dist/deck-client/assets/{chunk-EDXVE4YY-BWwNUK-l.js → chunk-EDXVE4YY-D_f861An.js} +1 -1
- package/dist/deck-client/assets/{chunk-FMBD7UC4-o7gSppGI.js → chunk-FMBD7UC4-CmuA5UKn.js} +1 -1
- package/dist/deck-client/assets/{chunk-OYMX7WX6-C4KoTL5p.js → chunk-OYMX7WX6-vT8z8D-0.js} +1 -1
- package/dist/deck-client/assets/{chunk-QZHKN3VN-jkf68sDs.js → chunk-QZHKN3VN-CTlwwg-R.js} +1 -1
- package/dist/deck-client/assets/{chunk-YZCP3GAM-Cd4yBE7o.js → chunk-YZCP3GAM-C44yr620.js} +1 -1
- package/dist/deck-client/assets/classDiagram-6PBFFD2Q-Bl4ozQWs.js +1 -0
- package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-Bl4ozQWs.js +1 -0
- package/dist/deck-client/assets/clone-BAy58j24.js +1 -0
- package/dist/deck-client/assets/{cose-bilkent-S5V4N54A-DeGFUgAV.js → cose-bilkent-S5V4N54A-DBB2J2nL.js} +1 -1
- package/dist/deck-client/assets/{dagre-KV5264BT-ekcYJuUV.js → dagre-KV5264BT-DxDTYbKl.js} +1 -1
- package/dist/deck-client/assets/{diagram-5BDNPKRD-YHPk4rV2.js → diagram-5BDNPKRD-DByWrWd1.js} +1 -1
- package/dist/deck-client/assets/{diagram-G4DWMVQ6-DM-JCd_B.js → diagram-G4DWMVQ6-B8B6ddMq.js} +1 -1
- package/dist/deck-client/assets/{diagram-MMDJMWI5-l5FK1ybk.js → diagram-MMDJMWI5-BMUZ2PWK.js} +1 -1
- package/dist/deck-client/assets/{diagram-TYMM5635-CIN4_1-j.js → diagram-TYMM5635-Bk9e8BB-.js} +1 -1
- package/dist/deck-client/assets/{erDiagram-SMLLAGMA-MyinSkEl.js → erDiagram-SMLLAGMA-DcOSwSol.js} +1 -1
- package/dist/deck-client/assets/{flowDiagram-DWJPFMVM-Dk8nn42x.js → flowDiagram-DWJPFMVM-DI-4BR0F.js} +1 -1
- package/dist/deck-client/assets/{ganttDiagram-T4ZO3ILL-BU1ihicu.js → ganttDiagram-T4ZO3ILL-BeZuXBoU.js} +1 -1
- package/dist/deck-client/assets/{gitGraphDiagram-UUTBAWPF-BjsTL13C.js → gitGraphDiagram-UUTBAWPF-Bcki__f-.js} +1 -1
- package/dist/deck-client/assets/{graph-DJmh-xi7.js → graph-CifKx6G1.js} +1 -1
- package/dist/deck-client/assets/index-6sdqbm2o.js +2 -0
- package/dist/deck-client/assets/{index-DsIZ3LqL.css → index-BlTlhxFW.css} +1 -1
- package/dist/deck-client/assets/index-CB-qlwRT.js +1195 -0
- package/dist/deck-client/assets/{infoDiagram-42DDH7IO-Dxvy_RB4.js → infoDiagram-42DDH7IO-CReN1nFN.js} +1 -1
- package/dist/deck-client/assets/{ishikawaDiagram-UXIWVN3A-DPOaNF1l.js → ishikawaDiagram-UXIWVN3A-CDF_VLN_.js} +1 -1
- package/dist/deck-client/assets/{journeyDiagram-VCZTEJTY-DMew3K5c.js → journeyDiagram-VCZTEJTY-DwgGrNVB.js} +1 -1
- package/dist/deck-client/assets/{kanban-definition-6JOO6SKY-csciJFuk.js → kanban-definition-6JOO6SKY-DB_zohh5.js} +1 -1
- package/dist/deck-client/assets/{layout-Dg4yyms2.js → layout-DFfX1O3z.js} +1 -1
- package/dist/deck-client/assets/{linear-BA3zU6gq.js → linear-CtKb4EXj.js} +1 -1
- package/dist/deck-client/assets/{min-lz-Ird-p.js → min-DCRRwUZv.js} +1 -1
- package/dist/deck-client/assets/{mindmap-definition-QFDTVHPH-CCEN8OQV.js → mindmap-definition-QFDTVHPH-D0QBOiFe.js} +1 -1
- package/dist/deck-client/assets/{pieDiagram-DEJITSTG-DM6n1HY7.js → pieDiagram-DEJITSTG-CD-EV5WB.js} +1 -1
- package/dist/deck-client/assets/{quadrantDiagram-34T5L4WZ-_ULoR66n.js → quadrantDiagram-34T5L4WZ-B-JXZ8xI.js} +1 -1
- package/dist/deck-client/assets/{requirementDiagram-MS252O5E-BuwJs7Tn.js → requirementDiagram-MS252O5E-D2_OK5Dp.js} +1 -1
- package/dist/deck-client/assets/{sankeyDiagram-XADWPNL6-BEsuzkW4.js → sankeyDiagram-XADWPNL6-BbBJqVSC.js} +1 -1
- package/dist/deck-client/assets/{sequenceDiagram-FGHM5R23-CP2H0YWf.js → sequenceDiagram-FGHM5R23-Db8A-Rkk.js} +1 -1
- package/dist/deck-client/assets/{stateDiagram-FHFEXIEX-B5Gw_NNL.js → stateDiagram-FHFEXIEX-DGJnanjS.js} +1 -1
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-CR7riiab.js +1 -0
- package/dist/deck-client/assets/{timeline-definition-GMOUNBTQ-DsoYydQa.js → timeline-definition-GMOUNBTQ-BRkr6T4w.js} +1 -1
- package/dist/deck-client/assets/{vennDiagram-DHZGUBPP-Dz8JT_ob.js → vennDiagram-DHZGUBPP-d0rsTqFo.js} +1 -1
- package/dist/deck-client/assets/wardley-RL74JXVD-2t7cMqdS.js +162 -0
- package/dist/deck-client/assets/{wardleyDiagram-NUSXRM2D-DN1LJMB1.js → wardleyDiagram-NUSXRM2D-DzboAsHh.js} +1 -1
- package/dist/deck-client/assets/{xychartDiagram-5P7HB3ND-nb0oSfrQ.js → xychartDiagram-5P7HB3ND-CgTP9u2V.js} +1 -1
- package/dist/deck-client/index.html +2 -2
- package/dist/server/cli.js +666 -12
- package/dist/server/council-entry.js +0 -0
- package/dist/server/deck-mcp-entry.js +141 -21
- package/dist/server/deck-serve.js +141 -21
- package/dist/server/fb-wizard.js +0 -0
- package/dist/server/graph-mcp-entry.js +666 -12
- package/dist/server/init-entry.js +15 -9
- package/package.json +23 -21
- package/scaffolds/ls-marketplace/plugins/kit/skills/analyse/SKILL.md +180 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/{blast-radius.md → blast-radius/SKILL.md} +28 -12
- package/scaffolds/ls-marketplace/plugins/kit/skills/{debug.md → debug/SKILL.md} +2 -9
- package/scaffolds/ls-marketplace/plugins/kit/skills/{diagram.md → diagram/SKILL.md} +27 -9
- package/scaffolds/ls-marketplace/plugins/kit/skills/{prototype.md → prototype/SKILL.md} +21 -1
- package/scaffolds/ls-marketplace/plugins/kit/skills/recovery/SKILL.md +95 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/{wireframe.md → wireframe/SKILL.md} +21 -1
- package/scaffolds/migrate-safety/scripts/migrate-with-backup.sh +0 -0
- package/scaffolds/recall-hook/scripts/ensure-recall.sh +0 -0
- package/dist/deck-client/assets/channel-2PZVMiXf.js +0 -1
- package/dist/deck-client/assets/classDiagram-6PBFFD2Q-Bt8xBAof.js +0 -1
- package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-Bt8xBAof.js +0 -1
- package/dist/deck-client/assets/clone-BHQryoDl.js +0 -1
- package/dist/deck-client/assets/index-KsShfCV-.js +0 -476
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-4T4wMDXr.js +0 -1
- package/dist/deck-client/assets/wardley-RL74JXVD-DGHQ_Ijv.js +0 -162
- package/scaffolds/ls-marketplace/plugins/kit/skills/recall.md +0 -83
- /package/dist/chart-client/assets/{index-Ccy-DpI-.js → index-B__ARB8k.js} +0 -0
- /package/dist/client/assets/{index-Dp0_okva.js → index-h8kMzVtG.js} +0 -0
- /package/dist/council-client/assets/{index-Dt4zWKSj.js → index-CWaDcsFR.js} +0 -0
- /package/scaffolds/ls-marketplace/plugins/kit/skills/{beacon-array.md → beacon-array/SKILL.md} +0 -0
- /package/scaffolds/ls-marketplace/plugins/kit/skills/{beacon-clear.md → beacon-clear/SKILL.md} +0 -0
- /package/scaffolds/ls-marketplace/plugins/kit/skills/{beacon-pulse.md → beacon-pulse/SKILL.md} +0 -0
- /package/scaffolds/ls-marketplace/plugins/kit/skills/{beacon-scan.md → beacon-scan/SKILL.md} +0 -0
- /package/scaffolds/ls-marketplace/plugins/kit/skills/{brief.md → brief/SKILL.md} +0 -0
- /package/scaffolds/ls-marketplace/plugins/kit/skills/{course.md → course/SKILL.md} +0 -0
- /package/scaffolds/ls-marketplace/plugins/kit/skills/{deploy-check.md → deploy-check/SKILL.md} +0 -0
- /package/scaffolds/ls-marketplace/plugins/kit/skills/{orbit.md → orbit/SKILL.md} +0 -0
- /package/scaffolds/ls-marketplace/plugins/kit/skills/{show-mcp-status.md → show-mcp-status/SKILL.md} +0 -0
|
@@ -317,24 +317,30 @@ var LAUNCH_KIT_TOOLS_GUIDE_STATIC_TAIL = `
|
|
|
317
317
|
Open this repo in Claude Code; on first open you'll be prompted to install
|
|
318
318
|
the "launch-secure" marketplace \u2014 accept to enable the commands above.
|
|
319
319
|
`;
|
|
320
|
-
function
|
|
320
|
+
function listEntries(dir, kind) {
|
|
321
|
+
if (kind === "commands") {
|
|
322
|
+
return fs4.readdirSync(dir).filter((f) => f.endsWith(".md")).sort().map((f) => ({ name: f.replace(/\.md$/, ""), file: path4.join(dir, f) }));
|
|
323
|
+
}
|
|
324
|
+
return fs4.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory() && fs4.existsSync(path4.join(dir, e.name, "SKILL.md"))).map((e) => e.name).sort().map((name) => ({ name, file: path4.join(dir, name, "SKILL.md") }));
|
|
325
|
+
}
|
|
326
|
+
function renderEntries(dir, kind) {
|
|
321
327
|
if (!fs4.existsSync(dir)) return `
|
|
322
|
-
LS slash ${
|
|
328
|
+
LS slash ${kind}: (scaffold dir not bundled \u2014 this is a packaging bug)
|
|
323
329
|
`;
|
|
324
|
-
const
|
|
325
|
-
if (
|
|
326
|
-
LS slash ${
|
|
330
|
+
const entries = listEntries(dir, kind);
|
|
331
|
+
if (entries.length === 0) return `
|
|
332
|
+
LS slash ${kind}: (none defined)
|
|
327
333
|
`;
|
|
328
|
-
const names =
|
|
334
|
+
const names = entries.map((e) => `/${PLUGIN_ID}:${e.name}`);
|
|
329
335
|
const colWidth = Math.max(26, ...names.map((n) => n.length + 2));
|
|
330
|
-
const lines =
|
|
331
|
-
const text = fs4.readFileSync(
|
|
336
|
+
const lines = entries.map((entry, i) => {
|
|
337
|
+
const text = fs4.readFileSync(entry.file, "utf-8");
|
|
332
338
|
const fmMatch = text.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
333
339
|
const desc = fmMatch?.[1].match(/^description:\s*(.+)$/m)?.[1]?.trim() ?? "";
|
|
334
340
|
return ` ${names[i].padEnd(colWidth)} \u2014 ${desc}`;
|
|
335
341
|
});
|
|
336
342
|
return `
|
|
337
|
-
LS slash ${
|
|
343
|
+
LS slash ${kind} (run inside Claude Code in this project):
|
|
338
344
|
${lines.join("\n")}
|
|
339
345
|
`;
|
|
340
346
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@launchsecure/launch-kit",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.31",
|
|
4
4
|
"description": "LaunchSecure toolkit — launch-pod (pipeline), launch-chart (project graph MCP), launch-deck (visual playground MCP), launch-kit-beacon (feedback Web Component), launch-recall (file-watcher backup).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "LaunchSecure - AutomateWithUs",
|
|
@@ -56,6 +56,24 @@
|
|
|
56
56
|
"launch-course": "./dist/server/course-entry.js",
|
|
57
57
|
"launch-beacon": "./dist/server/beacon-monitor-entry.js"
|
|
58
58
|
},
|
|
59
|
+
"scripts": {
|
|
60
|
+
"build": "pnpm build:client && pnpm build:chart-client && pnpm build:deck-client && pnpm build:council-client && pnpm build:beacon && pnpm build:server",
|
|
61
|
+
"build:beacon": "vite build --config vite.beacon.config.ts && tsc -p tsconfig.beacon.json --emitDeclarationOnly --outDir dist/beacon/types",
|
|
62
|
+
"test:beacon": "vitest run --config vite.beacon.config.ts",
|
|
63
|
+
"test:radar": "vitest run --config vite.radar.config.ts",
|
|
64
|
+
"test:chart": "vitest run --config vite.chart.test.config.ts",
|
|
65
|
+
"build:deck-client": "vite build --config vite.deck.config.ts",
|
|
66
|
+
"build:council-client": "vite build --config vite.council.config.ts",
|
|
67
|
+
"build:client": "vite build",
|
|
68
|
+
"build:chart-client": "vite build --config vite.chart.config.ts",
|
|
69
|
+
"build:server": "esbuild src/server/cli.ts src/server/fb-wizard.ts src/server/graph-mcp-entry.ts src/server/chart-serve.ts src/server/deck-mcp-entry.ts src/server/deck-serve.ts src/server/council-entry.ts src/server/council-serve.ts src/server/recall-entry.ts src/server/init-entry.ts src/server/orbit-entry.ts src/server/course-entry.ts src/server/beacon-monitor-entry.ts src/server/parse-worker-entry.ts --bundle --platform=node --target=node18 --outdir=dist/server --external:node-pty --external:ws --external:typescript --external:web-tree-sitter --external:tree-sitter-typescript --external:cloudflared --external:pg --external:pg-native --external:pgsql-parser --external:libpg-query && rm -rf dist/server/public && cp -r ../claude-code-web/src/public dist/server/public && rm -rf dist/server/graph/queries && mkdir -p dist/server/graph && cp -r src/server/graph/queries dist/server/graph/queries",
|
|
70
|
+
"dev:client": "vite",
|
|
71
|
+
"dev:deck-serve": "cd ../.. && tsx watch packages/cli/src/server/deck-mcp-entry.ts serve",
|
|
72
|
+
"dev:chart": "pnpm build:server && pnpm build:chart-client && node dist/server/graph-mcp-entry.js serve",
|
|
73
|
+
"dev:server": "pnpm build:server && node dist/server/cli.js",
|
|
74
|
+
"dev": "pnpm build:server && concurrently -k -n client,server -c cyan,magenta \"vite\" \"node dist/server/cli.js\"",
|
|
75
|
+
"prepublishOnly": "pnpm build"
|
|
76
|
+
},
|
|
59
77
|
"files": [
|
|
60
78
|
"dist",
|
|
61
79
|
"prompts",
|
|
@@ -76,6 +94,8 @@
|
|
|
76
94
|
"ws": "^8.18.0"
|
|
77
95
|
},
|
|
78
96
|
"devDependencies": {
|
|
97
|
+
"@launchsecure/claude-code-web": "workspace:*",
|
|
98
|
+
"@launchsecure/ui": "workspace:*",
|
|
79
99
|
"@types/node": "^20.0.0",
|
|
80
100
|
"@types/pg": "^8.11.10",
|
|
81
101
|
"@types/react": "^18.3.12",
|
|
@@ -99,24 +119,6 @@
|
|
|
99
119
|
"react-router-dom": "^6.28.0",
|
|
100
120
|
"tailwindcss": "^3.4.19",
|
|
101
121
|
"vite": "^5.4.11",
|
|
102
|
-
"vitest": "^1.6.0"
|
|
103
|
-
"@launchsecure/claude-code-web": "0.0.1",
|
|
104
|
-
"@launchsecure/ui": "0.0.1"
|
|
105
|
-
},
|
|
106
|
-
"scripts": {
|
|
107
|
-
"build": "pnpm build:client && pnpm build:chart-client && pnpm build:deck-client && pnpm build:council-client && pnpm build:beacon && pnpm build:server",
|
|
108
|
-
"build:beacon": "vite build --config vite.beacon.config.ts && tsc -p tsconfig.beacon.json --emitDeclarationOnly --outDir dist/beacon/types",
|
|
109
|
-
"test:beacon": "vitest run --config vite.beacon.config.ts",
|
|
110
|
-
"test:radar": "vitest run --config vite.radar.config.ts",
|
|
111
|
-
"test:chart": "vitest run --config vite.chart.test.config.ts",
|
|
112
|
-
"build:deck-client": "vite build --config vite.deck.config.ts",
|
|
113
|
-
"build:council-client": "vite build --config vite.council.config.ts",
|
|
114
|
-
"build:client": "vite build",
|
|
115
|
-
"build:chart-client": "vite build --config vite.chart.config.ts",
|
|
116
|
-
"build:server": "esbuild src/server/cli.ts src/server/fb-wizard.ts src/server/graph-mcp-entry.ts src/server/chart-serve.ts src/server/deck-mcp-entry.ts src/server/deck-serve.ts src/server/council-entry.ts src/server/council-serve.ts src/server/recall-entry.ts src/server/init-entry.ts src/server/orbit-entry.ts src/server/course-entry.ts src/server/beacon-monitor-entry.ts src/server/parse-worker-entry.ts --bundle --platform=node --target=node18 --outdir=dist/server --external:node-pty --external:ws --external:typescript --external:web-tree-sitter --external:tree-sitter-typescript --external:cloudflared --external:pg --external:pg-native --external:pgsql-parser --external:libpg-query && rm -rf dist/server/public && cp -r ../claude-code-web/src/public dist/server/public && rm -rf dist/server/graph/queries && mkdir -p dist/server/graph && cp -r src/server/graph/queries dist/server/graph/queries",
|
|
117
|
-
"dev:client": "vite",
|
|
118
|
-
"dev:chart": "pnpm build:server && pnpm build:chart-client && node dist/server/graph-mcp-entry.js serve",
|
|
119
|
-
"dev:server": "pnpm build:server && node dist/server/cli.js",
|
|
120
|
-
"dev": "pnpm build:server && concurrently -k -n client,server -c cyan,magenta \"vite\" \"node dist/server/cli.js\""
|
|
122
|
+
"vitest": "^1.6.0"
|
|
121
123
|
}
|
|
122
|
-
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Source-code analysis using launch-chart as the default tool. Routes structural / internal-state / content queries to the chart MCP first; falls back to grep/Read only when the chart cannot answer (non-TS files, missing layer, parser gap). Files a one-line LS feedback comment whenever the fallback is the chart's fault, so gaps get fixed.
|
|
3
|
+
when_to_use: |
|
|
4
|
+
Auto-fire whenever the user wants to understand, explore, audit, or trace source code or codebase structure — INSTEAD of defaulting to grep / glob / Read. Trigger phrases: "analyse" / "analyze" / "analysis", "explain how X works", "how does X work", "where is X", "what depends on / calls / renders / imports X", "trace / walk through Y", "explore the codebase", "understand this module", "audit X", "show me all / list every X" (pages, endpoints, tables, hooks, components), "what state does X track", "what conditions exist in X", "which endpoints check Y", "what tables relate to X", "what permissions does role X grant", "is migration X destructive", "what seed roles / tags / providers exist", "find FIXME / TODO". Also auto-fire on open-ended structural questions ("how is auth set up", "where does the work-item flow happen") even without explicit "analyse" wording. Do NOT auto-fire for: bug investigation framed as symptom ("X is broken", "why doesn't Y work" — use /kit:debug), refactor blast assessment ("what breaks if I change Z" — use /kit:blast-radius), or render-as-diagram requests (use /kit:diagram).
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- mcp__launch-chart__read_graph
|
|
7
|
+
- mcp__launch-chart__inspect_node
|
|
8
|
+
- mcp__launch-chart__grep_nodes
|
|
9
|
+
- mcp__launch-chart__detect_project_stack
|
|
10
|
+
- mcp__launch-chart__blast_points
|
|
11
|
+
- mcp__launch-chart__effects_index
|
|
12
|
+
- mcp__launch-chart__list_notes
|
|
13
|
+
- mcp__launch-chart__who_uses
|
|
14
|
+
- mcp__launch-chart__trace_path
|
|
15
|
+
- mcp__launch-chart__migration_audit
|
|
16
|
+
- mcp__launch-chart__drift_report
|
|
17
|
+
- mcp__launch-chart__auth_coverage_report
|
|
18
|
+
- mcp__launch-secure__kit_feedback_submit
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# /kit:analyse
|
|
22
|
+
|
|
23
|
+
Source-code analysis using launch-chart as the default tool. The chart indexes ~1,200 typed nodes across 4 layers (ui / api / db / static) with cross-layer edges and AST-level deep fields — almost everything grep/glob/Read would surface is queryable here, faster and cheaper in tokens.
|
|
24
|
+
|
|
25
|
+
## Discipline (non-negotiable)
|
|
26
|
+
|
|
27
|
+
1. **Chart-first.** Default to launch-chart MCP for any code-structure or behavior query. Do NOT reach for grep / glob / Read first.
|
|
28
|
+
2. **On illegitimate chart gap, file ONE LS feedback report** via `mcp__launch-secure__kit_feedback_submit` (the kit-self feedback channel — NOT `communication_write`, which would land in the user's own project Comm Hub instead of the launch-kit project). One report per invocation, not per query.
|
|
29
|
+
3. **Fall back to grep / Read** only per the rules below.
|
|
30
|
+
4. **Surface the fallback verbatim** in your final output — silent fallbacks hide gaps and let the chart rot.
|
|
31
|
+
|
|
32
|
+
## Routing table — chart tool per question shape
|
|
33
|
+
|
|
34
|
+
Specialized tools (use these first when the question matches):
|
|
35
|
+
|
|
36
|
+
| Question shape | Chart tool | Notes |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| "Where is X referenced from other layers / who uses permission P / who calls endpoint E / who references table T" | `who_uses(target: X)` | scans all layers' cross_refs (calls_api, references_static, reads_via, mutates_via, reads, mutates, references_api). Paginated. |
|
|
39
|
+
| "Trace path between A and B / how does page X end up reading table T" | `trace_path(from: A, to: B)` | BFS via cross_refs including via[] middleware chains. Bounded by max_hops/max_paths. Paginated. |
|
|
40
|
+
| "Are migrations safe / which destructive migrations lack guards" | `migration_audit` | codifies CLAUDE.md's three-layer discipline. Lists destructives missing orphan_check / sidecar_backup / pre_flight_notice. Paginated. |
|
|
41
|
+
| "Show drift / SQL vs ORM mismatches / unresolved routes / FK drift" | `drift_report(layer?, kind?, confidence?)` | aggregates contradictions + flagged_edges across layers. Generalizes db-only include_findings. Paginated. |
|
|
42
|
+
| "Audit auth coverage / which endpoints are public / how many use withAuth" | `auth_coverage_report(module?, strategy?)` | aggregates api endpoints by auth[] wrapper. Surfaces unauthenticated. Grouped by module. |
|
|
43
|
+
| "What endpoints call /api/X / what URLs does UI fetch / who calls this endpoint" | `effects_index(kind: "fetch_calls", key?)` | UI→API call inventory from cross_refs[calls_api] + raw effects.fetches. |
|
|
44
|
+
| "Invert endpoint effects / which endpoints call db.user.findUnique" | `effects_index(kind: "api_effects", key?)` | inverts api endpoint effects.{calls,fetches,persists,…}. Use `key` for full caller list across categories. |
|
|
45
|
+
|
|
46
|
+
General routes (use these when no specialized tool fits):
|
|
47
|
+
|
|
48
|
+
| Question shape | Chart tool | Notes |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| "Where is X defined / what is it" | `read_graph(search: X)` | substring match on id, name, route, JSX text, ui_labels, notes |
|
|
51
|
+
| "What pages / hooks / endpoints / tables / migrations exist" | `read_graph(layer: <L>, type: <T>)` | layer + type filters |
|
|
52
|
+
| "What's in module Y" | `read_graph(module: Y)` | module tags from `.launchchart.json` |
|
|
53
|
+
| "Filter by multiple conditions (e.g. destructive AND missing orphan check)" | `read_graph(tag_predicates: [{field,op,value},...])` | ops: eq/ne/gt/lt/gte/lte/exists/not_exists/in. Matches top-level node attrs OR tag keys. |
|
|
54
|
+
| "Per-node incoming + outgoing cross-layer refs" | `read_graph(node_id: X, include_cross_refs: true, cross_ref_type?)` OR `inspect_node(node_id: X, fields: ["crossRefs"])` | when you want crossRefs inline alongside other data |
|
|
55
|
+
| "Surface flagged_edges by confidence (DYNAMIC routes, FK drift)" | `read_graph(layer: <L>, edge_confidence: ["medium","high"])` | layer-independent flagged_edges filter |
|
|
56
|
+
| "What does X render / what renders X" | `read_graph(node_id: X, hops: 1, include_edges: true)` | renders / imports edges |
|
|
57
|
+
| "Which UI calls API endpoint E" | `read_graph(node_id: E, layer: "api", include_edges: true)` OR `who_uses(target: E)` | cross-layer `calls_api` edges |
|
|
58
|
+
| "What endpoints touch table T" | `read_graph(layer: "api", search: T)` then check `db_models[]` | endpoints already index `db_models` and `db_operations` |
|
|
59
|
+
| "What auth does endpoint E use" | `read_graph(layer: "api", search: E)` then check `auth[]` | auth wrappers extracted per endpoint |
|
|
60
|
+
| "Is endpoint E mutating" | `read_graph(layer: "api", search: E)` then check `mutates` flag | already extracted |
|
|
61
|
+
| "What state does Z hold" | `inspect_node(node_id: Z, fields: ["stateVars"])` | start narrow, always |
|
|
62
|
+
| "What conditions exist in Z" | `inspect_node(node_id: Z, fields: ["conditions"])` | if / else / ternary tests with their test expressions |
|
|
63
|
+
| "Which nodes match pattern P inside conditions/vars/elements" | `inspect_node(layer: <L>, filter: P, fields: ["conditions"])` | regex over deep fields, raises node limit to 50 |
|
|
64
|
+
| "DOM ids / storage keys / window events / fetch urls / timers / singleton risks" | `effects_index(kind: <kind>, key?)` | precomputed cross-cutting inverted indexes |
|
|
65
|
+
| "DOM-id / storage-key collisions" | `effects_index(kind: "collisions")` | impossible without graph |
|
|
66
|
+
| "What tables relate to X" | `read_graph(layer: "db", node_id: X, include_edges: true)` | belongs_to / has_many edges |
|
|
67
|
+
| "Single migration M's safety status" | `read_graph(layer: "db", type: "migration", search: M)` | migration nodes carry `is_destructive`, `has_orphan_check`, `has_sidecar_backup`, `has_pre_flight_notice`, `contains_backfill`, `contains_drop_column` (use `migration_audit` for cross-migration audits) |
|
|
68
|
+
| "What seed roles / permissions / tags / providers / plans exist" | `read_graph(layer: "static", type: "seed_role")` etc. | static layer covers `prisma/seed.ts` |
|
|
69
|
+
| "What permissions does role R grant" | `read_graph(layer: "static", node_id: "seed:role:R", include_edges: true)` | `grants` edges |
|
|
70
|
+
| "Find pattern P in module M's files only" | `grep_nodes(layer: <L>, module: M, pattern: P)` | grep scoped via graph — much narrower than raw grep |
|
|
71
|
+
| "What breaks if I delete / change X" | `blast_points(node_id: X, direction: "reverse")` | reverse-dep walk across all layers in one call |
|
|
72
|
+
| "Find FIXME / TODO / tagged notes" | `read_graph(search: "FIXME")` or `list_notes` | tagged comments indexed |
|
|
73
|
+
| "What's the current stack / which parsers run / which layers are available" | `detect_project_stack` | run before concluding a layer is missing |
|
|
74
|
+
|
|
75
|
+
## inspect_node strategy — start narrow, widen if needed
|
|
76
|
+
|
|
77
|
+
1. **Decide first**: structure or variables? Structure (renders/imports/depends) → `read_graph`. Variables/state/conditions → `inspect_node`.
|
|
78
|
+
2. **Always pass `fields` and/or `filter`** to keep the response small and inline. Examples:
|
|
79
|
+
- State only → `inspect_node(node_id: X, fields: ["stateVars"])`
|
|
80
|
+
- Pattern across many nodes → `inspect_node(layer: "ui", filter: "isAdmin", fields: ["conditions"])`
|
|
81
|
+
3. **Only broaden if narrow returns nothing.** Remove `filter`, add more `fields`, or omit `fields` entirely as a last resort.
|
|
82
|
+
4. **Never** call `inspect_node` with no `fields` and no `filter` on a large page or component — returns 50-80KB dumps that get persisted to disk and force a second read step.
|
|
83
|
+
|
|
84
|
+
## parser_warning awareness
|
|
85
|
+
|
|
86
|
+
Several chart tools (`who_uses`, `trace_path`, `drift_report`, `read_graph` with `include_cross_refs` or `edge_confidence`, `inspect_node` with `crossRefs`, `effects_index` with `fetch_calls`) attach a `parser_warning` field when the underlying source data (cross_refs / flagged_edges / contradictions) is completely empty for the scanned layer(s). This is the chart **telling you the parser may not have run** — not "there's no match."
|
|
87
|
+
|
|
88
|
+
When you see `parser_warning` in a tool response:
|
|
89
|
+
1. **Don't silently report "no results."** Empty-with-warning is a different signal than empty-without-warning.
|
|
90
|
+
2. **Run `detect_project_stack`** to verify which parsers are detected. If the parser referenced in the warning IS detected, the data should be present — that's a chart-gap worth filing per the protocol below.
|
|
91
|
+
3. **If the parser isn't detected for this stack** (e.g. cross-layer parsers don't apply because the project isn't TS/Next), surface that to the user — the chart doesn't claim coverage here.
|
|
92
|
+
4. **Never strip `parser_warning` from your output.** Include it (or a short paraphrase) in the user-facing summary so they can act.
|
|
93
|
+
|
|
94
|
+
## Chart breakage triage — BEFORE filing any feedback comment
|
|
95
|
+
|
|
96
|
+
When a chart query returns empty / errors / fires `parser_warning`, walk this triage. Two upstream causes are common and require NO feedback comment — they're user-action gaps, not chart bugs. File a comment ONLY after both are ruled out.
|
|
97
|
+
|
|
98
|
+
### Step 1 — does the graph file even exist?
|
|
99
|
+
|
|
100
|
+
If a chart tool returns an error like `"No <layer> graph found at .launchsecure/graphs/<layer>.json"` or `"Run generate_graph first"`, the user hasn't built the graph yet. **Do NOT file a comment.** Tell the user verbatim and stop:
|
|
101
|
+
- `"No chart graph found in this project. Run mcp__launch-chart__generate_graph (or `npx launch-chart generate`) once, then retry the query."`
|
|
102
|
+
|
|
103
|
+
### Step 2 — is the graph stale?
|
|
104
|
+
|
|
105
|
+
Every chart response carries `_meta.state`. If it's anything other than `"fresh"` (e.g. `"stale"`, `"escalated"`), the graph hasn't been regenerated since recent file edits — your query may be looking at an outdated snapshot. **Do NOT file a comment for stale-graph results.** Surface to the user:
|
|
106
|
+
- `"Chart graph is <state> (last full regen: <_meta.lastFullRegenAt>, <N> patches since). Recent edits may not be visible. Run generate_graph to refresh, then retry."`
|
|
107
|
+
- Then either stop OR proceed with the stale results, flagging the staleness in your final output.
|
|
108
|
+
|
|
109
|
+
### Step 3 — parser produced empty/wrong output (the only chart-gap case)
|
|
110
|
+
|
|
111
|
+
Only AFTER ruling out steps 1 + 2: if `detect_project_stack` shows the relevant parser is detected, the graph file exists, AND `_meta.state` is fresh — and the query still returns empty / missing expected fields / missing cross-layer edges — that's a real chart gap. File the LS feedback comment per the template below, with parser-specific fields populated (parser name, layer, graph_meta).
|
|
112
|
+
|
|
113
|
+
## When the fallback is legitimate (NO feedback comment)
|
|
114
|
+
|
|
115
|
+
These are expected gaps — the chart doesn't claim coverage here:
|
|
116
|
+
|
|
117
|
+
- **Non-TS source files** — SQL (`prisma/migrations/**/*.sql` and other), JS/CJS/MJS files, JSON, markdown (docs/), env files, CSS / Tailwind config, YAML / TOML
|
|
118
|
+
- **CSS classes, Tailwind utilities, inline styles** — chart doesn't model class names or computed styles
|
|
119
|
+
- **CLI bin / Node script files** — the typescript-project parser is Next.js-shaped and may skip standalone server entrypoints (e.g. `packages/cli/src/server/init-entry.ts` is known to be unindexed)
|
|
120
|
+
- **Untagged comment content** — only notes-tagged comments are indexed; arbitrary inline comments are not
|
|
121
|
+
- **Verifying a file's literal contents for review or editing** — Read is correct for "show me lines 40-80 of foo.ts"
|
|
122
|
+
|
|
123
|
+
In these cases, jump to grep / Read directly. Tell the user explicitly which non-coverage rule applied — e.g. `"Symptom is in an SQL migration file; chart doesn't model raw SQL — using Read directly."`
|
|
124
|
+
|
|
125
|
+
## When the fallback is illegitimate (FEEDBACK COMMENT REQUIRED)
|
|
126
|
+
|
|
127
|
+
The chart should have answered but didn't. File ONE comment before falling back:
|
|
128
|
+
|
|
129
|
+
- `read_graph(search: "X")` returns 0 candidates AND a quick `grep` confirms "X" exists in indexed TS source
|
|
130
|
+
- A layer listed by `detect_project_stack` returns 0 nodes for any well-formed query (parser misconfig)
|
|
131
|
+
- `inspect_node` returns no `columns` / `elements` / `stateVars` for a known table or component (extractor gap)
|
|
132
|
+
- A cross-layer edge that should exist (e.g. UI page that fetches `/api/foo` should have a `calls_api` edge) is missing
|
|
133
|
+
|
|
134
|
+
### Feedback report template
|
|
135
|
+
|
|
136
|
+
Call `mcp__launch-secure__kit_feedback_submit` — routes to the launch-kit project regardless of which repo the user is in:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
title: "launch-chart gap: <one-line, e.g. 'fetch-resolver produced 0 calls_api refs on ui layer'>"
|
|
140
|
+
source: "kit:analyse"
|
|
141
|
+
body: |
|
|
142
|
+
Skill: /kit:analyse
|
|
143
|
+
Query: <one-line what the user asked>
|
|
144
|
+
Tool: <chart_tool>(<args>)
|
|
145
|
+
Returned: <summary — e.g. "0 nodes" or "missing 'columns' field">
|
|
146
|
+
Cross-check: grep "<term>" matched <N> files (sample: <path1>, <path2>)
|
|
147
|
+
Project stack: <one-line from detect_project_stack>
|
|
148
|
+
Triage:
|
|
149
|
+
graph_exists: yes
|
|
150
|
+
graph_state: <_meta.state> # fresh — ruled out staleness
|
|
151
|
+
parser_detected: <parser_id> # from detect_project_stack
|
|
152
|
+
Parser: <parser_id> # e.g. fetch-resolver, typescript-project
|
|
153
|
+
Layer: <layer_id> # ui / api / db / static
|
|
154
|
+
Graph meta:
|
|
155
|
+
state: <_meta.state>
|
|
156
|
+
last_full_regen_at: <_meta.lastFullRegenAt>
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
One report per invocation. After filing, surface to the user: `"(Filed chart-gap report to launch-kit project. Falling back to grep / Read for this query.)"` and continue.
|
|
160
|
+
|
|
161
|
+
## Output shape
|
|
162
|
+
|
|
163
|
+
For every analysis, return:
|
|
164
|
+
|
|
165
|
+
1. **One-paragraph answer** to the user's question — direct, no preamble.
|
|
166
|
+
2. **Citations as chart node ids** — each claim links to a node (file path like `app/api/orgs/.../route.ts`, table name like `WorkItem`, route like `/admin/analytics`). The user must be able to verify by clicking through.
|
|
167
|
+
3. **The chart query path you used** — one or two lines naming the tools + arguments. Lets the user re-run or extend the investigation.
|
|
168
|
+
|
|
169
|
+
If a fallback happened, prefix the output with one of:
|
|
170
|
+
- `(Filed gap report id: <id>. Falling back to grep — chart should have answered.)`
|
|
171
|
+
- `(Symptom is in <non-TS asset class>; chart doesn't model it — using grep / Read directly.)`
|
|
172
|
+
|
|
173
|
+
## Constraints
|
|
174
|
+
|
|
175
|
+
- **Chart-first. No exceptions.** Default to MCP queries. grep / glob / Read only per the fallback rules above.
|
|
176
|
+
- **One feedback report per invocation.** Do not spam — bundle multiple chart issues into one report if they fire in the same run.
|
|
177
|
+
- **Cloud LS by default.** Use `mcp__launch-secure__kit_feedback_submit` (cloud). The local variant only if the user explicitly said "local".
|
|
178
|
+
- **No implementation.** This skill explains and traces; it does not edit. If the user wants the fix, hand the diagnosis back and let them invoke an editor flow.
|
|
179
|
+
- **Cite by node id.** Every claim links to a chart node so the user can verify.
|
|
180
|
+
- **Surface the fallback verbatim.** Silent fallbacks hide gaps and let the chart rot.
|
package/scaffolds/ls-marketplace/plugins/kit/skills/{blast-radius.md → blast-radius/SKILL.md}
RENAMED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Build a blast radius for a file/table/endpoint via launch-chart and push it to launch-deck as an interactive radial graph. Use to assess "what breaks if I change X" before refactors, schema migrations, or API contract changes. Chart-first; on chart gaps (no nodes, missing layer, empty edges) files a feedback comment to LaunchSecure so the gap is monitored.
|
|
3
|
+
when_to_use: |
|
|
4
|
+
Auto-fire when the user wants to VISUALISE the reverse-dependency blast radius for a specific node (file / table / endpoint / hook) before a refactor, migration, or contract change. Trigger phrases: "what breaks if I change X", "blast radius for X", "impact of refactoring X", "who's affected if I rename / drop / remove X", "scope this migration", "ripple effect of changing X", "is X safe to remove". Deck is required because the deliverable is an interactive radial graph — a flat list of dependents in the terminal misses ring/layer structure. Do NOT auto-fire for: simple "who imports X" or "where is X used" (use /kit:analyse), reading the structure of one file (use chart read_graph directly), planning the change itself (separate step that runs after blast-radius), plain-text dependency summaries the user can read in the terminal, or any request without a clear named target node.
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- mcp__launch-deck__server_status
|
|
7
|
+
- mcp__launch-deck__start_server
|
|
8
|
+
- mcp__launch-deck__deck
|
|
9
|
+
- mcp__launch-chart__chart_server_status
|
|
10
|
+
- mcp__launch-chart__detect_project_stack
|
|
11
|
+
- mcp__launch-chart__blast_points
|
|
12
|
+
- mcp__launch-chart__read_graph
|
|
13
|
+
- mcp__launch-secure__kit_feedback_submit
|
|
14
|
+
- Bash
|
|
3
15
|
---
|
|
4
16
|
|
|
5
17
|
# /kit:blast-radius
|
|
@@ -57,7 +69,18 @@ Edges: connect the centre to every hop=1 node; connect each hop=2 node to one ho
|
|
|
57
69
|
|
|
58
70
|
Call `mcp__launch-deck__deck` with `session: <session>`, `mode: "show"`, `blocks: [{ type: "blast-radius", label: <target>, manifest: <built-manifest> }]`.
|
|
59
71
|
|
|
60
|
-
If the deck server isn't running, call `mcp__launch-deck__start_server` first, then retry.
|
|
72
|
+
If the deck server isn't running, call `mcp__launch-deck__start_server` first, then retry.
|
|
73
|
+
|
|
74
|
+
## 4. Open in browser
|
|
75
|
+
|
|
76
|
+
After the push, open the per-session URL so the user lands directly on this blast-radius:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
open "<deck-url>/#<session>" # macOS
|
|
80
|
+
xdg-open "<deck-url>/#<session>" # Linux
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
`<deck-url>` is the `url` returned by `mcp__launch-deck__server_status` (typically `http://localhost:52829`). The `#<session>` hash deep-links to this exact session.
|
|
61
84
|
|
|
62
85
|
## Output
|
|
63
86
|
|
|
@@ -66,32 +89,25 @@ After the push, print a terse summary:
|
|
|
66
89
|
```
|
|
67
90
|
blast-radius for <target> — <N> direct, <M> indirect (<hops> hops)
|
|
68
91
|
by layer: db 4, api 7, ui 12
|
|
69
|
-
pushed to deck session "<session>" —
|
|
92
|
+
pushed to deck session "<session>" — <deck-url>/#<session>
|
|
70
93
|
```
|
|
71
94
|
|
|
72
95
|
## Chart-gap protocol (shared)
|
|
73
96
|
|
|
74
|
-
When the chart MCP returns less data than expected, file ONE
|
|
97
|
+
When the chart MCP returns less data than expected, file ONE report via `mcp__launch-secure__kit_feedback_submit` (the kit-self feedback channel — NOT `communication_write`, which would land in the user's own project Comm Hub instead of the launch-kit project) before stopping:
|
|
75
98
|
|
|
76
99
|
```
|
|
77
|
-
resource_type: "feedback"
|
|
78
100
|
title: "launch-chart gap: <one-line>"
|
|
101
|
+
source: "kit:blast-radius"
|
|
79
102
|
body: |
|
|
80
103
|
Skill: /kit:blast-radius
|
|
81
104
|
Tool: blast_points(node_id=<id>, hops=<n>, layer=<layer?>)
|
|
82
105
|
Returned: <nodes_count> nodes, layers=<layers_seen>
|
|
83
106
|
Expected: <what-was-expected, e.g. "node exists at <path>" or "layer X should appear">
|
|
84
107
|
Project stack: <one-line summary from detect_project_stack>
|
|
85
|
-
fields:
|
|
86
|
-
severity: "low"
|
|
87
|
-
source: "kit-skill"
|
|
88
|
-
skill: "blast-radius"
|
|
89
|
-
tool: "blast_points"
|
|
90
|
-
args: { node_id, hops, layer }
|
|
91
|
-
response_summary: { nodes_count, layers_seen, error }
|
|
92
108
|
```
|
|
93
109
|
|
|
94
|
-
Do NOT spam — file at most one
|
|
110
|
+
Do NOT spam — file at most one report per skill invocation. After filing, tell the user "Filed chart-gap report to launch-kit project. Falling back to read_graph + Read." and continue with a degraded path: try `mcp__launch-chart__read_graph` with `search: <target>` to confirm the node exists in any layer; if so, do the blast-radius math from `include_edges: true` results manually; otherwise stop and surface the gap to the user.
|
|
95
111
|
|
|
96
112
|
## Constraints
|
|
97
113
|
|
|
@@ -60,11 +60,11 @@ Then use `grep`/`Read` directly. Always tell the user explicitly: `"Chart return
|
|
|
60
60
|
|
|
61
61
|
## Chart-gap protocol (shared)
|
|
62
62
|
|
|
63
|
-
When the chart MCP returns less than the symptom suggests it should, file ONE feedback
|
|
63
|
+
When the chart MCP returns less than the symptom suggests it should, file ONE report via `mcp__launch-secure__kit_feedback_submit` (the kit-self feedback channel — NOT `communication_write`, which would land in the user's own project Comm Hub instead of the launch-kit project):
|
|
64
64
|
|
|
65
65
|
```
|
|
66
|
-
resource_type: "feedback"
|
|
67
66
|
title: "launch-chart gap: <one-line>"
|
|
67
|
+
source: "kit:debug"
|
|
68
68
|
body: |
|
|
69
69
|
Skill: /kit:debug
|
|
70
70
|
Symptom: <one-line symptom>
|
|
@@ -72,13 +72,6 @@ body: |
|
|
|
72
72
|
Returned: 0 nodes
|
|
73
73
|
Cross-check: grep "<term>" matched <N> files (sample: <path1>, <path2>)
|
|
74
74
|
Project stack: <detect_project_stack one-liner>
|
|
75
|
-
fields:
|
|
76
|
-
severity: "low"
|
|
77
|
-
source: "kit-skill"
|
|
78
|
-
skill: "debug"
|
|
79
|
-
tool: "read_graph"
|
|
80
|
-
args: { search, layer, type }
|
|
81
|
-
response_summary: { nodes_count: 0, grep_hit_count }
|
|
82
75
|
```
|
|
83
76
|
|
|
84
77
|
Then continue with the grep fallback for THIS query. Don't file again in the same invocation.
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Render a Mermaid diagram (flowchart, sequence, ERD, state, gantt) via launch-deck. For ERDs, auto-derives tables and relations from launch-chart's db layer so the diagram matches the real schema. Files a chart-gap feedback comment to LS if the db layer is missing or empty.
|
|
3
|
+
when_to_use: |
|
|
4
|
+
Auto-fire when the user wants a RENDERED Mermaid diagram visible in the browser — flowchart, sequence, ERD, state machine, or gantt. Trigger phrases: "diagram X", "draw the flowchart for Y", "sequence diagram of W", "ERD for the schema / for X module", "state diagram for V's lifecycle", "gantt of the rollout", "show me visually how X flows", "render this as a diagram", "give me a chart of the user table relations". Deck is required because Mermaid must be rendered to be useful — DSL text in the terminal cannot substitute. Do NOT auto-fire for: plain-text process explanations the user can read in the terminal ("walk me through how X works" — that's /kit:analyse or a direct terminal answer), ASCII flowcharts inline in chat, requests that already include Mermaid the user wrote, or schema questions where the answer is a few sentences rather than a diagram.
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- mcp__launch-deck__server_status
|
|
7
|
+
- mcp__launch-deck__start_server
|
|
8
|
+
- mcp__launch-deck__deck
|
|
9
|
+
- mcp__launch-deck__await_feedback
|
|
10
|
+
- mcp__launch-chart__chart_server_status
|
|
11
|
+
- mcp__launch-chart__detect_project_stack
|
|
12
|
+
- mcp__launch-chart__read_graph
|
|
13
|
+
- mcp__launch-chart__inspect_node
|
|
14
|
+
- mcp__launch-secure__kit_feedback_submit
|
|
15
|
+
- Bash
|
|
3
16
|
---
|
|
4
17
|
|
|
5
18
|
# /kit:diagram
|
|
@@ -93,10 +106,21 @@ Call `mcp__launch-deck__deck` with:
|
|
|
93
106
|
|
|
94
107
|
If `--feedback`, call `await_feedback` and surface the response.
|
|
95
108
|
|
|
109
|
+
## Open in browser
|
|
110
|
+
|
|
111
|
+
After the push (and after `await_feedback` if `--feedback`), open the per-session URL so the user lands directly on this diagram:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
open "<deck-url>/#<session>" # macOS
|
|
115
|
+
xdg-open "<deck-url>/#<session>" # Linux
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
`<deck-url>` is the `url` returned by `mcp__launch-deck__server_status` (typically `http://localhost:52829`). The `#<session>` hash deep-links to this exact session.
|
|
119
|
+
|
|
96
120
|
## Output
|
|
97
121
|
|
|
98
122
|
```
|
|
99
|
-
diagram pushed — deck session "<session>" —
|
|
123
|
+
diagram pushed — deck session "<session>" — <deck-url>/#<session>
|
|
100
124
|
kind: <kind>
|
|
101
125
|
nodes: <N> edges: <M>
|
|
102
126
|
```
|
|
@@ -105,23 +129,17 @@ For ERDs add `tables: <N> relations: <M> scope: <scope or "all">`.
|
|
|
105
129
|
|
|
106
130
|
## Chart-gap protocol (shared)
|
|
107
131
|
|
|
108
|
-
When the chart MCP returns less data than expected (db layer missing, 0 tables, empty columns), file ONE feedback
|
|
132
|
+
When the chart MCP returns less data than expected (db layer missing, 0 tables, empty columns), file ONE report via `mcp__launch-secure__kit_feedback_submit` (the kit-self feedback channel — NOT `communication_write`, which would land in the user's own project Comm Hub instead of the launch-kit project) before stopping:
|
|
109
133
|
|
|
110
134
|
```
|
|
111
|
-
resource_type: "feedback"
|
|
112
135
|
title: "launch-chart gap: <one-line>"
|
|
136
|
+
source: "kit:diagram"
|
|
113
137
|
body: |
|
|
114
138
|
Skill: /kit:diagram
|
|
115
139
|
Tool: read_graph(layer="db", …) / inspect_node(...)
|
|
116
140
|
Returned: <tables_count> tables, <relations_count> relations
|
|
117
141
|
Expected: db layer present per detect_project_stack
|
|
118
142
|
Project stack: <one-line summary>
|
|
119
|
-
fields:
|
|
120
|
-
severity: "low"
|
|
121
|
-
source: "kit-skill"
|
|
122
|
-
skill: "diagram"
|
|
123
|
-
tool: "read_graph"
|
|
124
|
-
response_summary: { layer, tables_count, error }
|
|
125
143
|
```
|
|
126
144
|
|
|
127
145
|
Then fall back: render a `flowchart` placeholder explaining "DB layer not available — re-run `npx launch-chart generate_graph` then retry" instead of the ERD.
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Generate a working HTML/JS prototype page and push it to launch-deck for click-through review. Use to validate behavior — flow, transitions, interactions — before any framework code is touched. Calls deck's rich-html block with framework=raw; supports CDN scripts, animations, real DOM events.
|
|
3
|
+
when_to_use: |
|
|
4
|
+
Auto-fire when the user wants an INTERACTIVE throwaway page to validate behavior — click flows, transitions, optimistic updates, keyboard shortcuts, drag/drop — before any production code. Trigger phrases: "prototype X", "let me click through Y", "build a working demo of Z", "test the interaction for X", "throwaway version of W", "make it interactive so I can try it", "show me how the kanban drag would feel". Deck is required because the deliverable is a rendered, clickable page the user must touch — text/code descriptions in the terminal don't substitute. Do NOT auto-fire for: production implementation (use the appropriate fe:* / be:* flow), static visual mockups (use /kit:wireframe), reading or explaining existing code behavior (use /kit:analyse), plain-text walkthroughs of an interaction that the user can read in the terminal, or any request that's clearly about discussion not artifact production.
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- mcp__launch-deck__server_status
|
|
7
|
+
- mcp__launch-deck__start_server
|
|
8
|
+
- mcp__launch-deck__deck
|
|
9
|
+
- mcp__launch-deck__await_feedback
|
|
10
|
+
- mcp__launch-chart__read_graph
|
|
11
|
+
- Bash
|
|
3
12
|
---
|
|
4
13
|
|
|
5
14
|
# /kit:prototype
|
|
@@ -74,10 +83,21 @@ Call `mcp__launch-deck__deck` with:
|
|
|
74
83
|
|
|
75
84
|
If `--feedback`, call `mcp__launch-deck__await_feedback` afterward and surface the response.
|
|
76
85
|
|
|
86
|
+
## Open in browser
|
|
87
|
+
|
|
88
|
+
After the push (and after `await_feedback` if `--feedback`), open the per-session URL so the user lands directly on this prototype:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
open "<deck-url>/#<session>" # macOS
|
|
92
|
+
xdg-open "<deck-url>/#<session>" # Linux
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
`<deck-url>` is the `url` returned by `mcp__launch-deck__server_status` (typically `http://localhost:52829`). The `#<session>` hash deep-links to this exact session.
|
|
96
|
+
|
|
77
97
|
## Output
|
|
78
98
|
|
|
79
99
|
```
|
|
80
|
-
prototype pushed — deck session "<session>" —
|
|
100
|
+
prototype pushed — deck session "<session>" — <deck-url>/#<session>
|
|
81
101
|
size: <N> KB markup, <M> CDN scripts, <K> inline event handlers
|
|
82
102
|
demonstrates: <one-line>
|
|
83
103
|
```
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Recover deleted, overwritten, or accidentally-modified files. Prefers launch-recall's shadow-git backup when wired (per-file snapshot history, debounced, doesn't need commits); falls back to git reflog / git stash / git log when recall isn't available. Read-only by default; restore is one-shot and prompts before overwriting. Never suggests destructive ops (git reset / git clean / rm) — recovery only.
|
|
3
|
+
when_to_use: |
|
|
4
|
+
Auto-fire whenever the user signals they've lost work or want to undo something on disk. Trigger phrases: "I lost X", "lost my changes", "deleted by mistake", "accidentally deleted / removed / overwrote", "auto-formatter ate", "prettier ate my comments", "can I get back / recover / restore X", "undo my last edit", "undo what I did to X", "go back to previous version", "previous version of X", "what was in X before", "revert this file", "rollback this file" (note: "rollback the deploy" is NOT this — that's deploy-check / orbit territory), "the file is gone", "where did X go" when framed as loss. Also auto-fire on manual subcommand usage: status / doctor / history / show / restore / diff / report. Do NOT auto-fire for: bug investigation ("why doesn't X work" → /kit:debug), code structure ("how does X work" → /kit:analyse), git workflow ("how do I commit / push / merge" → general git help).
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- mcp__launch-recall__recall_status
|
|
7
|
+
- mcp__launch-recall__recall_doctor
|
|
8
|
+
- mcp__launch-recall__recall_history
|
|
9
|
+
- mcp__launch-recall__recall_report
|
|
10
|
+
- Bash(git --git-dir=*)
|
|
11
|
+
- Bash(git reflog*)
|
|
12
|
+
- Bash(git stash list*)
|
|
13
|
+
- Bash(git log*)
|
|
14
|
+
- Bash(git show*)
|
|
15
|
+
- Bash(git diff*)
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# /kit:recovery
|
|
19
|
+
|
|
20
|
+
Recover deleted / overwritten / lost files. **Recall-first** when wired, **git-fallback** when not. Read-only except for `restore` (which prompts).
|
|
21
|
+
|
|
22
|
+
## Preflight — detect which path is available
|
|
23
|
+
|
|
24
|
+
Always start by checking which recovery backend is reachable. Run BOTH probes (cheap, in parallel):
|
|
25
|
+
|
|
26
|
+
1. `mcp__launch-recall__recall_status` → if it returns `{running: true, lastSnapshotAt: …}`, recall is the preferred path. Note the `watchTree` for context.
|
|
27
|
+
2. `Bash("git rev-parse --is-inside-work-tree 2>&1")` → confirms a regular git repo exists (for the fallback path and for cross-checks).
|
|
28
|
+
|
|
29
|
+
Surface what's available before doing anything else:
|
|
30
|
+
- Both available → use recall first, mention git as fallback.
|
|
31
|
+
- Only git available → tell user `"launch-recall not wired in this project — falling back to git reflog/log. (Recall would give you per-file history without needing commits. Run `npx @launchsecure/launch-kit refresh` to wire it.)"`
|
|
32
|
+
- Neither available → stop and surface that. Can't recover blind.
|
|
33
|
+
|
|
34
|
+
## Subcommand interface (manual invocation)
|
|
35
|
+
|
|
36
|
+
Parse `$ARGUMENTS` — first token is the subcommand. If the first token doesn't match any known subcommand, treat the whole input as a **natural-language recovery request** (see below).
|
|
37
|
+
|
|
38
|
+
- **status** — recall watcher liveness + last snapshot age (one line).
|
|
39
|
+
- **doctor** — recall health check (3-line report: shadow_repo / watcher_alive / recent_snapshot).
|
|
40
|
+
- **report** — project-wide recall stats (totalSnapshots, shadowSizeBytes, recentSnapshots).
|
|
41
|
+
- **history `<path>`** — `[--limit=N]` — snapshots for the path (recall) OR `git log -p -- <path>` rows (fallback). Default limit 20.
|
|
42
|
+
- **show `<path>` `<sha>`** — print the file at that snapshot (no write).
|
|
43
|
+
- **diff `<path>` `<sha>`** — unified diff vs current working tree (or "file deleted from working tree" if absent). Cap 500 lines.
|
|
44
|
+
- **restore `<path>` `<sha>`** — `[--to=<target-path>]` — restore the file. Strict confirmation protocol below.
|
|
45
|
+
|
|
46
|
+
Examples:
|
|
47
|
+
- `/kit:recovery status`
|
|
48
|
+
- `/kit:recovery history src/server/comms/build-feed.ts`
|
|
49
|
+
- `/kit:recovery show src/server/comms/build-feed.ts a1b2c3d`
|
|
50
|
+
- `/kit:recovery restore src/server/comms/build-feed.ts a1b2c3d`
|
|
51
|
+
- `/kit:recovery restore prisma/schema.prisma a1b2c3d --to=prisma/schema.recovered.prisma`
|
|
52
|
+
|
|
53
|
+
## Natural-language recovery flow (auto-invoke path)
|
|
54
|
+
|
|
55
|
+
When the user says "I lost X" / "deleted by mistake" / "prettier ate my comments" / "can I get back…", follow this loop:
|
|
56
|
+
|
|
57
|
+
1. **Identify the target**: parse the user's prompt for a file path. If absent, ask: `"Which file or directory? (full path from repo root)"`. Do not guess.
|
|
58
|
+
2. **Preflight** (see above) so you know which backend you're on.
|
|
59
|
+
3. **List options**:
|
|
60
|
+
- Recall path: `recall_history(path: <path>, limit: 20)` → table of `sha | age | message`.
|
|
61
|
+
- Git path: `git log --oneline -20 -- <path>` (committed) AND `git reflog | head -20` (recent HEAD moves) AND `git stash list` (stashes). Present each source separately so the user knows which kind of recovery they're picking.
|
|
62
|
+
4. **Show a candidate's content** before any restore: `show` the latest snapshot/commit so the user can confirm it's what they want.
|
|
63
|
+
5. **Confirm restore** per the protocol below. NEVER restore without explicit `yes`.
|
|
64
|
+
|
|
65
|
+
## Restore protocol (the only write operation)
|
|
66
|
+
|
|
67
|
+
1. Resolve target path: `--to=<target>` if given, else the original `<path>`.
|
|
68
|
+
2. If the target **exists on disk**:
|
|
69
|
+
- Print a side-by-side summary: `current size <N> bytes, snapshot size <M> bytes`.
|
|
70
|
+
- Show the first ~20 lines of the diff (current → snapshot).
|
|
71
|
+
- Ask: `"Overwrite <target>? (yes / show full diff / no)"` — wait for explicit `yes`.
|
|
72
|
+
3. If the target does **NOT exist** on disk (file was deleted), restore without prompt but tell the user before writing: `"Restoring deleted file to <target> from snapshot <sha>."`
|
|
73
|
+
4. Restore command:
|
|
74
|
+
- Recall path: `git --git-dir=<shadowRepoPath> --work-tree=<projectRoot> show <sha>:<path> > <target>`
|
|
75
|
+
- Git path: `git show <sha>:<path> > <target>` (against the regular repo)
|
|
76
|
+
5. After restore: `"Restored. (Recall — if active — just captured a new snapshot of the restore itself, so your prior working-tree state is also recoverable.)"`
|
|
77
|
+
|
|
78
|
+
## When recall is NOT wired — git fallback instructions
|
|
79
|
+
|
|
80
|
+
If `recall_status` says recall isn't running OR the MCP isn't reachable, walk the user through the git-only path:
|
|
81
|
+
|
|
82
|
+
- **Recently deleted file but no commit since**: `git checkout HEAD -- <path>` (restores from last commit). Confirm before running — this overwrites uncommitted changes if any exist.
|
|
83
|
+
- **Lost edits made after the last commit, no stash**: usually unrecoverable from git alone unless your editor has a local history feature (VS Code: "Timeline" view, JetBrains: "Local History"). Surface this honestly: `"Git only tracks what you commit. Your editor may have local history — check VS Code's Timeline or JetBrains' Local History panel for unsaved changes."`
|
|
84
|
+
- **File existed in a previous commit, deleted later**: `git log --oneline --all -- <path>` to find the last commit that contained it, then `git show <sha>:<path>` to view, then `git show <sha>:<path> > <path>` to restore.
|
|
85
|
+
- **Stashed changes**: `git stash list` to enumerate, `git stash show -p stash@{N}` to view, `git stash apply stash@{N}` to apply (non-destructive — keeps the stash).
|
|
86
|
+
- **Recent HEAD moves (force-push, rebase, reset)**: `git reflog` shows the prior positions. `git show <sha>:<path>` to view, then restore via `git show > file` (NOT `git reset --hard` — that moves your branch).
|
|
87
|
+
|
|
88
|
+
## Constraints
|
|
89
|
+
|
|
90
|
+
- **Read-only by default.** Only `restore` writes; everything else reads.
|
|
91
|
+
- **Restore requires explicit `yes` confirmation** when overwriting an existing file. Never auto-overwrite — per project memory `feedback_no_dumb_reverts`, destructive ops need explicit confirmation.
|
|
92
|
+
- **Never suggest `git reset --hard` / `git clean -f` / `rm` as recovery.** These DESTROY more state than they recover. Always restore via `git show > file` so the rest of the tree is untouched.
|
|
93
|
+
- **Never auto-init recall.** If recall isn't wired, point at `npx @launchsecure/launch-kit refresh` — don't run it for the user. Their project, their choice.
|
|
94
|
+
- **Surface both paths when both are available.** Recall has per-file granularity without needing commits; git has the canonical commit history. Sometimes the user wants the committed version, not the latest in-flight edit. Let them choose.
|
|
95
|
+
- **Quote both ambiguities when history is empty.** If `recall_history` returns nothing AND the file still exists, say BOTH "path may be in recall's ignore list" AND "file may simply have no churn" — don't guess.
|