@svenroth-ai/shipwright 0.24.7-next.0 → 0.25.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 (175) hide show
  1. package/client/dist/assets/{EmbeddedTerminal-D2BLGWdW.js → EmbeddedTerminal-5QvKe3_a.js} +20 -20
  2. package/client/dist/assets/{abnfDiagram-VRR7QNED-C-W_2Jd4.js → abnfDiagram-VRR7QNED-CXi9HegQ.js} +1 -1
  3. package/client/dist/assets/{arc-CpqwESP5.js → arc-DLh4GiqR.js} +1 -1
  4. package/client/dist/assets/{architectureDiagram-ZJ3FMSHR-DZVZ895V.js → architectureDiagram-ZJ3FMSHR-DUypQ8dQ.js} +1 -1
  5. package/client/dist/assets/{blockDiagram-677ZJIJ3-CCCZiAA7.js → blockDiagram-677ZJIJ3-D2cVMKJG.js} +1 -1
  6. package/client/dist/assets/{c4Diagram-LMCZKHZV-Bg1beZAE.js → c4Diagram-LMCZKHZV-DtruBGJw.js} +1 -1
  7. package/client/dist/assets/channel-C_k-9jsa.js +1 -0
  8. package/client/dist/assets/{chunk-2Q5K7J3B-CoaXSarh.js → chunk-2Q5K7J3B-CAfQkFw2.js} +1 -1
  9. package/client/dist/assets/{chunk-32BRIVSS-CeFXS-CM.js → chunk-32BRIVSS-CPWXoLnQ.js} +1 -1
  10. package/client/dist/assets/{chunk-5VM5RSS4-QyJMVe0m.js → chunk-5VM5RSS4-xVc3oppQ.js} +1 -1
  11. package/client/dist/assets/{chunk-EX3LRPZG-BIOtWVF8.js → chunk-EX3LRPZG-CUpl6fRR.js} +1 -1
  12. package/client/dist/assets/{chunk-JWPE2WC7-Dcq-lWyX.js → chunk-JWPE2WC7-NejUp56x.js} +1 -1
  13. package/client/dist/assets/{chunk-MOJQB5TN-C95323ja.js → chunk-MOJQB5TN-C9-2lLg0.js} +1 -1
  14. package/client/dist/assets/{chunk-RYQCIY6F-C0HPwpWy.js → chunk-RYQCIY6F-BAPtwABy.js} +1 -1
  15. package/client/dist/assets/{chunk-V7JOEXUC-BPrTbZqA.js → chunk-V7JOEXUC-Dwzihw26.js} +1 -1
  16. package/client/dist/assets/{chunk-VR4S4FIN--BCnNoqt.js → chunk-VR4S4FIN-9-iArFJM.js} +1 -1
  17. package/client/dist/assets/{chunk-XXDRQBXY-Dj8vtcXf.js → chunk-XXDRQBXY-DiWHOrqe.js} +1 -1
  18. package/client/dist/assets/classDiagram-OUVF2IWQ-CsEPq9Ac.js +1 -0
  19. package/client/dist/assets/classDiagram-v2-EOCWNBFH-CsEPq9Ac.js +1 -0
  20. package/client/dist/assets/{cose-bilkent-JH36ORCC-y51otZKz.js → cose-bilkent-JH36ORCC-Cp04EOcH.js} +1 -1
  21. package/client/dist/assets/{cynefin-VYW2F7L2-BRfS3cHo.js → cynefin-VYW2F7L2-D--GN1v8.js} +1 -1
  22. package/client/dist/assets/{cynefinDiagram-TSTJHNR4-Dpg2RtfL.js → cynefinDiagram-TSTJHNR4-BGH0o_qp.js} +1 -1
  23. package/client/dist/assets/{dagre-VKFMJZFB-BdZtXgKZ.js → dagre-VKFMJZFB-DSKkIKlj.js} +1 -1
  24. package/client/dist/assets/{diagram-FQU43EPY-K-RCwWxW.js → diagram-FQU43EPY-Cs_C4lb-.js} +1 -1
  25. package/client/dist/assets/{diagram-G47NLZAW-CHNn7F2-.js → diagram-G47NLZAW-oDtAA8O_.js} +1 -1
  26. package/client/dist/assets/{diagram-NH7WQ7WH-B3zu6xib.js → diagram-NH7WQ7WH-BiFMjqSH.js} +1 -1
  27. package/client/dist/assets/{diagram-OA4YK3LP-Wp5ju7L7.js → diagram-OA4YK3LP-Ccs3thCj.js} +1 -1
  28. package/client/dist/assets/{diagram-WEI45ONY-C94GpsRk.js → diagram-WEI45ONY-CdZNqgO3.js} +1 -1
  29. package/client/dist/assets/{ebnfDiagram-CCIWWBDH-DXrTPOrP.js → ebnfDiagram-CCIWWBDH-CapTA0VL.js} +1 -1
  30. package/client/dist/assets/{erDiagram-Q63AITRT-CGejnW0f.js → erDiagram-Q63AITRT-BcRNEP8s.js} +1 -1
  31. package/client/dist/assets/{flowDiagram-23GEKE2U-CFJMM637.js → flowDiagram-23GEKE2U-CJ_zF7e_.js} +1 -1
  32. package/client/dist/assets/{ganttDiagram-NO4QXBWP-DnaH94Su.js → ganttDiagram-NO4QXBWP-CnJdcg9A.js} +1 -1
  33. package/client/dist/assets/{gitGraphDiagram-IHSO6WYX-DT-D0gbn.js → gitGraphDiagram-IHSO6WYX-YTUQ_ELk.js} +1 -1
  34. package/client/dist/assets/index-6nZ1bt0a.css +1 -0
  35. package/client/dist/assets/index-irQhGNpn.js +828 -0
  36. package/client/dist/assets/{infoDiagram-FWYZ7A6U-DW3Ps00w.js → infoDiagram-FWYZ7A6U-CLOP_ZWD.js} +1 -1
  37. package/client/dist/assets/{ishikawaDiagram-FXEZZL3T-DjxjIT3n.js → ishikawaDiagram-FXEZZL3T-aFTIzr7o.js} +1 -1
  38. package/client/dist/assets/{journeyDiagram-5HDEW3XC-DTQRI93Y.js → journeyDiagram-5HDEW3XC-CbPJB4xd.js} +1 -1
  39. package/client/dist/assets/{kanban-definition-HUTT4EX6-BeDvbiEs.js → kanban-definition-HUTT4EX6-BoyhytIS.js} +1 -1
  40. package/client/dist/assets/{linear-B4foxDlh.js → linear-1VXA-uBg.js} +1 -1
  41. package/client/dist/assets/{mermaid.core-c-L4qgSB.js → mermaid.core-D_lO2yK9.js} +4 -4
  42. package/client/dist/assets/{mindmap-definition-LN4V7U3C-dh8v0J8T.js → mindmap-definition-LN4V7U3C-iFK7LXMx.js} +1 -1
  43. package/client/dist/assets/{pegDiagram-2B236MQR-D5vNrtFh.js → pegDiagram-2B236MQR-DNmcmfA-.js} +1 -1
  44. package/client/dist/assets/{pieDiagram-ENE6RG2P-CIjg_6lR.js → pieDiagram-ENE6RG2P-ekx83O5b.js} +1 -1
  45. package/client/dist/assets/{quadrantDiagram-ABIIQ3AL-CF37qWQD.js → quadrantDiagram-ABIIQ3AL-DayyD1l8.js} +1 -1
  46. package/client/dist/assets/{railroadDiagram-RFXS5EU6-x0Hn30Kj.js → railroadDiagram-RFXS5EU6-Bdgz7S6G.js} +1 -1
  47. package/client/dist/assets/{requirementDiagram-TGXJPOKE-BE2QnVbN.js → requirementDiagram-TGXJPOKE-szP3Muld.js} +1 -1
  48. package/client/dist/assets/{sankeyDiagram-HTMAVEWB-CUv6cIlV.js → sankeyDiagram-HTMAVEWB-Ct3rzgUj.js} +1 -1
  49. package/client/dist/assets/{sequenceDiagram-DBY2YBRQ-C3ACj5LS.js → sequenceDiagram-DBY2YBRQ-_69EfmOU.js} +1 -1
  50. package/client/dist/assets/{sizeCapture-X5ZJPWSS-DTMIb5gX.js → sizeCapture-X5ZJPWSS-BSOU06J2.js} +1 -1
  51. package/client/dist/assets/{stateDiagram-2N3HPSRC-DI1Z8P74.js → stateDiagram-2N3HPSRC-HmOmFwQm.js} +1 -1
  52. package/client/dist/assets/stateDiagram-v2-6OUMAXLB-BW8H33dv.js +1 -0
  53. package/client/dist/assets/{swimlanes-5IMT3BWC-CLSr9w29.js → swimlanes-5IMT3BWC-CVg_4oT7.js} +2 -2
  54. package/client/dist/assets/swimlanesDiagram-G3AALYLV-BaRlxcPD.js +8 -0
  55. package/client/dist/assets/{timeline-definition-FHXFAJF6-BTWmUhDh.js → timeline-definition-FHXFAJF6-CBBaDKXm.js} +1 -1
  56. package/client/dist/assets/{vennDiagram-L72KCM5P-Ce1dlLCM.js → vennDiagram-L72KCM5P-CBXiWPMc.js} +1 -1
  57. package/client/dist/assets/{wardleyDiagram-EHGQE667-ClOE-aae.js → wardleyDiagram-EHGQE667-uhBCZoW0.js} +1 -1
  58. package/client/dist/assets/{xychartDiagram-FW5EYKEG-Fa2pqWKw.js → xychartDiagram-FW5EYKEG-xxE_wY5O.js} +1 -1
  59. package/client/dist/index.html +2 -2
  60. package/package.json +68 -68
  61. package/server/dist/core/grade-runner.d.ts +4 -4
  62. package/server/dist/core/grade-runner.d.ts.map +1 -1
  63. package/server/dist/core/grade-runner.js +51 -26
  64. package/server/dist/core/grade-runner.js.map +1 -1
  65. package/server/dist/core/grade-target.d.ts +8 -0
  66. package/server/dist/core/grade-target.d.ts.map +1 -1
  67. package/server/dist/core/grade-target.js +10 -0
  68. package/server/dist/core/grade-target.js.map +1 -1
  69. package/server/dist/core/triage-cli-runner.d.ts.map +1 -1
  70. package/server/dist/core/triage-cli-runner.js +29 -10
  71. package/server/dist/core/triage-cli-runner.js.map +1 -1
  72. package/server/dist/core/uv-runner.d.ts +23 -0
  73. package/server/dist/core/uv-runner.d.ts.map +1 -0
  74. package/server/dist/core/uv-runner.js +39 -0
  75. package/server/dist/core/uv-runner.js.map +1 -0
  76. package/server/dist/external/file/exists-routes.d.ts +7 -0
  77. package/server/dist/external/file/exists-routes.d.ts.map +1 -0
  78. package/server/dist/external/file/exists-routes.js +91 -0
  79. package/server/dist/external/file/exists-routes.js.map +1 -0
  80. package/server/dist/external/org/audit-log.d.ts +27 -0
  81. package/server/dist/external/org/audit-log.d.ts.map +1 -0
  82. package/server/dist/external/org/audit-log.js +92 -0
  83. package/server/dist/external/org/audit-log.js.map +1 -0
  84. package/server/dist/external/org/beat-register.d.ts +15 -22
  85. package/server/dist/external/org/beat-register.d.ts.map +1 -1
  86. package/server/dist/external/org/beat-register.js +37 -32
  87. package/server/dist/external/org/beat-register.js.map +1 -1
  88. package/server/dist/external/org/file-read.d.ts +16 -0
  89. package/server/dist/external/org/file-read.d.ts.map +1 -1
  90. package/server/dist/external/org/file-read.js +86 -46
  91. package/server/dist/external/org/file-read.js.map +1 -1
  92. package/server/dist/external/org/file-write-core.d.ts +18 -0
  93. package/server/dist/external/org/file-write-core.d.ts.map +1 -0
  94. package/server/dist/external/org/file-write-core.js +97 -0
  95. package/server/dist/external/org/file-write-core.js.map +1 -0
  96. package/server/dist/external/org/file-write.d.ts +25 -0
  97. package/server/dist/external/org/file-write.d.ts.map +1 -1
  98. package/server/dist/external/org/file-write.js +82 -132
  99. package/server/dist/external/org/file-write.js.map +1 -1
  100. package/server/dist/external/org/last-run.d.ts +25 -16
  101. package/server/dist/external/org/last-run.d.ts.map +1 -1
  102. package/server/dist/external/org/last-run.js +78 -64
  103. package/server/dist/external/org/last-run.js.map +1 -1
  104. package/server/dist/external/org/lead-doc-read.d.ts +21 -0
  105. package/server/dist/external/org/lead-doc-read.d.ts.map +1 -0
  106. package/server/dist/external/org/lead-doc-read.js +84 -0
  107. package/server/dist/external/org/lead-doc-read.js.map +1 -0
  108. package/server/dist/external/org/mount.d.ts +12 -0
  109. package/server/dist/external/org/mount.d.ts.map +1 -0
  110. package/server/dist/external/org/mount.js +34 -0
  111. package/server/dist/external/org/mount.js.map +1 -0
  112. package/server/dist/external/org/org-chart-lookup.d.ts +13 -0
  113. package/server/dist/external/org/org-chart-lookup.d.ts.map +1 -1
  114. package/server/dist/external/org/org-chart-lookup.js +40 -5
  115. package/server/dist/external/org/org-chart-lookup.js.map +1 -1
  116. package/server/dist/external/org/org-chart.d.ts +21 -12
  117. package/server/dist/external/org/org-chart.d.ts.map +1 -1
  118. package/server/dist/external/org/org-chart.js +50 -32
  119. package/server/dist/external/org/org-chart.js.map +1 -1
  120. package/server/dist/external/org/role-extract.d.ts +8 -0
  121. package/server/dist/external/org/role-extract.d.ts.map +1 -0
  122. package/server/dist/external/org/role-extract.js +72 -0
  123. package/server/dist/external/org/role-extract.js.map +1 -0
  124. package/server/dist/external/org/usage.d.ts +15 -11
  125. package/server/dist/external/org/usage.d.ts.map +1 -1
  126. package/server/dist/external/org/usage.js +64 -54
  127. package/server/dist/external/org/usage.js.map +1 -1
  128. package/server/dist/external/routes.d.ts +1 -1
  129. package/server/dist/external/routes.d.ts.map +1 -1
  130. package/server/dist/external/routes.js +10 -11
  131. package/server/dist/external/routes.js.map +1 -1
  132. package/server/dist/routes/grade.d.ts.map +1 -1
  133. package/server/dist/routes/grade.js +3 -2
  134. package/server/dist/routes/grade.js.map +1 -1
  135. package/server/dist/routes/org-leads-composite.d.ts +21 -0
  136. package/server/dist/routes/org-leads-composite.d.ts.map +1 -0
  137. package/server/dist/routes/org-leads-composite.js +95 -0
  138. package/server/dist/routes/org-leads-composite.js.map +1 -0
  139. package/server/dist/routes/org.d.ts +15 -0
  140. package/server/dist/routes/org.d.ts.map +1 -0
  141. package/server/dist/routes/org.js +198 -0
  142. package/server/dist/routes/org.js.map +1 -0
  143. package/server/dist/terminal/pty-manager.d.ts +9 -0
  144. package/server/dist/terminal/pty-manager.d.ts.map +1 -1
  145. package/server/dist/terminal/pty-manager.js +15 -0
  146. package/server/dist/terminal/pty-manager.js.map +1 -1
  147. package/server/dist/terminal/replay-snapshot.d.ts +10 -1
  148. package/server/dist/terminal/replay-snapshot.d.ts.map +1 -1
  149. package/server/dist/terminal/replay-snapshot.js +36 -1
  150. package/server/dist/terminal/replay-snapshot.js.map +1 -1
  151. package/server/dist/terminal/ws-upgrade-handler.d.ts +17 -1
  152. package/server/dist/terminal/ws-upgrade-handler.d.ts.map +1 -1
  153. package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts +1 -0
  154. package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts.map +1 -1
  155. package/server/dist/terminal/ws-upgrade-handler.fixtures.js +3 -2
  156. package/server/dist/terminal/ws-upgrade-handler.fixtures.js.map +1 -1
  157. package/server/dist/terminal/ws-upgrade-handler.js +45 -4
  158. package/server/dist/terminal/ws-upgrade-handler.js.map +1 -1
  159. package/server/dist/test/python-spawn-guard-util.d.ts +14 -0
  160. package/server/dist/test/python-spawn-guard-util.d.ts.map +1 -0
  161. package/server/dist/test/python-spawn-guard-util.js +124 -0
  162. package/server/dist/test/python-spawn-guard-util.js.map +1 -0
  163. package/server/dist/types/org.d.ts +115 -0
  164. package/server/dist/types/org.d.ts.map +1 -0
  165. package/server/dist/types/org.js +16 -0
  166. package/server/dist/types/org.js.map +1 -0
  167. package/server/package.json +1 -1
  168. package/client/dist/assets/MarkdownEditorModal-CP5yG9OU.js +0 -212
  169. package/client/dist/assets/channel-BNXbCvDS.js +0 -1
  170. package/client/dist/assets/classDiagram-OUVF2IWQ-w-wCtLx3.js +0 -1
  171. package/client/dist/assets/classDiagram-v2-EOCWNBFH-w-wCtLx3.js +0 -1
  172. package/client/dist/assets/index-CU2QJgvx.js +0 -609
  173. package/client/dist/assets/index-ftvVcUT8.css +0 -1
  174. package/client/dist/assets/stateDiagram-v2-6OUMAXLB-DvwiHlJv.js +0 -1
  175. package/client/dist/assets/swimlanesDiagram-G3AALYLV-JTQZTlZ3.js +0 -8
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"triage-cli-runner.d.ts","sourceRoot":"","sources":["../../src/core/triage-cli-runner.ts"],"names":[],"mappings":"AAeA,OAAO,EAA4E,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE5H,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KACnD,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAEnC,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAC7B;AAED,8EAA8E;AAC9E,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,SAAS,GAAG,gBAAgB,CAAM,GAAG,MAAM,GAAG,IAAI,CAW/H;AAED,eAAO,MAAM,qBAAqB,EAAE,cAsBhC,CAAC;AAML,wBAAsB,uBAAuB,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAIxG;AAMD,0FAA0F;AAC1F,wBAAsB,YAAY,CAChC,KAAK,EAAE,iBAAiB,EACxB,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,eAAe,CAAC,CAgC1B"}
1
+ {"version":3,"file":"triage-cli-runner.d.ts","sourceRoot":"","sources":["../../src/core/triage-cli-runner.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAiD,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAGjG,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KACnD,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAEnC,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAC7B;AAED,8EAA8E;AAC9E,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,SAAS,GAAG,gBAAgB,CAAM,GAAG,MAAM,GAAG,IAAI,CAW/H;AAED,eAAO,MAAM,qBAAqB,EAAE,cAsBhC,CAAC;AAML,wBAAsB,uBAAuB,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAMxG;AAMD,0FAA0F;AAC1F,wBAAsB,YAAY,CAChC,KAAK,EAAE,iBAAiB,EACxB,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,eAAe,CAAC,CAsC1B"}
@@ -3,15 +3,28 @@
3
3
  *
4
4
  * Triage reads remain native TypeScript because they are latency-sensitive and
5
5
  * have no mutual-exclusion requirement. Every transition, however, executes
6
- * the Python CLI so its FileLock owns the compare-and-swap, residence choice,
7
- * schema bootstrap and record-boundary handling. There is deliberately no
6
+ * the Python CLI via `uv run --python ">=3.11"` so its FileLock owns the
7
+ * compare-and-swap, residence choice, schema bootstrap and record-boundary
8
+ * handling — in a Python that actually satisfies triage_cli.py's own floor,
9
+ * not whichever of python3/python/py happened to answer `--version` first
10
+ * (the grade.py sibling of this bug; see `uv-runner.ts`). triage_cli.py has
11
+ * no `pyproject.toml` of its own, so this is `--python`, not `--project`
12
+ * (verified: `uv run --python ">=3.11" triage_cli.py --help` exits 0).
13
+ * `--no-project` is load-bearing, not decorative (Stage-3 doubt review,
14
+ * 2026-08-26): without it, `uv run` walks up from the SPAWNING PROCESS's cwd
15
+ * (never from the script's own path) looking for an ambient `pyproject.toml`
16
+ * to activate — a webui deployment nested inside another Python-tooled
17
+ * checkout would otherwise silently run this script against an unrelated
18
+ * project. `--no-project` makes "no ambient project" structural rather than
19
+ * an accident of this repo currently having none. There is deliberately no
8
20
  * TypeScript append fallback: an unavailable writer disables the UI instead.
9
21
  */
10
22
  import { execFile } from "node:child_process";
11
23
  import { existsSync } from "node:fs";
12
24
  import os from "node:os";
13
25
  import path from "node:path";
14
- import { defaultRun, READINESS_REPAIR_COMMAND, resolvePython, shipwrightCacheRoot } from "./readiness-probe.js";
26
+ import { READINESS_REPAIR_COMMAND, shipwrightCacheRoot } from "./readiness-probe.js";
27
+ import { resolveUv } from "./uv-runner.js";
15
28
  export const TRIAGE_CLI_TIMEOUT_MS = 30_000;
16
29
  /** Resolve the single cache-owned CLI shipped with the Shipwright runtime. */
17
30
  export function resolveTriageCliScript(deps = {}) {
@@ -47,8 +60,9 @@ function unavailable(reason) {
47
60
  export async function triageWriteAvailability(deps = {}) {
48
61
  if (!resolveTriageCliScript(deps))
49
62
  return unavailable("The triage write engine isn't installed.");
50
- if (!(await resolvePython(deps.run ?? defaultRun)))
51
- return unavailable("No working Python (3.11+) was found.");
63
+ if (!(await resolveUv({ run: deps.run, homeDir: deps.homeDir, baseEnv: deps.baseEnv }))) {
64
+ return unavailable("uv isn't installed — triage writes need it to run in a managed Python 3.11+.");
65
+ }
52
66
  return { available: true };
53
67
  }
54
68
  function cleanStderr(stderr) {
@@ -59,13 +73,18 @@ export async function runTriageCli(input, deps = {}) {
59
73
  const script = resolveTriageCliScript(deps);
60
74
  if (!script)
61
75
  return { kind: "engine-unavailable", reason: "The triage write engine isn't installed.", repairCommand: READINESS_REPAIR_COMMAND };
62
- const python = await resolvePython(deps.run ?? defaultRun);
63
- if (!python)
64
- return { kind: "engine-unavailable", reason: "No working Python (3.11+) was found.", repairCommand: READINESS_REPAIR_COMMAND };
76
+ const uv = await resolveUv({ run: deps.run, homeDir: deps.homeDir, baseEnv: deps.baseEnv });
77
+ if (!uv) {
78
+ return {
79
+ kind: "engine-unavailable",
80
+ reason: "uv isn't installed — triage writes need it to run in a managed Python 3.11+.",
81
+ repairCommand: READINESS_REPAIR_COMMAND,
82
+ };
83
+ }
65
84
  const spawn = deps.spawn ?? defaultSpawnTriageCli;
66
- const result = await spawn(python.bin, [script, "--project-root", input.projectRoot, input.operation, input.itemId, ...input.args, "--json"], { timeoutMs: deps.timeoutMs ?? TRIAGE_CLI_TIMEOUT_MS, env: deps.baseEnv ?? process.env });
85
+ const result = await spawn(uv.bin, ["run", "--no-project", "--python", ">=3.11", script, "--project-root", input.projectRoot, input.operation, input.itemId, ...input.args, "--json"], { timeoutMs: deps.timeoutMs ?? TRIAGE_CLI_TIMEOUT_MS, env: uv.env });
67
86
  if (result.code === -1) {
68
- return { kind: "engine-unavailable", reason: "Python couldn't start on this machine.", repairCommand: READINESS_REPAIR_COMMAND };
87
+ return { kind: "engine-unavailable", reason: "uv couldn't start on this machine.", repairCommand: READINESS_REPAIR_COMMAND };
69
88
  }
70
89
  if (result.code === 3)
71
90
  return { kind: "precondition" };
@@ -1 +1 @@
1
- {"version":3,"file":"triage-cli-runner.js","sourceRoot":"","sources":["../../src/core/triage-cli-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"triage-cli-runner.js","sourceRoot":"","sources":["../../src/core/triage-cli-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type RunFn } from "./readiness-probe-run.js";
2
+ export interface UvResolution {
3
+ /** Absolute path (POSIX) or the bare "uv" (win32 — libuv reads PATH from
4
+ * the child env block, so a literal name plus the augmented `env` resolves
5
+ * it; mirrors `defaultRun`'s own win32/POSIX split). */
6
+ bin: string;
7
+ /** PATH-augmented env to hand to the actual `uv run` spawn. */
8
+ env: NodeJS.ProcessEnv;
9
+ }
10
+ export interface ResolveUvDeps {
11
+ /** `--version` runner used for the presence probe (test seam). */
12
+ run?: RunFn;
13
+ platform?: NodeJS.Platform;
14
+ homeDir?: string;
15
+ /** Base env the augmented PATH is layered onto (defaults to process.env). */
16
+ baseEnv?: NodeJS.ProcessEnv;
17
+ }
18
+ /**
19
+ * Test-run `uv --version`; on success resolve the bin + env a real `uv run`
20
+ * spawn needs. Null means "uv isn't there" — not "python isn't there".
21
+ */
22
+ export declare function resolveUv(deps?: ResolveUvDeps): Promise<UvResolution | null>;
23
+ //# sourceMappingURL=uv-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uv-runner.d.ts","sourceRoot":"","sources":["../../src/core/uv-runner.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAc,KAAK,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B;;6DAEyD;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAUtF"}
@@ -0,0 +1,39 @@
1
+ /*
2
+ * uv-runner — resolves `uv` for call sites that must run a plugin-owned Python
3
+ * script IN THE ENGINE'S OWN ENVIRONMENT (grade.py, triage_cli.py), not the
4
+ * server's ambient interpreter (root cause of the ModuleNotFoundError bug:
5
+ * grade-runner / triage-cli-runner used to spawn `resolvePython()`'s raw
6
+ * python3/python/py — whichever answered `--version` first, unversioned and
7
+ * dependency-free — instead of the `uv run`-managed environment both scripts
8
+ * are built for).
9
+ *
10
+ * `resolveUv` test-runs `uv --version` (never assumed present) via the same
11
+ * PATH-augmented probe `readiness-probe-run.ts` uses (`~/.local/bin` etc. —
12
+ * the uv installer only appends that dir to a shell rc, so a server spawned
13
+ * before a fresh install would otherwise ENOENT a real uv), then resolves the
14
+ * actual bin + env a REAL spawn needs — reusing `probeEnv`/`resolvePosixBin`
15
+ * from `readiness-probe-path.ts` rather than re-deriving PATH logic.
16
+ *
17
+ * Returns null when uv is genuinely absent. Callers MUST surface an honest
18
+ * "engine unavailable" in that case — never fall back to a bare system
19
+ * python, which is the exact silent-fallback this module replaces.
20
+ */
21
+ import os from "node:os";
22
+ import { probeEnv, resolvePosixBin } from "./readiness-probe-path.js";
23
+ import { defaultRun } from "./readiness-probe-run.js";
24
+ /**
25
+ * Test-run `uv --version`; on success resolve the bin + env a real `uv run`
26
+ * spawn needs. Null means "uv isn't there" — not "python isn't there".
27
+ */
28
+ export async function resolveUv(deps = {}) {
29
+ const run = deps.run ?? defaultRun;
30
+ const probe = await run("uv", ["--version"]);
31
+ if (!probe.ok)
32
+ return null;
33
+ const platform = deps.platform ?? process.platform;
34
+ const homeDir = deps.homeDir ?? os.homedir();
35
+ const env = probeEnv(platform, homeDir, deps.baseEnv ?? process.env);
36
+ const bin = platform === "win32" ? "uv" : resolvePosixBin("uv", env);
37
+ return { bin, env };
38
+ }
39
+ //# sourceMappingURL=uv-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uv-runner.js","sourceRoot":"","sources":["../../src/core/uv-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,UAAU,EAAc,MAAM,0BAA0B,CAAC;AAoBlE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAsB,EAAE;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Hono } from "hono";
2
+ import type { ExternalRouteProjectView } from "../_shared/helpers.js";
3
+ export interface FileExistsRouterDeps {
4
+ getProjectById?: (id: string) => ExternalRouteProjectView | undefined;
5
+ }
6
+ export declare function createFileExistsRouter(deps: FileExistsRouterDeps): Hono;
7
+ //# sourceMappingURL=exists-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exists-routes.d.ts","sourceRoot":"","sources":["../../../src/external/file/exists-routes.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAKtE,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,wBAAwB,GAAG,SAAS,CAAC;CACvE;AAwBD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CA4DvE"}
@@ -0,0 +1,91 @@
1
+ /*
2
+ * external/file/exists-routes.ts — GET
3
+ * /api/external/projects/:projectId/files/exist?paths=a,b,c.
4
+ *
5
+ * Batched, read-only existence check reusing the same `pathGuard` +
6
+ * `realPathGuard` boundary as the file-read route (CLAUDE.md rule 10), but no
7
+ * content is ever read — just `stat`. Feeds the Triage file viewer's
8
+ * link-vs-plain-text decision (iterate-2026-08-30-triage-file-viewer-followups):
9
+ * the caller supplies both the structured `evidencePath` field and
10
+ * regex-extracted free-text mentions, either of which can point at a path
11
+ * that no longer exists or never did — the WHOLE-request 400s stay reserved
12
+ * for a malformed REQUEST (missing project, missing `?paths`, batch cap), but
13
+ * an individual bad path (traversal, absolute, symlink escape, not-a-file,
14
+ * missing) resolves to `false` in the map rather than failing the batch.
15
+ */
16
+ import { Hono } from "hono";
17
+ import { stat, realpath } from "node:fs/promises";
18
+ import { pathGuard, realPathGuard } from "../../core/path-guard.js";
19
+ /** Hard cap on paths per request — this is a UI convenience batch, not a bulk API. */
20
+ const MAX_PATHS_PER_REQUEST = 50;
21
+ async function pathExists(projectPath, relpath, realProjectRoot) {
22
+ const guard = pathGuard(projectPath, relpath);
23
+ if (!guard.ok)
24
+ return false;
25
+ let st;
26
+ try {
27
+ st = await stat(guard.absolute);
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ if (!st.isFile())
33
+ return false;
34
+ // Same symlink-escape defense as the file-read route: a project-local
35
+ // symlink whose target resolves outside the project root must not be
36
+ // reported as an existing, viewable file.
37
+ return realPathGuard(projectPath, guard.absolute, realProjectRoot).ok;
38
+ }
39
+ export function createFileExistsRouter(deps) {
40
+ const app = new Hono();
41
+ const { getProjectById } = deps;
42
+ app.get("/api/external/projects/:projectId/files/exist", async (c) => {
43
+ const projectId = c.req.param("projectId");
44
+ const project = getProjectById?.(projectId);
45
+ if (!project) {
46
+ return c.json({ error: "project_not_found", projectId }, 404);
47
+ }
48
+ if (!project.path) {
49
+ return c.json({ error: "project_path_unavailable", projectId }, 400);
50
+ }
51
+ const raw = c.req.query("paths");
52
+ if (!raw || raw.length === 0) {
53
+ return c.json({ error: "paths_required" }, 400);
54
+ }
55
+ // Each segment is percent-decoded (client encodes with encodeURIComponent)
56
+ // so a literal comma inside a path can't be mistaken for the delimiter —
57
+ // code-review finding, iterate-2026-08-30-triage-file-viewer-followups.
58
+ // A segment that fails to decode (malformed %-escape) is treated as
59
+ // literal text rather than 400ing the whole batch — it will simply not
60
+ // match a real file and resolve to `false` below.
61
+ const paths = raw
62
+ .split(",")
63
+ .filter((p) => p.length > 0)
64
+ .map((p) => {
65
+ try {
66
+ return decodeURIComponent(p);
67
+ }
68
+ catch {
69
+ return p;
70
+ }
71
+ });
72
+ if (paths.length > MAX_PATHS_PER_REQUEST) {
73
+ return c.json({ error: "too_many_paths", max: MAX_PATHS_PER_REQUEST, received: paths.length }, 400);
74
+ }
75
+ // Resolve the project root's realpath ONCE for the whole batch rather
76
+ // than once per path — up to 50 paths would otherwise each pay a
77
+ // redundant realpathSync(root) inside realPathGuard, doubling the
78
+ // blocking-syscall count for no benefit (doubt-review finding,
79
+ // iterate-2026-08-30-triage-file-viewer-followups). `undefined` on
80
+ // failure falls back to realPathGuard's own per-call resolution, which
81
+ // then fails closed exactly as it did before this change.
82
+ const realProjectRoot = await realpath(project.path).catch(() => undefined);
83
+ const results = await Promise.all(paths.map(async (p) => [p, await pathExists(project.path, p, realProjectRoot)]));
84
+ const exists = {};
85
+ for (const [p, ok] of results)
86
+ exists[p] = ok;
87
+ return c.json({ exists });
88
+ });
89
+ return app;
90
+ }
91
+ //# sourceMappingURL=exists-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exists-routes.js","sourceRoot":"","sources":["../../../src/external/file/exists-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { openSync } from "node:fs";
2
+ import type { AuditLogPage } from "../../types/org.js";
3
+ export type { AuditLogEntry, AuditLogPage } from "../../types/org.js";
4
+ export type AuditLogCoreResult = {
5
+ status: 200;
6
+ body: AuditLogPage;
7
+ } | {
8
+ status: 400 | 403 | 404 | 500;
9
+ body: {
10
+ error: string;
11
+ detail?: string;
12
+ };
13
+ };
14
+ export interface AuditLogDeps {
15
+ leadsRoot: string;
16
+ openSync?: typeof openSync;
17
+ }
18
+ export interface AuditLogParams {
19
+ leadId: string | undefined;
20
+ /** Number of already-consumed newest-first entries to skip. Default 0. */
21
+ before?: number;
22
+ /** Page size, clamped to `[1, MAX_LIMIT]`. Default `DEFAULT_LIMIT`. */
23
+ limit?: number;
24
+ }
25
+ /** Pure core — reads and paginates `<leadsRoot>/<leadId>/audit.jsonl`. */
26
+ export declare function auditLogCore(deps: AuditLogDeps, params: AuditLogParams): AuditLogCoreResult;
27
+ //# sourceMappingURL=audit-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-log.d.ts","sourceRoot":"","sources":["../../../src/external/org/audit-log.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAkD,QAAQ,EAAgB,MAAM,SAAS,CAAC;AAKjG,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEtE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMtE,MAAM,MAAM,kBAAkB,GAC1B;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAEhF,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,GAAG,kBAAkB,CA2D3F"}