@launchsecure/launch-kit 0.0.29 → 0.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/beacon/beacon.mjs +2825 -1243
- 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/internal/screenshot.d.ts +26 -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/chart-client/assets/{index-CJ4mgRRF.css → index-CDIhdgWg.css} +1 -1
- package/dist/chart-client/index.html +2 -2
- package/dist/client/assets/{index-DI5qSR_w.css → index-CfW4n40I.css} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/council-client/assets/{index-C_-vAM9L.css → index-CZim6x1u.css} +1 -1
- package/dist/council-client/index.html +2 -2
- package/dist/deck-client/assets/{_baseUniq-W2JQDmje.js → _baseUniq-DdHaBFYO.js} +1 -1
- package/dist/deck-client/assets/{arc-DIBWAId9.js → arc-D98e_18X.js} +1 -1
- package/dist/deck-client/assets/{architectureDiagram-Q4EWVU46-CAIRMvJK.js → architectureDiagram-Q4EWVU46-DNFZzh-4.js} +1 -1
- package/dist/deck-client/assets/{blockDiagram-DXYQGD6D-BeNaNiOi.js → blockDiagram-DXYQGD6D-DeQvGUdX.js} +1 -1
- package/dist/deck-client/assets/{c4Diagram-AHTNJAMY-B9Ozi62h.js → c4Diagram-AHTNJAMY-B6ekZf1n.js} +1 -1
- package/dist/deck-client/assets/channel-DmR7Tyyt.js +1 -0
- package/dist/deck-client/assets/{chunk-4BX2VUAB-D7AZ47dt.js → chunk-4BX2VUAB-9aDWymq2.js} +1 -1
- package/dist/deck-client/assets/{chunk-4TB4RGXK-DnVnNPcI.js → chunk-4TB4RGXK-DtKQqaI7.js} +1 -1
- package/dist/deck-client/assets/{chunk-55IACEB6-UKYs-YNd.js → chunk-55IACEB6-COy9hEae.js} +1 -1
- package/dist/deck-client/assets/{chunk-EDXVE4YY-D43b-SKn.js → chunk-EDXVE4YY-D_f861An.js} +1 -1
- package/dist/deck-client/assets/{chunk-FMBD7UC4-QzBAoyyW.js → chunk-FMBD7UC4-CmuA5UKn.js} +1 -1
- package/dist/deck-client/assets/{chunk-OYMX7WX6-Cjif4r6W.js → chunk-OYMX7WX6-vT8z8D-0.js} +1 -1
- package/dist/deck-client/assets/{chunk-QZHKN3VN-CqLDirEI.js → chunk-QZHKN3VN-CTlwwg-R.js} +1 -1
- package/dist/deck-client/assets/{chunk-YZCP3GAM-_FQvmMs4.js → chunk-YZCP3GAM-C44yr620.js} +1 -1
- package/dist/deck-client/assets/classDiagram-6PBFFD2Q-Bl4ozQWs.js +1 -0
- package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-Bl4ozQWs.js +1 -0
- package/dist/deck-client/assets/clone-BAy58j24.js +1 -0
- package/dist/deck-client/assets/{cose-bilkent-S5V4N54A-rfrocesE.js → cose-bilkent-S5V4N54A-DBB2J2nL.js} +1 -1
- package/dist/deck-client/assets/{dagre-KV5264BT-Bv_7DJat.js → dagre-KV5264BT-DxDTYbKl.js} +1 -1
- package/dist/deck-client/assets/{diagram-5BDNPKRD-4F1414G5.js → diagram-5BDNPKRD-DByWrWd1.js} +1 -1
- package/dist/deck-client/assets/{diagram-G4DWMVQ6-C4-Pszqm.js → diagram-G4DWMVQ6-B8B6ddMq.js} +1 -1
- package/dist/deck-client/assets/{diagram-MMDJMWI5-B647TIx9.js → diagram-MMDJMWI5-BMUZ2PWK.js} +1 -1
- package/dist/deck-client/assets/{diagram-TYMM5635-BFAqpezd.js → diagram-TYMM5635-Bk9e8BB-.js} +1 -1
- package/dist/deck-client/assets/{erDiagram-SMLLAGMA-BfBfrJOC.js → erDiagram-SMLLAGMA-DcOSwSol.js} +1 -1
- package/dist/deck-client/assets/{flowDiagram-DWJPFMVM-DX9YAYes.js → flowDiagram-DWJPFMVM-DI-4BR0F.js} +1 -1
- package/dist/deck-client/assets/{ganttDiagram-T4ZO3ILL-DCuiy7wF.js → ganttDiagram-T4ZO3ILL-BeZuXBoU.js} +1 -1
- package/dist/deck-client/assets/{gitGraphDiagram-UUTBAWPF-CGp1IXUh.js → gitGraphDiagram-UUTBAWPF-Bcki__f-.js} +1 -1
- package/dist/deck-client/assets/{graph-B7g8aoxv.js → graph-CifKx6G1.js} +1 -1
- package/dist/deck-client/assets/index-6sdqbm2o.js +2 -0
- package/dist/deck-client/assets/{index-DsIZ3LqL.css → index-BlTlhxFW.css} +1 -1
- package/dist/deck-client/assets/index-CB-qlwRT.js +1195 -0
- package/dist/deck-client/assets/{infoDiagram-42DDH7IO-L3fahMkF.js → infoDiagram-42DDH7IO-CReN1nFN.js} +1 -1
- package/dist/deck-client/assets/{ishikawaDiagram-UXIWVN3A-aS_EjWBZ.js → ishikawaDiagram-UXIWVN3A-CDF_VLN_.js} +1 -1
- package/dist/deck-client/assets/{journeyDiagram-VCZTEJTY-djTSQZF9.js → journeyDiagram-VCZTEJTY-DwgGrNVB.js} +1 -1
- package/dist/deck-client/assets/{kanban-definition-6JOO6SKY-CcTHo4CM.js → kanban-definition-6JOO6SKY-DB_zohh5.js} +1 -1
- package/dist/deck-client/assets/{layout-mEJiadb7.js → layout-DFfX1O3z.js} +1 -1
- package/dist/deck-client/assets/{linear-XgTKqyRu.js → linear-CtKb4EXj.js} +1 -1
- package/dist/deck-client/assets/{min-Ct9jZdpd.js → min-DCRRwUZv.js} +1 -1
- package/dist/deck-client/assets/{mindmap-definition-QFDTVHPH-BaFxCGNU.js → mindmap-definition-QFDTVHPH-D0QBOiFe.js} +1 -1
- package/dist/deck-client/assets/{pieDiagram-DEJITSTG-CIbYYjtw.js → pieDiagram-DEJITSTG-CD-EV5WB.js} +1 -1
- package/dist/deck-client/assets/{quadrantDiagram-34T5L4WZ-D9EtCOvh.js → quadrantDiagram-34T5L4WZ-B-JXZ8xI.js} +1 -1
- package/dist/deck-client/assets/{requirementDiagram-MS252O5E-xeni9eVG.js → requirementDiagram-MS252O5E-D2_OK5Dp.js} +1 -1
- package/dist/deck-client/assets/{sankeyDiagram-XADWPNL6-LYeknz9h.js → sankeyDiagram-XADWPNL6-BbBJqVSC.js} +1 -1
- package/dist/deck-client/assets/{sequenceDiagram-FGHM5R23-RDbsKFZf.js → sequenceDiagram-FGHM5R23-Db8A-Rkk.js} +1 -1
- package/dist/deck-client/assets/{stateDiagram-FHFEXIEX-BH1Zjglk.js → stateDiagram-FHFEXIEX-DGJnanjS.js} +1 -1
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-CR7riiab.js +1 -0
- package/dist/deck-client/assets/{timeline-definition-GMOUNBTQ-IFXxKptt.js → timeline-definition-GMOUNBTQ-BRkr6T4w.js} +1 -1
- package/dist/deck-client/assets/{vennDiagram-DHZGUBPP-D-sLkQs9.js → vennDiagram-DHZGUBPP-d0rsTqFo.js} +1 -1
- package/dist/deck-client/assets/{wardley-RL74JXVD-C010F8l4.js → wardley-RL74JXVD-2t7cMqdS.js} +1 -1
- package/dist/deck-client/assets/{wardleyDiagram-NUSXRM2D-BTjjuDU3.js → wardleyDiagram-NUSXRM2D-DzboAsHh.js} +1 -1
- package/dist/deck-client/assets/{xychartDiagram-5P7HB3ND-AYbv92n-.js → xychartDiagram-5P7HB3ND-CgTP9u2V.js} +1 -1
- package/dist/deck-client/index.html +2 -2
- package/dist/server/beacon-monitor-entry.js +548 -6
- package/dist/server/chart-serve.js +917 -248
- package/dist/server/cli.js +2033 -385
- package/dist/server/deck-mcp-entry.js +141 -21
- package/dist/server/deck-serve.js +141 -21
- package/dist/server/graph-mcp-entry.js +1991 -333
- package/dist/server/init-entry.js +24 -13
- package/dist/server/orbit-entry.js +135 -7
- package/dist/server/parse-worker-entry.js +918 -247
- package/package.json +4 -2
- package/scaffolds/ls-marketplace/plugins/kit/skills/analyse/SKILL.md +180 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-array/SKILL.md +107 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-clear/SKILL.md +94 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-pulse/SKILL.md +82 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-scan/SKILL.md +66 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/blast-radius/SKILL.md +117 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/brief/SKILL.md +112 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/course/SKILL.md +84 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/debug/SKILL.md +85 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/deploy-check/SKILL.md +160 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/diagram/SKILL.md +152 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/orbit/SKILL.md +87 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/prototype/SKILL.md +110 -0
- package/scaffolds/ls-marketplace/plugins/kit/skills/recovery/SKILL.md +95 -0
- package/scaffolds/ls-marketplace/plugins/kit/{commands/show-mcp-status.md → skills/show-mcp-status/SKILL.md} +4 -4
- package/scaffolds/ls-marketplace/plugins/kit/skills/wireframe/SKILL.md +90 -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 +0 -7
- 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/index-Dg1r-WSN.js +0 -476
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-BrV78NDR.js +0 -1
- 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/dist/chart-client/assets/{index-Ccy-DpI-.js → index-B__ARB8k.js} +0 -0
- /package/dist/client/assets/{index-Dp0_okva.js → index-h8kMzVtG.js} +0 -0
- /package/dist/council-client/assets/{index-Dt4zWKSj.js → index-CWaDcsFR.js} +0 -0
|
@@ -0,0 +1,117 @@
|
|
|
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
|
+
when_to_use: |
|
|
4
|
+
Auto-fire when the user wants to VISUALISE the reverse-dependency blast radius for a specific node (file / table / endpoint / hook) before a refactor, migration, or contract change. Trigger phrases: "what breaks if I change X", "blast radius for X", "impact of refactoring X", "who's affected if I rename / drop / remove X", "scope this migration", "ripple effect of changing X", "is X safe to remove". Deck is required because the deliverable is an interactive radial graph — a flat list of dependents in the terminal misses ring/layer structure. Do NOT auto-fire for: simple "who imports X" or "where is X used" (use /kit:analyse), reading the structure of one file (use chart read_graph directly), planning the change itself (separate step that runs after blast-radius), plain-text dependency summaries the user can read in the terminal, or any request without a clear named target node.
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- mcp__launch-deck__server_status
|
|
7
|
+
- mcp__launch-deck__start_server
|
|
8
|
+
- mcp__launch-deck__deck
|
|
9
|
+
- mcp__launch-chart__chart_server_status
|
|
10
|
+
- mcp__launch-chart__detect_project_stack
|
|
11
|
+
- mcp__launch-chart__blast_points
|
|
12
|
+
- mcp__launch-chart__read_graph
|
|
13
|
+
- mcp__launch-secure__kit_feedback_submit
|
|
14
|
+
- Bash
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# /kit:blast-radius
|
|
18
|
+
|
|
19
|
+
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.).
|
|
20
|
+
|
|
21
|
+
Parse `$ARGUMENTS`:
|
|
22
|
+
- **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.
|
|
23
|
+
- **hops=N** — max traversal depth. Default 2.
|
|
24
|
+
- **layer=<id>** — restrict to one layer when the same name exists in multiple layers (e.g. `layer=db`).
|
|
25
|
+
- **--session=<id>** — deck session name. Default `blast-<target-slug>`.
|
|
26
|
+
- **--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.
|
|
27
|
+
|
|
28
|
+
Examples:
|
|
29
|
+
- `/kit:blast-radius lib/permissions/types.ts`
|
|
30
|
+
- `/kit:blast-radius User layer=db hops=3`
|
|
31
|
+
- `/kit:blast-radius POST /api/work-items --mode=feature`
|
|
32
|
+
|
|
33
|
+
## Preflight
|
|
34
|
+
|
|
35
|
+
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).
|
|
36
|
+
2. Run `mcp__launch-chart__detect_project_stack` once. Cache the returned `layers` for the bug-report fallback below.
|
|
37
|
+
|
|
38
|
+
## 1. Compute the blast points
|
|
39
|
+
|
|
40
|
+
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.
|
|
41
|
+
|
|
42
|
+
**Chart-gap detection** — if any of these are true, file a feedback comment per the shared `chart-gap` protocol below before stopping:
|
|
43
|
+
- `error` is set
|
|
44
|
+
- `nodes` is empty AND the user explicitly named a node id that exists on disk (verify by `Read`-ing the path)
|
|
45
|
+
- `summary.byLayer` covers fewer layers than `detect_project_stack` reported as available
|
|
46
|
+
|
|
47
|
+
## 2. Build the manifest
|
|
48
|
+
|
|
49
|
+
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:
|
|
50
|
+
- db → `database`, `#172554`
|
|
51
|
+
- api → `server`, `#1e3a5f`
|
|
52
|
+
- ui → `layout-dashboard`, `#0c4a6e`
|
|
53
|
+
- static → `file-text`, `#374151`
|
|
54
|
+
- shared → `puzzle`, `#4338ca`
|
|
55
|
+
- middleware → `shield`, `#1f2937`
|
|
56
|
+
- config → `cog`, `#52525b`
|
|
57
|
+
|
|
58
|
+
Rings:
|
|
59
|
+
- structural mode (default): `[{id:"hop1",name:"Direct",color:"#f97316"},{id:"hop2",name:"Indirect",color:"#eab308"}]`
|
|
60
|
+
- feature mode: `[{id:"modify",name:"Modify",color:"#f97316"},{id:"create",name:"Create",color:"#22c55e"},{id:"ripple",name:"Ripple",color:"#eab308"}]`
|
|
61
|
+
|
|
62
|
+
Centre node: `{ name: <target>, description: "<N> direct, <M> indirect (<hops> hops)" }`.
|
|
63
|
+
|
|
64
|
+
Nodes: map each blast result row to `{ id, name, layer, ring: hop===1 ? "hop1" : "hop2", path, type }`.
|
|
65
|
+
|
|
66
|
+
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).
|
|
67
|
+
|
|
68
|
+
## 3. Push to deck
|
|
69
|
+
|
|
70
|
+
Call `mcp__launch-deck__deck` with `session: <session>`, `mode: "show"`, `blocks: [{ type: "blast-radius", label: <target>, manifest: <built-manifest> }]`.
|
|
71
|
+
|
|
72
|
+
If the deck server isn't running, call `mcp__launch-deck__start_server` first, then retry.
|
|
73
|
+
|
|
74
|
+
## 4. Open in browser
|
|
75
|
+
|
|
76
|
+
After the push, open the per-session URL so the user lands directly on this blast-radius:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
open "<deck-url>/#<session>" # macOS
|
|
80
|
+
xdg-open "<deck-url>/#<session>" # Linux
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
`<deck-url>` is the `url` returned by `mcp__launch-deck__server_status` (typically `http://localhost:52829`). The `#<session>` hash deep-links to this exact session.
|
|
84
|
+
|
|
85
|
+
## Output
|
|
86
|
+
|
|
87
|
+
After the push, print a terse summary:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
blast-radius for <target> — <N> direct, <M> indirect (<hops> hops)
|
|
91
|
+
by layer: db 4, api 7, ui 12
|
|
92
|
+
pushed to deck session "<session>" — <deck-url>/#<session>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Chart-gap protocol (shared)
|
|
96
|
+
|
|
97
|
+
When the chart MCP returns less data than expected, file ONE report via `mcp__launch-secure__kit_feedback_submit` (the kit-self feedback channel — NOT `communication_write`, which would land in the user's own project Comm Hub instead of the launch-kit project) before stopping:
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
title: "launch-chart gap: <one-line>"
|
|
101
|
+
source: "kit:blast-radius"
|
|
102
|
+
body: |
|
|
103
|
+
Skill: /kit:blast-radius
|
|
104
|
+
Tool: blast_points(node_id=<id>, hops=<n>, layer=<layer?>)
|
|
105
|
+
Returned: <nodes_count> nodes, layers=<layers_seen>
|
|
106
|
+
Expected: <what-was-expected, e.g. "node exists at <path>" or "layer X should appear">
|
|
107
|
+
Project stack: <one-line summary from detect_project_stack>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Do NOT spam — file at most one report per skill invocation. After filing, tell the user "Filed chart-gap report to launch-kit project. Falling back to read_graph + Read." and continue with a degraded path: try `mcp__launch-chart__read_graph` with `search: <target>` to confirm the node exists in any layer; if so, do the blast-radius math from `include_edges: true` results manually; otherwise stop and surface the gap to the user.
|
|
111
|
+
|
|
112
|
+
## Constraints
|
|
113
|
+
|
|
114
|
+
- **MCP-first.** Never grep the filesystem to build the manifest — use `blast_points` and `read_graph`.
|
|
115
|
+
- **Idempotent on re-run.** Re-pushing to the same session overwrites the previous render — that's fine, just tell the user.
|
|
116
|
+
- **Single bug-file per run.** Don't file a comment for every gap; bundle into one report.
|
|
117
|
+
- **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."
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Show the currently active LaunchSecure course (server profile) and list the others available in .launch-secure.cred.config. Surfaces which serverUrl/org/project this Claude session is talking to so the user doesn't post local LS comms to prod, or vice versa. Read-only by default; switch is opt-in.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /kit:course
|
|
6
|
+
|
|
7
|
+
A "course" is a named LaunchSecure destination — `serverUrl + PAT + orgSlug + projectSlug` — stored under `profiles` in `.launch-secure.cred.config`. The active course drives every MCP call and every `npx launch-pod` invocation. This skill answers two questions: *which course am I on right now*, and *what others are available* — without changing anything unless explicitly told to.
|
|
8
|
+
|
|
9
|
+
Parse `$ARGUMENTS` — first token is the subcommand:
|
|
10
|
+
|
|
11
|
+
- (empty) or **status** — one-line: which course is active.
|
|
12
|
+
- **list** — table of every course, active marked with `★`.
|
|
13
|
+
- **switch <name>** — change the active course (rewrites `.launch-secure.cred.config` AND `.mcp.json`'s launch-secure URL). Asks for confirmation.
|
|
14
|
+
- **diff** — show the deltas between two courses (`--a=<name> --b=<name>`).
|
|
15
|
+
|
|
16
|
+
Examples:
|
|
17
|
+
- `/kit:course` → "active: prod (acme/launchsecure-v2 @ launchsecure-v2.vercel.app)"
|
|
18
|
+
- `/kit:course list` → table
|
|
19
|
+
- `/kit:course switch local`
|
|
20
|
+
- `/kit:course diff --a=local --b=prod`
|
|
21
|
+
|
|
22
|
+
## Preflight
|
|
23
|
+
|
|
24
|
+
Confirm `.launch-secure.cred.config` exists in the cwd (or in the nearest parent up to 3 levels — `cred-shape.ts`'s lookup convention). If missing, tell the user: `"No .launch-secure.cred.config here. Run \`npx @launchsecure/launch-kit init\` first."`
|
|
25
|
+
|
|
26
|
+
Read the cred file directly (it's gitignored, lives at the repo root, JSON shape with `active` + `profiles`). Never call out to launch-course CLI from inside the skill for read operations — read the file. Use `launch-course` (Bash) only for `switch` (it owns the MCP rewrite invariant).
|
|
27
|
+
|
|
28
|
+
## Per-subcommand behavior
|
|
29
|
+
|
|
30
|
+
### status (default)
|
|
31
|
+
|
|
32
|
+
Read the cred file. Print one line:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
active: <name> (<orgSlug>/<projectSlug> @ <serverUrl>)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
If the file is in legacy flat shape (single profile at the top), say so explicitly: `"active: (legacy single-profile shape — no name; first multi-profile op auto-migrates)"`.
|
|
39
|
+
|
|
40
|
+
### list
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
courses (3):
|
|
44
|
+
name serverUrl org/project
|
|
45
|
+
★ prod https://launchsecure-v2.vercel.app acme/launchsecure-v2
|
|
46
|
+
staging https://staging.launchsecure-v2.app acme/launchsecure-v2
|
|
47
|
+
local http://localhost:3000 acme/launchsecure-v2
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Sort: active first, then alphabetical. Column-align with monospace.
|
|
51
|
+
|
|
52
|
+
### switch
|
|
53
|
+
|
|
54
|
+
1. Sanity-check `<name>` exists in `profiles`. If not, list available names and stop.
|
|
55
|
+
2. Print the BEFORE → AFTER one-liner:
|
|
56
|
+
```
|
|
57
|
+
switching: prod (acme/launchsecure-v2 @ launchsecure-v2.vercel.app)
|
|
58
|
+
→ local (acme/launchsecure-v2 @ localhost:3000)
|
|
59
|
+
```
|
|
60
|
+
3. Ask: `"Continue? (yes / no)"` — wait for `yes`. Per project memory, destructive/sticky changes require explicit confirmation.
|
|
61
|
+
4. On `yes`, run `npx launch-course set <name>` via Bash. This rewrites both `.launch-secure.cred.config` (active pointer) AND `.mcp.json` (the launch-secure URL). Surface the CLI output verbatim.
|
|
62
|
+
5. After switch, remind: `"Restart Claude Code to pick up the new MCP URL (or use \`/mcp reload\` if available)."`
|
|
63
|
+
|
|
64
|
+
### diff
|
|
65
|
+
|
|
66
|
+
Resolve `--a` and `--b` from `profiles`. Print a compact diff:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
local → prod
|
|
70
|
+
serverUrl http://localhost:3000 → https://launchsecure-v2.vercel.app
|
|
71
|
+
org acme → acme
|
|
72
|
+
project launchsecure-v2 → launchsecure-v2
|
|
73
|
+
pat sha256:abc1…ef → sha256:def0…12
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
PAT values are hashed (sha256 first 8 of each, last 2 — purely for the user to confirm they differ; never print full PATs). Same row for unchanged values.
|
|
77
|
+
|
|
78
|
+
## Constraints
|
|
79
|
+
|
|
80
|
+
- **Read-only by default.** Only `switch` writes; status/list/diff never mutate.
|
|
81
|
+
- **Switch requires confirmation.** Per project memory, never destructive without `yes`.
|
|
82
|
+
- **No PAT exfiltration.** Never print the full PAT value; show short hashes for diff identification only.
|
|
83
|
+
- **Don't bypass launch-course CLI.** The `switch` MCP-rewrite logic is its responsibility — call the CLI; don't reimplement the .mcp.json mutation inside the skill (drift risk).
|
|
84
|
+
- **Surface the active course on every run.** Even on `list`/`diff`, the first or last line shows which course is active so the user is never confused about session scope.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Investigate a bug, error message, or unexpected behavior using launch-chart first (structural + variable queries), falling back to grep/Read only when the chart can't answer. When the chart gap is the reason for the fallback, files a feedback comment to LaunchSecure so the gap is monitored and fixed.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /kit:debug
|
|
6
|
+
|
|
7
|
+
A guided investigation workflow that defaults to chart-MCP queries and only reaches for grep/Read when the chart can't answer — and when that happens, files a one-line feedback comment in LS so the gap doesn't go unnoticed.
|
|
8
|
+
|
|
9
|
+
Parse `$ARGUMENTS`:
|
|
10
|
+
- **symptom** (required) — the error message, broken behavior, or question to investigate. Quoted is fine: `/kit:debug "tags don't render on the work-item drawer"`.
|
|
11
|
+
- **--start=<node>** — start the investigation from a specific file/function/table id (skip the search step).
|
|
12
|
+
- **--layer=<id>** — scope chart queries to one layer (ui / api / db / static).
|
|
13
|
+
- **--no-grep-fallback** — refuse the grep fallback entirely (strict MCP-only).
|
|
14
|
+
|
|
15
|
+
Examples:
|
|
16
|
+
- `/kit:debug tags don't render on the work-item drawer`
|
|
17
|
+
- `/kit:debug "TypeError: Cannot read property 'status' of undefined" --layer=ui`
|
|
18
|
+
- `/kit:debug --start=src/server/comms/build-feed.ts`
|
|
19
|
+
|
|
20
|
+
## Investigation loop
|
|
21
|
+
|
|
22
|
+
Run this loop until the user has enough to act, OR until a fallback was filed (then surface the fallback):
|
|
23
|
+
|
|
24
|
+
### Step 1 — locate the entry point
|
|
25
|
+
|
|
26
|
+
If `--start` was given, jump to step 2. Otherwise, use chart to find candidate nodes:
|
|
27
|
+
|
|
28
|
+
1. Extract key terms from the symptom (component name, identifier, error class). Skip noise words.
|
|
29
|
+
2. Call `mcp__launch-chart__read_graph(search: <term>, type: <best-guess-type>, layer: <layer?>)`. If `type` is uncertain, omit it and filter the response by relevance.
|
|
30
|
+
3. If `read_graph` returns 0 candidates, broaden: try without `type`, then without `layer`. Surface the top 3 candidates to the user as ranked options; if the user can pick, jump to step 2 with their pick.
|
|
31
|
+
|
|
32
|
+
**Chart-gap detection (entry-point search):**
|
|
33
|
+
- If `read_graph` returns 0 candidates AND a quick `grep` confirms the term exists somewhere in source → file a chart-gap report per the protocol below, then proceed via the grep fallback for this query only.
|
|
34
|
+
- If `detect_project_stack` lists a layer (e.g. `api`) but `read_graph(layer:"api")` returns 0 nodes → file a chart-gap report (parser misconfig).
|
|
35
|
+
|
|
36
|
+
### Step 2 — understand the node
|
|
37
|
+
|
|
38
|
+
Once the entry point is known, query its structure and behavior:
|
|
39
|
+
|
|
40
|
+
- **Structural** — `mcp__launch-chart__read_graph(node_id: <id>, hops: 1, include_edges: true)` for what it renders/imports and what depends on it.
|
|
41
|
+
- **Variable / state** — `mcp__launch-chart__inspect_node(node_id: <id>, fields: ["stateVars"])` or `(filter: <key-term>)` for what state it holds, what conditions exist. Per project CLAUDE.md, ALWAYS start with `fields` or `filter` to keep the response small.
|
|
42
|
+
|
|
43
|
+
Compose a hypothesis from these two reads. Example: "WorkItemDrawer fetches tags via `useWorkItemTags`, which calls `GET /api/work-items/:id/tags` — let's see what that returns."
|
|
44
|
+
|
|
45
|
+
### Step 3 — follow the trail
|
|
46
|
+
|
|
47
|
+
Walk the dependency edges toward the suspected cause (API endpoint, DB table, util fn, etc.). At each hop, use `read_graph(node_id, hops:1)` to find the next link. When you hit a leaf or run out of edges, narrate the chain back to the user with file:line refs from the node ids.
|
|
48
|
+
|
|
49
|
+
### Step 4 — propose, don't fix
|
|
50
|
+
|
|
51
|
+
End with a one-paragraph diagnosis + 2-3 candidate causes ranked by likelihood. Do NOT propose an edit unless the user asks for one — debug is investigation, not implementation. Suggest the next move: "Want me to read the route handler and confirm?" or "Want `/kit:diagram sequence`-ing the call chain?"
|
|
52
|
+
|
|
53
|
+
## Grep fallback
|
|
54
|
+
|
|
55
|
+
Only enter this path when:
|
|
56
|
+
- the chart returned no results AND a chart-gap report was filed, OR
|
|
57
|
+
- the symptom is about a non-TS asset (CSS string, env var, JSON value, comment) — the chart doesn't model these and the gap is expected.
|
|
58
|
+
|
|
59
|
+
Then use `grep`/`Read` directly. Always tell the user explicitly: `"Chart returned nothing — falling back to grep (filed gap report id: …)"` or `"Symptom is in CSS/JSON, which chart doesn't model — using grep directly (no gap report needed)."`
|
|
60
|
+
|
|
61
|
+
## Chart-gap protocol (shared)
|
|
62
|
+
|
|
63
|
+
When the chart MCP returns less than the symptom suggests it should, file ONE report via `mcp__launch-secure__kit_feedback_submit` (the kit-self feedback channel — NOT `communication_write`, which would land in the user's own project Comm Hub instead of the launch-kit project):
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
title: "launch-chart gap: <one-line>"
|
|
67
|
+
source: "kit:debug"
|
|
68
|
+
body: |
|
|
69
|
+
Skill: /kit:debug
|
|
70
|
+
Symptom: <one-line symptom>
|
|
71
|
+
Tool: read_graph(search="…", layer="…", type="…")
|
|
72
|
+
Returned: 0 nodes
|
|
73
|
+
Cross-check: grep "<term>" matched <N> files (sample: <path1>, <path2>)
|
|
74
|
+
Project stack: <detect_project_stack one-liner>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Then continue with the grep fallback for THIS query. Don't file again in the same invocation.
|
|
78
|
+
|
|
79
|
+
## Constraints
|
|
80
|
+
|
|
81
|
+
- **Chart-first.** Default to MCP queries; grep only when the chart cannot answer.
|
|
82
|
+
- **One gap report per invocation.** Don't spam comments.
|
|
83
|
+
- **No implementation.** This skill diagnoses; it does not edit. If the user wants the fix, they invoke `/fix:*` or hand the diagnosis back to you in chat.
|
|
84
|
+
- **Cite by node id.** Every claim links to a chart node id (file:line via `inspect_node` lines) so the user can verify.
|
|
85
|
+
- **Surface the fallback verbatim.** When grep is used, the message that grep was used (and why) must appear in the output — silent fallback hides the gap.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Production-readiness check for the current branch — typecheck, lint, build, prisma drift, migration safety, env coverage, and recent LS comms. Read-only; reports a punch list of go/no-go signals before a deploy or merge to a deploy-tracked branch. Does NOT deploy.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /kit:deploy-check
|
|
6
|
+
|
|
7
|
+
Audit the current branch for production readiness. Bundles every signal a human would manually check before clicking "deploy" or merging to a deploy-tracked branch (per project convention: `master`). Reports a punch list with ✓ / ⚠ / ✗ per check and a single go/no-go verdict.
|
|
8
|
+
|
|
9
|
+
Parse `$ARGUMENTS`:
|
|
10
|
+
- (empty) — full check on the current branch vs `master` (or repo's default).
|
|
11
|
+
- **--target=<branch>** — compare against a different deploy-tracked branch.
|
|
12
|
+
- **--skip=<check,…>** — comma-separated checks to skip (e.g. `--skip=lint,build`). Use sparingly; surface skipped checks in the report.
|
|
13
|
+
- **--quick** — skip the build (the slowest check). Still runs typecheck, lint, prisma, env, comms.
|
|
14
|
+
- **--json** — emit a machine-readable report (per check: ok, detail, durationMs).
|
|
15
|
+
|
|
16
|
+
Examples:
|
|
17
|
+
- `/kit:deploy-check`
|
|
18
|
+
- `/kit:deploy-check --quick`
|
|
19
|
+
- `/kit:deploy-check --skip=lint`
|
|
20
|
+
- `/kit:deploy-check --target=staging-mirror --json`
|
|
21
|
+
|
|
22
|
+
## Preflight
|
|
23
|
+
|
|
24
|
+
1. Confirm cwd is a git repo (`git rev-parse --is-inside-work-tree`).
|
|
25
|
+
2. Resolve the target branch — `--target=` if given, else default branch (`git symbolic-ref refs/remotes/origin/HEAD --short` → strip `origin/`; fall back to `master`).
|
|
26
|
+
3. Print the scope upfront: `"deploy-check: <current-branch> → <target-branch>"`. The user should never wonder which comparison this is.
|
|
27
|
+
4. Stash check — if `git status --porcelain` shows uncommitted changes, surface this as a `⚠ uncommitted changes in working tree` row at the top of the report. Don't refuse; some workflows want the check to include uncommitted work.
|
|
28
|
+
|
|
29
|
+
## Checks
|
|
30
|
+
|
|
31
|
+
Run every check in PARALLEL when possible (typecheck/lint/build are independent and slow). Each check returns `{ name, status: "ok"|"warn"|"fail", detail: <one-line>, artifact?: <path or url> }`.
|
|
32
|
+
|
|
33
|
+
### 1. branch_freshness
|
|
34
|
+
|
|
35
|
+
How far behind the target branch is the current branch?
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
git fetch --quiet origin
|
|
39
|
+
git rev-list --left-right --count <target>...HEAD
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
- ✓ `0 commits behind target` → fresh
|
|
43
|
+
- ⚠ `1–10 behind`
|
|
44
|
+
- ✗ `>10 behind` → suggest `git merge origin/<target>` or rebase
|
|
45
|
+
|
|
46
|
+
### 2. typecheck
|
|
47
|
+
|
|
48
|
+
`npx tsc --noEmit` (or the project's `npm run typecheck` if defined in `package.json` scripts — prefer the script).
|
|
49
|
+
|
|
50
|
+
- ✓ `0 errors`
|
|
51
|
+
- ✗ `<N> errors` (sample first 3 file:line:message)
|
|
52
|
+
|
|
53
|
+
### 3. lint
|
|
54
|
+
|
|
55
|
+
`npm run lint` if defined in `package.json` scripts; else skip with a `⚠ no lint script defined` row.
|
|
56
|
+
|
|
57
|
+
- ✓ `0 errors`
|
|
58
|
+
- ⚠ `<N> warnings`
|
|
59
|
+
- ✗ `<N> errors`
|
|
60
|
+
|
|
61
|
+
### 4. build
|
|
62
|
+
|
|
63
|
+
`npm run build` (uses the project's actual build pipeline so the check matches what Vercel/CI would do). Skip if `--quick` or `--skip=build`.
|
|
64
|
+
|
|
65
|
+
- ✓ `built in <durationMs>ms`
|
|
66
|
+
- ✗ `build failed` (last 20 lines of stderr as artifact)
|
|
67
|
+
|
|
68
|
+
Note: this runs the full prod build including prisma generate + migrate deploy. Make sure `DATABASE_URL` is set to a *safe* dev DB before running. If `DATABASE_URL` looks production-y (matches `vercel.app`, `neon.tech`, `rds.amazonaws.com`, etc.), refuse the build step and surface `⚠ build skipped — DATABASE_URL looks production-y (<host>); re-run with a dev DB or pass --skip=build`.
|
|
69
|
+
|
|
70
|
+
### 5. prisma_drift
|
|
71
|
+
|
|
72
|
+
Schema vs migrations consistency:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
npx prisma migrate diff --from-schema-datasource prisma/schema.prisma --to-migrations prisma/migrations --shadow-database-url <DEV_SHADOW_URL>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The project authors migrations by hand (CLAUDE.md: never `prisma db push` or `migrate dev`). So this diff should be EMPTY — any non-empty result means a model field was added without a corresponding hand-written migration.
|
|
79
|
+
|
|
80
|
+
- ✓ `schema matches migrations`
|
|
81
|
+
- ✗ `<N> drift detected` — surface the diff body as an artifact; suggest authoring a migration per the project's hand-written SQL convention.
|
|
82
|
+
|
|
83
|
+
If no `DEV_SHADOW_URL` is available, skip this check with `⚠ prisma_drift skipped — no shadow DB URL` and recommend setting one in `.env.local`.
|
|
84
|
+
|
|
85
|
+
### 6. migration_safety
|
|
86
|
+
|
|
87
|
+
Recent migrations on the branch — look at every migration file added since divergence from target:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
git diff --name-only <target>...HEAD -- prisma/migrations/
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
For each new migration, scan the SQL for risk patterns (per project CLAUDE.md migration safety rules):
|
|
94
|
+
|
|
95
|
+
- ✓ no destructive ops (`DROP COLUMN`, `DROP TABLE`, `ALTER COLUMN ... DROP`, `DELETE FROM` without `WHERE` matching backup) found.
|
|
96
|
+
- ⚠ destructive ops present BUT a sidecar `CREATE TABLE _backup_*` exists in the same file AND an orphan-check (`RAISE EXCEPTION ... orphans remain`) is present.
|
|
97
|
+
- ✗ destructive ops without backup OR without orphan-check OR mixing expand+contract in a single migration.
|
|
98
|
+
|
|
99
|
+
Each failure cites the exact migration filename + line numbers.
|
|
100
|
+
|
|
101
|
+
### 7. env_coverage
|
|
102
|
+
|
|
103
|
+
Compare `.env.example` (or `.env.testing` if it exists) keys against `process.env.*` references in the new code since divergence:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
git diff <target>...HEAD -- '*.ts' '*.tsx' | grep -oE 'process\.env\.[A-Z_][A-Z0-9_]+'
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
- ✓ every referenced env var is documented in `.env.example`
|
|
110
|
+
- ⚠ `<N> new env vars used but missing from .env.example` (list them)
|
|
111
|
+
- ✗ N/A (always a warn, never a hard fail — env docs are advisory)
|
|
112
|
+
|
|
113
|
+
### 8. recent_comms (LS Comm Hub)
|
|
114
|
+
|
|
115
|
+
Pull the last 10 comments tagged `release` or `daily_update` via `mcp__launch-secure__communication_read` and surface a one-line: `"<N> release/standup comments in last 7 days — latest: <title> (<author>, <age>)"`. This is informational — it helps the user know if a release note was already drafted or if the team flagged something to ship.
|
|
116
|
+
|
|
117
|
+
Skip with a `⚠ launch-secure MCP not wired` row if the MCP isn't available; don't fail the whole check.
|
|
118
|
+
|
|
119
|
+
### 9. recall_health
|
|
120
|
+
|
|
121
|
+
`mcp__launch-recall__recall_status` — ensures the shadow-git backup is alive so a rollback path exists if the deploy goes sideways. Informational only.
|
|
122
|
+
|
|
123
|
+
- ✓ `recall alive — last snap <X ago>`
|
|
124
|
+
- ⚠ `recall dead — restart before deploy (\`/kit:recall doctor\` for detail)`
|
|
125
|
+
|
|
126
|
+
## Report
|
|
127
|
+
|
|
128
|
+
Render a punch list (plain text, monospace; not markdown table):
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
deploy-check: implementation → master
|
|
132
|
+
|
|
133
|
+
✓ branch_freshness 0 commits behind master
|
|
134
|
+
✓ typecheck 0 errors (3.2s)
|
|
135
|
+
⚠ lint 12 warnings (no errors)
|
|
136
|
+
✓ build built in 47s
|
|
137
|
+
✓ prisma_drift schema matches migrations
|
|
138
|
+
✗ migration_safety 1 destructive op without backup
|
|
139
|
+
→ prisma/migrations/2026_05_25_drop_legacy_thread/migration.sql:14 (DROP COLUMN legacyThreadId, no _backup_* sidecar)
|
|
140
|
+
⚠ env_coverage 2 new env vars missing from .env.example: FEED_BACKEND_URL, FEED_TIMEOUT_MS
|
|
141
|
+
✓ recent_comms 1 release comment in last 7 days — "Comm Hub channels rollout" (prajyot, 2d ago)
|
|
142
|
+
✓ recall_health alive — last snap 4m ago
|
|
143
|
+
|
|
144
|
+
verdict: NO-GO — 1 hard fail (migration_safety).
|
|
145
|
+
next: author a backup table + orphan check in the listed migration, then re-run /kit:deploy-check.
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Verdict rules:
|
|
149
|
+
- Any ✗ → NO-GO with the failing check(s) listed.
|
|
150
|
+
- All ✓ + ⚠ only → GO WITH CAVEATS, list the warnings.
|
|
151
|
+
- All ✓ → GO.
|
|
152
|
+
|
|
153
|
+
## Constraints
|
|
154
|
+
|
|
155
|
+
- **Read-only.** Never deploy, never push, never auto-fix.
|
|
156
|
+
- **Parallel checks.** Run independent checks concurrently (Bash run_in_background) — sequential bloats the wait time past usefulness.
|
|
157
|
+
- **No silent skips.** Every skipped check appears in the report with a reason.
|
|
158
|
+
- **DB-safe.** Refuse to run `build` against a production-looking DATABASE_URL — the build runs `prisma migrate deploy` against it.
|
|
159
|
+
- **Honest about scope.** This check is what a human would do manually; it is NOT a guarantee. Surface false-negatives readers: `"This check doesn't run e2e tests, doesn't validate runtime config, doesn't sniff for secrets in commits — those are separate skills."`
|
|
160
|
+
- **Use launch-chart only for nice-to-have context (e.g. blast radius of a migration), not for the gate.** The gate is git+npm+prisma+MCP-LS; chart is optional.
|