@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.
- package/client/dist/assets/{EmbeddedTerminal-D2BLGWdW.js → EmbeddedTerminal-5QvKe3_a.js} +20 -20
- package/client/dist/assets/{abnfDiagram-VRR7QNED-C-W_2Jd4.js → abnfDiagram-VRR7QNED-CXi9HegQ.js} +1 -1
- package/client/dist/assets/{arc-CpqwESP5.js → arc-DLh4GiqR.js} +1 -1
- package/client/dist/assets/{architectureDiagram-ZJ3FMSHR-DZVZ895V.js → architectureDiagram-ZJ3FMSHR-DUypQ8dQ.js} +1 -1
- package/client/dist/assets/{blockDiagram-677ZJIJ3-CCCZiAA7.js → blockDiagram-677ZJIJ3-D2cVMKJG.js} +1 -1
- package/client/dist/assets/{c4Diagram-LMCZKHZV-Bg1beZAE.js → c4Diagram-LMCZKHZV-DtruBGJw.js} +1 -1
- package/client/dist/assets/channel-C_k-9jsa.js +1 -0
- package/client/dist/assets/{chunk-2Q5K7J3B-CoaXSarh.js → chunk-2Q5K7J3B-CAfQkFw2.js} +1 -1
- package/client/dist/assets/{chunk-32BRIVSS-CeFXS-CM.js → chunk-32BRIVSS-CPWXoLnQ.js} +1 -1
- package/client/dist/assets/{chunk-5VM5RSS4-QyJMVe0m.js → chunk-5VM5RSS4-xVc3oppQ.js} +1 -1
- package/client/dist/assets/{chunk-EX3LRPZG-BIOtWVF8.js → chunk-EX3LRPZG-CUpl6fRR.js} +1 -1
- package/client/dist/assets/{chunk-JWPE2WC7-Dcq-lWyX.js → chunk-JWPE2WC7-NejUp56x.js} +1 -1
- package/client/dist/assets/{chunk-MOJQB5TN-C95323ja.js → chunk-MOJQB5TN-C9-2lLg0.js} +1 -1
- package/client/dist/assets/{chunk-RYQCIY6F-C0HPwpWy.js → chunk-RYQCIY6F-BAPtwABy.js} +1 -1
- package/client/dist/assets/{chunk-V7JOEXUC-BPrTbZqA.js → chunk-V7JOEXUC-Dwzihw26.js} +1 -1
- package/client/dist/assets/{chunk-VR4S4FIN--BCnNoqt.js → chunk-VR4S4FIN-9-iArFJM.js} +1 -1
- package/client/dist/assets/{chunk-XXDRQBXY-Dj8vtcXf.js → chunk-XXDRQBXY-DiWHOrqe.js} +1 -1
- package/client/dist/assets/classDiagram-OUVF2IWQ-CsEPq9Ac.js +1 -0
- package/client/dist/assets/classDiagram-v2-EOCWNBFH-CsEPq9Ac.js +1 -0
- package/client/dist/assets/{cose-bilkent-JH36ORCC-y51otZKz.js → cose-bilkent-JH36ORCC-Cp04EOcH.js} +1 -1
- package/client/dist/assets/{cynefin-VYW2F7L2-BRfS3cHo.js → cynefin-VYW2F7L2-D--GN1v8.js} +1 -1
- package/client/dist/assets/{cynefinDiagram-TSTJHNR4-Dpg2RtfL.js → cynefinDiagram-TSTJHNR4-BGH0o_qp.js} +1 -1
- package/client/dist/assets/{dagre-VKFMJZFB-BdZtXgKZ.js → dagre-VKFMJZFB-DSKkIKlj.js} +1 -1
- package/client/dist/assets/{diagram-FQU43EPY-K-RCwWxW.js → diagram-FQU43EPY-Cs_C4lb-.js} +1 -1
- package/client/dist/assets/{diagram-G47NLZAW-CHNn7F2-.js → diagram-G47NLZAW-oDtAA8O_.js} +1 -1
- package/client/dist/assets/{diagram-NH7WQ7WH-B3zu6xib.js → diagram-NH7WQ7WH-BiFMjqSH.js} +1 -1
- package/client/dist/assets/{diagram-OA4YK3LP-Wp5ju7L7.js → diagram-OA4YK3LP-Ccs3thCj.js} +1 -1
- package/client/dist/assets/{diagram-WEI45ONY-C94GpsRk.js → diagram-WEI45ONY-CdZNqgO3.js} +1 -1
- package/client/dist/assets/{ebnfDiagram-CCIWWBDH-DXrTPOrP.js → ebnfDiagram-CCIWWBDH-CapTA0VL.js} +1 -1
- package/client/dist/assets/{erDiagram-Q63AITRT-CGejnW0f.js → erDiagram-Q63AITRT-BcRNEP8s.js} +1 -1
- package/client/dist/assets/{flowDiagram-23GEKE2U-CFJMM637.js → flowDiagram-23GEKE2U-CJ_zF7e_.js} +1 -1
- package/client/dist/assets/{ganttDiagram-NO4QXBWP-DnaH94Su.js → ganttDiagram-NO4QXBWP-CnJdcg9A.js} +1 -1
- package/client/dist/assets/{gitGraphDiagram-IHSO6WYX-DT-D0gbn.js → gitGraphDiagram-IHSO6WYX-YTUQ_ELk.js} +1 -1
- package/client/dist/assets/index-6nZ1bt0a.css +1 -0
- package/client/dist/assets/index-irQhGNpn.js +828 -0
- package/client/dist/assets/{infoDiagram-FWYZ7A6U-DW3Ps00w.js → infoDiagram-FWYZ7A6U-CLOP_ZWD.js} +1 -1
- package/client/dist/assets/{ishikawaDiagram-FXEZZL3T-DjxjIT3n.js → ishikawaDiagram-FXEZZL3T-aFTIzr7o.js} +1 -1
- package/client/dist/assets/{journeyDiagram-5HDEW3XC-DTQRI93Y.js → journeyDiagram-5HDEW3XC-CbPJB4xd.js} +1 -1
- package/client/dist/assets/{kanban-definition-HUTT4EX6-BeDvbiEs.js → kanban-definition-HUTT4EX6-BoyhytIS.js} +1 -1
- package/client/dist/assets/{linear-B4foxDlh.js → linear-1VXA-uBg.js} +1 -1
- package/client/dist/assets/{mermaid.core-c-L4qgSB.js → mermaid.core-D_lO2yK9.js} +4 -4
- package/client/dist/assets/{mindmap-definition-LN4V7U3C-dh8v0J8T.js → mindmap-definition-LN4V7U3C-iFK7LXMx.js} +1 -1
- package/client/dist/assets/{pegDiagram-2B236MQR-D5vNrtFh.js → pegDiagram-2B236MQR-DNmcmfA-.js} +1 -1
- package/client/dist/assets/{pieDiagram-ENE6RG2P-CIjg_6lR.js → pieDiagram-ENE6RG2P-ekx83O5b.js} +1 -1
- package/client/dist/assets/{quadrantDiagram-ABIIQ3AL-CF37qWQD.js → quadrantDiagram-ABIIQ3AL-DayyD1l8.js} +1 -1
- package/client/dist/assets/{railroadDiagram-RFXS5EU6-x0Hn30Kj.js → railroadDiagram-RFXS5EU6-Bdgz7S6G.js} +1 -1
- package/client/dist/assets/{requirementDiagram-TGXJPOKE-BE2QnVbN.js → requirementDiagram-TGXJPOKE-szP3Muld.js} +1 -1
- package/client/dist/assets/{sankeyDiagram-HTMAVEWB-CUv6cIlV.js → sankeyDiagram-HTMAVEWB-Ct3rzgUj.js} +1 -1
- package/client/dist/assets/{sequenceDiagram-DBY2YBRQ-C3ACj5LS.js → sequenceDiagram-DBY2YBRQ-_69EfmOU.js} +1 -1
- package/client/dist/assets/{sizeCapture-X5ZJPWSS-DTMIb5gX.js → sizeCapture-X5ZJPWSS-BSOU06J2.js} +1 -1
- package/client/dist/assets/{stateDiagram-2N3HPSRC-DI1Z8P74.js → stateDiagram-2N3HPSRC-HmOmFwQm.js} +1 -1
- package/client/dist/assets/stateDiagram-v2-6OUMAXLB-BW8H33dv.js +1 -0
- package/client/dist/assets/{swimlanes-5IMT3BWC-CLSr9w29.js → swimlanes-5IMT3BWC-CVg_4oT7.js} +2 -2
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-BaRlxcPD.js +8 -0
- package/client/dist/assets/{timeline-definition-FHXFAJF6-BTWmUhDh.js → timeline-definition-FHXFAJF6-CBBaDKXm.js} +1 -1
- package/client/dist/assets/{vennDiagram-L72KCM5P-Ce1dlLCM.js → vennDiagram-L72KCM5P-CBXiWPMc.js} +1 -1
- package/client/dist/assets/{wardleyDiagram-EHGQE667-ClOE-aae.js → wardleyDiagram-EHGQE667-uhBCZoW0.js} +1 -1
- package/client/dist/assets/{xychartDiagram-FW5EYKEG-Fa2pqWKw.js → xychartDiagram-FW5EYKEG-xxE_wY5O.js} +1 -1
- package/client/dist/index.html +2 -2
- package/package.json +68 -68
- package/server/dist/core/grade-runner.d.ts +4 -4
- package/server/dist/core/grade-runner.d.ts.map +1 -1
- package/server/dist/core/grade-runner.js +51 -26
- package/server/dist/core/grade-runner.js.map +1 -1
- package/server/dist/core/grade-target.d.ts +8 -0
- package/server/dist/core/grade-target.d.ts.map +1 -1
- package/server/dist/core/grade-target.js +10 -0
- package/server/dist/core/grade-target.js.map +1 -1
- package/server/dist/core/triage-cli-runner.d.ts.map +1 -1
- package/server/dist/core/triage-cli-runner.js +29 -10
- package/server/dist/core/triage-cli-runner.js.map +1 -1
- package/server/dist/core/uv-runner.d.ts +23 -0
- package/server/dist/core/uv-runner.d.ts.map +1 -0
- package/server/dist/core/uv-runner.js +39 -0
- package/server/dist/core/uv-runner.js.map +1 -0
- package/server/dist/external/file/exists-routes.d.ts +7 -0
- package/server/dist/external/file/exists-routes.d.ts.map +1 -0
- package/server/dist/external/file/exists-routes.js +91 -0
- package/server/dist/external/file/exists-routes.js.map +1 -0
- package/server/dist/external/org/audit-log.d.ts +27 -0
- package/server/dist/external/org/audit-log.d.ts.map +1 -0
- package/server/dist/external/org/audit-log.js +92 -0
- package/server/dist/external/org/audit-log.js.map +1 -0
- package/server/dist/external/org/beat-register.d.ts +15 -22
- package/server/dist/external/org/beat-register.d.ts.map +1 -1
- package/server/dist/external/org/beat-register.js +37 -32
- package/server/dist/external/org/beat-register.js.map +1 -1
- package/server/dist/external/org/file-read.d.ts +16 -0
- package/server/dist/external/org/file-read.d.ts.map +1 -1
- package/server/dist/external/org/file-read.js +86 -46
- package/server/dist/external/org/file-read.js.map +1 -1
- package/server/dist/external/org/file-write-core.d.ts +18 -0
- package/server/dist/external/org/file-write-core.d.ts.map +1 -0
- package/server/dist/external/org/file-write-core.js +97 -0
- package/server/dist/external/org/file-write-core.js.map +1 -0
- package/server/dist/external/org/file-write.d.ts +25 -0
- package/server/dist/external/org/file-write.d.ts.map +1 -1
- package/server/dist/external/org/file-write.js +82 -132
- package/server/dist/external/org/file-write.js.map +1 -1
- package/server/dist/external/org/last-run.d.ts +25 -16
- package/server/dist/external/org/last-run.d.ts.map +1 -1
- package/server/dist/external/org/last-run.js +78 -64
- package/server/dist/external/org/last-run.js.map +1 -1
- package/server/dist/external/org/lead-doc-read.d.ts +21 -0
- package/server/dist/external/org/lead-doc-read.d.ts.map +1 -0
- package/server/dist/external/org/lead-doc-read.js +84 -0
- package/server/dist/external/org/lead-doc-read.js.map +1 -0
- package/server/dist/external/org/mount.d.ts +12 -0
- package/server/dist/external/org/mount.d.ts.map +1 -0
- package/server/dist/external/org/mount.js +34 -0
- package/server/dist/external/org/mount.js.map +1 -0
- package/server/dist/external/org/org-chart-lookup.d.ts +13 -0
- package/server/dist/external/org/org-chart-lookup.d.ts.map +1 -1
- package/server/dist/external/org/org-chart-lookup.js +40 -5
- package/server/dist/external/org/org-chart-lookup.js.map +1 -1
- package/server/dist/external/org/org-chart.d.ts +21 -12
- package/server/dist/external/org/org-chart.d.ts.map +1 -1
- package/server/dist/external/org/org-chart.js +50 -32
- package/server/dist/external/org/org-chart.js.map +1 -1
- package/server/dist/external/org/role-extract.d.ts +8 -0
- package/server/dist/external/org/role-extract.d.ts.map +1 -0
- package/server/dist/external/org/role-extract.js +72 -0
- package/server/dist/external/org/role-extract.js.map +1 -0
- package/server/dist/external/org/usage.d.ts +15 -11
- package/server/dist/external/org/usage.d.ts.map +1 -1
- package/server/dist/external/org/usage.js +64 -54
- package/server/dist/external/org/usage.js.map +1 -1
- package/server/dist/external/routes.d.ts +1 -1
- package/server/dist/external/routes.d.ts.map +1 -1
- package/server/dist/external/routes.js +10 -11
- package/server/dist/external/routes.js.map +1 -1
- package/server/dist/routes/grade.d.ts.map +1 -1
- package/server/dist/routes/grade.js +3 -2
- package/server/dist/routes/grade.js.map +1 -1
- package/server/dist/routes/org-leads-composite.d.ts +21 -0
- package/server/dist/routes/org-leads-composite.d.ts.map +1 -0
- package/server/dist/routes/org-leads-composite.js +95 -0
- package/server/dist/routes/org-leads-composite.js.map +1 -0
- package/server/dist/routes/org.d.ts +15 -0
- package/server/dist/routes/org.d.ts.map +1 -0
- package/server/dist/routes/org.js +198 -0
- package/server/dist/routes/org.js.map +1 -0
- package/server/dist/terminal/pty-manager.d.ts +9 -0
- package/server/dist/terminal/pty-manager.d.ts.map +1 -1
- package/server/dist/terminal/pty-manager.js +15 -0
- package/server/dist/terminal/pty-manager.js.map +1 -1
- package/server/dist/terminal/replay-snapshot.d.ts +10 -1
- package/server/dist/terminal/replay-snapshot.d.ts.map +1 -1
- package/server/dist/terminal/replay-snapshot.js +36 -1
- package/server/dist/terminal/replay-snapshot.js.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.d.ts +17 -1
- package/server/dist/terminal/ws-upgrade-handler.d.ts.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts +1 -0
- package/server/dist/terminal/ws-upgrade-handler.fixtures.d.ts.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.fixtures.js +3 -2
- package/server/dist/terminal/ws-upgrade-handler.fixtures.js.map +1 -1
- package/server/dist/terminal/ws-upgrade-handler.js +45 -4
- package/server/dist/terminal/ws-upgrade-handler.js.map +1 -1
- package/server/dist/test/python-spawn-guard-util.d.ts +14 -0
- package/server/dist/test/python-spawn-guard-util.d.ts.map +1 -0
- package/server/dist/test/python-spawn-guard-util.js +124 -0
- package/server/dist/test/python-spawn-guard-util.js.map +1 -0
- package/server/dist/types/org.d.ts +115 -0
- package/server/dist/types/org.d.ts.map +1 -0
- package/server/dist/types/org.js +16 -0
- package/server/dist/types/org.js.map +1 -0
- package/server/package.json +1 -1
- package/client/dist/assets/MarkdownEditorModal-CP5yG9OU.js +0 -212
- package/client/dist/assets/channel-BNXbCvDS.js +0 -1
- package/client/dist/assets/classDiagram-OUVF2IWQ-w-wCtLx3.js +0 -1
- package/client/dist/assets/classDiagram-v2-EOCWNBFH-w-wCtLx3.js +0 -1
- package/client/dist/assets/index-CU2QJgvx.js +0 -609
- package/client/dist/assets/index-ftvVcUT8.css +0 -1
- package/client/dist/assets/stateDiagram-v2-6OUMAXLB-DvwiHlJv.js +0 -1
- package/client/dist/assets/swimlanesDiagram-G3AALYLV-JTQZTlZ3.js +0 -8
|
@@ -6,13 +6,17 @@
|
|
|
6
6
|
* + the outcome mapping.
|
|
7
7
|
*
|
|
8
8
|
* ── IO / injection boundary (the reason A09 was split) ──────────────────────
|
|
9
|
-
* `grade.py
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
9
|
+
* `grade.py` is spawned via `uv run --project <plugin-root> <script>
|
|
10
|
+
* --format json -- <target>` with **shell:false** (the plugin's OWN declared
|
|
11
|
+
* environment — grade.py needs `defusedxml` + Python 3.11+, per its
|
|
12
|
+
* pyproject.toml, and never gets it from an ambient system interpreter; see
|
|
13
|
+
* `uv-runner.ts`'s header for the incident this replaced). uv is resolved by
|
|
14
|
+
* TEST-RUN (`resolveUv`, reusing the readiness probe's PATH augmentation) —
|
|
15
|
+
* missing uv is an honest engine-unavailable, never a silent python fallback.
|
|
16
|
+
* The target is passed as a **fixed argv position** — never interpolated into
|
|
17
|
+
* a shell string, so no shell metacharacter in a user-entered path/URL can
|
|
18
|
+
* reach a shell (there is none). Mirrors the ADR-044 #9 / `pr-status.ts` spawn
|
|
19
|
+
* discipline. Must NOT trip Semgrep `spawn-shell-true`.
|
|
16
20
|
*
|
|
17
21
|
* READ-ONLY: grade is a pure read of a repo. It registers no project, writes
|
|
18
22
|
* nothing to the graded repo, and never touches `~/.claude/projects/**`,
|
|
@@ -20,6 +24,21 @@
|
|
|
20
24
|
* A remote URL is shallow-cloned into a throwaway tempdir *by grade.py* and
|
|
21
25
|
* purged when it exits — webui does not clone.
|
|
22
26
|
*
|
|
27
|
+
* "Read-only" is about the GRADED repo and webui's own state, not about
|
|
28
|
+
* `uv`'s own bookkeeping (Stage-3 doubt review, 2026-08-26): `uv run
|
|
29
|
+
* --project` DOES write into the plugin's OWN cache directory
|
|
30
|
+
* (`~/.claude/plugins/cache/shipwright/shipwright-grade/<version>/.venv/`) the
|
|
31
|
+
* first time it syncs that project's declared dependencies — verified on a
|
|
32
|
+
* real cache. This is uv's own environment-sync mechanism (cross-process
|
|
33
|
+
* locked by uv itself), scoped to the plugin's own directory, and one-time
|
|
34
|
+
* per version; it is not a new write surface this module owns or must guard.
|
|
35
|
+
*
|
|
36
|
+
* `uv run --python ">=3.11"` also passes `--no-project` in the
|
|
37
|
+
* triage-cli-runner sibling (see that module's header) so a bare `--python`
|
|
38
|
+
* invocation never walks up from the spawning process's cwd looking for an
|
|
39
|
+
* ambient project to activate; grade-runner's `--project <plugin-root>` is
|
|
40
|
+
* already explicit and has no such ambient-discovery exposure.
|
|
41
|
+
*
|
|
23
42
|
* Every grade.py outcome maps to an HONEST state (never a fabricated grade):
|
|
24
43
|
* exit 0 + JSON → report-ready (raw model; the CLIENT reportShape
|
|
25
44
|
* guard is the cross-repo contract check, ADR-045)
|
|
@@ -34,8 +53,9 @@
|
|
|
34
53
|
* subprocess — no live grade.py).
|
|
35
54
|
*/
|
|
36
55
|
import { execFile } from "node:child_process";
|
|
37
|
-
import { defaultRun, READINESS_REPAIR_COMMAND
|
|
38
|
-
import { defaultStatDir, ENV_COMPLIANCE_ROOT, resolveComplianceRoot, resolveGradeScript, validateGradeTarget, } from "./grade-target.js";
|
|
56
|
+
import { defaultRun, READINESS_REPAIR_COMMAND } from "./readiness-probe.js";
|
|
57
|
+
import { defaultStatDir, ENV_COMPLIANCE_ROOT, resolveComplianceRoot, resolveGradePluginRoot, resolveGradeScript, validateGradeTarget, } from "./grade-target.js";
|
|
58
|
+
import { resolveUv } from "./uv-runner.js";
|
|
39
59
|
/** grade.py can shallow-clone + read a whole history; a remote target needs
|
|
40
60
|
* headroom over a local one. Generous, but bounded (a hung clone is killed). */
|
|
41
61
|
export const DEFAULT_GRADE_TIMEOUT_MS = 120_000;
|
|
@@ -79,9 +99,9 @@ function cleanStderr(stderr) {
|
|
|
79
99
|
return line.replace(/^shipwright-grade:\s*/i, "").trim();
|
|
80
100
|
}
|
|
81
101
|
/**
|
|
82
|
-
* Validate → resolve engine → spawn `
|
|
83
|
-
* outcome to an honest {@link GradeOutcome}.
|
|
84
|
-
* only a programming error would reject.
|
|
102
|
+
* Validate → resolve engine → spawn `uv run --project <plugin-root> grade.py
|
|
103
|
+
* <target> --format json` → map the outcome to an honest {@link GradeOutcome}.
|
|
104
|
+
* Never throws for a grade failure; only a programming error would reject.
|
|
85
105
|
*/
|
|
86
106
|
export async function runGrade(input, deps = {}) {
|
|
87
107
|
const statDir = deps.statDir ?? defaultStatDir;
|
|
@@ -98,8 +118,10 @@ export async function runGrade(input, deps = {}) {
|
|
|
98
118
|
if (!v.ok)
|
|
99
119
|
return { status: "grade-failed", reason: v.reason };
|
|
100
120
|
const target = input.target.trim();
|
|
101
|
-
// 2 — resolve the engine: grade.py +
|
|
102
|
-
//
|
|
121
|
+
// 2 — resolve the engine: grade.py + uv. Either missing is an honest
|
|
122
|
+
// "engine unavailable — run npx …" (reuse the readiness repair). uv
|
|
123
|
+
// missing is NEVER a reason to fall back to a bare system python — that
|
|
124
|
+
// silent fallback is the root cause this replaced (uv-runner.ts).
|
|
103
125
|
const script = resolveGradeScript({ ...resolveDeps, scriptOverride: deps.scriptOverride });
|
|
104
126
|
if (!script) {
|
|
105
127
|
return {
|
|
@@ -108,11 +130,12 @@ export async function runGrade(input, deps = {}) {
|
|
|
108
130
|
repairCommand: READINESS_REPAIR_COMMAND,
|
|
109
131
|
};
|
|
110
132
|
}
|
|
111
|
-
const
|
|
112
|
-
|
|
133
|
+
const baseEnv = deps.baseEnv ?? process.env;
|
|
134
|
+
const uv = await resolveUv({ run, homeDir: deps.homeDir, baseEnv });
|
|
135
|
+
if (!uv) {
|
|
113
136
|
return {
|
|
114
137
|
status: "engine-unavailable",
|
|
115
|
-
reason: "
|
|
138
|
+
reason: "uv isn't installed — grade needs it to run in the plugin's own environment.",
|
|
116
139
|
repairCommand: READINESS_REPAIR_COMMAND,
|
|
117
140
|
};
|
|
118
141
|
}
|
|
@@ -122,22 +145,24 @@ export async function runGrade(input, deps = {}) {
|
|
|
122
145
|
...resolveDeps,
|
|
123
146
|
complianceOverride: deps.complianceOverride,
|
|
124
147
|
});
|
|
125
|
-
const
|
|
126
|
-
const env = { ...baseEnv };
|
|
148
|
+
const env = { ...uv.env };
|
|
127
149
|
if (complianceRoot)
|
|
128
150
|
env[ENV_COMPLIANCE_ROOT] = complianceRoot;
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
//
|
|
151
|
+
// `uv run --project <plugin-root>` resolves grade.py's own declared deps
|
|
152
|
+
// (defusedxml, Python 3.11+) instead of an ambient interpreter. Fixed argv:
|
|
153
|
+
// options first, then a `--` END-OF-OPTIONS separator, then the target as
|
|
154
|
+
// the sole positional. shell:false already blocks shell injection; the `--`
|
|
155
|
+
// additionally blocks ARGUMENT injection — a target like `--no-clone` or
|
|
156
|
+
// `--allow-network-private` is treated as a path, never a grade.py flag
|
|
133
157
|
// (mirrors the pr-status.ts `--` discipline; verified against argparse).
|
|
134
|
-
const
|
|
135
|
-
const
|
|
158
|
+
const pluginRoot = resolveGradePluginRoot(script);
|
|
159
|
+
const args = ["run", "--project", pluginRoot, script, "--format", "json", "--", target];
|
|
160
|
+
const r = await spawn(uv.bin, args, { env, timeoutMs });
|
|
136
161
|
// 4 — map the outcome.
|
|
137
162
|
if (r.code === -1) {
|
|
138
163
|
return {
|
|
139
164
|
status: "engine-unavailable",
|
|
140
|
-
reason: "
|
|
165
|
+
reason: "uv couldn't start on this machine.",
|
|
141
166
|
repairCommand: READINESS_REPAIR_COMMAND,
|
|
142
167
|
};
|
|
143
168
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grade-runner.js","sourceRoot":"","sources":["../../src/core/grade-runner.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"grade-runner.js","sourceRoot":"","sources":["../../src/core/grade-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,14 @@ export interface PluginResolveDeps {
|
|
|
35
35
|
export declare function resolveGradeScript(deps?: PluginResolveDeps & {
|
|
36
36
|
scriptOverride?: string;
|
|
37
37
|
}): string | null;
|
|
38
|
+
/**
|
|
39
|
+
* The `shipwright-grade` plugin root that owns `resolveGradeScript`'s result —
|
|
40
|
+
* three levels up from `scripts/tools/grade.py`. This is the plugin's own
|
|
41
|
+
* `pyproject.toml`/`uv.lock`/`.venv` directory, so `uv run --project
|
|
42
|
+
* <pluginRoot>` resolves grade.py's declared dependencies (defusedxml, etc.)
|
|
43
|
+
* instead of whatever bare interpreter happened to answer `--version` first.
|
|
44
|
+
*/
|
|
45
|
+
export declare function resolveGradePluginRoot(script: string): string;
|
|
38
46
|
/** Resolve the shipwright-compliance plugin root (the dir carrying
|
|
39
47
|
* `scripts/lib/control_grade.py`), which grade.py's engine_bridge needs. */
|
|
40
48
|
export declare function resolveComplianceRoot(deps?: PluginResolveDeps & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grade-target.d.ts","sourceRoot":"","sources":["../../src/core/grade-target.ts"],"names":[],"mappings":"AA6BA;;kEAEkE;AAClE,eAAO,MAAM,mBAAmB,qCAAqC,CAAC;AAQtE,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,aAAyD,CAAC;AAkB3F;;iFAEiF;AACjF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGnD;AAUD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,GAC9B,gBAAgB,CAmClB;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAMjD;AAMD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;CACrC;AA4BD,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAChC,IAAI,GAAE,iBAAiB,GAAG;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,MAAM,GAAG,IAAI,CAIf;AAED;6EAC6E;AAC7E,wBAAgB,qBAAqB,CACnC,IAAI,GAAE,iBAAiB,GAAG;IAAE,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7D,MAAM,GAAG,IAAI,CAQf"}
|
|
1
|
+
{"version":3,"file":"grade-target.d.ts","sourceRoot":"","sources":["../../src/core/grade-target.ts"],"names":[],"mappings":"AA6BA;;kEAEkE;AAClE,eAAO,MAAM,mBAAmB,qCAAqC,CAAC;AAQtE,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,aAAyD,CAAC;AAkB3F;;iFAEiF;AACjF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGnD;AAUD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,GAC9B,gBAAgB,CAmClB;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAMjD;AAMD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;CACrC;AA4BD,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAChC,IAAI,GAAE,iBAAiB,GAAG;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,MAAM,GAAG,IAAI,CAIf;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;6EAC6E;AAC7E,wBAAgB,qBAAqB,CACnC,IAAI,GAAE,iBAAiB,GAAG;IAAE,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7D,MAAM,GAAG,IAAI,CAQf"}
|
|
@@ -151,6 +151,16 @@ export function resolveGradeScript(deps = {}) {
|
|
|
151
151
|
return existsFn(deps.scriptOverride) ? deps.scriptOverride : null;
|
|
152
152
|
return resolveVersionedFile("shipwright-grade", ["scripts", "tools", "grade.py"], deps);
|
|
153
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* The `shipwright-grade` plugin root that owns `resolveGradeScript`'s result —
|
|
156
|
+
* three levels up from `scripts/tools/grade.py`. This is the plugin's own
|
|
157
|
+
* `pyproject.toml`/`uv.lock`/`.venv` directory, so `uv run --project
|
|
158
|
+
* <pluginRoot>` resolves grade.py's declared dependencies (defusedxml, etc.)
|
|
159
|
+
* instead of whatever bare interpreter happened to answer `--version` first.
|
|
160
|
+
*/
|
|
161
|
+
export function resolveGradePluginRoot(script) {
|
|
162
|
+
return path.dirname(path.dirname(path.dirname(script)));
|
|
163
|
+
}
|
|
154
164
|
/** Resolve the shipwright-compliance plugin root (the dir carrying
|
|
155
165
|
* `scripts/lib/control_grade.py`), which grade.py's engine_bridge needs. */
|
|
156
166
|
export function resolveComplianceRoot(deps = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grade-target.js","sourceRoot":"","sources":["../../src/core/grade-target.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grade-target.js","sourceRoot":"","sources":["../../src/core/grade-target.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triage-cli-runner.d.ts","sourceRoot":"","sources":["../../src/core/triage-cli-runner.ts"],"names":[],"mappings":"
|
|
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
|
|
7
|
-
* schema bootstrap and record-boundary
|
|
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 {
|
|
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
|
|
51
|
-
return unavailable("
|
|
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
|
|
63
|
-
if (!
|
|
64
|
-
return {
|
|
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(
|
|
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: "
|
|
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":"AAAA
|
|
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"}
|