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

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 (100) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/README.md +295 -2
  3. package/build/claude.js +102 -0
  4. package/build/claude.js.map +1 -0
  5. package/build/cli.js +730 -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/clock.js +17 -0
  10. package/build/clock.js.map +1 -0
  11. package/build/conditions.js +197 -0
  12. package/build/conditions.js.map +1 -0
  13. package/build/config.js +165 -0
  14. package/build/config.js.map +1 -0
  15. package/build/credential.js +52 -0
  16. package/build/credential.js.map +1 -0
  17. package/build/daemon.js +182 -0
  18. package/build/daemon.js.map +1 -0
  19. package/build/errors.js +17 -0
  20. package/build/errors.js.map +1 -0
  21. package/build/events.js +106 -0
  22. package/build/events.js.map +1 -0
  23. package/build/inbox.js +385 -0
  24. package/build/inbox.js.map +1 -0
  25. package/build/jsonc.js +24 -0
  26. package/build/jsonc.js.map +1 -0
  27. package/build/lock.js +64 -0
  28. package/build/lock.js.map +1 -0
  29. package/build/log.js +43 -0
  30. package/build/log.js.map +1 -0
  31. package/build/manager.js +637 -0
  32. package/build/manager.js.map +1 -0
  33. package/build/mod.js +51 -0
  34. package/build/mod.js.map +1 -0
  35. package/build/note.js +71 -0
  36. package/build/note.js.map +1 -0
  37. package/build/notes.js +188 -0
  38. package/build/notes.js.map +1 -0
  39. package/build/notify.js +393 -0
  40. package/build/notify.js.map +1 -0
  41. package/build/paths.js +17 -0
  42. package/build/paths.js.map +1 -0
  43. package/build/profile.js +81 -0
  44. package/build/profile.js.map +1 -0
  45. package/build/pushover.js +67 -0
  46. package/build/pushover.js.map +1 -0
  47. package/build/registry.js +35 -0
  48. package/build/registry.js.map +1 -0
  49. package/build/resolve.js +28 -0
  50. package/build/resolve.js.map +1 -0
  51. package/build/rule-input.js +17 -0
  52. package/build/rule-input.js.map +1 -0
  53. package/build/rules-service.js +391 -0
  54. package/build/rules-service.js.map +1 -0
  55. package/build/rules.js +842 -0
  56. package/build/rules.js.map +1 -0
  57. package/build/run.js +52 -0
  58. package/build/run.js.map +1 -0
  59. package/build/server.js +367 -0
  60. package/build/server.js.map +1 -0
  61. package/build/spend.js +142 -0
  62. package/build/spend.js.map +1 -0
  63. package/build/startup.js +78 -0
  64. package/build/startup.js.map +1 -0
  65. package/build/store.js +724 -0
  66. package/build/store.js.map +1 -0
  67. package/build/tab.js +26 -0
  68. package/build/tab.js.map +1 -0
  69. package/build/token.js +58 -0
  70. package/build/token.js.map +1 -0
  71. package/build/upgrade.js +105 -0
  72. package/build/upgrade.js.map +1 -0
  73. package/build/wait.js +149 -0
  74. package/build/wait.js.map +1 -0
  75. package/build/watchers/ado.js +167 -0
  76. package/build/watchers/ado.js.map +1 -0
  77. package/build/watchers/github.js +82 -0
  78. package/build/watchers/github.js.map +1 -0
  79. package/build/watchers/health.js +42 -0
  80. package/build/watchers/health.js.map +1 -0
  81. package/build/watchers/index.js +226 -0
  82. package/build/watchers/index.js.map +1 -0
  83. package/build/watchers/linear-key.js +17 -0
  84. package/build/watchers/linear-key.js.map +1 -0
  85. package/build/watchers/linear.js +227 -0
  86. package/build/watchers/linear.js.map +1 -0
  87. package/build/watchers/npm.js +35 -0
  88. package/build/watchers/npm.js.map +1 -0
  89. package/build/watchers/source.js +94 -0
  90. package/build/watchers/source.js.map +1 -0
  91. package/build/worktrees.js +143 -0
  92. package/build/worktrees.js.map +1 -0
  93. package/mod/.claude-plugin/marketplace.json +6 -0
  94. package/mod/.claude-plugin/plugin.json +7 -0
  95. package/mod/README.md +17 -0
  96. package/mod/hooks/hooks.json +1 -0
  97. package/mod/hooks/model.ts +395 -0
  98. package/mod/hooks/register.tsx +505 -0
  99. package/mod/types/index.d.ts +57 -0
  100. package/package.json +61 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/watchers/linear.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod';
2
+ import { getJson, perPass, perWait, untilSpent, WaitProblem } from "./source.js";
3
+ export const NPM_REGISTRY = 'https://registry.npmjs.org';
4
+ const distTags = z.record(z.string(), z.string());
5
+ // A version on a dist-tag, from the registry's dist-tags endpoint: a few bytes, read with no cache,
6
+ // so a stage approved a moment ago shows on the next pass. One request per package per pass.
7
+ export function npmSource({ fetch: fetcher = globalThis.fetch, registry = NPM_REGISTRY } = {}) {
8
+ return {
9
+ check: async (waits, budget) => {
10
+ const outcomes = new Map();
11
+ const ask = perPass(budget);
12
+ const tagsOf = (pkg) => ask(pkg, async () => {
13
+ const { body, status } = await getJson(fetcher, `${registry}/-/package/${pkg.replace('/', '%2f')}/dist-tags`, {
14
+ headers: { accept: 'application/json', 'cache-control': 'no-cache' },
15
+ });
16
+ if (status === 404)
17
+ throw new WaitProblem(`npm has no package ${pkg}`);
18
+ if (status !== 200)
19
+ throw new Error(`npm answered ${status} for ${pkg}'s dist-tags`);
20
+ return distTags.parse(body);
21
+ });
22
+ await untilSpent(async () => {
23
+ for (const wait of waits) {
24
+ const c = wait.condition;
25
+ if (c.kind !== 'npm')
26
+ continue;
27
+ await perWait(outcomes, wait.id, async () => (await tagsOf(c.package))[c.tag] === c.version ? `npm ${c.package}@${c.version} on ${c.tag}` : null);
28
+ }
29
+ });
30
+ return outcomes;
31
+ },
32
+ name: 'npm',
33
+ };
34
+ }
35
+ //# sourceMappingURL=npm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm.js","sourceRoot":"","sources":["../../src/watchers/npm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAgB,OAAO,EAAE,OAAO,EAAe,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5G,MAAM,CAAC,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAEzD,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAElD,oGAAoG;AACpG,6FAA6F;AAC7F,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,YAAY,EAAE,GAAG,EAAE;IAC3F,OAAO;QACL,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC7B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;YAC5C,MAAM,GAAG,GAAG,OAAO,CAAyB,MAAM,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,CAAC,GAAW,EAAmC,EAAE,CAC9D,GAAG,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE;gBAClB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,GAAG,QAAQ,cAAc,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,YAAY,EAAE;oBAC5G,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,eAAe,EAAE,UAAU,EAAE;iBACrE,CAAC,CAAC;gBACH,IAAI,MAAM,KAAK,GAAG;oBAAE,MAAM,IAAI,WAAW,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;gBACvE,IAAI,MAAM,KAAK,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC;gBACrF,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YACL,MAAM,UAAU,CAAC,KAAK,IAAI,EAAE;gBAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;oBACzB,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;wBAAE,SAAS;oBAC/B,MAAM,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE,CAC1C,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CACpG,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,EAAE,KAAK;KACZ,CAAC;AACJ,CAAC"}
@@ -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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"}
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "conductor",
3
+ "description": "The conductor mod, shipped inside @detergent-software/conductor and installed by `conduct install-mod`.",
4
+ "owner": { "name": "Emergent Software" },
5
+ "plugins": [{ "name": "conductor", "source": "./" }]
6
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "conductor",
3
+ "version": "1.0.0",
4
+ "description": "The conductor console's plumbing: a status line in every session, and in the console the inbox band, the fleet pane, zero-token commands, Remote Control pushes and escalation wake-ups.",
5
+ "author": { "name": "Emergent Software" },
6
+ "types": "./types/index.d.ts"
7
+ }
package/mod/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # Conductor mod
2
+
3
+ A Claude Code plugin (a hooks module) that does the conductor console's plumbing in code, so it costs no tokens: a status line in every session and, in the console (`CONDUCTOR_CONSOLE=1`), the inbox band, the fleet pane, `/conductor` `/inbox` `/approve` `/revise` `/attach` `/notify`, toasts, Remote Control pushes (and the one warning when Remote Control is off), and the one model wake-up for an escalation. What it shows and does is in the conductor README's *Mod* section (`apps/conductor/README.md`).
4
+
5
+ Install it with the daemon's CLI, which ships this folder:
6
+
7
+ ```text
8
+ conduct install-mod
9
+ ```
10
+
11
+ | File | Holds |
12
+ |---|---|
13
+ | `hooks/register.tsx` | the hooks: session start, commands, the band, the pane, the event stream; only its top-level functions take `$` |
14
+ | `hooks/model.ts` | the logic without the engine: parsing the daemon's answers, what the status line, band and pane show, what each event asks for |
15
+ | `types/index.d.ts` | the `$.state` contract (`conductor.snapshot`, `confirming`, `expanded`) |
16
+ | `tests/conductor.test.tsx` | `claude plugin test`: the hooks against the engine, the daemon faked beneath them |
17
+ | `tests/model.spec.ts` | vitest (`pnpm -C apps/conductor test`, in CI): `model.ts` |
@@ -0,0 +1 @@
1
+ { "modules": ["./register.tsx"] }