@ranimontagna/agent-toolkit 0.2.3 → 0.3.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 (102) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +21 -7
  3. package/dist/bin/agent-toolkit.js +9 -4
  4. package/dist/bin/agent-toolkit.js.map +1 -1
  5. package/dist/src/ariadne/args.d.ts +2 -0
  6. package/dist/src/ariadne/args.js +146 -0
  7. package/dist/src/ariadne/args.js.map +1 -0
  8. package/dist/src/ariadne/checks.d.ts +24 -0
  9. package/dist/src/ariadne/checks.js +74 -0
  10. package/dist/src/ariadne/checks.js.map +1 -0
  11. package/dist/src/ariadne/cli.d.ts +38 -0
  12. package/dist/src/ariadne/cli.js +206 -0
  13. package/dist/src/ariadne/cli.js.map +1 -0
  14. package/dist/src/ariadne/doctor.d.ts +16 -0
  15. package/dist/src/ariadne/doctor.js +207 -0
  16. package/dist/src/ariadne/doctor.js.map +1 -0
  17. package/dist/src/ariadne/git.d.ts +58 -0
  18. package/dist/src/ariadne/git.js +577 -0
  19. package/dist/src/ariadne/git.js.map +1 -0
  20. package/dist/src/ariadne/import.d.ts +2 -0
  21. package/dist/src/ariadne/import.js +93 -0
  22. package/dist/src/ariadne/import.js.map +1 -0
  23. package/dist/src/ariadne/init.d.ts +47 -0
  24. package/dist/src/ariadne/init.js +345 -0
  25. package/dist/src/ariadne/init.js.map +1 -0
  26. package/dist/src/ariadne/lock.d.ts +22 -0
  27. package/dist/src/ariadne/lock.js +478 -0
  28. package/dist/src/ariadne/lock.js.map +1 -0
  29. package/dist/src/ariadne/loop.d.ts +26 -0
  30. package/dist/src/ariadne/loop.js +1316 -0
  31. package/dist/src/ariadne/loop.js.map +1 -0
  32. package/dist/src/ariadne/ownership.d.ts +32 -0
  33. package/dist/src/ariadne/ownership.js +161 -0
  34. package/dist/src/ariadne/ownership.js.map +1 -0
  35. package/dist/src/ariadne/process.d.ts +27 -0
  36. package/dist/src/ariadne/process.js +302 -0
  37. package/dist/src/ariadne/process.js.map +1 -0
  38. package/dist/src/ariadne/prompt.d.ts +11 -0
  39. package/dist/src/ariadne/prompt.js +29 -0
  40. package/dist/src/ariadne/prompt.js.map +1 -0
  41. package/dist/src/ariadne/render.d.ts +7 -0
  42. package/dist/src/ariadne/render.js +72 -0
  43. package/dist/src/ariadne/render.js.map +1 -0
  44. package/dist/src/ariadne/result.d.ts +54 -0
  45. package/dist/src/ariadne/result.js +129 -0
  46. package/dist/src/ariadne/result.js.map +1 -0
  47. package/dist/src/ariadne/runtimes/antigravity.d.ts +2 -0
  48. package/dist/src/ariadne/runtimes/antigravity.js +17 -0
  49. package/dist/src/ariadne/runtimes/antigravity.js.map +1 -0
  50. package/dist/src/ariadne/runtimes/claude.d.ts +2 -0
  51. package/dist/src/ariadne/runtimes/claude.js +17 -0
  52. package/dist/src/ariadne/runtimes/claude.js.map +1 -0
  53. package/dist/src/ariadne/runtimes/codex.d.ts +2 -0
  54. package/dist/src/ariadne/runtimes/codex.js +24 -0
  55. package/dist/src/ariadne/runtimes/codex.js.map +1 -0
  56. package/dist/src/ariadne/runtimes/gemini.d.ts +2 -0
  57. package/dist/src/ariadne/runtimes/gemini.js +18 -0
  58. package/dist/src/ariadne/runtimes/gemini.js.map +1 -0
  59. package/dist/src/ariadne/runtimes/index.d.ts +4 -0
  60. package/dist/src/ariadne/runtimes/index.js +82 -0
  61. package/dist/src/ariadne/runtimes/index.js.map +1 -0
  62. package/dist/src/ariadne/runtimes/opencode.d.ts +2 -0
  63. package/dist/src/ariadne/runtimes/opencode.js +19 -0
  64. package/dist/src/ariadne/runtimes/opencode.js.map +1 -0
  65. package/dist/src/ariadne/runtimes/shared.d.ts +24 -0
  66. package/dist/src/ariadne/runtimes/shared.js +141 -0
  67. package/dist/src/ariadne/runtimes/shared.js.map +1 -0
  68. package/dist/src/ariadne/runtimes/types.d.ts +56 -0
  69. package/dist/src/ariadne/runtimes/types.js +3 -0
  70. package/dist/src/ariadne/runtimes/types.js.map +1 -0
  71. package/dist/src/ariadne/schema.d.ts +11 -0
  72. package/dist/src/ariadne/schema.js +214 -0
  73. package/dist/src/ariadne/schema.js.map +1 -0
  74. package/dist/src/ariadne/status.d.ts +72 -0
  75. package/dist/src/ariadne/status.js +280 -0
  76. package/dist/src/ariadne/status.js.map +1 -0
  77. package/dist/src/ariadne/store.d.ts +99 -0
  78. package/dist/src/ariadne/store.js +738 -0
  79. package/dist/src/ariadne/store.js.map +1 -0
  80. package/dist/src/ariadne/types.d.ts +128 -0
  81. package/dist/src/ariadne/types.js +5 -0
  82. package/dist/src/ariadne/types.js.map +1 -0
  83. package/dist/src/ariadne/usage.d.ts +1 -0
  84. package/dist/src/ariadne/usage.js +8 -0
  85. package/dist/src/ariadne/usage.js.map +1 -0
  86. package/dist/src/cli.d.ts +5 -0
  87. package/dist/src/cli.js +14 -0
  88. package/dist/src/cli.js.map +1 -0
  89. package/dist/src/skills-audit.d.ts +6 -0
  90. package/dist/src/skills-audit.js +36 -2
  91. package/dist/src/skills-audit.js.map +1 -1
  92. package/dist/src/tool-lock.d.ts +20 -0
  93. package/dist/src/tool-lock.js +26 -0
  94. package/dist/src/tool-lock.js.map +1 -1
  95. package/dist/src/usage.js +1 -0
  96. package/dist/src/usage.js.map +1 -1
  97. package/package.json +7 -3
  98. package/skills/workflow/ariadne/NOTICE.md +11 -0
  99. package/skills/workflow/ariadne/SKILL.md +96 -0
  100. package/skills/workflow/ariadne-prd/NOTICE.md +11 -0
  101. package/skills/workflow/ariadne-prd/SKILL.md +69 -0
  102. package/tools.lock.json +40 -21
package/CHANGELOG.md CHANGED
@@ -13,6 +13,12 @@ Agent Toolkit has evolved from a hardened installer foundation into a catalog-dr
13
13
 
14
14
  The release entries below are based on Git tag ranges and npm publication metadata. Publication uses Git tags plus GitHub Actions, not GitHub Release objects.
15
15
 
16
+ ## [Unreleased]
17
+
18
+ - Added Ariadne, a runtime-neutral autonomous coding loop for Claude Code, Codex CLI, OpenCode, Gemini CLI, and Antigravity, with private-index exact-tree commits on an explicit certified ref, persistent pre-probe and cross-invocation ownership certification, contained creator-certified artifacts, project-root durable quarantine, strict lock ownership, sanitized failure memory, retries, recovery, diagnostics, and stable exit codes.
19
+ - Added first-party `ariadne` and `ariadne-prd` companion skills through the existing Custom Skills pipeline, plus immutable MIT-licensed upstream attribution in `tools.lock.json` and per-skill notices.
20
+ - Documented Ariadne setup, configuration, permissions, migration, runtime support, logs, recovery, testing, architecture boundaries, and non-goals without creating a release.
21
+
16
22
  ## [0.2.1] - 2026-07-14
17
23
 
18
24
  Published to npm
package/README.md CHANGED
@@ -13,6 +13,17 @@ npx -y @ranimontagna/agent-toolkit --all --codex
13
13
 
14
14
  `--all` installs the default tool set. Agent Browser remains a separate opt-in because it also provisions Chrome for Testing. See [Getting Started](docs/GETTING-STARTED.md) for interactive setup, project-local installs, and selective skill examples.
15
15
 
16
+ To start an Ariadne autonomous coding loop inside a Git repository:
17
+
18
+ ```bash
19
+ npx -y @ranimontagna/agent-toolkit ariadne init
20
+ npx -y @ranimontagna/agent-toolkit ariadne doctor
21
+ npx -y @ranimontagna/agent-toolkit ariadne run
22
+ npx -y @ranimontagna/agent-toolkit ariadne status
23
+ ```
24
+
25
+ A normal Ariadne run autonomously edits the project and creates successful-story commits. It never pushes or uses destructive Git cleanup; use `ariadne run --dry-run` before granting the selected runtime's headless permission mode. See [Getting Started](docs/GETTING-STARTED.md#run-ariadne) for state, recovery, logs, and exit codes.
26
+
16
27
  ## Choose Tools and Runtimes
17
28
 
18
29
  | Selection | CLI form | What it targets |
@@ -51,13 +62,14 @@ Current external sources:
51
62
 
52
63
  | Tool | Locked source |
53
64
  |---|---|
54
- | RTK | `rtk-ai/rtk@v0.43.0`, with a SHA-256 pin for every supported archive |
55
- | Caveman | `JuliusBrussee/caveman@25d22f864ad68cc447a4cb93aefde918aa4aec9f` |
56
- | Graphify | `graphifyy==0.9.11` |
57
- | GSD | `@opengsd/gsd-core@1.7.0` |
58
- | Agent Browser | `agent-browser@0.31.1` |
59
- | Agent Skills CLI | `skills@1.5.13`, with each source repository pinned to a full commit |
60
- | Runtime CLIs | `@anthropic-ai/claude-code@2.1.204`, `@openai/codex@0.143.0`, `opencode-ai@1.17.15`, and `@google/gemini-cli@0.49.0` |
65
+ | RTK | `rtk-ai/rtk@v0.44.0`, with a SHA-256 pin for every supported archive |
66
+ | Caveman | `JuliusBrussee/caveman@0d95a81d35a9f2d123a5e9430d1cfc43d55f1bb0` |
67
+ | Graphify | `graphifyy==0.9.29` |
68
+ | GSD | `@opengsd/gsd-core@1.8.0` |
69
+ | Agent Browser | `agent-browser@0.33.1` |
70
+ | Agent Skills CLI | `skills@1.5.20`, with each source repository pinned to a full commit |
71
+ | Runtime CLIs | `@anthropic-ai/claude-code@2.1.220`, `@openai/codex@0.145.0`, `opencode-ai@1.18.8`, and `@google/gemini-cli@0.52.0` |
72
+ | Ariadne adaptation provenance | `snarktank/ralph@6c53cb0b831ebe8739c6a003e22af14902d8b0b5`, with reviewed SHA-256 values for the MIT license and both adapted source skills |
61
73
 
62
74
  The Agent Skills catalog exposes these locked bundle IDs and skill names:
63
75
 
@@ -73,6 +85,8 @@ Bundled third-party skills preserve upstream attribution and license files in th
73
85
 
74
86
  The first-party `security` skills are defensive rewrites informed by [`uphiago/recon-skills`](https://github.com/uphiago/recon-skills), under its MIT License. They are intended for authorized, non-destructive reviews; upstream offensive infrastructure, agent instructions, scripts, and mass-scanning workflows are not included. See [`skills/security/NOTICE.md`](skills/security/NOTICE.md) for attribution.
75
87
 
88
+ The first-party `ariadne` and `ariadne-prd` skills are Ariadne-specific adaptations of concepts from [`snarktank/ralph`](https://github.com/snarktank/ralph) under the MIT License. They install through the ordinary Custom Skills pipeline for all five runtimes; `tools.ariadne` records reviewed attribution only and is not fetched or executed during a normal Ariadne run. Each skill directory contains its source path, reviewed commit, and source hash in `NOTICE.md`.
89
+
76
90
  ## Documentation
77
91
 
78
92
  - [Getting Started](docs/GETTING-STARTED.md) — first install, tool and runtime selection, lifecycle safety, and troubleshooting
@@ -1,14 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import process from "node:process";
3
+ import { runCli } from "../src/cli.js";
3
4
  import { err, InstallerError } from "../src/logger.js";
4
- import { runInstaller } from "../src/main.js";
5
- runInstaller().catch((error) => {
5
+ runCli()
6
+ .then((exitCode) => {
7
+ process.exitCode = exitCode;
8
+ })
9
+ .catch((error) => {
6
10
  if (error instanceof InstallerError) {
7
11
  err(error.message);
8
12
  console.error("");
9
- process.exit(1);
13
+ process.exitCode = 1;
14
+ return;
10
15
  }
11
16
  console.error(error);
12
- process.exit(1);
17
+ process.exitCode = 1;
13
18
  });
14
19
  //# sourceMappingURL=agent-toolkit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-toolkit.js","sourceRoot":"","sources":["../../bin/agent-toolkit.ts"],"names":[],"mappings":";AACA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC7B,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"agent-toolkit.js","sourceRoot":"","sources":["../../bin/agent-toolkit.ts"],"names":[],"mappings":";AACA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,EAAE;KACL,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;IACjB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC9B,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACf,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type AriadneCommand } from "./types.js";
2
+ export declare function parseAriadneArgs(argv: string[]): AriadneCommand;
@@ -0,0 +1,146 @@
1
+ import { isRuntimeName } from "../state.js";
2
+ import { AriadneUsageError, } from "./types.js";
3
+ const commandNames = new Set([
4
+ "init",
5
+ "run",
6
+ "status",
7
+ "doctor",
8
+ "help",
9
+ ]);
10
+ const allowedFlags = {
11
+ init: new Set(["--runtime", "--check", "--json"]),
12
+ run: new Set([
13
+ "--runtime",
14
+ "--max-iterations",
15
+ "--max-runtime",
16
+ "--dry-run",
17
+ "--json",
18
+ ]),
19
+ status: new Set(["--json"]),
20
+ doctor: new Set(["--json"]),
21
+ help: new Set(),
22
+ };
23
+ const knownFlags = new Set(Object.values(allowedFlags).flatMap((flags) => [...flags]));
24
+ function usageError(message) {
25
+ throw new AriadneUsageError(message);
26
+ }
27
+ function parseDuration(value) {
28
+ const match = /^(\d+)(ms|s|m|h)$/.exec(value);
29
+ if (!match)
30
+ usageError(`Invalid duration: ${value}.`);
31
+ const amount = Number(match[1]);
32
+ const unit = match[2];
33
+ const multiplier = unit === "ms"
34
+ ? 1
35
+ : unit === "s"
36
+ ? 1_000
37
+ : unit === "m"
38
+ ? 60_000
39
+ : 3_600_000;
40
+ const durationMs = amount * multiplier;
41
+ if (!Number.isSafeInteger(durationMs) || durationMs <= 0) {
42
+ usageError(`Invalid duration: ${value}.`);
43
+ }
44
+ return durationMs;
45
+ }
46
+ function parsePositiveInteger(value) {
47
+ if (!/^\d+$/.test(value)) {
48
+ usageError(`Expected a positive integer, received: ${value}.`);
49
+ }
50
+ const result = Number(value);
51
+ if (!Number.isSafeInteger(result) || result <= 0) {
52
+ usageError(`Expected a positive integer, received: ${value}.`);
53
+ }
54
+ return result;
55
+ }
56
+ function takeValue(argv, index, flag) {
57
+ const value = argv[index + 1];
58
+ if (!value || value.startsWith("--")) {
59
+ usageError(`${flag} requires a value.`);
60
+ }
61
+ return value;
62
+ }
63
+ export function parseAriadneArgs(argv) {
64
+ const [command, ...flags] = argv;
65
+ if (!command || !commandNames.has(command)) {
66
+ usageError("Ariadne requires init, run, status, or doctor.");
67
+ }
68
+ const kind = command;
69
+ if (kind === "help") {
70
+ if (flags.length > 0)
71
+ usageError("No flags are valid for help.");
72
+ return { kind: "help" };
73
+ }
74
+ let runtime;
75
+ let maxIterations;
76
+ let maxRuntimeMs;
77
+ let json = false;
78
+ let dryRun = false;
79
+ const qualityChecks = [];
80
+ const seen = new Set();
81
+ for (let index = 0; index < flags.length; index += 1) {
82
+ const flag = flags[index];
83
+ if (!flag)
84
+ continue;
85
+ if (!flag.startsWith("--") || !knownFlags.has(flag)) {
86
+ usageError(`unknown flag: ${flag}.`);
87
+ }
88
+ if (!allowedFlags[kind].has(flag)) {
89
+ usageError(`${flag} is not valid for ${kind}.`);
90
+ }
91
+ if (flag !== "--check" && seen.has(flag)) {
92
+ usageError(`duplicate flag: ${flag}.`);
93
+ }
94
+ seen.add(flag);
95
+ switch (flag) {
96
+ case "--runtime": {
97
+ const value = takeValue(flags, index, flag);
98
+ if (!isRuntimeName(value))
99
+ usageError(`unsupported runtime: ${value}.`);
100
+ runtime = value;
101
+ index += 1;
102
+ break;
103
+ }
104
+ case "--check":
105
+ qualityChecks.push(takeValue(flags, index, flag));
106
+ index += 1;
107
+ break;
108
+ case "--max-iterations":
109
+ maxIterations = parsePositiveInteger(takeValue(flags, index, flag));
110
+ index += 1;
111
+ break;
112
+ case "--max-runtime":
113
+ maxRuntimeMs = parseDuration(takeValue(flags, index, flag));
114
+ index += 1;
115
+ break;
116
+ case "--dry-run":
117
+ dryRun = true;
118
+ break;
119
+ case "--json":
120
+ json = true;
121
+ break;
122
+ }
123
+ }
124
+ switch (kind) {
125
+ case "init":
126
+ return {
127
+ kind,
128
+ ...(runtime === undefined ? {} : { runtime }),
129
+ qualityChecks,
130
+ json,
131
+ };
132
+ case "run":
133
+ return {
134
+ kind,
135
+ ...(runtime === undefined ? {} : { runtime }),
136
+ ...(maxIterations === undefined ? {} : { maxIterations }),
137
+ ...(maxRuntimeMs === undefined ? {} : { maxRuntimeMs }),
138
+ dryRun,
139
+ json,
140
+ };
141
+ case "status":
142
+ case "doctor":
143
+ return { kind, json };
144
+ }
145
+ }
146
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/ariadne/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ProcessRunOptions, runAgentProcess } from "./process.js";
2
+ export type QualityCheckTimeoutOrigin = "quality_check" | "global_budget";
3
+ export type QualityCheckResult = {
4
+ command: string;
5
+ status: number | null;
6
+ signal: NodeJS.Signals | null;
7
+ durationMs: number;
8
+ timedOut: boolean;
9
+ timeoutOrigin: QualityCheckTimeoutOrigin | null;
10
+ aborted: boolean;
11
+ stdoutPath: string;
12
+ stderrPath: string;
13
+ };
14
+ export type QualityCheckInput = {
15
+ commands: string[];
16
+ projectRoot: string;
17
+ runDir: string;
18
+ signal?: AbortSignal;
19
+ timeoutMs?: number;
20
+ runProcess: typeof runAgentProcess;
21
+ assertRunDirectory?: () => void;
22
+ certifyOutput?: ProcessRunOptions["certifyOutput"];
23
+ };
24
+ export declare function runQualityChecks(input: QualityCheckInput): Promise<QualityCheckResult[]>;
@@ -0,0 +1,74 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ const QUALITY_CHECK_TIMEOUT_MS = 30 * 60 * 1_000;
4
+ function shellInvocation(command, projectRoot) {
5
+ if (process.platform === "win32") {
6
+ return {
7
+ command: "cmd.exe",
8
+ args: ["/d", "/s", "/c", command],
9
+ cwd: projectRoot,
10
+ env: process.env,
11
+ };
12
+ }
13
+ return {
14
+ command: "sh",
15
+ args: ["-lc", command],
16
+ cwd: projectRoot,
17
+ env: process.env,
18
+ };
19
+ }
20
+ export async function runQualityChecks(input) {
21
+ if (input.commands.length === 0) {
22
+ throw new Error("At least one quality check is required");
23
+ }
24
+ if (input.commands.some((command) => command.trim() === "")) {
25
+ throw new Error("Quality check commands cannot be empty");
26
+ }
27
+ if (input.assertRunDirectory)
28
+ input.assertRunDirectory();
29
+ else
30
+ fs.mkdirSync(input.runDir, { recursive: true });
31
+ const results = [];
32
+ const startedAt = Date.now();
33
+ for (const [index, command] of input.commands.entries()) {
34
+ input.assertRunDirectory?.();
35
+ const remainingGlobalRuntime = input.timeoutMs === undefined
36
+ ? undefined
37
+ : input.timeoutMs - (Date.now() - startedAt);
38
+ if (remainingGlobalRuntime !== undefined && remainingGlobalRuntime <= 0)
39
+ break;
40
+ const timeoutOrigin = remainingGlobalRuntime !== undefined &&
41
+ remainingGlobalRuntime <= QUALITY_CHECK_TIMEOUT_MS
42
+ ? "global_budget"
43
+ : "quality_check";
44
+ const timeoutMs = remainingGlobalRuntime === undefined
45
+ ? QUALITY_CHECK_TIMEOUT_MS
46
+ : Math.min(QUALITY_CHECK_TIMEOUT_MS, remainingGlobalRuntime);
47
+ const checkNumber = index + 1;
48
+ const stdoutPath = path.join(input.runDir, `check-${checkNumber}.stdout.log`);
49
+ const stderrPath = path.join(input.runDir, `check-${checkNumber}.stderr.log`);
50
+ const processResult = await input.runProcess(shellInvocation(command, input.projectRoot), {
51
+ stdoutPath,
52
+ stderrPath,
53
+ timeoutMs,
54
+ signal: input.signal,
55
+ certifyOutput: input.certifyOutput,
56
+ });
57
+ input.assertRunDirectory?.();
58
+ results.push({
59
+ command,
60
+ status: processResult.status,
61
+ signal: processResult.signal,
62
+ durationMs: processResult.durationMs,
63
+ timedOut: processResult.timedOut,
64
+ timeoutOrigin: processResult.timedOut ? timeoutOrigin : null,
65
+ aborted: processResult.aborted,
66
+ stdoutPath,
67
+ stderrPath,
68
+ });
69
+ if (processResult.status !== 0)
70
+ break;
71
+ }
72
+ return results;
73
+ }
74
+ //# sourceMappingURL=checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../../src/ariadne/checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { runQualityChecks } from "./checks.js";
2
+ import { buildAriadneDoctor } from "./doctor.js";
3
+ import { initializeAriadne } from "./init.js";
4
+ import { acquireProjectLock } from "./lock.js";
5
+ import { runAriadneLoop } from "./loop.js";
6
+ import { runAgentProcess } from "./process.js";
7
+ import { createRuntimeRegistry, selectRuntime } from "./runtimes/index.js";
8
+ import { buildAriadneStatus, createAriadneGit } from "./status.js";
9
+ import { AriadneStore } from "./store.js";
10
+ import { type AriadneRunOutcome, type AriadneRuntimeName } from "./types.js";
11
+ export declare const ARIADNE_USAGE_EXIT_CODE = 2;
12
+ export declare const ARIADNE_RUNTIME_EXIT_CODE = 3;
13
+ export declare const ARIADNE_STATE_EXIT_CODE = 4;
14
+ type AriadneCliDeps = {
15
+ cwd: () => string;
16
+ findProjectRoot: (cwd: string) => string;
17
+ initialize: typeof initializeAriadne;
18
+ buildStatus: typeof buildAriadneStatus;
19
+ buildDoctor: typeof buildAriadneDoctor;
20
+ runLoop: typeof runAriadneLoop;
21
+ createStore: (projectRoot: string) => AriadneStore;
22
+ createGit: typeof createAriadneGit;
23
+ createRegistry: typeof createRuntimeRegistry;
24
+ selectRuntime: typeof selectRuntime;
25
+ acquireLock: typeof acquireProjectLock;
26
+ runProcess: typeof runAgentProcess;
27
+ runChecks: typeof runQualityChecks;
28
+ now: () => Date;
29
+ createRunId: () => string;
30
+ isInteractive: () => boolean;
31
+ globalPreferredRuntime: () => AriadneRuntimeName | undefined;
32
+ chooseRuntime: NonNullable<Parameters<typeof selectRuntime>[0]["choose"]>;
33
+ write: (line: string) => void;
34
+ };
35
+ export declare function ariadneExitCode(outcome: AriadneRunOutcome): number;
36
+ export declare function ariadneDoctorExitCode(report: ReturnType<typeof buildAriadneDoctor>): number;
37
+ export declare function runAriadne(argv: string[], overrides?: Partial<AriadneCliDeps>): Promise<number>;
38
+ export {};
@@ -0,0 +1,206 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import process from "node:process";
4
+ import * as prompts from "@clack/prompts";
5
+ import { isRuntimeName } from "../state.js";
6
+ import { capture, findCommand } from "../system.js";
7
+ import { parseAriadneArgs } from "./args.js";
8
+ import { runQualityChecks } from "./checks.js";
9
+ import { buildAriadneDoctor } from "./doctor.js";
10
+ import { initializeAriadne } from "./init.js";
11
+ import { acquireProjectLock } from "./lock.js";
12
+ import { ARIADNE_EXIT_CODES, runAriadneLoop } from "./loop.js";
13
+ import { assertPersistedOwnership, captureOwnershipCertification, } from "./ownership.js";
14
+ import { runAgentProcess } from "./process.js";
15
+ import { formatAriadneDoctor, formatAriadneJson, formatAriadneRun, formatAriadneStatus, } from "./render.js";
16
+ import { createRuntimeRegistry, selectRuntime } from "./runtimes/index.js";
17
+ import { AriadneRuntimeError } from "./runtimes/types.js";
18
+ import { AriadneStateError } from "./schema.js";
19
+ import { buildAriadneStatus, createAriadneGit } from "./status.js";
20
+ import { AriadneStore } from "./store.js";
21
+ import { AriadneCancelledError, AriadneUsageError, } from "./types.js";
22
+ import { ariadneUsage } from "./usage.js";
23
+ export const ARIADNE_USAGE_EXIT_CODE = 2;
24
+ export const ARIADNE_RUNTIME_EXIT_CODE = 3;
25
+ export const ARIADNE_STATE_EXIT_CODE = 4;
26
+ function globalPreferredRuntime() {
27
+ const preferred = process.env.AGENT_TOOLKIT_PREFERRED_RUNTIME;
28
+ return typeof preferred === "string" && isRuntimeName(preferred)
29
+ ? preferred
30
+ : undefined;
31
+ }
32
+ async function chooseRuntime(choices) {
33
+ const answer = await prompts.select({
34
+ message: "Ariadne runtime",
35
+ options: choices.map((choice) => ({
36
+ value: choice.name,
37
+ label: `${choice.name}${choice.version ? ` ${choice.version}` : ""}`,
38
+ hint: choice.state,
39
+ })),
40
+ });
41
+ if (prompts.isCancel(answer)) {
42
+ throw new AriadneCancelledError("Ariadne runtime selection cancelled.");
43
+ }
44
+ return answer;
45
+ }
46
+ function findProjectRoot(cwd) {
47
+ try {
48
+ return execFileSync("git", ["rev-parse", "--show-toplevel"], {
49
+ cwd,
50
+ encoding: "utf8",
51
+ stdio: ["ignore", "pipe", "pipe"],
52
+ }).trim();
53
+ }
54
+ catch {
55
+ throw new AriadneStateError("$git", `Ariadne requires a Git repository: ${cwd}`);
56
+ }
57
+ }
58
+ const defaultDeps = {
59
+ cwd: () => process.cwd(),
60
+ findProjectRoot,
61
+ initialize: initializeAriadne,
62
+ buildStatus: buildAriadneStatus,
63
+ buildDoctor: buildAriadneDoctor,
64
+ runLoop: runAriadneLoop,
65
+ createStore: (projectRoot) => new AriadneStore(projectRoot),
66
+ createGit: createAriadneGit,
67
+ createRegistry: createRuntimeRegistry,
68
+ selectRuntime,
69
+ acquireLock: acquireProjectLock,
70
+ runProcess: runAgentProcess,
71
+ runChecks: runQualityChecks,
72
+ now: () => new Date(),
73
+ createRunId: randomUUID,
74
+ isInteractive: () => process.stdin.isTTY === true && process.stdout.isTTY === true,
75
+ globalPreferredRuntime,
76
+ chooseRuntime,
77
+ write: (line) => console.log(line),
78
+ };
79
+ function errorExitCode(error) {
80
+ if (error instanceof AriadneUsageError)
81
+ return ARIADNE_USAGE_EXIT_CODE;
82
+ if (error instanceof AriadneRuntimeError)
83
+ return ARIADNE_RUNTIME_EXIT_CODE;
84
+ if (error instanceof AriadneStateError)
85
+ return ARIADNE_STATE_EXIT_CODE;
86
+ if (error instanceof AriadneCancelledError)
87
+ return 130;
88
+ return ARIADNE_RUNTIME_EXIT_CODE;
89
+ }
90
+ function errorMessage(error) {
91
+ return error instanceof Error ? error.message : String(error);
92
+ }
93
+ export function ariadneExitCode(outcome) {
94
+ return ARIADNE_EXIT_CODES[outcome];
95
+ }
96
+ export function ariadneDoctorExitCode(report) {
97
+ if (!report.issues.some((issue) => issue.severity === "error"))
98
+ return 0;
99
+ if (report.issues.some((issue) => issue.severity === "error" && issue.code.startsWith("runtime_"))) {
100
+ return ARIADNE_RUNTIME_EXIT_CODE;
101
+ }
102
+ return ARIADNE_STATE_EXIT_CODE;
103
+ }
104
+ export async function runAriadne(argv, overrides = {}) {
105
+ const deps = { ...defaultDeps, ...overrides };
106
+ try {
107
+ const command = parseAriadneArgs(argv.length === 1 && (argv[0] === "--help" || argv[0] === "-h")
108
+ ? ["help"]
109
+ : argv);
110
+ if (command.kind === "help") {
111
+ deps.write(ariadneUsage());
112
+ return 0;
113
+ }
114
+ const projectRoot = deps.findProjectRoot(deps.cwd());
115
+ const store = deps.createStore(projectRoot);
116
+ if (command.kind !== "status" && command.kind !== "doctor") {
117
+ store.assertNoOwnershipViolation();
118
+ }
119
+ if (command.kind === "init") {
120
+ assertPersistedOwnership({
121
+ store,
122
+ git: deps.createGit(projectRoot),
123
+ now: deps.now,
124
+ });
125
+ const interactive = deps.isInteractive() && !command.json;
126
+ const report = await deps.initialize({
127
+ cwd: projectRoot,
128
+ runtime: command.runtime,
129
+ qualityChecks: command.qualityChecks,
130
+ interactive,
131
+ });
132
+ deps.write(command.json
133
+ ? JSON.stringify(report, null, 2)
134
+ : report.outcome === "cancelled"
135
+ ? "Ariadne initialization cancelled."
136
+ : "Ariadne initialized.");
137
+ return report.outcome === "cancelled" ? 130 : 0;
138
+ }
139
+ const git = deps.createGit(projectRoot);
140
+ const registry = deps.createRegistry({
141
+ findCommand,
142
+ capture,
143
+ baseEnv: process.env,
144
+ });
145
+ if (command.kind === "status") {
146
+ const report = deps.buildStatus({ projectRoot, store, git, registry });
147
+ deps.write(command.json ? formatAriadneJson(report) : formatAriadneStatus(report));
148
+ return 0;
149
+ }
150
+ if (command.kind === "doctor") {
151
+ const report = deps.buildDoctor({ projectRoot, store, git, registry });
152
+ deps.write(command.json ? formatAriadneJson(report) : formatAriadneDoctor(report));
153
+ return ariadneDoctorExitCode(report);
154
+ }
155
+ assertPersistedOwnership({ store, git, now: deps.now });
156
+ const selectionCertification = store.hasCanonicalState()
157
+ ? captureOwnershipCertification({
158
+ store,
159
+ git,
160
+ runId: "runtime-selection",
161
+ storyId: "runtime-selection",
162
+ })
163
+ : undefined;
164
+ const config = store.loadConfig();
165
+ const interactive = deps.isInteractive() && !command.json;
166
+ const selection = await deps.selectRuntime({
167
+ explicit: command.runtime,
168
+ configured: config.runtime,
169
+ globalPreferred: deps.globalPreferredRuntime(),
170
+ interactive,
171
+ ...(interactive ? { choose: deps.chooseRuntime } : {}),
172
+ registry,
173
+ });
174
+ const result = await deps.runLoop({
175
+ runtime: selection.name,
176
+ ...(selection.source === "interactive"
177
+ ? { persistRuntimeSelection: true }
178
+ : {}),
179
+ ...(command.maxIterations === undefined
180
+ ? {}
181
+ : { maxIterations: command.maxIterations }),
182
+ ...(command.maxRuntimeMs === undefined
183
+ ? {}
184
+ : { maxRuntimeMs: command.maxRuntimeMs }),
185
+ dryRun: command.dryRun,
186
+ }, {
187
+ store,
188
+ git,
189
+ adapter: selection.adapter,
190
+ detection: selection.detection,
191
+ ...(selectionCertification ? { selectionCertification } : {}),
192
+ acquireLock: deps.acquireLock,
193
+ runProcess: deps.runProcess,
194
+ runChecks: deps.runChecks,
195
+ now: deps.now,
196
+ createRunId: deps.createRunId,
197
+ });
198
+ deps.write(command.json ? JSON.stringify(result, null, 2) : formatAriadneRun(result));
199
+ return command.dryRun ? 0 : ariadneExitCode(result.outcome);
200
+ }
201
+ catch (error) {
202
+ console.error(errorMessage(error));
203
+ return errorExitCode(error);
204
+ }
205
+ }
206
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/ariadne/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type AriadneStatusInput, type AriadneStatusReport } from "./status.js";
2
+ export { formatAriadneDoctor } from "./render.js";
3
+ export type AriadneDoctorIssue = {
4
+ code: string;
5
+ severity: "error" | "warning";
6
+ message: string;
7
+ };
8
+ export type AriadneDoctorReport = {
9
+ schemaVersion: 1;
10
+ command: "doctor";
11
+ ok: boolean;
12
+ issues: AriadneDoctorIssue[];
13
+ status: AriadneStatusReport;
14
+ };
15
+ export type AriadneDoctorInput = Omit<AriadneStatusInput, "state" | "lock" | "ownershipViolation">;
16
+ export declare function buildAriadneDoctor(input: AriadneDoctorInput): AriadneDoctorReport;