@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.
Files changed (202) hide show
  1. package/dist/beacon/beacon.mjs +2825 -1243
  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/internal/screenshot.d.ts +26 -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/chart-client/assets/{index-CJ4mgRRF.css → index-CDIhdgWg.css} +1 -1
  71. package/dist/chart-client/index.html +2 -2
  72. package/dist/client/assets/{index-DI5qSR_w.css → index-CfW4n40I.css} +1 -1
  73. package/dist/client/index.html +2 -2
  74. package/dist/council-client/assets/{index-C_-vAM9L.css → index-CZim6x1u.css} +1 -1
  75. package/dist/council-client/index.html +2 -2
  76. package/dist/deck-client/assets/{_baseUniq-W2JQDmje.js → _baseUniq-DdHaBFYO.js} +1 -1
  77. package/dist/deck-client/assets/{arc-DIBWAId9.js → arc-D98e_18X.js} +1 -1
  78. package/dist/deck-client/assets/{architectureDiagram-Q4EWVU46-CAIRMvJK.js → architectureDiagram-Q4EWVU46-DNFZzh-4.js} +1 -1
  79. package/dist/deck-client/assets/{blockDiagram-DXYQGD6D-BeNaNiOi.js → blockDiagram-DXYQGD6D-DeQvGUdX.js} +1 -1
  80. package/dist/deck-client/assets/{c4Diagram-AHTNJAMY-B9Ozi62h.js → c4Diagram-AHTNJAMY-B6ekZf1n.js} +1 -1
  81. package/dist/deck-client/assets/channel-DmR7Tyyt.js +1 -0
  82. package/dist/deck-client/assets/{chunk-4BX2VUAB-D7AZ47dt.js → chunk-4BX2VUAB-9aDWymq2.js} +1 -1
  83. package/dist/deck-client/assets/{chunk-4TB4RGXK-DnVnNPcI.js → chunk-4TB4RGXK-DtKQqaI7.js} +1 -1
  84. package/dist/deck-client/assets/{chunk-55IACEB6-UKYs-YNd.js → chunk-55IACEB6-COy9hEae.js} +1 -1
  85. package/dist/deck-client/assets/{chunk-EDXVE4YY-D43b-SKn.js → chunk-EDXVE4YY-D_f861An.js} +1 -1
  86. package/dist/deck-client/assets/{chunk-FMBD7UC4-QzBAoyyW.js → chunk-FMBD7UC4-CmuA5UKn.js} +1 -1
  87. package/dist/deck-client/assets/{chunk-OYMX7WX6-Cjif4r6W.js → chunk-OYMX7WX6-vT8z8D-0.js} +1 -1
  88. package/dist/deck-client/assets/{chunk-QZHKN3VN-CqLDirEI.js → chunk-QZHKN3VN-CTlwwg-R.js} +1 -1
  89. package/dist/deck-client/assets/{chunk-YZCP3GAM-_FQvmMs4.js → chunk-YZCP3GAM-C44yr620.js} +1 -1
  90. package/dist/deck-client/assets/classDiagram-6PBFFD2Q-Bl4ozQWs.js +1 -0
  91. package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-Bl4ozQWs.js +1 -0
  92. package/dist/deck-client/assets/clone-BAy58j24.js +1 -0
  93. package/dist/deck-client/assets/{cose-bilkent-S5V4N54A-rfrocesE.js → cose-bilkent-S5V4N54A-DBB2J2nL.js} +1 -1
  94. package/dist/deck-client/assets/{dagre-KV5264BT-Bv_7DJat.js → dagre-KV5264BT-DxDTYbKl.js} +1 -1
  95. package/dist/deck-client/assets/{diagram-5BDNPKRD-4F1414G5.js → diagram-5BDNPKRD-DByWrWd1.js} +1 -1
  96. package/dist/deck-client/assets/{diagram-G4DWMVQ6-C4-Pszqm.js → diagram-G4DWMVQ6-B8B6ddMq.js} +1 -1
  97. package/dist/deck-client/assets/{diagram-MMDJMWI5-B647TIx9.js → diagram-MMDJMWI5-BMUZ2PWK.js} +1 -1
  98. package/dist/deck-client/assets/{diagram-TYMM5635-BFAqpezd.js → diagram-TYMM5635-Bk9e8BB-.js} +1 -1
  99. package/dist/deck-client/assets/{erDiagram-SMLLAGMA-BfBfrJOC.js → erDiagram-SMLLAGMA-DcOSwSol.js} +1 -1
  100. package/dist/deck-client/assets/{flowDiagram-DWJPFMVM-DX9YAYes.js → flowDiagram-DWJPFMVM-DI-4BR0F.js} +1 -1
  101. package/dist/deck-client/assets/{ganttDiagram-T4ZO3ILL-DCuiy7wF.js → ganttDiagram-T4ZO3ILL-BeZuXBoU.js} +1 -1
  102. package/dist/deck-client/assets/{gitGraphDiagram-UUTBAWPF-CGp1IXUh.js → gitGraphDiagram-UUTBAWPF-Bcki__f-.js} +1 -1
  103. package/dist/deck-client/assets/{graph-B7g8aoxv.js → graph-CifKx6G1.js} +1 -1
  104. package/dist/deck-client/assets/index-6sdqbm2o.js +2 -0
  105. package/dist/deck-client/assets/{index-DsIZ3LqL.css → index-BlTlhxFW.css} +1 -1
  106. package/dist/deck-client/assets/index-CB-qlwRT.js +1195 -0
  107. package/dist/deck-client/assets/{infoDiagram-42DDH7IO-L3fahMkF.js → infoDiagram-42DDH7IO-CReN1nFN.js} +1 -1
  108. package/dist/deck-client/assets/{ishikawaDiagram-UXIWVN3A-aS_EjWBZ.js → ishikawaDiagram-UXIWVN3A-CDF_VLN_.js} +1 -1
  109. package/dist/deck-client/assets/{journeyDiagram-VCZTEJTY-djTSQZF9.js → journeyDiagram-VCZTEJTY-DwgGrNVB.js} +1 -1
  110. package/dist/deck-client/assets/{kanban-definition-6JOO6SKY-CcTHo4CM.js → kanban-definition-6JOO6SKY-DB_zohh5.js} +1 -1
  111. package/dist/deck-client/assets/{layout-mEJiadb7.js → layout-DFfX1O3z.js} +1 -1
  112. package/dist/deck-client/assets/{linear-XgTKqyRu.js → linear-CtKb4EXj.js} +1 -1
  113. package/dist/deck-client/assets/{min-Ct9jZdpd.js → min-DCRRwUZv.js} +1 -1
  114. package/dist/deck-client/assets/{mindmap-definition-QFDTVHPH-BaFxCGNU.js → mindmap-definition-QFDTVHPH-D0QBOiFe.js} +1 -1
  115. package/dist/deck-client/assets/{pieDiagram-DEJITSTG-CIbYYjtw.js → pieDiagram-DEJITSTG-CD-EV5WB.js} +1 -1
  116. package/dist/deck-client/assets/{quadrantDiagram-34T5L4WZ-D9EtCOvh.js → quadrantDiagram-34T5L4WZ-B-JXZ8xI.js} +1 -1
  117. package/dist/deck-client/assets/{requirementDiagram-MS252O5E-xeni9eVG.js → requirementDiagram-MS252O5E-D2_OK5Dp.js} +1 -1
  118. package/dist/deck-client/assets/{sankeyDiagram-XADWPNL6-LYeknz9h.js → sankeyDiagram-XADWPNL6-BbBJqVSC.js} +1 -1
  119. package/dist/deck-client/assets/{sequenceDiagram-FGHM5R23-RDbsKFZf.js → sequenceDiagram-FGHM5R23-Db8A-Rkk.js} +1 -1
  120. package/dist/deck-client/assets/{stateDiagram-FHFEXIEX-BH1Zjglk.js → stateDiagram-FHFEXIEX-DGJnanjS.js} +1 -1
  121. package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-CR7riiab.js +1 -0
  122. package/dist/deck-client/assets/{timeline-definition-GMOUNBTQ-IFXxKptt.js → timeline-definition-GMOUNBTQ-BRkr6T4w.js} +1 -1
  123. package/dist/deck-client/assets/{vennDiagram-DHZGUBPP-D-sLkQs9.js → vennDiagram-DHZGUBPP-d0rsTqFo.js} +1 -1
  124. package/dist/deck-client/assets/{wardley-RL74JXVD-C010F8l4.js → wardley-RL74JXVD-2t7cMqdS.js} +1 -1
  125. package/dist/deck-client/assets/{wardleyDiagram-NUSXRM2D-BTjjuDU3.js → wardleyDiagram-NUSXRM2D-DzboAsHh.js} +1 -1
  126. package/dist/deck-client/assets/{xychartDiagram-5P7HB3ND-AYbv92n-.js → xychartDiagram-5P7HB3ND-CgTP9u2V.js} +1 -1
  127. package/dist/deck-client/index.html +2 -2
  128. package/dist/server/beacon-monitor-entry.js +548 -6
  129. package/dist/server/chart-serve.js +917 -248
  130. package/dist/server/cli.js +2033 -385
  131. package/dist/server/deck-mcp-entry.js +141 -21
  132. package/dist/server/deck-serve.js +141 -21
  133. package/dist/server/graph-mcp-entry.js +1991 -333
  134. package/dist/server/init-entry.js +24 -13
  135. package/dist/server/orbit-entry.js +135 -7
  136. package/dist/server/parse-worker-entry.js +918 -247
  137. package/package.json +4 -2
  138. package/scaffolds/ls-marketplace/plugins/kit/skills/analyse/SKILL.md +180 -0
  139. package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-array/SKILL.md +107 -0
  140. package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-clear/SKILL.md +94 -0
  141. package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-pulse/SKILL.md +82 -0
  142. package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-scan/SKILL.md +66 -0
  143. package/scaffolds/ls-marketplace/plugins/kit/skills/blast-radius/SKILL.md +117 -0
  144. package/scaffolds/ls-marketplace/plugins/kit/skills/brief/SKILL.md +112 -0
  145. package/scaffolds/ls-marketplace/plugins/kit/skills/course/SKILL.md +84 -0
  146. package/scaffolds/ls-marketplace/plugins/kit/skills/debug/SKILL.md +85 -0
  147. package/scaffolds/ls-marketplace/plugins/kit/skills/deploy-check/SKILL.md +160 -0
  148. package/scaffolds/ls-marketplace/plugins/kit/skills/diagram/SKILL.md +152 -0
  149. package/scaffolds/ls-marketplace/plugins/kit/skills/orbit/SKILL.md +87 -0
  150. package/scaffolds/ls-marketplace/plugins/kit/skills/prototype/SKILL.md +110 -0
  151. package/scaffolds/ls-marketplace/plugins/kit/skills/recovery/SKILL.md +95 -0
  152. package/scaffolds/ls-marketplace/plugins/kit/{commands/show-mcp-status.md → skills/show-mcp-status/SKILL.md} +4 -4
  153. package/scaffolds/ls-marketplace/plugins/kit/skills/wireframe/SKILL.md +90 -0
  154. package/scaffolds/statusline/statusline-mcp.sh +21 -9
  155. package/dist/beacon/types/capture/element.d.ts +0 -3
  156. package/dist/beacon/types/capture/element.d.ts.map +0 -1
  157. package/dist/beacon/types/capture/events.d.ts +0 -20
  158. package/dist/beacon/types/capture/events.d.ts.map +0 -1
  159. package/dist/beacon/types/capture/framework.d.ts +0 -3
  160. package/dist/beacon/types/capture/framework.d.ts.map +0 -1
  161. package/dist/beacon/types/capture/metadata.d.ts +0 -3
  162. package/dist/beacon/types/capture/metadata.d.ts.map +0 -1
  163. package/dist/beacon/types/capture/overlay.d.ts +0 -7
  164. package/dist/beacon/types/capture/overlay.d.ts.map +0 -1
  165. package/dist/beacon/types/capture/picker.d.ts.map +0 -1
  166. package/dist/beacon/types/capture/screenshot.d.ts +0 -7
  167. package/dist/beacon/types/capture/screenshot.d.ts.map +0 -1
  168. package/dist/beacon/types/capture/selector.d.ts.map +0 -1
  169. package/dist/beacon/types/monitor/dom.d.ts +0 -13
  170. package/dist/beacon/types/monitor/dom.d.ts.map +0 -1
  171. package/dist/beacon/types/monitor/index.d.ts +0 -19
  172. package/dist/beacon/types/monitor/index.d.ts.map +0 -1
  173. package/dist/beacon/types/monitor/network.d.ts +0 -12
  174. package/dist/beacon/types/monitor/network.d.ts.map +0 -1
  175. package/dist/beacon/types/monitor/transport.d.ts.map +0 -1
  176. package/dist/beacon/types/monitor/types.d.ts.map +0 -1
  177. package/dist/beacon/types/transport/submit.d.ts +0 -3
  178. package/dist/beacon/types/transport/submit.d.ts.map +0 -1
  179. package/dist/beacon/types/ui/button.d.ts +0 -2
  180. package/dist/beacon/types/ui/button.d.ts.map +0 -1
  181. package/dist/beacon/types/ui/drawer.d.ts +0 -33
  182. package/dist/beacon/types/ui/drawer.d.ts.map +0 -1
  183. package/dist/beacon/types/ui/icons.d.ts +0 -9
  184. package/dist/beacon/types/ui/icons.d.ts.map +0 -1
  185. package/dist/beacon/types/ui/monitor-panel.d.ts +0 -19
  186. package/dist/beacon/types/ui/monitor-panel.d.ts.map +0 -1
  187. package/dist/beacon/types/ui/pick-mode-overlay.d.ts.map +0 -1
  188. package/dist/beacon/types/ui/pin-popover.d.ts.map +0 -1
  189. package/dist/deck-client/assets/channel-CRdozqbp.js +0 -1
  190. package/dist/deck-client/assets/classDiagram-6PBFFD2Q-lIZMp57W.js +0 -1
  191. package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-lIZMp57W.js +0 -1
  192. package/dist/deck-client/assets/clone-BtWeSTyJ.js +0 -1
  193. package/dist/deck-client/assets/index-Dg1r-WSN.js +0 -476
  194. package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-BrV78NDR.js +0 -1
  195. package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-array.md +0 -92
  196. package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-clear.md +0 -68
  197. package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-pulse.md +0 -80
  198. package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-scan.md +0 -62
  199. /package/dist/beacon/types/{capture → internal}/selector.d.ts +0 -0
  200. /package/dist/chart-client/assets/{index-Ccy-DpI-.js → index-B__ARB8k.js} +0 -0
  201. /package/dist/client/assets/{index-Dp0_okva.js → index-h8kMzVtG.js} +0 -0
  202. /package/dist/council-client/assets/{index-Dt4zWKSj.js → index-CWaDcsFR.js} +0 -0
@@ -0,0 +1,152 @@
1
+ ---
2
+ description: Render a Mermaid diagram (flowchart, sequence, ERD, state, gantt) via launch-deck. For ERDs, auto-derives tables and relations from launch-chart's db layer so the diagram matches the real schema. Files a chart-gap feedback comment to LS if the db layer is missing or empty.
3
+ when_to_use: |
4
+ Auto-fire when the user wants a RENDERED Mermaid diagram visible in the browser — flowchart, sequence, ERD, state machine, or gantt. Trigger phrases: "diagram X", "draw the flowchart for Y", "sequence diagram of W", "ERD for the schema / for X module", "state diagram for V's lifecycle", "gantt of the rollout", "show me visually how X flows", "render this as a diagram", "give me a chart of the user table relations". Deck is required because Mermaid must be rendered to be useful — DSL text in the terminal cannot substitute. Do NOT auto-fire for: plain-text process explanations the user can read in the terminal ("walk me through how X works" — that's /kit:analyse or a direct terminal answer), ASCII flowcharts inline in chat, requests that already include Mermaid the user wrote, or schema questions where the answer is a few sentences rather than a diagram.
5
+ allowed-tools:
6
+ - mcp__launch-deck__server_status
7
+ - mcp__launch-deck__start_server
8
+ - mcp__launch-deck__deck
9
+ - mcp__launch-deck__await_feedback
10
+ - mcp__launch-chart__chart_server_status
11
+ - mcp__launch-chart__detect_project_stack
12
+ - mcp__launch-chart__read_graph
13
+ - mcp__launch-chart__inspect_node
14
+ - mcp__launch-secure__kit_feedback_submit
15
+ - Bash
16
+ ---
17
+
18
+ # /kit:diagram
19
+
20
+ Push a Mermaid diagram to launch-deck. Five flavors:
21
+
22
+ - **flowchart** — boxes-and-arrows for any process
23
+ - **sequence** — request/response timing between actors
24
+ - **erd** — entity-relationship diagram. Auto-pulled from chart `db` layer unless the user provides their own DSL.
25
+ - **state** — state machine
26
+ - **gantt** — timeline
27
+
28
+ Parse `$ARGUMENTS`:
29
+ - **kind** (required) — `flowchart` | `sequence` | `erd` | `state` | `gantt`. If absent, ask.
30
+ - **subject** (required for non-erd) — what to diagram, e.g. "user login flow" or "OAuth handshake".
31
+ - **--scope=<filter>** — for ERDs, limit to one module or table set (e.g. `--scope=auth` or `--scope=User,Org,Membership`). Default: all tables.
32
+ - **--session=<id>** — deck session name. Default `diagram-<kind>-<subject-slug>`.
33
+ - **--dsl=<raw-mermaid>** — bypass auto-generation; push the user's DSL verbatim.
34
+ - **--feedback** — push in feedback mode and await response.
35
+
36
+ Examples:
37
+ - `/kit:diagram flowchart user login flow`
38
+ - `/kit:diagram sequence OAuth handshake between client, gateway, idp`
39
+ - `/kit:diagram erd --scope=work-items`
40
+ - `/kit:diagram erd` → full project ERD
41
+ - `/kit:diagram state work-item lifecycle: backlog → todo → in-progress → done`
42
+
43
+ ## Preflight
44
+
45
+ 1. Confirm `mcp__launch-deck__server_status` is running; start if not.
46
+ 2. For `erd`: confirm `mcp__launch-chart__chart_server_status` is up, then call `mcp__launch-chart__detect_project_stack` and check `db` is in the layers list.
47
+
48
+ ## Build the DSL
49
+
50
+ ### flowchart / sequence / state / gantt
51
+
52
+ Translate the subject into Mermaid DSL based on what the user described. For sequence, infer actors from the subject (client/server/db are common defaults). Add concise labels — don't overload with prose.
53
+
54
+ Example flowchart skeleton:
55
+
56
+ ```mermaid
57
+ flowchart TD
58
+ Start([User opens app]) --> Auth{Session valid?}
59
+ Auth -- yes --> Home[Home]
60
+ Auth -- no --> Login[Login form]
61
+ Login -- success --> Home
62
+ ```
63
+
64
+ If the user passed `--dsl=…`, skip generation — use their DSL.
65
+
66
+ ### erd
67
+
68
+ Query the db layer to derive entities and edges:
69
+
70
+ 1. `mcp__launch-chart__read_graph(layer: "db", type: "table"[, module: <scope>])` — gets every table node.
71
+ 2. For each table, `mcp__launch-chart__inspect_node(node_id: <id>, fields: ["columns", "relations"])` to get fields and FK relations.
72
+ 3. Render Mermaid `erDiagram` DSL:
73
+
74
+ ```mermaid
75
+ erDiagram
76
+ USER ||--o{ WORK_ITEM : owns
77
+ USER {
78
+ string id PK
79
+ string email
80
+ datetime createdAt
81
+ }
82
+ WORK_ITEM {
83
+ string id PK
84
+ string userId FK
85
+ string title
86
+ enum type
87
+ }
88
+ ```
89
+
90
+ Rules:
91
+ - Use `||--o{` for 1:N FK relations, `}o--o{` for many-to-many join tables.
92
+ - Include PK + FK markers; include enum/scalar type for the first ~8 columns per table; truncate the rest with a `… (N more)` comment.
93
+ - Cap at 25 tables to keep the diagram readable. If the project has more than 25 in scope, ask the user to narrow with `--scope=`.
94
+
95
+ **Chart-gap detection** — file a feedback comment per the protocol below before stopping if:
96
+ - the db layer is missing from `detect_project_stack`
97
+ - `read_graph(layer: "db")` returns 0 nodes
98
+ - the chart shows tables but `inspect_node` returns no `columns` (parser misconfiguration)
99
+
100
+ ## Push to deck
101
+
102
+ Call `mcp__launch-deck__deck` with:
103
+ - `session: <session>`
104
+ - `mode: "show"` or `"feedback"` (+ `prompt: "Does this match the schema you expected?"` for ERDs)
105
+ - `blocks: [{ type: "mermaid", label: <kind>-<subject>, content: <mermaid-dsl> }]`
106
+
107
+ If `--feedback`, call `await_feedback` and surface the response.
108
+
109
+ ## Open in browser
110
+
111
+ After the push (and after `await_feedback` if `--feedback`), open the per-session URL so the user lands directly on this diagram:
112
+
113
+ ```
114
+ open "<deck-url>/#<session>" # macOS
115
+ xdg-open "<deck-url>/#<session>" # Linux
116
+ ```
117
+
118
+ `<deck-url>` is the `url` returned by `mcp__launch-deck__server_status` (typically `http://localhost:52829`). The `#<session>` hash deep-links to this exact session.
119
+
120
+ ## Output
121
+
122
+ ```
123
+ diagram pushed — deck session "<session>" — <deck-url>/#<session>
124
+ kind: <kind>
125
+ nodes: <N> edges: <M>
126
+ ```
127
+
128
+ For ERDs add `tables: <N> relations: <M> scope: <scope or "all">`.
129
+
130
+ ## Chart-gap protocol (shared)
131
+
132
+ When the chart MCP returns less data than expected (db layer missing, 0 tables, empty columns), file ONE report via `mcp__launch-secure__kit_feedback_submit` (the kit-self feedback channel — NOT `communication_write`, which would land in the user's own project Comm Hub instead of the launch-kit project) before stopping:
133
+
134
+ ```
135
+ title: "launch-chart gap: <one-line>"
136
+ source: "kit:diagram"
137
+ body: |
138
+ Skill: /kit:diagram
139
+ Tool: read_graph(layer="db", …) / inspect_node(...)
140
+ Returned: <tables_count> tables, <relations_count> relations
141
+ Expected: db layer present per detect_project_stack
142
+ Project stack: <one-line summary>
143
+ ```
144
+
145
+ Then fall back: render a `flowchart` placeholder explaining "DB layer not available — re-run `npx launch-chart generate_graph` then retry" instead of the ERD.
146
+
147
+ ## Constraints
148
+
149
+ - **MCP-first for ERDs.** Never grep `prisma/schema.prisma` to build the DSL — the chart has the parsed model.
150
+ - **Cap entities at 25.** Past that, Mermaid wraps unreadably; ask the user to narrow scope.
151
+ - **Mermaid only.** This skill does not draw raster images — Mermaid DSL is the deliverable.
152
+ - **One block per push.**
@@ -0,0 +1,87 @@
1
+ ---
2
+ description: Create an isolated worktree, run pre-merge gates, or merge an orbit into its target — using launch-orbit MCP tools with launch-chart layer detection in the pre-flight. Encodes the project's orbit standards (database fork by profile, gate enforcement, post-merge cleanup) so every orbit gets created and merged the same way.
3
+ ---
4
+
5
+ # /kit:orbit
6
+
7
+ Drive a launch-orbit worktree through its lifecycle: create → work → check_mergeable → merge → drop. Wraps the MCP tools with sensible defaults and a layer-aware pre-flight so the operator doesn't forget the project's conventions.
8
+
9
+ Parse `$ARGUMENTS` — first token is the subcommand:
10
+
11
+ - **create &lt;branch&gt;** — `[--base=<ref>] [--profile=<name>]` — fork resources per `orbit.json`, return path + envFile.
12
+ - **list** — list every orbit registered on this machine.
13
+ - **switch &lt;branch&gt;** — print the path/env for an existing orbit (no shell mutation).
14
+ - **doctor** — surface registry inconsistencies.
15
+ - **check &lt;branch&gt; --target=&lt;target-branch&gt;** — run pre-merge gates WITHOUT merging.
16
+ - **merge &lt;branch&gt; --target=&lt;target-branch&gt;** — `[--cleanup=full|none] [--skip-gate=<id>,…]` — run gates + merge.
17
+ - **drop &lt;branch&gt;** — `[--no-backup]` — tear down (backup, drop DB, remove worktree, deregister).
18
+
19
+ Examples:
20
+ - `/kit:orbit create feat-channel-rename --profile=fe`
21
+ - `/kit:orbit check feat-channel-rename --target=implementation`
22
+ - `/kit:orbit merge feat-channel-rename --target=implementation`
23
+ - `/kit:orbit doctor`
24
+
25
+ ## Preflight (runs on create / check / merge)
26
+
27
+ 1. Confirm `mcp__launch-orbit__orbit_doctor` returns no critical inconsistencies for THIS project. If it does, surface them and stop — the operator probably wants `/kit:orbit drop <stale-branch>` first.
28
+ 2. Confirm `orbit.json` exists at the repo root. If missing, tell the user to add one (point at the orbit docs) and stop.
29
+ 3. Run `mcp__launch-chart__detect_project_stack` and print the detected layers as part of the pre-flight log. This is the project's "what's in scope" surface — surface it before any branch op so the operator sees if the chart misses a layer that orbit.json's gates reference (e.g. orbit.json's build-lint gate runs against the api layer but chart doesn't see api).
30
+ 4. For **merge**: confirm `--target=` is set. Default is NOT `master` — explicit target only.
31
+
32
+ ## Per-subcommand behavior
33
+
34
+ ### create
35
+
36
+ 1. `mcp__launch-orbit__orbit_create` with `branch`, `baseRef` (if `--base`), `profile` (if `--profile`).
37
+ 2. On success, surface the returned `nextAction` (`cd <path>`) verbatim and the `envFile` path. Don't auto-cd — the operator's shell is theirs to drive.
38
+ 3. Remind: in the new worktree, `npx launch-kit refresh` will rewire MCPs against the worktree's `.launch-secure.cred.config` symlink if needed.
39
+
40
+ ### list
41
+
42
+ `mcp__launch-orbit__orbit_list` → one row per orbit: `slug branch age path resources`.
43
+
44
+ ### switch
45
+
46
+ `mcp__launch-orbit__orbit_switch(branch)` → print `cd <path>` + `envFile`. Don't run cd.
47
+
48
+ ### doctor
49
+
50
+ `mcp__launch-orbit__orbit_doctor` → list every issue with a one-line fix (e.g. `orphan-registration` → `/kit:orbit drop <branch>`).
51
+
52
+ ### check
53
+
54
+ `mcp__launch-orbit__orbit_check_mergeable(branch, target)` → render the gate report:
55
+
56
+ ```
57
+ orbit feat-channel-rename → implementation
58
+ ✓ builtin/mergeability (no textual conflicts)
59
+ ✗ builtin/build-lint (tsc: 3 errors, see <artifact>)
60
+ ✓ launchsecure/migration-safety (no destructive migrations)
61
+
62
+ result: BLOCKED — fix build-lint then retry.
63
+ ```
64
+
65
+ ### merge
66
+
67
+ 1. Run `check` first (same report). If `passed: false`, stop with the report — don't attempt the merge.
68
+ 2. If `passed: true`, call `mcp__launch-orbit__orbit_merge(branch, target, cleanup, skipGates)` and surface the result.
69
+ 3. Default `cleanup: "full"` (orbit is dropped post-merge after pg_dump). The operator must pass `--cleanup=none` to keep the orbit around.
70
+ 4. After a successful merge, recommend `/kit:standup` to surface the change in the next standup, and `/kit:diagram` if it touched the schema.
71
+
72
+ ### drop
73
+
74
+ `mcp__launch-orbit__orbit_drop(branch, backup: !args.noBackup)` → idempotent. Surface `backups[]` paths.
75
+
76
+ ## Conventions encoded here
77
+
78
+ - **No bare `--target=master`.** Default merge target is `implementation` per project CLAUDE.md ("implementation branch is parent for all impl branches"). If the operator types `--target=master`, double-check by asking once.
79
+ - **No `--skip-gate` without a reason in the next message.** Surface a banner: `"Skipping gates: <ids>. Reason?"` — let the operator answer in chat; do NOT proceed silently.
80
+ - **Always run `check` before `merge`.** The skill enforces this — even if the operator runs `merge` directly, the skill runs `check` first.
81
+ - **Layer awareness.** Pre-flight always prints `detect_project_stack` layers so the operator sees parity (or absence) between chart layers and orbit gate scope.
82
+
83
+ ## Constraints
84
+
85
+ - **MCP-first.** Never shell out to `git worktree`, `git merge`, `pg_dump` directly — orbit's tools own these.
86
+ - **Idempotent.** All subcommands are safe to retry. Drop especially — it handles partial-state gracefully.
87
+ - **Surface, don't hide.** If a gate fails, print the artifact path; if the doctor finds inconsistency, print the exact slug.
@@ -0,0 +1,110 @@
1
+ ---
2
+ description: Generate a working HTML/JS prototype page and push it to launch-deck for click-through review. Use to validate behavior — flow, transitions, interactions — before any framework code is touched. Calls deck's rich-html block with framework=raw; supports CDN scripts, animations, real DOM events.
3
+ when_to_use: |
4
+ Auto-fire when the user wants an INTERACTIVE throwaway page to validate behavior — click flows, transitions, optimistic updates, keyboard shortcuts, drag/drop — before any production code. Trigger phrases: "prototype X", "let me click through Y", "build a working demo of Z", "test the interaction for X", "throwaway version of W", "make it interactive so I can try it", "show me how the kanban drag would feel". Deck is required because the deliverable is a rendered, clickable page the user must touch — text/code descriptions in the terminal don't substitute. Do NOT auto-fire for: production implementation (use the appropriate fe:* / be:* flow), static visual mockups (use /kit:wireframe), reading or explaining existing code behavior (use /kit:analyse), plain-text walkthroughs of an interaction that the user can read in the terminal, or any request that's clearly about discussion not artifact production.
5
+ allowed-tools:
6
+ - mcp__launch-deck__server_status
7
+ - mcp__launch-deck__start_server
8
+ - mcp__launch-deck__deck
9
+ - mcp__launch-deck__await_feedback
10
+ - mcp__launch-chart__read_graph
11
+ - Bash
12
+ ---
13
+
14
+ # /kit:prototype
15
+
16
+ Build a self-contained, interactive HTML page (HTML + CSS + JS, optional CDN scripts) and push it to launch-deck. Unlike `/kit:wireframe`, this is a *working* prototype: the user can click, type, navigate fake routes, see transitions — the goal is to test behavior cheaply.
17
+
18
+ Parse `$ARGUMENTS`:
19
+ - **description** (required) — what the prototype should demonstrate, e.g. "drag-to-reorder kanban with optimistic update and rollback on error".
20
+ - **--session=<id>** — deck session name. Default `proto-<slugified-description-first-3-words>`.
21
+ - **--feedback** — push in `feedback` mode with `prompt: "Did this match the interaction you had in mind?"` and call `await_feedback`.
22
+ - **--cdn=tailwind|alpine|htmx|react|vue|none** — comma-separated CDN(s) to include. Default `tailwind` for styling. `none` for pure handwritten CSS.
23
+ - **--theme=light|dark** — only when the prototype demands one mode (e.g. a dark-mode-only design).
24
+
25
+ Examples:
26
+ - `/kit:prototype drag-to-reorder kanban with optimistic update`
27
+ - `/kit:prototype keyboard shortcut palette with fuzzy search --cdn=tailwind,alpine`
28
+ - `/kit:prototype landing page hero with parallax scroll --feedback`
29
+
30
+ ## Preflight
31
+
32
+ 1. Confirm `mcp__launch-deck__server_status` is running. Start if not.
33
+ 2. If the description references real entities/pages in this repo, run `mcp__launch-chart__read_graph(search: <hint>)` to pull the shape — so the prototype mirrors actual data field names. Optional; skip on first iteration to keep the loop fast.
34
+
35
+ ## Build the page
36
+
37
+ Generate a complete `<!DOCTYPE html>` document. Layout:
38
+
39
+ ```html
40
+ <!DOCTYPE html>
41
+ <html lang="en">
42
+ <head>
43
+ <meta charset="utf-8">
44
+ <meta name="viewport" content="width=device-width, initial-scale=1">
45
+ <title><short title></title>
46
+ <!-- CDNs (per --cdn flag) -->
47
+ <script src="https://cdn.tailwindcss.com"></script>
48
+ <script defer src="https://unpkg.com/alpinejs"></script>
49
+ <style>
50
+ /* page-specific styles */
51
+ </style>
52
+ </head>
53
+ <body class="…">
54
+ <!-- the prototype -->
55
+ <script>
56
+ // event handlers, state, fake data
57
+ </script>
58
+ </body>
59
+ </html>
60
+ ```
61
+
62
+ CDN catalog (use only what's requested):
63
+ - **tailwind** — `<script src="https://cdn.tailwindcss.com"></script>`
64
+ - **alpine** — `<script defer src="https://unpkg.com/alpinejs"></script>` for `x-data` reactivity
65
+ - **htmx** — `<script src="https://unpkg.com/htmx.org"></script>` for fake server swaps
66
+ - **react** — `<script crossorigin src="https://unpkg.com/react/umd/react.production.min.js"></script>` + `react-dom` + Babel CDN if JSX
67
+ - **vue** — `<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>`
68
+
69
+ Design rules:
70
+ - **Fake the backend.** Use in-memory arrays, `setTimeout` to simulate latency, `Math.random() < 0.1` to simulate intermittent failures (for testing rollback flows).
71
+ - **No real PII or secrets.** Use placeholder names ("Ada", "Lin", "Mehmet"), placeholder copy, never a real user from this project.
72
+ - **Show the interaction explicitly.** If the prototype's point is drag-to-reorder, make the drag affordance OBVIOUS (cursor change, hover scale, snap line). If the point is optimistic update + rollback, force a visible failure within ~5 clicks so the reviewer experiences it.
73
+ - **One screen unless the user asks for multi-screen.** Multi-screen prototypes use a fake router (`window.history.pushState` + a click handler) — don't pull in `react-router`.
74
+
75
+ ## Push to deck
76
+
77
+ Call `mcp__launch-deck__deck` with:
78
+ - `session: <session>`
79
+ - `mode: "show"` or `"feedback"` (+ `prompt`)
80
+ - `blocks: [{ type: "rich-html", framework: "raw", label: <short-title>, content: <full-doctype-html>, theme: <theme?> }]`
81
+
82
+ `framework: "raw"` means the deck does NOT wrap your content — what you ship IS the page. That's why the full `<!DOCTYPE html>` doctype is required.
83
+
84
+ If `--feedback`, call `mcp__launch-deck__await_feedback` afterward and surface the response.
85
+
86
+ ## Open in browser
87
+
88
+ After the push (and after `await_feedback` if `--feedback`), open the per-session URL so the user lands directly on this prototype:
89
+
90
+ ```
91
+ open "<deck-url>/#<session>" # macOS
92
+ xdg-open "<deck-url>/#<session>" # Linux
93
+ ```
94
+
95
+ `<deck-url>` is the `url` returned by `mcp__launch-deck__server_status` (typically `http://localhost:52829`). The `#<session>` hash deep-links to this exact session.
96
+
97
+ ## Output
98
+
99
+ ```
100
+ prototype pushed — deck session "<session>" — <deck-url>/#<session>
101
+ size: <N> KB markup, <M> CDN scripts, <K> inline event handlers
102
+ demonstrates: <one-line>
103
+ ```
104
+
105
+ ## Constraints
106
+
107
+ - **Self-contained.** No external API calls, no auth flows, no real LS endpoints. Everything in one HTML file.
108
+ - **One block per push.** Multi-block prototypes belong as separate sessions.
109
+ - **Iterate via re-push.** Same `--session` overwrites — that's the loop. Don't accumulate prototype-v2, prototype-v3 sessions.
110
+ - **No production-ready output.** If the user is happy with the prototype and wants to "turn it into the real thing," that's a separate `/fe:*` workflow — this skill is throw-away to validate behavior.
@@ -0,0 +1,95 @@
1
+ ---
2
+ description: Recover deleted, overwritten, or accidentally-modified files. Prefers launch-recall's shadow-git backup when wired (per-file snapshot history, debounced, doesn't need commits); falls back to git reflog / git stash / git log when recall isn't available. Read-only by default; restore is one-shot and prompts before overwriting. Never suggests destructive ops (git reset / git clean / rm) — recovery only.
3
+ when_to_use: |
4
+ Auto-fire whenever the user signals they've lost work or want to undo something on disk. Trigger phrases: "I lost X", "lost my changes", "deleted by mistake", "accidentally deleted / removed / overwrote", "auto-formatter ate", "prettier ate my comments", "can I get back / recover / restore X", "undo my last edit", "undo what I did to X", "go back to previous version", "previous version of X", "what was in X before", "revert this file", "rollback this file" (note: "rollback the deploy" is NOT this — that's deploy-check / orbit territory), "the file is gone", "where did X go" when framed as loss. Also auto-fire on manual subcommand usage: status / doctor / history / show / restore / diff / report. Do NOT auto-fire for: bug investigation ("why doesn't X work" → /kit:debug), code structure ("how does X work" → /kit:analyse), git workflow ("how do I commit / push / merge" → general git help).
5
+ allowed-tools:
6
+ - mcp__launch-recall__recall_status
7
+ - mcp__launch-recall__recall_doctor
8
+ - mcp__launch-recall__recall_history
9
+ - mcp__launch-recall__recall_report
10
+ - Bash(git --git-dir=*)
11
+ - Bash(git reflog*)
12
+ - Bash(git stash list*)
13
+ - Bash(git log*)
14
+ - Bash(git show*)
15
+ - Bash(git diff*)
16
+ ---
17
+
18
+ # /kit:recovery
19
+
20
+ Recover deleted / overwritten / lost files. **Recall-first** when wired, **git-fallback** when not. Read-only except for `restore` (which prompts).
21
+
22
+ ## Preflight — detect which path is available
23
+
24
+ Always start by checking which recovery backend is reachable. Run BOTH probes (cheap, in parallel):
25
+
26
+ 1. `mcp__launch-recall__recall_status` → if it returns `{running: true, lastSnapshotAt: …}`, recall is the preferred path. Note the `watchTree` for context.
27
+ 2. `Bash("git rev-parse --is-inside-work-tree 2>&1")` → confirms a regular git repo exists (for the fallback path and for cross-checks).
28
+
29
+ Surface what's available before doing anything else:
30
+ - Both available → use recall first, mention git as fallback.
31
+ - Only git available → tell user `"launch-recall not wired in this project — falling back to git reflog/log. (Recall would give you per-file history without needing commits. Run `npx @launchsecure/launch-kit refresh` to wire it.)"`
32
+ - Neither available → stop and surface that. Can't recover blind.
33
+
34
+ ## Subcommand interface (manual invocation)
35
+
36
+ Parse `$ARGUMENTS` — first token is the subcommand. If the first token doesn't match any known subcommand, treat the whole input as a **natural-language recovery request** (see below).
37
+
38
+ - **status** — recall watcher liveness + last snapshot age (one line).
39
+ - **doctor** — recall health check (3-line report: shadow_repo / watcher_alive / recent_snapshot).
40
+ - **report** — project-wide recall stats (totalSnapshots, shadowSizeBytes, recentSnapshots).
41
+ - **history `<path>`** — `[--limit=N]` — snapshots for the path (recall) OR `git log -p -- <path>` rows (fallback). Default limit 20.
42
+ - **show `<path>` `<sha>`** — print the file at that snapshot (no write).
43
+ - **diff `<path>` `<sha>`** — unified diff vs current working tree (or "file deleted from working tree" if absent). Cap 500 lines.
44
+ - **restore `<path>` `<sha>`** — `[--to=<target-path>]` — restore the file. Strict confirmation protocol below.
45
+
46
+ Examples:
47
+ - `/kit:recovery status`
48
+ - `/kit:recovery history src/server/comms/build-feed.ts`
49
+ - `/kit:recovery show src/server/comms/build-feed.ts a1b2c3d`
50
+ - `/kit:recovery restore src/server/comms/build-feed.ts a1b2c3d`
51
+ - `/kit:recovery restore prisma/schema.prisma a1b2c3d --to=prisma/schema.recovered.prisma`
52
+
53
+ ## Natural-language recovery flow (auto-invoke path)
54
+
55
+ When the user says "I lost X" / "deleted by mistake" / "prettier ate my comments" / "can I get back…", follow this loop:
56
+
57
+ 1. **Identify the target**: parse the user's prompt for a file path. If absent, ask: `"Which file or directory? (full path from repo root)"`. Do not guess.
58
+ 2. **Preflight** (see above) so you know which backend you're on.
59
+ 3. **List options**:
60
+ - Recall path: `recall_history(path: <path>, limit: 20)` → table of `sha | age | message`.
61
+ - Git path: `git log --oneline -20 -- <path>` (committed) AND `git reflog | head -20` (recent HEAD moves) AND `git stash list` (stashes). Present each source separately so the user knows which kind of recovery they're picking.
62
+ 4. **Show a candidate's content** before any restore: `show` the latest snapshot/commit so the user can confirm it's what they want.
63
+ 5. **Confirm restore** per the protocol below. NEVER restore without explicit `yes`.
64
+
65
+ ## Restore protocol (the only write operation)
66
+
67
+ 1. Resolve target path: `--to=<target>` if given, else the original `<path>`.
68
+ 2. If the target **exists on disk**:
69
+ - Print a side-by-side summary: `current size <N> bytes, snapshot size <M> bytes`.
70
+ - Show the first ~20 lines of the diff (current → snapshot).
71
+ - Ask: `"Overwrite <target>? (yes / show full diff / no)"` — wait for explicit `yes`.
72
+ 3. If the target does **NOT exist** on disk (file was deleted), restore without prompt but tell the user before writing: `"Restoring deleted file to <target> from snapshot <sha>."`
73
+ 4. Restore command:
74
+ - Recall path: `git --git-dir=<shadowRepoPath> --work-tree=<projectRoot> show <sha>:<path> > <target>`
75
+ - Git path: `git show <sha>:<path> > <target>` (against the regular repo)
76
+ 5. After restore: `"Restored. (Recall — if active — just captured a new snapshot of the restore itself, so your prior working-tree state is also recoverable.)"`
77
+
78
+ ## When recall is NOT wired — git fallback instructions
79
+
80
+ If `recall_status` says recall isn't running OR the MCP isn't reachable, walk the user through the git-only path:
81
+
82
+ - **Recently deleted file but no commit since**: `git checkout HEAD -- <path>` (restores from last commit). Confirm before running — this overwrites uncommitted changes if any exist.
83
+ - **Lost edits made after the last commit, no stash**: usually unrecoverable from git alone unless your editor has a local history feature (VS Code: "Timeline" view, JetBrains: "Local History"). Surface this honestly: `"Git only tracks what you commit. Your editor may have local history — check VS Code's Timeline or JetBrains' Local History panel for unsaved changes."`
84
+ - **File existed in a previous commit, deleted later**: `git log --oneline --all -- <path>` to find the last commit that contained it, then `git show <sha>:<path>` to view, then `git show <sha>:<path> > <path>` to restore.
85
+ - **Stashed changes**: `git stash list` to enumerate, `git stash show -p stash@{N}` to view, `git stash apply stash@{N}` to apply (non-destructive — keeps the stash).
86
+ - **Recent HEAD moves (force-push, rebase, reset)**: `git reflog` shows the prior positions. `git show <sha>:<path>` to view, then restore via `git show > file` (NOT `git reset --hard` — that moves your branch).
87
+
88
+ ## Constraints
89
+
90
+ - **Read-only by default.** Only `restore` writes; everything else reads.
91
+ - **Restore requires explicit `yes` confirmation** when overwriting an existing file. Never auto-overwrite — per project memory `feedback_no_dumb_reverts`, destructive ops need explicit confirmation.
92
+ - **Never suggest `git reset --hard` / `git clean -f` / `rm` as recovery.** These DESTROY more state than they recover. Always restore via `git show > file` so the rest of the tree is untouched.
93
+ - **Never auto-init recall.** If recall isn't wired, point at `npx @launchsecure/launch-kit refresh` — don't run it for the user. Their project, their choice.
94
+ - **Surface both paths when both are available.** Recall has per-file granularity without needing commits; git has the canonical commit history. Sometimes the user wants the committed version, not the latest in-flight edit. Let them choose.
95
+ - **Quote both ambiguities when history is empty.** If `recall_history` returns nothing AND the file still exists, say BOTH "path may be in recall's ignore list" AND "file may simply have no churn" — don't guess.
@@ -12,7 +12,7 @@ Read $ARGUMENTS to decide output verbosity:
12
12
 
13
13
  ## Preflight
14
14
 
15
- 1. Verify the launch-recall MCP is wired by checking whether `mcp__launch-recall__recall_status` (or `mcp__local-launch-recall__recall_status` for dev repos) is callable. If neither is available, say so plainly: "launch-recall MCP not wired in this project — nothing to report" and stop.
15
+ 1. Verify the launch-recall MCP is wired by attempting `mcp__launch-recall__recall_status` (or `mcp__local-launch-recall__recall_status` for dev repos). If neither is callable, **alert the user verbatim**: `"launch-recall MCP not wired in this project — nothing to report. (Skill is MCP-first; no shell fallback for daemon status.)"` and stop.
16
16
  2. Pick whichever recall MCP is available. Prefer the project-level published one (`mcp__launch-recall__*`) unless only the local dev one is wired.
17
17
 
18
18
  ## Daemons
@@ -36,7 +36,7 @@ Or if dead:
36
36
  ```
37
37
  recall ✗ dead pidfile missing/stale
38
38
 
39
- 1 daemon down. Run /kit:show-mcp-status full for details, or restart the watcher (kill any stale pid, then either start a new Claude Code session — the SessionStart hook respawns it — or run `node packages/cli/dist/server/recall-entry.js watch` from this repo).
39
+ 1 daemon down. Run /kit:show-mcp-status full for details, or restart the watcher (kill any stale pid, then either start a new Claude Code session — the SessionStart hook respawns it — or run `npx -y -p @launchsecure/launch-kit launch-recall watch` from the project root).
40
40
  ```
41
41
 
42
42
  Rules for the default view:
@@ -103,7 +103,7 @@ Don't over-warn — if a repo has genuinely been idle (e.g. you opened it for th
103
103
 
104
104
  ## Notes for the assistant
105
105
 
106
- - Use the wired `launch-recall` MCP tools — do not shell out to `node packages/cli/dist/server/recall-entry.js status` even though it works. Going through MCP makes this command portable across projects that have launch-kit init'd via npx vs dev-build.
106
+ - **MCP-first, no shell fallback.** Use the wired `launch-recall` MCP tools — do NOT shell out to `node packages/cli/dist/server/recall-entry.js status` or `ps`-based liveness checks. If the MCP isn't wired, the preflight step already stops the skill no silent grep/find.
107
107
  - When listing recent snaps, use the `recentSnapshots` array from `recall_report`. It's already sorted newest-first; just truncate.
108
108
  - For "X ago" formatting, do the math yourself. Don't fetch any time service.
109
- - If you find yourself wanting to add features beyond status display (restart the watcher, prune snaps, etc.) — stop. Those belong in separate `/kit:*` commands. This one is a status pane.
109
+ - If you find yourself wanting to add features beyond status display (restart the watcher, prune snaps, etc.) — stop. Those belong in separate `/kit:*` skills. This one is a status pane.
@@ -0,0 +1,90 @@
1
+ ---
2
+ description: Generate a hand-drawn wireframe mockup using wired-elements and push it to launch-deck for review. Use when the user wants to sketch a UI/page layout before any real implementation — sign-off material for discussion, not production HTML. Calls deck's rich-html block with framework=wired.
3
+ when_to_use: |
4
+ Auto-fire when the user wants to SKETCH a UI/page layout as a low-fi visual artifact for review or sign-off. Trigger phrases: "wireframe", "sketch the UI for X", "mock up a page", "rough layout for X", "low-fi mockup", "what could this screen look like", "give me a sketch of the settings page", "sign-off on this layout". Deck is required because the deliverable is a rendered visual artifact the user will look at — text in the terminal cannot substitute. Do NOT auto-fire for: plain-text layout descriptions the user can read in the terminal, production component code (use /fe:* flows), polished pixel-perfect mockups (use /kit:prototype with proper styling), ASCII-art layouts in chat, or any request where the user is asking ABOUT a wireframe rather than asking FOR one.
5
+ allowed-tools:
6
+ - mcp__launch-deck__server_status
7
+ - mcp__launch-deck__start_server
8
+ - mcp__launch-deck__deck
9
+ - mcp__launch-deck__await_feedback
10
+ - mcp__launch-chart__read_graph
11
+ - Bash
12
+ ---
13
+
14
+ # /kit:wireframe
15
+
16
+ Sketch a UI screen as a low-fi wired-elements wireframe and push it to launch-deck. The output is intentionally sketchy (the wired-elements aesthetic) — it communicates structure and information density, not final visual design.
17
+
18
+ Parse `$ARGUMENTS`:
19
+ - **description** (required) — free-form description of the screen, e.g. "settings page with three tabs: profile, billing, integrations; right rail shows recent activity". If absent, ask the user.
20
+ - **--session=<id>** — deck session name. Default `wireframe-<slugified-description-first-3-words>`.
21
+ - **--feedback** — push in `feedback` mode with `prompt: "What's missing from this layout?"` and call `await_feedback` afterward.
22
+ - **--theme=light|dark** — only set when the wireframe ONLY makes sense in one mode. Default: omit (deck's sun/moon toggle wins).
23
+
24
+ Examples:
25
+ - `/kit:wireframe settings page with three tabs: profile, billing, integrations`
26
+ - `/kit:wireframe org dashboard with KPI strip on top, project grid below --feedback`
27
+
28
+ ## Preflight
29
+
30
+ 1. Confirm `mcp__launch-deck__server_status` returns running. If not, call `mcp__launch-deck__start_server` first.
31
+ 2. If the description is shorter than ~8 words OR mentions a real page in this repo, run `mcp__launch-chart__read_graph(type: "page", search: <hint>)` to find a similar existing page first — confirm with the user whether to mirror that page's structure or design new layout from scratch. (This is a courtesy to avoid wireframing something that already exists; skip on `--no-chart`.)
32
+
33
+ ## Build the wired markup
34
+
35
+ Translate the description into a wired-elements page body. Use these elements:
36
+
37
+ | Need | Use |
38
+ |---|---|
39
+ | Container | `<wired-card elevation="2">` |
40
+ | Heading | plain `<h1>` / `<h2>` (wired-card text inherits) |
41
+ | Buttons | `<wired-button>Label</wired-button>` |
42
+ | Input | `<wired-input placeholder="…"></wired-input>` |
43
+ | Checkbox | `<wired-checkbox>Label</wired-checkbox>` |
44
+ | Dropdown | `<wired-combo>` with `<wired-item value="…">…</wired-item>` children |
45
+ | Tabs | `<wired-tabs>` with `<wired-tab name="…">…</wired-tab>` children |
46
+ | Slider | `<wired-slider min=… max=…>` |
47
+ | Divider | `<wired-divider>` |
48
+
49
+ Layout rules:
50
+ - Wrap the page in a top-level `<wired-card>` so it gets the sketched border.
51
+ - Use CSS grid (`display:grid; grid-template-columns: …;`) for multi-column layouts — inline `<style>` is fine, the deck rich-html block renders it.
52
+ - Pad generously (`padding: 24px; gap: 16px`) — the wired-elements aesthetic looks cramped without space.
53
+ - Annotate non-obvious regions with comments like `<!-- right rail: activity feed -->` so the reviewer can navigate the markup.
54
+
55
+ Do NOT include real production CSS, no Tailwind utility classes, no shadcn primitives. This is on-purpose a sketch.
56
+
57
+ ## Push to deck
58
+
59
+ Call `mcp__launch-deck__deck` with:
60
+ - `session: <session>`
61
+ - `mode: "show"` (or `"feedback"` if `--feedback` was passed; also set `prompt`)
62
+ - `blocks: [{ type: "rich-html", framework: "wired", label: <short-title>, content: <body-html>, theme: <theme?> }]`
63
+
64
+ If `--feedback` was passed, immediately call `mcp__launch-deck__await_feedback` with the same session and surface the user's response back.
65
+
66
+ ## Open in browser
67
+
68
+ After the push (and after `await_feedback` if `--feedback`), open the per-session URL so the user lands directly on this wireframe:
69
+
70
+ ```
71
+ open "<deck-url>/#<session>" # macOS
72
+ xdg-open "<deck-url>/#<session>" # Linux
73
+ ```
74
+
75
+ `<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 — the deck-client picks it up on load and on hashchange.
76
+
77
+ ## Output
78
+
79
+ ```
80
+ wireframe pushed — deck session "<session>" — <deck-url>/#<session>
81
+ elements: <N> cards, <M> buttons, <K> inputs, <T> tabs
82
+ ```
83
+
84
+ If `--feedback`: also print the feedback comment + any option selections, then ask what to change.
85
+
86
+ ## Constraints
87
+
88
+ - **No production assets.** Don't pull real images, real fonts, real brand colors — the wired sketch IS the point. If the user asks for a "polished" mockup, suggest `/kit:prototype` instead.
89
+ - **Single block per push.** Don't split one wireframe into multiple deck blocks; one screen = one rich-html block.
90
+ - **Iterate via re-push.** Re-running with the same `--session` overwrites; that's the iteration loop.
@@ -114,19 +114,31 @@ chip_recall() {
114
114
  }
115
115
 
116
116
  chip_chart() {
117
+ # Drift-based color — reflects how out-of-sync the graph is with the code,
118
+ # NOT whether a watcher daemon is alive. A user who regenerated by hand
119
+ # and never started the watcher should still see green when the graph is
120
+ # fresh. Daemon liveness lives in /kit:show-mcp-status.
121
+ #
122
+ # RED — .freshness.json missing OR failedFiles non-empty (broken graph)
123
+ # ORANGE — state != "fresh" (chart MCP says the snapshot has drifted)
124
+ # GREEN — state == "fresh" AND no failed files
117
125
  local freshness="$PROJECT_ROOT/.launchsecure/graphs/.freshness.json"
118
126
  if [ ! -f "$freshness" ]; then _state="red"; _display="${RED}chart${RESET}"; return; fi
119
- local last
127
+
128
+ local last state_field
120
129
  last=$(grep -o '"lastFullRegenAt"[^,}]*' "$freshness" | head -1 | sed 's/.*"\([0-9TZ:.+-]*\)".*/\1/')
121
- local lock="$PROJECT_ROOT/.launchsecure/launch-chart.lock"
122
- local color="$ORANGE"; local state="orange"
123
- if [ -f "$lock" ]; then
124
- local pid
125
- pid=$(pid_from_lockfile "$lock")
126
- if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
127
- color="$GREEN"; state="green"
128
- fi
130
+ state_field=$(grep -o '"state"[[:space:]]*:[[:space:]]*"[^"]*"' "$freshness" | head -1 | sed 's/.*"\([^"]*\)"$/\1/')
131
+
132
+ # failedFiles is non-empty iff the empty-array literal `[]` isn't present.
133
+ local color state
134
+ if ! grep -q '"failedFiles"[[:space:]]*:[[:space:]]*\[[[:space:]]*\]' "$freshness"; then
135
+ color="$RED"; state="red"
136
+ elif [ "$state_field" != "fresh" ]; then
137
+ color="$ORANGE"; state="orange"
138
+ else
139
+ color="$GREEN"; state="green"
129
140
  fi
141
+
130
142
  if [ -n "$last" ] && [ "$last" != "null" ]; then
131
143
  local epoch age
132
144
  epoch=$(iso_to_epoch "$last")
@@ -1,3 +0,0 @@
1
- import type { RawPinCapture } from '../types';
2
- export declare function capturePin(el: Element): RawPinCapture;
3
- //# sourceMappingURL=element.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../../../src/beacon-client/capture/element.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAwD9C,wBAAgB,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,aAAa,CAsBrD"}
@@ -1,20 +0,0 @@
1
- import type { CapturedEvent } from '../types';
2
- /**
3
- * Attach `error` and `unhandledrejection` listeners on `window`. Idempotent — safe
4
- * to call repeatedly (e.g., HMR reloads). No-op in non-browser environments.
5
- *
6
- * Called at module load from index.ts so we start capturing before the beacon
7
- * element mounts. Errors that fire during initial page hydration are exactly
8
- * the ones users are most likely to report and least able to describe.
9
- */
10
- export declare function installEventCapture(): void;
11
- /** Snapshot of the captured events buffer. Returns a copy; callers can mutate it. */
12
- export declare function getCapturedEvents(): CapturedEvent[];
13
- /**
14
- * Register a callback that fires every time a new event is added to the buffer.
15
- * Returns an unsubscribe function. Used by the drawer to live-update its chip
16
- * count so users see errors arrive in real-time, regardless of whether the
17
- * widget was opened before or after the error fired.
18
- */
19
- export declare function subscribeToEvents(fn: () => void): () => void;
20
- //# sourceMappingURL=events.d.ts.map