@svenroth-ai/shipwright 0.24.7-next.0 → 0.26.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/client/dist/assets/{EmbeddedTerminal-D2BLGWdW.js → EmbeddedTerminal-D3wpPNZP.js} +20 -20
- package/client/dist/assets/{abnfDiagram-VRR7QNED-C-W_2Jd4.js → abnfDiagram-VRR7QNED-BkLIltB3.js} +1 -1
- package/client/dist/assets/{arc-CpqwESP5.js → arc-Sw-Gh0nI.js} +1 -1
- package/client/dist/assets/{architectureDiagram-ZJ3FMSHR-DZVZ895V.js → architectureDiagram-ZJ3FMSHR-rdxUi9Ks.js} +1 -1
- package/client/dist/assets/{blockDiagram-677ZJIJ3-CCCZiAA7.js → blockDiagram-677ZJIJ3-Ch_9dj8a.js} +1 -1
- package/client/dist/assets/{c4Diagram-LMCZKHZV-Bg1beZAE.js → c4Diagram-LMCZKHZV-CkFlO65x.js} +1 -1
- package/client/dist/assets/channel-BYPbLjRl.js +1 -0
- package/client/dist/assets/{chunk-2Q5K7J3B-CoaXSarh.js → chunk-2Q5K7J3B-CypX83xu.js} +1 -1
- package/client/dist/assets/{chunk-32BRIVSS-CeFXS-CM.js → chunk-32BRIVSS-DxVLYGdl.js} +1 -1
- package/client/dist/assets/{chunk-5VM5RSS4-QyJMVe0m.js → chunk-5VM5RSS4-Cxk1evhx.js} +1 -1
- package/client/dist/assets/{chunk-EX3LRPZG-BIOtWVF8.js → chunk-EX3LRPZG-n9q5S4yJ.js} +1 -1
- package/client/dist/assets/{chunk-JWPE2WC7-Dcq-lWyX.js → chunk-JWPE2WC7-jeL4xvir.js} +1 -1
- package/client/dist/assets/{chunk-MOJQB5TN-C95323ja.js → chunk-MOJQB5TN-DDSHN0cj.js} +1 -1
- package/client/dist/assets/{chunk-RYQCIY6F-C0HPwpWy.js → chunk-RYQCIY6F-C0bo383g.js} +1 -1
- package/client/dist/assets/{chunk-V7JOEXUC-BPrTbZqA.js → chunk-V7JOEXUC-C0jDXXAU.js} +1 -1
- package/client/dist/assets/{chunk-VR4S4FIN--BCnNoqt.js → chunk-VR4S4FIN-h-Rr4Pn2.js} +1 -1
- package/client/dist/assets/{chunk-XXDRQBXY-Dj8vtcXf.js → chunk-XXDRQBXY-BexSo0-s.js} +1 -1
- package/client/dist/assets/classDiagram-OUVF2IWQ-CsFIeTju.js +1 -0
- package/client/dist/assets/classDiagram-v2-EOCWNBFH-CsFIeTju.js +1 -0
- package/client/dist/assets/{cose-bilkent-JH36ORCC-y51otZKz.js → cose-bilkent-JH36ORCC-BQXzaioj.js} +1 -1
- package/client/dist/assets/{cynefin-VYW2F7L2-BRfS3cHo.js → cynefin-VYW2F7L2-BJIofhfe.js} +1 -1
- package/client/dist/assets/{cynefinDiagram-TSTJHNR4-Dpg2RtfL.js → cynefinDiagram-TSTJHNR4-DmPqTM1T.js} +1 -1
- package/client/dist/assets/{dagre-VKFMJZFB-BdZtXgKZ.js → dagre-VKFMJZFB-1xljvw6X.js} +1 -1
- package/client/dist/assets/{diagram-FQU43EPY-K-RCwWxW.js → diagram-FQU43EPY-iyL9muCG.js} +1 -1
- package/client/dist/assets/{diagram-G47NLZAW-CHNn7F2-.js → diagram-G47NLZAW-DREp2Th6.js} +1 -1
- package/client/dist/assets/{diagram-NH7WQ7WH-B3zu6xib.js → diagram-NH7WQ7WH-h0X3Is2S.js} +1 -1
- package/client/dist/assets/{diagram-OA4YK3LP-Wp5ju7L7.js → diagram-OA4YK3LP-Bj8YZRFJ.js} +1 -1
- package/client/dist/assets/{diagram-WEI45ONY-C94GpsRk.js → diagram-WEI45ONY-BZOf805d.js} +1 -1
- package/client/dist/assets/{ebnfDiagram-CCIWWBDH-DXrTPOrP.js → ebnfDiagram-CCIWWBDH-DO5JnXda.js} +1 -1
- package/client/dist/assets/{erDiagram-Q63AITRT-CGejnW0f.js → erDiagram-Q63AITRT-DRgcqg1T.js} +1 -1
- package/client/dist/assets/{flowDiagram-23GEKE2U-CFJMM637.js → flowDiagram-23GEKE2U-C3J9QmrW.js} +1 -1
- package/client/dist/assets/{ganttDiagram-NO4QXBWP-DnaH94Su.js → ganttDiagram-NO4QXBWP-BIEl3Tkm.js} +1 -1
- package/client/dist/assets/{gitGraphDiagram-IHSO6WYX-DT-D0gbn.js → gitGraphDiagram-IHSO6WYX-BNF0tFWC.js} +1 -1
- package/client/dist/assets/index-BnTOrFHb.js +829 -0
- package/client/dist/assets/index-CYPc6qxw.css +1 -0
- package/client/dist/assets/{infoDiagram-FWYZ7A6U-DW3Ps00w.js → infoDiagram-FWYZ7A6U-DEyFxiyY.js} +1 -1
- package/client/dist/assets/{ishikawaDiagram-FXEZZL3T-DjxjIT3n.js → ishikawaDiagram-FXEZZL3T-B_ehlg3I.js} +1 -1
- package/client/dist/assets/{journeyDiagram-5HDEW3XC-DTQRI93Y.js → journeyDiagram-5HDEW3XC-Dp00FyJS.js} +1 -1
- package/client/dist/assets/{kanban-definition-HUTT4EX6-BeDvbiEs.js → kanban-definition-HUTT4EX6-CTAf16q8.js} +1 -1
- package/client/dist/assets/{linear-B4foxDlh.js → linear-9vNUgmYd.js} +1 -1
- package/client/dist/assets/{mermaid.core-c-L4qgSB.js → mermaid.core-A6tjaEVD.js} +4 -4
- package/client/dist/assets/{mindmap-definition-LN4V7U3C-dh8v0J8T.js → mindmap-definition-LN4V7U3C-DRW3bmCY.js} +1 -1
- package/client/dist/assets/{pegDiagram-2B236MQR-D5vNrtFh.js → pegDiagram-2B236MQR-DJFCjHp2.js} +1 -1
- package/client/dist/assets/{pieDiagram-ENE6RG2P-CIjg_6lR.js → pieDiagram-ENE6RG2P-KRd-sGvC.js} +1 -1
- package/client/dist/assets/{quadrantDiagram-ABIIQ3AL-CF37qWQD.js → quadrantDiagram-ABIIQ3AL-9TLZE3Hu.js} +1 -1
- package/client/dist/assets/{railroadDiagram-RFXS5EU6-x0Hn30Kj.js → railroadDiagram-RFXS5EU6-y4tLtjXg.js} +1 -1
- package/client/dist/assets/{requirementDiagram-TGXJPOKE-BE2QnVbN.js → requirementDiagram-TGXJPOKE-B9EOQDQM.js} +1 -1
- package/client/dist/assets/{sankeyDiagram-HTMAVEWB-CUv6cIlV.js → sankeyDiagram-HTMAVEWB-zfwiDzkT.js} +1 -1
- package/client/dist/assets/{sequenceDiagram-DBY2YBRQ-C3ACj5LS.js → sequenceDiagram-DBY2YBRQ-DW1LWepL.js} +1 -1
- package/client/dist/assets/{sizeCapture-X5ZJPWSS-DTMIb5gX.js → sizeCapture-X5ZJPWSS-BM81Mik0.js} +1 -1
- package/client/dist/assets/{stateDiagram-2N3HPSRC-DI1Z8P74.js → stateDiagram-2N3HPSRC-D0EMIw1w.js} +1 -1
- package/client/dist/assets/stateDiagram-v2-6OUMAXLB-B3E4_xxT.js +1 -0
- package/client/dist/assets/{swimlanes-5IMT3BWC-CLSr9w29.js → swimlanes-5IMT3BWC-CKXNCX6M.js} +2 -2
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-BegQBqnC.js +8 -0
- package/client/dist/assets/{timeline-definition-FHXFAJF6-BTWmUhDh.js → timeline-definition-FHXFAJF6-ByzIfvL5.js} +1 -1
- package/client/dist/assets/{vennDiagram-L72KCM5P-Ce1dlLCM.js → vennDiagram-L72KCM5P-Xep38xBH.js} +1 -1
- package/client/dist/assets/{wardleyDiagram-EHGQE667-ClOE-aae.js → wardleyDiagram-EHGQE667-DKWDpx6g.js} +1 -1
- package/client/dist/assets/{xychartDiagram-FW5EYKEG-Fa2pqWKw.js → xychartDiagram-FW5EYKEG-BGcwZTnu.js} +1 -1
- package/client/dist/index.html +27 -27
- package/lib/claude-cli.mjs +173 -173
- package/lib/preflight.mjs +252 -252
- package/lib/probe-path.mjs +84 -84
- package/lib/server.mjs +369 -369
- package/lib/util.mjs +157 -157
- package/lib/win32-spawn.mjs +253 -253
- package/package.json +1 -1
- package/scripts/deploy-procs.mjs +208 -208
- package/scripts/deploy-swap.mjs +276 -276
- package/scripts/kill-targets.js +140 -140
- package/scripts/repair-claude-json.mjs +295 -295
- package/server/dist/config/default-actions.json +90 -90
- package/server/dist/core/grade-runner.d.ts +4 -4
- package/server/dist/core/grade-runner.d.ts.map +1 -1
- package/server/dist/core/grade-runner.js +51 -26
- package/server/dist/core/grade-runner.js.map +1 -1
- package/server/dist/core/grade-target.d.ts +8 -0
- package/server/dist/core/grade-target.d.ts.map +1 -1
- package/server/dist/core/grade-target.js +10 -0
- package/server/dist/core/grade-target.js.map +1 -1
- package/server/dist/core/mission-context/association.d.ts +46 -0
- package/server/dist/core/mission-context/association.d.ts.map +1 -1
- package/server/dist/core/mission-context/association.js +69 -0
- package/server/dist/core/mission-context/association.js.map +1 -1
- package/server/dist/core/mission-context/resolver-iterate.d.ts +6 -0
- package/server/dist/core/mission-context/resolver-iterate.d.ts.map +1 -0
- package/server/dist/core/mission-context/resolver-iterate.js +202 -0
- package/server/dist/core/mission-context/resolver-iterate.js.map +1 -0
- package/server/dist/core/mission-context/resolver-parts.d.ts +20 -0
- package/server/dist/core/mission-context/resolver-parts.d.ts.map +1 -1
- package/server/dist/core/mission-context/resolver-parts.js +92 -0
- package/server/dist/core/mission-context/resolver-parts.js.map +1 -1
- package/server/dist/core/mission-context/resolver.d.ts +1 -1
- package/server/dist/core/mission-context/resolver.d.ts.map +1 -1
- package/server/dist/core/mission-context/resolver.js +17 -199
- package/server/dist/core/mission-context/resolver.js.map +1 -1
- package/server/dist/core/mission-context/run-id-recovery.d.ts +21 -5
- package/server/dist/core/mission-context/run-id-recovery.d.ts.map +1 -1
- package/server/dist/core/mission-context/run-id-recovery.js +32 -5
- package/server/dist/core/mission-context/run-id-recovery.js.map +1 -1
- package/server/dist/core/mission-context/scenario.d.ts +18 -11
- package/server/dist/core/mission-context/scenario.d.ts.map +1 -1
- package/server/dist/core/mission-context/scenario.js +40 -3
- package/server/dist/core/mission-context/scenario.js.map +1 -1
- package/server/dist/core/path-guard.d.ts +1 -1
- package/server/dist/core/path-guard.d.ts.map +1 -1
- package/server/dist/core/path-guard.js +9 -2
- package/server/dist/core/path-guard.js.map +1 -1
- package/server/dist/core/shipslog-docs-reader.d.ts +4 -0
- package/server/dist/core/shipslog-docs-reader.d.ts.map +1 -0
- package/server/dist/core/shipslog-docs-reader.js +181 -0
- package/server/dist/core/shipslog-docs-reader.js.map +1 -0
- package/server/dist/core/shipslog-docs-types.d.ts +15 -0
- package/server/dist/core/shipslog-docs-types.d.ts.map +1 -0
- package/server/dist/core/shipslog-docs-types.js +14 -0
- package/server/dist/core/shipslog-docs-types.js.map +1 -0
- package/server/dist/core/triage-cli-runner.d.ts.map +1 -1
- package/server/dist/core/triage-cli-runner.js +29 -10
- package/server/dist/core/triage-cli-runner.js.map +1 -1
- package/server/dist/core/uv-runner.d.ts +23 -0
- package/server/dist/core/uv-runner.d.ts.map +1 -0
- package/server/dist/core/uv-runner.js +39 -0
- package/server/dist/core/uv-runner.js.map +1 -0
- package/server/dist/external/design-review/serve.js +27 -27
- package/server/dist/external/file/exists-routes.d.ts +7 -0
- package/server/dist/external/file/exists-routes.d.ts.map +1 -0
- package/server/dist/external/file/exists-routes.js +91 -0
- package/server/dist/external/file/exists-routes.js.map +1 -0
- package/server/dist/external/mission-context/association-write.d.ts +22 -0
- package/server/dist/external/mission-context/association-write.d.ts.map +1 -0
- package/server/dist/external/mission-context/association-write.js +90 -0
- package/server/dist/external/mission-context/association-write.js.map +1 -0
- package/server/dist/external/mission-context/routes.d.ts.map +1 -1
- package/server/dist/external/mission-context/routes.js +18 -31
- package/server/dist/external/mission-context/routes.js.map +1 -1
- package/server/dist/external/org/audit-log.d.ts +27 -0
- package/server/dist/external/org/audit-log.d.ts.map +1 -0
- package/server/dist/external/org/audit-log.js +92 -0
- package/server/dist/external/org/audit-log.js.map +1 -0
- package/server/dist/external/org/beat-register.d.ts +15 -22
- package/server/dist/external/org/beat-register.d.ts.map +1 -1
- package/server/dist/external/org/beat-register.js +37 -32
- package/server/dist/external/org/beat-register.js.map +1 -1
- package/server/dist/external/org/file-read.d.ts +16 -0
- package/server/dist/external/org/file-read.d.ts.map +1 -1
- package/server/dist/external/org/file-read.js +86 -46
- package/server/dist/external/org/file-read.js.map +1 -1
- package/server/dist/external/org/file-write-core.d.ts +18 -0
- package/server/dist/external/org/file-write-core.d.ts.map +1 -0
- package/server/dist/external/org/file-write-core.js +97 -0
- package/server/dist/external/org/file-write-core.js.map +1 -0
- package/server/dist/external/org/file-write.d.ts +25 -0
- package/server/dist/external/org/file-write.d.ts.map +1 -1
- package/server/dist/external/org/file-write.js +82 -132
- package/server/dist/external/org/file-write.js.map +1 -1
- package/server/dist/external/org/last-run.d.ts +25 -16
- package/server/dist/external/org/last-run.d.ts.map +1 -1
- package/server/dist/external/org/last-run.js +78 -64
- package/server/dist/external/org/last-run.js.map +1 -1
- package/server/dist/external/org/lead-doc-read.d.ts +21 -0
- package/server/dist/external/org/lead-doc-read.d.ts.map +1 -0
- package/server/dist/external/org/lead-doc-read.js +84 -0
- package/server/dist/external/org/lead-doc-read.js.map +1 -0
- package/server/dist/external/org/mount.d.ts +12 -0
- package/server/dist/external/org/mount.d.ts.map +1 -0
- package/server/dist/external/org/mount.js +34 -0
- package/server/dist/external/org/mount.js.map +1 -0
- package/server/dist/external/org/org-chart-lookup.d.ts +13 -0
- package/server/dist/external/org/org-chart-lookup.d.ts.map +1 -1
- package/server/dist/external/org/org-chart-lookup.js +40 -5
- package/server/dist/external/org/org-chart-lookup.js.map +1 -1
- package/server/dist/external/org/org-chart.d.ts +21 -12
- package/server/dist/external/org/org-chart.d.ts.map +1 -1
- package/server/dist/external/org/org-chart.js +50 -32
- package/server/dist/external/org/org-chart.js.map +1 -1
- package/server/dist/external/org/role-extract.d.ts +8 -0
- package/server/dist/external/org/role-extract.d.ts.map +1 -0
- package/server/dist/external/org/role-extract.js +72 -0
- package/server/dist/external/org/role-extract.js.map +1 -0
- package/server/dist/external/org/usage.d.ts +15 -11
- package/server/dist/external/org/usage.d.ts.map +1 -1
- package/server/dist/external/org/usage.js +64 -54
- package/server/dist/external/org/usage.js.map +1 -1
- package/server/dist/external/routes.d.ts +1 -1
- package/server/dist/external/routes.d.ts.map +1 -1
- package/server/dist/external/routes.js +19 -17
- package/server/dist/external/routes.js.map +1 -1
- package/server/dist/external/shipslog-docs/routes.d.ts +10 -0
- package/server/dist/external/shipslog-docs/routes.d.ts.map +1 -0
- package/server/dist/external/shipslog-docs/routes.js +41 -0
- package/server/dist/external/shipslog-docs/routes.js.map +1 -0
- package/server/dist/routes/grade.d.ts.map +1 -1
- package/server/dist/routes/grade.js +3 -2
- package/server/dist/routes/grade.js.map +1 -1
- package/server/dist/routes/org-leads-composite.d.ts +21 -0
- package/server/dist/routes/org-leads-composite.d.ts.map +1 -0
- package/server/dist/routes/org-leads-composite.js +95 -0
- package/server/dist/routes/org-leads-composite.js.map +1 -0
- package/server/dist/routes/org.d.ts +15 -0
- package/server/dist/routes/org.d.ts.map +1 -0
- package/server/dist/routes/org.js +198 -0
- package/server/dist/routes/org.js.map +1 -0
- package/server/dist/terminal/pty-manager.d.ts +9 -0
- package/server/dist/terminal/pty-manager.d.ts.map +1 -1
- package/server/dist/terminal/pty-manager.js +15 -0
- package/server/dist/terminal/pty-manager.js.map +1 -1
- package/server/dist/terminal/replay-snapshot.d.ts +10 -1
- package/server/dist/terminal/replay-snapshot.d.ts.map +1 -1
- package/server/dist/terminal/replay-snapshot.js +36 -1
- package/server/dist/terminal/replay-snapshot.js.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.d.ts +17 -1
- package/server/dist/terminal/ws-upgrade-handler.d.ts.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts +1 -0
- package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.fixtures.js +3 -2
- package/server/dist/terminal/ws-upgrade-handler.fixtures.js.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.js +45 -4
- package/server/dist/terminal/ws-upgrade-handler.js.map +1 -1
- package/server/dist/test/python-spawn-guard-util.d.ts +14 -0
- package/server/dist/test/python-spawn-guard-util.d.ts.map +1 -0
- package/server/dist/test/python-spawn-guard-util.js +124 -0
- package/server/dist/test/python-spawn-guard-util.js.map +1 -0
- package/server/dist/types/org.d.ts +115 -0
- package/server/dist/types/org.d.ts.map +1 -0
- package/server/dist/types/org.js +16 -0
- package/server/dist/types/org.js.map +1 -0
- package/server/package.json +1 -1
- package/server/profiles/PROFILE_SCHEMA_VERSION +1 -1
- package/server/profiles/README.md +27 -27
- package/server/profiles/python-plugin-monorepo.json +35 -35
- package/server/profiles/supabase-nextjs.json +253 -253
- package/server/profiles/vite-hono.json +92 -92
- package/client/dist/assets/MarkdownEditorModal-CP5yG9OU.js +0 -212
- package/client/dist/assets/channel-BNXbCvDS.js +0 -1
- package/client/dist/assets/classDiagram-OUVF2IWQ-w-wCtLx3.js +0 -1
- package/client/dist/assets/classDiagram-v2-EOCWNBFH-w-wCtLx3.js +0 -1
- package/client/dist/assets/index-CU2QJgvx.js +0 -609
- package/client/dist/assets/index-ftvVcUT8.css +0 -1
- package/client/dist/assets/stateDiagram-v2-6OUMAXLB-DvwiHlJv.js +0 -1
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-JTQZTlZ3.js +0 -8
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schemaVersion": 1,
|
|
3
|
-
"defaults": {
|
|
4
|
-
"autonomy": "guided"
|
|
5
|
-
},
|
|
6
|
-
"actions": [
|
|
7
|
-
{
|
|
8
|
-
"id": "new-task",
|
|
9
|
-
"label": "New task",
|
|
10
|
-
"kind": "external_launch",
|
|
11
|
-
"description": "Plain Claude invocation scoped to a Shipwright phase. Fire-and-forget — no pipeline state.",
|
|
12
|
-
"command_template": "{cd.prefix}claude --session-id {task.uuid} --name {task.session_name} {plugin.dirs} {task.initial_prompt}",
|
|
13
|
-
"modal_fields": ["title", "phase", "description", "domain", "priority", "complexityHint", "tags", "blockedBy"],
|
|
14
|
-
"phase_parameters": {
|
|
15
|
-
"adopt": [
|
|
16
|
-
{ "name": "dry-run", "type": "boolean", "label": "Dry run", "cli_flag": "--dry-run", "helpText": "Simulate adoption without commits" },
|
|
17
|
-
{ "name": "scope", "type": "enum", "label": "Scope", "enum": ["full_app", "library", "cli"], "cli_flag": "--scope", "value_separator": "space" },
|
|
18
|
-
{ "name": "include-nested", "type": "boolean", "label": "Include nested projects", "cli_flag": "--include-nested" },
|
|
19
|
-
{ "name": "skip-crawl", "type": "boolean", "label": "Skip Playwright crawl", "cli_flag": "--skip-crawl" },
|
|
20
|
-
{ "name": "crawl-base-url", "type": "string", "label": "Crawl base URL", "cli_flag": "--crawl-base-url", "value_separator": "space", "placeholder": "e.g. http://localhost:3000" },
|
|
21
|
-
{ "name": "crawl-auth-token", "type": "string", "label": "Crawl auth token", "cli_flag": "--crawl-auth-token", "value_separator": "space", "sensitive": true },
|
|
22
|
-
{ "name": "crawl-max-depth", "type": "string", "label": "Crawl max depth", "cli_flag": "--crawl-max-depth", "value_separator": "space", "pattern": "^[1-9][0-9]?$", "default": "3" },
|
|
23
|
-
{ "name": "crawl-max-pages", "type": "string", "label": "Crawl max pages", "cli_flag": "--crawl-max-pages", "value_separator": "space", "pattern": "^[1-9][0-9]{0,3}$", "default": "50" },
|
|
24
|
-
{ "name": "no-backfill-events", "type": "boolean", "label": "Skip event backfill", "cli_flag": "--no-backfill-events" },
|
|
25
|
-
{ "name": "no-sync", "type": "boolean", "label": "Skip writing sync config", "cli_flag": "--no-sync" },
|
|
26
|
-
{ "name": "planning-split", "type": "string", "label": "Planning split name", "cli_flag": "--planning-split", "value_separator": "space", "default": "01-adopted", "pattern": "^[A-Za-z0-9_-]+$" }
|
|
27
|
-
],
|
|
28
|
-
"build": [
|
|
29
|
-
{ "name": "section", "type": "string", "label": "Section file (relative to project)", "cli_flag": "@", "value_separator": "none", "pattern": "^[A-Za-z0-9_./-]+\\.md$", "placeholder": "e.g. planning/03-build-feature.md", "required": true, "helpText": "Path relative to your project root — e.g. planning/03-build-feature.md. /shipwright-plan creates these files; pick one to build now." },
|
|
30
|
-
{ "name": "from", "type": "string", "label": "Start from section number", "cli_flag": "--from", "value_separator": "space", "pattern": "^[0-9]+$", "placeholder": "e.g. 03", "helpText": "Resume autonomous build from this section number" }
|
|
31
|
-
],
|
|
32
|
-
"test": [
|
|
33
|
-
{ "name": "fix", "type": "boolean", "label": "Auto-fix failing tests", "cli_flag": "--fix" },
|
|
34
|
-
{ "name": "e2e-only", "type": "boolean", "label": "E2E tests only", "cli_flag": "--e2e-only" },
|
|
35
|
-
{ "name": "design-fidelity", "type": "boolean", "label": "Design-fidelity check only", "cli_flag": "--design-fidelity" }
|
|
36
|
-
],
|
|
37
|
-
"deploy": [
|
|
38
|
-
{ "name": "target", "type": "enum", "label": "Target", "enum": ["dev", "prod", "rollback"], "cli_flag_map": { "prod": "--prod", "rollback": "--rollback" }, "default": "dev", "helpText": "Dev is default — no CLI flag emitted." }
|
|
39
|
-
],
|
|
40
|
-
"changelog": [
|
|
41
|
-
{ "name": "from", "type": "string", "label": "From git tag", "cli_flag": "--from", "value_separator": "space", "pattern": "^[A-Za-z0-9._/-]+$", "placeholder": "e.g. v0.3.1" }
|
|
42
|
-
]
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"id": "new-pipeline",
|
|
47
|
-
"label": "New pipeline",
|
|
48
|
-
"kind": "external_launch",
|
|
49
|
-
"description": "Full Shipwright pipeline — project → design → plan → build → test → deploy → changelog.",
|
|
50
|
-
"command_template": "{cd.prefix}claude --session-id {task.uuid} --name {task.session_name} {plugin.dirs} {task.initial_prompt}",
|
|
51
|
-
"modal_fields": ["title", "autonomy", "description"]
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
"id": "new-iterate",
|
|
55
|
-
"label": "New iterate",
|
|
56
|
-
"kind": "external_launch",
|
|
57
|
-
"description": "Run the complexity-adaptive iterate skill against an existing project.",
|
|
58
|
-
"command_template": "{cd.prefix}claude --session-id {task.uuid} --name {task.session_name} {plugin.dirs} {task.initial_prompt}",
|
|
59
|
-
"modal_fields": ["title", "autonomy", "description", "domain", "priority", "complexityHint", "tags", "blockedBy"],
|
|
60
|
-
"parameters": [
|
|
61
|
-
{ "name": "type", "type": "enum", "label": "Change type", "enum": ["feature", "change", "bug"], "cli_flag": "--type", "value_separator": "space", "helpText": "Auto-detected if omitted" },
|
|
62
|
-
{ "name": "plan-review-model", "type": "enum", "label": "Plan review", "enum": ["opus", "sonnet", "haiku", "inherit"], "cli_flag": "--plan-review-model", "value_separator": "space" },
|
|
63
|
-
{ "name": "review-model", "type": "enum", "label": "Review", "enum": ["opus", "sonnet", "haiku", "inherit"], "cli_flag": "--review-model", "value_separator": "space" }
|
|
64
|
-
]
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
"id": "new-plain",
|
|
68
|
-
"label": "Plain Claude",
|
|
69
|
-
"kind": "external_launch",
|
|
70
|
-
"description": "Plain Claude session in this project's directory. No Shipwright skill — just chat.",
|
|
71
|
-
"command_template": "{cd.prefix}claude --session-id {task.uuid} --name {task.session_name} {plugin.dirs}{task.description?}",
|
|
72
|
-
"modal_fields": ["title", "description"]
|
|
73
|
-
}
|
|
74
|
-
],
|
|
75
|
-
"phases": [
|
|
76
|
-
{ "id": "adopt", "label": "Adopt", "color": "#64748B" },
|
|
77
|
-
{ "id": "project", "label": "Project", "color": "#9ca3af" },
|
|
78
|
-
{ "id": "design", "label": "Design", "color": "#A855F7" },
|
|
79
|
-
{ "id": "plan", "label": "Plan", "color": "#3B82F6" },
|
|
80
|
-
{ "id": "build", "label": "Build", "color": "#F59E0B", "supports_autonomy": true },
|
|
81
|
-
{ "id": "test", "label": "Test", "color": "#059669", "supports_autonomy": true },
|
|
82
|
-
{ "id": "deploy", "label": "Deploy", "color": "#14B8A6" },
|
|
83
|
-
{ "id": "changelog", "label": "Changelog", "color": "#6366F1" },
|
|
84
|
-
{ "id": "compliance", "label": "Compliance", "color": "#0EA5E9" },
|
|
85
|
-
{ "id": "security", "label": "Security", "color": "#DC2626", "supports_autonomy": true }
|
|
86
|
-
],
|
|
87
|
-
"preview": {
|
|
88
|
-
"enabled": "auto"
|
|
89
|
-
}
|
|
90
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"defaults": {
|
|
4
|
+
"autonomy": "guided"
|
|
5
|
+
},
|
|
6
|
+
"actions": [
|
|
7
|
+
{
|
|
8
|
+
"id": "new-task",
|
|
9
|
+
"label": "New task",
|
|
10
|
+
"kind": "external_launch",
|
|
11
|
+
"description": "Plain Claude invocation scoped to a Shipwright phase. Fire-and-forget — no pipeline state.",
|
|
12
|
+
"command_template": "{cd.prefix}claude --session-id {task.uuid} --name {task.session_name} {plugin.dirs} {task.initial_prompt}",
|
|
13
|
+
"modal_fields": ["title", "phase", "description", "domain", "priority", "complexityHint", "tags", "blockedBy"],
|
|
14
|
+
"phase_parameters": {
|
|
15
|
+
"adopt": [
|
|
16
|
+
{ "name": "dry-run", "type": "boolean", "label": "Dry run", "cli_flag": "--dry-run", "helpText": "Simulate adoption without commits" },
|
|
17
|
+
{ "name": "scope", "type": "enum", "label": "Scope", "enum": ["full_app", "library", "cli"], "cli_flag": "--scope", "value_separator": "space" },
|
|
18
|
+
{ "name": "include-nested", "type": "boolean", "label": "Include nested projects", "cli_flag": "--include-nested" },
|
|
19
|
+
{ "name": "skip-crawl", "type": "boolean", "label": "Skip Playwright crawl", "cli_flag": "--skip-crawl" },
|
|
20
|
+
{ "name": "crawl-base-url", "type": "string", "label": "Crawl base URL", "cli_flag": "--crawl-base-url", "value_separator": "space", "placeholder": "e.g. http://localhost:3000" },
|
|
21
|
+
{ "name": "crawl-auth-token", "type": "string", "label": "Crawl auth token", "cli_flag": "--crawl-auth-token", "value_separator": "space", "sensitive": true },
|
|
22
|
+
{ "name": "crawl-max-depth", "type": "string", "label": "Crawl max depth", "cli_flag": "--crawl-max-depth", "value_separator": "space", "pattern": "^[1-9][0-9]?$", "default": "3" },
|
|
23
|
+
{ "name": "crawl-max-pages", "type": "string", "label": "Crawl max pages", "cli_flag": "--crawl-max-pages", "value_separator": "space", "pattern": "^[1-9][0-9]{0,3}$", "default": "50" },
|
|
24
|
+
{ "name": "no-backfill-events", "type": "boolean", "label": "Skip event backfill", "cli_flag": "--no-backfill-events" },
|
|
25
|
+
{ "name": "no-sync", "type": "boolean", "label": "Skip writing sync config", "cli_flag": "--no-sync" },
|
|
26
|
+
{ "name": "planning-split", "type": "string", "label": "Planning split name", "cli_flag": "--planning-split", "value_separator": "space", "default": "01-adopted", "pattern": "^[A-Za-z0-9_-]+$" }
|
|
27
|
+
],
|
|
28
|
+
"build": [
|
|
29
|
+
{ "name": "section", "type": "string", "label": "Section file (relative to project)", "cli_flag": "@", "value_separator": "none", "pattern": "^[A-Za-z0-9_./-]+\\.md$", "placeholder": "e.g. planning/03-build-feature.md", "required": true, "helpText": "Path relative to your project root — e.g. planning/03-build-feature.md. /shipwright-plan creates these files; pick one to build now." },
|
|
30
|
+
{ "name": "from", "type": "string", "label": "Start from section number", "cli_flag": "--from", "value_separator": "space", "pattern": "^[0-9]+$", "placeholder": "e.g. 03", "helpText": "Resume autonomous build from this section number" }
|
|
31
|
+
],
|
|
32
|
+
"test": [
|
|
33
|
+
{ "name": "fix", "type": "boolean", "label": "Auto-fix failing tests", "cli_flag": "--fix" },
|
|
34
|
+
{ "name": "e2e-only", "type": "boolean", "label": "E2E tests only", "cli_flag": "--e2e-only" },
|
|
35
|
+
{ "name": "design-fidelity", "type": "boolean", "label": "Design-fidelity check only", "cli_flag": "--design-fidelity" }
|
|
36
|
+
],
|
|
37
|
+
"deploy": [
|
|
38
|
+
{ "name": "target", "type": "enum", "label": "Target", "enum": ["dev", "prod", "rollback"], "cli_flag_map": { "prod": "--prod", "rollback": "--rollback" }, "default": "dev", "helpText": "Dev is default — no CLI flag emitted." }
|
|
39
|
+
],
|
|
40
|
+
"changelog": [
|
|
41
|
+
{ "name": "from", "type": "string", "label": "From git tag", "cli_flag": "--from", "value_separator": "space", "pattern": "^[A-Za-z0-9._/-]+$", "placeholder": "e.g. v0.3.1" }
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "new-pipeline",
|
|
47
|
+
"label": "New pipeline",
|
|
48
|
+
"kind": "external_launch",
|
|
49
|
+
"description": "Full Shipwright pipeline — project → design → plan → build → test → deploy → changelog.",
|
|
50
|
+
"command_template": "{cd.prefix}claude --session-id {task.uuid} --name {task.session_name} {plugin.dirs} {task.initial_prompt}",
|
|
51
|
+
"modal_fields": ["title", "autonomy", "description"]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": "new-iterate",
|
|
55
|
+
"label": "New iterate",
|
|
56
|
+
"kind": "external_launch",
|
|
57
|
+
"description": "Run the complexity-adaptive iterate skill against an existing project.",
|
|
58
|
+
"command_template": "{cd.prefix}claude --session-id {task.uuid} --name {task.session_name} {plugin.dirs} {task.initial_prompt}",
|
|
59
|
+
"modal_fields": ["title", "autonomy", "description", "domain", "priority", "complexityHint", "tags", "blockedBy"],
|
|
60
|
+
"parameters": [
|
|
61
|
+
{ "name": "type", "type": "enum", "label": "Change type", "enum": ["feature", "change", "bug"], "cli_flag": "--type", "value_separator": "space", "helpText": "Auto-detected if omitted" },
|
|
62
|
+
{ "name": "plan-review-model", "type": "enum", "label": "Plan review", "enum": ["opus", "sonnet", "haiku", "inherit"], "cli_flag": "--plan-review-model", "value_separator": "space" },
|
|
63
|
+
{ "name": "review-model", "type": "enum", "label": "Review", "enum": ["opus", "sonnet", "haiku", "inherit"], "cli_flag": "--review-model", "value_separator": "space" }
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"id": "new-plain",
|
|
68
|
+
"label": "Plain Claude",
|
|
69
|
+
"kind": "external_launch",
|
|
70
|
+
"description": "Plain Claude session in this project's directory. No Shipwright skill — just chat.",
|
|
71
|
+
"command_template": "{cd.prefix}claude --session-id {task.uuid} --name {task.session_name} {plugin.dirs}{task.description?}",
|
|
72
|
+
"modal_fields": ["title", "description"]
|
|
73
|
+
}
|
|
74
|
+
],
|
|
75
|
+
"phases": [
|
|
76
|
+
{ "id": "adopt", "label": "Adopt", "color": "#64748B" },
|
|
77
|
+
{ "id": "project", "label": "Project", "color": "#9ca3af" },
|
|
78
|
+
{ "id": "design", "label": "Design", "color": "#A855F7" },
|
|
79
|
+
{ "id": "plan", "label": "Plan", "color": "#3B82F6" },
|
|
80
|
+
{ "id": "build", "label": "Build", "color": "#F59E0B", "supports_autonomy": true },
|
|
81
|
+
{ "id": "test", "label": "Test", "color": "#059669", "supports_autonomy": true },
|
|
82
|
+
{ "id": "deploy", "label": "Deploy", "color": "#14B8A6" },
|
|
83
|
+
{ "id": "changelog", "label": "Changelog", "color": "#6366F1" },
|
|
84
|
+
{ "id": "compliance", "label": "Compliance", "color": "#0EA5E9" },
|
|
85
|
+
{ "id": "security", "label": "Security", "color": "#DC2626", "supports_autonomy": true }
|
|
86
|
+
],
|
|
87
|
+
"preview": {
|
|
88
|
+
"enabled": "auto"
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -39,7 +39,7 @@ export interface RunGradeInput {
|
|
|
39
39
|
target: string;
|
|
40
40
|
}
|
|
41
41
|
export interface RunGradeDeps {
|
|
42
|
-
/** `--version` runner used by
|
|
42
|
+
/** `--version` runner used by resolveUv (test seam). */
|
|
43
43
|
run?: RunFn;
|
|
44
44
|
/** grade.py spawn (test seam — CI mocks it; no live grade.py). */
|
|
45
45
|
spawn?: SpawnGradeFn;
|
|
@@ -55,9 +55,9 @@ export interface RunGradeDeps {
|
|
|
55
55
|
baseEnv?: NodeJS.ProcessEnv;
|
|
56
56
|
}
|
|
57
57
|
/**
|
|
58
|
-
* Validate → resolve engine → spawn `
|
|
59
|
-
* outcome to an honest {@link GradeOutcome}.
|
|
60
|
-
* only a programming error would reject.
|
|
58
|
+
* Validate → resolve engine → spawn `uv run --project <plugin-root> grade.py
|
|
59
|
+
* <target> --format json` → map the outcome to an honest {@link GradeOutcome}.
|
|
60
|
+
* Never throws for a grade failure; only a programming error would reject.
|
|
61
61
|
*/
|
|
62
62
|
export declare function runGrade(input: RunGradeInput, deps?: RunGradeDeps): Promise<GradeOutcome>;
|
|
63
63
|
//# sourceMappingURL=grade-runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grade-runner.d.ts","sourceRoot":"","sources":["../../src/core/grade-runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"grade-runner.d.ts","sourceRoot":"","sources":["../../src/core/grade-runner.ts"],"names":[],"mappings":"AAyDA,OAAO,EAAwC,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAYxF;iFACiF;AACjF,eAAO,MAAM,wBAAwB,SAAU,CAAC;AAEhD,sFAAsF;AACtF,MAAM,MAAM,WAAW,GACnB,cAAc,GACd,cAAc,GACd,oBAAoB,GACpB,oBAAoB,CAAC;AAEzB,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB;;iEAE6D;IAC7D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,MAAM,WAAW,WAAW;IAC1B,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GAAG,CACzB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,iBAAiB,KACpB,OAAO,CAAC,WAAW,CAAC,CAAC;AAE1B;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,YAgC5B,CAAC;AAIL,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,kEAAkE;IAClE,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,gEAAgE;IAChE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAC7B;AAWD;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,aAAa,EACpB,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,YAAY,CAAC,CAkGvB"}
|
|
@@ -6,13 +6,17 @@
|
|
|
6
6
|
* + the outcome mapping.
|
|
7
7
|
*
|
|
8
8
|
* ── IO / injection boundary (the reason A09 was split) ──────────────────────
|
|
9
|
-
* `grade.py
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
9
|
+
* `grade.py` is spawned via `uv run --project <plugin-root> <script>
|
|
10
|
+
* --format json -- <target>` with **shell:false** (the plugin's OWN declared
|
|
11
|
+
* environment — grade.py needs `defusedxml` + Python 3.11+, per its
|
|
12
|
+
* pyproject.toml, and never gets it from an ambient system interpreter; see
|
|
13
|
+
* `uv-runner.ts`'s header for the incident this replaced). uv is resolved by
|
|
14
|
+
* TEST-RUN (`resolveUv`, reusing the readiness probe's PATH augmentation) —
|
|
15
|
+
* missing uv is an honest engine-unavailable, never a silent python fallback.
|
|
16
|
+
* The target is passed as a **fixed argv position** — never interpolated into
|
|
17
|
+
* a shell string, so no shell metacharacter in a user-entered path/URL can
|
|
18
|
+
* reach a shell (there is none). Mirrors the ADR-044 #9 / `pr-status.ts` spawn
|
|
19
|
+
* discipline. Must NOT trip Semgrep `spawn-shell-true`.
|
|
16
20
|
*
|
|
17
21
|
* READ-ONLY: grade is a pure read of a repo. It registers no project, writes
|
|
18
22
|
* nothing to the graded repo, and never touches `~/.claude/projects/**`,
|
|
@@ -20,6 +24,21 @@
|
|
|
20
24
|
* A remote URL is shallow-cloned into a throwaway tempdir *by grade.py* and
|
|
21
25
|
* purged when it exits — webui does not clone.
|
|
22
26
|
*
|
|
27
|
+
* "Read-only" is about the GRADED repo and webui's own state, not about
|
|
28
|
+
* `uv`'s own bookkeeping (Stage-3 doubt review, 2026-08-26): `uv run
|
|
29
|
+
* --project` DOES write into the plugin's OWN cache directory
|
|
30
|
+
* (`~/.claude/plugins/cache/shipwright/shipwright-grade/<version>/.venv/`) the
|
|
31
|
+
* first time it syncs that project's declared dependencies — verified on a
|
|
32
|
+
* real cache. This is uv's own environment-sync mechanism (cross-process
|
|
33
|
+
* locked by uv itself), scoped to the plugin's own directory, and one-time
|
|
34
|
+
* per version; it is not a new write surface this module owns or must guard.
|
|
35
|
+
*
|
|
36
|
+
* `uv run --python ">=3.11"` also passes `--no-project` in the
|
|
37
|
+
* triage-cli-runner sibling (see that module's header) so a bare `--python`
|
|
38
|
+
* invocation never walks up from the spawning process's cwd looking for an
|
|
39
|
+
* ambient project to activate; grade-runner's `--project <plugin-root>` is
|
|
40
|
+
* already explicit and has no such ambient-discovery exposure.
|
|
41
|
+
*
|
|
23
42
|
* Every grade.py outcome maps to an HONEST state (never a fabricated grade):
|
|
24
43
|
* exit 0 + JSON → report-ready (raw model; the CLIENT reportShape
|
|
25
44
|
* guard is the cross-repo contract check, ADR-045)
|
|
@@ -34,8 +53,9 @@
|
|
|
34
53
|
* subprocess — no live grade.py).
|
|
35
54
|
*/
|
|
36
55
|
import { execFile } from "node:child_process";
|
|
37
|
-
import { defaultRun, READINESS_REPAIR_COMMAND
|
|
38
|
-
import { defaultStatDir, ENV_COMPLIANCE_ROOT, resolveComplianceRoot, resolveGradeScript, validateGradeTarget, } from "./grade-target.js";
|
|
56
|
+
import { defaultRun, READINESS_REPAIR_COMMAND } from "./readiness-probe.js";
|
|
57
|
+
import { defaultStatDir, ENV_COMPLIANCE_ROOT, resolveComplianceRoot, resolveGradePluginRoot, resolveGradeScript, validateGradeTarget, } from "./grade-target.js";
|
|
58
|
+
import { resolveUv } from "./uv-runner.js";
|
|
39
59
|
/** grade.py can shallow-clone + read a whole history; a remote target needs
|
|
40
60
|
* headroom over a local one. Generous, but bounded (a hung clone is killed). */
|
|
41
61
|
export const DEFAULT_GRADE_TIMEOUT_MS = 120_000;
|
|
@@ -79,9 +99,9 @@ function cleanStderr(stderr) {
|
|
|
79
99
|
return line.replace(/^shipwright-grade:\s*/i, "").trim();
|
|
80
100
|
}
|
|
81
101
|
/**
|
|
82
|
-
* Validate → resolve engine → spawn `
|
|
83
|
-
* outcome to an honest {@link GradeOutcome}.
|
|
84
|
-
* only a programming error would reject.
|
|
102
|
+
* Validate → resolve engine → spawn `uv run --project <plugin-root> grade.py
|
|
103
|
+
* <target> --format json` → map the outcome to an honest {@link GradeOutcome}.
|
|
104
|
+
* Never throws for a grade failure; only a programming error would reject.
|
|
85
105
|
*/
|
|
86
106
|
export async function runGrade(input, deps = {}) {
|
|
87
107
|
const statDir = deps.statDir ?? defaultStatDir;
|
|
@@ -98,8 +118,10 @@ export async function runGrade(input, deps = {}) {
|
|
|
98
118
|
if (!v.ok)
|
|
99
119
|
return { status: "grade-failed", reason: v.reason };
|
|
100
120
|
const target = input.target.trim();
|
|
101
|
-
// 2 — resolve the engine: grade.py +
|
|
102
|
-
//
|
|
121
|
+
// 2 — resolve the engine: grade.py + uv. Either missing is an honest
|
|
122
|
+
// "engine unavailable — run npx …" (reuse the readiness repair). uv
|
|
123
|
+
// missing is NEVER a reason to fall back to a bare system python — that
|
|
124
|
+
// silent fallback is the root cause this replaced (uv-runner.ts).
|
|
103
125
|
const script = resolveGradeScript({ ...resolveDeps, scriptOverride: deps.scriptOverride });
|
|
104
126
|
if (!script) {
|
|
105
127
|
return {
|
|
@@ -108,11 +130,12 @@ export async function runGrade(input, deps = {}) {
|
|
|
108
130
|
repairCommand: READINESS_REPAIR_COMMAND,
|
|
109
131
|
};
|
|
110
132
|
}
|
|
111
|
-
const
|
|
112
|
-
|
|
133
|
+
const baseEnv = deps.baseEnv ?? process.env;
|
|
134
|
+
const uv = await resolveUv({ run, homeDir: deps.homeDir, baseEnv });
|
|
135
|
+
if (!uv) {
|
|
113
136
|
return {
|
|
114
137
|
status: "engine-unavailable",
|
|
115
|
-
reason: "
|
|
138
|
+
reason: "uv isn't installed — grade needs it to run in the plugin's own environment.",
|
|
116
139
|
repairCommand: READINESS_REPAIR_COMMAND,
|
|
117
140
|
};
|
|
118
141
|
}
|
|
@@ -122,22 +145,24 @@ export async function runGrade(input, deps = {}) {
|
|
|
122
145
|
...resolveDeps,
|
|
123
146
|
complianceOverride: deps.complianceOverride,
|
|
124
147
|
});
|
|
125
|
-
const
|
|
126
|
-
const env = { ...baseEnv };
|
|
148
|
+
const env = { ...uv.env };
|
|
127
149
|
if (complianceRoot)
|
|
128
150
|
env[ENV_COMPLIANCE_ROOT] = complianceRoot;
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
//
|
|
151
|
+
// `uv run --project <plugin-root>` resolves grade.py's own declared deps
|
|
152
|
+
// (defusedxml, Python 3.11+) instead of an ambient interpreter. Fixed argv:
|
|
153
|
+
// options first, then a `--` END-OF-OPTIONS separator, then the target as
|
|
154
|
+
// the sole positional. shell:false already blocks shell injection; the `--`
|
|
155
|
+
// additionally blocks ARGUMENT injection — a target like `--no-clone` or
|
|
156
|
+
// `--allow-network-private` is treated as a path, never a grade.py flag
|
|
133
157
|
// (mirrors the pr-status.ts `--` discipline; verified against argparse).
|
|
134
|
-
const
|
|
135
|
-
const
|
|
158
|
+
const pluginRoot = resolveGradePluginRoot(script);
|
|
159
|
+
const args = ["run", "--project", pluginRoot, script, "--format", "json", "--", target];
|
|
160
|
+
const r = await spawn(uv.bin, args, { env, timeoutMs });
|
|
136
161
|
// 4 — map the outcome.
|
|
137
162
|
if (r.code === -1) {
|
|
138
163
|
return {
|
|
139
164
|
status: "engine-unavailable",
|
|
140
|
-
reason: "
|
|
165
|
+
reason: "uv couldn't start on this machine.",
|
|
141
166
|
repairCommand: READINESS_REPAIR_COMMAND,
|
|
142
167
|
};
|
|
143
168
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grade-runner.js","sourceRoot":"","sources":["../../src/core/grade-runner.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"grade-runner.js","sourceRoot":"","sources":["../../src/core/grade-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,14 @@ export interface PluginResolveDeps {
|
|
|
35
35
|
export declare function resolveGradeScript(deps?: PluginResolveDeps & {
|
|
36
36
|
scriptOverride?: string;
|
|
37
37
|
}): string | null;
|
|
38
|
+
/**
|
|
39
|
+
* The `shipwright-grade` plugin root that owns `resolveGradeScript`'s result —
|
|
40
|
+
* three levels up from `scripts/tools/grade.py`. This is the plugin's own
|
|
41
|
+
* `pyproject.toml`/`uv.lock`/`.venv` directory, so `uv run --project
|
|
42
|
+
* <pluginRoot>` resolves grade.py's declared dependencies (defusedxml, etc.)
|
|
43
|
+
* instead of whatever bare interpreter happened to answer `--version` first.
|
|
44
|
+
*/
|
|
45
|
+
export declare function resolveGradePluginRoot(script: string): string;
|
|
38
46
|
/** Resolve the shipwright-compliance plugin root (the dir carrying
|
|
39
47
|
* `scripts/lib/control_grade.py`), which grade.py's engine_bridge needs. */
|
|
40
48
|
export declare function resolveComplianceRoot(deps?: PluginResolveDeps & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grade-target.d.ts","sourceRoot":"","sources":["../../src/core/grade-target.ts"],"names":[],"mappings":"AA6BA;;kEAEkE;AAClE,eAAO,MAAM,mBAAmB,qCAAqC,CAAC;AAQtE,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,aAAyD,CAAC;AAkB3F;;iFAEiF;AACjF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGnD;AAUD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,GAC9B,gBAAgB,CAmClB;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAMjD;AAMD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;CACrC;AA4BD,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAChC,IAAI,GAAE,iBAAiB,GAAG;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,MAAM,GAAG,IAAI,CAIf;AAED;6EAC6E;AAC7E,wBAAgB,qBAAqB,CACnC,IAAI,GAAE,iBAAiB,GAAG;IAAE,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7D,MAAM,GAAG,IAAI,CAQf"}
|
|
1
|
+
{"version":3,"file":"grade-target.d.ts","sourceRoot":"","sources":["../../src/core/grade-target.ts"],"names":[],"mappings":"AA6BA;;kEAEkE;AAClE,eAAO,MAAM,mBAAmB,qCAAqC,CAAC;AAQtE,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,aAAyD,CAAC;AAkB3F;;iFAEiF;AACjF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGnD;AAUD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,GAC9B,gBAAgB,CAmClB;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAMjD;AAMD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;CACrC;AA4BD,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAChC,IAAI,GAAE,iBAAiB,GAAG;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,MAAM,GAAG,IAAI,CAIf;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;6EAC6E;AAC7E,wBAAgB,qBAAqB,CACnC,IAAI,GAAE,iBAAiB,GAAG;IAAE,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7D,MAAM,GAAG,IAAI,CAQf"}
|
|
@@ -151,6 +151,16 @@ export function resolveGradeScript(deps = {}) {
|
|
|
151
151
|
return existsFn(deps.scriptOverride) ? deps.scriptOverride : null;
|
|
152
152
|
return resolveVersionedFile("shipwright-grade", ["scripts", "tools", "grade.py"], deps);
|
|
153
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* The `shipwright-grade` plugin root that owns `resolveGradeScript`'s result —
|
|
156
|
+
* three levels up from `scripts/tools/grade.py`. This is the plugin's own
|
|
157
|
+
* `pyproject.toml`/`uv.lock`/`.venv` directory, so `uv run --project
|
|
158
|
+
* <pluginRoot>` resolves grade.py's declared dependencies (defusedxml, etc.)
|
|
159
|
+
* instead of whatever bare interpreter happened to answer `--version` first.
|
|
160
|
+
*/
|
|
161
|
+
export function resolveGradePluginRoot(script) {
|
|
162
|
+
return path.dirname(path.dirname(path.dirname(script)));
|
|
163
|
+
}
|
|
154
164
|
/** Resolve the shipwright-compliance plugin root (the dir carrying
|
|
155
165
|
* `scripts/lib/control_grade.py`), which grade.py's engine_bridge needs. */
|
|
156
166
|
export function resolveComplianceRoot(deps = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grade-target.js","sourceRoot":"","sources":["../../src/core/grade-target.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grade-target.js","sourceRoot":"","sources":["../../src/core/grade-target.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,4 +24,50 @@ export declare function setMissionContextOnce(store: Pick<SdkSessionsStore, "get
|
|
|
24
24
|
* concurrent writer's value is never clobbered.
|
|
25
25
|
*/
|
|
26
26
|
export declare function revertMissionContext(store: Pick<SdkSessionsStore, "get" | "patch">, taskId: string, attempted: MissionContextAssociation): void;
|
|
27
|
+
/**
|
|
28
|
+
* Evidence-gated UPDATE of an association ALREADY on file — the one
|
|
29
|
+
* deliberate exception to the once-only doctrine above (external code
|
|
30
|
+
* review, openai HIGH, iterate-2026-08-31-mission-feed-gaps).
|
|
31
|
+
*
|
|
32
|
+
* Without this, scenario.ts rule 2b's supersession is provably decorative:
|
|
33
|
+
* the ONCE-only write above makes every corrected `associateRunId` it returns
|
|
34
|
+
* unreachable, so a long-lived task's stale association never durably
|
|
35
|
+
* corrects — and once the newer run's `Run-ID:` footer scrolls past this
|
|
36
|
+
* task's (narrower, associated-task) reach-back window, rule 2b's per-poll
|
|
37
|
+
* scan stops finding it too, and the Mission tab is stuck on the stale run
|
|
38
|
+
* for good. Persisting the correction closes both holes.
|
|
39
|
+
*
|
|
40
|
+
* Narrow on purpose — this is a correction, not a general-purpose write: the
|
|
41
|
+
* caller only ever offers a `transcript_run_id`-sourced association, and only
|
|
42
|
+
* after scenario.ts rule 2b has required a corroborated footer naming a
|
|
43
|
+
* PROVABLY newer run than the one on file (`isProvablyNewerRunId`). This
|
|
44
|
+
* function does not re-derive that recency itself — it trusts the one caller
|
|
45
|
+
* that computes it, the same posture `setMissionContextOnce` already takes
|
|
46
|
+
* toward its own caller's pointer validation.
|
|
47
|
+
*
|
|
48
|
+
* Compare-and-set against `expectedPrevious` (external code review, openai
|
|
49
|
+
* MEDIUM): without it, this is a blind overwrite of "whatever is currently
|
|
50
|
+
* stored", not of the specific stale association the resolver actually
|
|
51
|
+
* decided against. Two polls can race on the same stale association — poll
|
|
52
|
+
* A resolves against it and decides to supersede with run X, poll B resolves
|
|
53
|
+
* against the SAME stale read (a later poll interval, different transcript
|
|
54
|
+
* snapshot) and decides to supersede with run Y — and whichever write lands
|
|
55
|
+
* second would clobber the other's answer even though it is validating a read
|
|
56
|
+
* that is no longer current. Requiring the stored value to still equal what
|
|
57
|
+
* THIS caller read before writing turns that into a no-op instead: the loser
|
|
58
|
+
* skips its write and the next resolve operates on whatever is now current.
|
|
59
|
+
*/
|
|
60
|
+
export declare function supersedeMissionContext(store: Pick<SdkSessionsStore, "get" | "patch">, taskId: string, association: MissionContextAssociation, expectedPrevious: MissionContextAssociation): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Roll back a supersession that was set in memory but FAILED to persist — the
|
|
63
|
+
* supersede counterpart to `revertMissionContext`. Restores the PREVIOUS
|
|
64
|
+
* association rather than clearing the field: unlike a first association,
|
|
65
|
+
* there was already a valid, durable value here, and losing it to a
|
|
66
|
+
* transient lock contention would be a second, worse regression stacked on
|
|
67
|
+
* top of the one this whole mechanism exists to fix.
|
|
68
|
+
*
|
|
69
|
+
* Only reverts when the field still holds the association WE just set, so a
|
|
70
|
+
* concurrent writer's value is never clobbered.
|
|
71
|
+
*/
|
|
72
|
+
export declare function revertSupersession(store: Pick<SdkSessionsStore, "get" | "patch">, taskId: string, attempted: MissionContextAssociation, previous: MissionContextAssociation): void;
|
|
27
73
|
//# sourceMappingURL=association.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"association.d.ts","sourceRoot":"","sources":["../../../src/core/mission-context/association.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAA+B,KAAK,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEzF;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,OAAO,CAAC,EAC9C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,yBAAyB,GACrC,OAAO,CAOT;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,OAAO,CAAC,EAC9C,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,yBAAyB,GACnC,IAAI,CAMN"}
|
|
1
|
+
{"version":3,"file":"association.d.ts","sourceRoot":"","sources":["../../../src/core/mission-context/association.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAA+B,KAAK,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEzF;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,OAAO,CAAC,EAC9C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,yBAAyB,GACrC,OAAO,CAOT;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,OAAO,CAAC,EAC9C,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,yBAAyB,GACnC,IAAI,CAMN;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,OAAO,CAAC,EAC9C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,yBAAyB,EACtC,gBAAgB,EAAE,yBAAyB,GAC1C,OAAO,CAST;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,OAAO,CAAC,EAC9C,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,yBAAyB,EACpC,QAAQ,EAAE,yBAAyB,GAClC,IAAI,CAMN"}
|
|
@@ -66,4 +66,73 @@ export function revertMissionContext(store, taskId, attempted) {
|
|
|
66
66
|
return;
|
|
67
67
|
store.patch(taskId, { missionContext: undefined });
|
|
68
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Evidence-gated UPDATE of an association ALREADY on file — the one
|
|
71
|
+
* deliberate exception to the once-only doctrine above (external code
|
|
72
|
+
* review, openai HIGH, iterate-2026-08-31-mission-feed-gaps).
|
|
73
|
+
*
|
|
74
|
+
* Without this, scenario.ts rule 2b's supersession is provably decorative:
|
|
75
|
+
* the ONCE-only write above makes every corrected `associateRunId` it returns
|
|
76
|
+
* unreachable, so a long-lived task's stale association never durably
|
|
77
|
+
* corrects — and once the newer run's `Run-ID:` footer scrolls past this
|
|
78
|
+
* task's (narrower, associated-task) reach-back window, rule 2b's per-poll
|
|
79
|
+
* scan stops finding it too, and the Mission tab is stuck on the stale run
|
|
80
|
+
* for good. Persisting the correction closes both holes.
|
|
81
|
+
*
|
|
82
|
+
* Narrow on purpose — this is a correction, not a general-purpose write: the
|
|
83
|
+
* caller only ever offers a `transcript_run_id`-sourced association, and only
|
|
84
|
+
* after scenario.ts rule 2b has required a corroborated footer naming a
|
|
85
|
+
* PROVABLY newer run than the one on file (`isProvablyNewerRunId`). This
|
|
86
|
+
* function does not re-derive that recency itself — it trusts the one caller
|
|
87
|
+
* that computes it, the same posture `setMissionContextOnce` already takes
|
|
88
|
+
* toward its own caller's pointer validation.
|
|
89
|
+
*
|
|
90
|
+
* Compare-and-set against `expectedPrevious` (external code review, openai
|
|
91
|
+
* MEDIUM): without it, this is a blind overwrite of "whatever is currently
|
|
92
|
+
* stored", not of the specific stale association the resolver actually
|
|
93
|
+
* decided against. Two polls can race on the same stale association — poll
|
|
94
|
+
* A resolves against it and decides to supersede with run X, poll B resolves
|
|
95
|
+
* against the SAME stale read (a later poll interval, different transcript
|
|
96
|
+
* snapshot) and decides to supersede with run Y — and whichever write lands
|
|
97
|
+
* second would clobber the other's answer even though it is validating a read
|
|
98
|
+
* that is no longer current. Requiring the stored value to still equal what
|
|
99
|
+
* THIS caller read before writing turns that into a no-op instead: the loser
|
|
100
|
+
* skips its write and the next resolve operates on whatever is now current.
|
|
101
|
+
*/
|
|
102
|
+
export function supersedeMissionContext(store, taskId, association, expectedPrevious) {
|
|
103
|
+
const task = store.get(taskId);
|
|
104
|
+
if (!task?.missionContext)
|
|
105
|
+
return false;
|
|
106
|
+
if (task.missionContext.runId !== expectedPrevious.runId)
|
|
107
|
+
return false;
|
|
108
|
+
if (task.missionContext.observedAt !== expectedPrevious.observedAt)
|
|
109
|
+
return false;
|
|
110
|
+
if (association.source !== "transcript_run_id")
|
|
111
|
+
return false;
|
|
112
|
+
if (!isMissionContextAssociation(association))
|
|
113
|
+
return false;
|
|
114
|
+
store.patch(taskId, { missionContext: association });
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Roll back a supersession that was set in memory but FAILED to persist — the
|
|
119
|
+
* supersede counterpart to `revertMissionContext`. Restores the PREVIOUS
|
|
120
|
+
* association rather than clearing the field: unlike a first association,
|
|
121
|
+
* there was already a valid, durable value here, and losing it to a
|
|
122
|
+
* transient lock contention would be a second, worse regression stacked on
|
|
123
|
+
* top of the one this whole mechanism exists to fix.
|
|
124
|
+
*
|
|
125
|
+
* Only reverts when the field still holds the association WE just set, so a
|
|
126
|
+
* concurrent writer's value is never clobbered.
|
|
127
|
+
*/
|
|
128
|
+
export function revertSupersession(store, taskId, attempted, previous) {
|
|
129
|
+
const task = store.get(taskId);
|
|
130
|
+
if (!task?.missionContext)
|
|
131
|
+
return;
|
|
132
|
+
if (task.missionContext.runId !== attempted.runId)
|
|
133
|
+
return;
|
|
134
|
+
if (task.missionContext.observedAt !== attempted.observedAt)
|
|
135
|
+
return;
|
|
136
|
+
store.patch(taskId, { missionContext: previous });
|
|
137
|
+
}
|
|
69
138
|
//# sourceMappingURL=association.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"association.js","sourceRoot":"","sources":["../../../src/core/mission-context/association.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAE,2BAA2B,EAAkC,MAAM,YAAY,CAAC;AAEzF;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAA8C,EAC9C,MAAc,EACd,WAAsC;IAEtC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,IAAI,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC,2BAA2B,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5D,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAA8C,EAC9C,MAAc,EACd,SAAoC;IAEpC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,cAAc;QAAE,OAAO;IAClC,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK;QAAE,OAAO;IAC1D,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU;QAAE,OAAO;IACpE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC;AACrD,CAAC"}
|
|
1
|
+
{"version":3,"file":"association.js","sourceRoot":"","sources":["../../../src/core/mission-context/association.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAE,2BAA2B,EAAkC,MAAM,YAAY,CAAC;AAEzF;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAA8C,EAC9C,MAAc,EACd,WAAsC;IAEtC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,IAAI,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC,2BAA2B,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5D,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAA8C,EAC9C,MAAc,EACd,SAAoC;IAEpC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,cAAc;QAAE,OAAO;IAClC,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK;QAAE,OAAO;IAC1D,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU;QAAE,OAAO;IACpE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAA8C,EAC9C,MAAc,EACd,WAAsC,EACtC,gBAA2C;IAE3C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,cAAc;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,KAAK,gBAAgB,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACvE,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,KAAK,gBAAgB,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IACjF,IAAI,WAAW,CAAC,MAAM,KAAK,mBAAmB;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,CAAC,2BAA2B,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5D,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAA8C,EAC9C,MAAc,EACd,SAAoC,EACpC,QAAmC;IAEnC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,cAAc;QAAE,OAAO;IAClC,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK;QAAE,OAAO;IAC1D,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU;QAAE,OAAO;IACpE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;AACpD,CAAC"}
|