agentic-engineering-harness 0.4.16

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 (280) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +273 -0
  3. package/dist/agents/audit.d.ts +12 -0
  4. package/dist/agents/audit.js +14 -0
  5. package/dist/agents/audit.js.map +1 -0
  6. package/dist/agents/compiler.d.ts +8 -0
  7. package/dist/agents/compiler.js +103 -0
  8. package/dist/agents/compiler.js.map +1 -0
  9. package/dist/agents/config.d.ts +6 -0
  10. package/dist/agents/config.js +161 -0
  11. package/dist/agents/config.js.map +1 -0
  12. package/dist/agents/escalation.d.ts +9 -0
  13. package/dist/agents/escalation.js +75 -0
  14. package/dist/agents/escalation.js.map +1 -0
  15. package/dist/agents/exceptionDetection.d.ts +24 -0
  16. package/dist/agents/exceptionDetection.js +42 -0
  17. package/dist/agents/exceptionDetection.js.map +1 -0
  18. package/dist/agents/findings.d.ts +14 -0
  19. package/dist/agents/findings.js +40 -0
  20. package/dist/agents/findings.js.map +1 -0
  21. package/dist/agents/gitCheckpoint.d.ts +6 -0
  22. package/dist/agents/gitCheckpoint.js +61 -0
  23. package/dist/agents/gitCheckpoint.js.map +1 -0
  24. package/dist/agents/jsonc.d.ts +1 -0
  25. package/dist/agents/jsonc.js +42 -0
  26. package/dist/agents/jsonc.js.map +1 -0
  27. package/dist/agents/outputContracts.d.ts +161 -0
  28. package/dist/agents/outputContracts.js +16 -0
  29. package/dist/agents/outputContracts.js.map +1 -0
  30. package/dist/agents/parallelism.d.ts +14 -0
  31. package/dist/agents/parallelism.js +54 -0
  32. package/dist/agents/parallelism.js.map +1 -0
  33. package/dist/agents/permissions.d.ts +5 -0
  34. package/dist/agents/permissions.js +30 -0
  35. package/dist/agents/permissions.js.map +1 -0
  36. package/dist/agents/qualityConvergence.d.ts +44 -0
  37. package/dist/agents/qualityConvergence.js +77 -0
  38. package/dist/agents/qualityConvergence.js.map +1 -0
  39. package/dist/agents/recovery.d.ts +13 -0
  40. package/dist/agents/recovery.js +35 -0
  41. package/dist/agents/recovery.js.map +1 -0
  42. package/dist/agents/reviewLifecycle.d.ts +30 -0
  43. package/dist/agents/reviewLifecycle.js +233 -0
  44. package/dist/agents/reviewLifecycle.js.map +1 -0
  45. package/dist/agents/routing.d.ts +9 -0
  46. package/dist/agents/routing.js +37 -0
  47. package/dist/agents/routing.js.map +1 -0
  48. package/dist/agents/structuredOutput.d.ts +1 -0
  49. package/dist/agents/structuredOutput.js +54 -0
  50. package/dist/agents/structuredOutput.js.map +1 -0
  51. package/dist/agents/types.d.ts +207 -0
  52. package/dist/agents/types.js +2 -0
  53. package/dist/agents/types.js.map +1 -0
  54. package/dist/cli.d.ts +2 -0
  55. package/dist/cli.js +221 -0
  56. package/dist/cli.js.map +1 -0
  57. package/dist/core/config.d.ts +3 -0
  58. package/dist/core/config.js +59 -0
  59. package/dist/core/config.js.map +1 -0
  60. package/dist/core/doctor.d.ts +8 -0
  61. package/dist/core/doctor.js +59 -0
  62. package/dist/core/doctor.js.map +1 -0
  63. package/dist/core/git.d.ts +8 -0
  64. package/dist/core/git.js +47 -0
  65. package/dist/core/git.js.map +1 -0
  66. package/dist/core/init.d.ts +1 -0
  67. package/dist/core/init.js +52 -0
  68. package/dist/core/init.js.map +1 -0
  69. package/dist/core/quick.d.ts +20 -0
  70. package/dist/core/quick.js +49 -0
  71. package/dist/core/quick.js.map +1 -0
  72. package/dist/core/repair.d.ts +8 -0
  73. package/dist/core/repair.js +7 -0
  74. package/dist/core/repair.js.map +1 -0
  75. package/dist/core/run.d.ts +38 -0
  76. package/dist/core/run.js +165 -0
  77. package/dist/core/run.js.map +1 -0
  78. package/dist/core/sdd.d.ts +10 -0
  79. package/dist/core/sdd.js +88 -0
  80. package/dist/core/sdd.js.map +1 -0
  81. package/dist/core/seal.d.ts +3 -0
  82. package/dist/core/seal.js +74 -0
  83. package/dist/core/seal.js.map +1 -0
  84. package/dist/core/triage.d.ts +22 -0
  85. package/dist/core/triage.js +38 -0
  86. package/dist/core/triage.js.map +1 -0
  87. package/dist/core/types.d.ts +354 -0
  88. package/dist/core/types.js +2 -0
  89. package/dist/core/types.js.map +1 -0
  90. package/dist/core/verify.d.ts +6 -0
  91. package/dist/core/verify.js +51 -0
  92. package/dist/core/verify.js.map +1 -0
  93. package/dist/delivery/finalize.d.ts +17 -0
  94. package/dist/delivery/finalize.js +71 -0
  95. package/dist/delivery/finalize.js.map +1 -0
  96. package/dist/delivery/handoff.d.ts +39 -0
  97. package/dist/delivery/handoff.js +250 -0
  98. package/dist/delivery/handoff.js.map +1 -0
  99. package/dist/entry.d.ts +2 -0
  100. package/dist/entry.js +112 -0
  101. package/dist/entry.js.map +1 -0
  102. package/dist/evals/runner.d.ts +4 -0
  103. package/dist/evals/runner.js +112 -0
  104. package/dist/evals/runner.js.map +1 -0
  105. package/dist/evals/scoring.d.ts +3 -0
  106. package/dist/evals/scoring.js +41 -0
  107. package/dist/evals/scoring.js.map +1 -0
  108. package/dist/evals/types.d.ts +46 -0
  109. package/dist/evals/types.js +2 -0
  110. package/dist/evals/types.js.map +1 -0
  111. package/dist/issues/intake.d.ts +114 -0
  112. package/dist/issues/intake.js +213 -0
  113. package/dist/issues/intake.js.map +1 -0
  114. package/dist/memory/benchmark.d.ts +33 -0
  115. package/dist/memory/benchmark.js +69 -0
  116. package/dist/memory/benchmark.js.map +1 -0
  117. package/dist/metrics/runMetrics.d.ts +9 -0
  118. package/dist/metrics/runMetrics.js +34 -0
  119. package/dist/metrics/runMetrics.js.map +1 -0
  120. package/dist/metrics/usage.d.ts +3 -0
  121. package/dist/metrics/usage.js +53 -0
  122. package/dist/metrics/usage.js.map +1 -0
  123. package/dist/provenance/generate.d.ts +30 -0
  124. package/dist/provenance/generate.js +96 -0
  125. package/dist/provenance/generate.js.map +1 -0
  126. package/dist/providers/engram.d.ts +8 -0
  127. package/dist/providers/engram.js +14 -0
  128. package/dist/providers/engram.js.map +1 -0
  129. package/dist/providers/graphify.d.ts +9 -0
  130. package/dist/providers/graphify.js +28 -0
  131. package/dist/providers/graphify.js.map +1 -0
  132. package/dist/providers/paseo.d.ts +8 -0
  133. package/dist/providers/paseo.js +14 -0
  134. package/dist/providers/paseo.js.map +1 -0
  135. package/dist/providers/types.d.ts +41 -0
  136. package/dist/providers/types.js +2 -0
  137. package/dist/providers/types.js.map +1 -0
  138. package/dist/telemetry/events.d.ts +2 -0
  139. package/dist/telemetry/events.js +29 -0
  140. package/dist/telemetry/events.js.map +1 -0
  141. package/dist/telemetry/otlp.d.ts +3 -0
  142. package/dist/telemetry/otlp.js +57 -0
  143. package/dist/telemetry/otlp.js.map +1 -0
  144. package/dist/toolchain/config.d.ts +10 -0
  145. package/dist/toolchain/config.js +54 -0
  146. package/dist/toolchain/config.js.map +1 -0
  147. package/dist/toolchain/doctor.d.ts +8 -0
  148. package/dist/toolchain/doctor.js +56 -0
  149. package/dist/toolchain/doctor.js.map +1 -0
  150. package/dist/toolchain/mise.d.ts +10 -0
  151. package/dist/toolchain/mise.js +61 -0
  152. package/dist/toolchain/mise.js.map +1 -0
  153. package/dist/toolchain/resolve.d.ts +8 -0
  154. package/dist/toolchain/resolve.js +159 -0
  155. package/dist/toolchain/resolve.js.map +1 -0
  156. package/dist/toolchain/setup.d.ts +7 -0
  157. package/dist/toolchain/setup.js +141 -0
  158. package/dist/toolchain/setup.js.map +1 -0
  159. package/dist/toolchain/types.d.ts +95 -0
  160. package/dist/toolchain/types.js +2 -0
  161. package/dist/toolchain/types.js.map +1 -0
  162. package/dist/utils/process.d.ts +15 -0
  163. package/dist/utils/process.js +94 -0
  164. package/dist/utils/process.js.map +1 -0
  165. package/dist/validators/commands.d.ts +2 -0
  166. package/dist/validators/commands.js +28 -0
  167. package/dist/validators/commands.js.map +1 -0
  168. package/dist/validators/constraints.d.ts +6 -0
  169. package/dist/validators/constraints.js +30 -0
  170. package/dist/validators/constraints.js.map +1 -0
  171. package/dist/validators/diffScope.d.ts +2 -0
  172. package/dist/validators/diffScope.js +36 -0
  173. package/dist/validators/diffScope.js.map +1 -0
  174. package/dist/validators/evidence.d.ts +6 -0
  175. package/dist/validators/evidence.js +8 -0
  176. package/dist/validators/evidence.js.map +1 -0
  177. package/dist/validators/external.d.ts +3 -0
  178. package/dist/validators/external.js +22 -0
  179. package/dist/validators/external.js.map +1 -0
  180. package/dist/validators/gherkin.d.ts +3 -0
  181. package/dist/validators/gherkin.js +59 -0
  182. package/dist/validators/gherkin.js.map +1 -0
  183. package/dist/validators/graphify.d.ts +4 -0
  184. package/dist/validators/graphify.js +108 -0
  185. package/dist/validators/graphify.js.map +1 -0
  186. package/dist/validators/opa.d.ts +3 -0
  187. package/dist/validators/opa.js +43 -0
  188. package/dist/validators/opa.js.map +1 -0
  189. package/dist/validators/openapi.d.ts +25 -0
  190. package/dist/validators/openapi.js +98 -0
  191. package/dist/validators/openapi.js.map +1 -0
  192. package/dist/validators/registry.d.ts +2 -0
  193. package/dist/validators/registry.js +36 -0
  194. package/dist/validators/registry.js.map +1 -0
  195. package/dist/validators/toolCommand.d.ts +5 -0
  196. package/dist/validators/toolCommand.js +33 -0
  197. package/dist/validators/toolCommand.js.map +1 -0
  198. package/dist/validators/types.d.ts +13 -0
  199. package/dist/validators/types.js +2 -0
  200. package/dist/validators/types.js.map +1 -0
  201. package/dist/workers/agentPrompt.d.ts +3 -0
  202. package/dist/workers/agentPrompt.js +84 -0
  203. package/dist/workers/agentPrompt.js.map +1 -0
  204. package/dist/workers/direct.d.ts +13 -0
  205. package/dist/workers/direct.js +30 -0
  206. package/dist/workers/direct.js.map +1 -0
  207. package/dist/workers/factory.d.ts +4 -0
  208. package/dist/workers/factory.js +10 -0
  209. package/dist/workers/factory.js.map +1 -0
  210. package/dist/workers/paseo.d.ts +14 -0
  211. package/dist/workers/paseo.js +29 -0
  212. package/dist/workers/paseo.js.map +1 -0
  213. package/dist/workers/podman.d.ts +13 -0
  214. package/dist/workers/podman.js +22 -0
  215. package/dist/workers/podman.js.map +1 -0
  216. package/dist/workers/prompt.d.ts +4 -0
  217. package/dist/workers/prompt.js +4 -0
  218. package/dist/workers/prompt.js.map +1 -0
  219. package/dist/workers/types.d.ts +11 -0
  220. package/dist/workers/types.js +2 -0
  221. package/dist/workers/types.js.map +1 -0
  222. package/docs/ARCHITECTURE.md +47 -0
  223. package/docs/EVALS.md +28 -0
  224. package/docs/MEMORY.md +28 -0
  225. package/docs/OBSERVABILITY.md +18 -0
  226. package/docs/OSS_STACK.md +27 -0
  227. package/docs/PASEO.md +9 -0
  228. package/docs/PUBLISHING.md +110 -0
  229. package/docs/SDD.md +35 -0
  230. package/docs/SECURITY.md +21 -0
  231. package/docs/V0.2.md +42 -0
  232. package/docs/V0.3.md +40 -0
  233. package/docs/V0.4.11.md +30 -0
  234. package/docs/V0.4.12.md +88 -0
  235. package/docs/V0.4.13.md +203 -0
  236. package/docs/V0.4.14.md +209 -0
  237. package/docs/V0.4.15.md +365 -0
  238. package/docs/V0.4.16.md +229 -0
  239. package/docs/V0.4.md +28 -0
  240. package/docs/VALIDATION.md +23 -0
  241. package/package.json +18 -0
  242. package/policies/core/dependency-policy.rego +12 -0
  243. package/policies/core/schema-policy.rego +12 -0
  244. package/policies/core/trust-boundary.rego +17 -0
  245. package/presets/agents/default.jsonc +80 -0
  246. package/presets/docker.yaml +4 -0
  247. package/presets/dotnet.yaml +12 -0
  248. package/presets/expo.yaml +6 -0
  249. package/presets/generic.yaml +3 -0
  250. package/presets/nextjs.yaml +8 -0
  251. package/presets/node.yaml +6 -0
  252. package/presets/pnpm.yaml +6 -0
  253. package/presets/postgres.yaml +4 -0
  254. package/schemas/agent-output-planner.schema.json +1 -0
  255. package/schemas/agent-topology.schema.json +37 -0
  256. package/schemas/project.schema.json +36 -0
  257. package/schemas/quick-contract.schema.json +17 -0
  258. package/schemas/task-contract.schema.json +18 -0
  259. package/schemas/toolchain.schema.json +70 -0
  260. package/schemas/validation-report.schema.json +15 -0
  261. package/skills/acceptance-traceability/SKILL.md +13 -0
  262. package/skills/deterministic-validation/SKILL.md +15 -0
  263. package/skills/engineering-workflow/SKILL.md +108 -0
  264. package/skills/finding-dedup/SKILL.md +12 -0
  265. package/skills/github-delivery-lifecycle/SKILL.md +16 -0
  266. package/skills/implementation-worker/SKILL.md +17 -0
  267. package/skills/lead-engineer/SKILL.md +30 -0
  268. package/skills/memory-hygiene/SKILL.md +22 -0
  269. package/skills/prompt-drift-audit/SKILL.md +10 -0
  270. package/skills/recovery-classifier/SKILL.md +13 -0
  271. package/skills/routing-normalizer/SKILL.md +17 -0
  272. package/skills/sdd/SKILL.md +21 -0
  273. package/skills/simplify/SKILL.md +16 -0
  274. package/skills/verification-planning/SKILL.md +17 -0
  275. package/skills/worktree-lifecycle/SKILL.md +18 -0
  276. package/templates/AGENTS.md +37 -0
  277. package/templates/agents.source.jsonc +39 -0
  278. package/templates/otel-collector.yaml +21 -0
  279. package/templates/project.yaml +196 -0
  280. package/templates/toolchain.yaml +127 -0
@@ -0,0 +1,10 @@
1
+ import type { ResolvedToolchain, ToolchainConfig, ToolchainLock } from "./types.js";
2
+ export interface MiseAdapter {
3
+ command: string;
4
+ version?: string;
5
+ }
6
+ export declare function resolveMiseAdapter(root: string, minimumVersion?: string): Promise<MiseAdapter>;
7
+ export declare function writeMiseConfig(root: string, file: string, toolchain: ToolchainConfig, resolved: ResolvedToolchain, lock: ToolchainLock | undefined, updateLock: boolean): Promise<void>;
8
+ export declare function installMiseTools(root: string, adapter: MiseAdapter, dryRun?: boolean): Promise<void>;
9
+ export declare function miseResolvedVersion(root: string, adapter: MiseAdapter, command: string): Promise<string | undefined>;
10
+ export declare function miseBinPaths(root: string, adapter: MiseAdapter): Promise<string[]>;
@@ -0,0 +1,61 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { runProcess } from "../utils/process.js";
4
+ export async function resolveMiseAdapter(root, minimumVersion) {
5
+ const bootstrap = minimumVersion
6
+ ? `npm exec --yes --package=mise@${shellBare(minimumVersion)} -- mise`
7
+ : "npm exec --yes --package=mise -- mise";
8
+ const candidates = ["mise", bootstrap];
9
+ for (const command of candidates) {
10
+ const result = await runProcess(`${command} --version`, { cwd: root, timeoutMs: 60_000, toolchain: false });
11
+ if (result.exitCode !== 0)
12
+ continue;
13
+ const version = parseVersion(result.stdout || result.stderr);
14
+ if (minimumVersion && version && compareVersions(version, minimumVersion) < 0)
15
+ continue;
16
+ return { command, version };
17
+ }
18
+ throw new Error(`mise ${minimumVersion ? `>= ${minimumVersion} ` : ""}is required for toolchain setup. AEH attempted the configured/pinned npm bootstrap; install mise explicitly if that bootstrap is unavailable.`);
19
+ }
20
+ export async function writeMiseConfig(root, file, toolchain, resolved, lock, updateLock) {
21
+ const lines = ["# Generated by Agentic Engineering Harness. Edit .harness/toolchain.yaml instead.", "", "[settings]", "lockfile = true", ""];
22
+ lines.push("[tools]");
23
+ for (const tool of resolved.tools.filter((item) => item.provisioning === "mise")) {
24
+ const version = !updateLock ? lock?.tools[tool.name]?.resolvedVersion ?? tool.version ?? "latest" : tool.version ?? "latest";
25
+ lines.push(`${tomlKey(tool.source)} = ${JSON.stringify(version)}`);
26
+ }
27
+ lines.push("");
28
+ const target = path.resolve(root, file);
29
+ await fs.mkdir(path.dirname(target), { recursive: true });
30
+ await fs.writeFile(target, `${lines.join("\n")}\n`);
31
+ }
32
+ export async function installMiseTools(root, adapter, dryRun = false) {
33
+ const trust = await runProcess(`${adapter.command} trust`, { cwd: root, timeoutMs: 30_000, toolchain: false });
34
+ if (trust.exitCode !== 0 && !/already trusted/i.test(`${trust.stdout}\n${trust.stderr}`))
35
+ throw new Error(`mise trust failed: ${trust.stderr || trust.stdout}`);
36
+ const command = `${adapter.command} -y install${dryRun ? " --dry-run" : ""}`;
37
+ const result = await runProcess(command, { cwd: root, timeoutMs: 1_800_000, toolchain: false });
38
+ if (result.exitCode !== 0)
39
+ throw new Error(`mise install failed: ${result.stderr || result.stdout}`);
40
+ }
41
+ export async function miseResolvedVersion(root, adapter, command) {
42
+ const result = await runProcess(`${adapter.command} which ${shell(command)} --version`, { cwd: root, timeoutMs: 30_000, toolchain: false });
43
+ return result.exitCode === 0 ? result.stdout.trim() || undefined : undefined;
44
+ }
45
+ export async function miseBinPaths(root, adapter) {
46
+ const result = await runProcess(`${adapter.command} bin-paths`, { cwd: root, timeoutMs: 30_000, toolchain: false });
47
+ if (result.exitCode !== 0)
48
+ throw new Error(`mise bin-paths failed: ${result.stderr || result.stdout}`);
49
+ return [...new Set(result.stdout.split(/\r?\n/).map((value) => value.trim()).filter(Boolean))];
50
+ }
51
+ function tomlKey(value) { return /^[A-Za-z0-9_-]+$/.test(value) ? value : JSON.stringify(value); }
52
+ function shell(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
53
+ function shellBare(value) { if (!/^[A-Za-z0-9._-]+$/.test(value))
54
+ throw new Error(`Unsafe mise bootstrap version: ${value}`); return value; }
55
+ function parseVersion(value) { return value.match(/(\d{4}\.\d+(?:\.\d+)?|\d+\.\d+(?:\.\d+)?)/)?.[1]; }
56
+ function compareVersions(left, right) { const a = left.split(".").map(Number), b = right.split(".").map(Number); for (let i = 0; i < Math.max(a.length, b.length); i++) {
57
+ const diff = (a[i] ?? 0) - (b[i] ?? 0);
58
+ if (diff)
59
+ return diff;
60
+ } return 0; }
61
+ //# sourceMappingURL=mise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mise.js","sourceRoot":"","sources":["../../src/toolchain/mise.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { HarnessProjectConfig } from "../core/types.js";
2
+ import type { ResolvedToolchain, ToolchainConfig } from "./types.js";
3
+ export declare function resolveToolchain(root: string, project: HarnessProjectConfig, toolchain: ToolchainConfig, options?: {
4
+ profile?: string;
5
+ preferContainers?: boolean;
6
+ containerAvailable?: boolean;
7
+ }): Promise<ResolvedToolchain>;
8
+ export declare function profileTools(toolchain: ToolchainConfig, profile: string): string[];
@@ -0,0 +1,159 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { loadResolvedAgentTopology } from "../agents/config.js";
4
+ export async function resolveToolchain(root, project, toolchain, options = {}) {
5
+ const profile = options.profile ?? "auto";
6
+ const selected = new Map();
7
+ if (profile !== "auto") {
8
+ for (const name of profileTools(toolchain, profile))
9
+ select(selected, name, `profile:${profile}`);
10
+ }
11
+ else {
12
+ const capabilities = await activeCapabilities(root, project);
13
+ for (const [name, definition] of Object.entries(toolchain.tools)) {
14
+ const rules = definition.activateWhen ?? [];
15
+ if (rules.includes("always"))
16
+ select(selected, name, "activation:always");
17
+ for (const rule of rules)
18
+ if (capabilities.has(rule))
19
+ select(selected, name, `activation:${rule}`);
20
+ }
21
+ }
22
+ expandDependencies(toolchain, selected);
23
+ const versionOverrides = await projectVersionOverrides(root);
24
+ const preferContainers = options.preferContainers ?? toolchain.strategy?.validators === "prefer-container";
25
+ const tools = [...selected.entries()].map(([name, selectedBy]) => {
26
+ const definition = requireTool(toolchain, name);
27
+ const provisioning = definition.kind === "system" ? "system"
28
+ : preferContainers && options.containerAvailable && definition.container ? "container"
29
+ : "mise";
30
+ return { name, ...definition, version: versionOverrides[name] ?? definition.version, selectedBy, provisioning };
31
+ });
32
+ tools.sort((a, b) => a.name.localeCompare(b.name));
33
+ return { profile, tools };
34
+ }
35
+ export function profileTools(toolchain, profile) {
36
+ const visiting = new Set();
37
+ const result = new Set();
38
+ const visit = (name) => {
39
+ if (visiting.has(name))
40
+ throw new Error(`Toolchain profile cycle detected at '${name}'.`);
41
+ const value = toolchain.profiles?.[name];
42
+ if (!value)
43
+ throw new Error(`Unknown toolchain profile '${name}'.`);
44
+ visiting.add(name);
45
+ for (const parent of value.extends ?? [])
46
+ visit(parent);
47
+ for (const tool of value.tools ?? [])
48
+ result.add(tool);
49
+ visiting.delete(name);
50
+ };
51
+ visit(profile);
52
+ return [...result];
53
+ }
54
+ async function activeCapabilities(root, project) {
55
+ const result = new Set();
56
+ if (project.agents) {
57
+ try {
58
+ const topology = await loadResolvedAgentTopology(root, project, project.agents.activeProfile);
59
+ for (const agent of Object.values(topology.agents))
60
+ if (!agent.disabled)
61
+ result.add(`runtime:${agent.runtime.name}`);
62
+ }
63
+ catch { /* doctor/setup will surface topology problems independently */ }
64
+ }
65
+ if (project.orchestration?.provider)
66
+ result.add(`orchestration:${project.orchestration.provider}`);
67
+ if (project.delivery?.paseo?.enabled)
68
+ result.add("delivery:paseo");
69
+ if (project.delivery?.github?.enabled)
70
+ result.add("delivery:github");
71
+ if (project.memory?.provider)
72
+ result.add(`memory:${project.memory.provider}`);
73
+ if (project.codeIntelligence?.provider)
74
+ result.add(`code-intelligence:${project.codeIntelligence.provider}`);
75
+ if (project.validation?.opa?.enabled)
76
+ result.add("validation:opa");
77
+ if (project.security?.sandbox?.provider)
78
+ result.add(`sandbox:${project.security.sandbox.provider}`);
79
+ for (const name of project.security?.tools ?? [])
80
+ result.add(`security-tool:${name}`);
81
+ for (const validator of project.validation?.validators ?? [])
82
+ result.add(`validator:${validator.adapter}`);
83
+ await addProjectCapabilities(root, result);
84
+ return result;
85
+ }
86
+ async function addProjectCapabilities(root, result) {
87
+ const files = new Set(await fs.readdir(root).catch(() => []));
88
+ if (files.has("package.json"))
89
+ result.add("project:node");
90
+ if (files.has("bun.lock") || files.has("bun.lockb"))
91
+ result.add("project:bun");
92
+ if (files.has("pnpm-lock.yaml"))
93
+ result.add("project:pnpm");
94
+ if (files.has("yarn.lock"))
95
+ result.add("project:yarn");
96
+ if (files.has("uv.lock") || files.has("pyproject.toml"))
97
+ result.add("project:python");
98
+ if ([...files].some((name) => name.endsWith(".sln") || name.endsWith(".slnx") || name.endsWith(".csproj")) || files.has("global.json"))
99
+ result.add("project:dotnet");
100
+ if (files.has("go.mod"))
101
+ result.add("project:go");
102
+ if (files.has("Cargo.toml"))
103
+ result.add("project:rust");
104
+ try {
105
+ const pkg = JSON.parse(await fs.readFile(path.join(root, "package.json"), "utf8"));
106
+ const manager = typeof pkg.packageManager === "string" ? pkg.packageManager.split("@")[0] : undefined;
107
+ if (manager)
108
+ result.add(`project:${manager}`);
109
+ }
110
+ catch { /* package.json is optional */ }
111
+ }
112
+ async function projectVersionOverrides(root) {
113
+ const result = {};
114
+ for (const name of [".node-version", ".nvmrc"]) {
115
+ try {
116
+ const value = (await fs.readFile(path.join(root, name), "utf8")).trim().replace(/^v/, "");
117
+ if (value) {
118
+ result.node = value;
119
+ break;
120
+ }
121
+ }
122
+ catch { /* optional */ }
123
+ }
124
+ try {
125
+ const global = JSON.parse(await fs.readFile(path.join(root, "global.json"), "utf8"));
126
+ if (typeof global.sdk?.version === "string" && global.sdk.version.trim())
127
+ result.dotnet = global.sdk.version.trim();
128
+ }
129
+ catch { /* optional */ }
130
+ try {
131
+ const pkg = JSON.parse(await fs.readFile(path.join(root, "package.json"), "utf8"));
132
+ if (typeof pkg.packageManager === "string") {
133
+ const match = pkg.packageManager.match(/^bun@(.+)$/);
134
+ if (match)
135
+ result.bun = match[1];
136
+ }
137
+ }
138
+ catch { /* optional */ }
139
+ return result;
140
+ }
141
+ function expandDependencies(toolchain, selected) {
142
+ let changed = true;
143
+ while (changed) {
144
+ changed = false;
145
+ for (const name of [...selected.keys()]) {
146
+ const tool = requireTool(toolchain, name);
147
+ for (const dependency of tool.dependsOn ?? [])
148
+ if (!selected.has(dependency)) {
149
+ select(selected, dependency, `dependency:${name}`);
150
+ changed = true;
151
+ }
152
+ }
153
+ }
154
+ }
155
+ function select(selected, name, reason) { const reasons = selected.get(name) ?? []; if (!reasons.includes(reason))
156
+ reasons.push(reason); selected.set(name, reasons); }
157
+ function requireTool(toolchain, name) { const tool = toolchain.tools[name]; if (!tool)
158
+ throw new Error(`Toolchain references unknown tool '${name}'.`); return tool; }
159
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/toolchain/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,OAA6B,EAC7B,SAA0B,EAC1B,UAA0F,EAAE;IAE5F,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE7C,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC;YAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,OAAO,EAAE,CAAC,CAAC;IACpG,CAAC;SAAM,CAAC;QACN,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7D,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACjE,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,IAAI,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC;YAC1E,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxC,MAAM,gBAAgB,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,SAAS,CAAC,QAAQ,EAAE,UAAU,KAAK,kBAAkB,CAAC;IAC3G,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE;QAC/D,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAiB;YACnE,CAAC,CAAC,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,WAAoB;gBAC/F,CAAC,CAAC,MAAe,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;IAClH,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAA0B,EAAE,OAAe;IACtE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAAC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACrE,MAAM,KAAK,GAAG,CAAC,IAAY,EAAQ,EAAE;QACnC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,IAAI,CAAC,CAAC;QAC1F,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;QAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,IAAI,CAAC,CAAC;QAC9G,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAAC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE;YAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAAC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7J,CAAC,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,CAAC;IAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,OAA6B;IAC3E,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC9F,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;oBAAE,MAAM,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACvH,CAAC;QAAC,MAAM,CAAC,CAAC,+DAA+D,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,CAAC,aAAa,EAAE,QAAQ;QAAE,MAAM,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnG,IAAI,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO;QAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACnE,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO;QAAE,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACrE,IAAI,OAAO,CAAC,MAAM,EAAE,QAAQ;QAAE,MAAM,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9E,IAAI,OAAO,CAAC,gBAAgB,EAAE,QAAQ;QAAE,MAAM,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7G,IAAI,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO;QAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACnE,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ;QAAE,MAAM,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpG,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAAE,MAAM,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACtF,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE;QAAE,MAAM,CAAC,GAAG,CAAC,aAAa,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3G,MAAM,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,IAAY,EAAE,MAAmB;IACrE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAc,CAAC,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC/E,IAAI,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACvD,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACtF,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACrK,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAiC,CAAC;QACnH,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtG,IAAI,OAAO;YAAE,MAAM,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,IAAY;IACjD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC;YAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAAC,IAAI,KAAK,EAAE,CAAC;gBAAC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;gBAAC,MAAM;YAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;IACxK,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAoC,CAAC;QACxH,IAAI,OAAO,MAAM,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACtH,CAAC;IAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAiC,CAAC;QACnH,IAAI,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAAC,IAAI,KAAK;gBAAE,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,SAA0B,EAAE,QAA+B;IACrF,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,OAAO,OAAO,EAAE,CAAC;QACf,OAAO,GAAG,KAAK,CAAC;QAChB,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC1C,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE;gBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oBAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC;oBAAC,OAAO,GAAG,IAAI,CAAC;gBAAC,CAAC;QACvJ,CAAC;IACH,CAAC;AACH,CAAC;AACD,SAAS,MAAM,CAAC,QAA+B,EAAE,IAAY,EAAE,MAAc,IAAU,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACpN,SAAS,WAAW,CAAC,SAA0B,EAAE,IAAY,IAA6B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;IAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { HarnessProjectConfig } from "../core/types.js";
2
+ import type { ToolchainSetupOptions, ToolchainSetupResult } from "./types.js";
3
+ export declare function setupToolchain(root: string, project: HarnessProjectConfig, options?: ToolchainSetupOptions): Promise<ToolchainSetupResult>;
4
+ export declare function compileToolchain(root: string, project: HarnessProjectConfig, options?: {
5
+ profile?: string;
6
+ updateLock?: boolean;
7
+ }): Promise<string>;
@@ -0,0 +1,141 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { runProcess, clearToolchainEnvCache } from "../utils/process.js";
4
+ import { generatedMisePath, loadToolchainConfig, loadToolchainLock, toolchainLockPath, toolchainStatePath, writeJsonFile } from "./config.js";
5
+ import { resolveToolchain } from "./resolve.js";
6
+ import { installMiseTools, miseBinPaths, miseResolvedVersion, resolveMiseAdapter, writeMiseConfig } from "./mise.js";
7
+ export async function setupToolchain(root, project, options = {}) {
8
+ const toolchain = await loadToolchainConfig(root, project);
9
+ const lock = await loadToolchainLock(root, project, toolchain);
10
+ const engine = toolchain.strategy?.containerEngine ?? "podman";
11
+ const engineAvailable = await rawCommandExists(root, engine);
12
+ const resolved = await resolveToolchain(root, project, toolchain, { profile: options.profile, preferContainers: options.preferContainers, containerAvailable: engineAvailable });
13
+ const generatedConfig = generatedMisePath(project, toolchain);
14
+ const lockFile = toolchainLockPath(project, toolchain);
15
+ const stateFile = toolchainStatePath(project, toolchain);
16
+ const systemMissing = [];
17
+ const installed = [];
18
+ const containers = [];
19
+ const lockTools = {};
20
+ const projectDependencyCommands = await resolveProjectDependencyCommands(root, toolchain.projectDependencies?.autoDetect !== false, toolchain.projectDependencies?.commands ?? []);
21
+ for (const tool of resolved.tools.filter((item) => item.provisioning === "system")) {
22
+ const ok = await rawCommandExists(root, tool.command);
23
+ if (!ok)
24
+ systemMissing.push(tool.name);
25
+ lockTools[tool.name] = { command: tool.command, provisioning: "system", requestedVersion: tool.version, resolvedVersion: ok ? await commandVersion(root, tool.command) : undefined };
26
+ }
27
+ const requiredMissing = resolved.tools.filter((tool) => tool.provisioning === "system" && tool.required && systemMissing.includes(tool.name));
28
+ if (requiredMissing.length && !options.dryRun)
29
+ throw new Error(`Required host tools are missing and are not installed automatically: ${requiredMissing.map((item) => item.command).join(", ")}.`);
30
+ const miseTools = resolved.tools.filter((item) => item.provisioning === "mise");
31
+ const containerTools = resolved.tools.filter((item) => item.provisioning === "container");
32
+ if (options.dryRun) {
33
+ installed.push(...miseTools.map((tool) => `${tool.name}@${!options.updateLock ? lock?.tools[tool.name]?.resolvedVersion ?? tool.version ?? "latest" : tool.version ?? "latest"}`));
34
+ containers.push(...containerTools.map((tool) => `${tool.name}:${!options.updateLock ? lock?.tools[tool.name]?.digestRef ?? tool.container.image : tool.container.image}`));
35
+ return { profile: resolved.profile, generatedConfig, lockFile, stateFile, installed, containers, systemMissing, projectDependencyCommands, dryRun: true };
36
+ }
37
+ let adapter;
38
+ let binPaths = [];
39
+ if (miseTools.length) {
40
+ adapter = await resolveMiseAdapter(root, toolchain.manager.minimumVersion);
41
+ await writeMiseConfig(root, generatedConfig, toolchain, resolved, lock, options.updateLock ?? false);
42
+ await installMiseTools(root, adapter, false);
43
+ binPaths = await miseBinPaths(root, adapter);
44
+ for (const tool of miseTools) {
45
+ const resolvedVersion = await miseResolvedVersion(root, adapter, tool.command);
46
+ lockTools[tool.name] = { source: tool.source, requestedVersion: tool.version, resolvedVersion, command: tool.command, provisioning: "mise" };
47
+ installed.push(`${tool.name}@${resolvedVersion ?? tool.version ?? "unknown"}`);
48
+ }
49
+ }
50
+ const wrappersDir = path.resolve(root, ".harness/bin");
51
+ for (const tool of containerTools) {
52
+ const configuredImage = tool.container.image;
53
+ const lockedRef = !options.updateLock ? lock?.tools[tool.name]?.digestRef : undefined;
54
+ const pullRef = lockedRef ?? configuredImage;
55
+ const pull = await runProcess(`${engine} pull ${quote(pullRef)}`, { cwd: root, timeoutMs: 900_000, toolchain: false });
56
+ if (pull.exitCode !== 0)
57
+ throw new Error(`${engine} pull failed for ${pullRef}: ${pull.stderr || pull.stdout}`);
58
+ const digestRef = lockedRef ?? await inspectDigest(root, engine, configuredImage);
59
+ await writeContainerWrapper(wrappersDir, tool.command, engine, digestRef);
60
+ lockTools[tool.name] = { source: tool.source, requestedVersion: tool.version, command: tool.command, provisioning: "container", image: configuredImage, digestRef };
61
+ containers.push(`${tool.name}:${digestRef}`);
62
+ }
63
+ if (!options.skipProjectDependencies) {
64
+ const env = { PATH: `${[wrappersDir, ...binPaths].join(path.delimiter)}${path.delimiter}${process.env.PATH ?? ""}` };
65
+ for (const command of projectDependencyCommands) {
66
+ const result = await runProcess(command, { cwd: root, timeoutMs: 1_800_000, env, toolchain: false });
67
+ if (result.exitCode !== 0)
68
+ throw new Error(`Project dependency setup failed (${command}): ${result.stderr || result.stdout}`);
69
+ }
70
+ }
71
+ const finalLock = { version: 1, generatedAt: new Date().toISOString(), profile: resolved.profile, tools: lockTools };
72
+ await writeJsonFile(path.resolve(root, lockFile), finalLock);
73
+ const state = { version: 1, generatedAt: new Date().toISOString(), manager: { provider: toolchain.manager.provider, command: adapter?.command ?? "system", version: adapter?.version }, binPaths: [...new Set([wrappersDir, ...binPaths])], wrappersDir, projectDependencyCommands };
74
+ await writeJsonFile(path.resolve(root, stateFile), state);
75
+ clearToolchainEnvCache();
76
+ return { profile: resolved.profile, generatedConfig, lockFile, stateFile, installed, containers, systemMissing, projectDependencyCommands, dryRun: false };
77
+ }
78
+ export async function compileToolchain(root, project, options = {}) {
79
+ const toolchain = await loadToolchainConfig(root, project);
80
+ const lock = await loadToolchainLock(root, project, toolchain);
81
+ const resolved = await resolveToolchain(root, project, toolchain, { profile: options.profile, containerAvailable: false });
82
+ const target = generatedMisePath(project, toolchain);
83
+ await writeMiseConfig(root, target, toolchain, resolved, lock, options.updateLock ?? false);
84
+ return target;
85
+ }
86
+ async function resolveProjectDependencyCommands(root, autoDetect, configured) {
87
+ const commands = [...configured];
88
+ if (!autoDetect)
89
+ return unique(commands);
90
+ if (await exists(path.join(root, "package-lock.json")))
91
+ commands.push("npm ci");
92
+ else if (await exists(path.join(root, "pnpm-lock.yaml")))
93
+ commands.push("corepack pnpm install --frozen-lockfile");
94
+ else if (await exists(path.join(root, "bun.lock")) || await exists(path.join(root, "bun.lockb")))
95
+ commands.push("bun install --frozen-lockfile");
96
+ else if (await exists(path.join(root, "yarn.lock"))) {
97
+ const packageManager = await packageManagerDeclaration(root);
98
+ commands.push(packageManager?.startsWith("yarn@1.") ? "corepack yarn install --frozen-lockfile" : "corepack yarn install --immutable");
99
+ }
100
+ if (await exists(path.join(root, "uv.lock")))
101
+ commands.push("uv sync --frozen");
102
+ const entries = await fs.readdir(root).catch(() => []);
103
+ if (entries.some((name) => name.endsWith(".sln") || name.endsWith(".slnx") || name.endsWith(".csproj")) || await exists(path.join(root, "global.json")))
104
+ commands.push("dotnet restore");
105
+ return unique(commands);
106
+ }
107
+ async function packageManagerDeclaration(root) {
108
+ try {
109
+ const pkg = JSON.parse(await fs.readFile(path.join(root, "package.json"), "utf8"));
110
+ return typeof pkg.packageManager === "string" ? pkg.packageManager : undefined;
111
+ }
112
+ catch {
113
+ return undefined;
114
+ }
115
+ }
116
+ async function writeContainerWrapper(dir, command, engine, image) {
117
+ await fs.mkdir(dir, { recursive: true });
118
+ const file = path.join(dir, command);
119
+ const script = `#!/bin/sh\nset -eu\nexec ${engine} run --rm -i -v "$PWD:/workspace" -w /workspace ${shellLiteral(image)} "$@"\n`;
120
+ await fs.writeFile(file, script, { mode: 0o755 });
121
+ await fs.chmod(file, 0o755);
122
+ }
123
+ async function inspectDigest(root, engine, image) {
124
+ const inspect = await runProcess(`${engine} image inspect --format '{{index .RepoDigests 0}}' ${quote(image)}`, { cwd: root, timeoutMs: 60_000, toolchain: false });
125
+ if (inspect.exitCode !== 0 || !inspect.stdout.trim())
126
+ throw new Error(`Could not resolve immutable digest for ${image}: ${inspect.stderr || inspect.stdout}`);
127
+ return inspect.stdout.trim();
128
+ }
129
+ async function commandVersion(root, command) { const result = await runProcess(`${command} --version`, { cwd: root, timeoutMs: 15_000, toolchain: false }); return result.exitCode === 0 ? (result.stdout || result.stderr).split(/\r?\n/)[0]?.trim() : undefined; }
130
+ async function rawCommandExists(root, command) { return (await runProcess(`command -v ${quote(command)}`, { cwd: root, timeoutMs: 10_000, toolchain: false })).exitCode === 0; }
131
+ async function exists(file) { try {
132
+ await fs.access(file);
133
+ return true;
134
+ }
135
+ catch {
136
+ return false;
137
+ } }
138
+ function unique(values) { return [...new Set(values)]; }
139
+ function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
140
+ function shellLiteral(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
141
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/toolchain/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ export type ToolchainToolKind = "system" | "mise";
2
+ export type ValidatorProvisioningStrategy = "local" | "prefer-container";
3
+ export interface ToolchainManagerConfig {
4
+ provider: "mise" | string;
5
+ generatedConfig?: string;
6
+ lockFile?: string;
7
+ stateFile?: string;
8
+ minimumVersion?: string;
9
+ }
10
+ export interface ToolchainProfile {
11
+ extends?: string[];
12
+ tools?: string[];
13
+ }
14
+ export interface ToolchainContainerAlternative {
15
+ image: string;
16
+ engine?: "podman" | "docker" | string;
17
+ }
18
+ export interface ToolchainToolDefinition {
19
+ kind: ToolchainToolKind;
20
+ command: string;
21
+ source?: string;
22
+ version?: string;
23
+ required?: boolean;
24
+ dependsOn?: string[];
25
+ activateWhen?: string[];
26
+ container?: ToolchainContainerAlternative;
27
+ }
28
+ export interface ToolchainConfig {
29
+ version: 1;
30
+ manager: ToolchainManagerConfig;
31
+ strategy?: {
32
+ validators?: ValidatorProvisioningStrategy;
33
+ containerEngine?: "podman" | "docker" | string;
34
+ };
35
+ profiles?: Record<string, ToolchainProfile>;
36
+ tools: Record<string, ToolchainToolDefinition>;
37
+ projectDependencies?: {
38
+ autoDetect?: boolean;
39
+ commands?: string[];
40
+ };
41
+ }
42
+ export interface ResolvedToolchainTool extends ToolchainToolDefinition {
43
+ name: string;
44
+ selectedBy: string[];
45
+ provisioning: "system" | "mise" | "container";
46
+ }
47
+ export interface ResolvedToolchain {
48
+ profile: string;
49
+ tools: ResolvedToolchainTool[];
50
+ }
51
+ export interface ToolchainLockTool {
52
+ source?: string;
53
+ requestedVersion?: string;
54
+ resolvedVersion?: string;
55
+ command: string;
56
+ provisioning: "system" | "mise" | "container";
57
+ image?: string;
58
+ digestRef?: string;
59
+ }
60
+ export interface ToolchainLock {
61
+ version: 1;
62
+ generatedAt: string;
63
+ profile: string;
64
+ tools: Record<string, ToolchainLockTool>;
65
+ }
66
+ export interface ToolchainState {
67
+ version: 1;
68
+ generatedAt: string;
69
+ manager: {
70
+ provider: string;
71
+ command: string;
72
+ version?: string;
73
+ };
74
+ binPaths: string[];
75
+ wrappersDir?: string;
76
+ projectDependencyCommands: string[];
77
+ }
78
+ export interface ToolchainSetupOptions {
79
+ profile?: string;
80
+ dryRun?: boolean;
81
+ updateLock?: boolean;
82
+ skipProjectDependencies?: boolean;
83
+ preferContainers?: boolean;
84
+ }
85
+ export interface ToolchainSetupResult {
86
+ profile: string;
87
+ generatedConfig: string;
88
+ lockFile: string;
89
+ stateFile: string;
90
+ installed: string[];
91
+ containers: string[];
92
+ systemMissing: string[];
93
+ projectDependencyCommands: string[];
94
+ dryRun: boolean;
95
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/toolchain/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ export interface ProcessResult {
2
+ exitCode: number;
3
+ stdout: string;
4
+ stderr: string;
5
+ durationMs: number;
6
+ }
7
+ export declare function clearToolchainEnvCache(): void;
8
+ export declare function runProcess(command: string, options: {
9
+ cwd: string;
10
+ timeoutMs?: number;
11
+ shell?: boolean;
12
+ env?: Record<string, string | undefined>;
13
+ toolchain?: boolean;
14
+ }): Promise<ProcessResult>;
15
+ export declare function commandExists(command: string, cwd: string): Promise<boolean>;