@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,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* version-check.mjs — AC6, the npx-cache "stale copy" self-check.
|
|
3
|
+
*
|
|
4
|
+
* A plain `npx <pkg>` can silently reuse a CACHED OLD version and the user
|
|
5
|
+
* never knows they ran yesterday's build. Two mitigations (both required, the
|
|
6
|
+
* second lives here): every printed command says `@latest`, AND on start we
|
|
7
|
+
* ask the registry what `latest` is and warn when we are behind.
|
|
8
|
+
*
|
|
9
|
+
* Hard rule: this is a courtesy, never a gate. Offline, a slow registry, a
|
|
10
|
+
* 500, a garbled body — all degrade to "no banner, keep going". A machine with
|
|
11
|
+
* no internet must still be able to boot the Command Center against its cache.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { compareSemver } from "./util.mjs";
|
|
15
|
+
|
|
16
|
+
const REGISTRY_URL = "https://registry.npmjs.org/@svenroth-ai/shipwright/latest";
|
|
17
|
+
const DEFAULT_TIMEOUT_MS = 2000;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Fetch the registry's `latest` version. Never throws — resolves to `null` on
|
|
21
|
+
* any failure (offline, timeout, non-200, non-JSON, missing field).
|
|
22
|
+
* @param {{ fetchImpl?: typeof fetch, url?: string, timeoutMs?: number }} [deps]
|
|
23
|
+
* @returns {Promise<string | null>}
|
|
24
|
+
*/
|
|
25
|
+
export async function fetchLatestVersion(deps = {}) {
|
|
26
|
+
const {
|
|
27
|
+
fetchImpl = typeof fetch === "function" ? fetch : undefined,
|
|
28
|
+
url = REGISTRY_URL,
|
|
29
|
+
timeoutMs = DEFAULT_TIMEOUT_MS,
|
|
30
|
+
} = deps;
|
|
31
|
+
if (!fetchImpl) return null;
|
|
32
|
+
const ctrl = new AbortController();
|
|
33
|
+
const timer = setTimeout(() => ctrl.abort(), timeoutMs);
|
|
34
|
+
try {
|
|
35
|
+
const res = await fetchImpl(url, { signal: ctrl.signal });
|
|
36
|
+
if (!res || !res.ok) return null;
|
|
37
|
+
const body = await res.json();
|
|
38
|
+
const v = body && typeof body.version === "string" ? body.version : null;
|
|
39
|
+
return v && /^\d+\.\d+\.\d+/.test(v) ? v : null;
|
|
40
|
+
} catch {
|
|
41
|
+
return null;
|
|
42
|
+
} finally {
|
|
43
|
+
clearTimeout(timer);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Decide whether a stale-copy banner should show.
|
|
49
|
+
* @param {string} selfVersion this package's own version
|
|
50
|
+
* @param {string | null} latest the registry's `latest` (null = unknown)
|
|
51
|
+
* @returns {{ stale: boolean, selfVersion: string, latest: string | null }}
|
|
52
|
+
*/
|
|
53
|
+
export function evaluateStaleness(selfVersion, latest) {
|
|
54
|
+
const stale = latest != null && compareSemver(selfVersion, latest) < 0;
|
|
55
|
+
return { stale, selfVersion, latest };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Full self-check: fetch latest, compare, return a verdict. Offline-safe.
|
|
60
|
+
* @param {string} selfVersion
|
|
61
|
+
* @param {{ fetchImpl?: typeof fetch, url?: string, timeoutMs?: number }} [deps]
|
|
62
|
+
*/
|
|
63
|
+
export async function checkForStaleCopy(selfVersion, deps = {}) {
|
|
64
|
+
const latest = await fetchLatestVersion(deps);
|
|
65
|
+
return evaluateStaleness(selfVersion, latest);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Human line for a stale verdict, or `null` when up to date / unknown. */
|
|
69
|
+
export function staleBanner(verdict) {
|
|
70
|
+
if (!verdict.stale) return null;
|
|
71
|
+
return (
|
|
72
|
+
`You are running a stale cached copy (${verdict.selfVersion}); ` +
|
|
73
|
+
`${verdict.latest} is available. Re-run with:\n` +
|
|
74
|
+
` npx @svenroth-ai/shipwright@latest`
|
|
75
|
+
);
|
|
76
|
+
}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* win32-spawn.mjs — resolve a command to argv that `child_process` can run with
|
|
3
|
+
* `shell: false`, including Windows `.cmd`/`.bat` shims.
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS EXISTS. On Windows the tools this package probes are shims, not
|
|
6
|
+
* executables: `claude` is often `claude.cmd`, `npm`/`npx` always are. Node's
|
|
7
|
+
* CVE-2024-27980 hardening EINVAL-blocks a direct `.cmd` spawn under
|
|
8
|
+
* `shell: false`, and `CreateProcess` only ever appends `.exe` — so a bare
|
|
9
|
+
* `claude` simply is not found. The historical workaround was `shell: true`,
|
|
10
|
+
* which buys shim resolution at the price of handing a command line to cmd.exe.
|
|
11
|
+
* This module buys the same resolution without the shell: find the real file via
|
|
12
|
+
* PATHEXT, then invoke `.cmd`/`.bat` through an explicit `cmd.exe /d /s /c`
|
|
13
|
+
* with DISCRETE argv.
|
|
14
|
+
*
|
|
15
|
+
* MIRROR — this is a deliberate copy of `server/src/core/win32-spawn.ts`
|
|
16
|
+
* (ADR-044, reviewed there; audit findings F03 + F31). It is duplicated rather
|
|
17
|
+
* than imported because `bootstrapper/` is a separately published npm package
|
|
18
|
+
* and DO-NOT #7 forbids cross-package imports.
|
|
19
|
+
*
|
|
20
|
+
* DIVERGENCES from the server original — the COMPLETE list, so a future drift
|
|
21
|
+
* reviewer diffing the two files knows what is intentional:
|
|
22
|
+
* 1. Failure SHAPE for an unresolvable BARE name. The server core returns
|
|
23
|
+
* `null` and its thin `preview-win32-spawn.ts` wrapper converts that into
|
|
24
|
+
* `PreviewProfileInvalidError`; this file returns a bare-name plan instead
|
|
25
|
+
* — see divergence 5, which is the real behaviour and SUPERSEDES what this
|
|
26
|
+
* entry used to claim. **Corrected 2026-08-01**: it read "returns `null`
|
|
27
|
+
* here", which stopped being true when the App-Execution-Alias fix landed
|
|
28
|
+
* (iterate-2026-07-31) and added the bare-name fallback. `resolveSpawn`
|
|
29
|
+
* below can no longer return `null` on any path. The callers'
|
|
30
|
+
* `if (!plan)` branches are therefore currently UNREACHABLE; they are kept
|
|
31
|
+
* deliberately as cheap contract insurance, and are annotated as such at
|
|
32
|
+
* their own sites rather than left implying a live code path.
|
|
33
|
+
* 2. Signature. Here: `resolveSpawn(argv, { platform, env })`, both injectable
|
|
34
|
+
* (the bootstrapper has no DI container, and its tests must reach the win32
|
|
35
|
+
* branch from Linux). Server: `resolveSpawn(argv, cwd)`, reading the process
|
|
36
|
+
* globals directly.
|
|
37
|
+
* 3. No `cwd` parameter. A path-like name resolves against `process.cwd()`
|
|
38
|
+
* here; the server resolves against the caller-supplied previewed-project
|
|
39
|
+
* cwd, because it is handling an UNTRUSTED repo and this is not. The
|
|
40
|
+
* security-relevant half is identical: a BARE name resolves from PATH only,
|
|
41
|
+
* never cwd, in both.
|
|
42
|
+
* 4. `win32ComSpec` is exported and env-parameterised here (server: private).
|
|
43
|
+
* 5. An unresolvable BARE name falls back to spawning the bare name itself
|
|
44
|
+
* (`{command: name}`) instead of giving up. The server refuses — its Guard 6
|
|
45
|
+
* is a FROZEN security guard and stays. Safe here, and NOT a hole, because
|
|
46
|
+
* verified on Windows 11: a bare-name spawn under `shell: false` is
|
|
47
|
+
* PATH-only — a planted `.\swplantedexe.exe` with `cwd` set to its own
|
|
48
|
+
* directory returns ENOENT, so cmd.exe's cwd-first lookup is still not in
|
|
49
|
+
* play. It is REQUIRED because `realpathSync.native` cannot follow an
|
|
50
|
+
* App-Execution-Alias reparse point at all, so PATHEXT resolution fails for
|
|
51
|
+
* a genuinely INSTALLED Microsoft-Store Python exactly as it does for the
|
|
52
|
+
* stub — and refusing would hard-fail the installer on a machine with a
|
|
53
|
+
* working Python. `CreateProcess` follows the alias fine (verified: the
|
|
54
|
+
* bare spawn reaches it and it answers).
|
|
55
|
+
*
|
|
56
|
+
* WHAT GUARDS THE PARITY. `test/win32-spawn.test.mjs` pins THIS file's contract
|
|
57
|
+
* only — it cannot observe the server original changing. The cross-file guard is
|
|
58
|
+
* `server/src/test/win32-spawn-mirror-parity.test.ts`, which reads both files and
|
|
59
|
+
* fails if a security-load-bearing invariant is present in one and not the other.
|
|
60
|
+
* It lives in the SERVER package on purpose: CI runs vitest for `client` and
|
|
61
|
+
* `server` only, so a guard placed here would not gate anything.
|
|
62
|
+
*
|
|
63
|
+
* SECURITY posture, inherited verbatim from the original:
|
|
64
|
+
* - A bare EXTENSION-LESS name resolves from PATH **only**, never the current
|
|
65
|
+
* directory, so a planted `.\npm.cmd` cannot shadow the real tool. cmd.exe's
|
|
66
|
+
* own lookup WOULD search cwd first, which is why an unresolved bare name is
|
|
67
|
+
* never delegated to `cmd /c <bare>`; it goes to CreateProcess, which is
|
|
68
|
+
* PATH-only (verified on Windows 11). NOTE the narrow wording: a bare name
|
|
69
|
+
* that already CARRIES a `.cmd`/`.bat` extension skips resolution and is
|
|
70
|
+
* wrapped as given, so `resolveSpawn(["npm.cmd"])` would reach cmd.exe's
|
|
71
|
+
* cwd-first lookup. No caller does that (all three pass extension-less names
|
|
72
|
+
* or absolute paths), and the case is pinned by a test so the gap cannot be
|
|
73
|
+
* re-opened silently.
|
|
74
|
+
* - Candidates are realpath-verified before use (same posture as
|
|
75
|
+
* `server/src/core/path-guard.ts`).
|
|
76
|
+
* - `resolveSpawn` never sets `options.shell`. cmd.exe gets discrete argv when
|
|
77
|
+
* no token needs quoting; a spaced token produces the canonical verbatim
|
|
78
|
+
* `cmd /d /s /c ""<quoted>" <args>"` line instead.
|
|
79
|
+
*
|
|
80
|
+
* PATH-FLAVOUR DISCIPLINE (iterate-2026-08-01-win32-spawn-followups). `platform`
|
|
81
|
+
* is injected, but `path` follows the REAL host — so on Linux the win32 branch
|
|
82
|
+
* used to parse `C:\…` with POSIX rules. Every `path.*` call is classified:
|
|
83
|
+
* (a) win32 command-STRING semantics -> `path.win32` (`extname` x2, the
|
|
84
|
+
* ComSpec `join`). No filesystem involved, so pinning the flavour is free
|
|
85
|
+
* on Windows and makes the injected branch faithful on Linux.
|
|
86
|
+
* (b) HOST-filesystem addressing -> the host `path` (`resolve` + `join` in
|
|
87
|
+
* `resolveViaPathExt`), because those candidates are handed to
|
|
88
|
+
* `realpathSync`/`statSync` and must name a file on the host actually
|
|
89
|
+
* running. `PATH` splits on the hardcoded win32 `;`, already
|
|
90
|
+
* host-independent. The server original carries the identical audit; the
|
|
91
|
+
* parity guard pins both halves.
|
|
92
|
+
*/
|
|
93
|
+
|
|
94
|
+
import path from "node:path";
|
|
95
|
+
import { statSync, realpathSync } from "node:fs";
|
|
96
|
+
|
|
97
|
+
const WIN32_EXECUTABLE_EXTS = new Set([".exe", ".com"]);
|
|
98
|
+
const WIN32_SHIM_EXTS = new Set([".cmd", ".bat"]);
|
|
99
|
+
|
|
100
|
+
/** Absolute path to cmd.exe, preferring the environment's own ComSpec. */
|
|
101
|
+
export function win32ComSpec(env = process.env) {
|
|
102
|
+
const fromEnv = env.ComSpec ?? env.COMSPEC;
|
|
103
|
+
if (fromEnv && fromEnv.trim()) return fromEnv;
|
|
104
|
+
const root = env.SystemRoot ?? env.windir ?? "C:\\Windows";
|
|
105
|
+
// (a) pure string — win32 flavour pinned, so an injected win32 platform on a
|
|
106
|
+
// POSIX host emits `…\System32\cmd.exe`, not the mixed `…/System32/cmd.exe`.
|
|
107
|
+
return path.win32.join(root, "System32", "cmd.exe");
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function looksPathLike(name) {
|
|
111
|
+
return name.includes("\\") || name.includes("/") || /^[a-zA-Z]:/.test(name);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Resolve `name` to a concrete on-disk file via PATHEXT, realpath-verified.
|
|
116
|
+
* Returns undefined when nothing resolves.
|
|
117
|
+
*
|
|
118
|
+
* Every fs error is swallowed and the search continues — NOT only ENOENT.
|
|
119
|
+
* Verified 2026-07-31 on Windows 11: `realpathSync.native` on the Microsoft
|
|
120
|
+
* Store App-Execution-Alias `…\WindowsApps\python3.EXE` throws **EACCES**, not
|
|
121
|
+
* ENOENT. Treating that as fatal would abandon the scan and report a machine
|
|
122
|
+
* with a perfectly good `python` as having no Python at all.
|
|
123
|
+
*/
|
|
124
|
+
function resolveViaPathExt(name, env) {
|
|
125
|
+
const exts = (env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD")
|
|
126
|
+
.split(";")
|
|
127
|
+
.map((s) => s.trim())
|
|
128
|
+
.filter(Boolean);
|
|
129
|
+
|
|
130
|
+
const firstFile = (base, withBare) => {
|
|
131
|
+
for (const ext of withBare ? ["", ...exts] : exts) {
|
|
132
|
+
try {
|
|
133
|
+
const real = realpathSync.native(base + ext);
|
|
134
|
+
if (statSync(real).isFile()) return real;
|
|
135
|
+
} catch {
|
|
136
|
+
// no usable file at this candidate (ENOENT, EACCES on a Store alias,
|
|
137
|
+
// ELOOP on a broken reparse point) — keep searching
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return undefined;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
if (looksPathLike(name)) {
|
|
144
|
+
// Explicit path — honour an exact match first, then PATHEXT.
|
|
145
|
+
// (b) HOST flavour on purpose — this candidate goes straight to realpath.
|
|
146
|
+
return firstFile(path.resolve(name), true);
|
|
147
|
+
}
|
|
148
|
+
// Bare command — PATH only, never cwd. The empty ext is excluded so an
|
|
149
|
+
// extensionless POSIX shim is not matched. `;` is the win32 PATH delimiter,
|
|
150
|
+
// hardcoded and therefore already host-independent.
|
|
151
|
+
for (const dir of (env.PATH ?? env.Path ?? "").split(";")) {
|
|
152
|
+
const trimmed = dir.trim();
|
|
153
|
+
if (!trimmed) continue;
|
|
154
|
+
// (b) HOST flavour on purpose — see the classification in the header.
|
|
155
|
+
const hit = firstFile(path.join(trimmed, name), false);
|
|
156
|
+
if (hit) return hit;
|
|
157
|
+
}
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Characters cmd.exe would otherwise INTERPRET, and which a surrounding pair of
|
|
163
|
+
* double quotes makes literal. A token carrying one of these must therefore be
|
|
164
|
+
* quoted even when it has no whitespace — otherwise a PATH directory such as
|
|
165
|
+
* `C:\tools&more\` turns `…\tools&more\claude.cmd` into two commands.
|
|
166
|
+
*
|
|
167
|
+
* DELIBERATELY NOT IN THIS SET, because quoting does not fix them:
|
|
168
|
+
* `%` — `%VAR%` expands inside double quotes too. No caller can supply one
|
|
169
|
+
* (`SAFE_ARG` in claude-cli.mjs rejects `%`, preflight's args are fixed
|
|
170
|
+
* literals), and the server original refuses `%` in its upstream fence.
|
|
171
|
+
* `"` — a token containing a quote cannot be wrapped safely by this scheme at
|
|
172
|
+
* all; the callers' charset gates are what keep one from arriving.
|
|
173
|
+
* Both limits are stated rather than papered over.
|
|
174
|
+
*/
|
|
175
|
+
const WIN32_CMD_SPECIAL = /[&|<>^]/;
|
|
176
|
+
|
|
177
|
+
function win32NeedsQuote(token) {
|
|
178
|
+
return token === "" || /\s/.test(token) || WIN32_CMD_SPECIAL.test(token);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export function win32CmdWrap(target, rest, env = process.env) {
|
|
182
|
+
const parts = [target, ...rest];
|
|
183
|
+
const command = win32ComSpec(env);
|
|
184
|
+
// No token has a space → discrete argv: cmd.exe /d /s /c runs each token
|
|
185
|
+
// literally and the caller keeps shell:false.
|
|
186
|
+
if (!parts.some(win32NeedsQuote)) {
|
|
187
|
+
return { command, args: ["/d", "/s", "/c", ...parts] };
|
|
188
|
+
}
|
|
189
|
+
// A token has a space (e.g. `C:\Program Files\nodejs\npm.cmd`). Under `cmd /s`
|
|
190
|
+
// Node's own arg-quoting is stripped, so build the canonical
|
|
191
|
+
// `cmd /d /s /c ""<quoted-shim>" <args>"` line and pass it verbatim: `/s`
|
|
192
|
+
// strips ONLY the outer quote pair, leaving the inner quotes intact.
|
|
193
|
+
const inner = parts.map((p) => (win32NeedsQuote(p) ? `"${p}"` : p)).join(" ");
|
|
194
|
+
return {
|
|
195
|
+
command,
|
|
196
|
+
args: ["/d", "/s", "/c", `"${inner}"`],
|
|
197
|
+
windowsVerbatimArguments: true,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Compute the `{command, args, windowsVerbatimArguments?}` to hand to
|
|
203
|
+
* child_process with `shell: false`. POSIX is a pass-through.
|
|
204
|
+
*
|
|
205
|
+
* - argv0 is a real `.exe`/`.com` → spawn it directly (no cmd.exe).
|
|
206
|
+
* - argv0 is a `.cmd`/`.bat` shim → run through `cmd.exe /d /s /c`.
|
|
207
|
+
* - argv0 is a bare name → resolve via PATH+PATHEXT, then as above.
|
|
208
|
+
* - nothing resolves for a bare name → the BARE name itself, for CreateProcess
|
|
209
|
+
* to resolve PATH-only (divergence 5). This function does NOT return `null`
|
|
210
|
+
* on any path; the `@returns` below said `| null` until 2026-08-01 and was
|
|
211
|
+
* stale. Callers keep their `if (!plan)` guard as contract insurance.
|
|
212
|
+
*
|
|
213
|
+
* @param {string[]} argv command followed by its arguments
|
|
214
|
+
* @param {{ platform?: string, env?: Record<string, string | undefined> }} [opts]
|
|
215
|
+
* injected for tests; defaults read the live process
|
|
216
|
+
* @returns {{ command: string, args: string[], windowsVerbatimArguments?: boolean }}
|
|
217
|
+
*/
|
|
218
|
+
export function resolveSpawn(argv, opts = {}) {
|
|
219
|
+
const platform = opts.platform ?? process.platform;
|
|
220
|
+
const env = opts.env ?? process.env;
|
|
221
|
+
if (platform !== "win32") {
|
|
222
|
+
return { command: argv[0], args: argv.slice(1) };
|
|
223
|
+
}
|
|
224
|
+
const name = argv[0];
|
|
225
|
+
const rest = argv.slice(1);
|
|
226
|
+
// (a) pure string — win32 segment rules, so a POSIX host with an injected
|
|
227
|
+
// win32 platform classifies `C:\a.b\tool` the way Windows does.
|
|
228
|
+
const ext = path.win32.extname(name).toLowerCase();
|
|
229
|
+
|
|
230
|
+
if (WIN32_EXECUTABLE_EXTS.has(ext)) {
|
|
231
|
+
return { command: name, args: rest };
|
|
232
|
+
}
|
|
233
|
+
if (!WIN32_SHIM_EXTS.has(ext)) {
|
|
234
|
+
const resolved = resolveViaPathExt(name, env);
|
|
235
|
+
if (resolved) {
|
|
236
|
+
// (a) `resolved` is a host realpath; `path.win32` reads `/` as a
|
|
237
|
+
// separator too, so this is correct on either host.
|
|
238
|
+
if (WIN32_EXECUTABLE_EXTS.has(path.win32.extname(resolved).toLowerCase())) {
|
|
239
|
+
return { command: resolved, args: rest };
|
|
240
|
+
}
|
|
241
|
+
return win32CmdWrap(resolved, rest, env);
|
|
242
|
+
}
|
|
243
|
+
// Unresolved BARE name. Never DELEGATE it to `cmd /d /s /c <bare>` — that is
|
|
244
|
+
// cmd.exe's own cwd-first lookup and a planted `.\claude.cmd` would win it.
|
|
245
|
+
// Hand it to CreateProcess directly instead: verified PATH-only (a planted
|
|
246
|
+
// `.\x.exe` is ENOENT even with cwd set to its directory), and the only way
|
|
247
|
+
// to reach an App-Execution-Alias, which realpath cannot follow — that is
|
|
248
|
+
// how a real Store-installed Python stays detectable. A truly absent tool
|
|
249
|
+
// comes back ENOENT and the callers turn that into their "not found" verdict.
|
|
250
|
+
if (!looksPathLike(name)) return { command: name, args: rest };
|
|
251
|
+
}
|
|
252
|
+
return win32CmdWrap(name, rest, env);
|
|
253
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@svenroth-ai/shipwright",
|
|
3
|
+
"version": "0.24.1-next.0",
|
|
4
|
+
"description": "One command to install AND update Shipwright — the /shipwright-* SDLC plugins and the Command Center. Run `npx @svenroth-ai/shipwright@latest`.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"shipwright": "bin/shipwright.mjs"
|
|
8
|
+
},
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=20.12.0"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"bin/",
|
|
14
|
+
"lib/",
|
|
15
|
+
"scripts/deploy-swap.mjs",
|
|
16
|
+
"scripts/deploy-procs.mjs",
|
|
17
|
+
"scripts/repair-claude-json.mjs",
|
|
18
|
+
"scripts/kill-targets.js",
|
|
19
|
+
"server/dist/",
|
|
20
|
+
"server/profiles/",
|
|
21
|
+
"server/package.json",
|
|
22
|
+
"client/dist/",
|
|
23
|
+
"LICENSE",
|
|
24
|
+
"README.md"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "node scripts/build-package.mjs",
|
|
28
|
+
"prepack": "node scripts/build-package.mjs",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"lint": "oxlint .",
|
|
31
|
+
"typecheck": "tsc --noEmit"
|
|
32
|
+
},
|
|
33
|
+
"keywords": [
|
|
34
|
+
"shipwright",
|
|
35
|
+
"claude-code",
|
|
36
|
+
"sdlc",
|
|
37
|
+
"installer",
|
|
38
|
+
"bootstrapper"
|
|
39
|
+
],
|
|
40
|
+
"author": "svenroth.ai",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "git+https://github.com/svenroth-ai/shipwright-webui.git",
|
|
45
|
+
"directory": "bootstrapper"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@hono/node-server": "^1.14.0",
|
|
49
|
+
"@hono/node-ws": "^1.3.1",
|
|
50
|
+
"@lydell/node-pty": "^1.1.0",
|
|
51
|
+
"@xterm/addon-serialize": "0.14.0",
|
|
52
|
+
"@xterm/headless": "6.0.0",
|
|
53
|
+
"hono": "^4.12.34",
|
|
54
|
+
"ignore": "^5.3.2",
|
|
55
|
+
"p-queue": "^9.2.0",
|
|
56
|
+
"proper-lockfile": "^4.1.0",
|
|
57
|
+
"shell-quote": "^1.8.4"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"oxlint": "^1.66.0",
|
|
61
|
+
"typescript": "^5.7.0",
|
|
62
|
+
"vitest": "^4.1.8"
|
|
63
|
+
},
|
|
64
|
+
"overrides": {
|
|
65
|
+
"ws": "^8.21.0"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* deploy-procs.mjs — OS process discovery + termination for the production deploy.
|
|
3
|
+
*
|
|
4
|
+
* The impure twin of kill-targets.js (which is pure parsing, unit-tested, shared
|
|
5
|
+
* with dev-restart.js). Split out of deploy-swap.mjs to keep both files inside the
|
|
6
|
+
* 300-line convention; the swapper owns the deploy CHOREOGRAPHY, this file owns
|
|
7
|
+
* "which processes, and how do we end them".
|
|
8
|
+
*
|
|
9
|
+
* The one rule that must never be broken here: KILL ONE PROCESS, NEVER ITS TREE.
|
|
10
|
+
* See killPid().
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { execSync, spawnSync } from 'node:child_process';
|
|
14
|
+
import { createRequire } from 'node:module';
|
|
15
|
+
|
|
16
|
+
const require = createRequire(import.meta.url);
|
|
17
|
+
// Audited kill-scope helpers: state-filtered, exact-port, IPv6-aware.
|
|
18
|
+
const { parseWindowsListenerPids, buildLsofCommand } = require('./kill-targets.js');
|
|
19
|
+
|
|
20
|
+
const isWin = process.platform === 'win32';
|
|
21
|
+
const CAPTURE = { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] };
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* The kill scope is EXACTLY the Hono port — never Vite. Deliberately NOT
|
|
25
|
+
* kill-targets.computeKillTargets(), which returns [PORT, VITE_PORT] for
|
|
26
|
+
* `dev:fresh` (that restarts both halves): a production deploy which swept the
|
|
27
|
+
* Vite port too would kill the operator's dev server as a side effect.
|
|
28
|
+
*
|
|
29
|
+
* @param {number} port
|
|
30
|
+
* @returns {number[]}
|
|
31
|
+
*/
|
|
32
|
+
export function killPortsFor(port) {
|
|
33
|
+
return [Number(port)];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Can we enumerate listeners at all? Windows always has netstat; POSIX needs lsof.
|
|
38
|
+
* Without it findListenerPids() returns [] for "nothing is listening" AND for "I
|
|
39
|
+
* cannot see listeners" — which would report a perfectly healthy server as a failed
|
|
40
|
+
* deploy. The pre-fix .sh had this fallback ("no lsof: settle for the process still
|
|
41
|
+
* being alive"); callers must keep it rather than lie about the outcome.
|
|
42
|
+
*/
|
|
43
|
+
export function canDiscoverListeners() {
|
|
44
|
+
if (isWin) return true;
|
|
45
|
+
try {
|
|
46
|
+
execSync('command -v lsof', { stdio: 'ignore' });
|
|
47
|
+
return true;
|
|
48
|
+
} catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** PIDs LISTENING on the port (state-filtered + exact-port on both platforms). */
|
|
54
|
+
export function findListenerPids(port) {
|
|
55
|
+
const ports = killPortsFor(port);
|
|
56
|
+
try {
|
|
57
|
+
if (isWin) {
|
|
58
|
+
// Plain `netstat -ano` (NOT `-p TCP`, which drops IPv6 listeners).
|
|
59
|
+
return parseWindowsListenerPids(execSync('netstat -ano', CAPTURE), ports);
|
|
60
|
+
}
|
|
61
|
+
const cmd = buildLsofCommand(ports);
|
|
62
|
+
if (!cmd) return [];
|
|
63
|
+
return execSync(cmd, CAPTURE).split(/\s+/).filter(Boolean);
|
|
64
|
+
} catch {
|
|
65
|
+
// netstat/lsof missing, or lsof exits 1 when nothing matches — nothing to kill.
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* PIDs of a `tsx watch` dev server on a webui server entry.
|
|
72
|
+
*
|
|
73
|
+
* Why this exists at all: killing only the port listener is not enough when the
|
|
74
|
+
* server runs under `tsx watch` — the watch PARENT would immediately respawn the
|
|
75
|
+
* child and re-take the port. The parent has to go too.
|
|
76
|
+
*
|
|
77
|
+
* KNOWN over-broad scope (inherited verbatim from the pre-fix inline sweep, kept
|
|
78
|
+
* for behavior parity): the match is `tsx` + `src/index.ts`, which also hits a
|
|
79
|
+
* *different* project's dev server, because a `tsx watch` command line carries the
|
|
80
|
+
* entry path relatively (`src/index.ts`) and not the repo it belongs to. Narrowing
|
|
81
|
+
* it needs per-PID cwd resolution — deliberately out of scope for the self-kill fix
|
|
82
|
+
* (see the iterate's decision drop).
|
|
83
|
+
*/
|
|
84
|
+
export function findTsxServerPids() {
|
|
85
|
+
try {
|
|
86
|
+
if (isWin) {
|
|
87
|
+
// spawnSync with shell:false — the argument reaches powershell.exe verbatim.
|
|
88
|
+
// An execSync string would cross JS -> cmd.exe -> powershell, three escaping
|
|
89
|
+
// layers deep, where one added quote silently turns the sweep into a no-op.
|
|
90
|
+
const script =
|
|
91
|
+
"Get-CimInstance Win32_Process -Filter \"Name='node.exe'\" | " +
|
|
92
|
+
"Where-Object { $_.CommandLine -match 'tsx' -and $_.CommandLine -match 'src[\\\\/]index\\.ts' } | " +
|
|
93
|
+
'Select-Object -ExpandProperty ProcessId';
|
|
94
|
+
const r = spawnSync('powershell', ['-NoProfile', '-Command', script], {
|
|
95
|
+
encoding: 'utf-8',
|
|
96
|
+
shell: false,
|
|
97
|
+
});
|
|
98
|
+
return String(r.stdout ?? '').split(/\r?\n/).map((s) => s.trim()).filter(Boolean);
|
|
99
|
+
}
|
|
100
|
+
return execSync("pgrep -f 'tsx.*src/index\\.ts'", CAPTURE).split(/\s+/).filter(Boolean);
|
|
101
|
+
} catch {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Kill ONE process — never its tree.
|
|
108
|
+
*
|
|
109
|
+
* LOAD-BEARING: `taskkill /F /T` (what dev-restart.js uses) kills the target's
|
|
110
|
+
* DESCENDANTS too — and when the deploy runs from an embedded terminal, the swapper
|
|
111
|
+
* *is* a descendant of the Hono server it is about to kill. A /T sweep would
|
|
112
|
+
* therefore kill the swapper itself and re-create the very outage the swapper
|
|
113
|
+
* exists to prevent. Same on POSIX: signal the PID, never the process group.
|
|
114
|
+
*/
|
|
115
|
+
export function killPid(pid) {
|
|
116
|
+
try {
|
|
117
|
+
if (isWin) {
|
|
118
|
+
execSync(`taskkill /F /PID ${Number(pid)}`, { stdio: 'ignore' });
|
|
119
|
+
} else {
|
|
120
|
+
process.kill(Number(pid), 'SIGTERM');
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
} catch {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** SIGKILL escalation for anything still alive after the grace period (POSIX only). */
|
|
129
|
+
export function killPidHard(pid) {
|
|
130
|
+
try {
|
|
131
|
+
if (!isWin) process.kill(Number(pid), 'SIGKILL');
|
|
132
|
+
} catch { /* already gone */ }
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Stop whatever serves the port and WAIT FOR EVIDENCE that it is free.
|
|
139
|
+
*
|
|
140
|
+
* The pre-fix scripts slept a flat 700 ms and started regardless. If the kill did
|
|
141
|
+
* not land (a PID the user may not touch, a wedged process), the new server walks
|
|
142
|
+
* straight into EADDRINUSE and dies — leaving the machine with NO server. A stale
|
|
143
|
+
* old server is a bad outcome; no server at all is a far worse one. So when the
|
|
144
|
+
* port refuses to free, the caller must NOT start: `freed: false` means "leave the
|
|
145
|
+
* old server alone and report it".
|
|
146
|
+
*
|
|
147
|
+
* POSIX gets a real grace period first (SIGTERM), because the server flushes
|
|
148
|
+
* terminal snapshots on shutdown (ADR-092/096) and an immediate axe truncates that;
|
|
149
|
+
* SIGKILL follows only if it is still there. Windows has no graceful signal —
|
|
150
|
+
* taskkill /F was immediate before this change too.
|
|
151
|
+
*
|
|
152
|
+
* @returns {Promise<{freed: boolean, killed: string[], survivor: string|null}>}
|
|
153
|
+
*/
|
|
154
|
+
export async function stopOldServer(port, { timeoutMs = 5000 } = {}) {
|
|
155
|
+
const killed = [...new Set([...findListenerPids(port), ...findTsxServerPids()])];
|
|
156
|
+
for (const pid of killed) killPid(pid);
|
|
157
|
+
|
|
158
|
+
// Cannot observe listeners (no lsof) — fall back to the pre-fix behavior.
|
|
159
|
+
if (!canDiscoverListeners()) {
|
|
160
|
+
await sleep(700);
|
|
161
|
+
return { freed: true, killed, survivor: null };
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const deadline = Date.now() + timeoutMs;
|
|
165
|
+
let escalated = false;
|
|
166
|
+
while (Date.now() < deadline) {
|
|
167
|
+
await sleep(250);
|
|
168
|
+
const still = findListenerPids(port);
|
|
169
|
+
if (still.length === 0) return { freed: true, killed, survivor: null };
|
|
170
|
+
if (!escalated && Date.now() > deadline - timeoutMs / 2) {
|
|
171
|
+
for (const pid of still) killPidHard(pid);
|
|
172
|
+
escalated = true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return { freed: false, killed, survivor: findListenerPids(port)[0] ?? null };
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Ready = a listener on the port owned by OUR child. A stale listener (an old
|
|
180
|
+
* server that survived the kill) can therefore never fake success. Fails fast when
|
|
181
|
+
* the child exits (EADDRINUSE, missing dist, crash on boot), and degrades to a
|
|
182
|
+
* liveness check where listeners are not observable.
|
|
183
|
+
*
|
|
184
|
+
* @returns {Promise<{ok: boolean, readiness: 'listener'|'process-alive', exited: boolean, exitCode: number|null}>}
|
|
185
|
+
*/
|
|
186
|
+
export async function waitForServerUp(port, child, { timeoutMs = 12000 } = {}) {
|
|
187
|
+
let exited = false;
|
|
188
|
+
let exitCode = null;
|
|
189
|
+
child.on('exit', (code) => {
|
|
190
|
+
exited = true;
|
|
191
|
+
exitCode = code;
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
if (!canDiscoverListeners()) {
|
|
195
|
+
await sleep(2500);
|
|
196
|
+
return { ok: !exited, readiness: 'process-alive', exited, exitCode };
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const deadline = Date.now() + timeoutMs;
|
|
200
|
+
while (Date.now() < deadline) {
|
|
201
|
+
await sleep(500);
|
|
202
|
+
if (exited) return { ok: false, readiness: 'listener', exited, exitCode };
|
|
203
|
+
if (findListenerPids(port).includes(String(child.pid))) {
|
|
204
|
+
return { ok: true, readiness: 'listener', exited: false, exitCode: null };
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return { ok: false, readiness: 'listener', exited, exitCode };
|
|
208
|
+
}
|