@autodidacticon/orchestrator 0.1.0 → 0.2.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 (58) hide show
  1. package/README.md +44 -31
  2. package/dist/src/agent/mcp-shim.js +1 -1
  3. package/dist/src/brief/compose.js +8 -1
  4. package/dist/src/brief/compose.js.map +1 -1
  5. package/dist/src/config.js +19 -3
  6. package/dist/src/config.js.map +1 -1
  7. package/dist/src/graph/load.js +4 -0
  8. package/dist/src/graph/load.js.map +1 -1
  9. package/dist/src/import/mapping.js +19 -1
  10. package/dist/src/import/mapping.js.map +1 -1
  11. package/dist/src/index.js +7 -1
  12. package/dist/src/index.js.map +1 -1
  13. package/dist/src/launch/launch.js +5 -1
  14. package/dist/src/launch/launch.js.map +1 -1
  15. package/dist/src/loop/orchestrator.js +91 -3
  16. package/dist/src/loop/orchestrator.js.map +1 -1
  17. package/dist/src/loop/tick.js +2 -1
  18. package/dist/src/loop/tick.js.map +1 -1
  19. package/dist/src/main.js +81 -13
  20. package/dist/src/main.js.map +1 -1
  21. package/dist/src/operator/cli.js +40 -2
  22. package/dist/src/operator/cli.js.map +1 -1
  23. package/dist/src/operator/mcp-server.js +32 -6
  24. package/dist/src/operator/mcp-server.js.map +1 -1
  25. package/dist/src/operator/mcp.js +1 -1
  26. package/dist/src/operator/routes.js +19 -1
  27. package/dist/src/operator/routes.js.map +1 -1
  28. package/dist/src/runner/claude-code.js +1 -1
  29. package/dist/src/runner/claude-code.js.map +1 -1
  30. package/dist/src/runner/command.js +24 -0
  31. package/dist/src/runner/command.js.map +1 -0
  32. package/dist/src/runner/selection.js +20 -0
  33. package/dist/src/runner/selection.js.map +1 -0
  34. package/dist/src/runner/subprocess.js +7 -1
  35. package/dist/src/runner/subprocess.js.map +1 -1
  36. package/dist/src/runs/lifecycle.js +60 -3
  37. package/dist/src/runs/lifecycle.js.map +1 -1
  38. package/dist/src/runs/resolve.js +217 -0
  39. package/dist/src/runs/resolve.js.map +1 -0
  40. package/dist/src/runs/runDir.js +63 -13
  41. package/dist/src/runs/runDir.js.map +1 -1
  42. package/dist/src/state/store.js.map +1 -1
  43. package/dist/src/toolchain/branch.js +19 -0
  44. package/dist/src/toolchain/branch.js.map +1 -0
  45. package/dist/src/toolchain/detect.js +115 -0
  46. package/dist/src/toolchain/detect.js.map +1 -0
  47. package/dist/src/toolchain/tools.js +56 -0
  48. package/dist/src/toolchain/tools.js.map +1 -0
  49. package/dist/src/verify/verifier.js +5 -1
  50. package/dist/src/verify/verifier.js.map +1 -1
  51. package/hosts/claude-code/.claude-plugin/plugin.json +1 -1
  52. package/hosts/claude-code/package-lock.json +1247 -0
  53. package/hosts/claude-code/package.json +1 -1
  54. package/hosts/claude-code/skills/import/SKILL.md +14 -2
  55. package/hosts/claude-code/skills/run/SKILL.md +48 -8
  56. package/hosts/claude-code/skills/work/SKILL.md +11 -2
  57. package/hosts/claude-code/workflows/work.js +5 -2
  58. package/package.json +1 -1
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Layered configuration: argument, file, pinned (the integration branch only),
3
+ * detected, default. Scalars take the first layer; the allow list composes.
4
+ * Every value carries its provenance. See specs/toolchain-discovery
5
+ * "Resolution order and provenance".
6
+ */
7
+ import { z } from 'zod';
8
+ import { configSchema } from '../config.js';
9
+ import { hasAllowedToolsSlot, hasEffortSlot, hasModelSlot } from '../runner/command.js';
10
+ import { effortSchema, modelSchema } from '../runner/selection.js';
11
+ import { composeAllowedTools, isSafeRule } from '../toolchain/tools.js';
12
+ export const OVERRIDABLE_KEYS = ['checkCommand', 'integrationBranch', 'capacity', 'allowedTools', 'runnerCommand', 'model', 'effort'];
13
+ export const START_ONLY_KEYS = ['integrationBranch'];
14
+ const rule = z.string().refine(isSafeRule, (r) => ({ message: `rule ${JSON.stringify(r)} must not be empty or contain a double quote, backslash, dollar sign, or backtick` }));
15
+ /** An override document: a value sets the key, null clears it. */
16
+ export const overridesSchema = z
17
+ .object({
18
+ checkCommand: z.string().min(1).nullable().optional(),
19
+ integrationBranch: z.string().min(1).nullable().optional(),
20
+ capacity: z.number().int().positive().nullable().optional(),
21
+ allowedTools: z.array(rule).nullable().optional(),
22
+ runnerCommand: z.string().min(1).nullable().optional(),
23
+ model: modelSchema.nullable().optional(),
24
+ effort: effortSchema.nullable().optional(),
25
+ })
26
+ .strict();
27
+ const DEFAULTS = configSchema.parse({});
28
+ function fileHas(raw, key) {
29
+ return raw !== undefined && raw[key] !== undefined && raw[key] !== null;
30
+ }
31
+ function fileClaude(raw) {
32
+ const runner = raw?.['runner'];
33
+ const claude = runner && typeof runner === 'object' ? runner['claude'] : undefined;
34
+ if (!claude || typeof claude !== 'object')
35
+ return {};
36
+ const c = claude;
37
+ return {
38
+ allowedTools: Array.isArray(c['allowedTools']) ? c['allowedTools'].map(String) : undefined,
39
+ deriveTools: typeof c['deriveTools'] === 'boolean' ? c['deriveTools'] : undefined,
40
+ model: typeof c['model'] === 'string' ? c['model'] : undefined,
41
+ effort: typeof c['effort'] === 'string' ? c['effort'] : undefined,
42
+ };
43
+ }
44
+ /** Merge a patch into an override document: a null clears the key. */
45
+ export function mergeOverrides(current, patch) {
46
+ const out = { ...current };
47
+ for (const [k, v] of Object.entries(patch)) {
48
+ if (v === null)
49
+ delete out[k];
50
+ else if (v !== undefined)
51
+ out[k] = v;
52
+ }
53
+ return out;
54
+ }
55
+ export function resolveLayers(inputs, overrides = {}) {
56
+ const { base, fileRaw, detected, pinned } = inputs;
57
+ const provenance = {};
58
+ // An in-memory config with no file (the harnesses) stands for the file layer.
59
+ const fileCheck = fileRaw === undefined || fileHas(fileRaw, 'checkCommand') ? base.checkCommand : undefined;
60
+ const checkCommand = overrides.checkCommand ?? fileCheck ?? detected?.toolchain?.checkCommand;
61
+ provenance.checkCommand = overrides.checkCommand ? 'argument' : fileCheck !== undefined ? 'file' : detected?.toolchain?.checkCommand ? 'detected' : 'unresolved';
62
+ let integrationBranch;
63
+ if (overrides.integrationBranch) {
64
+ integrationBranch = overrides.integrationBranch;
65
+ provenance.integrationBranch = 'argument';
66
+ }
67
+ else if (fileHas(fileRaw, 'integrationBranch')) {
68
+ integrationBranch = base.integrationBranch;
69
+ provenance.integrationBranch = 'file';
70
+ }
71
+ else if (pinned) {
72
+ integrationBranch = pinned;
73
+ provenance.integrationBranch = 'pinned';
74
+ }
75
+ else if (detected?.integrationBranch) {
76
+ integrationBranch = detected.integrationBranch;
77
+ provenance.integrationBranch = 'detected';
78
+ }
79
+ else if (fileRaw === undefined && base.integrationBranch !== DEFAULTS.integrationBranch) {
80
+ integrationBranch = base.integrationBranch;
81
+ provenance.integrationBranch = 'file';
82
+ }
83
+ else {
84
+ integrationBranch = base.integrationBranch;
85
+ provenance.integrationBranch = 'default';
86
+ }
87
+ const capacity = overrides.capacity ?? base.capacity;
88
+ provenance.capacity = overrides.capacity ? 'argument' : fileHas(fileRaw, 'capacity') || (fileRaw === undefined && base.capacity !== DEFAULTS.capacity) ? 'file' : 'default';
89
+ const runnerCommand = overrides.runnerCommand ?? base.runnerCommand;
90
+ provenance.runnerCommand = overrides.runnerCommand ? 'argument' : fileHas(fileRaw, 'runnerCommand') || (fileRaw === undefined && base.runnerCommand !== DEFAULTS.runnerCommand) ? 'file' : 'default';
91
+ const claude = fileClaude(fileRaw);
92
+ const composed = composeAllowedTools({
93
+ record: detected?.toolchain,
94
+ deriveTools: claude.deriveTools ?? base.runner.claude.deriveTools,
95
+ fileRules: claude.allowedTools ?? base.runner.claude.allowedTools,
96
+ argumentRules: overrides.allowedTools ?? [],
97
+ });
98
+ provenance.allowedTools = 'composed';
99
+ // Model and effort: argument over file over default; an in-memory config with no file stands for the file layer.
100
+ const model = overrides.model ?? base.runner.claude.model;
101
+ provenance.model = overrides.model ? 'argument' : claude.model !== undefined || (fileRaw === undefined && base.runner.claude.model !== DEFAULTS.runner.claude.model) ? 'file' : 'default';
102
+ const effort = overrides.effort ?? base.runner.claude.effort;
103
+ provenance.effort = overrides.effort ? 'argument' : claude.effort !== undefined || (fileRaw === undefined && base.runner.claude.effort !== DEFAULTS.runner.claude.effort) ? 'file' : 'default';
104
+ const needsConfig = checkCommand === undefined ? ['checkCommand'] : [];
105
+ return {
106
+ config: { ...base, checkCommand, integrationBranch, capacity, runnerCommand, runner: { ...base.runner, claude: { ...base.runner.claude, model, effort } } },
107
+ provenance,
108
+ allowedTools: { ...composed, applied: hasAllowedToolsSlot(runnerCommand) },
109
+ model: { value: model, applied: hasModelSlot(runnerCommand) },
110
+ effort: { value: effort, applied: hasEffortSlot(runnerCommand) },
111
+ toolchain: detected?.toolchain,
112
+ needsConfig,
113
+ overrides,
114
+ inputs,
115
+ };
116
+ }
117
+ /** The compact form appended as the `config.resolved` event. */
118
+ export function configSummary(report) {
119
+ const c = report.config;
120
+ return {
121
+ checkCommand: c.checkCommand,
122
+ integrationBranch: c.integrationBranch,
123
+ capacity: c.capacity,
124
+ runnerCommand: { source: c.runnerCommand.source },
125
+ allowedTools: { source: c.allowedTools.source, count: c.allowedTools.value.length, applied: c.allowedTools.applied, parts: Object.fromEntries(Object.entries(c.allowedTools.parts).map(([k, v]) => [k, v.length])) },
126
+ model: c.model,
127
+ effort: c.effort,
128
+ toolchain: report.toolchain ? { kinds: report.toolchain.kinds, checkCommand: report.toolchain.checkCommand, checkFrom: report.toolchain.checkFrom, packageManager: report.toolchain.packageManager } : undefined,
129
+ needsConfig: report.needsConfig,
130
+ overrides: Object.keys(report.overrides),
131
+ };
132
+ }
133
+ /** The override document kept in the store under `config.overrides`; empty when absent or unreadable. */
134
+ export function readOverrides(store) {
135
+ const raw = store.getKv('config.overrides');
136
+ if (!raw)
137
+ return {};
138
+ try {
139
+ const parsed = overridesSchema.safeParse(JSON.parse(raw));
140
+ return parsed.success ? parsed.data : {};
141
+ }
142
+ catch {
143
+ return {};
144
+ }
145
+ }
146
+ /**
147
+ * `--set key=value` flags into an override document: `capacity` as an integer,
148
+ * `allowedTools` as a JSON array or one rule per flag (appended), `model` and
149
+ * `effort` checked by their shape rules, the rest as strings. Throws a usage error on an unknown key or a bad value.
150
+ */
151
+ export function parseSetFlags(flags) {
152
+ const out = {};
153
+ for (const flag of flags) {
154
+ const eq = flag.indexOf('=');
155
+ if (eq <= 0)
156
+ throw new Error(`--set expects key=value, not ${JSON.stringify(flag)}`);
157
+ const key = flag.slice(0, eq).trim();
158
+ const raw = flag.slice(eq + 1);
159
+ if (!OVERRIDABLE_KEYS.includes(key))
160
+ throw new Error(`--set: unknown key ${JSON.stringify(key)}; one of ${OVERRIDABLE_KEYS.join(', ')}`);
161
+ if (key === 'capacity') {
162
+ const n = Number(raw);
163
+ if (!raw.trim() || !Number.isInteger(n) || n <= 0)
164
+ throw new Error(`--set capacity expects a positive integer, not ${JSON.stringify(raw)}`);
165
+ out[key] = n;
166
+ }
167
+ else if (key === 'allowedTools') {
168
+ let rules;
169
+ if (raw.trim().startsWith('[')) {
170
+ let parsed;
171
+ try {
172
+ parsed = JSON.parse(raw);
173
+ }
174
+ catch {
175
+ parsed = undefined;
176
+ }
177
+ if (!Array.isArray(parsed) || !parsed.every((r) => typeof r === 'string'))
178
+ throw new Error(`--set allowedTools expects a JSON array of rules or one rule, not ${JSON.stringify(raw)}`);
179
+ rules = parsed;
180
+ }
181
+ else {
182
+ rules = [raw];
183
+ }
184
+ out[key] = [...(out[key] ?? []), ...rules];
185
+ }
186
+ else {
187
+ if (!raw.trim())
188
+ throw new Error(`--set ${key} expects a non-empty value`);
189
+ out[key] = raw;
190
+ }
191
+ }
192
+ const parsed = overridesSchema.safeParse(out);
193
+ if (!parsed.success) {
194
+ const issue = parsed.error.issues[0];
195
+ throw new Error(`--set ${String(issue?.path[0] ?? '')}: ${issue?.message ?? 'invalid value'}`);
196
+ }
197
+ return parsed.data;
198
+ }
199
+ export function reportOf(resolved, now) {
200
+ return {
201
+ resolvedAt: now,
202
+ repo: resolved.config.repoPath,
203
+ config: {
204
+ checkCommand: { value: resolved.config.checkCommand, source: resolved.provenance.checkCommand },
205
+ integrationBranch: { value: resolved.config.integrationBranch, source: resolved.provenance.integrationBranch },
206
+ capacity: { value: resolved.config.capacity, source: resolved.provenance.capacity },
207
+ runnerCommand: { value: resolved.config.runnerCommand, source: resolved.provenance.runnerCommand },
208
+ allowedTools: { value: resolved.allowedTools.value, source: 'composed', parts: resolved.allowedTools.parts, applied: resolved.allowedTools.applied },
209
+ model: { value: resolved.model.value, source: resolved.provenance.model, applied: resolved.model.applied },
210
+ effort: { value: resolved.effort.value, source: resolved.provenance.effort, applied: resolved.effort.applied },
211
+ },
212
+ toolchain: resolved.toolchain,
213
+ overrides: resolved.overrides,
214
+ needsConfig: resolved.needsConfig,
215
+ };
216
+ }
217
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/runs/resolve.ts"],"names":[],"mappings":"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"}
@@ -4,12 +4,15 @@
4
4
  */
5
5
  import { execFile } from 'node:child_process';
6
6
  import { createHash } from 'node:crypto';
7
- import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';
7
+ import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync } from 'node:fs';
8
8
  import { homedir } from 'node:os';
9
9
  import path from 'node:path';
10
10
  import { promisify } from 'node:util';
11
- import { configSchema, defaultConfig } from '../config.js';
11
+ import { configSchema, defaultConfig, loadConfig } from '../config.js';
12
12
  import { parse as parseYaml } from 'yaml';
13
+ import { detectIntegrationBranch } from '../toolchain/branch.js';
14
+ import { detectToolchain } from '../toolchain/detect.js';
15
+ import { resolveLayers } from './resolve.js';
13
16
  const execFileP = promisify(execFile);
14
17
  export const REPO_FILE = 'repo';
15
18
  export const DAEMON_JSON = 'daemon.json';
@@ -17,6 +20,8 @@ export const DAEMON_PID = 'daemon.pid';
17
20
  export const DAEMON_LOG = 'daemon.log';
18
21
  export const GRAPH_FILE = 'graph.yaml';
19
22
  export const CONFIG_FILE = 'orchestrator.yaml';
23
+ /** The resolved configuration with provenance, written beside daemon.json. See specs/toolchain-discovery "Resolved configuration record". */
24
+ export const CONFIG_JSON = 'config.json';
20
25
  export function orchHome(env = process.env) {
21
26
  return env['ORCH_HOME'] ?? path.join(homedir(), '.orchestrator');
22
27
  }
@@ -100,25 +105,70 @@ export function readRepoConfigRaw(realRepoPath) {
100
105
  return undefined;
101
106
  }
102
107
  }
103
- /**
104
- * Config for a run: <repo>/orchestrator.yaml when present, else defaults.
105
- * dataDir and graphPath default to the run directory unless the file sets them.
106
- */
107
- export async function resolveRunConfig(realRepoPath, env = process.env) {
108
+ /** The file layer and defaults for a run: <repo>/orchestrator.yaml when present. dataDir and graphPath default to the run directory unless the file sets them. */
109
+ function baseRunConfig(realRepoPath, env) {
108
110
  const p = runPaths(realRepoPath, env);
109
111
  const file = path.join(realRepoPath, CONFIG_FILE);
110
112
  if (!existsSync(file)) {
111
- return defaultConfig({ repoPath: realRepoPath, dataDir: p.runDir, graphPath: p.graphPath, runDir: p.runDir });
113
+ return { config: defaultConfig({ repoPath: realRepoPath, dataDir: p.runDir, graphPath: p.graphPath, runDir: p.runDir }), fileRaw: undefined };
112
114
  }
113
115
  const raw = (parseYaml(readFileSync(file, 'utf8')) ?? {});
114
116
  const cfg = configSchema.parse(raw);
115
117
  const abs = (v) => (path.isAbsolute(v) ? v : path.resolve(realRepoPath, v));
116
118
  return {
117
- ...cfg,
118
- repoPath: raw['repoPath'] ? abs(String(raw['repoPath'])) : realRepoPath,
119
- dataDir: raw['dataDir'] ? abs(String(raw['dataDir'])) : p.runDir,
120
- graphPath: raw['graphPath'] ? abs(String(raw['graphPath'])) : p.graphPath,
121
- runDir: p.runDir,
119
+ config: {
120
+ ...cfg,
121
+ repoPath: raw['repoPath'] ? abs(String(raw['repoPath'])) : realRepoPath,
122
+ dataDir: raw['dataDir'] ? abs(String(raw['dataDir'])) : p.runDir,
123
+ graphPath: raw['graphPath'] ? abs(String(raw['graphPath'])) : p.graphPath,
124
+ runDir: p.runDir,
125
+ },
126
+ fileRaw: raw,
122
127
  };
123
128
  }
129
+ /** Detection from the repository: the toolchain table and the integration branch. See specs/toolchain-discovery. */
130
+ export async function detectRepo(repo) {
131
+ const [toolchain, integrationBranch] = await Promise.all([detectToolchain(repo), detectIntegrationBranch(repo)]);
132
+ return { toolchain, integrationBranch };
133
+ }
134
+ /**
135
+ * The resolved configuration for a run: arguments over <repo>/orchestrator.yaml
136
+ * over the pinned branch over detection over defaults, with provenance.
137
+ * Callers that only need the values read `.config`.
138
+ */
139
+ export async function resolveRunConfig(realRepoPath, env = process.env, opts = {}) {
140
+ const { config, fileRaw } = baseRunConfig(realRepoPath, env);
141
+ const detected = opts.detect === false ? undefined : await detectRepo(config.repoPath);
142
+ return resolveLayers({ base: config, fileRaw, detected, pinned: opts.pinned }, opts.overrides ?? {});
143
+ }
144
+ /** The same resolution over an explicit config file (`orchestrator --config`). */
145
+ export async function resolveFileConfig(file, opts = {}) {
146
+ const config = await loadConfig(file);
147
+ let fileRaw = {};
148
+ try {
149
+ const raw = parseYaml(readFileSync(file, 'utf8'));
150
+ if (raw && typeof raw === 'object')
151
+ fileRaw = raw;
152
+ }
153
+ catch {
154
+ /* loadConfig already parsed it */
155
+ }
156
+ const detected = opts.detect === false ? undefined : await detectRepo(config.repoPath);
157
+ return resolveLayers({ base: config, fileRaw, detected, pinned: opts.pinned }, opts.overrides ?? {});
158
+ }
159
+ /** Atomic write of the resolved configuration record (temp file and rename). */
160
+ export function writeConfigJson(runDir, record) {
161
+ const target = path.join(runDir, CONFIG_JSON);
162
+ const tmp = `${target}.${process.pid}.tmp`;
163
+ writeFileSync(tmp, `${JSON.stringify(record, null, 2)}\n`, 'utf8');
164
+ renameSync(tmp, target);
165
+ }
166
+ export function readConfigJson(runDir) {
167
+ try {
168
+ return JSON.parse(readFileSync(path.join(runDir, CONFIG_JSON), 'utf8'));
169
+ }
170
+ catch {
171
+ return undefined;
172
+ }
173
+ }
124
174
  //# sourceMappingURL=runDir.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runDir.js","sourceRoot":"","sources":["../../../src/runs/runDir.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runDir.js","sourceRoot":"","sources":["../../../src/runs/runDir.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/state/store.ts"],"names":[],"mappings":"AAgPA,4DAA4D;AAC5D,MAAM,UAAU,SAAS,CAAC,KAAY;IACpC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACnC,OAAO,GAAG,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAY,EAAE,GAAkB;IACzD,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAY;IAClC,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAY,EAAE,EAAU;IAC/C,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/state/store.ts"],"names":[],"mappings":"AAoPA,4DAA4D;AAC5D,MAAM,UAAU,SAAS,CAAC,KAAY;IACpC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACnC,OAAO,GAAG,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAY,EAAE,GAAkB;IACzD,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAY;IAClC,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAY,EAAE,EAAU;IAC/C,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Integration branch detection: the remote's default branch when it exists
3
+ * locally, else the checked-out branch, else nothing (the default applies).
4
+ * See specs/toolchain-discovery "Integration branch detection and pinning".
5
+ */
6
+ import { git } from '../workspace/git.js';
7
+ export async function detectIntegrationBranch(repo) {
8
+ const originHead = await git(repo, ['symbolic-ref', '-q', 'refs/remotes/origin/HEAD'], { allowFail: true });
9
+ if (originHead.code === 0) {
10
+ const name = originHead.stdout.trim().replace(/^refs\/remotes\/origin\//, '');
11
+ if (name && (await git(repo, ['show-ref', '--verify', '--quiet', `refs/heads/${name}`], { allowFail: true })).code === 0)
12
+ return name;
13
+ }
14
+ const current = await git(repo, ['symbolic-ref', '-q', '--short', 'HEAD'], { allowFail: true });
15
+ if (current.code === 0 && current.stdout.trim())
16
+ return current.stdout.trim();
17
+ return undefined;
18
+ }
19
+ //# sourceMappingURL=branch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.js","sourceRoot":"","sources":["../../../src/toolchain/branch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY;IACxD,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,cAAc,EAAE,IAAI,EAAE,0BAA0B,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5G,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;QAC9E,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,IAAI,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IACxI,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChG,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9E,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Toolchain detection from the repository root, against a fixed table in a
3
+ * fixed order; the first row with a command supplies the check command, every
4
+ * row whose manifest is present is recorded as found. Reads the root only,
5
+ * never subdirectories, and runs no commands. See specs/toolchain-discovery
6
+ * "Toolchain detection" and "Node package manager selection".
7
+ */
8
+ import { readdir, readFile } from 'node:fs/promises';
9
+ import path from 'node:path';
10
+ const NPM_PLACEHOLDER = 'echo "Error: no test specified" && exit 1';
11
+ function squash(s) {
12
+ return s.replace(/\s+/g, ' ').trim();
13
+ }
14
+ export async function detectToolchain(repoRoot) {
15
+ let names = [];
16
+ try {
17
+ names = await readdir(repoRoot);
18
+ }
19
+ catch {
20
+ return { kinds: [], manifests: [], reasons: [`${repoRoot} could not be read`] };
21
+ }
22
+ const has = (n) => names.includes(n);
23
+ const record = { kinds: [], manifests: [], reasons: [] };
24
+ const found = (kind, manifest, command, reason) => {
25
+ record.kinds.push(kind);
26
+ record.manifests.push(manifest);
27
+ record.reasons.push(reason);
28
+ if (command && record.checkCommand === undefined) {
29
+ record.checkCommand = command;
30
+ record.checkFrom = kind;
31
+ }
32
+ };
33
+ // 1. make: a root test target is the repository's own declaration of how it is checked.
34
+ const makefile = ['Makefile', 'GNUmakefile', 'makefile'].find(has);
35
+ if (makefile) {
36
+ let hasTest = false;
37
+ try {
38
+ hasTest = /^test\s*:/m.test(await readFile(path.join(repoRoot, makefile), 'utf8'));
39
+ }
40
+ catch {
41
+ /* unreadable: no target */
42
+ }
43
+ found('make', makefile, hasTest ? 'make test' : undefined, hasTest ? `${makefile} defines a test target: make test` : `${makefile} has no test target`);
44
+ }
45
+ // 2. node
46
+ if (has('package.json')) {
47
+ let pkg;
48
+ try {
49
+ pkg = JSON.parse(await readFile(path.join(repoRoot, 'package.json'), 'utf8'));
50
+ }
51
+ catch {
52
+ pkg = undefined;
53
+ }
54
+ const field = typeof pkg?.packageManager === 'string' ? pkg.packageManager.split('@')[0] : undefined;
55
+ let pm;
56
+ let why;
57
+ if (field === 'npm' || field === 'pnpm' || field === 'yarn' || field === 'bun') {
58
+ pm = field;
59
+ why = `package.json names ${field} in packageManager`;
60
+ }
61
+ else if (has('pnpm-lock.yaml')) {
62
+ pm = 'pnpm';
63
+ why = 'pnpm-lock.yaml selects pnpm';
64
+ }
65
+ else if (has('yarn.lock')) {
66
+ pm = 'yarn';
67
+ why = 'yarn.lock selects yarn';
68
+ }
69
+ else if (has('bun.lock') || has('bun.lockb')) {
70
+ pm = 'bun';
71
+ why = `${has('bun.lock') ? 'bun.lock' : 'bun.lockb'} selects bun`;
72
+ }
73
+ else {
74
+ pm = 'npm';
75
+ why = 'no lockfile or packageManager field: npm';
76
+ }
77
+ record.packageManager = pm;
78
+ const script = typeof pkg?.scripts?.['test'] === 'string' ? pkg.scripts['test'] : '';
79
+ const real = script.trim() !== '' && squash(script) !== squash(NPM_PLACEHOLDER);
80
+ found('node', 'package.json', real ? `${pm} test` : undefined, real ? `package.json has a test script: ${pm} test (${why})` : script.trim() === '' ? `package.json has no test script (${why})` : `package.json's test script is npm's placeholder, not a test (${why})`);
81
+ }
82
+ if (has('Cargo.toml'))
83
+ found('rust', 'Cargo.toml', 'cargo test', 'Cargo.toml: cargo test');
84
+ if (has('go.mod'))
85
+ found('go', 'go.mod', 'go test ./...', 'go.mod: go test ./...');
86
+ const pyManifest = ['pyproject.toml', 'setup.cfg', 'pytest.ini'].find(has);
87
+ if (pyManifest) {
88
+ const runner = has('uv.lock') ? 'uv' : has('poetry.lock') ? 'poetry' : 'pip';
89
+ record.python = runner;
90
+ const cmd = runner === 'uv' ? 'uv run pytest' : runner === 'poetry' ? 'poetry run pytest' : 'pytest';
91
+ found('python', pyManifest, cmd, `${pyManifest}: ${cmd}${runner === 'uv' ? ' (uv.lock)' : runner === 'poetry' ? ' (poetry.lock)' : ''}`);
92
+ }
93
+ if (has('Gemfile')) {
94
+ const rspec = has('.rspec');
95
+ found('ruby', 'Gemfile', rspec ? 'bundle exec rspec' : 'bundle exec rake test', rspec ? 'Gemfile with .rspec: bundle exec rspec' : 'Gemfile: bundle exec rake test');
96
+ }
97
+ const gradle = ['build.gradle', 'build.gradle.kts'].find(has);
98
+ if (gradle) {
99
+ const wrapper = has('gradlew');
100
+ found('gradle', gradle, wrapper ? './gradlew test' : 'gradle test', wrapper ? `${gradle} with gradlew: ./gradlew test` : `${gradle} without a wrapper: gradle test`);
101
+ }
102
+ if (has('pom.xml')) {
103
+ const wrapper = has('mvnw');
104
+ found('maven', 'pom.xml', wrapper ? './mvnw -q test' : 'mvn -q test', wrapper ? 'pom.xml with mvnw: ./mvnw -q test' : 'pom.xml without a wrapper: mvn -q test');
105
+ }
106
+ if (has('mix.exs'))
107
+ found('elixir', 'mix.exs', 'mix test', 'mix.exs: mix test');
108
+ const dotnet = names.find((n) => n.endsWith('.sln') || n.endsWith('.csproj'));
109
+ if (dotnet)
110
+ found('dotnet', dotnet, 'dotnet test', `${dotnet}: dotnet test`);
111
+ if (record.checkCommand === undefined)
112
+ record.reasons.push(record.kinds.length ? 'no found toolchain supplied a check command' : 'no recognised manifest in the repository root');
113
+ return record;
114
+ }
115
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/toolchain/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ export const BASE_RULES = ['Bash(git:*)', 'mcp__orchestrator__heartbeat', 'mcp__orchestrator__report', 'mcp__orchestrator__block', 'mcp__orchestrator__inbox', 'mcp__orchestrator__log'];
2
+ const ORDER = ['make', 'node', 'rust', 'go', 'python', 'ruby', 'gradle', 'maven', 'elixir', 'dotnet'];
3
+ function rulesOf(kind, record) {
4
+ switch (kind) {
5
+ case 'make':
6
+ return ['Bash(make:*)'];
7
+ case 'node': {
8
+ const pm = record.packageManager ?? 'npm';
9
+ const extra = pm === 'npm' ? ['Bash(npm ci:*)', 'Bash(npx:*)'] : pm === 'bun' ? ['Bash(bunx:*)'] : ['Bash(npx:*)'];
10
+ return [`Bash(${pm} test:*)`, `Bash(${pm} run:*)`, `Bash(${pm} install:*)`, `Bash(${pm} exec:*)`, 'Bash(node:*)', ...extra];
11
+ }
12
+ case 'rust':
13
+ return ['Bash(cargo:*)'];
14
+ case 'go':
15
+ return ['Bash(go:*)'];
16
+ case 'python':
17
+ return ['Bash(pytest:*)', 'Bash(python:*)', 'Bash(python3:*)', 'Bash(pip:*)', ...(record.python === 'uv' ? ['Bash(uv:*)'] : record.python === 'poetry' ? ['Bash(poetry:*)'] : [])];
18
+ case 'ruby':
19
+ return ['Bash(bundle:*)', 'Bash(rake:*)', 'Bash(rspec:*)', 'Bash(ruby:*)'];
20
+ case 'gradle':
21
+ return ['Bash(./gradlew:*)', 'Bash(gradle:*)'];
22
+ case 'maven':
23
+ return ['Bash(mvn:*)', 'Bash(./mvnw:*)'];
24
+ case 'elixir':
25
+ return ['Bash(mix:*)', 'Bash(elixir:*)'];
26
+ case 'dotnet':
27
+ return ['Bash(dotnet:*)'];
28
+ }
29
+ }
30
+ /** Rules for every found toolchain, in table order. */
31
+ export function rulesFor(record) {
32
+ if (!record)
33
+ return [];
34
+ const out = [];
35
+ for (const kind of ORDER)
36
+ if (record.kinds.includes(kind))
37
+ out.push(...rulesOf(kind, record));
38
+ return out;
39
+ }
40
+ /** A rule is quoted into a shell command line; these characters would break out of the quotes. */
41
+ export function isSafeRule(rule) {
42
+ return rule.trim() !== '' && !/["\\$`]/.test(rule);
43
+ }
44
+ /** Layers composed in order, each rule attributed to the first layer that contributed it. */
45
+ export function composeAllowedTools(input) {
46
+ const seen = new Set();
47
+ const take = (rules) => rules.filter((r) => (seen.has(r) ? false : (seen.add(r), true)));
48
+ const parts = {
49
+ default: take(BASE_RULES),
50
+ detected: take(input.deriveTools ? rulesFor(input.record) : []),
51
+ file: take(input.fileRules),
52
+ argument: take(input.argumentRules),
53
+ };
54
+ return { value: [...parts.default, ...parts.detected, ...parts.file, ...parts.argument], parts };
55
+ }
56
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/toolchain/tools.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,7 @@ export class GitVerifierBackend {
27
27
  }
28
28
  async run(job, ctx) {
29
29
  const { repo } = this.opts;
30
+ const checkCommand = typeof this.opts.checkCommand === 'function' ? this.opts.checkCommand() : this.opts.checkCommand;
30
31
  const expectedHead = await revParse(repo, this.opts.integrationBranch);
31
32
  ctx.progress({ status: 'checking', expectedHead });
32
33
  const temp = path.join(this.opts.tempRoot, job.jobId);
@@ -58,7 +59,10 @@ export class GitVerifierBackend {
58
59
  return { kind: 'published', publishedSha: expectedHead, verifiedSha: expectedHead };
59
60
  }
60
61
  // 2. Check command on the rebased tree.
61
- const check = await runCheck(this.opts.checkCommand, temp, this.opts.checkTimeoutMs, this.maxOut);
62
+ if (checkCommand === undefined) {
63
+ return { kind: 'failed', reason: { kind: 'checkFailed', message: 'no check command is configured for this repository', output: '' } };
64
+ }
65
+ const check = await runCheck(checkCommand, temp, this.opts.checkTimeoutMs, this.maxOut);
62
66
  crashPoint('verify.afterCheck');
63
67
  if (check.timedOut) {
64
68
  return { kind: 'failed', reason: { kind: 'checkTimeout', message: `check exceeded ${this.opts.checkTimeoutMs}ms`, output: check.output } };