@launchsecure/launch-kit 0.0.29 → 0.0.30
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 +2759 -1246
- package/dist/beacon/beacon.mjs.map +1 -1
- package/dist/beacon/beacon.umd.js +710 -95
- package/dist/beacon/beacon.umd.js.map +1 -1
- package/dist/beacon/types/core.d.ts +14 -0
- package/dist/beacon/types/core.d.ts.map +1 -0
- package/dist/beacon/types/ctx.d.ts +14 -0
- package/dist/beacon/types/ctx.d.ts.map +1 -0
- package/dist/beacon/types/element.d.ts +16 -48
- package/dist/beacon/types/element.d.ts.map +1 -1
- package/dist/beacon/types/index.d.ts +5 -4
- package/dist/beacon/types/index.d.ts.map +1 -1
- package/dist/beacon/types/internal/annotation-cache.d.ts +10 -0
- package/dist/beacon/types/internal/annotation-cache.d.ts.map +1 -0
- package/dist/beacon/types/internal/element-capture.d.ts +19 -0
- package/dist/beacon/types/internal/element-capture.d.ts.map +1 -0
- package/dist/beacon/types/internal/event-buffer.d.ts +16 -0
- package/dist/beacon/types/internal/event-buffer.d.ts.map +1 -0
- package/dist/beacon/types/internal/framework-detect.d.ts +6 -0
- package/dist/beacon/types/internal/framework-detect.d.ts.map +1 -0
- package/dist/beacon/types/internal/markers.d.ts +17 -0
- package/dist/beacon/types/internal/markers.d.ts.map +1 -0
- package/dist/beacon/types/internal/monitor/capture-dom.d.ts +14 -0
- package/dist/beacon/types/internal/monitor/capture-dom.d.ts.map +1 -0
- package/dist/beacon/types/internal/monitor/capture-network.d.ts +12 -0
- package/dist/beacon/types/internal/monitor/capture-network.d.ts.map +1 -0
- package/dist/beacon/types/internal/monitor/overlay.d.ts +16 -0
- package/dist/beacon/types/internal/monitor/overlay.d.ts.map +1 -0
- package/dist/beacon/types/internal/monitor/session.d.ts +41 -0
- package/dist/beacon/types/internal/monitor/session.d.ts.map +1 -0
- package/dist/beacon/types/{monitor → internal/monitor}/transport.d.ts +3 -3
- package/dist/beacon/types/internal/monitor/transport.d.ts.map +1 -0
- package/dist/beacon/types/{monitor/types.d.ts → internal/monitor/wire.d.ts} +69 -27
- package/dist/beacon/types/internal/monitor/wire.d.ts.map +1 -0
- package/dist/beacon/types/{ui → internal}/pick-mode-overlay.d.ts +4 -5
- package/dist/beacon/types/internal/pick-mode-overlay.d.ts.map +1 -0
- package/dist/beacon/types/{capture → internal}/picker.d.ts +0 -1
- package/dist/beacon/types/internal/picker.d.ts.map +1 -0
- package/dist/beacon/types/{ui → internal}/pin-popover.d.ts +1 -1
- package/dist/beacon/types/internal/pin-popover.d.ts.map +1 -0
- package/dist/beacon/types/{capture → internal}/screenshot.d.ts +1 -0
- package/dist/beacon/types/internal/screenshot.d.ts.map +1 -0
- package/dist/beacon/types/internal/selector.d.ts.map +1 -0
- package/dist/beacon/types/plugins/domEle.d.ts +14 -0
- package/dist/beacon/types/plugins/domEle.d.ts.map +1 -0
- package/dist/beacon/types/plugins/domSS.d.ts +8 -0
- package/dist/beacon/types/plugins/domSS.d.ts.map +1 -0
- package/dist/beacon/types/plugins/errors.d.ts +3 -0
- package/dist/beacon/types/plugins/errors.d.ts.map +1 -0
- package/dist/beacon/types/plugins/index.d.ts +8 -0
- package/dist/beacon/types/plugins/index.d.ts.map +1 -0
- package/dist/beacon/types/plugins/liveMonitor.d.ts +14 -0
- package/dist/beacon/types/plugins/liveMonitor.d.ts.map +1 -0
- package/dist/beacon/types/plugins/metadata.d.ts +3 -0
- package/dist/beacon/types/plugins/metadata.d.ts.map +1 -0
- package/dist/beacon/types/registry.d.ts +33 -0
- package/dist/beacon/types/registry.d.ts.map +1 -0
- package/dist/beacon/types/styles.d.ts +8 -0
- package/dist/beacon/types/styles.d.ts.map +1 -0
- package/dist/beacon/types/transport.d.ts +3 -0
- package/dist/beacon/types/transport.d.ts.map +1 -0
- package/dist/beacon/types/types.d.ts +152 -68
- package/dist/beacon/types/types.d.ts.map +1 -1
- package/dist/beacon/types/ui/dialog.d.ts +53 -0
- package/dist/beacon/types/ui/dialog.d.ts.map +1 -0
- package/dist/beacon/types/ui/form.d.ts +7 -0
- package/dist/beacon/types/ui/form.d.ts.map +1 -0
- package/dist/beacon/types/ui/overlay.d.ts +6 -0
- package/dist/beacon/types/ui/overlay.d.ts.map +1 -0
- package/dist/deck-client/assets/{_baseUniq-W2JQDmje.js → _baseUniq-DCt2IMRR.js} +1 -1
- package/dist/deck-client/assets/{arc-DIBWAId9.js → arc-h-ifqmNR.js} +1 -1
- package/dist/deck-client/assets/{architectureDiagram-Q4EWVU46-CAIRMvJK.js → architectureDiagram-Q4EWVU46-C9dITSPv.js} +1 -1
- package/dist/deck-client/assets/{blockDiagram-DXYQGD6D-BeNaNiOi.js → blockDiagram-DXYQGD6D-BHuJT34t.js} +1 -1
- package/dist/deck-client/assets/{c4Diagram-AHTNJAMY-B9Ozi62h.js → c4Diagram-AHTNJAMY-CpvMGtDG.js} +1 -1
- package/dist/deck-client/assets/channel-2PZVMiXf.js +1 -0
- package/dist/deck-client/assets/{chunk-4BX2VUAB-D7AZ47dt.js → chunk-4BX2VUAB-B6md1VIm.js} +1 -1
- package/dist/deck-client/assets/{chunk-4TB4RGXK-DnVnNPcI.js → chunk-4TB4RGXK-BmEnX8ik.js} +1 -1
- package/dist/deck-client/assets/{chunk-55IACEB6-UKYs-YNd.js → chunk-55IACEB6-BZPUyZAZ.js} +1 -1
- package/dist/deck-client/assets/{chunk-EDXVE4YY-D43b-SKn.js → chunk-EDXVE4YY-BWwNUK-l.js} +1 -1
- package/dist/deck-client/assets/{chunk-FMBD7UC4-QzBAoyyW.js → chunk-FMBD7UC4-o7gSppGI.js} +1 -1
- package/dist/deck-client/assets/{chunk-OYMX7WX6-Cjif4r6W.js → chunk-OYMX7WX6-C4KoTL5p.js} +1 -1
- package/dist/deck-client/assets/{chunk-QZHKN3VN-CqLDirEI.js → chunk-QZHKN3VN-jkf68sDs.js} +1 -1
- package/dist/deck-client/assets/{chunk-YZCP3GAM-_FQvmMs4.js → chunk-YZCP3GAM-Cd4yBE7o.js} +1 -1
- package/dist/deck-client/assets/classDiagram-6PBFFD2Q-Bt8xBAof.js +1 -0
- package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-Bt8xBAof.js +1 -0
- package/dist/deck-client/assets/clone-BHQryoDl.js +1 -0
- package/dist/deck-client/assets/{cose-bilkent-S5V4N54A-rfrocesE.js → cose-bilkent-S5V4N54A-DeGFUgAV.js} +1 -1
- package/dist/deck-client/assets/{dagre-KV5264BT-Bv_7DJat.js → dagre-KV5264BT-ekcYJuUV.js} +1 -1
- package/dist/deck-client/assets/{diagram-5BDNPKRD-4F1414G5.js → diagram-5BDNPKRD-YHPk4rV2.js} +1 -1
- package/dist/deck-client/assets/{diagram-G4DWMVQ6-C4-Pszqm.js → diagram-G4DWMVQ6-DM-JCd_B.js} +1 -1
- package/dist/deck-client/assets/{diagram-MMDJMWI5-B647TIx9.js → diagram-MMDJMWI5-l5FK1ybk.js} +1 -1
- package/dist/deck-client/assets/{diagram-TYMM5635-BFAqpezd.js → diagram-TYMM5635-CIN4_1-j.js} +1 -1
- package/dist/deck-client/assets/{erDiagram-SMLLAGMA-BfBfrJOC.js → erDiagram-SMLLAGMA-MyinSkEl.js} +1 -1
- package/dist/deck-client/assets/{flowDiagram-DWJPFMVM-DX9YAYes.js → flowDiagram-DWJPFMVM-Dk8nn42x.js} +1 -1
- package/dist/deck-client/assets/{ganttDiagram-T4ZO3ILL-DCuiy7wF.js → ganttDiagram-T4ZO3ILL-BU1ihicu.js} +1 -1
- package/dist/deck-client/assets/{gitGraphDiagram-UUTBAWPF-CGp1IXUh.js → gitGraphDiagram-UUTBAWPF-BjsTL13C.js} +1 -1
- package/dist/deck-client/assets/{graph-B7g8aoxv.js → graph-DJmh-xi7.js} +1 -1
- package/dist/deck-client/assets/{index-Dg1r-WSN.js → index-KsShfCV-.js} +3 -3
- package/dist/deck-client/assets/{infoDiagram-42DDH7IO-L3fahMkF.js → infoDiagram-42DDH7IO-Dxvy_RB4.js} +1 -1
- package/dist/deck-client/assets/{ishikawaDiagram-UXIWVN3A-aS_EjWBZ.js → ishikawaDiagram-UXIWVN3A-DPOaNF1l.js} +1 -1
- package/dist/deck-client/assets/{journeyDiagram-VCZTEJTY-djTSQZF9.js → journeyDiagram-VCZTEJTY-DMew3K5c.js} +1 -1
- package/dist/deck-client/assets/{kanban-definition-6JOO6SKY-CcTHo4CM.js → kanban-definition-6JOO6SKY-csciJFuk.js} +1 -1
- package/dist/deck-client/assets/{layout-mEJiadb7.js → layout-Dg4yyms2.js} +1 -1
- package/dist/deck-client/assets/{linear-XgTKqyRu.js → linear-BA3zU6gq.js} +1 -1
- package/dist/deck-client/assets/{min-Ct9jZdpd.js → min-lz-Ird-p.js} +1 -1
- package/dist/deck-client/assets/{mindmap-definition-QFDTVHPH-BaFxCGNU.js → mindmap-definition-QFDTVHPH-CCEN8OQV.js} +1 -1
- package/dist/deck-client/assets/{pieDiagram-DEJITSTG-CIbYYjtw.js → pieDiagram-DEJITSTG-DM6n1HY7.js} +1 -1
- package/dist/deck-client/assets/{quadrantDiagram-34T5L4WZ-D9EtCOvh.js → quadrantDiagram-34T5L4WZ-_ULoR66n.js} +1 -1
- package/dist/deck-client/assets/{requirementDiagram-MS252O5E-xeni9eVG.js → requirementDiagram-MS252O5E-BuwJs7Tn.js} +1 -1
- package/dist/deck-client/assets/{sankeyDiagram-XADWPNL6-LYeknz9h.js → sankeyDiagram-XADWPNL6-BEsuzkW4.js} +1 -1
- package/dist/deck-client/assets/{sequenceDiagram-FGHM5R23-RDbsKFZf.js → sequenceDiagram-FGHM5R23-CP2H0YWf.js} +1 -1
- package/dist/deck-client/assets/{stateDiagram-FHFEXIEX-BH1Zjglk.js → stateDiagram-FHFEXIEX-B5Gw_NNL.js} +1 -1
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-4T4wMDXr.js +1 -0
- package/dist/deck-client/assets/{timeline-definition-GMOUNBTQ-IFXxKptt.js → timeline-definition-GMOUNBTQ-DsoYydQa.js} +1 -1
- package/dist/deck-client/assets/{vennDiagram-DHZGUBPP-D-sLkQs9.js → vennDiagram-DHZGUBPP-Dz8JT_ob.js} +1 -1
- package/dist/deck-client/assets/wardley-RL74JXVD-DGHQ_Ijv.js +162 -0
- package/dist/deck-client/assets/{wardleyDiagram-NUSXRM2D-BTjjuDU3.js → wardleyDiagram-NUSXRM2D-DN1LJMB1.js} +1 -1
- package/dist/deck-client/assets/{xychartDiagram-5P7HB3ND-AYbv92n-.js → xychartDiagram-5P7HB3ND-nb0oSfrQ.js} +1 -1
- package/dist/deck-client/index.html +1 -1
- package/dist/server/beacon-monitor-entry.js +548 -6
- package/dist/server/chart-serve.js +917 -248
- package/dist/server/cli.js +1368 -374
- package/dist/server/council-entry.js +0 -0
- package/dist/server/fb-wizard.js +0 -0
- package/dist/server/graph-mcp-entry.js +1326 -322
- package/dist/server/init-entry.js +16 -11
- package/dist/server/orbit-entry.js +135 -7
- package/dist/server/parse-worker-entry.js +918 -247
- package/package.json +22 -22
- package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-array.md +107 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-clear.md +94 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-pulse.md +82 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-scan.md +66 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/blast-radius.md +101 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/brief.md +112 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/course.md +84 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/debug.md +92 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/deploy-check.md +160 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/diagram.md +134 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/orbit.md +87 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/prototype.md +90 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/recall.md +83 -0
- package/scaffolds/ls-marketplace/plugins/kit/{commands → skills}/show-mcp-status.md +4 -4
- package/scaffolds/ls-marketplace/plugins/kit/skills/wireframe.md +70 -0
- package/scaffolds/migrate-safety/scripts/migrate-with-backup.sh +0 -0
- package/scaffolds/recall-hook/scripts/ensure-recall.sh +0 -0
- package/scaffolds/statusline/statusline-mcp.sh +21 -9
- package/dist/beacon/types/capture/element.d.ts +0 -3
- package/dist/beacon/types/capture/element.d.ts.map +0 -1
- package/dist/beacon/types/capture/events.d.ts +0 -20
- package/dist/beacon/types/capture/events.d.ts.map +0 -1
- package/dist/beacon/types/capture/framework.d.ts +0 -3
- package/dist/beacon/types/capture/framework.d.ts.map +0 -1
- package/dist/beacon/types/capture/metadata.d.ts +0 -3
- package/dist/beacon/types/capture/metadata.d.ts.map +0 -1
- package/dist/beacon/types/capture/overlay.d.ts +0 -7
- package/dist/beacon/types/capture/overlay.d.ts.map +0 -1
- package/dist/beacon/types/capture/picker.d.ts.map +0 -1
- package/dist/beacon/types/capture/screenshot.d.ts.map +0 -1
- package/dist/beacon/types/capture/selector.d.ts.map +0 -1
- package/dist/beacon/types/monitor/dom.d.ts +0 -13
- package/dist/beacon/types/monitor/dom.d.ts.map +0 -1
- package/dist/beacon/types/monitor/index.d.ts +0 -19
- package/dist/beacon/types/monitor/index.d.ts.map +0 -1
- package/dist/beacon/types/monitor/network.d.ts +0 -12
- package/dist/beacon/types/monitor/network.d.ts.map +0 -1
- package/dist/beacon/types/monitor/transport.d.ts.map +0 -1
- package/dist/beacon/types/monitor/types.d.ts.map +0 -1
- package/dist/beacon/types/transport/submit.d.ts +0 -3
- package/dist/beacon/types/transport/submit.d.ts.map +0 -1
- package/dist/beacon/types/ui/button.d.ts +0 -2
- package/dist/beacon/types/ui/button.d.ts.map +0 -1
- package/dist/beacon/types/ui/drawer.d.ts +0 -33
- package/dist/beacon/types/ui/drawer.d.ts.map +0 -1
- package/dist/beacon/types/ui/icons.d.ts +0 -9
- package/dist/beacon/types/ui/icons.d.ts.map +0 -1
- package/dist/beacon/types/ui/monitor-panel.d.ts +0 -19
- package/dist/beacon/types/ui/monitor-panel.d.ts.map +0 -1
- package/dist/beacon/types/ui/pick-mode-overlay.d.ts.map +0 -1
- package/dist/beacon/types/ui/pin-popover.d.ts.map +0 -1
- package/dist/deck-client/assets/channel-CRdozqbp.js +0 -1
- package/dist/deck-client/assets/classDiagram-6PBFFD2Q-lIZMp57W.js +0 -1
- package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-lIZMp57W.js +0 -1
- package/dist/deck-client/assets/clone-BtWeSTyJ.js +0 -1
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-BrV78NDR.js +0 -1
- package/dist/deck-client/assets/wardley-RL74JXVD-C010F8l4.js +0 -162
- package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-array.md +0 -92
- package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-clear.md +0 -68
- package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-pulse.md +0 -80
- package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-scan.md +0 -62
- /package/dist/beacon/types/{capture → internal}/selector.d.ts +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@launchsecure/launch-kit",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.30",
|
|
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,23 +56,6 @@
|
|
|
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 && 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:chart": "pnpm build:server && pnpm build:chart-client && node dist/server/graph-mcp-entry.js serve",
|
|
72
|
-
"dev:server": "pnpm build:server && node dist/server/cli.js",
|
|
73
|
-
"dev": "pnpm build:server && concurrently -k -n client,server -c cyan,magenta \"vite\" \"node dist/server/cli.js\"",
|
|
74
|
-
"prepublishOnly": "pnpm build"
|
|
75
|
-
},
|
|
76
59
|
"files": [
|
|
77
60
|
"dist",
|
|
78
61
|
"prompts",
|
|
@@ -84,6 +67,7 @@
|
|
|
84
67
|
"html-to-image": "^1.11.13",
|
|
85
68
|
"node-pty": "^1.2.0-beta.12",
|
|
86
69
|
"pg": "^8.13.0",
|
|
70
|
+
"pgsql-parser": "^17.9.15",
|
|
87
71
|
"tree-sitter": "^0.21.1",
|
|
88
72
|
"tree-sitter-typescript": "^0.23.2",
|
|
89
73
|
"typescript": "^5.5.0",
|
|
@@ -92,8 +76,6 @@
|
|
|
92
76
|
"ws": "^8.18.0"
|
|
93
77
|
},
|
|
94
78
|
"devDependencies": {
|
|
95
|
-
"@launchsecure/claude-code-web": "workspace:*",
|
|
96
|
-
"@launchsecure/ui": "workspace:*",
|
|
97
79
|
"@types/node": "^20.0.0",
|
|
98
80
|
"@types/pg": "^8.11.10",
|
|
99
81
|
"@types/react": "^18.3.12",
|
|
@@ -117,6 +99,24 @@
|
|
|
117
99
|
"react-router-dom": "^6.28.0",
|
|
118
100
|
"tailwindcss": "^3.4.19",
|
|
119
101
|
"vite": "^5.4.11",
|
|
120
|
-
"vitest": "^1.6.0"
|
|
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\""
|
|
121
121
|
}
|
|
122
|
-
}
|
|
122
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Show the array of launch-beacon monitor sessions via the launch-beacon MCP — which is most recent, how many events each has, last event time, suspected liveness. Use to confirm a session is being recorded, find an old session to inspect, or audit disk usage. Read-only.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /kit:beacon-array
|
|
6
|
+
|
|
7
|
+
Liveness + inventory across every `launch-beacon monitor` session this repo has recorded — one row per beacon in the array.
|
|
8
|
+
|
|
9
|
+
Parse `$ARGUMENTS` as space-separated tokens, in any order:
|
|
10
|
+
- `full` — expanded report. Empty → terse one-line-per-session summary.
|
|
11
|
+
- `--worktree=<slug>` — orbit worktree slug. Forwarded to MCP as the `worktree` arg.
|
|
12
|
+
- `--project_root=<path>` — explicit project root (absolute, or relative to cwd). Forwarded as `project_root`. Takes precedence over `--worktree`.
|
|
13
|
+
|
|
14
|
+
Examples:
|
|
15
|
+
- `/kit:beacon-array` → terse one-line-per-session summary
|
|
16
|
+
- `/kit:beacon-array full` → expanded report
|
|
17
|
+
- `/kit:beacon-array --worktree=beacon_rewrite` → enumerate sessions captured in that worktree
|
|
18
|
+
- `/kit:beacon-array full --worktree=beacon_rewrite` → expanded report for that worktree
|
|
19
|
+
|
|
20
|
+
## Enumerate sessions
|
|
21
|
+
|
|
22
|
+
Call `mcp__local-launch-beacon__beacon_sessions`, forwarding `worktree` / `project_root` if supplied. Returns an array of per-session summaries: token, event count, kind breakdown, first/last seq, last event timestamp.
|
|
23
|
+
|
|
24
|
+
If the response is `{sessions: []}` OR `{error: ...}`, **alert the user with the exact MCP error string**, then walk the fallback below — do NOT silently `ls`.
|
|
25
|
+
|
|
26
|
+
**Fallback when the MCP returns nothing:**
|
|
27
|
+
1. If the user did NOT pass `--worktree` / `--project_root` and `launch-orbit` has worktrees registered for this repo, suggest re-running with `--worktree=<slug>` before falling back to the filesystem.
|
|
28
|
+
2. Look for `.launchsecure/beacon-*.ndjson` in cwd, then in up to 2 parent dirs. Use the `Read` tool — never `ls`, `find`, or globbing as the primary path.
|
|
29
|
+
3. If files are found at an alternative path, tell the user the path mismatch explicitly: `"MCP scans <root>/.launchsecure/ but sessions live at <found-path>. Reading directly."`
|
|
30
|
+
4. If nothing is found anywhere, stop with: `"No beacon sessions found in .launchsecure/. Start one with: npx launch-beacon monitor"`.
|
|
31
|
+
|
|
32
|
+
## Per-session facts
|
|
33
|
+
|
|
34
|
+
For each session the MCP returns:
|
|
35
|
+
- **token** — session id
|
|
36
|
+
- **events** — total event count
|
|
37
|
+
- **last_ts** — last event timestamp (epoch ms)
|
|
38
|
+
- **last_kind** — kind of the last event (read from the kind breakdown's most-recent entry, or call `beacon_event(seq: last_seq)` for certainty)
|
|
39
|
+
- **kinds** — kind breakdown map (`{click: 142, fetch: 71, …}`)
|
|
40
|
+
- **first_seq / last_seq** — bounds
|
|
41
|
+
|
|
42
|
+
Compute **age** from `last_ts` (current epoch minus `last_ts`):
|
|
43
|
+
- < 5s → "just now"
|
|
44
|
+
- < 60s → "Ns ago"
|
|
45
|
+
- < 1h → "Nm ago"
|
|
46
|
+
- < 24h → "Nh ago"
|
|
47
|
+
- else → "Nd ago"
|
|
48
|
+
|
|
49
|
+
## Liveness heuristic
|
|
50
|
+
|
|
51
|
+
- **active** — `last_ts` is within the last 5 seconds (matches the receiver's batch-flush interval)
|
|
52
|
+
- **idle** — between 5 seconds and 30 minutes
|
|
53
|
+
- **stale** — older than 30 minutes (the receiver enforces a 30-min cap)
|
|
54
|
+
|
|
55
|
+
## Default output (no arguments)
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
.launchsecure/
|
|
59
|
+
● 8f3c2a91 247 events click (just now) ACTIVE
|
|
60
|
+
a1b2c3d4 89 events error (12m ago) idle
|
|
61
|
+
2557799f 1,247 events route (2h ago) stale
|
|
62
|
+
|
|
63
|
+
3 sessions, 1 active.
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Rules:
|
|
67
|
+
- Glyph: `●` (filled) for active, blank for idle/stale.
|
|
68
|
+
- Columns: token (8 chars) — events (right-aligned, thousands-separated) — last event "kind (age)" — status word.
|
|
69
|
+
- Sort newest-first by `last_ts`.
|
|
70
|
+
- Summary line: total count + how many active.
|
|
71
|
+
- Plain text, monospace alignment.
|
|
72
|
+
|
|
73
|
+
## Full output (`/kit:beacon-array full`)
|
|
74
|
+
|
|
75
|
+
Same per-session block as default, then expand each:
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
● 8f3c2a91 — ACTIVE
|
|
79
|
+
events: 247
|
|
80
|
+
last event: 2026-05-26T12:20:51Z (just now)
|
|
81
|
+
last kind: click
|
|
82
|
+
kinds: click 142, fetch 71, route 12, error 3, dialog 9, probe 10
|
|
83
|
+
seq range: 1–247
|
|
84
|
+
started: 2026-05-26T12:12:33Z (8m ago)
|
|
85
|
+
|
|
86
|
+
a1b2c3d4 — idle
|
|
87
|
+
...
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
For the `started` timestamp, call `mcp__local-launch-beacon__beacon_event` with `seq: <first_seq>, session: <token>` (and forward the same `worktree` / `project_root` args you used on `beacon_sessions`) and read its `ts`. Only do this for the full view — skip in the default view to keep it sub-second.
|
|
91
|
+
|
|
92
|
+
`kinds:` formatted as `kind1 N1, kind2 N2, …` sorted by count desc, comma-separated.
|
|
93
|
+
|
|
94
|
+
End with the same summary line as default.
|
|
95
|
+
|
|
96
|
+
## File size
|
|
97
|
+
|
|
98
|
+
The `beacon_sessions` summary does NOT include byte size. Both default and full views omit it — size isn't load-bearing for diagnosis. If the user explicitly asks ("how big is this file?"), fall back to `Read`-then-count or `wc -c` for that single file and tell them so: `"MCP doesn't expose byte size — falling back to wc -c."`.
|
|
99
|
+
|
|
100
|
+
## Constraints
|
|
101
|
+
|
|
102
|
+
- **MCP-first.** Use `beacon_sessions` and `beacon_event` — never `ls`, `wc`, `stat`, `tail`, `sed` as the primary path.
|
|
103
|
+
- **Alert on fallback.** If the MCP can't answer, say so verbatim before reading the files directly.
|
|
104
|
+
- **Read-only.** No deletion, no rotation, no auto-cleanup.
|
|
105
|
+
- **Fast.** Default view should be sub-second even with many sessions.
|
|
106
|
+
- **Plain text.** No markdown tables, no fenced blocks in the actual output.
|
|
107
|
+
- **Don't suggest cleanup.** That's `/kit:beacon-clear`'s job. Stale sessions are informational, not an error.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Soft-delete launch-beacon monitor session NDJSON files. Default clears only the latest session (so you can start a clean repro); pass `all` to clear every `.launchsecure/beacon-*.ndjson`. Always shows what will be cleared and asks for confirmation. Recoverable from `.launchsecure/.trash/<ts>/`.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /kit:beacon-clear
|
|
6
|
+
|
|
7
|
+
Clean slate before a fresh repro. The receiver appends to the same NDJSON file across reconnects of the same session, so an existing file accumulates noise from earlier attempts — clearing first makes the new stream easier to reason about.
|
|
8
|
+
|
|
9
|
+
Parse `$ARGUMENTS` as space-separated tokens, in any order:
|
|
10
|
+
- empty → clear the most recent session file only
|
|
11
|
+
- `all` → clear every `.launchsecure/beacon-*.ndjson` in the target dir
|
|
12
|
+
- a specific token or filename → clear that one file (must match a real path)
|
|
13
|
+
- `--worktree=<slug>` — orbit worktree slug. Forwarded to MCP as the `worktree` arg; the soft-delete acts on the worktree's `.launchsecure/`.
|
|
14
|
+
- `--project_root=<path>` — explicit project root (absolute, or relative to cwd). Forwarded as `project_root`. Takes precedence over `--worktree`.
|
|
15
|
+
|
|
16
|
+
Examples:
|
|
17
|
+
- `/kit:beacon-clear` → clear the most recent session in cwd's `.launchsecure/`
|
|
18
|
+
- `/kit:beacon-clear all` → clear every session in cwd's `.launchsecure/`
|
|
19
|
+
- `/kit:beacon-clear all --worktree=beacon_rewrite` → clear every session in that worktree's `.launchsecure/`
|
|
20
|
+
|
|
21
|
+
## Enumerate candidates
|
|
22
|
+
|
|
23
|
+
Call `mcp__local-launch-beacon__beacon_sessions`, forwarding `worktree` / `project_root` if supplied. Use `token`, `last_ts`, `events`, and `path` (absolute) from the response. **The filesystem operations below MUST use `path` from this response — never reconstruct paths from `.launchsecure/beacon-<token>.ndjson` relative to cwd**, because with `--worktree` / `--project_root` the real directory is elsewhere.
|
|
24
|
+
|
|
25
|
+
If the response is `{sessions: []}` OR `{error: ...}`, **alert the user with the exact MCP error string**, then walk the fallback below — do NOT silently `ls`.
|
|
26
|
+
|
|
27
|
+
**Fallback when the MCP returns nothing:**
|
|
28
|
+
1. If the user did NOT pass `--worktree` / `--project_root` and `launch-orbit` has worktrees registered for this repo, suggest re-running with `--worktree=<slug>` before falling back to the filesystem.
|
|
29
|
+
2. Look for `.launchsecure/beacon-*.ndjson` in cwd, then in up to 2 parent dirs. Use the `Read` tool — never `ls`, `find`, or globbing as the primary path.
|
|
30
|
+
3. If files are found at an alternative path, tell the user the path mismatch and ASK before proceeding — the user may not want to clear files at an unexpected location.
|
|
31
|
+
4. If nothing is found anywhere, stop with: `"No beacon sessions found in .launchsecure/. Nothing to clear."`.
|
|
32
|
+
|
|
33
|
+
## Decide target set
|
|
34
|
+
|
|
35
|
+
- empty → most-recent session (highest `last_ts`)
|
|
36
|
+
- `all` → every session the MCP returned
|
|
37
|
+
- otherwise → resolve `$ARGUMENTS` to a single token: try the literal arg first as a session id, then strip a `.ndjson` suffix, then try matching against the filename portion of a path containing `beacon-<token>.ndjson`. Refuse with a clear message if none match.
|
|
38
|
+
|
|
39
|
+
## Refusal rules
|
|
40
|
+
|
|
41
|
+
Refuse with a clear message if:
|
|
42
|
+
- the target set is empty
|
|
43
|
+
- any target resolves outside `.launchsecure/` (defence against `..` injection from `$ARGUMENTS` — even if the user passes an absolute path)
|
|
44
|
+
- the active session is being written *right now* (`last_ts` within the last 5 seconds) — print a one-line warning and ask the user to stop the monitor first:
|
|
45
|
+
```
|
|
46
|
+
⚠ .launchsecure/beacon-8f3c2a91.ndjson was last written 2s ago — looks active.
|
|
47
|
+
Stop the receiver (Ctrl+C in the launch-beacon monitor terminal) and re-run /kit:beacon-clear.
|
|
48
|
+
```
|
|
49
|
+
The user can still force by passing the token explicitly — but never silently nuke an actively-written file.
|
|
50
|
+
|
|
51
|
+
## Confirmation
|
|
52
|
+
|
|
53
|
+
Print what's about to be moved and ask before doing it.
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
About to soft-delete 1 file:
|
|
57
|
+
.launchsecure/beacon-a1b2c3d4.ndjson 89 events, 12m ago
|
|
58
|
+
|
|
59
|
+
Recoverable from .launchsecure/.trash/<UTC-timestamp>/ until manually purged.
|
|
60
|
+
|
|
61
|
+
Confirm? (y/N)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
For `all`, list every file with event count + age. Don't truncate.
|
|
65
|
+
|
|
66
|
+
Wait for explicit `y`/`yes`. Anything else → abort with `Cancelled. No files were moved.`
|
|
67
|
+
|
|
68
|
+
## Soft-delete (move, don't rm)
|
|
69
|
+
|
|
70
|
+
Create `<sessionDir>/.trash/<UTC-ISO-timestamp>/` and `mv` each target into it, where `<sessionDir>` is `dirname(path)` from the `beacon_sessions` response — NOT a hard-coded `.launchsecure/`. This matters when `--worktree` or `--project_root` was passed, because the dir is then the worktree's `.launchsecure/`, not cwd's. **Never `rm`.** This is the mitigation for the recall coverage gap — recall doesn't snapshot `.launchsecure/*` today (tracked in LS work item #144). Soft-delete preserves the option to recover within the same machine.
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
SESSION_DIR=$(dirname "<path-from-beacon_sessions>") # e.g. /repo/.claude/worktrees/foo/.launchsecure
|
|
74
|
+
TRASH="$SESSION_DIR/.trash/$(date -u +%Y%m%dT%H%M%SZ)"
|
|
75
|
+
mkdir -p "$TRASH"
|
|
76
|
+
mv "$SESSION_DIR/beacon-<token>.ndjson" "$TRASH/"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
After the move, print:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
✓ moved 1 file to .launchsecure/.trash/20260526T142233Z/ (89 events archived).
|
|
83
|
+
Recover with: mv .launchsecure/.trash/20260526T142233Z/beacon-a1b2c3d4.ndjson .launchsecure/
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
For `all`, print the count and the trash dir once; don't list every recovery command.
|
|
87
|
+
|
|
88
|
+
## Constraints
|
|
89
|
+
|
|
90
|
+
- **MCP-first for enumeration.** Use `beacon_sessions` — never `ls` as the primary path.
|
|
91
|
+
- **Destructive — always confirm.** Even if `$ARGUMENTS` is `all`, ask first.
|
|
92
|
+
- **Scope-locked to the session dir.** The session dir is `dirname(path)` from `beacon_sessions` (typically `.launchsecure/`, but `<worktree>/.launchsecure/` when `--worktree`/`--project_root` is passed). Reject any target outside the dir the MCP told you about, even if the user passes an absolute path. We never touch files we didn't write.
|
|
93
|
+
- **Soft-delete only.** Never `rm` — always `mv` into `.launchsecure/.trash/<ts>/`. The trash dir is not auto-pruned; cleaning it up is a deliberate user action.
|
|
94
|
+
- **Don't stop the monitor server.** This command only moves files. The receiver keeps running and will reopen the same file on its next write — which is fine, the file just starts empty again.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Show the most recent failure from the active launch-beacon monitor session, plus the N events that preceded it (default 10). Answers "what was happening when it broke" without scrolling through the full stream. Read-only.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /kit:beacon-pulse
|
|
6
|
+
|
|
7
|
+
The "what happened just before this failure" command — a single pulse, freezing the moment the beacon caught a failure. When a bug fires, the actual story is usually the chain of events leading up to it: the click that triggered a state change, the failed fetch that left auth in a bad state, the route change that mounted the wrong component.
|
|
8
|
+
|
|
9
|
+
A "failure" here is anything `mcp__local-launch-beacon__beacon_failures` returns — window errors, unhandled rejections, fetch/xhr with status ≥ 400 or thrown, and clicks where overlay interception blocked the intended target. Broader than just `kind=error`; matches what users mean when they say "something broke."
|
|
10
|
+
|
|
11
|
+
Parse `$ARGUMENTS` as space-separated tokens, in any order:
|
|
12
|
+
- An optional **integer** — the count of preceding events to include. Default 10. Cap at 50 (the `beacon_correlate.before` tool limit).
|
|
13
|
+
- `--worktree=<slug>` — orbit worktree slug. Forwarded to every MCP call as the `worktree` arg.
|
|
14
|
+
- `--project_root=<path>` — explicit project root (absolute, or relative to cwd). Forwarded as `project_root`. Takes precedence over `--worktree`.
|
|
15
|
+
|
|
16
|
+
Examples:
|
|
17
|
+
- `/kit:beacon-pulse` → 10 events before the latest failure
|
|
18
|
+
- `/kit:beacon-pulse 25` → 25 events before
|
|
19
|
+
- `/kit:beacon-pulse --worktree=beacon_rewrite` → query a worktree's session
|
|
20
|
+
|
|
21
|
+
## Locate the most recent failure
|
|
22
|
+
|
|
23
|
+
Call `mcp__local-launch-beacon__beacon_failures` with `limit: 1` (and `worktree` / `project_root` if the user supplied them). The tool implicitly targets the most recent session.
|
|
24
|
+
|
|
25
|
+
If the response is `{error: "no session found"}` OR an empty failures array, **alert the user with the exact MCP error string**, then walk the fallback below — do NOT silently grep. The MCP can come up empty for two non-bug reasons: (a) no session has been started, (b) the session NDJSON lives outside the MCP's watch root (e.g. inside an orbit worktree the user didn't name).
|
|
26
|
+
|
|
27
|
+
**Fallback when the MCP returns nothing:**
|
|
28
|
+
1. If the user did NOT pass `--worktree` / `--project_root` and `launch-orbit` has worktrees registered for this repo, suggest re-running with `--worktree=<slug>` before falling back to the filesystem.
|
|
29
|
+
2. Look for `.launchsecure/beacon-*.ndjson` in cwd, then in up to 2 parent dirs. Use the `Read` tool to inspect the most-recently-modified matching file — do NOT use `grep`, `find`, or `ls` as the primary path.
|
|
30
|
+
3. If files are found at an alternative path, tell the user the path mismatch explicitly: `"MCP scans <root>/.launchsecure/ but the session lives at <found-path>. Reading directly."`
|
|
31
|
+
4. If nothing is found anywhere, stop with: `"No beacon sessions found. Start one with: npx launch-beacon monitor"`.
|
|
32
|
+
|
|
33
|
+
Capture the failure's `seq`, `kind`, `ts`, and message.
|
|
34
|
+
|
|
35
|
+
## Pull the context window
|
|
36
|
+
|
|
37
|
+
Call `mcp__local-launch-beacon__beacon_correlate` with `seq: <failure.seq>`, `before: N`, `after: 0`, plus the same `worktree` / `project_root` args you used on `beacon_failures`. The tool returns event summaries directly — no JSON parsing required.
|
|
38
|
+
|
|
39
|
+
If a context event's summary is missing detail you need for analysis (truncated stack, missing response body, selector chain), call `mcp__local-launch-beacon__beacon_event` with that event's specific `seq` for the full JSON — and forward the same root args. Only do this when the summary is insufficient — not unconditional.
|
|
40
|
+
|
|
41
|
+
## Output
|
|
42
|
+
|
|
43
|
+
Render a **timeline** with the failure visually separated at the bottom:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
session: <token>
|
|
47
|
+
window: N events before failure at seq <seq>
|
|
48
|
+
|
|
49
|
+
12:34:51 click button.submit-btn
|
|
50
|
+
12:34:51 fetch POST 401 /api/sessions (120ms) FAILED
|
|
51
|
+
12:34:51 fetch GET 401 /api/me (45ms) FAILED
|
|
52
|
+
12:34:52 route /login → /dashboard (pushState)
|
|
53
|
+
...
|
|
54
|
+
|
|
55
|
+
╴╴╴╴ FAILURE ╴╴╴╴
|
|
56
|
+
12:34:53 error Cannot read properties of undefined (reading 'orgSlug')
|
|
57
|
+
at apps/Console.tsx:42:18
|
|
58
|
+
stack: Console.render
|
|
59
|
+
React.renderWithHooks
|
|
60
|
+
React.beginWork
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Format rules:
|
|
64
|
+
- One line per event, same SUMMARY format as `/kit:beacon-scan`.
|
|
65
|
+
- The failure block at the end gets the message + (truncated) stack frames if present. For fetch/xhr failures, include method + status + url + response body summary.
|
|
66
|
+
- Separator above the failure is the visual cue.
|
|
67
|
+
|
|
68
|
+
After the timeline, write **one short paragraph** of analysis: what does the chain *look* like? Common patterns:
|
|
69
|
+
- 401s → error referencing user/org → "auth expired or org context missing"
|
|
70
|
+
- click → no observable effect → click again → error → "first click handler crashed silently; second click landed on something else"
|
|
71
|
+
- route change → error → "component on the new route blew up during initial render"
|
|
72
|
+
- repeated 400s on the same endpoint → "request shape mismatch — check the server's Zod schema against the client payload"
|
|
73
|
+
|
|
74
|
+
Don't dive into a fix — name the suspected proximate cause, suggest one concrete next step (which file to read, which probe to add, which `/kit:beacon-scan <kind>` to drill into).
|
|
75
|
+
|
|
76
|
+
## Constraints
|
|
77
|
+
|
|
78
|
+
- **MCP-first.** Use `beacon_failures`, `beacon_correlate`, `beacon_event` — never `grep`, `find`, `ls`, `sed`, `cut`, or `tail` as the primary path.
|
|
79
|
+
- **Alert on fallback.** If the MCP can't answer, say so verbatim before reading the file directly.
|
|
80
|
+
- **Read-only.**
|
|
81
|
+
- **Most recent failure only.** For an earlier one, clear the session (`/kit:beacon-clear`) and reproduce, or use `/kit:beacon-scan error` / `/kit:beacon-scan fetch` to browse.
|
|
82
|
+
- **Plain text.** Same monospace conventions as `/kit:beacon-scan`.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Scan recent events from the active launch-beacon monitor session via the launch-beacon MCP. Defaults to last 50 events across all kinds; pass a kind (`error`, `click`, `fetch`, `route`, `dialog`, `probe`, etc.) to filter, and/or a numeric limit. Read-only.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /kit:beacon-scan
|
|
6
|
+
|
|
7
|
+
Recent runtime events captured by a `launch-beacon monitor` session. Use this as the first step when investigating something that just happened in the browser — clicks, failed network calls, errors, route changes, probe() calls, dialog mount/unmount.
|
|
8
|
+
|
|
9
|
+
Parse `$ARGUMENTS` as space-separated tokens, in any order:
|
|
10
|
+
- A **kind filter**: one of `error`, `unhandledrejection`, `fetch`, `xhr`, `click`, `mousedown`, `route`, `dialog`, `submit`, `probe`. Anything else that doesn't parse as an integer or a known `--flag` is treated as an explicit session token.
|
|
11
|
+
- A **limit**: integer. Default 50. Hard cap 500 (the `beacon_recent.limit` tool ceiling).
|
|
12
|
+
- An explicit **session token** (8-char hex like `8f3c2a91`) — passed straight through as the `session` MCP arg.
|
|
13
|
+
- `--worktree=<slug>` — orbit worktree slug (from `launch-orbit create`). Forwarded to the MCP as the `worktree` arg so a Claude session pinned to the main repo can read sessions captured inside a worktree.
|
|
14
|
+
- `--project_root=<path>` — explicit project root (absolute, or relative to cwd). Forwarded to the MCP as `project_root`. Takes precedence over `--worktree`.
|
|
15
|
+
|
|
16
|
+
Examples:
|
|
17
|
+
- `/kit:beacon-scan` → last 50 events of any kind from the latest session
|
|
18
|
+
- `/kit:beacon-scan error` → last 50 errors only
|
|
19
|
+
- `/kit:beacon-scan click 20` → last 20 click events
|
|
20
|
+
- `/kit:beacon-scan 100` → last 100 events of any kind
|
|
21
|
+
- `/kit:beacon-scan fetch 50 8f3c2a91` → last 50 fetches from a specific session
|
|
22
|
+
- `/kit:beacon-scan fetch --worktree=beacon_rewrite` → last 50 fetches captured in that worktree
|
|
23
|
+
|
|
24
|
+
## Scan
|
|
25
|
+
|
|
26
|
+
Call `mcp__local-launch-beacon__beacon_recent` with `kind: <kind?>`, `limit: <limit>`, `session: <session?>`, plus `worktree: <slug?>` and `project_root: <path?>` if the user supplied them. The tool defaults to the most-recent session and returns one compact summary line per event.
|
|
27
|
+
|
|
28
|
+
If the response is `{error: "no session found"}` OR an empty events array, **alert the user with the exact MCP error string**, then walk the fallback below — do NOT silently grep.
|
|
29
|
+
|
|
30
|
+
**Fallback when the MCP returns nothing:**
|
|
31
|
+
1. If the user did NOT pass `--worktree` / `--project_root` and the cwd is the main repo of a project that has worktrees registered with `launch-orbit`, suggest re-running with `--worktree=<slug>` before falling back to the filesystem — that's usually the actual fix and avoids a wrong-directory scan.
|
|
32
|
+
2. Look for `.launchsecure/beacon-*.ndjson` in cwd, then in up to 2 parent dirs. Use the `Read` tool to inspect the most-recently-modified matching file — do NOT use `grep`, `find`, or `ls` as the primary path.
|
|
33
|
+
3. If files are found at an alternative path, tell the user the path mismatch explicitly: `"MCP scans <root>/.launchsecure/ but the session lives at <found-path>. Reading directly."`
|
|
34
|
+
4. If nothing is found anywhere, stop with: `"No beacon sessions found. Start one with: npx launch-beacon monitor"`.
|
|
35
|
+
|
|
36
|
+
## Output
|
|
37
|
+
|
|
38
|
+
Group events by **time** (most recent last — chronological matches user intuition for "what happened"). For each event, render one line:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
HH:MM:SS KIND SUMMARY
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Where SUMMARY is a one-liner pulled from the event body:
|
|
45
|
+
- **error / unhandledrejection** → `message` (truncate ≤ 80 chars)
|
|
46
|
+
- **fetch / xhr** → `METHOD status url (durationMs)` — flag `FAILED` if `failed:true`
|
|
47
|
+
- **click / mousedown** → `target.selector` and, when `hitMatchesTarget === false`, also append `(occluded by <hitTarget.selector>)` — that's exactly the diagnostic the user is here for
|
|
48
|
+
- **route** → `from → to (via)`
|
|
49
|
+
- **dialog** → `<action> <selector>` (e.g. `mount dialog#xyz` or `unmount section[role=dialog]`)
|
|
50
|
+
- **submit** → `<form selector> (preventDefault?)`
|
|
51
|
+
- **probe** → `<label>: <truncated JSON>`
|
|
52
|
+
|
|
53
|
+
If a summary line is missing detail you need (truncated response body, full selector chain, stack frames), call `mcp__local-launch-beacon__beacon_event` with that event's `seq` for the full JSON — and forward the same `worktree` / `project_root` args you used on `beacon_recent`. Only on demand — not unconditional.
|
|
54
|
+
|
|
55
|
+
After the timeline, if anything looks suspicious (clusters of failed network calls, a click followed by no observable effect, a `hitMatchesTarget:false` event, an unhandled rejection), call it out in **one short paragraph** at the end. Don't analyze every event — only surface the standouts.
|
|
56
|
+
|
|
57
|
+
If the buffer is empty after filtering, say so: `No events match that filter in <session>.`
|
|
58
|
+
|
|
59
|
+
## Constraints
|
|
60
|
+
|
|
61
|
+
- **MCP-first.** Use `beacon_recent` / `beacon_event` — never `grep`, `find`, `ls`, `tail`, `head` as the primary path.
|
|
62
|
+
- **Alert on fallback.** If the MCP can't answer, say so verbatim before reading the file directly.
|
|
63
|
+
- **Read-only.** Never delete, modify, or write to the NDJSON file. Wiping is `/kit:beacon-clear`.
|
|
64
|
+
- **Always use the latest session by default.** Pass an explicit token as the third arg only when the user wants a specific older session.
|
|
65
|
+
- **Plain text output.** Monospace alignment beats markdown tables here.
|
|
66
|
+
- **Don't speculate on root cause.** Surface anomalies; let the user direct the next query (often: `/kit:beacon-pulse` for context around the latest failure).
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
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
|
+
---
|
|
4
|
+
|
|
5
|
+
# /kit:blast-radius
|
|
6
|
+
|
|
7
|
+
Calculate the reverse-dependency blast radius for a target node and visualise it as an interactive radial graph in launch-deck. The graph centres on the target and rings out by hop distance across all project layers (db / api / ui / static / etc.).
|
|
8
|
+
|
|
9
|
+
Parse `$ARGUMENTS`:
|
|
10
|
+
- **target** (required) — a node id from the project graph (file path like `lib/permissions/types.ts`, table name like `User`, endpoint id like `POST /api/work-items`). If absent, ask the user.
|
|
11
|
+
- **hops=N** — max traversal depth. Default 2.
|
|
12
|
+
- **layer=<id>** — restrict to one layer when the same name exists in multiple layers (e.g. `layer=db`).
|
|
13
|
+
- **--session=<id>** — deck session name. Default `blast-<target-slug>`.
|
|
14
|
+
- **--mode=feature** — render with feature rings (modify / create / ripple) instead of the default structural rings (hop1 / hop2). Use when the radius represents planned change scope rather than pure structural reachability.
|
|
15
|
+
|
|
16
|
+
Examples:
|
|
17
|
+
- `/kit:blast-radius lib/permissions/types.ts`
|
|
18
|
+
- `/kit:blast-radius User layer=db hops=3`
|
|
19
|
+
- `/kit:blast-radius POST /api/work-items --mode=feature`
|
|
20
|
+
|
|
21
|
+
## Preflight
|
|
22
|
+
|
|
23
|
+
1. Confirm both MCPs are wired — `mcp__launch-chart__chart_server_status` and `mcp__launch-deck__server_status`. If either is missing, stop and tell the user to run `npx @launchsecure/launch-kit refresh` (or `npx launch-deck` for the deck server).
|
|
24
|
+
2. Run `mcp__launch-chart__detect_project_stack` once. Cache the returned `layers` for the bug-report fallback below.
|
|
25
|
+
|
|
26
|
+
## 1. Compute the blast points
|
|
27
|
+
|
|
28
|
+
Call `mcp__launch-chart__blast_points` with `node_id: <target>`, `hops: <hops>`, `direction: "reverse"`, and `layer` if supplied. The tool returns affected nodes (with hop, type, layer, module) plus a summary.
|
|
29
|
+
|
|
30
|
+
**Chart-gap detection** — if any of these are true, file a feedback comment per the shared `chart-gap` protocol below before stopping:
|
|
31
|
+
- `error` is set
|
|
32
|
+
- `nodes` is empty AND the user explicitly named a node id that exists on disk (verify by `Read`-ing the path)
|
|
33
|
+
- `summary.byLayer` covers fewer layers than `detect_project_stack` reported as available
|
|
34
|
+
|
|
35
|
+
## 2. Build the manifest
|
|
36
|
+
|
|
37
|
+
Translate the blast_points result into the deck `blast-radius` block manifest shape. Reuse layer ids/icons/colors from `detect_project_stack` so the visual matches the project's conventions; fall back to:
|
|
38
|
+
- db → `database`, `#172554`
|
|
39
|
+
- api → `server`, `#1e3a5f`
|
|
40
|
+
- ui → `layout-dashboard`, `#0c4a6e`
|
|
41
|
+
- static → `file-text`, `#374151`
|
|
42
|
+
- shared → `puzzle`, `#4338ca`
|
|
43
|
+
- middleware → `shield`, `#1f2937`
|
|
44
|
+
- config → `cog`, `#52525b`
|
|
45
|
+
|
|
46
|
+
Rings:
|
|
47
|
+
- structural mode (default): `[{id:"hop1",name:"Direct",color:"#f97316"},{id:"hop2",name:"Indirect",color:"#eab308"}]`
|
|
48
|
+
- feature mode: `[{id:"modify",name:"Modify",color:"#f97316"},{id:"create",name:"Create",color:"#22c55e"},{id:"ripple",name:"Ripple",color:"#eab308"}]`
|
|
49
|
+
|
|
50
|
+
Centre node: `{ name: <target>, description: "<N> direct, <M> indirect (<hops> hops)" }`.
|
|
51
|
+
|
|
52
|
+
Nodes: map each blast result row to `{ id, name, layer, ring: hop===1 ? "hop1" : "hop2", path, type }`.
|
|
53
|
+
|
|
54
|
+
Edges: connect the centre to every hop=1 node; connect each hop=2 node to one hop=1 ancestor from its dependency chain (read from `blast_points` `via` field if present, otherwise pick any hop=1 node in the same layer).
|
|
55
|
+
|
|
56
|
+
## 3. Push to deck
|
|
57
|
+
|
|
58
|
+
Call `mcp__launch-deck__deck` with `session: <session>`, `mode: "show"`, `blocks: [{ type: "blast-radius", label: <target>, manifest: <built-manifest> }]`.
|
|
59
|
+
|
|
60
|
+
If the deck server isn't running, call `mcp__launch-deck__start_server` first, then retry. Report the deck URL back to the user.
|
|
61
|
+
|
|
62
|
+
## Output
|
|
63
|
+
|
|
64
|
+
After the push, print a terse summary:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
blast-radius for <target> — <N> direct, <M> indirect (<hops> hops)
|
|
68
|
+
by layer: db 4, api 7, ui 12
|
|
69
|
+
pushed to deck session "<session>" — http://localhost:52829/?session=<session>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Chart-gap protocol (shared)
|
|
73
|
+
|
|
74
|
+
When the chart MCP returns less data than expected, file ONE feedback comment in the project's Comm Hub (cloud LS by default per project memory — use `mcp__launch-secure__communication_write`, not the local variant) before stopping:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
resource_type: "feedback"
|
|
78
|
+
title: "launch-chart gap: <one-line>"
|
|
79
|
+
body: |
|
|
80
|
+
Skill: /kit:blast-radius
|
|
81
|
+
Tool: blast_points(node_id=<id>, hops=<n>, layer=<layer?>)
|
|
82
|
+
Returned: <nodes_count> nodes, layers=<layers_seen>
|
|
83
|
+
Expected: <what-was-expected, e.g. "node exists at <path>" or "layer X should appear">
|
|
84
|
+
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
|
+
```
|
|
93
|
+
|
|
94
|
+
Do NOT spam — file at most one comment per skill invocation. After filing, tell the user "Filed chart-gap report to LS (id: …). 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
|
+
|
|
96
|
+
## Constraints
|
|
97
|
+
|
|
98
|
+
- **MCP-first.** Never grep the filesystem to build the manifest — use `blast_points` and `read_graph`.
|
|
99
|
+
- **Idempotent on re-run.** Re-pushing to the same session overwrites the previous render — that's fine, just tell the user.
|
|
100
|
+
- **Single bug-file per run.** Don't file a comment for every gap; bundle into one report.
|
|
101
|
+
- **Plain text output.** No markdown tables, no fenced blocks in the human-facing summary.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Create or update a repo-backed Brief in the LaunchSecure Comm Hub per the LS Briefs framework — Discovery-plane document (docCategory=features) authored as a comment that's also synced to a markdown file in the repo. Use to capture an idea before promoting it to an Epic.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /kit:brief
|
|
6
|
+
|
|
7
|
+
A **Brief** is an LS Discovery-plane artefact: a long-form description of a problem/opportunity, authored as a comment in the project's Comm Hub AND backed by a markdown file in the repo (`docs/requirements/features/<slug>.md` by convention). It's the structured alternative to a free-form Discussion when the idea has enough shape to write down. Briefs get promoted to Epics on the Roadmap once they're DECIDED.
|
|
8
|
+
|
|
9
|
+
Parse `$ARGUMENTS`:
|
|
10
|
+
- **subcommand** (required) — `new` | `update` | `list` | `show`.
|
|
11
|
+
- For **new**: `<title>` (required), `--from=discussion:<id>` to seed body from an existing discussion thread, `--module=<slug>` to tag.
|
|
12
|
+
- For **update**: `<brief-id-or-slug>` and either a body description (re-generates body) or `--append=<text>` to add a section.
|
|
13
|
+
- For **list**: `[--module=<slug>] [--status=open|decided|declined]`.
|
|
14
|
+
- For **show**: `<brief-id-or-slug>`.
|
|
15
|
+
|
|
16
|
+
Examples:
|
|
17
|
+
- `/kit:brief new "Channels for Comm Hub" --module=communication`
|
|
18
|
+
- `/kit:brief new "Roadmap nav" --from=discussion:cmt_abc123`
|
|
19
|
+
- `/kit:brief list --status=open`
|
|
20
|
+
- `/kit:brief show channels-for-comms`
|
|
21
|
+
- `/kit:brief update channels-for-comms --append="Resolved: use the Slack metaphor not Teams."`
|
|
22
|
+
|
|
23
|
+
## Preflight
|
|
24
|
+
|
|
25
|
+
1. Confirm `mcp__launch-secure__ping` works (the cloud LS MCP must be wired). If only `mcp__local-launch-secure__*` is wired, ask the user whether to post to local or cloud — default per project memory is CLOUD.
|
|
26
|
+
2. For `new`, sanity-check that no existing brief with the same slug already exists — call `mcp__launch-secure__communication_read` filtered by `resourceType=comment` and search the title. If a match is found, ask whether to update instead.
|
|
27
|
+
|
|
28
|
+
## The Brief shape
|
|
29
|
+
|
|
30
|
+
Per the LS Briefs framework (`docs/requirements/work-items/roadmap-and-hierarchy.md`):
|
|
31
|
+
|
|
32
|
+
- **resourceType**: `comment` (Briefs are comments)
|
|
33
|
+
- **docCategory**: `features` (this is what file-backed sync watches)
|
|
34
|
+
- **title**: the human-friendly name; the slug is derived
|
|
35
|
+
- **body**: the long-form markdown — sections below
|
|
36
|
+
- **file_links**: not used here; the FileBackedEntity link is created by LS server-side on first save
|
|
37
|
+
- **tags**: optional module tag, plus a `brief` tag for filtering
|
|
38
|
+
|
|
39
|
+
### Body template
|
|
40
|
+
|
|
41
|
+
When generating a NEW brief, use this skeleton (markdown body):
|
|
42
|
+
|
|
43
|
+
```markdown
|
|
44
|
+
# <Title>
|
|
45
|
+
|
|
46
|
+
**Status**: PROPOSED
|
|
47
|
+
**Owner**: <user-mention or "unassigned">
|
|
48
|
+
**Module**: <module slug or "-">
|
|
49
|
+
|
|
50
|
+
## Problem
|
|
51
|
+
|
|
52
|
+
<1-2 paragraphs — what's broken or missing, who feels it, why now>
|
|
53
|
+
|
|
54
|
+
## Proposed direction
|
|
55
|
+
|
|
56
|
+
<1-3 paragraphs — the shape of the solution, not the implementation>
|
|
57
|
+
|
|
58
|
+
## Out of scope
|
|
59
|
+
|
|
60
|
+
- <bullets — what this brief deliberately does NOT cover>
|
|
61
|
+
|
|
62
|
+
## Open questions
|
|
63
|
+
|
|
64
|
+
- [ ] <bullets — what we still need to decide before this can become an Epic>
|
|
65
|
+
|
|
66
|
+
## Success looks like
|
|
67
|
+
|
|
68
|
+
<1-2 sentences — observable outcome, not "ship X">
|
|
69
|
+
|
|
70
|
+
## References
|
|
71
|
+
|
|
72
|
+
- <link to existing code via launch-chart node id (use mcp__launch-chart__read_graph to find the right nodes; cite them as `lib/foo/bar.ts:42`)>
|
|
73
|
+
- <related comments by id>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The body is plain markdown — Comm Hub renders it. Use launch-chart to add real code references (don't invent file paths).
|
|
77
|
+
|
|
78
|
+
## Write paths
|
|
79
|
+
|
|
80
|
+
### new
|
|
81
|
+
|
|
82
|
+
1. Build the body from the template + the user's description (or the `--from=discussion:<id>` seed — fetch via `communication_read` and weave the relevant points into the Problem/Proposed-direction sections).
|
|
83
|
+
2. Call `mcp__launch-secure__communication_write` with:
|
|
84
|
+
- `title: <user-supplied>`
|
|
85
|
+
- `body: <generated-markdown>`
|
|
86
|
+
- `resource_type: "comment"`
|
|
87
|
+
- `fields: { docCategory: "features", briefStatus: "PROPOSED" }`
|
|
88
|
+
- `tag_ids: <module tag id + "brief" tag id>` (call `mcp__launch-secure__tags_list` first to resolve names → ids; if either tag doesn't exist, surface the missing tag(s) and proceed without)
|
|
89
|
+
3. Print the returned comment id + URL.
|
|
90
|
+
4. Tell the user: "LS server-side file-backed sync will materialize `docs/requirements/features/<slug>.md` on the next default-branch push that includes this brief — pull the branch to see it locally."
|
|
91
|
+
|
|
92
|
+
### update
|
|
93
|
+
|
|
94
|
+
1. Resolve `<brief-id-or-slug>` via `communication_read(resourceType: "comment", search: <slug>)`. If multiple match, list them and stop.
|
|
95
|
+
2. If `--append=<text>`, fetch the current body, append the text under a `## Update <ISO-date>` heading, and call `mcp__launch-secure__communication_update` with the new body.
|
|
96
|
+
3. If a fresh description was passed, regenerate the body from the template + new description, ask the user to confirm (show the diff briefly), then update.
|
|
97
|
+
|
|
98
|
+
### list
|
|
99
|
+
|
|
100
|
+
`mcp__launch-secure__communication_read` filtered by `resourceType=comment`, narrow on `docCategory=features` if the API supports it (otherwise pull a wider set and filter client-side by tag/status). Render one line per brief: `id status title module updated`.
|
|
101
|
+
|
|
102
|
+
### show
|
|
103
|
+
|
|
104
|
+
Fetch via `communication_read` and print the body as-is, no transformation.
|
|
105
|
+
|
|
106
|
+
## Constraints
|
|
107
|
+
|
|
108
|
+
- **Plain markdown body.** Per project memory `feedback_comms_plain_text.md`, comms posts are plain — no HTML, no emojis unless the user wrote them.
|
|
109
|
+
- **One brief, one comment.** Don't fragment a brief across multiple comments — append via `--append` to keep the document continuous.
|
|
110
|
+
- **Cloud LS by default.** Per memory `feedback_post_to_cloud_ls_default.md`. Local LS only when the user explicitly says "local".
|
|
111
|
+
- **Cite real code.** Use launch-chart node ids in the References section — don't invent file paths.
|
|
112
|
+
- **Don't auto-promote to Epic.** A Brief → Epic is a deliberate human action (project memory: bucket transitions are deliberate, not derived). Surface a hint at the end: "When DECIDED, run `/work-items create epic --from-brief=<id>` to promote."
|