@svenroth-ai/shipwright 0.24.1-next.0
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/LICENSE +21 -0
- package/README.md +55 -0
- package/bin/shipwright.mjs +187 -0
- package/client/dist/assets/EmbeddedTerminal-6GBZ9nXN.css +32 -0
- package/client/dist/assets/EmbeddedTerminal-CpeDvtzx.js +123 -0
- package/client/dist/assets/MarkdownEditorModal-Di9HN39z.js +212 -0
- package/client/dist/assets/abnfDiagram-VRR7QNED-BbSdq0X7.js +1 -0
- package/client/dist/assets/arc-BZT7vKjm.js +1 -0
- package/client/dist/assets/architectureDiagram-ZJ3FMSHR-BuRwoNgV.js +36 -0
- package/client/dist/assets/blockDiagram-677ZJIJ3-B2RNYWcr.js +132 -0
- package/client/dist/assets/c4Diagram-LMCZKHZV-fbXlt08K.js +10 -0
- package/client/dist/assets/channel-2-wkFEKK.js +1 -0
- package/client/dist/assets/chunk-2Q5K7J3B-NqMRUe5-.js +1 -0
- package/client/dist/assets/chunk-32BRIVSS-CIr9bFCd.js +1 -0
- package/client/dist/assets/chunk-5VM5RSS4-l0I6rbZN.js +15 -0
- package/client/dist/assets/chunk-EX3LRPZG-DXinoCxp.js +231 -0
- package/client/dist/assets/chunk-JWPE2WC7-BAcCano9.js +1 -0
- package/client/dist/assets/chunk-MOJQB5TN-DMVOqL7C.js +88 -0
- package/client/dist/assets/chunk-RYQCIY6F-CtNSAItH.js +1 -0
- package/client/dist/assets/chunk-V7JOEXUC-CufSmC93.js +206 -0
- package/client/dist/assets/chunk-VR4S4FIN-_BbUF9fa.js +1 -0
- package/client/dist/assets/chunk-XXDRQBXY-uQ35hUPB.js +1 -0
- package/client/dist/assets/classDiagram-OUVF2IWQ-A9SpDakb.js +1 -0
- package/client/dist/assets/classDiagram-v2-EOCWNBFH-A9SpDakb.js +1 -0
- package/client/dist/assets/cose-bilkent-JH36ORCC-B9q9uYCX.js +1 -0
- package/client/dist/assets/cynefin-VYW2F7L2-C2_bJyZA.js +178 -0
- package/client/dist/assets/cynefinDiagram-TSTJHNR4-0mzVmPv4.js +62 -0
- package/client/dist/assets/cytoscape.esm-DTSO7Bv0.js +331 -0
- package/client/dist/assets/dagre-VKFMJZFB-CIE9HMtr.js +4 -0
- package/client/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/client/dist/assets/diagram-FQU43EPY-DdkBaZrX.js +3 -0
- package/client/dist/assets/diagram-G47NLZAW-Cql4k2sg.js +24 -0
- package/client/dist/assets/diagram-NH7WQ7WH-FRAUyqEu.js +24 -0
- package/client/dist/assets/diagram-OA4YK3LP-DXo8GTB8.js +30 -0
- package/client/dist/assets/diagram-WEI45ONY-DqVtWGdt.js +41 -0
- package/client/dist/assets/ebnfDiagram-CCIWWBDH-B0La0RsO.js +1 -0
- package/client/dist/assets/erDiagram-Q63AITRT-DHbbqiY9.js +85 -0
- package/client/dist/assets/flowDiagram-23GEKE2U-I6vhJlCk.js +156 -0
- package/client/dist/assets/ganttDiagram-NO4QXBWP-CDYZHcsU.js +292 -0
- package/client/dist/assets/geist-mono-cyrillic-ext-wght-normal-I4S5GZfc.woff2 +0 -0
- package/client/dist/assets/geist-mono-cyrillic-wght-normal-BmXc_FBt.woff2 +0 -0
- package/client/dist/assets/geist-mono-latin-ext-wght-normal-DrnZ1wKl.woff2 +0 -0
- package/client/dist/assets/geist-mono-latin-wght-normal-B_7UjwxQ.woff2 +0 -0
- package/client/dist/assets/geist-mono-symbols2-wght-normal-GZpp1pK2.woff2 +0 -0
- package/client/dist/assets/geist-mono-vietnamese-wght-normal-D8KDMBhC.woff2 +0 -0
- package/client/dist/assets/gitGraphDiagram-IHSO6WYX-dyf7caP8.js +106 -0
- package/client/dist/assets/graph-C9eacEi8.js +1 -0
- package/client/dist/assets/index-BYrVLOXw.js +609 -0
- package/client/dist/assets/index-BZvZ9izZ.css +1 -0
- package/client/dist/assets/infoDiagram-FWYZ7A6U-BlWH6vM3.js +2 -0
- package/client/dist/assets/init-Gi6I4Gst.js +1 -0
- package/client/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/client/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/client/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/client/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/client/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/client/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/client/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/client/dist/assets/ishikawaDiagram-FXEZZL3T-BEKH-_6E.js +70 -0
- package/client/dist/assets/journeyDiagram-5HDEW3XC-cn_mQ2U9.js +139 -0
- package/client/dist/assets/kanban-definition-HUTT4EX6-DGZiYhYV.js +89 -0
- package/client/dist/assets/katex-DkKDou_j.js +257 -0
- package/client/dist/assets/layout-DEXfKzaS.js +1 -0
- package/client/dist/assets/linear-CdtYl6qR.js +1 -0
- package/client/dist/assets/map-Czzmt4hB.js +1 -0
- package/client/dist/assets/mermaid.core-CrKi1642.js +314 -0
- package/client/dist/assets/mindmap-definition-LN4V7U3C-G_CA7V9L.js +96 -0
- package/client/dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/client/dist/assets/pegDiagram-2B236MQR-6ZeO9kDM.js +1 -0
- package/client/dist/assets/pieDiagram-ENE6RG2P-Bd0InZSQ.js +39 -0
- package/client/dist/assets/quadrantDiagram-ABIIQ3AL-Bg1m9Csn.js +7 -0
- package/client/dist/assets/railroadDiagram-RFXS5EU6-CCzPP1JU.js +1 -0
- package/client/dist/assets/requirementDiagram-TGXJPOKE-iN7kyPgM.js +84 -0
- package/client/dist/assets/sankeyDiagram-HTMAVEWB-DN1v_DUJ.js +40 -0
- package/client/dist/assets/sequenceDiagram-DBY2YBRQ-C5LMp5Sa.js +162 -0
- package/client/dist/assets/sizeCapture-X5ZJPWSS-Bp9jVLhL.js +1 -0
- package/client/dist/assets/stateDiagram-2N3HPSRC-VbWBetTf.js +1 -0
- package/client/dist/assets/stateDiagram-v2-6OUMAXLB-BuaUtNAG.js +1 -0
- package/client/dist/assets/swimlanes-5IMT3BWC-CrXokvQ-.js +2 -0
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-C6hwc993.js +8 -0
- package/client/dist/assets/timeline-definition-FHXFAJF6-Cxx1NT9A.js +120 -0
- package/client/dist/assets/vennDiagram-L72KCM5P-C6DBgaEy.js +34 -0
- package/client/dist/assets/wardleyDiagram-EHGQE667-RV7xMg8g.js +78 -0
- package/client/dist/assets/xychartDiagram-FW5EYKEG-Llhe9pB1.js +7 -0
- package/client/dist/backdrops/deck-golden.jpg +0 -0
- package/client/dist/backdrops/lighthouse.jpg +0 -0
- package/client/dist/index.html +27 -0
- package/client/dist/shipwright-logo-white.png +0 -0
- package/lib/cache-runtime.mjs +72 -0
- package/lib/cache-sync.mjs +243 -0
- package/lib/claude-cli.mjs +173 -0
- package/lib/plugins.mjs +181 -0
- package/lib/preflight.mjs +208 -0
- package/lib/probes.mjs +53 -0
- package/lib/server.mjs +315 -0
- package/lib/util.mjs +83 -0
- package/lib/version-check.mjs +76 -0
- package/lib/win32-spawn.mjs +253 -0
- package/package.json +67 -0
- package/scripts/deploy-procs.mjs +208 -0
- package/scripts/deploy-swap.mjs +276 -0
- package/scripts/kill-targets.js +140 -0
- package/scripts/repair-claude-json.mjs +295 -0
- package/server/dist/config/default-actions.json +90 -0
- package/server/dist/config.d.ts +96 -0
- package/server/dist/config.d.ts.map +1 -0
- package/server/dist/config.js +68 -0
- package/server/dist/config.js.map +1 -0
- package/server/dist/core/actions-schema-validator.d.ts +8 -0
- package/server/dist/core/actions-schema-validator.d.ts.map +1 -0
- package/server/dist/core/actions-schema-validator.js +394 -0
- package/server/dist/core/actions-schema-validator.js.map +1 -0
- package/server/dist/core/actions-substitute.d.ts +115 -0
- package/server/dist/core/actions-substitute.d.ts.map +1 -0
- package/server/dist/core/actions-substitute.js +549 -0
- package/server/dist/core/actions-substitute.js.map +1 -0
- package/server/dist/core/board-column.d.ts +3 -0
- package/server/dist/core/board-column.d.ts.map +1 -0
- package/server/dist/core/board-column.js +4 -0
- package/server/dist/core/board-column.js.map +1 -0
- package/server/dist/core/campaign-events.d.ts +39 -0
- package/server/dist/core/campaign-events.d.ts.map +1 -0
- package/server/dist/core/campaign-events.js +192 -0
- package/server/dist/core/campaign-events.js.map +1 -0
- package/server/dist/core/campaign-loop-state.d.ts +31 -0
- package/server/dist/core/campaign-loop-state.d.ts.map +1 -0
- package/server/dist/core/campaign-loop-state.js +124 -0
- package/server/dist/core/campaign-loop-state.js.map +1 -0
- package/server/dist/core/campaign-parse.d.ts +28 -0
- package/server/dist/core/campaign-parse.d.ts.map +1 -0
- package/server/dist/core/campaign-parse.js +174 -0
- package/server/dist/core/campaign-parse.js.map +1 -0
- package/server/dist/core/campaign-paths.d.ts +24 -0
- package/server/dist/core/campaign-paths.d.ts.map +1 -0
- package/server/dist/core/campaign-paths.js +111 -0
- package/server/dist/core/campaign-paths.js.map +1 -0
- package/server/dist/core/campaign-route-helpers.d.ts +19 -0
- package/server/dist/core/campaign-route-helpers.d.ts.map +1 -0
- package/server/dist/core/campaign-route-helpers.js +51 -0
- package/server/dist/core/campaign-route-helpers.js.map +1 -0
- package/server/dist/core/campaign-status-json.d.ts +55 -0
- package/server/dist/core/campaign-status-json.d.ts.map +1 -0
- package/server/dist/core/campaign-status-json.js +57 -0
- package/server/dist/core/campaign-status-json.js.map +1 -0
- package/server/dist/core/campaign-store.d.ts +10 -0
- package/server/dist/core/campaign-store.d.ts.map +1 -0
- package/server/dist/core/campaign-store.js +245 -0
- package/server/dist/core/campaign-store.js.map +1 -0
- package/server/dist/core/campaign-types.d.ts +101 -0
- package/server/dist/core/campaign-types.d.ts.map +1 -0
- package/server/dist/core/campaign-types.js +10 -0
- package/server/dist/core/campaign-types.js.map +1 -0
- package/server/dist/core/campaign-write.d.ts +13 -0
- package/server/dist/core/campaign-write.d.ts.map +1 -0
- package/server/dist/core/campaign-write.js +128 -0
- package/server/dist/core/campaign-write.js.map +1 -0
- package/server/dist/core/cascade-delete-project-tasks.d.ts +14 -0
- package/server/dist/core/cascade-delete-project-tasks.d.ts.map +1 -0
- package/server/dist/core/cascade-delete-project-tasks.js +68 -0
- package/server/dist/core/cascade-delete-project-tasks.js.map +1 -0
- package/server/dist/core/claude-bin-resolver.d.ts +62 -0
- package/server/dist/core/claude-bin-resolver.d.ts.map +1 -0
- package/server/dist/core/claude-bin-resolver.js +208 -0
- package/server/dist/core/claude-bin-resolver.js.map +1 -0
- package/server/dist/core/claude-theme-reader.d.ts +15 -0
- package/server/dist/core/claude-theme-reader.d.ts.map +1 -0
- package/server/dist/core/claude-theme-reader.js +52 -0
- package/server/dist/core/claude-theme-reader.js.map +1 -0
- package/server/dist/core/cli-compat.d.ts +43 -0
- package/server/dist/core/cli-compat.d.ts.map +1 -0
- package/server/dist/core/cli-compat.js +88 -0
- package/server/dist/core/cli-compat.js.map +1 -0
- package/server/dist/core/compliance-dimensions.d.ts +20 -0
- package/server/dist/core/compliance-dimensions.d.ts.map +1 -0
- package/server/dist/core/compliance-dimensions.js +114 -0
- package/server/dist/core/compliance-dimensions.js.map +1 -0
- package/server/dist/core/compliance-reader.d.ts +49 -0
- package/server/dist/core/compliance-reader.d.ts.map +1 -0
- package/server/dist/core/compliance-reader.js +147 -0
- package/server/dist/core/compliance-reader.js.map +1 -0
- package/server/dist/core/contract-version.d.ts +72 -0
- package/server/dist/core/contract-version.d.ts.map +1 -0
- package/server/dist/core/contract-version.js +114 -0
- package/server/dist/core/contract-version.js.map +1 -0
- package/server/dist/core/design-feedback.d.ts +29 -0
- package/server/dist/core/design-feedback.d.ts.map +1 -0
- package/server/dist/core/design-feedback.js +80 -0
- package/server/dist/core/design-feedback.js.map +1 -0
- package/server/dist/core/dismissed-campaigns-store.d.ts +45 -0
- package/server/dist/core/dismissed-campaigns-store.d.ts.map +1 -0
- package/server/dist/core/dismissed-campaigns-store.js +147 -0
- package/server/dist/core/dismissed-campaigns-store.js.map +1 -0
- package/server/dist/core/event-log-reader.d.ts +19 -0
- package/server/dist/core/event-log-reader.d.ts.map +1 -0
- package/server/dist/core/event-log-reader.js +209 -0
- package/server/dist/core/event-log-reader.js.map +1 -0
- package/server/dist/core/event-log-types.d.ts +99 -0
- package/server/dist/core/event-log-types.d.ts.map +1 -0
- package/server/dist/core/event-log-types.js +14 -0
- package/server/dist/core/event-log-types.js.map +1 -0
- package/server/dist/core/gitignore-cache.d.ts +16 -0
- package/server/dist/core/gitignore-cache.d.ts.map +1 -0
- package/server/dist/core/gitignore-cache.js +103 -0
- package/server/dist/core/gitignore-cache.js.map +1 -0
- package/server/dist/core/grade-runner.d.ts +63 -0
- package/server/dist/core/grade-runner.d.ts.map +1 -0
- package/server/dist/core/grade-runner.js +176 -0
- package/server/dist/core/grade-runner.js.map +1 -0
- package/server/dist/core/grade-target.d.ts +43 -0
- package/server/dist/core/grade-target.d.ts.map +1 -0
- package/server/dist/core/grade-target.js +162 -0
- package/server/dist/core/grade-target.js.map +1 -0
- package/server/dist/core/inbox-derive.d.ts +56 -0
- package/server/dist/core/inbox-derive.d.ts.map +1 -0
- package/server/dist/core/inbox-derive.js +211 -0
- package/server/dist/core/inbox-derive.js.map +1 -0
- package/server/dist/core/jsonl-decode.d.ts +28 -0
- package/server/dist/core/jsonl-decode.d.ts.map +1 -0
- package/server/dist/core/jsonl-decode.js +96 -0
- package/server/dist/core/jsonl-decode.js.map +1 -0
- package/server/dist/core/jsonl-records.d.ts +104 -0
- package/server/dist/core/jsonl-records.d.ts.map +1 -0
- package/server/dist/core/jsonl-records.js +222 -0
- package/server/dist/core/jsonl-records.js.map +1 -0
- package/server/dist/core/launcher.d.ts +74 -0
- package/server/dist/core/launcher.d.ts.map +1 -0
- package/server/dist/core/launcher.js +192 -0
- package/server/dist/core/launcher.js.map +1 -0
- package/server/dist/core/mission-context/artifacts-commit.d.ts +28 -0
- package/server/dist/core/mission-context/artifacts-commit.d.ts.map +1 -0
- package/server/dist/core/mission-context/artifacts-commit.js +98 -0
- package/server/dist/core/mission-context/artifacts-commit.js.map +1 -0
- package/server/dist/core/mission-context/artifacts-decisions.d.ts +5 -0
- package/server/dist/core/mission-context/artifacts-decisions.d.ts.map +1 -0
- package/server/dist/core/mission-context/artifacts-decisions.js +114 -0
- package/server/dist/core/mission-context/artifacts-decisions.js.map +1 -0
- package/server/dist/core/mission-context/artifacts-slice2.d.ts +12 -0
- package/server/dist/core/mission-context/artifacts-slice2.d.ts.map +1 -0
- package/server/dist/core/mission-context/artifacts-slice2.js +125 -0
- package/server/dist/core/mission-context/artifacts-slice2.js.map +1 -0
- package/server/dist/core/mission-context/artifacts-tests.d.ts +34 -0
- package/server/dist/core/mission-context/artifacts-tests.d.ts.map +1 -0
- package/server/dist/core/mission-context/artifacts-tests.js +236 -0
- package/server/dist/core/mission-context/artifacts-tests.js.map +1 -0
- package/server/dist/core/mission-context/artifacts.d.ts +33 -0
- package/server/dist/core/mission-context/artifacts.d.ts.map +1 -0
- package/server/dist/core/mission-context/artifacts.js +186 -0
- package/server/dist/core/mission-context/artifacts.js.map +1 -0
- package/server/dist/core/mission-context/association.d.ts +27 -0
- package/server/dist/core/mission-context/association.d.ts.map +1 -0
- package/server/dist/core/mission-context/association.js +69 -0
- package/server/dist/core/mission-context/association.js.map +1 -0
- package/server/dist/core/mission-context/campaign-artifacts.d.ts +9 -0
- package/server/dist/core/mission-context/campaign-artifacts.d.ts.map +1 -0
- package/server/dist/core/mission-context/campaign-artifacts.js +195 -0
- package/server/dist/core/mission-context/campaign-artifacts.js.map +1 -0
- package/server/dist/core/mission-context/campaign-facts.d.ts +99 -0
- package/server/dist/core/mission-context/campaign-facts.d.ts.map +1 -0
- package/server/dist/core/mission-context/campaign-facts.js +111 -0
- package/server/dist/core/mission-context/campaign-facts.js.map +1 -0
- package/server/dist/core/mission-context/decision-drops.d.ts +46 -0
- package/server/dist/core/mission-context/decision-drops.d.ts.map +1 -0
- package/server/dist/core/mission-context/decision-drops.js +269 -0
- package/server/dist/core/mission-context/decision-drops.js.map +1 -0
- package/server/dist/core/mission-context/decisions.d.ts +91 -0
- package/server/dist/core/mission-context/decisions.d.ts.map +1 -0
- package/server/dist/core/mission-context/decisions.js +222 -0
- package/server/dist/core/mission-context/decisions.js.map +1 -0
- package/server/dist/core/mission-context/doc-ids.d.ts +35 -0
- package/server/dist/core/mission-context/doc-ids.d.ts.map +1 -0
- package/server/dist/core/mission-context/doc-ids.js +78 -0
- package/server/dist/core/mission-context/doc-ids.js.map +1 -0
- package/server/dist/core/mission-context/document-read.d.ts +14 -0
- package/server/dist/core/mission-context/document-read.d.ts.map +1 -0
- package/server/dist/core/mission-context/document-read.js +36 -0
- package/server/dist/core/mission-context/document-read.js.map +1 -0
- package/server/dist/core/mission-context/fold-map.d.ts +45 -0
- package/server/dist/core/mission-context/fold-map.d.ts.map +1 -0
- package/server/dist/core/mission-context/fold-map.js +168 -0
- package/server/dist/core/mission-context/fold-map.js.map +1 -0
- package/server/dist/core/mission-context/fs-read.d.ts +47 -0
- package/server/dist/core/mission-context/fs-read.d.ts.map +1 -0
- package/server/dist/core/mission-context/fs-read.js +104 -0
- package/server/dist/core/mission-context/fs-read.js.map +1 -0
- package/server/dist/core/mission-context/iterate-record.d.ts +52 -0
- package/server/dist/core/mission-context/iterate-record.d.ts.map +1 -0
- package/server/dist/core/mission-context/iterate-record.js +156 -0
- package/server/dist/core/mission-context/iterate-record.js.map +1 -0
- package/server/dist/core/mission-context/merge-check.d.ts +60 -0
- package/server/dist/core/mission-context/merge-check.d.ts.map +1 -0
- package/server/dist/core/mission-context/merge-check.js +217 -0
- package/server/dist/core/mission-context/merge-check.js.map +1 -0
- package/server/dist/core/mission-context/merge-refresh.d.ts +14 -0
- package/server/dist/core/mission-context/merge-refresh.d.ts.map +1 -0
- package/server/dist/core/mission-context/merge-refresh.js +53 -0
- package/server/dist/core/mission-context/merge-refresh.js.map +1 -0
- package/server/dist/core/mission-context/merged-events.d.ts +34 -0
- package/server/dist/core/mission-context/merged-events.d.ts.map +1 -0
- package/server/dist/core/mission-context/merged-events.js +120 -0
- package/server/dist/core/mission-context/merged-events.js.map +1 -0
- package/server/dist/core/mission-context/pipeline-artifacts.d.ts +53 -0
- package/server/dist/core/mission-context/pipeline-artifacts.d.ts.map +1 -0
- package/server/dist/core/mission-context/pipeline-artifacts.js +161 -0
- package/server/dist/core/mission-context/pipeline-artifacts.js.map +1 -0
- package/server/dist/core/mission-context/planned-impact.d.ts +28 -0
- package/server/dist/core/mission-context/planned-impact.d.ts.map +1 -0
- package/server/dist/core/mission-context/planned-impact.js +129 -0
- package/server/dist/core/mission-context/planned-impact.js.map +1 -0
- package/server/dist/core/mission-context/pointer.d.ts +44 -0
- package/server/dist/core/mission-context/pointer.d.ts.map +1 -0
- package/server/dist/core/mission-context/pointer.js +165 -0
- package/server/dist/core/mission-context/pointer.js.map +1 -0
- package/server/dist/core/mission-context/resolver-io.d.ts +47 -0
- package/server/dist/core/mission-context/resolver-io.d.ts.map +1 -0
- package/server/dist/core/mission-context/resolver-io.js +11 -0
- package/server/dist/core/mission-context/resolver-io.js.map +1 -0
- package/server/dist/core/mission-context/resolver-parts.d.ts +57 -0
- package/server/dist/core/mission-context/resolver-parts.d.ts.map +1 -0
- package/server/dist/core/mission-context/resolver-parts.js +136 -0
- package/server/dist/core/mission-context/resolver-parts.js.map +1 -0
- package/server/dist/core/mission-context/resolver.d.ts +11 -0
- package/server/dist/core/mission-context/resolver.d.ts.map +1 -0
- package/server/dist/core/mission-context/resolver.js +261 -0
- package/server/dist/core/mission-context/resolver.js.map +1 -0
- package/server/dist/core/mission-context/review-record-entry.d.ts +45 -0
- package/server/dist/core/mission-context/review-record-entry.d.ts.map +1 -0
- package/server/dist/core/mission-context/review-record-entry.js +214 -0
- package/server/dist/core/mission-context/review-record-entry.js.map +1 -0
- package/server/dist/core/mission-context/review-record.d.ts +35 -0
- package/server/dist/core/mission-context/review-record.d.ts.map +1 -0
- package/server/dist/core/mission-context/review-record.js +259 -0
- package/server/dist/core/mission-context/review-record.js.map +1 -0
- package/server/dist/core/mission-context/review-state.d.ts +33 -0
- package/server/dist/core/mission-context/review-state.d.ts.map +1 -0
- package/server/dist/core/mission-context/review-state.js +249 -0
- package/server/dist/core/mission-context/review-state.js.map +1 -0
- package/server/dist/core/mission-context/run-id-recovery.d.ts +44 -0
- package/server/dist/core/mission-context/run-id-recovery.d.ts.map +1 -0
- package/server/dist/core/mission-context/run-id-recovery.js +175 -0
- package/server/dist/core/mission-context/run-id-recovery.js.map +1 -0
- package/server/dist/core/mission-context/scenario.d.ts +121 -0
- package/server/dist/core/mission-context/scenario.d.ts.map +1 -0
- package/server/dist/core/mission-context/scenario.js +151 -0
- package/server/dist/core/mission-context/scenario.js.map +1 -0
- package/server/dist/core/mission-context/slice2-sources.d.ts +40 -0
- package/server/dist/core/mission-context/slice2-sources.d.ts.map +1 -0
- package/server/dist/core/mission-context/slice2-sources.js +80 -0
- package/server/dist/core/mission-context/slice2-sources.js.map +1 -0
- package/server/dist/core/mission-context/slice2-test-fixtures.d.ts +17 -0
- package/server/dist/core/mission-context/slice2-test-fixtures.d.ts.map +1 -0
- package/server/dist/core/mission-context/slice2-test-fixtures.js +61 -0
- package/server/dist/core/mission-context/slice2-test-fixtures.js.map +1 -0
- package/server/dist/core/mission-context/slice3-sources.d.ts +43 -0
- package/server/dist/core/mission-context/slice3-sources.d.ts.map +1 -0
- package/server/dist/core/mission-context/slice3-sources.js +192 -0
- package/server/dist/core/mission-context/slice3-sources.js.map +1 -0
- package/server/dist/core/mission-context/spec-candidates.d.ts +66 -0
- package/server/dist/core/mission-context/spec-candidates.d.ts.map +1 -0
- package/server/dist/core/mission-context/spec-candidates.js +164 -0
- package/server/dist/core/mission-context/spec-candidates.js.map +1 -0
- package/server/dist/core/mission-context/test-evidence.d.ts +14 -0
- package/server/dist/core/mission-context/test-evidence.d.ts.map +1 -0
- package/server/dist/core/mission-context/test-evidence.js +53 -0
- package/server/dist/core/mission-context/test-evidence.js.map +1 -0
- package/server/dist/core/mission-context/tests-diff.d.ts +68 -0
- package/server/dist/core/mission-context/tests-diff.d.ts.map +1 -0
- package/server/dist/core/mission-context/tests-diff.js +151 -0
- package/server/dist/core/mission-context/tests-diff.js.map +1 -0
- package/server/dist/core/mission-context/traceability.d.ts +58 -0
- package/server/dist/core/mission-context/traceability.d.ts.map +1 -0
- package/server/dist/core/mission-context/traceability.js +168 -0
- package/server/dist/core/mission-context/traceability.js.map +1 -0
- package/server/dist/core/mission-context/types-slice2.d.ts +192 -0
- package/server/dist/core/mission-context/types-slice2.d.ts.map +1 -0
- package/server/dist/core/mission-context/types-slice2.js +15 -0
- package/server/dist/core/mission-context/types-slice2.js.map +1 -0
- package/server/dist/core/mission-context/types-slice3.d.ts +84 -0
- package/server/dist/core/mission-context/types-slice3.d.ts.map +1 -0
- package/server/dist/core/mission-context/types-slice3.js +24 -0
- package/server/dist/core/mission-context/types-slice3.js.map +1 -0
- package/server/dist/core/mission-context/types.d.ts +198 -0
- package/server/dist/core/mission-context/types.d.ts.map +1 -0
- package/server/dist/core/mission-context/types.js +44 -0
- package/server/dist/core/mission-context/types.js.map +1 -0
- package/server/dist/core/mission-context/worktree-roots.d.ts +103 -0
- package/server/dist/core/mission-context/worktree-roots.d.ts.map +1 -0
- package/server/dist/core/mission-context/worktree-roots.js +201 -0
- package/server/dist/core/mission-context/worktree-roots.js.map +1 -0
- package/server/dist/core/model-tier-config-reader.d.ts +16 -0
- package/server/dist/core/model-tier-config-reader.d.ts.map +1 -0
- package/server/dist/core/model-tier-config-reader.js +87 -0
- package/server/dist/core/model-tier-config-reader.js.map +1 -0
- package/server/dist/core/normalize-fs-path.d.ts +2 -0
- package/server/dist/core/normalize-fs-path.d.ts.map +1 -0
- package/server/dist/core/normalize-fs-path.js +31 -0
- package/server/dist/core/normalize-fs-path.js.map +1 -0
- package/server/dist/core/parameter-resolver.d.ts +32 -0
- package/server/dist/core/parameter-resolver.d.ts.map +1 -0
- package/server/dist/core/parameter-resolver.js +300 -0
- package/server/dist/core/parameter-resolver.js.map +1 -0
- package/server/dist/core/path-guard.d.ts +40 -0
- package/server/dist/core/path-guard.d.ts.map +1 -0
- package/server/dist/core/path-guard.js +147 -0
- package/server/dist/core/path-guard.js.map +1 -0
- package/server/dist/core/pr-status.d.ts +47 -0
- package/server/dist/core/pr-status.d.ts.map +1 -0
- package/server/dist/core/pr-status.js +157 -0
- package/server/dist/core/pr-status.js.map +1 -0
- package/server/dist/core/preview-child-lifecycle.d.ts +77 -0
- package/server/dist/core/preview-child-lifecycle.d.ts.map +1 -0
- package/server/dist/core/preview-child-lifecycle.js +223 -0
- package/server/dist/core/preview-child-lifecycle.js.map +1 -0
- package/server/dist/core/preview-coherence.d.ts +59 -0
- package/server/dist/core/preview-coherence.d.ts.map +1 -0
- package/server/dist/core/preview-coherence.js +66 -0
- package/server/dist/core/preview-coherence.js.map +1 -0
- package/server/dist/core/preview-session-manager.d.ts +86 -0
- package/server/dist/core/preview-session-manager.d.ts.map +1 -0
- package/server/dist/core/preview-session-manager.js +303 -0
- package/server/dist/core/preview-session-manager.js.map +1 -0
- package/server/dist/core/preview-win32-spawn.d.ts +11 -0
- package/server/dist/core/preview-win32-spawn.d.ts.map +1 -0
- package/server/dist/core/preview-win32-spawn.js +45 -0
- package/server/dist/core/preview-win32-spawn.js.map +1 -0
- package/server/dist/core/profile-loader.d.ts +65 -0
- package/server/dist/core/profile-loader.d.ts.map +1 -0
- package/server/dist/core/profile-loader.js +125 -0
- package/server/dist/core/profile-loader.js.map +1 -0
- package/server/dist/core/project-actions-loader.d.ts +103 -0
- package/server/dist/core/project-actions-loader.d.ts.map +1 -0
- package/server/dist/core/project-actions-loader.js +161 -0
- package/server/dist/core/project-actions-loader.js.map +1 -0
- package/server/dist/core/project-manager.d.ts +110 -0
- package/server/dist/core/project-manager.d.ts.map +1 -0
- package/server/dist/core/project-manager.js +339 -0
- package/server/dist/core/project-manager.js.map +1 -0
- package/server/dist/core/project-registry-io.d.ts +64 -0
- package/server/dist/core/project-registry-io.d.ts.map +1 -0
- package/server/dist/core/project-registry-io.js +194 -0
- package/server/dist/core/project-registry-io.js.map +1 -0
- package/server/dist/core/readiness-probe.d.ts +89 -0
- package/server/dist/core/readiness-probe.d.ts.map +1 -0
- package/server/dist/core/readiness-probe.js +216 -0
- package/server/dist/core/readiness-probe.js.map +1 -0
- package/server/dist/core/run-config-reader.d.ts +35 -0
- package/server/dist/core/run-config-reader.d.ts.map +1 -0
- package/server/dist/core/run-config-reader.js +362 -0
- package/server/dist/core/run-config-reader.js.map +1 -0
- package/server/dist/core/run-data-join.d.ts +60 -0
- package/server/dist/core/run-data-join.d.ts.map +1 -0
- package/server/dist/core/run-data-join.js +264 -0
- package/server/dist/core/run-data-join.js.map +1 -0
- package/server/dist/core/run-data-types.d.ts +126 -0
- package/server/dist/core/run-data-types.d.ts.map +1 -0
- package/server/dist/core/run-data-types.js +25 -0
- package/server/dist/core/run-data-types.js.map +1 -0
- package/server/dist/core/run-loop-state-reader.d.ts +27 -0
- package/server/dist/core/run-loop-state-reader.d.ts.map +1 -0
- package/server/dist/core/run-loop-state-reader.js +79 -0
- package/server/dist/core/run-loop-state-reader.js.map +1 -0
- package/server/dist/core/sdk-sessions-merge.d.ts +60 -0
- package/server/dist/core/sdk-sessions-merge.d.ts.map +1 -0
- package/server/dist/core/sdk-sessions-merge.js +220 -0
- package/server/dist/core/sdk-sessions-merge.js.map +1 -0
- package/server/dist/core/sdk-sessions-store.d.ts +261 -0
- package/server/dist/core/sdk-sessions-store.d.ts.map +1 -0
- package/server/dist/core/sdk-sessions-store.js +315 -0
- package/server/dist/core/sdk-sessions-store.js.map +1 -0
- package/server/dist/core/sdk-sessions-validate.d.ts +9 -0
- package/server/dist/core/sdk-sessions-validate.d.ts.map +1 -0
- package/server/dist/core/sdk-sessions-validate.js +237 -0
- package/server/dist/core/sdk-sessions-validate.js.map +1 -0
- package/server/dist/core/session-jsonl-io.d.ts +35 -0
- package/server/dist/core/session-jsonl-io.d.ts.map +1 -0
- package/server/dist/core/session-jsonl-io.js +128 -0
- package/server/dist/core/session-jsonl-io.js.map +1 -0
- package/server/dist/core/session-parser.d.ts +81 -0
- package/server/dist/core/session-parser.d.ts.map +1 -0
- package/server/dist/core/session-parser.js +168 -0
- package/server/dist/core/session-parser.js.map +1 -0
- package/server/dist/core/session-watcher-debug.d.ts +7 -0
- package/server/dist/core/session-watcher-debug.d.ts.map +1 -0
- package/server/dist/core/session-watcher-debug.js +31 -0
- package/server/dist/core/session-watcher-debug.js.map +1 -0
- package/server/dist/core/session-watcher.d.ts +101 -0
- package/server/dist/core/session-watcher.d.ts.map +1 -0
- package/server/dist/core/session-watcher.js +226 -0
- package/server/dist/core/session-watcher.js.map +1 -0
- package/server/dist/core/shell-quote.d.ts +5 -0
- package/server/dist/core/shell-quote.d.ts.map +1 -0
- package/server/dist/core/shell-quote.js +49 -0
- package/server/dist/core/shell-quote.js.map +1 -0
- package/server/dist/core/task-editability.d.ts +22 -0
- package/server/dist/core/task-editability.d.ts.map +1 -0
- package/server/dist/core/task-editability.js +34 -0
- package/server/dist/core/task-editability.js.map +1 -0
- package/server/dist/core/terminal-prompt-detect.d.ts +7 -0
- package/server/dist/core/terminal-prompt-detect.d.ts.map +1 -0
- package/server/dist/core/terminal-prompt-detect.js +128 -0
- package/server/dist/core/terminal-prompt-detect.js.map +1 -0
- package/server/dist/core/tests-gate.d.ts +23 -0
- package/server/dist/core/tests-gate.d.ts.map +1 -0
- package/server/dist/core/tests-gate.js +92 -0
- package/server/dist/core/tests-gate.js.map +1 -0
- package/server/dist/core/triage-amend.d.ts +33 -0
- package/server/dist/core/triage-amend.d.ts.map +1 -0
- package/server/dist/core/triage-amend.js +109 -0
- package/server/dist/core/triage-amend.js.map +1 -0
- package/server/dist/core/triage-board-read.d.ts +37 -0
- package/server/dist/core/triage-board-read.d.ts.map +1 -0
- package/server/dist/core/triage-board-read.js +148 -0
- package/server/dist/core/triage-board-read.js.map +1 -0
- package/server/dist/core/triage-cli-runner.d.ts +61 -0
- package/server/dist/core/triage-cli-runner.d.ts.map +1 -0
- package/server/dist/core/triage-cli-runner.js +92 -0
- package/server/dist/core/triage-cli-runner.js.map +1 -0
- package/server/dist/core/triage-compose.d.ts +33 -0
- package/server/dist/core/triage-compose.d.ts.map +1 -0
- package/server/dist/core/triage-compose.js +51 -0
- package/server/dist/core/triage-compose.js.map +1 -0
- package/server/dist/core/triage-contract.d.ts +18 -0
- package/server/dist/core/triage-contract.d.ts.map +1 -0
- package/server/dist/core/triage-contract.js +45 -0
- package/server/dist/core/triage-contract.js.map +1 -0
- package/server/dist/core/triage-defer.d.ts +36 -0
- package/server/dist/core/triage-defer.d.ts.map +1 -0
- package/server/dist/core/triage-defer.js +117 -0
- package/server/dist/core/triage-defer.js.map +1 -0
- package/server/dist/core/triage-enrich.d.ts +31 -0
- package/server/dist/core/triage-enrich.d.ts.map +1 -0
- package/server/dist/core/triage-enrich.js +127 -0
- package/server/dist/core/triage-enrich.js.map +1 -0
- package/server/dist/core/triage-lock.d.ts +12 -0
- package/server/dist/core/triage-lock.d.ts.map +1 -0
- package/server/dist/core/triage-lock.js +41 -0
- package/server/dist/core/triage-lock.js.map +1 -0
- package/server/dist/core/triage-origin.d.ts +52 -0
- package/server/dist/core/triage-origin.d.ts.map +1 -0
- package/server/dist/core/triage-origin.js +0 -0
- package/server/dist/core/triage-origin.js.map +1 -0
- package/server/dist/core/triage-paths.d.ts +25 -0
- package/server/dist/core/triage-paths.d.ts.map +1 -0
- package/server/dist/core/triage-paths.js +125 -0
- package/server/dist/core/triage-paths.js.map +1 -0
- package/server/dist/core/triage-raw.d.ts +33 -0
- package/server/dist/core/triage-raw.d.ts.map +1 -0
- package/server/dist/core/triage-raw.js +66 -0
- package/server/dist/core/triage-raw.js.map +1 -0
- package/server/dist/core/triage-store.d.ts +42 -0
- package/server/dist/core/triage-store.d.ts.map +1 -0
- package/server/dist/core/triage-store.js +268 -0
- package/server/dist/core/triage-store.js.map +1 -0
- package/server/dist/core/triage-validation.d.ts +58 -0
- package/server/dist/core/triage-validation.d.ts.map +1 -0
- package/server/dist/core/triage-validation.js +198 -0
- package/server/dist/core/triage-validation.js.map +1 -0
- package/server/dist/core/win32-spawn.d.ts +29 -0
- package/server/dist/core/win32-spawn.d.ts.map +1 -0
- package/server/dist/core/win32-spawn.js +271 -0
- package/server/dist/core/win32-spawn.js.map +1 -0
- package/server/dist/external/__tests__/api-contract-probes.d.ts +49 -0
- package/server/dist/external/__tests__/api-contract-probes.d.ts.map +1 -0
- package/server/dist/external/__tests__/api-contract-probes.js +295 -0
- package/server/dist/external/__tests__/api-contract-probes.js.map +1 -0
- package/server/dist/external/_lead-fields-tag-filter-harness.d.ts +7 -0
- package/server/dist/external/_lead-fields-tag-filter-harness.d.ts.map +1 -0
- package/server/dist/external/_lead-fields-tag-filter-harness.js +41 -0
- package/server/dist/external/_lead-fields-tag-filter-harness.js.map +1 -0
- package/server/dist/external/_routes-edit-fields-harness.d.ts +8 -0
- package/server/dist/external/_routes-edit-fields-harness.d.ts.map +1 -0
- package/server/dist/external/_routes-edit-fields-harness.js +49 -0
- package/server/dist/external/_routes-edit-fields-harness.js.map +1 -0
- package/server/dist/external/_shared/helpers.d.ts +143 -0
- package/server/dist/external/_shared/helpers.d.ts.map +1 -0
- package/server/dist/external/_shared/helpers.js +231 -0
- package/server/dist/external/_shared/helpers.js.map +1 -0
- package/server/dist/external/actions/_helpers.d.ts +15 -0
- package/server/dist/external/actions/_helpers.d.ts.map +1 -0
- package/server/dist/external/actions/_helpers.js +48 -0
- package/server/dist/external/actions/_helpers.js.map +1 -0
- package/server/dist/external/actions/get.d.ts +8 -0
- package/server/dist/external/actions/get.d.ts.map +1 -0
- package/server/dist/external/actions/get.js +96 -0
- package/server/dist/external/actions/get.js.map +1 -0
- package/server/dist/external/actions/routes.d.ts +9 -0
- package/server/dist/external/actions/routes.d.ts.map +1 -0
- package/server/dist/external/actions/routes.js +33 -0
- package/server/dist/external/actions/routes.js.map +1 -0
- package/server/dist/external/actions/stub.d.ts +6 -0
- package/server/dist/external/actions/stub.d.ts.map +1 -0
- package/server/dist/external/actions/stub.js +51 -0
- package/server/dist/external/actions/stub.js.map +1 -0
- package/server/dist/external/actions/upload-delete.d.ts +6 -0
- package/server/dist/external/actions/upload-delete.d.ts.map +1 -0
- package/server/dist/external/actions/upload-delete.js +46 -0
- package/server/dist/external/actions/upload-delete.js.map +1 -0
- package/server/dist/external/actions/upload.d.ts +6 -0
- package/server/dist/external/actions/upload.d.ts.map +1 -0
- package/server/dist/external/actions/upload.js +141 -0
- package/server/dist/external/actions/upload.js.map +1 -0
- package/server/dist/external/compliance/routes.d.ts +9 -0
- package/server/dist/external/compliance/routes.d.ts.map +1 -0
- package/server/dist/external/compliance/routes.js +46 -0
- package/server/dist/external/compliance/routes.js.map +1 -0
- package/server/dist/external/design-review/__tests__/_helpers.d.ts +16 -0
- package/server/dist/external/design-review/__tests__/_helpers.d.ts.map +1 -0
- package/server/dist/external/design-review/__tests__/_helpers.js +92 -0
- package/server/dist/external/design-review/__tests__/_helpers.js.map +1 -0
- package/server/dist/external/design-review/feedback-write.d.ts +7 -0
- package/server/dist/external/design-review/feedback-write.d.ts.map +1 -0
- package/server/dist/external/design-review/feedback-write.js +126 -0
- package/server/dist/external/design-review/feedback-write.js.map +1 -0
- package/server/dist/external/design-review/gate.d.ts +11 -0
- package/server/dist/external/design-review/gate.d.ts.map +1 -0
- package/server/dist/external/design-review/gate.js +39 -0
- package/server/dist/external/design-review/gate.js.map +1 -0
- package/server/dist/external/design-review/routes.d.ts +9 -0
- package/server/dist/external/design-review/routes.d.ts.map +1 -0
- package/server/dist/external/design-review/routes.js +25 -0
- package/server/dist/external/design-review/routes.js.map +1 -0
- package/server/dist/external/design-review/serve.d.ts +10 -0
- package/server/dist/external/design-review/serve.d.ts.map +1 -0
- package/server/dist/external/design-review/serve.js +184 -0
- package/server/dist/external/design-review/serve.js.map +1 -0
- package/server/dist/external/events/routes.d.ts +16 -0
- package/server/dist/external/events/routes.d.ts.map +1 -0
- package/server/dist/external/events/routes.js +46 -0
- package/server/dist/external/events/routes.js.map +1 -0
- package/server/dist/external/file/_helpers.d.ts +62 -0
- package/server/dist/external/file/_helpers.d.ts.map +1 -0
- package/server/dist/external/file/_helpers.js +146 -0
- package/server/dist/external/file/_helpers.js.map +1 -0
- package/server/dist/external/file/routes.d.ts +7 -0
- package/server/dist/external/file/routes.d.ts.map +1 -0
- package/server/dist/external/file/routes.js +122 -0
- package/server/dist/external/file/routes.js.map +1 -0
- package/server/dist/external/file/write.d.ts +20 -0
- package/server/dist/external/file/write.d.ts.map +1 -0
- package/server/dist/external/file/write.js +172 -0
- package/server/dist/external/file/write.js.map +1 -0
- package/server/dist/external/inbox/_cache.d.ts +48 -0
- package/server/dist/external/inbox/_cache.d.ts.map +1 -0
- package/server/dist/external/inbox/_cache.js +46 -0
- package/server/dist/external/inbox/_cache.js.map +1 -0
- package/server/dist/external/inbox/_derive.d.ts +56 -0
- package/server/dist/external/inbox/_derive.d.ts.map +1 -0
- package/server/dist/external/inbox/_derive.js +231 -0
- package/server/dist/external/inbox/_derive.js.map +1 -0
- package/server/dist/external/inbox/routes.d.ts +13 -0
- package/server/dist/external/inbox/routes.d.ts.map +1 -0
- package/server/dist/external/inbox/routes.js +59 -0
- package/server/dist/external/inbox/routes.js.map +1 -0
- package/server/dist/external/launch/_helpers.d.ts +17 -0
- package/server/dist/external/launch/_helpers.d.ts.map +1 -0
- package/server/dist/external/launch/_helpers.js +25 -0
- package/server/dist/external/launch/_helpers.js.map +1 -0
- package/server/dist/external/launch/action-substitution-branch.d.ts +11 -0
- package/server/dist/external/launch/action-substitution-branch.d.ts.map +1 -0
- package/server/dist/external/launch/action-substitution-branch.js +112 -0
- package/server/dist/external/launch/action-substitution-branch.js.map +1 -0
- package/server/dist/external/launch/campaign-branch.d.ts +12 -0
- package/server/dist/external/launch/campaign-branch.d.ts.map +1 -0
- package/server/dist/external/launch/campaign-branch.js +95 -0
- package/server/dist/external/launch/campaign-branch.js.map +1 -0
- package/server/dist/external/launch/campaign-step-branch.d.ts +12 -0
- package/server/dist/external/launch/campaign-step-branch.d.ts.map +1 -0
- package/server/dist/external/launch/campaign-step-branch.js +108 -0
- package/server/dist/external/launch/campaign-step-branch.js.map +1 -0
- package/server/dist/external/launch/legacy-fallback-branch.d.ts +12 -0
- package/server/dist/external/launch/legacy-fallback-branch.d.ts.map +1 -0
- package/server/dist/external/launch/legacy-fallback-branch.js +29 -0
- package/server/dist/external/launch/legacy-fallback-branch.js.map +1 -0
- package/server/dist/external/launch/master-run-branch.d.ts +24 -0
- package/server/dist/external/launch/master-run-branch.d.ts.map +1 -0
- package/server/dist/external/launch/master-run-branch.js +168 -0
- package/server/dist/external/launch/master-run-branch.js.map +1 -0
- package/server/dist/external/launch/parse-body.d.ts +46 -0
- package/server/dist/external/launch/parse-body.d.ts.map +1 -0
- package/server/dist/external/launch/parse-body.js +115 -0
- package/server/dist/external/launch/parse-body.js.map +1 -0
- package/server/dist/external/launch/phase-task-branch.d.ts +18 -0
- package/server/dist/external/launch/phase-task-branch.d.ts.map +1 -0
- package/server/dist/external/launch/phase-task-branch.js +170 -0
- package/server/dist/external/launch/phase-task-branch.js.map +1 -0
- package/server/dist/external/launch/routes.d.ts +23 -0
- package/server/dist/external/launch/routes.d.ts.map +1 -0
- package/server/dist/external/launch/routes.js +198 -0
- package/server/dist/external/launch/routes.js.map +1 -0
- package/server/dist/external/media/_helpers.d.ts +32 -0
- package/server/dist/external/media/_helpers.d.ts.map +1 -0
- package/server/dist/external/media/_helpers.js +77 -0
- package/server/dist/external/media/_helpers.js.map +1 -0
- package/server/dist/external/media/routes.d.ts +7 -0
- package/server/dist/external/media/routes.d.ts.map +1 -0
- package/server/dist/external/media/routes.js +120 -0
- package/server/dist/external/media/routes.js.map +1 -0
- package/server/dist/external/mission-context/facts-slice3.d.ts +22 -0
- package/server/dist/external/mission-context/facts-slice3.d.ts.map +1 -0
- package/server/dist/external/mission-context/facts-slice3.js +143 -0
- package/server/dist/external/mission-context/facts-slice3.js.map +1 -0
- package/server/dist/external/mission-context/facts.d.ts +44 -0
- package/server/dist/external/mission-context/facts.d.ts.map +1 -0
- package/server/dist/external/mission-context/facts.js +109 -0
- package/server/dist/external/mission-context/facts.js.map +1 -0
- package/server/dist/external/mission-context/routes.d.ts +83 -0
- package/server/dist/external/mission-context/routes.d.ts.map +1 -0
- package/server/dist/external/mission-context/routes.js +226 -0
- package/server/dist/external/mission-context/routes.js.map +1 -0
- package/server/dist/external/mission-context/test-harness.d.ts +62 -0
- package/server/dist/external/mission-context/test-harness.d.ts.map +1 -0
- package/server/dist/external/mission-context/test-harness.js +121 -0
- package/server/dist/external/mission-context/test-harness.js.map +1 -0
- package/server/dist/external/mission-context/wire.d.ts +12 -0
- package/server/dist/external/mission-context/wire.d.ts.map +1 -0
- package/server/dist/external/mission-context/wire.js +62 -0
- package/server/dist/external/mission-context/wire.js.map +1 -0
- package/server/dist/external/model-config/routes.d.ts +9 -0
- package/server/dist/external/model-config/routes.d.ts.map +1 -0
- package/server/dist/external/model-config/routes.js +18 -0
- package/server/dist/external/model-config/routes.js.map +1 -0
- package/server/dist/external/org/__tests__/fixtures/lock-race-worker.d.ts +2 -0
- package/server/dist/external/org/__tests__/fixtures/lock-race-worker.d.ts.map +1 -0
- package/server/dist/external/org/__tests__/fixtures/lock-race-worker.js +67 -0
- package/server/dist/external/org/__tests__/fixtures/lock-race-worker.js.map +1 -0
- package/server/dist/external/org/_helpers.d.ts +67 -0
- package/server/dist/external/org/_helpers.d.ts.map +1 -0
- package/server/dist/external/org/_helpers.js +146 -0
- package/server/dist/external/org/_helpers.js.map +1 -0
- package/server/dist/external/org/beat-register-release-audit.d.ts +17 -0
- package/server/dist/external/org/beat-register-release-audit.d.ts.map +1 -0
- package/server/dist/external/org/beat-register-release-audit.js +96 -0
- package/server/dist/external/org/beat-register-release-audit.js.map +1 -0
- package/server/dist/external/org/beat-register-release-core.d.ts +50 -0
- package/server/dist/external/org/beat-register-release-core.d.ts.map +1 -0
- package/server/dist/external/org/beat-register-release-core.js +183 -0
- package/server/dist/external/org/beat-register-release-core.js.map +1 -0
- package/server/dist/external/org/beat-register-release.d.ts +13 -0
- package/server/dist/external/org/beat-register-release.d.ts.map +1 -0
- package/server/dist/external/org/beat-register-release.js +81 -0
- package/server/dist/external/org/beat-register-release.js.map +1 -0
- package/server/dist/external/org/beat-register.d.ts +100 -0
- package/server/dist/external/org/beat-register.d.ts.map +1 -0
- package/server/dist/external/org/beat-register.js +198 -0
- package/server/dist/external/org/beat-register.js.map +1 -0
- package/server/dist/external/org/countersign.d.ts +8 -0
- package/server/dist/external/org/countersign.d.ts.map +1 -0
- package/server/dist/external/org/countersign.js +157 -0
- package/server/dist/external/org/countersign.js.map +1 -0
- package/server/dist/external/org/cron.d.ts +22 -0
- package/server/dist/external/org/cron.d.ts.map +1 -0
- package/server/dist/external/org/cron.js +59 -0
- package/server/dist/external/org/cron.js.map +1 -0
- package/server/dist/external/org/decisions-lock.d.ts +68 -0
- package/server/dist/external/org/decisions-lock.d.ts.map +1 -0
- package/server/dist/external/org/decisions-lock.js +209 -0
- package/server/dist/external/org/decisions-lock.js.map +1 -0
- package/server/dist/external/org/file-read.d.ts +14 -0
- package/server/dist/external/org/file-read.d.ts.map +1 -0
- package/server/dist/external/org/file-read.js +80 -0
- package/server/dist/external/org/file-read.js.map +1 -0
- package/server/dist/external/org/file-write.d.ts +14 -0
- package/server/dist/external/org/file-write.d.ts.map +1 -0
- package/server/dist/external/org/file-write.js +205 -0
- package/server/dist/external/org/file-write.js.map +1 -0
- package/server/dist/external/org/last-run.d.ts +28 -0
- package/server/dist/external/org/last-run.d.ts.map +1 -0
- package/server/dist/external/org/last-run.js +137 -0
- package/server/dist/external/org/last-run.js.map +1 -0
- package/server/dist/external/org/org-chart-lookup.d.ts +16 -0
- package/server/dist/external/org/org-chart-lookup.d.ts.map +1 -0
- package/server/dist/external/org/org-chart-lookup.js +100 -0
- package/server/dist/external/org/org-chart-lookup.js.map +1 -0
- package/server/dist/external/org/org-chart.d.ts +25 -0
- package/server/dist/external/org/org-chart.d.ts.map +1 -0
- package/server/dist/external/org/org-chart.js +110 -0
- package/server/dist/external/org/org-chart.js.map +1 -0
- package/server/dist/external/org/routes.d.ts +12 -0
- package/server/dist/external/org/routes.d.ts.map +1 -0
- package/server/dist/external/org/routes.js +90 -0
- package/server/dist/external/org/routes.js.map +1 -0
- package/server/dist/external/org/usage.d.ts +24 -0
- package/server/dist/external/org/usage.d.ts.map +1 -0
- package/server/dist/external/org/usage.js +110 -0
- package/server/dist/external/org/usage.js.map +1 -0
- package/server/dist/external/pr-status/routes.d.ts +7 -0
- package/server/dist/external/pr-status/routes.d.ts.map +1 -0
- package/server/dist/external/pr-status/routes.js +37 -0
- package/server/dist/external/pr-status/routes.js.map +1 -0
- package/server/dist/external/preview/routes.d.ts +10 -0
- package/server/dist/external/preview/routes.d.ts.map +1 -0
- package/server/dist/external/preview/routes.js +71 -0
- package/server/dist/external/preview/routes.js.map +1 -0
- package/server/dist/external/routes.d.ts +106 -0
- package/server/dist/external/routes.d.ts.map +1 -0
- package/server/dist/external/routes.js +162 -0
- package/server/dist/external/routes.js.map +1 -0
- package/server/dist/external/run-config/routes.d.ts +9 -0
- package/server/dist/external/run-config/routes.d.ts.map +1 -0
- package/server/dist/external/run-config/routes.js +55 -0
- package/server/dist/external/run-config/routes.js.map +1 -0
- package/server/dist/external/runs/routes.d.ts +16 -0
- package/server/dist/external/runs/routes.d.ts.map +1 -0
- package/server/dist/external/runs/routes.js +69 -0
- package/server/dist/external/runs/routes.js.map +1 -0
- package/server/dist/external/tasks/_phase-helpers.d.ts +37 -0
- package/server/dist/external/tasks/_phase-helpers.d.ts.map +1 -0
- package/server/dist/external/tasks/_phase-helpers.js +101 -0
- package/server/dist/external/tasks/_phase-helpers.js.map +1 -0
- package/server/dist/external/tasks/create.d.ts +12 -0
- package/server/dist/external/tasks/create.d.ts.map +1 -0
- package/server/dist/external/tasks/create.js +139 -0
- package/server/dist/external/tasks/create.js.map +1 -0
- package/server/dist/external/tasks/lifecycle.d.ts +12 -0
- package/server/dist/external/tasks/lifecycle.d.ts.map +1 -0
- package/server/dist/external/tasks/lifecycle.js +231 -0
- package/server/dist/external/tasks/lifecycle.js.map +1 -0
- package/server/dist/external/tasks/list-get.d.ts +11 -0
- package/server/dist/external/tasks/list-get.d.ts.map +1 -0
- package/server/dist/external/tasks/list-get.js +50 -0
- package/server/dist/external/tasks/list-get.js.map +1 -0
- package/server/dist/external/tasks/patch.d.ts +12 -0
- package/server/dist/external/tasks/patch.d.ts.map +1 -0
- package/server/dist/external/tasks/patch.js +192 -0
- package/server/dist/external/tasks/patch.js.map +1 -0
- package/server/dist/external/tasks/routes.d.ts +18 -0
- package/server/dist/external/tasks/routes.d.ts.map +1 -0
- package/server/dist/external/tasks/routes.js +49 -0
- package/server/dist/external/tasks/routes.js.map +1 -0
- package/server/dist/external/transcript/routes.d.ts +12 -0
- package/server/dist/external/transcript/routes.d.ts.map +1 -0
- package/server/dist/external/transcript/routes.js +160 -0
- package/server/dist/external/transcript/routes.js.map +1 -0
- package/server/dist/external/tree/routes.d.ts +7 -0
- package/server/dist/external/tree/routes.d.ts.map +1 -0
- package/server/dist/external/tree/routes.js +96 -0
- package/server/dist/external/tree/routes.js.map +1 -0
- package/server/dist/index.d.ts +3 -0
- package/server/dist/index.d.ts.map +1 -0
- package/server/dist/index.js +774 -0
- package/server/dist/index.js.map +1 -0
- package/server/dist/lib/bind-errors.d.ts +18 -0
- package/server/dist/lib/bind-errors.d.ts.map +1 -0
- package/server/dist/lib/bind-errors.js +43 -0
- package/server/dist/lib/bind-errors.js.map +1 -0
- package/server/dist/lib/resolveHonoHost.d.ts +3 -0
- package/server/dist/lib/resolveHonoHost.d.ts.map +1 -0
- package/server/dist/lib/resolveHonoHost.js +34 -0
- package/server/dist/lib/resolveHonoHost.js.map +1 -0
- package/server/dist/lib/resolveNetworkProfile.d.ts +28 -0
- package/server/dist/lib/resolveNetworkProfile.d.ts.map +1 -0
- package/server/dist/lib/resolveNetworkProfile.js +42 -0
- package/server/dist/lib/resolveNetworkProfile.js.map +1 -0
- package/server/dist/lib/resolveTailscaleIp.d.ts +26 -0
- package/server/dist/lib/resolveTailscaleIp.d.ts.map +1 -0
- package/server/dist/lib/resolveTailscaleIp.js +61 -0
- package/server/dist/lib/resolveTailscaleIp.js.map +1 -0
- package/server/dist/lib/resolveTrustedOrigins.d.ts +9 -0
- package/server/dist/lib/resolveTrustedOrigins.d.ts.map +1 -0
- package/server/dist/lib/resolveTrustedOrigins.js +154 -0
- package/server/dist/lib/resolveTrustedOrigins.js.map +1 -0
- package/server/dist/middleware/error-handler.d.ts +8 -0
- package/server/dist/middleware/error-handler.d.ts.map +1 -0
- package/server/dist/middleware/error-handler.js +75 -0
- package/server/dist/middleware/error-handler.js.map +1 -0
- package/server/dist/middleware/logger.d.ts +3 -0
- package/server/dist/middleware/logger.d.ts.map +1 -0
- package/server/dist/middleware/logger.js +13 -0
- package/server/dist/middleware/logger.js.map +1 -0
- package/server/dist/routes/_triage-api-harness.d.ts +16 -0
- package/server/dist/routes/_triage-api-harness.d.ts.map +1 -0
- package/server/dist/routes/_triage-api-harness.js +89 -0
- package/server/dist/routes/_triage-api-harness.js.map +1 -0
- package/server/dist/routes/campaigns.d.ts +26 -0
- package/server/dist/routes/campaigns.d.ts.map +1 -0
- package/server/dist/routes/campaigns.js +237 -0
- package/server/dist/routes/campaigns.js.map +1 -0
- package/server/dist/routes/diagnostics.d.ts +84 -0
- package/server/dist/routes/diagnostics.d.ts.map +1 -0
- package/server/dist/routes/diagnostics.js +143 -0
- package/server/dist/routes/diagnostics.js.map +1 -0
- package/server/dist/routes/grade.d.ts +13 -0
- package/server/dist/routes/grade.d.ts.map +1 -0
- package/server/dist/routes/grade.js +45 -0
- package/server/dist/routes/grade.js.map +1 -0
- package/server/dist/routes/profiles.d.ts +25 -0
- package/server/dist/routes/profiles.d.ts.map +1 -0
- package/server/dist/routes/profiles.js +58 -0
- package/server/dist/routes/profiles.js.map +1 -0
- package/server/dist/routes/projects.d.ts +20 -0
- package/server/dist/routes/projects.d.ts.map +1 -0
- package/server/dist/routes/projects.js +105 -0
- package/server/dist/routes/projects.js.map +1 -0
- package/server/dist/routes/readiness.d.ts +11 -0
- package/server/dist/routes/readiness.d.ts.map +1 -0
- package/server/dist/routes/readiness.js +52 -0
- package/server/dist/routes/readiness.js.map +1 -0
- package/server/dist/routes/settings.d.ts +13 -0
- package/server/dist/routes/settings.d.ts.map +1 -0
- package/server/dist/routes/settings.js +69 -0
- package/server/dist/routes/settings.js.map +1 -0
- package/server/dist/routes/terminal-appearance.d.ts +7 -0
- package/server/dist/routes/terminal-appearance.d.ts.map +1 -0
- package/server/dist/routes/terminal-appearance.js +28 -0
- package/server/dist/routes/terminal-appearance.js.map +1 -0
- package/server/dist/routes/triage.d.ts +35 -0
- package/server/dist/routes/triage.d.ts.map +1 -0
- package/server/dist/routes/triage.js +496 -0
- package/server/dist/routes/triage.js.map +1 -0
- package/server/dist/terminal/backpressure-telemetry.d.ts +86 -0
- package/server/dist/terminal/backpressure-telemetry.d.ts.map +1 -0
- package/server/dist/terminal/backpressure-telemetry.js +158 -0
- package/server/dist/terminal/backpressure-telemetry.js.map +1 -0
- package/server/dist/terminal/boot-wipe.d.ts +47 -0
- package/server/dist/terminal/boot-wipe.d.ts.map +1 -0
- package/server/dist/terminal/boot-wipe.js +122 -0
- package/server/dist/terminal/boot-wipe.js.map +1 -0
- package/server/dist/terminal/headless-mirror.d.ts +139 -0
- package/server/dist/terminal/headless-mirror.d.ts.map +1 -0
- package/server/dist/terminal/headless-mirror.js +389 -0
- package/server/dist/terminal/headless-mirror.js.map +1 -0
- package/server/dist/terminal/headless-probe.d.ts +26 -0
- package/server/dist/terminal/headless-probe.d.ts.map +1 -0
- package/server/dist/terminal/headless-probe.js +99 -0
- package/server/dist/terminal/headless-probe.js.map +1 -0
- package/server/dist/terminal/idle-reaper.d.ts +47 -0
- package/server/dist/terminal/idle-reaper.d.ts.map +1 -0
- package/server/dist/terminal/idle-reaper.js +95 -0
- package/server/dist/terminal/idle-reaper.js.map +1 -0
- package/server/dist/terminal/image-paste.d.ts +60 -0
- package/server/dist/terminal/image-paste.d.ts.map +1 -0
- package/server/dist/terminal/image-paste.js +260 -0
- package/server/dist/terminal/image-paste.js.map +1 -0
- package/server/dist/terminal/pty-manager.d.ts +452 -0
- package/server/dist/terminal/pty-manager.d.ts.map +1 -0
- package/server/dist/terminal/pty-manager.js +1014 -0
- package/server/dist/terminal/pty-manager.js.map +1 -0
- package/server/dist/terminal/replay-snapshot.d.ts +25 -0
- package/server/dist/terminal/replay-snapshot.d.ts.map +1 -0
- package/server/dist/terminal/replay-snapshot.js +124 -0
- package/server/dist/terminal/replay-snapshot.js.map +1 -0
- package/server/dist/terminal/resync-gate.d.ts +20 -0
- package/server/dist/terminal/resync-gate.d.ts.map +1 -0
- package/server/dist/terminal/resync-gate.js +58 -0
- package/server/dist/terminal/resync-gate.js.map +1 -0
- package/server/dist/terminal/routes.d.ts +67 -0
- package/server/dist/terminal/routes.d.ts.map +1 -0
- package/server/dist/terminal/routes.js +455 -0
- package/server/dist/terminal/routes.js.map +1 -0
- package/server/dist/terminal/scrollback-store.d.ts +120 -0
- package/server/dist/terminal/scrollback-store.d.ts.map +1 -0
- package/server/dist/terminal/scrollback-store.js +572 -0
- package/server/dist/terminal/scrollback-store.js.map +1 -0
- package/server/dist/terminal/snapshot-preserve.d.ts +63 -0
- package/server/dist/terminal/snapshot-preserve.d.ts.map +1 -0
- package/server/dist/terminal/snapshot-preserve.js +116 -0
- package/server/dist/terminal/snapshot-preserve.js.map +1 -0
- package/server/dist/terminal/snapshot-store.d.ts +147 -0
- package/server/dist/terminal/snapshot-store.d.ts.map +1 -0
- package/server/dist/terminal/snapshot-store.js +439 -0
- package/server/dist/terminal/snapshot-store.js.map +1 -0
- package/server/dist/terminal/snapshot-tmp-sweep.d.ts +48 -0
- package/server/dist/terminal/snapshot-tmp-sweep.d.ts.map +1 -0
- package/server/dist/terminal/snapshot-tmp-sweep.js +141 -0
- package/server/dist/terminal/snapshot-tmp-sweep.js.map +1 -0
- package/server/dist/terminal/spawn-env.d.ts +46 -0
- package/server/dist/terminal/spawn-env.d.ts.map +1 -0
- package/server/dist/terminal/spawn-env.js +232 -0
- package/server/dist/terminal/spawn-env.js.map +1 -0
- package/server/dist/terminal/terminal-reset.d.ts +31 -0
- package/server/dist/terminal/terminal-reset.d.ts.map +1 -0
- package/server/dist/terminal/terminal-reset.js +43 -0
- package/server/dist/terminal/terminal-reset.js.map +1 -0
- package/server/dist/terminal/ws-heartbeat.d.ts +78 -0
- package/server/dist/terminal/ws-heartbeat.d.ts.map +1 -0
- package/server/dist/terminal/ws-heartbeat.js +164 -0
- package/server/dist/terminal/ws-heartbeat.js.map +1 -0
- package/server/dist/terminal/ws-upgrade-handler.d.ts +96 -0
- package/server/dist/terminal/ws-upgrade-handler.d.ts.map +1 -0
- package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts +46 -0
- package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts.map +1 -0
- package/server/dist/terminal/ws-upgrade-handler.fixtures.js +126 -0
- package/server/dist/terminal/ws-upgrade-handler.fixtures.js.map +1 -0
- package/server/dist/terminal/ws-upgrade-handler.js +518 -0
- package/server/dist/terminal/ws-upgrade-handler.js.map +1 -0
- package/server/dist/types/action-schema.d.ts +75 -0
- package/server/dist/types/action-schema.d.ts.map +1 -0
- package/server/dist/types/action-schema.js +32 -0
- package/server/dist/types/action-schema.js.map +1 -0
- package/server/dist/types/project.d.ts +72 -0
- package/server/dist/types/project.d.ts.map +1 -0
- package/server/dist/types/project.js +16 -0
- package/server/dist/types/project.js.map +1 -0
- package/server/dist/types/run-config-v2.d.ts +172 -0
- package/server/dist/types/run-config-v2.d.ts.map +1 -0
- package/server/dist/types/run-config-v2.js +169 -0
- package/server/dist/types/run-config-v2.js.map +1 -0
- package/server/dist/types/settings.d.ts +25 -0
- package/server/dist/types/settings.d.ts.map +1 -0
- package/server/dist/types/settings.js +12 -0
- package/server/dist/types/settings.js.map +1 -0
- package/server/dist/types/task.d.ts +55 -0
- package/server/dist/types/task.d.ts.map +1 -0
- package/server/dist/types/task.js +13 -0
- package/server/dist/types/task.js.map +1 -0
- package/server/dist/types/triage.d.ts +135 -0
- package/server/dist/types/triage.d.ts.map +1 -0
- package/server/dist/types/triage.js +15 -0
- package/server/dist/types/triage.js.map +1 -0
- package/server/package.json +43 -0
- package/server/profiles/PROFILE_SCHEMA_VERSION +1 -0
- package/server/profiles/README.md +27 -0
- package/server/profiles/python-plugin-monorepo.json +35 -0
- package/server/profiles/supabase-nextjs.json +253 -0
- package/server/profiles/vite-hono.json +92 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* preflight.mjs — AC1a, the prerequisite gate (the THIRD silent death).
|
|
3
|
+
*
|
|
4
|
+
* The plugins do NOT run on Node alone: their hooks shell out to `uv` (159
|
|
5
|
+
* `uv run` call sites across the installed hooks.json files), which resolves a
|
|
6
|
+
* Python. Without uv + a WORKING Python every hook dies at session start while
|
|
7
|
+
* `claude plugin list` still shows a cheerful checkmark. So preflight is a
|
|
8
|
+
* loud, actionable gate, not a warning buried above "Command Center running".
|
|
9
|
+
*
|
|
10
|
+
* The Windows trap this file exists to dodge: `python3` is usually the
|
|
11
|
+
* Microsoft-Store App-Execution-Alias stub — `command -v`/`where` FINDS it, but
|
|
12
|
+
* running it does nothing. We therefore probe by TEST-RUNNING `--version` and
|
|
13
|
+
* accept the first candidate that actually reports one (ported from
|
|
14
|
+
* `scripts/verify-setup.sh`), never by mere presence on PATH.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { spawnSync } from "node:child_process";
|
|
18
|
+
|
|
19
|
+
import { MIN_NODE, compareSemver, installHint, isWindows } from "./util.mjs";
|
|
20
|
+
import { resolveSpawn } from "./win32-spawn.mjs";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Default runner: invoke `<cmd> --version` with `shell: false` and report
|
|
24
|
+
* whether it actually ran.
|
|
25
|
+
*
|
|
26
|
+
* On Windows some of these tools are `.cmd`/`.bat` shims (`claude` from an npm
|
|
27
|
+
* install) that a bare `shell: false` spawn CANNOT reach — probing them that way
|
|
28
|
+
* would report a perfectly-installed Claude as ABSENT and skip the plugin phase
|
|
29
|
+
* forever. That used to be answered with `shell: true`; `resolveSpawn` now finds
|
|
30
|
+
* the real file via PATHEXT and routes a shim through an explicit
|
|
31
|
+
* `cmd.exe /d /s /c` instead (see lib/win32-spawn.mjs).
|
|
32
|
+
*
|
|
33
|
+
* CALLER INVARIANT, still load-bearing: `cmd` is a fixed internal literal
|
|
34
|
+
* (claude / uv / python3 / python / py / git / gh) and `args` is `["--version"]`.
|
|
35
|
+
* NOTHING here validates that — `defaultRun` is exported from a published `lib/`
|
|
36
|
+
* and reaches the cmd.exe wrap with no charset gate of its own (unlike
|
|
37
|
+
* `claude-cli.mjs`, which has `SAFE_ARG`). Only `runPreflight`'s call sites
|
|
38
|
+
* honour it. A caller passing user input must gate it first.
|
|
39
|
+
*
|
|
40
|
+
* An unresolvable name yields `ok: false` — exactly the verdict the old shell
|
|
41
|
+
* path produced via a non-zero exit. Note what "unresolvable" now means: a bare
|
|
42
|
+
* name that PATHEXT cannot place falls back to a direct `CreateProcess` spawn
|
|
43
|
+
* rather than being abandoned, because `realpath` cannot follow a Windows
|
|
44
|
+
* App-Execution-Alias at all — so a genuinely INSTALLED Microsoft-Store Python
|
|
45
|
+
* would otherwise be reported absent. The Store STUB is still rejected, by the
|
|
46
|
+
* unchanged `\d+\.\d+` output requirement below rather than by failing to
|
|
47
|
+
* resolve. Both verified on Windows 11, 2026-07-31.
|
|
48
|
+
* @param {string} cmd @param {string[]} [args]
|
|
49
|
+
* @returns {{ ok: boolean, stdout: string, stderr: string, code: number | null }}
|
|
50
|
+
*/
|
|
51
|
+
export function defaultRun(cmd, args = ["--version"]) {
|
|
52
|
+
try {
|
|
53
|
+
const plan = resolveSpawn([cmd, ...args]);
|
|
54
|
+
// UNREACHABLE as of iterate-2026-07-31 (win32-spawn divergence 5: an
|
|
55
|
+
// unresolvable bare name comes back as itself). `spawnSync` does NOT throw
|
|
56
|
+
// for a missing binary — it returns `{ error: ENOENT, status: null }` — so
|
|
57
|
+
// the failure is carried by the `!r.error` term in `ok` below and never
|
|
58
|
+
// reaches the catch. (An earlier version of this comment said "lands in the
|
|
59
|
+
// catch"; Stage-3 doubt review disproved it. The verdict was always right,
|
|
60
|
+
// the stated mechanism was not.) Kept as contract insurance.
|
|
61
|
+
if (!plan) return { ok: false, stdout: "", stderr: "", code: null };
|
|
62
|
+
const r = spawnSync(plan.command, plan.args, {
|
|
63
|
+
encoding: "utf-8",
|
|
64
|
+
shell: false,
|
|
65
|
+
timeout: 8000,
|
|
66
|
+
windowsVerbatimArguments: plan.windowsVerbatimArguments,
|
|
67
|
+
});
|
|
68
|
+
const stdout = (r.stdout ?? "").toString();
|
|
69
|
+
const stderr = (r.stderr ?? "").toString();
|
|
70
|
+
// A real interpreter/tool exits 0 AND prints a version somewhere. The MS
|
|
71
|
+
// Store python3 stub exits non-zero (or prints its "not found" nag), so
|
|
72
|
+
// requiring both status 0 and a digit-bearing line rejects it.
|
|
73
|
+
const ok = r.status === 0 && !r.error && /\d+\.\d+/.test(stdout + stderr);
|
|
74
|
+
return { ok, stdout, stderr, code: r.status ?? null };
|
|
75
|
+
} catch {
|
|
76
|
+
return { ok: false, stdout: "", stderr: "", code: null };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** First `\d+.\d+(.\d+)?` token in a `--version` blob, or "". */
|
|
81
|
+
export function extractVersion(out) {
|
|
82
|
+
const m = /(\d+\.\d+(?:\.\d+)?)/.exec(String(out ?? ""));
|
|
83
|
+
return m ? m[1] : "";
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Resolve ONE working Python by test-running `--version` (python3 → python →
|
|
88
|
+
* py). Returns `{ bin, version }` or `null`. The MS-Store stub fails the
|
|
89
|
+
* `run().ok` test and is skipped — the whole reason this is not `command -v`.
|
|
90
|
+
* @param {(cmd: string, args?: string[]) => ReturnType<typeof defaultRun>} run
|
|
91
|
+
*/
|
|
92
|
+
export function resolvePython(run) {
|
|
93
|
+
for (const bin of ["python3", "python", "py"]) {
|
|
94
|
+
const r = run(bin, ["--version"]);
|
|
95
|
+
if (r.ok) return { bin, version: extractVersion(r.stdout + r.stderr) };
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Run the full preflight. Pure over its injected seams (`run`, `nodeVersion`,
|
|
102
|
+
* `platform`) so every branch is unit-testable without a real toolchain.
|
|
103
|
+
*
|
|
104
|
+
* @param {{
|
|
105
|
+
* run?: (cmd: string, args?: string[]) => ReturnType<typeof defaultRun>,
|
|
106
|
+
* nodeVersion?: string,
|
|
107
|
+
* platform?: NodeJS.Platform,
|
|
108
|
+
* }} [deps]
|
|
109
|
+
*/
|
|
110
|
+
export function runPreflight(deps = {}) {
|
|
111
|
+
const { run = defaultRun, nodeVersion = process.version, platform = process.platform } = deps;
|
|
112
|
+
/** @type {{name:string, ok:boolean, detail:string, hint?:string, hard:boolean, optional?:boolean}[]} */
|
|
113
|
+
const checks = [];
|
|
114
|
+
|
|
115
|
+
// claude — its own gate: absent → skip plugins + loud warning + non-zero exit.
|
|
116
|
+
const claude = run("claude", ["--version"]);
|
|
117
|
+
checks.push({
|
|
118
|
+
name: "claude",
|
|
119
|
+
ok: claude.ok,
|
|
120
|
+
detail: claude.ok ? extractVersion(claude.stdout + claude.stderr) : "not found",
|
|
121
|
+
hint: claude.ok ? undefined : installHint("claude", platform),
|
|
122
|
+
hard: true,
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// uv — hard requirement for every plugin hook.
|
|
126
|
+
const uv = run("uv", ["--version"]);
|
|
127
|
+
checks.push({
|
|
128
|
+
name: "uv",
|
|
129
|
+
ok: uv.ok,
|
|
130
|
+
detail: uv.ok ? extractVersion(uv.stdout + uv.stderr) : "not found",
|
|
131
|
+
hint: uv.ok ? undefined : installHint("uv", platform),
|
|
132
|
+
hard: true,
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// python — TEST-RUN probe (Store-stub trap), require >= 3.11.
|
|
136
|
+
const py = resolvePython(run);
|
|
137
|
+
const pyOk = py != null && compareSemver(py.version, "3.11.0") >= 0;
|
|
138
|
+
checks.push({
|
|
139
|
+
name: "python",
|
|
140
|
+
ok: pyOk,
|
|
141
|
+
detail: py ? `${py.version} (${py.bin})` : "not found (tried python3, python, py)",
|
|
142
|
+
hint: pyOk ? undefined : installHint("python", platform),
|
|
143
|
+
hard: true,
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// node — assert the packaged server's minimum.
|
|
147
|
+
const nodeOk = compareSemver(nodeVersion, MIN_NODE) >= 0;
|
|
148
|
+
checks.push({
|
|
149
|
+
name: "node",
|
|
150
|
+
ok: nodeOk,
|
|
151
|
+
detail: nodeOk ? nodeVersion : `${nodeVersion} (need >= ${MIN_NODE})`,
|
|
152
|
+
hint: nodeOk ? undefined : installHint("node", platform),
|
|
153
|
+
hard: true,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// git — needed by the SDLC plugins.
|
|
157
|
+
const git = run("git", ["--version"]);
|
|
158
|
+
checks.push({
|
|
159
|
+
name: "git",
|
|
160
|
+
ok: git.ok,
|
|
161
|
+
detail: git.ok ? extractVersion(git.stdout + git.stderr) : "not found",
|
|
162
|
+
hint: git.ok ? undefined : installHint("git", platform),
|
|
163
|
+
hard: true,
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// gh — optional (PRs). A soft note, never a failure.
|
|
167
|
+
const gh = run("gh", ["--version"]);
|
|
168
|
+
checks.push({
|
|
169
|
+
name: "gh",
|
|
170
|
+
ok: gh.ok,
|
|
171
|
+
detail: gh.ok ? extractVersion(gh.stdout + gh.stderr) : "not found (optional — needed for PRs)",
|
|
172
|
+
hard: false,
|
|
173
|
+
optional: true,
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
const hardFailures = checks.filter((c) => c.hard && !c.ok);
|
|
177
|
+
// The plugin phase needs claude + uv + python (hook runtime) AND git —
|
|
178
|
+
// `claude plugin marketplace add` clones the marketplace over git, and the
|
|
179
|
+
// SDLC plugins are git-based. Node is NOT gated here: it gates the SERVER
|
|
180
|
+
// (and npx already blocks a too-old engine), not the plugin install.
|
|
181
|
+
const pluginPhaseOk = claude.ok && uv.ok && pyOk && git.ok;
|
|
182
|
+
|
|
183
|
+
return {
|
|
184
|
+
checks,
|
|
185
|
+
python: py,
|
|
186
|
+
hasClaude: claude.ok,
|
|
187
|
+
hasUv: uv.ok,
|
|
188
|
+
hasPython: pyOk,
|
|
189
|
+
hasNode: nodeOk,
|
|
190
|
+
hasGit: git.ok,
|
|
191
|
+
/** Plugins can only be installed when claude + uv + python are all real. */
|
|
192
|
+
pluginPhaseOk,
|
|
193
|
+
/** Non-zero exit when any hard prerequisite is missing (AC1a). */
|
|
194
|
+
exitCode: hardFailures.length,
|
|
195
|
+
isWindows: isWindows(platform),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** Render the one honest verdict block a `doctor`-style tool prints. */
|
|
200
|
+
export function renderVerdict(result, mark) {
|
|
201
|
+
const lines = ["Prerequisites:"];
|
|
202
|
+
for (const c of result.checks) {
|
|
203
|
+
const glyph = c.ok ? mark.pass : c.optional ? mark.skip : mark.fail;
|
|
204
|
+
lines.push(` ${glyph} ${c.name}: ${c.detail}`);
|
|
205
|
+
if (!c.ok && c.hint) lines.push(` -> ${c.hint}`);
|
|
206
|
+
}
|
|
207
|
+
return lines.join("\n");
|
|
208
|
+
}
|
package/lib/probes.mjs
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* probes.mjs — low-level, self-contained runtime probes used by server.mjs.
|
|
3
|
+
*
|
|
4
|
+
* Kept apart from the boot/attach/swap orchestration so each stays focused and
|
|
5
|
+
* under the 300-line ceiling: this file owns "is the port occupied?" and "can
|
|
6
|
+
* the native terminal load?", server.mjs owns what to DO about the answers.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import net from "node:net";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* TCP-connect to 127.0.0.1:port. `connected` → the port is OCCUPIED (by
|
|
13
|
+
* anything); ECONNREFUSED → FREE. A connect timeout is treated as free (a
|
|
14
|
+
* filtered localhost port does not occur in practice; erring toward free avoids
|
|
15
|
+
* a false-foreign that would block boot on a genuinely open port).
|
|
16
|
+
* @returns {Promise<boolean>} occupied
|
|
17
|
+
*/
|
|
18
|
+
export function tcpOccupied(port, { host = "127.0.0.1", timeoutMs = 1500 } = {}) {
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
const sock = net.connect({ port, host });
|
|
21
|
+
let settled = false;
|
|
22
|
+
const done = (occupied) => {
|
|
23
|
+
if (settled) return;
|
|
24
|
+
settled = true;
|
|
25
|
+
sock.destroy();
|
|
26
|
+
resolve(occupied);
|
|
27
|
+
};
|
|
28
|
+
sock.setTimeout(timeoutMs);
|
|
29
|
+
sock.once("connect", () => done(true));
|
|
30
|
+
sock.once("timeout", () => done(false));
|
|
31
|
+
sock.once("error", () => done(false)); // ECONNREFUSED = nothing listening
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Verify @lydell/node-pty's NATIVE binary actually loads. It is the only native
|
|
37
|
+
* piece of the packaged server; if it fails to resolve a binding, the Command
|
|
38
|
+
* Center boots with a terminal that cannot spawn — a silent half-death. Probe
|
|
39
|
+
* it (in the bootstrapper process, a same-platform proxy for the server) and
|
|
40
|
+
* fail LOUD before booting, never after (spec §1).
|
|
41
|
+
* @param {(m: string) => Promise<any>} [importFn]
|
|
42
|
+
* @returns {Promise<{ ok: boolean, error: string | null }>}
|
|
43
|
+
*/
|
|
44
|
+
export async function checkNativePty(importFn = (m) => import(m)) {
|
|
45
|
+
try {
|
|
46
|
+
const mod = await importFn("@lydell/node-pty");
|
|
47
|
+
const spawnFn = mod?.spawn ?? mod?.default?.spawn;
|
|
48
|
+
if (typeof spawnFn !== "function") return { ok: false, error: "loaded but exposes no spawn()" };
|
|
49
|
+
return { ok: true, error: null };
|
|
50
|
+
} catch (e) {
|
|
51
|
+
return { ok: false, error: String(e?.message ?? e) };
|
|
52
|
+
}
|
|
53
|
+
}
|
package/lib/server.mjs
ADDED
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* server.mjs — AC1c + AC4: port-check, then boot / attach / swap. Open browser.
|
|
3
|
+
*
|
|
4
|
+
* Probe :3847 on 127.0.0.1 (IPv4 — Node resolves `localhost` → ::1 but Hono
|
|
5
|
+
* binds v4; a known trap in this repo). Then:
|
|
6
|
+
* free → boot the packaged server (detached, outlives npx)
|
|
7
|
+
* Shipwright, same-or-newer → ATTACH (open browser, no 2nd server)
|
|
8
|
+
* Shipwright, OLDER → SWAP via the DETACHED deploy-swap.mjs
|
|
9
|
+
* foreign → FAIL LOUD with a PORT= remediation, incumbent ALIVE
|
|
10
|
+
*
|
|
11
|
+
* This module issues NO kill/taskkill/process.kill — ever. The incumbent on
|
|
12
|
+
* :3847 may be hosting the very terminal this command runs in (PR #249, the
|
|
13
|
+
* deploy self-kill). The swap's kill lives ONLY inside the detached swapper,
|
|
14
|
+
* which is spawned BEFORE any kill so it outlives the caller's death cascade.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
import { spawn } from "node:child_process";
|
|
19
|
+
import { readFileSync } from "node:fs";
|
|
20
|
+
import os from "node:os";
|
|
21
|
+
|
|
22
|
+
import { compareSemver } from "./util.mjs";
|
|
23
|
+
import { tcpOccupied, checkNativePty } from "./probes.mjs";
|
|
24
|
+
import { win32CmdWrap } from "./win32-spawn.mjs";
|
|
25
|
+
|
|
26
|
+
// Re-exported so callers/tests keep a single `server.mjs` surface.
|
|
27
|
+
export { tcpOccupied, checkNativePty } from "./probes.mjs";
|
|
28
|
+
|
|
29
|
+
const DEFAULT_PORT = 3847;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The Command Center's wire-protocol identity — MUST match `APP_NAME` in the
|
|
33
|
+
* server's diagnostics route. A foreign process that happens to answer
|
|
34
|
+
* `/api/diagnostics` with an `app.version` but NOT this exact name is treated
|
|
35
|
+
* as FOREIGN (left alive, never killed), so a version alone can never
|
|
36
|
+
* misidentify a stranger's server as ours.
|
|
37
|
+
*/
|
|
38
|
+
export const APP_IDENTITY = "shipwright-command-center";
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Classify a port. TCP occupancy is decided FIRST, independent of HTTP: a
|
|
42
|
+
* process that accepts connections but never answers /api/diagnostics (or is
|
|
43
|
+
* not HTTP at all) is FOREIGN, not free — booting a second server onto it is
|
|
44
|
+
* exactly the bug AC4 forbids. Only a Shipwright server (200 +
|
|
45
|
+
* `app.name === APP_IDENTITY` + `app.version`) counts as ours. Offline-safe.
|
|
46
|
+
* @param {number} port
|
|
47
|
+
* @param {{ fetchImpl?: typeof fetch, timeoutMs?: number, tcpProbe?: typeof tcpOccupied }} [deps]
|
|
48
|
+
* @returns {Promise<{ reachable: boolean, shipwright: boolean, version: string | null }>}
|
|
49
|
+
*/
|
|
50
|
+
export async function probeServer(port, deps = {}) {
|
|
51
|
+
const {
|
|
52
|
+
fetchImpl = typeof fetch === "function" ? fetch : undefined,
|
|
53
|
+
timeoutMs = 2000,
|
|
54
|
+
tcpProbe = tcpOccupied,
|
|
55
|
+
} = deps;
|
|
56
|
+
|
|
57
|
+
const occupied = await tcpProbe(port, { timeoutMs: Math.min(timeoutMs, 1500) });
|
|
58
|
+
if (!occupied) return { reachable: false, shipwright: false, version: null };
|
|
59
|
+
if (!fetchImpl) return { reachable: true, shipwright: false, version: null };
|
|
60
|
+
|
|
61
|
+
const ctrl = new AbortController();
|
|
62
|
+
const timer = setTimeout(() => ctrl.abort(), timeoutMs);
|
|
63
|
+
try {
|
|
64
|
+
const res = await fetchImpl(`http://127.0.0.1:${port}/api/diagnostics`, { signal: ctrl.signal });
|
|
65
|
+
if (!res || !res.ok) return { reachable: true, shipwright: false, version: null };
|
|
66
|
+
const body = await res.json();
|
|
67
|
+
const app = body && typeof body.app === "object" ? body.app : null;
|
|
68
|
+
const isOurs = app != null && app.name === APP_IDENTITY && typeof app.version === "string";
|
|
69
|
+
return { reachable: true, shipwright: isOurs, version: isOurs ? app.version : null };
|
|
70
|
+
} catch {
|
|
71
|
+
// Occupied but not identifiable over HTTP → foreign (reachable, not ours).
|
|
72
|
+
return { reachable: true, shipwright: false, version: null };
|
|
73
|
+
} finally {
|
|
74
|
+
clearTimeout(timer);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Decide the action from a probe result. Pure — the heart of AC1c/AC4.
|
|
80
|
+
* @param {{ reachable: boolean, shipwright: boolean, version: string | null }} probe
|
|
81
|
+
* @param {string} packageVersion
|
|
82
|
+
* @returns {"boot"|"attach"|"swap"|"foreign"}
|
|
83
|
+
*/
|
|
84
|
+
export function decideAction(probe, packageVersion) {
|
|
85
|
+
if (!probe.reachable) return "boot";
|
|
86
|
+
if (!probe.shipwright) return "foreign";
|
|
87
|
+
// Older running server → swap (a naive attach serves the OLD UI: silent
|
|
88
|
+
// no-op update). Same or newer → attach (never needlessly restart or downgrade).
|
|
89
|
+
return compareSemver(probe.version ?? "", packageVersion) < 0 ? "swap" : "attach";
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Poll the probe until `predicate(probe)` holds or the deadline passes.
|
|
96
|
+
* @returns {Promise<{ ok: boolean, probe: Awaited<ReturnType<typeof probeServer>> }>}
|
|
97
|
+
*/
|
|
98
|
+
export async function pollUntil(probeFn, predicate, { timeoutMs = 15000, intervalMs = 500 } = {}) {
|
|
99
|
+
const deadline = Date.now() + timeoutMs;
|
|
100
|
+
let last = { reachable: false, shipwright: false, version: null };
|
|
101
|
+
while (Date.now() < deadline) {
|
|
102
|
+
last = await probeFn();
|
|
103
|
+
if (predicate(last)) return { ok: true, probe: last };
|
|
104
|
+
await sleep(intervalMs);
|
|
105
|
+
}
|
|
106
|
+
return { ok: false, probe: last };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Pure spawn PLAN for booting the packaged server. Detached so it outlives the
|
|
111
|
+
* short-lived npx process; env points the resolver at the packaged static +
|
|
112
|
+
* profiles dirs. Exported so the detached property is unit-testable without a
|
|
113
|
+
* real spawn.
|
|
114
|
+
*/
|
|
115
|
+
export function bootSpawnPlan(port, pkgRoot) {
|
|
116
|
+
return {
|
|
117
|
+
command: process.execPath,
|
|
118
|
+
args: [path.join(pkgRoot, "server", "dist", "index.js")],
|
|
119
|
+
options: {
|
|
120
|
+
env: {
|
|
121
|
+
...process.env,
|
|
122
|
+
PORT: String(port),
|
|
123
|
+
SHIPWRIGHT_STATIC_DIR: path.join(pkgRoot, "client", "dist"),
|
|
124
|
+
SHIPWRIGHT_PROFILES_DIR: path.join(pkgRoot, "server", "profiles"),
|
|
125
|
+
},
|
|
126
|
+
detached: true,
|
|
127
|
+
stdio: "ignore",
|
|
128
|
+
shell: false,
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Pure spawn PLAN for the DETACHED swapper. It — not the bootstrapper — owns
|
|
135
|
+
* the kill, and it is spawned detached BEFORE any kill so an invocation from
|
|
136
|
+
* inside the Command Center's own terminal survives the death cascade (AC1c).
|
|
137
|
+
*/
|
|
138
|
+
export function swapperSpawnPlan(port, pkgRoot) {
|
|
139
|
+
return {
|
|
140
|
+
command: process.execPath,
|
|
141
|
+
args: [path.join(pkgRoot, "scripts", "deploy-swap.mjs"), "--port", String(port)],
|
|
142
|
+
options: { detached: true, stdio: "ignore", shell: false },
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function runPlan(plan) {
|
|
147
|
+
const child = spawn(plan.command, plan.args, plan.options);
|
|
148
|
+
child.unref();
|
|
149
|
+
return child.pid ?? null;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const defaultBootServer = (port, pkgRoot) => runPlan(bootSpawnPlan(port, pkgRoot));
|
|
153
|
+
const defaultSpawnSwapper = (port, pkgRoot) => runPlan(swapperSpawnPlan(port, pkgRoot));
|
|
154
|
+
|
|
155
|
+
/** Default: read the swapper's durable verdict (pid + ok) if present. */
|
|
156
|
+
function defaultReadDeployStatus() {
|
|
157
|
+
try {
|
|
158
|
+
const p = path.join(os.homedir(), ".shipwright-webui", "deploy-status.json");
|
|
159
|
+
return JSON.parse(readFileSync(p, "utf-8"));
|
|
160
|
+
} catch {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Pure spawn PLAN for opening the browser. Exported so the shell-free property
|
|
167
|
+
* is unit-testable on every platform without a real spawn.
|
|
168
|
+
*
|
|
169
|
+
* Windows needs cmd.exe because `start` is a cmd BUILTIN, not an executable —
|
|
170
|
+
* but it gets it EXPLICITLY (the resolved ComSpec, discrete argv, `shell: false`)
|
|
171
|
+
* rather than by asking Node to build a shell command line for us. Nothing here
|
|
172
|
+
* needs PATHEXT resolution, so this is the one of the four remediated sites that
|
|
173
|
+
* reaches for `win32ComSpec` directly instead of `resolveSpawn`.
|
|
174
|
+
*/
|
|
175
|
+
export function openBrowserPlan(url, platform = process.platform, env = process.env) {
|
|
176
|
+
if (platform === "win32") {
|
|
177
|
+
// Built through the SAME wrap as every other cmd.exe invocation rather than
|
|
178
|
+
// splicing the url into discrete argv. That is not decoration: a url with a
|
|
179
|
+
// query string (`http://h/?a=1&b=2`) would otherwise reach cmd.exe with a
|
|
180
|
+
// bare `&` and run `b=2` as a second command. Today's only caller passes
|
|
181
|
+
// `http://localhost:<validated port>`, but this is exported public API in a
|
|
182
|
+
// published package, so it must not depend on that.
|
|
183
|
+
// The empty string is `start`'s window-TITLE argument; without it `start`
|
|
184
|
+
// consumes a quoted URL as the title and opens nothing.
|
|
185
|
+
//
|
|
186
|
+
// A literal `"` is the ONE character quoting cannot contain — it would close
|
|
187
|
+
// the quoted region early and let the rest be read as a command — so it is
|
|
188
|
+
// percent-encoded here rather than trusted. `"` is never valid unescaped in a
|
|
189
|
+
// URL, so this cannot corrupt a legitimate one. Residual, stated rather than
|
|
190
|
+
// implied: `%VAR%` still expands inside double quotes, so a url carrying a
|
|
191
|
+
// real environment-variable reference would be substituted. Today's only
|
|
192
|
+
// caller passes `http://localhost:<validated port>`.
|
|
193
|
+
return win32CmdWrap("start", ["", url.replace(/"/g, "%22")], env);
|
|
194
|
+
}
|
|
195
|
+
return { command: platform === "darwin" ? "open" : "xdg-open", args: [url] };
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Default: open the browser per platform. Never fatal.
|
|
200
|
+
*
|
|
201
|
+
* Exported ONLY so the never-fatal contract is testable — without a way to call
|
|
202
|
+
* it, the async-error guard below could not be falsified, and a guard that
|
|
203
|
+
* cannot be falsified is decoration.
|
|
204
|
+
*/
|
|
205
|
+
export function defaultOpenBrowser(url) {
|
|
206
|
+
const plan = openBrowserPlan(url);
|
|
207
|
+
try {
|
|
208
|
+
const child = spawn(plan.command, plan.args, { detached: true, stdio: "ignore", shell: false });
|
|
209
|
+
// `spawn` reports a launch failure ASYNCHRONOUSLY via the "error" event, so
|
|
210
|
+
// the try/catch above cannot see it — and an unhandled "error" on an
|
|
211
|
+
// EventEmitter throws, which would take the bootstrapper down and break the
|
|
212
|
+
// "Never fatal" contract one line above. A bad ComSpec or a missing
|
|
213
|
+
// xdg-open is exactly that case.
|
|
214
|
+
child.on("error", () => {
|
|
215
|
+
/* headless / no opener — the URL is printed by the caller regardless */
|
|
216
|
+
});
|
|
217
|
+
child.unref();
|
|
218
|
+
} catch {
|
|
219
|
+
/* synchronous spawn failure — same non-fatal outcome */
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Orchestrate boot / attach / swap + browser open. Pure over its seams.
|
|
225
|
+
* @param {{
|
|
226
|
+
* port?: number, pkgRoot: string, packageVersion: string, noOpen?: boolean,
|
|
227
|
+
* probeFn?: () => Promise<Awaited<ReturnType<typeof probeServer>>>,
|
|
228
|
+
* bootServer?: (port:number, pkgRoot:string) => number | null,
|
|
229
|
+
* spawnSwapper?: (port:number, pkgRoot:string) => number | null,
|
|
230
|
+
* readDeployStatus?: () => any,
|
|
231
|
+
* openBrowser?: (url:string) => void,
|
|
232
|
+
* log?: (msg:string) => void,
|
|
233
|
+
* timeoutMs?: number,
|
|
234
|
+
* }} opts
|
|
235
|
+
*/
|
|
236
|
+
export async function ensureServer(opts) {
|
|
237
|
+
const port = opts.port ?? DEFAULT_PORT;
|
|
238
|
+
const url = `http://localhost:${port}`;
|
|
239
|
+
const log = opts.log ?? (() => {});
|
|
240
|
+
const probeFn = opts.probeFn ?? (() => probeServer(port));
|
|
241
|
+
const bootServer = opts.bootServer ?? defaultBootServer;
|
|
242
|
+
const spawnSwapper = opts.spawnSwapper ?? defaultSpawnSwapper;
|
|
243
|
+
const readDeployStatus = opts.readDeployStatus ?? defaultReadDeployStatus;
|
|
244
|
+
const openBrowser = opts.openBrowser ?? defaultOpenBrowser;
|
|
245
|
+
const nativePtyCheck = opts.nativePtyCheck ?? checkNativePty;
|
|
246
|
+
const timeoutMs = opts.timeoutMs ?? 15000;
|
|
247
|
+
|
|
248
|
+
const probe = await probeFn();
|
|
249
|
+
const action = decideAction(probe, opts.packageVersion);
|
|
250
|
+
let result = { action, url, port, version: probe.version };
|
|
251
|
+
|
|
252
|
+
if (action === "foreign") {
|
|
253
|
+
throw new Error(
|
|
254
|
+
`port ${port} is held by a NON-Shipwright process — it was left running and NOT killed. ` +
|
|
255
|
+
`Free the port or pick another: re-run with PORT=<n> npx @svenroth-ai/shipwright@latest`,
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Starting a new server (boot OR swap) requires a working native terminal —
|
|
260
|
+
// never start one that cannot spawn (spec §1). Attach skips this: the
|
|
261
|
+
// incumbent already proved itself.
|
|
262
|
+
if (action === "boot" || action === "swap") {
|
|
263
|
+
const pty = await nativePtyCheck();
|
|
264
|
+
if (!pty.ok) {
|
|
265
|
+
throw new Error(
|
|
266
|
+
`the embedded terminal's native module (@lydell/node-pty) failed to load: ${pty.error}. ` +
|
|
267
|
+
`Ensure Node >= 20.12 and your platform's build tools are present, then re-run. ` +
|
|
268
|
+
`A Command Center whose terminal cannot spawn was NOT started.`,
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (action === "attach") {
|
|
274
|
+
log(`Shipwright ${probe.version} already running on ${url} — attaching (no second server).`);
|
|
275
|
+
} else if (action === "boot") {
|
|
276
|
+
log(`Port ${port} free — starting the Command Center.`);
|
|
277
|
+
const pid = bootServer(port, opts.pkgRoot);
|
|
278
|
+
const ready = await pollUntil(probeFn, (p) => p.shipwright, { timeoutMs });
|
|
279
|
+
if (!ready.ok) {
|
|
280
|
+
throw new Error(
|
|
281
|
+
`the packaged server did not become ready on ${url} within ${timeoutMs} ms — ` +
|
|
282
|
+
`check ~/.shipwright-webui/server-manual.log`,
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
result = { ...result, pid, version: ready.probe.version };
|
|
286
|
+
} else if (action === "swap") {
|
|
287
|
+
log(`Older server (${probe.version}) on ${url} — swapping to ${opts.packageVersion} via the detached swapper.`);
|
|
288
|
+
const swapperPid = spawnSwapper(port, opts.pkgRoot);
|
|
289
|
+
// Readiness = the port now serves EXACTLY the package version (AC1c: "the
|
|
290
|
+
// version the server reports afterwards equals the package's"). `>=` would
|
|
291
|
+
// let an unexpected newer instance winning the race masquerade as our swap.
|
|
292
|
+
const ready = await pollUntil(
|
|
293
|
+
probeFn,
|
|
294
|
+
(p) => p.shipwright && compareSemver(p.version ?? "", opts.packageVersion) === 0,
|
|
295
|
+
{ timeoutMs: Math.max(timeoutMs, 20000) },
|
|
296
|
+
);
|
|
297
|
+
const status = readDeployStatus();
|
|
298
|
+
if (!ready.ok) {
|
|
299
|
+
throw new Error(
|
|
300
|
+
`the swap did not reach ${opts.packageVersion} on ${url} in time — ` +
|
|
301
|
+
`see ~/.shipwright-webui/deploy-swap.log${status?.error ? ` (${status.error})` : ""}`,
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
result = {
|
|
305
|
+
...result,
|
|
306
|
+
swapperPid,
|
|
307
|
+
newPid: status && typeof status.pid === "number" ? status.pid : null,
|
|
308
|
+
previousVersion: probe.version,
|
|
309
|
+
version: ready.probe.version,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (!opts.noOpen) openBrowser(url);
|
|
314
|
+
return result;
|
|
315
|
+
}
|
package/lib/util.mjs
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* util.mjs — pure, dependency-free helpers shared across the bootstrapper.
|
|
3
|
+
*
|
|
4
|
+
* Everything here is side-effect free and unit-testable in isolation: SemVer
|
|
5
|
+
* parsing/compare (attach-vs-swap + stale-copy decisions ride on it), platform
|
|
6
|
+
* detection, and the actionable install hints a missing prerequisite must
|
|
7
|
+
* print. No `claude`, no network, no filesystem — those live in the sibling
|
|
8
|
+
* modules behind injected seams.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** @param {string} v @returns {[number, number, number] | null} */
|
|
12
|
+
export function parseSemver(v) {
|
|
13
|
+
if (typeof v !== "string") return null;
|
|
14
|
+
const m = /^\s*v?(\d+)\.(\d+)\.(\d+)/.exec(v.trim());
|
|
15
|
+
if (!m) return null;
|
|
16
|
+
return [Number(m[1]), Number(m[2]), Number(m[3])];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Compare two SemVer-shaped strings by MAJOR.MINOR.PATCH.
|
|
21
|
+
* Returns -1 (a<b), 0 (equal or either unparseable), 1 (a>b). Pre-release
|
|
22
|
+
* tails are ignored — the bootstrapper only ever needs the numeric triple.
|
|
23
|
+
* @param {string} a @param {string} b @returns {-1 | 0 | 1}
|
|
24
|
+
*/
|
|
25
|
+
export function compareSemver(a, b) {
|
|
26
|
+
const pa = parseSemver(a);
|
|
27
|
+
const pb = parseSemver(b);
|
|
28
|
+
if (!pa || !pb) return 0;
|
|
29
|
+
for (let i = 0; i < 3; i++) {
|
|
30
|
+
if (pa[i] < pb[i]) return -1;
|
|
31
|
+
if (pa[i] > pb[i]) return 1;
|
|
32
|
+
}
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** @param {NodeJS.Platform} [platform] */
|
|
37
|
+
export function isWindows(platform = process.platform) {
|
|
38
|
+
return platform === "win32";
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Platform-correct, copy-pasteable install command for a missing prerequisite.
|
|
43
|
+
* A missing tool must never be a vague "install it" — the user gets the exact
|
|
44
|
+
* line for THEIR OS. Mirrors the pointers `scripts/verify-setup.sh` prints.
|
|
45
|
+
* @param {"uv"|"python"|"node"|"git"|"claude"} tool
|
|
46
|
+
* @param {NodeJS.Platform} [platform]
|
|
47
|
+
* @returns {string}
|
|
48
|
+
*/
|
|
49
|
+
export function installHint(tool, platform = process.platform) {
|
|
50
|
+
const win = isWindows(platform);
|
|
51
|
+
switch (tool) {
|
|
52
|
+
case "uv":
|
|
53
|
+
return win
|
|
54
|
+
? 'powershell -c "irm https://astral.sh/uv/install.ps1 | iex"'
|
|
55
|
+
: "curl -LsSf https://astral.sh/uv/install.sh | sh";
|
|
56
|
+
case "python":
|
|
57
|
+
return win
|
|
58
|
+
? "install Python 3.11+ from https://www.python.org/downloads/ (NOT the Microsoft Store stub)"
|
|
59
|
+
: "install Python 3.11+ (e.g. `brew install python` / `apt install python3`)";
|
|
60
|
+
case "node":
|
|
61
|
+
return "install Node.js >= 20.12.0 from https://nodejs.org/";
|
|
62
|
+
case "git":
|
|
63
|
+
return win
|
|
64
|
+
? "install Git from https://git-scm.com/download/win"
|
|
65
|
+
: "install git (e.g. `brew install git` / `apt install git`)";
|
|
66
|
+
case "claude":
|
|
67
|
+
return "install Claude Code — https://docs.claude.com/en/docs/claude-code";
|
|
68
|
+
default:
|
|
69
|
+
return "";
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Minimum Node the packaged server needs (mirrors server/package.json engines). */
|
|
74
|
+
export const MIN_NODE = "20.12.0";
|
|
75
|
+
|
|
76
|
+
/** ASCII status glyphs — no emoji, PowerShell-5.1-safe, honest verdict blocks. */
|
|
77
|
+
export const MARK = Object.freeze({
|
|
78
|
+
pass: "[OK]",
|
|
79
|
+
fail: "[!!]",
|
|
80
|
+
warn: "[??]",
|
|
81
|
+
skip: "[--]",
|
|
82
|
+
info: "[..]",
|
|
83
|
+
});
|