@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.
Files changed (239) hide show
  1. package/client/dist/assets/{EmbeddedTerminal-D2BLGWdW.js → EmbeddedTerminal-D3wpPNZP.js} +20 -20
  2. package/client/dist/assets/{abnfDiagram-VRR7QNED-C-W_2Jd4.js → abnfDiagram-VRR7QNED-BkLIltB3.js} +1 -1
  3. package/client/dist/assets/{arc-CpqwESP5.js → arc-Sw-Gh0nI.js} +1 -1
  4. package/client/dist/assets/{architectureDiagram-ZJ3FMSHR-DZVZ895V.js → architectureDiagram-ZJ3FMSHR-rdxUi9Ks.js} +1 -1
  5. package/client/dist/assets/{blockDiagram-677ZJIJ3-CCCZiAA7.js → blockDiagram-677ZJIJ3-Ch_9dj8a.js} +1 -1
  6. package/client/dist/assets/{c4Diagram-LMCZKHZV-Bg1beZAE.js → c4Diagram-LMCZKHZV-CkFlO65x.js} +1 -1
  7. package/client/dist/assets/channel-BYPbLjRl.js +1 -0
  8. package/client/dist/assets/{chunk-2Q5K7J3B-CoaXSarh.js → chunk-2Q5K7J3B-CypX83xu.js} +1 -1
  9. package/client/dist/assets/{chunk-32BRIVSS-CeFXS-CM.js → chunk-32BRIVSS-DxVLYGdl.js} +1 -1
  10. package/client/dist/assets/{chunk-5VM5RSS4-QyJMVe0m.js → chunk-5VM5RSS4-Cxk1evhx.js} +1 -1
  11. package/client/dist/assets/{chunk-EX3LRPZG-BIOtWVF8.js → chunk-EX3LRPZG-n9q5S4yJ.js} +1 -1
  12. package/client/dist/assets/{chunk-JWPE2WC7-Dcq-lWyX.js → chunk-JWPE2WC7-jeL4xvir.js} +1 -1
  13. package/client/dist/assets/{chunk-MOJQB5TN-C95323ja.js → chunk-MOJQB5TN-DDSHN0cj.js} +1 -1
  14. package/client/dist/assets/{chunk-RYQCIY6F-C0HPwpWy.js → chunk-RYQCIY6F-C0bo383g.js} +1 -1
  15. package/client/dist/assets/{chunk-V7JOEXUC-BPrTbZqA.js → chunk-V7JOEXUC-C0jDXXAU.js} +1 -1
  16. package/client/dist/assets/{chunk-VR4S4FIN--BCnNoqt.js → chunk-VR4S4FIN-h-Rr4Pn2.js} +1 -1
  17. package/client/dist/assets/{chunk-XXDRQBXY-Dj8vtcXf.js → chunk-XXDRQBXY-BexSo0-s.js} +1 -1
  18. package/client/dist/assets/classDiagram-OUVF2IWQ-CsFIeTju.js +1 -0
  19. package/client/dist/assets/classDiagram-v2-EOCWNBFH-CsFIeTju.js +1 -0
  20. package/client/dist/assets/{cose-bilkent-JH36ORCC-y51otZKz.js → cose-bilkent-JH36ORCC-BQXzaioj.js} +1 -1
  21. package/client/dist/assets/{cynefin-VYW2F7L2-BRfS3cHo.js → cynefin-VYW2F7L2-BJIofhfe.js} +1 -1
  22. package/client/dist/assets/{cynefinDiagram-TSTJHNR4-Dpg2RtfL.js → cynefinDiagram-TSTJHNR4-DmPqTM1T.js} +1 -1
  23. package/client/dist/assets/{dagre-VKFMJZFB-BdZtXgKZ.js → dagre-VKFMJZFB-1xljvw6X.js} +1 -1
  24. package/client/dist/assets/{diagram-FQU43EPY-K-RCwWxW.js → diagram-FQU43EPY-iyL9muCG.js} +1 -1
  25. package/client/dist/assets/{diagram-G47NLZAW-CHNn7F2-.js → diagram-G47NLZAW-DREp2Th6.js} +1 -1
  26. package/client/dist/assets/{diagram-NH7WQ7WH-B3zu6xib.js → diagram-NH7WQ7WH-h0X3Is2S.js} +1 -1
  27. package/client/dist/assets/{diagram-OA4YK3LP-Wp5ju7L7.js → diagram-OA4YK3LP-Bj8YZRFJ.js} +1 -1
  28. package/client/dist/assets/{diagram-WEI45ONY-C94GpsRk.js → diagram-WEI45ONY-BZOf805d.js} +1 -1
  29. package/client/dist/assets/{ebnfDiagram-CCIWWBDH-DXrTPOrP.js → ebnfDiagram-CCIWWBDH-DO5JnXda.js} +1 -1
  30. package/client/dist/assets/{erDiagram-Q63AITRT-CGejnW0f.js → erDiagram-Q63AITRT-DRgcqg1T.js} +1 -1
  31. package/client/dist/assets/{flowDiagram-23GEKE2U-CFJMM637.js → flowDiagram-23GEKE2U-C3J9QmrW.js} +1 -1
  32. package/client/dist/assets/{ganttDiagram-NO4QXBWP-DnaH94Su.js → ganttDiagram-NO4QXBWP-BIEl3Tkm.js} +1 -1
  33. package/client/dist/assets/{gitGraphDiagram-IHSO6WYX-DT-D0gbn.js → gitGraphDiagram-IHSO6WYX-BNF0tFWC.js} +1 -1
  34. package/client/dist/assets/index-BnTOrFHb.js +829 -0
  35. package/client/dist/assets/index-CYPc6qxw.css +1 -0
  36. package/client/dist/assets/{infoDiagram-FWYZ7A6U-DW3Ps00w.js → infoDiagram-FWYZ7A6U-DEyFxiyY.js} +1 -1
  37. package/client/dist/assets/{ishikawaDiagram-FXEZZL3T-DjxjIT3n.js → ishikawaDiagram-FXEZZL3T-B_ehlg3I.js} +1 -1
  38. package/client/dist/assets/{journeyDiagram-5HDEW3XC-DTQRI93Y.js → journeyDiagram-5HDEW3XC-Dp00FyJS.js} +1 -1
  39. package/client/dist/assets/{kanban-definition-HUTT4EX6-BeDvbiEs.js → kanban-definition-HUTT4EX6-CTAf16q8.js} +1 -1
  40. package/client/dist/assets/{linear-B4foxDlh.js → linear-9vNUgmYd.js} +1 -1
  41. package/client/dist/assets/{mermaid.core-c-L4qgSB.js → mermaid.core-A6tjaEVD.js} +4 -4
  42. package/client/dist/assets/{mindmap-definition-LN4V7U3C-dh8v0J8T.js → mindmap-definition-LN4V7U3C-DRW3bmCY.js} +1 -1
  43. package/client/dist/assets/{pegDiagram-2B236MQR-D5vNrtFh.js → pegDiagram-2B236MQR-DJFCjHp2.js} +1 -1
  44. package/client/dist/assets/{pieDiagram-ENE6RG2P-CIjg_6lR.js → pieDiagram-ENE6RG2P-KRd-sGvC.js} +1 -1
  45. package/client/dist/assets/{quadrantDiagram-ABIIQ3AL-CF37qWQD.js → quadrantDiagram-ABIIQ3AL-9TLZE3Hu.js} +1 -1
  46. package/client/dist/assets/{railroadDiagram-RFXS5EU6-x0Hn30Kj.js → railroadDiagram-RFXS5EU6-y4tLtjXg.js} +1 -1
  47. package/client/dist/assets/{requirementDiagram-TGXJPOKE-BE2QnVbN.js → requirementDiagram-TGXJPOKE-B9EOQDQM.js} +1 -1
  48. package/client/dist/assets/{sankeyDiagram-HTMAVEWB-CUv6cIlV.js → sankeyDiagram-HTMAVEWB-zfwiDzkT.js} +1 -1
  49. package/client/dist/assets/{sequenceDiagram-DBY2YBRQ-C3ACj5LS.js → sequenceDiagram-DBY2YBRQ-DW1LWepL.js} +1 -1
  50. package/client/dist/assets/{sizeCapture-X5ZJPWSS-DTMIb5gX.js → sizeCapture-X5ZJPWSS-BM81Mik0.js} +1 -1
  51. package/client/dist/assets/{stateDiagram-2N3HPSRC-DI1Z8P74.js → stateDiagram-2N3HPSRC-D0EMIw1w.js} +1 -1
  52. package/client/dist/assets/stateDiagram-v2-6OUMAXLB-B3E4_xxT.js +1 -0
  53. package/client/dist/assets/{swimlanes-5IMT3BWC-CLSr9w29.js → swimlanes-5IMT3BWC-CKXNCX6M.js} +2 -2
  54. package/client/dist/assets/swimlanesDiagram-G3AALYLV-BegQBqnC.js +8 -0
  55. package/client/dist/assets/{timeline-definition-FHXFAJF6-BTWmUhDh.js → timeline-definition-FHXFAJF6-ByzIfvL5.js} +1 -1
  56. package/client/dist/assets/{vennDiagram-L72KCM5P-Ce1dlLCM.js → vennDiagram-L72KCM5P-Xep38xBH.js} +1 -1
  57. package/client/dist/assets/{wardleyDiagram-EHGQE667-ClOE-aae.js → wardleyDiagram-EHGQE667-DKWDpx6g.js} +1 -1
  58. package/client/dist/assets/{xychartDiagram-FW5EYKEG-Fa2pqWKw.js → xychartDiagram-FW5EYKEG-BGcwZTnu.js} +1 -1
  59. package/client/dist/index.html +27 -27
  60. package/lib/claude-cli.mjs +173 -173
  61. package/lib/preflight.mjs +252 -252
  62. package/lib/probe-path.mjs +84 -84
  63. package/lib/server.mjs +369 -369
  64. package/lib/util.mjs +157 -157
  65. package/lib/win32-spawn.mjs +253 -253
  66. package/package.json +1 -1
  67. package/scripts/deploy-procs.mjs +208 -208
  68. package/scripts/deploy-swap.mjs +276 -276
  69. package/scripts/kill-targets.js +140 -140
  70. package/scripts/repair-claude-json.mjs +295 -295
  71. package/server/dist/config/default-actions.json +90 -90
  72. package/server/dist/core/grade-runner.d.ts +4 -4
  73. package/server/dist/core/grade-runner.d.ts.map +1 -1
  74. package/server/dist/core/grade-runner.js +51 -26
  75. package/server/dist/core/grade-runner.js.map +1 -1
  76. package/server/dist/core/grade-target.d.ts +8 -0
  77. package/server/dist/core/grade-target.d.ts.map +1 -1
  78. package/server/dist/core/grade-target.js +10 -0
  79. package/server/dist/core/grade-target.js.map +1 -1
  80. package/server/dist/core/mission-context/association.d.ts +46 -0
  81. package/server/dist/core/mission-context/association.d.ts.map +1 -1
  82. package/server/dist/core/mission-context/association.js +69 -0
  83. package/server/dist/core/mission-context/association.js.map +1 -1
  84. package/server/dist/core/mission-context/resolver-iterate.d.ts +6 -0
  85. package/server/dist/core/mission-context/resolver-iterate.d.ts.map +1 -0
  86. package/server/dist/core/mission-context/resolver-iterate.js +202 -0
  87. package/server/dist/core/mission-context/resolver-iterate.js.map +1 -0
  88. package/server/dist/core/mission-context/resolver-parts.d.ts +20 -0
  89. package/server/dist/core/mission-context/resolver-parts.d.ts.map +1 -1
  90. package/server/dist/core/mission-context/resolver-parts.js +92 -0
  91. package/server/dist/core/mission-context/resolver-parts.js.map +1 -1
  92. package/server/dist/core/mission-context/resolver.d.ts +1 -1
  93. package/server/dist/core/mission-context/resolver.d.ts.map +1 -1
  94. package/server/dist/core/mission-context/resolver.js +17 -199
  95. package/server/dist/core/mission-context/resolver.js.map +1 -1
  96. package/server/dist/core/mission-context/run-id-recovery.d.ts +21 -5
  97. package/server/dist/core/mission-context/run-id-recovery.d.ts.map +1 -1
  98. package/server/dist/core/mission-context/run-id-recovery.js +32 -5
  99. package/server/dist/core/mission-context/run-id-recovery.js.map +1 -1
  100. package/server/dist/core/mission-context/scenario.d.ts +18 -11
  101. package/server/dist/core/mission-context/scenario.d.ts.map +1 -1
  102. package/server/dist/core/mission-context/scenario.js +40 -3
  103. package/server/dist/core/mission-context/scenario.js.map +1 -1
  104. package/server/dist/core/path-guard.d.ts +1 -1
  105. package/server/dist/core/path-guard.d.ts.map +1 -1
  106. package/server/dist/core/path-guard.js +9 -2
  107. package/server/dist/core/path-guard.js.map +1 -1
  108. package/server/dist/core/shipslog-docs-reader.d.ts +4 -0
  109. package/server/dist/core/shipslog-docs-reader.d.ts.map +1 -0
  110. package/server/dist/core/shipslog-docs-reader.js +181 -0
  111. package/server/dist/core/shipslog-docs-reader.js.map +1 -0
  112. package/server/dist/core/shipslog-docs-types.d.ts +15 -0
  113. package/server/dist/core/shipslog-docs-types.d.ts.map +1 -0
  114. package/server/dist/core/shipslog-docs-types.js +14 -0
  115. package/server/dist/core/shipslog-docs-types.js.map +1 -0
  116. package/server/dist/core/triage-cli-runner.d.ts.map +1 -1
  117. package/server/dist/core/triage-cli-runner.js +29 -10
  118. package/server/dist/core/triage-cli-runner.js.map +1 -1
  119. package/server/dist/core/uv-runner.d.ts +23 -0
  120. package/server/dist/core/uv-runner.d.ts.map +1 -0
  121. package/server/dist/core/uv-runner.js +39 -0
  122. package/server/dist/core/uv-runner.js.map +1 -0
  123. package/server/dist/external/design-review/serve.js +27 -27
  124. package/server/dist/external/file/exists-routes.d.ts +7 -0
  125. package/server/dist/external/file/exists-routes.d.ts.map +1 -0
  126. package/server/dist/external/file/exists-routes.js +91 -0
  127. package/server/dist/external/file/exists-routes.js.map +1 -0
  128. package/server/dist/external/mission-context/association-write.d.ts +22 -0
  129. package/server/dist/external/mission-context/association-write.d.ts.map +1 -0
  130. package/server/dist/external/mission-context/association-write.js +90 -0
  131. package/server/dist/external/mission-context/association-write.js.map +1 -0
  132. package/server/dist/external/mission-context/routes.d.ts.map +1 -1
  133. package/server/dist/external/mission-context/routes.js +18 -31
  134. package/server/dist/external/mission-context/routes.js.map +1 -1
  135. package/server/dist/external/org/audit-log.d.ts +27 -0
  136. package/server/dist/external/org/audit-log.d.ts.map +1 -0
  137. package/server/dist/external/org/audit-log.js +92 -0
  138. package/server/dist/external/org/audit-log.js.map +1 -0
  139. package/server/dist/external/org/beat-register.d.ts +15 -22
  140. package/server/dist/external/org/beat-register.d.ts.map +1 -1
  141. package/server/dist/external/org/beat-register.js +37 -32
  142. package/server/dist/external/org/beat-register.js.map +1 -1
  143. package/server/dist/external/org/file-read.d.ts +16 -0
  144. package/server/dist/external/org/file-read.d.ts.map +1 -1
  145. package/server/dist/external/org/file-read.js +86 -46
  146. package/server/dist/external/org/file-read.js.map +1 -1
  147. package/server/dist/external/org/file-write-core.d.ts +18 -0
  148. package/server/dist/external/org/file-write-core.d.ts.map +1 -0
  149. package/server/dist/external/org/file-write-core.js +97 -0
  150. package/server/dist/external/org/file-write-core.js.map +1 -0
  151. package/server/dist/external/org/file-write.d.ts +25 -0
  152. package/server/dist/external/org/file-write.d.ts.map +1 -1
  153. package/server/dist/external/org/file-write.js +82 -132
  154. package/server/dist/external/org/file-write.js.map +1 -1
  155. package/server/dist/external/org/last-run.d.ts +25 -16
  156. package/server/dist/external/org/last-run.d.ts.map +1 -1
  157. package/server/dist/external/org/last-run.js +78 -64
  158. package/server/dist/external/org/last-run.js.map +1 -1
  159. package/server/dist/external/org/lead-doc-read.d.ts +21 -0
  160. package/server/dist/external/org/lead-doc-read.d.ts.map +1 -0
  161. package/server/dist/external/org/lead-doc-read.js +84 -0
  162. package/server/dist/external/org/lead-doc-read.js.map +1 -0
  163. package/server/dist/external/org/mount.d.ts +12 -0
  164. package/server/dist/external/org/mount.d.ts.map +1 -0
  165. package/server/dist/external/org/mount.js +34 -0
  166. package/server/dist/external/org/mount.js.map +1 -0
  167. package/server/dist/external/org/org-chart-lookup.d.ts +13 -0
  168. package/server/dist/external/org/org-chart-lookup.d.ts.map +1 -1
  169. package/server/dist/external/org/org-chart-lookup.js +40 -5
  170. package/server/dist/external/org/org-chart-lookup.js.map +1 -1
  171. package/server/dist/external/org/org-chart.d.ts +21 -12
  172. package/server/dist/external/org/org-chart.d.ts.map +1 -1
  173. package/server/dist/external/org/org-chart.js +50 -32
  174. package/server/dist/external/org/org-chart.js.map +1 -1
  175. package/server/dist/external/org/role-extract.d.ts +8 -0
  176. package/server/dist/external/org/role-extract.d.ts.map +1 -0
  177. package/server/dist/external/org/role-extract.js +72 -0
  178. package/server/dist/external/org/role-extract.js.map +1 -0
  179. package/server/dist/external/org/usage.d.ts +15 -11
  180. package/server/dist/external/org/usage.d.ts.map +1 -1
  181. package/server/dist/external/org/usage.js +64 -54
  182. package/server/dist/external/org/usage.js.map +1 -1
  183. package/server/dist/external/routes.d.ts +1 -1
  184. package/server/dist/external/routes.d.ts.map +1 -1
  185. package/server/dist/external/routes.js +19 -17
  186. package/server/dist/external/routes.js.map +1 -1
  187. package/server/dist/external/shipslog-docs/routes.d.ts +10 -0
  188. package/server/dist/external/shipslog-docs/routes.d.ts.map +1 -0
  189. package/server/dist/external/shipslog-docs/routes.js +41 -0
  190. package/server/dist/external/shipslog-docs/routes.js.map +1 -0
  191. package/server/dist/routes/grade.d.ts.map +1 -1
  192. package/server/dist/routes/grade.js +3 -2
  193. package/server/dist/routes/grade.js.map +1 -1
  194. package/server/dist/routes/org-leads-composite.d.ts +21 -0
  195. package/server/dist/routes/org-leads-composite.d.ts.map +1 -0
  196. package/server/dist/routes/org-leads-composite.js +95 -0
  197. package/server/dist/routes/org-leads-composite.js.map +1 -0
  198. package/server/dist/routes/org.d.ts +15 -0
  199. package/server/dist/routes/org.d.ts.map +1 -0
  200. package/server/dist/routes/org.js +198 -0
  201. package/server/dist/routes/org.js.map +1 -0
  202. package/server/dist/terminal/pty-manager.d.ts +9 -0
  203. package/server/dist/terminal/pty-manager.d.ts.map +1 -1
  204. package/server/dist/terminal/pty-manager.js +15 -0
  205. package/server/dist/terminal/pty-manager.js.map +1 -1
  206. package/server/dist/terminal/replay-snapshot.d.ts +10 -1
  207. package/server/dist/terminal/replay-snapshot.d.ts.map +1 -1
  208. package/server/dist/terminal/replay-snapshot.js +36 -1
  209. package/server/dist/terminal/replay-snapshot.js.map +1 -1
  210. package/server/dist/terminal/ws-upgrade-handler.d.ts +17 -1
  211. package/server/dist/terminal/ws-upgrade-handler.d.ts.map +1 -1
  212. package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts +1 -0
  213. package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts.map +1 -1
  214. package/server/dist/terminal/ws-upgrade-handler.fixtures.js +3 -2
  215. package/server/dist/terminal/ws-upgrade-handler.fixtures.js.map +1 -1
  216. package/server/dist/terminal/ws-upgrade-handler.js +45 -4
  217. package/server/dist/terminal/ws-upgrade-handler.js.map +1 -1
  218. package/server/dist/test/python-spawn-guard-util.d.ts +14 -0
  219. package/server/dist/test/python-spawn-guard-util.d.ts.map +1 -0
  220. package/server/dist/test/python-spawn-guard-util.js +124 -0
  221. package/server/dist/test/python-spawn-guard-util.js.map +1 -0
  222. package/server/dist/types/org.d.ts +115 -0
  223. package/server/dist/types/org.d.ts.map +1 -0
  224. package/server/dist/types/org.js +16 -0
  225. package/server/dist/types/org.js.map +1 -0
  226. package/server/package.json +1 -1
  227. package/server/profiles/PROFILE_SCHEMA_VERSION +1 -1
  228. package/server/profiles/README.md +27 -27
  229. package/server/profiles/python-plugin-monorepo.json +35 -35
  230. package/server/profiles/supabase-nextjs.json +253 -253
  231. package/server/profiles/vite-hono.json +92 -92
  232. package/client/dist/assets/MarkdownEditorModal-CP5yG9OU.js +0 -212
  233. package/client/dist/assets/channel-BNXbCvDS.js +0 -1
  234. package/client/dist/assets/classDiagram-OUVF2IWQ-w-wCtLx3.js +0 -1
  235. package/client/dist/assets/classDiagram-v2-EOCWNBFH-w-wCtLx3.js +0 -1
  236. package/client/dist/assets/index-CU2QJgvx.js +0 -609
  237. package/client/dist/assets/index-ftvVcUT8.css +0 -1
  238. package/client/dist/assets/stateDiagram-v2-6OUMAXLB-DvwiHlJv.js +0 -1
  239. 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 resolvePython (test seam). */
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 `grade.py <target> --format json` → map the
59
- * outcome to an honest {@link GradeOutcome}. Never throws for a grade failure;
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":"AAsCA,OAAO,EAIL,KAAK,KAAK,EACX,MAAM,sBAAsB,CAAC;AAU9B;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,4DAA4D;IAC5D,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,CA6FvB"}
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 <target> --format json` is spawned with **shell:false** and a
10
- * **fixed-literal python binary** (resolved by TEST-RUN, python3→python→py,
11
- * reusing `readiness-probe.resolvePython`). The target is passed as a **fixed
12
- * argv position** — never interpolated into a shell string, so no shell
13
- * metacharacter in a user-entered path/URL can reach a shell (there is none).
14
- * Mirrors the ADR-044 #9 / `pr-status.ts` spawn discipline. Must NOT trip
15
- * Semgrep `spawn-shell-true`.
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, resolvePython, } from "./readiness-probe.js";
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 `grade.py <target> --format json` → map the
83
- * outcome to an honest {@link GradeOutcome}. Never throws for a grade failure;
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 + a working python. Either missing is an
102
- // honest "engine unavailable — run npx …" (reuse the readiness repair).
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 py = await resolvePython(run);
112
- if (!py) {
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: "No working Python (3.11+) was found.",
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 baseEnv = deps.baseEnv ?? process.env;
126
- const env = { ...baseEnv };
148
+ const env = { ...uv.env };
127
149
  if (complianceRoot)
128
150
  env[ENV_COMPLIANCE_ROOT] = complianceRoot;
129
- // Fixed argv: options first, then a `--` END-OF-OPTIONS separator, then the
130
- // target as the sole positional. shell:false already blocks shell injection;
131
- // the `--` additionally blocks ARGUMENT injection — a target like `--no-clone`
132
- // or `--allow-network-private` is treated as a path, never a grade.py flag
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 args = [script, "--format", "json", "--", target];
135
- const r = await spawn(py.bin, args, { env, timeoutMs });
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: "Python couldn't start on this machine.",
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":"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"}
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"}