@detergent-software/conductor 0.0.0-stage → 1.0.0-dev.1

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 (67) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +129 -2
  3. package/build/claude.js +102 -0
  4. package/build/claude.js.map +1 -0
  5. package/build/cli.js +383 -0
  6. package/build/cli.js.map +1 -0
  7. package/build/client.js +64 -0
  8. package/build/client.js.map +1 -0
  9. package/build/conditions.js +198 -0
  10. package/build/conditions.js.map +1 -0
  11. package/build/config.js +74 -0
  12. package/build/config.js.map +1 -0
  13. package/build/daemon.js +127 -0
  14. package/build/daemon.js.map +1 -0
  15. package/build/errors.js +17 -0
  16. package/build/errors.js.map +1 -0
  17. package/build/jsonc.js +24 -0
  18. package/build/jsonc.js.map +1 -0
  19. package/build/lock.js +64 -0
  20. package/build/lock.js.map +1 -0
  21. package/build/log.js +43 -0
  22. package/build/log.js.map +1 -0
  23. package/build/manager.js +614 -0
  24. package/build/manager.js.map +1 -0
  25. package/build/paths.js +16 -0
  26. package/build/paths.js.map +1 -0
  27. package/build/profile.js +74 -0
  28. package/build/profile.js.map +1 -0
  29. package/build/registry.js +33 -0
  30. package/build/registry.js.map +1 -0
  31. package/build/resolve.js +28 -0
  32. package/build/resolve.js.map +1 -0
  33. package/build/run.js +52 -0
  34. package/build/run.js.map +1 -0
  35. package/build/server.js +227 -0
  36. package/build/server.js.map +1 -0
  37. package/build/spend.js +134 -0
  38. package/build/spend.js.map +1 -0
  39. package/build/startup.js +48 -0
  40. package/build/startup.js.map +1 -0
  41. package/build/store.js +528 -0
  42. package/build/store.js.map +1 -0
  43. package/build/tab.js +26 -0
  44. package/build/tab.js.map +1 -0
  45. package/build/token.js +58 -0
  46. package/build/token.js.map +1 -0
  47. package/build/wait.js +149 -0
  48. package/build/wait.js.map +1 -0
  49. package/build/watchers/ado.js +167 -0
  50. package/build/watchers/ado.js.map +1 -0
  51. package/build/watchers/github.js +82 -0
  52. package/build/watchers/github.js.map +1 -0
  53. package/build/watchers/health.js +42 -0
  54. package/build/watchers/health.js.map +1 -0
  55. package/build/watchers/index.js +226 -0
  56. package/build/watchers/index.js.map +1 -0
  57. package/build/watchers/linear-key.js +56 -0
  58. package/build/watchers/linear-key.js.map +1 -0
  59. package/build/watchers/linear.js +218 -0
  60. package/build/watchers/linear.js.map +1 -0
  61. package/build/watchers/npm.js +35 -0
  62. package/build/watchers/npm.js.map +1 -0
  63. package/build/watchers/source.js +94 -0
  64. package/build/watchers/source.js.map +1 -0
  65. package/build/worktrees.js +143 -0
  66. package/build/worktrees.js.map +1 -0
  67. package/package.json +56 -5
@@ -0,0 +1,94 @@
1
+ // Stops a pass when the budget is spent.
2
+ export class BudgetSpent extends Error {
3
+ constructor() {
4
+ super('rate budget spent');
5
+ this.name = 'BudgetSpent';
6
+ }
7
+ }
8
+ // Thrown by a source's HTTP call for an answer that is about the wait, not the API (a 404, a 400):
9
+ // the source turns it into that wait's Outcome.
10
+ export class WaitProblem extends Error {
11
+ constructor(message) {
12
+ super(message);
13
+ this.name = 'WaitProblem';
14
+ }
15
+ }
16
+ // GET with a timeout, for the plain-HTTP sources.
17
+ export async function getJson(fetcher, url, { headers = {}, timeoutMs = 20_000 } = {}) {
18
+ const response = await fetcher(url, { cache: 'no-store', headers, signal: AbortSignal.timeout(timeoutMs) });
19
+ const text = await response.text();
20
+ let body = null;
21
+ try {
22
+ body = text ? JSON.parse(text) : null;
23
+ }
24
+ catch {
25
+ body = null;
26
+ }
27
+ return { body, status: response.status };
28
+ }
29
+ // One request per key in a pass: the first ask takes from the budget and loads, later asks for the
30
+ // same key (another wait on the same PR or package) share its answer, or its failure.
31
+ export function perPass(budget) {
32
+ const answers = new Map();
33
+ return (key, load) => {
34
+ const known = answers.get(key);
35
+ if (known)
36
+ return known;
37
+ spend(budget);
38
+ const pending = load();
39
+ answers.set(key, pending);
40
+ return pending;
41
+ };
42
+ }
43
+ // Runs one wait's check, turning a WaitProblem into its Outcome; anything else is the source's.
44
+ export async function perWait(outcomes, id, check) {
45
+ try {
46
+ const resolution = await check();
47
+ if (resolution !== null)
48
+ outcomes.set(id, { resolution });
49
+ }
50
+ catch (error) {
51
+ if (!(error instanceof WaitProblem))
52
+ throw error;
53
+ outcomes.set(id, { error: error.message });
54
+ }
55
+ }
56
+ export function rateBudget(perMinute, now = Date.now) {
57
+ let stamps = [];
58
+ let requests = 0;
59
+ let skipped = 0;
60
+ return {
61
+ drain: () => {
62
+ const counts = { requests, skipped };
63
+ requests = 0;
64
+ skipped = 0;
65
+ return counts;
66
+ },
67
+ take: () => {
68
+ const at = now();
69
+ stamps = stamps.filter((s) => at - s < 60_000);
70
+ if (stamps.length >= perMinute) {
71
+ skipped++;
72
+ return false;
73
+ }
74
+ stamps.push(at);
75
+ requests++;
76
+ return true;
77
+ },
78
+ };
79
+ }
80
+ export function spend(budget) {
81
+ if (!budget.take())
82
+ throw new BudgetSpent();
83
+ }
84
+ // Runs a pass's work; a spent budget ends it early, keeping the outcomes found so far.
85
+ export async function untilSpent(work) {
86
+ try {
87
+ await work();
88
+ }
89
+ catch (error) {
90
+ if (!(error instanceof BudgetSpent))
91
+ throw error;
92
+ }
93
+ }
94
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/watchers/source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { z } from 'zod';
4
+ import { ConductorError } from "./errors.js";
5
+ import { outputOf, run } from "./run.js";
6
+ // The create hook does the branch, `pnpm install`, the port slot and its own `atk install`.
7
+ const CREATE_MS = 10 * 60_000;
8
+ const REMOVE_MS = 5 * 60_000;
9
+ const LOCKFILE = '.atk-lock.json';
10
+ export function hookPath(root) {
11
+ return join(root, '.claude', 'hooks', 'worktree-hooks.mjs');
12
+ }
13
+ // `git status --porcelain=v1 -z` as { code, path }. A rename or copy carries its source path as the
14
+ // next NUL-separated field.
15
+ export function parsePorcelain(text) {
16
+ const fields = text.split('\0');
17
+ const entries = [];
18
+ for (let i = 0; i < fields.length; i++) {
19
+ const field = fields[i] ?? '';
20
+ if (field.length < 4)
21
+ continue;
22
+ const code = field.slice(0, 2);
23
+ entries.push({ code, path: field.slice(3) });
24
+ if (code[0] === 'R' || code[0] === 'C')
25
+ i++;
26
+ }
27
+ return entries;
28
+ }
29
+ // The pinned skills whose installed files don't match the lockfile, from `atk audit --json`, as
30
+ // "<name> <version> <status>" lines. One the lockfile doesn't list is `not installed`.
31
+ export function staleSkills(audit, names) {
32
+ const parsed = auditSchema.safeParse(audit);
33
+ if (!parsed.success)
34
+ throw new Error('atk audit --json printed no tools list');
35
+ const entries = parsed.data.tools.flatMap((t) => t.entries ?? []);
36
+ return names.flatMap((name) => {
37
+ const found = entries.filter((e) => e.name === name);
38
+ if (found.length === 0)
39
+ return [`${name} not installed`];
40
+ return found.filter((e) => e.status !== 'ok').map((e) => `${name}${e.version ? ` ${e.version}` : ''} ${e.status}`);
41
+ });
42
+ }
43
+ const auditSchema = z.looseObject({
44
+ tools: z.array(z.looseObject({
45
+ entries: z
46
+ .array(z.looseObject({ name: z.string(), status: z.string(), version: z.string().nullish() }))
47
+ .optional(),
48
+ })),
49
+ });
50
+ export function gitWorktrees() {
51
+ // Untrimmed: porcelain status starts with a space for a file changed only in the worktree.
52
+ const git = async (args, cwd) => {
53
+ const result = await run('git', args, { cwd });
54
+ return result.code === 0 ? result.stdout : null;
55
+ };
56
+ const hook = async (root, input, timeoutMs) => {
57
+ const path = hookPath(root);
58
+ if (!existsSync(path)) {
59
+ throw new ConductorError(`no worktree hooks at ${path}`, ['the project needs the ATK worktree-kit bundle']);
60
+ }
61
+ // The hook reads CLAUDE_PROJECT_DIR the way Claude Code runs it.
62
+ const result = await run('node', [path], {
63
+ cwd: root,
64
+ env: { ...process.env, CLAUDE_PROJECT_DIR: root },
65
+ input: JSON.stringify({ ...input, cwd: root }),
66
+ timeoutMs,
67
+ });
68
+ if (result.code !== 0)
69
+ throw new ConductorError(`the ${input.hook_event_name} hook failed`, [outputOf(result, 500)]);
70
+ return result.stdout.trim();
71
+ };
72
+ const atk = (args) => run('atk', args, { shell: true, timeoutMs: REMOVE_MS });
73
+ const audit = async (worktree, skills) => {
74
+ const result = await atk(['audit', '--json', '-P', worktree]); // exits 1 when a checksum fails
75
+ try {
76
+ return staleSkills(JSON.parse(result.stdout), skills);
77
+ }
78
+ catch (error) {
79
+ // An audit that can't run proves nothing matches.
80
+ return [`atk audit failed (${String(error)}: ${outputOf(result, 300)})`];
81
+ }
82
+ };
83
+ return {
84
+ branchOf: async (path) => (await git(['symbolic-ref', '--quiet', '--short', 'HEAD'], path))?.trim() || null,
85
+ checkSkills: async (worktree, skills) => {
86
+ if (!existsSync(join(worktree, LOCKFILE)))
87
+ return null;
88
+ let stale = await audit(worktree, skills);
89
+ let installError = '';
90
+ if (stale.length > 0) {
91
+ const installed = await atk(['install', '--json', '-P', worktree]);
92
+ if (installed.code !== 0)
93
+ installError = ` (atk install: ${outputOf(installed, 300)})`;
94
+ stale = await audit(worktree, skills);
95
+ }
96
+ if (stale.length > 0)
97
+ return `${stale.join(', ')} against ${LOCKFILE}, and atk install didn't fix it${installError}`;
98
+ // atk install rewrites the lockfile when its checksums aren't the registry's. The worker would
99
+ // start with a change it didn't make, and retire would refuse it as uncommitted work.
100
+ if (await git(['status', '--porcelain', '--', LOCKFILE], worktree)) {
101
+ await git(['checkout', '--', LOCKFILE], worktree); // not work to keep
102
+ return `atk install rewrote ${LOCKFILE}: the checksums on the base branch differ from the registry's`;
103
+ }
104
+ return null;
105
+ },
106
+ create: async (root, name) => {
107
+ const path = await hook(root, { hook_event_name: 'WorktreeCreate', name }, CREATE_MS);
108
+ if (!path)
109
+ throw new ConductorError('the WorktreeCreate hook printed no path');
110
+ return path;
111
+ },
112
+ remove: async (root, path) => {
113
+ await hook(root, { hook_event_name: 'WorktreeRemove', worktree_path: path }, REMOVE_MS);
114
+ if (existsSync(path))
115
+ throw new ConductorError(`${path} is still there after the WorktreeRemove hook`);
116
+ },
117
+ unfinishedWork: async (path) => {
118
+ if (!existsSync(path))
119
+ return null;
120
+ const status = await git(['status', '--porcelain=v1', '-z'], path);
121
+ if (status === null)
122
+ throw new ConductorError(`git status failed in ${path}`);
123
+ const dirty = [];
124
+ for (const entry of parsePorcelain(status)) {
125
+ // A checkout with core.autocrlf can show a file as modified when only its line endings differ.
126
+ const onlyModified = /^[ M][ M]$/.test(entry.code);
127
+ const same = onlyModified && (await git(['diff', '--quiet', '--ignore-cr-at-eol', 'HEAD', '--', entry.path], path)) !== null;
128
+ if (!same)
129
+ dirty.push(entry.path);
130
+ }
131
+ const count = await git(['rev-list', '--count', 'HEAD', '--not', '--remotes'], path);
132
+ const unpushed = Number(count ?? 0);
133
+ const work = {
134
+ ...(dirty.length > 0 ? { dirty } : {}),
135
+ ...(unpushed > 0 ? { unpushed } : {}),
136
+ // Unknown is not none: a retire without --force must not throw commits away.
137
+ ...(count === null ? { unknown: `git rev-list failed in ${path}` } : {}),
138
+ };
139
+ return Object.keys(work).length > 0 ? work : null;
140
+ },
141
+ };
142
+ }
143
+ //# sourceMappingURL=worktrees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktrees.js","sourceRoot":"","sources":["../src/worktrees.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,57 @@
1
1
  {
2
- "name": "@detergent-software/conductor",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
2
+ "name": "@detergent-software/conductor",
3
+ "version": "1.0.0-dev.1",
4
+ "description": "Conductor: the local daemon that runs conducted projects' work loops (conduct serve) and its conduct CLI.",
5
+ "type": "module",
6
+ "bin": {
7
+ "conduct": "./build/cli.js"
8
+ },
9
+ "files": [
10
+ "build",
11
+ "!build/__tests__",
12
+ "CHANGELOG.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "tsc --watch",
17
+ "lint": "eslint src/",
18
+ "lint:fix": "eslint src/ --fix --cache",
19
+ "test": "vitest run",
20
+ "test:watch": "vitest",
21
+ "typecheck": "tsc --noEmit"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit",
26
+ "directory": "apps/conductor"
27
+ },
28
+ "engines": {
29
+ "node": ">=24.0.0"
30
+ },
31
+ "publishConfig": {
32
+ "registry": "https://registry.npmjs.org",
33
+ "access": "public"
34
+ },
35
+ "dependencies": {
36
+ "jsonc-parser": "^3.3.1",
37
+ "zod": "^4.0.0"
38
+ },
39
+ "devDependencies": {
40
+ "@eslint/js": "^9.0.0",
41
+ "@semantic-release/changelog": "^6.0.3",
42
+ "@semantic-release/commit-analyzer": "^13.0.1",
43
+ "@semantic-release/git": "^10.0.1",
44
+ "@semantic-release/release-notes-generator": "^14.1.0",
45
+ "@types/node": "^24.0.0",
46
+ "@vitest/eslint-plugin": "^1.0.0",
47
+ "conventional-changelog-conventionalcommits": "^9.1.0",
48
+ "eslint": "^9.0.0",
49
+ "eslint-config-prettier": "^10.0.0",
50
+ "eslint-plugin-perfectionist": "^5.0.0",
51
+ "prettier": "^3.4.0",
52
+ "semantic-release": "^25.0.3",
53
+ "typescript": "^5.7.0",
54
+ "typescript-eslint": "^8.0.0",
55
+ "vitest": "^4.0.0"
56
+ }
57
+ }