@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.
Files changed (191) hide show
  1. package/dist/beacon/beacon.mjs +2759 -1246
  2. package/dist/beacon/beacon.mjs.map +1 -1
  3. package/dist/beacon/beacon.umd.js +710 -95
  4. package/dist/beacon/beacon.umd.js.map +1 -1
  5. package/dist/beacon/types/core.d.ts +14 -0
  6. package/dist/beacon/types/core.d.ts.map +1 -0
  7. package/dist/beacon/types/ctx.d.ts +14 -0
  8. package/dist/beacon/types/ctx.d.ts.map +1 -0
  9. package/dist/beacon/types/element.d.ts +16 -48
  10. package/dist/beacon/types/element.d.ts.map +1 -1
  11. package/dist/beacon/types/index.d.ts +5 -4
  12. package/dist/beacon/types/index.d.ts.map +1 -1
  13. package/dist/beacon/types/internal/annotation-cache.d.ts +10 -0
  14. package/dist/beacon/types/internal/annotation-cache.d.ts.map +1 -0
  15. package/dist/beacon/types/internal/element-capture.d.ts +19 -0
  16. package/dist/beacon/types/internal/element-capture.d.ts.map +1 -0
  17. package/dist/beacon/types/internal/event-buffer.d.ts +16 -0
  18. package/dist/beacon/types/internal/event-buffer.d.ts.map +1 -0
  19. package/dist/beacon/types/internal/framework-detect.d.ts +6 -0
  20. package/dist/beacon/types/internal/framework-detect.d.ts.map +1 -0
  21. package/dist/beacon/types/internal/markers.d.ts +17 -0
  22. package/dist/beacon/types/internal/markers.d.ts.map +1 -0
  23. package/dist/beacon/types/internal/monitor/capture-dom.d.ts +14 -0
  24. package/dist/beacon/types/internal/monitor/capture-dom.d.ts.map +1 -0
  25. package/dist/beacon/types/internal/monitor/capture-network.d.ts +12 -0
  26. package/dist/beacon/types/internal/monitor/capture-network.d.ts.map +1 -0
  27. package/dist/beacon/types/internal/monitor/overlay.d.ts +16 -0
  28. package/dist/beacon/types/internal/monitor/overlay.d.ts.map +1 -0
  29. package/dist/beacon/types/internal/monitor/session.d.ts +41 -0
  30. package/dist/beacon/types/internal/monitor/session.d.ts.map +1 -0
  31. package/dist/beacon/types/{monitor → internal/monitor}/transport.d.ts +3 -3
  32. package/dist/beacon/types/internal/monitor/transport.d.ts.map +1 -0
  33. package/dist/beacon/types/{monitor/types.d.ts → internal/monitor/wire.d.ts} +69 -27
  34. package/dist/beacon/types/internal/monitor/wire.d.ts.map +1 -0
  35. package/dist/beacon/types/{ui → internal}/pick-mode-overlay.d.ts +4 -5
  36. package/dist/beacon/types/internal/pick-mode-overlay.d.ts.map +1 -0
  37. package/dist/beacon/types/{capture → internal}/picker.d.ts +0 -1
  38. package/dist/beacon/types/internal/picker.d.ts.map +1 -0
  39. package/dist/beacon/types/{ui → internal}/pin-popover.d.ts +1 -1
  40. package/dist/beacon/types/internal/pin-popover.d.ts.map +1 -0
  41. package/dist/beacon/types/{capture → internal}/screenshot.d.ts +1 -0
  42. package/dist/beacon/types/internal/screenshot.d.ts.map +1 -0
  43. package/dist/beacon/types/internal/selector.d.ts.map +1 -0
  44. package/dist/beacon/types/plugins/domEle.d.ts +14 -0
  45. package/dist/beacon/types/plugins/domEle.d.ts.map +1 -0
  46. package/dist/beacon/types/plugins/domSS.d.ts +8 -0
  47. package/dist/beacon/types/plugins/domSS.d.ts.map +1 -0
  48. package/dist/beacon/types/plugins/errors.d.ts +3 -0
  49. package/dist/beacon/types/plugins/errors.d.ts.map +1 -0
  50. package/dist/beacon/types/plugins/index.d.ts +8 -0
  51. package/dist/beacon/types/plugins/index.d.ts.map +1 -0
  52. package/dist/beacon/types/plugins/liveMonitor.d.ts +14 -0
  53. package/dist/beacon/types/plugins/liveMonitor.d.ts.map +1 -0
  54. package/dist/beacon/types/plugins/metadata.d.ts +3 -0
  55. package/dist/beacon/types/plugins/metadata.d.ts.map +1 -0
  56. package/dist/beacon/types/registry.d.ts +33 -0
  57. package/dist/beacon/types/registry.d.ts.map +1 -0
  58. package/dist/beacon/types/styles.d.ts +8 -0
  59. package/dist/beacon/types/styles.d.ts.map +1 -0
  60. package/dist/beacon/types/transport.d.ts +3 -0
  61. package/dist/beacon/types/transport.d.ts.map +1 -0
  62. package/dist/beacon/types/types.d.ts +152 -68
  63. package/dist/beacon/types/types.d.ts.map +1 -1
  64. package/dist/beacon/types/ui/dialog.d.ts +53 -0
  65. package/dist/beacon/types/ui/dialog.d.ts.map +1 -0
  66. package/dist/beacon/types/ui/form.d.ts +7 -0
  67. package/dist/beacon/types/ui/form.d.ts.map +1 -0
  68. package/dist/beacon/types/ui/overlay.d.ts +6 -0
  69. package/dist/beacon/types/ui/overlay.d.ts.map +1 -0
  70. package/dist/deck-client/assets/{_baseUniq-W2JQDmje.js → _baseUniq-DCt2IMRR.js} +1 -1
  71. package/dist/deck-client/assets/{arc-DIBWAId9.js → arc-h-ifqmNR.js} +1 -1
  72. package/dist/deck-client/assets/{architectureDiagram-Q4EWVU46-CAIRMvJK.js → architectureDiagram-Q4EWVU46-C9dITSPv.js} +1 -1
  73. package/dist/deck-client/assets/{blockDiagram-DXYQGD6D-BeNaNiOi.js → blockDiagram-DXYQGD6D-BHuJT34t.js} +1 -1
  74. package/dist/deck-client/assets/{c4Diagram-AHTNJAMY-B9Ozi62h.js → c4Diagram-AHTNJAMY-CpvMGtDG.js} +1 -1
  75. package/dist/deck-client/assets/channel-2PZVMiXf.js +1 -0
  76. package/dist/deck-client/assets/{chunk-4BX2VUAB-D7AZ47dt.js → chunk-4BX2VUAB-B6md1VIm.js} +1 -1
  77. package/dist/deck-client/assets/{chunk-4TB4RGXK-DnVnNPcI.js → chunk-4TB4RGXK-BmEnX8ik.js} +1 -1
  78. package/dist/deck-client/assets/{chunk-55IACEB6-UKYs-YNd.js → chunk-55IACEB6-BZPUyZAZ.js} +1 -1
  79. package/dist/deck-client/assets/{chunk-EDXVE4YY-D43b-SKn.js → chunk-EDXVE4YY-BWwNUK-l.js} +1 -1
  80. package/dist/deck-client/assets/{chunk-FMBD7UC4-QzBAoyyW.js → chunk-FMBD7UC4-o7gSppGI.js} +1 -1
  81. package/dist/deck-client/assets/{chunk-OYMX7WX6-Cjif4r6W.js → chunk-OYMX7WX6-C4KoTL5p.js} +1 -1
  82. package/dist/deck-client/assets/{chunk-QZHKN3VN-CqLDirEI.js → chunk-QZHKN3VN-jkf68sDs.js} +1 -1
  83. package/dist/deck-client/assets/{chunk-YZCP3GAM-_FQvmMs4.js → chunk-YZCP3GAM-Cd4yBE7o.js} +1 -1
  84. package/dist/deck-client/assets/classDiagram-6PBFFD2Q-Bt8xBAof.js +1 -0
  85. package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-Bt8xBAof.js +1 -0
  86. package/dist/deck-client/assets/clone-BHQryoDl.js +1 -0
  87. package/dist/deck-client/assets/{cose-bilkent-S5V4N54A-rfrocesE.js → cose-bilkent-S5V4N54A-DeGFUgAV.js} +1 -1
  88. package/dist/deck-client/assets/{dagre-KV5264BT-Bv_7DJat.js → dagre-KV5264BT-ekcYJuUV.js} +1 -1
  89. package/dist/deck-client/assets/{diagram-5BDNPKRD-4F1414G5.js → diagram-5BDNPKRD-YHPk4rV2.js} +1 -1
  90. package/dist/deck-client/assets/{diagram-G4DWMVQ6-C4-Pszqm.js → diagram-G4DWMVQ6-DM-JCd_B.js} +1 -1
  91. package/dist/deck-client/assets/{diagram-MMDJMWI5-B647TIx9.js → diagram-MMDJMWI5-l5FK1ybk.js} +1 -1
  92. package/dist/deck-client/assets/{diagram-TYMM5635-BFAqpezd.js → diagram-TYMM5635-CIN4_1-j.js} +1 -1
  93. package/dist/deck-client/assets/{erDiagram-SMLLAGMA-BfBfrJOC.js → erDiagram-SMLLAGMA-MyinSkEl.js} +1 -1
  94. package/dist/deck-client/assets/{flowDiagram-DWJPFMVM-DX9YAYes.js → flowDiagram-DWJPFMVM-Dk8nn42x.js} +1 -1
  95. package/dist/deck-client/assets/{ganttDiagram-T4ZO3ILL-DCuiy7wF.js → ganttDiagram-T4ZO3ILL-BU1ihicu.js} +1 -1
  96. package/dist/deck-client/assets/{gitGraphDiagram-UUTBAWPF-CGp1IXUh.js → gitGraphDiagram-UUTBAWPF-BjsTL13C.js} +1 -1
  97. package/dist/deck-client/assets/{graph-B7g8aoxv.js → graph-DJmh-xi7.js} +1 -1
  98. package/dist/deck-client/assets/{index-Dg1r-WSN.js → index-KsShfCV-.js} +3 -3
  99. package/dist/deck-client/assets/{infoDiagram-42DDH7IO-L3fahMkF.js → infoDiagram-42DDH7IO-Dxvy_RB4.js} +1 -1
  100. package/dist/deck-client/assets/{ishikawaDiagram-UXIWVN3A-aS_EjWBZ.js → ishikawaDiagram-UXIWVN3A-DPOaNF1l.js} +1 -1
  101. package/dist/deck-client/assets/{journeyDiagram-VCZTEJTY-djTSQZF9.js → journeyDiagram-VCZTEJTY-DMew3K5c.js} +1 -1
  102. package/dist/deck-client/assets/{kanban-definition-6JOO6SKY-CcTHo4CM.js → kanban-definition-6JOO6SKY-csciJFuk.js} +1 -1
  103. package/dist/deck-client/assets/{layout-mEJiadb7.js → layout-Dg4yyms2.js} +1 -1
  104. package/dist/deck-client/assets/{linear-XgTKqyRu.js → linear-BA3zU6gq.js} +1 -1
  105. package/dist/deck-client/assets/{min-Ct9jZdpd.js → min-lz-Ird-p.js} +1 -1
  106. package/dist/deck-client/assets/{mindmap-definition-QFDTVHPH-BaFxCGNU.js → mindmap-definition-QFDTVHPH-CCEN8OQV.js} +1 -1
  107. package/dist/deck-client/assets/{pieDiagram-DEJITSTG-CIbYYjtw.js → pieDiagram-DEJITSTG-DM6n1HY7.js} +1 -1
  108. package/dist/deck-client/assets/{quadrantDiagram-34T5L4WZ-D9EtCOvh.js → quadrantDiagram-34T5L4WZ-_ULoR66n.js} +1 -1
  109. package/dist/deck-client/assets/{requirementDiagram-MS252O5E-xeni9eVG.js → requirementDiagram-MS252O5E-BuwJs7Tn.js} +1 -1
  110. package/dist/deck-client/assets/{sankeyDiagram-XADWPNL6-LYeknz9h.js → sankeyDiagram-XADWPNL6-BEsuzkW4.js} +1 -1
  111. package/dist/deck-client/assets/{sequenceDiagram-FGHM5R23-RDbsKFZf.js → sequenceDiagram-FGHM5R23-CP2H0YWf.js} +1 -1
  112. package/dist/deck-client/assets/{stateDiagram-FHFEXIEX-BH1Zjglk.js → stateDiagram-FHFEXIEX-B5Gw_NNL.js} +1 -1
  113. package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-4T4wMDXr.js +1 -0
  114. package/dist/deck-client/assets/{timeline-definition-GMOUNBTQ-IFXxKptt.js → timeline-definition-GMOUNBTQ-DsoYydQa.js} +1 -1
  115. package/dist/deck-client/assets/{vennDiagram-DHZGUBPP-D-sLkQs9.js → vennDiagram-DHZGUBPP-Dz8JT_ob.js} +1 -1
  116. package/dist/deck-client/assets/wardley-RL74JXVD-DGHQ_Ijv.js +162 -0
  117. package/dist/deck-client/assets/{wardleyDiagram-NUSXRM2D-BTjjuDU3.js → wardleyDiagram-NUSXRM2D-DN1LJMB1.js} +1 -1
  118. package/dist/deck-client/assets/{xychartDiagram-5P7HB3ND-AYbv92n-.js → xychartDiagram-5P7HB3ND-nb0oSfrQ.js} +1 -1
  119. package/dist/deck-client/index.html +1 -1
  120. package/dist/server/beacon-monitor-entry.js +548 -6
  121. package/dist/server/chart-serve.js +917 -248
  122. package/dist/server/cli.js +1368 -374
  123. package/dist/server/council-entry.js +0 -0
  124. package/dist/server/fb-wizard.js +0 -0
  125. package/dist/server/graph-mcp-entry.js +1326 -322
  126. package/dist/server/init-entry.js +16 -11
  127. package/dist/server/orbit-entry.js +135 -7
  128. package/dist/server/parse-worker-entry.js +918 -247
  129. package/package.json +22 -22
  130. package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-array.md +107 -0
  131. package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-clear.md +94 -0
  132. package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-pulse.md +82 -0
  133. package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-scan.md +66 -0
  134. package/scaffolds/ls-marketplace/plugins/kit/skills/blast-radius.md +101 -0
  135. package/scaffolds/ls-marketplace/plugins/kit/skills/brief.md +112 -0
  136. package/scaffolds/ls-marketplace/plugins/kit/skills/course.md +84 -0
  137. package/scaffolds/ls-marketplace/plugins/kit/skills/debug.md +92 -0
  138. package/scaffolds/ls-marketplace/plugins/kit/skills/deploy-check.md +160 -0
  139. package/scaffolds/ls-marketplace/plugins/kit/skills/diagram.md +134 -0
  140. package/scaffolds/ls-marketplace/plugins/kit/skills/orbit.md +87 -0
  141. package/scaffolds/ls-marketplace/plugins/kit/skills/prototype.md +90 -0
  142. package/scaffolds/ls-marketplace/plugins/kit/skills/recall.md +83 -0
  143. package/scaffolds/ls-marketplace/plugins/kit/{commands → skills}/show-mcp-status.md +4 -4
  144. package/scaffolds/ls-marketplace/plugins/kit/skills/wireframe.md +70 -0
  145. package/scaffolds/migrate-safety/scripts/migrate-with-backup.sh +0 -0
  146. package/scaffolds/recall-hook/scripts/ensure-recall.sh +0 -0
  147. package/scaffolds/statusline/statusline-mcp.sh +21 -9
  148. package/dist/beacon/types/capture/element.d.ts +0 -3
  149. package/dist/beacon/types/capture/element.d.ts.map +0 -1
  150. package/dist/beacon/types/capture/events.d.ts +0 -20
  151. package/dist/beacon/types/capture/events.d.ts.map +0 -1
  152. package/dist/beacon/types/capture/framework.d.ts +0 -3
  153. package/dist/beacon/types/capture/framework.d.ts.map +0 -1
  154. package/dist/beacon/types/capture/metadata.d.ts +0 -3
  155. package/dist/beacon/types/capture/metadata.d.ts.map +0 -1
  156. package/dist/beacon/types/capture/overlay.d.ts +0 -7
  157. package/dist/beacon/types/capture/overlay.d.ts.map +0 -1
  158. package/dist/beacon/types/capture/picker.d.ts.map +0 -1
  159. package/dist/beacon/types/capture/screenshot.d.ts.map +0 -1
  160. package/dist/beacon/types/capture/selector.d.ts.map +0 -1
  161. package/dist/beacon/types/monitor/dom.d.ts +0 -13
  162. package/dist/beacon/types/monitor/dom.d.ts.map +0 -1
  163. package/dist/beacon/types/monitor/index.d.ts +0 -19
  164. package/dist/beacon/types/monitor/index.d.ts.map +0 -1
  165. package/dist/beacon/types/monitor/network.d.ts +0 -12
  166. package/dist/beacon/types/monitor/network.d.ts.map +0 -1
  167. package/dist/beacon/types/monitor/transport.d.ts.map +0 -1
  168. package/dist/beacon/types/monitor/types.d.ts.map +0 -1
  169. package/dist/beacon/types/transport/submit.d.ts +0 -3
  170. package/dist/beacon/types/transport/submit.d.ts.map +0 -1
  171. package/dist/beacon/types/ui/button.d.ts +0 -2
  172. package/dist/beacon/types/ui/button.d.ts.map +0 -1
  173. package/dist/beacon/types/ui/drawer.d.ts +0 -33
  174. package/dist/beacon/types/ui/drawer.d.ts.map +0 -1
  175. package/dist/beacon/types/ui/icons.d.ts +0 -9
  176. package/dist/beacon/types/ui/icons.d.ts.map +0 -1
  177. package/dist/beacon/types/ui/monitor-panel.d.ts +0 -19
  178. package/dist/beacon/types/ui/monitor-panel.d.ts.map +0 -1
  179. package/dist/beacon/types/ui/pick-mode-overlay.d.ts.map +0 -1
  180. package/dist/beacon/types/ui/pin-popover.d.ts.map +0 -1
  181. package/dist/deck-client/assets/channel-CRdozqbp.js +0 -1
  182. package/dist/deck-client/assets/classDiagram-6PBFFD2Q-lIZMp57W.js +0 -1
  183. package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-lIZMp57W.js +0 -1
  184. package/dist/deck-client/assets/clone-BtWeSTyJ.js +0 -1
  185. package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-BrV78NDR.js +0 -1
  186. package/dist/deck-client/assets/wardley-RL74JXVD-C010F8l4.js +0 -162
  187. package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-array.md +0 -92
  188. package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-clear.md +0 -68
  189. package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-pulse.md +0 -80
  190. package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-scan.md +0 -62
  191. /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.29",
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."