@detergent-software/conductor 3.0.0-dev.8 → 3.0.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 (210) hide show
  1. package/CHANGELOG.md +482 -0
  2. package/README.md +275 -125
  3. package/build/brief-cli.js +5 -12
  4. package/build/brief-cli.js.map +1 -1
  5. package/build/brief.js +4 -3
  6. package/build/brief.js.map +1 -1
  7. package/build/broker-cli.js +42 -15
  8. package/build/broker-cli.js.map +1 -1
  9. package/build/broker.js +1 -1
  10. package/build/broker.js.map +1 -1
  11. package/build/cli.js +221 -63
  12. package/build/cli.js.map +1 -1
  13. package/build/clones.js +92 -0
  14. package/build/clones.js.map +1 -0
  15. package/build/code-host-cli.js +172 -40
  16. package/build/code-host-cli.js.map +1 -1
  17. package/build/code-host-service.js +35 -2
  18. package/build/code-host-service.js.map +1 -1
  19. package/build/code-host.js +138 -16
  20. package/build/code-host.js.map +1 -1
  21. package/build/conditions.js +33 -16
  22. package/build/conditions.js.map +1 -1
  23. package/build/config.js +58 -28
  24. package/build/config.js.map +1 -1
  25. package/build/console.js +17 -27
  26. package/build/console.js.map +1 -1
  27. package/build/credentials.js +86 -54
  28. package/build/credentials.js.map +1 -1
  29. package/build/daemon.js +54 -65
  30. package/build/daemon.js.map +1 -1
  31. package/build/file-lock.js +155 -40
  32. package/build/file-lock.js.map +1 -1
  33. package/build/follow-ups.js +2 -2
  34. package/build/follow-ups.js.map +1 -1
  35. package/build/help.js +241 -83
  36. package/build/help.js.map +1 -1
  37. package/build/history.js +10 -4
  38. package/build/history.js.map +1 -1
  39. package/build/host/credential-manager.js +109 -0
  40. package/build/host/credential-manager.js.map +1 -0
  41. package/build/host/keychain.js +44 -0
  42. package/build/host/keychain.js.map +1 -0
  43. package/build/host/launchd.js +118 -0
  44. package/build/host/launchd.js.map +1 -0
  45. package/build/host/libsecret.js +40 -0
  46. package/build/host/libsecret.js.map +1 -0
  47. package/build/host/macos-terminal.js +63 -0
  48. package/build/host/macos-terminal.js.map +1 -0
  49. package/build/host/platform.js +4 -0
  50. package/build/host/platform.js.map +1 -0
  51. package/build/host/secrets.js +46 -0
  52. package/build/host/secrets.js.map +1 -0
  53. package/build/host/shell.js +26 -0
  54. package/build/host/shell.js.map +1 -0
  55. package/build/host/startup.js +26 -0
  56. package/build/host/startup.js.map +1 -0
  57. package/build/host/systemd.js +91 -0
  58. package/build/host/systemd.js.map +1 -0
  59. package/build/host/task-scheduler.js +78 -0
  60. package/build/host/task-scheduler.js.map +1 -0
  61. package/build/host/terminal.js +46 -0
  62. package/build/host/terminal.js.map +1 -0
  63. package/build/host/tmux.js +39 -0
  64. package/build/host/tmux.js.map +1 -0
  65. package/build/host/windows-terminal.js +46 -0
  66. package/build/host/windows-terminal.js.map +1 -0
  67. package/build/in-process.js +6 -5
  68. package/build/in-process.js.map +1 -1
  69. package/build/inbox.js +57 -39
  70. package/build/inbox.js.map +1 -1
  71. package/build/init.js +509 -0
  72. package/build/init.js.map +1 -0
  73. package/build/landing.js +107 -10
  74. package/build/landing.js.map +1 -1
  75. package/build/lib/providers/ado/code-host.js +5 -1
  76. package/build/lib/providers/ado/code-host.js.map +1 -1
  77. package/build/lib/providers/ado/pipelines.js +138 -26
  78. package/build/lib/providers/ado/pipelines.js.map +1 -1
  79. package/build/lib/providers/ado/trigger.js +5 -0
  80. package/build/lib/providers/ado/trigger.js.map +1 -1
  81. package/build/lib/providers/ado/writes.js +17 -2
  82. package/build/lib/providers/ado/writes.js.map +1 -1
  83. package/build/lib/providers/github/actions.js +90 -3
  84. package/build/lib/providers/github/actions.js.map +1 -1
  85. package/build/lib/providers/github/code-host.js +2 -0
  86. package/build/lib/providers/github/code-host.js.map +1 -1
  87. package/build/lib/providers/github/writes.js +25 -2
  88. package/build/lib/providers/github/writes.js.map +1 -1
  89. package/build/lib/providers/index.js +3 -2
  90. package/build/lib/providers/index.js.map +1 -1
  91. package/build/lib/providers/npm/stage.js +14 -1
  92. package/build/lib/providers/npm/stage.js.map +1 -1
  93. package/build/lib/providers/timing.js +10 -0
  94. package/build/lib/providers/timing.js.map +1 -0
  95. package/build/lib/providers/verdicts/pr.js +47 -6
  96. package/build/lib/providers/verdicts/pr.js.map +1 -1
  97. package/build/lib/providers/verdicts/runs.js +12 -2
  98. package/build/lib/providers/verdicts/runs.js.map +1 -1
  99. package/build/logins.js +13 -6
  100. package/build/logins.js.map +1 -1
  101. package/build/manager.js +121 -55
  102. package/build/manager.js.map +1 -1
  103. package/build/note.js +5 -15
  104. package/build/note.js.map +1 -1
  105. package/build/notes.js +130 -23
  106. package/build/notes.js.map +1 -1
  107. package/build/notify.js +104 -42
  108. package/build/notify.js.map +1 -1
  109. package/build/npm-reads.js +151 -22
  110. package/build/npm-reads.js.map +1 -1
  111. package/build/ownership.js +2 -2
  112. package/build/paths.js +44 -1
  113. package/build/paths.js.map +1 -1
  114. package/build/plugin.js +4 -2
  115. package/build/plugin.js.map +1 -1
  116. package/build/profile-fields.js +153 -0
  117. package/build/profile-fields.js.map +1 -0
  118. package/build/profile-layers.js +264 -0
  119. package/build/profile-layers.js.map +1 -0
  120. package/build/profile.js +107 -51
  121. package/build/profile.js.map +1 -1
  122. package/build/project-check-cli.js +17 -19
  123. package/build/project-check-cli.js.map +1 -1
  124. package/build/project-check.js +166 -104
  125. package/build/project-check.js.map +1 -1
  126. package/build/protocol.js +5 -21
  127. package/build/protocol.js.map +1 -1
  128. package/build/pushover.js +5 -5
  129. package/build/pushover.js.map +1 -1
  130. package/build/queue.js +4 -4
  131. package/build/queue.js.map +1 -1
  132. package/build/registry.js +195 -36
  133. package/build/registry.js.map +1 -1
  134. package/build/release-kinds.js +34 -0
  135. package/build/release-kinds.js.map +1 -0
  136. package/build/rule-actions.js +8 -6
  137. package/build/rule-actions.js.map +1 -1
  138. package/build/rules-service.js +104 -47
  139. package/build/rules-service.js.map +1 -1
  140. package/build/rules.js +23 -23
  141. package/build/rules.js.map +1 -1
  142. package/build/run.js +20 -7
  143. package/build/run.js.map +1 -1
  144. package/build/runs.js +218 -68
  145. package/build/runs.js.map +1 -1
  146. package/build/scheduler.js +89 -13
  147. package/build/scheduler.js.map +1 -1
  148. package/build/search.js +2 -1
  149. package/build/search.js.map +1 -1
  150. package/build/server.js +51 -14
  151. package/build/server.js.map +1 -1
  152. package/build/spend.js +1 -1
  153. package/build/spend.js.map +1 -1
  154. package/build/store.js +79 -20
  155. package/build/store.js.map +1 -1
  156. package/build/supervise.js +1 -1
  157. package/build/supervise.js.map +1 -1
  158. package/build/timeline.js +104 -0
  159. package/build/timeline.js.map +1 -0
  160. package/build/tracker-reads-cli.js +4 -5
  161. package/build/tracker-reads-cli.js.map +1 -1
  162. package/build/trackers.js +56 -10
  163. package/build/trackers.js.map +1 -1
  164. package/build/train-cli.js +6 -5
  165. package/build/train-cli.js.map +1 -1
  166. package/build/train.js +2 -2
  167. package/build/train.js.map +1 -1
  168. package/build/upgrade.js +8 -9
  169. package/build/upgrade.js.map +1 -1
  170. package/build/wait.js +10 -10
  171. package/build/wait.js.map +1 -1
  172. package/build/watchers/ado.js +42 -19
  173. package/build/watchers/ado.js.map +1 -1
  174. package/build/watchers/github.js +18 -4
  175. package/build/watchers/github.js.map +1 -1
  176. package/build/watchers/index.js +2 -2
  177. package/build/watchers/index.js.map +1 -1
  178. package/build/watchers/linear-queue.js +47 -14
  179. package/build/watchers/linear-queue.js.map +1 -1
  180. package/build/watchers/linear-writes.js +26 -12
  181. package/build/watchers/linear-writes.js.map +1 -1
  182. package/build/watchers/linear.js +2 -2
  183. package/build/watchers/linear.js.map +1 -1
  184. package/build/watchers/source.js +5 -1
  185. package/build/watchers/source.js.map +1 -1
  186. package/build/webhook.js +80 -0
  187. package/build/webhook.js.map +1 -0
  188. package/build/why.js +1 -1
  189. package/build/why.js.map +1 -1
  190. package/build/worktrees.js +56 -93
  191. package/build/worktrees.js.map +1 -1
  192. package/package.json +61 -61
  193. package/plugin/.claude-plugin/plugin.json +1 -1
  194. package/plugin/hooks/model.ts +46 -6
  195. package/plugin/hooks/register.tsx +41 -2
  196. package/plugin/skills/conductor-console/SKILL.md +26 -27
  197. package/plugin/skills/work-item/SKILL.md +58 -54
  198. package/plugin/skills/work-item/trackers/ado-boards.md +2 -2
  199. package/plugin/skills/work-item/trackers/github-issues.md +1 -1
  200. package/plugin/skills/work-item/trackers/linear.md +2 -2
  201. package/plugin/types/index.d.ts +1 -1
  202. package/protocol/PROTOCOL.md +3 -9
  203. package/build/checkout-sync.js +0 -249
  204. package/build/checkout-sync.js.map +0 -1
  205. package/build/credential.js +0 -66
  206. package/build/credential.js.map +0 -1
  207. package/build/startup.js +0 -92
  208. package/build/startup.js.map +0 -1
  209. package/build/tab.js +0 -32
  210. package/build/tab.js.map +0 -1
@@ -1,51 +1,22 @@
1
1
  import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
2
2
  import { rm } from 'node:fs/promises';
3
- import { basename, dirname, isAbsolute, join, relative, resolve } from 'node:path';
3
+ import { basename, dirname, join, resolve } from 'node:path';
4
4
  import { z } from 'zod';
5
5
  import { realDirty, runGit, scratchClones } from "./checkout.js";
6
6
  import { ConductorError } from "./errors.js";
7
7
  import { copyLocalFiles } from "./local-files.js";
8
+ import { realOr, samePath } from "./paths.js";
8
9
  import { missingProjectSkills } from "./plugin.js";
9
10
  import { outputOf, run } from "./run.js";
10
11
  import { claudeSkillsDir } from "./spend.js";
11
12
  export const BRANCH_PREFIX = 'worktree-';
12
- // Each setup command's limit: ATK's `pnpm install` takes about a minute.
13
+ // Each setup command's limit: a monorepo's `pnpm install` can take a minute or more.
13
14
  const SETUP_MS = 10 * 60_000;
14
- // `atk audit` and `atk install`, for checkout-sync's skills check.
15
- const ATK_MS = 5 * 60_000;
16
15
  // How long a removal waits for a process to let go of the worktree before it gives up.
17
16
  const RELEASE_MS = 15_000;
18
17
  // A .trash-* folder older than this is an interrupted removal's, not one still deleting.
19
18
  const STALE_TRASH_MS = 60 * 60_000;
20
- const LOCKFILE = '.atk-lock.json';
21
19
  export const SESSION_SETTINGS = join('.claude', 'settings.local.json');
22
- // The pinned skills whose installed files don't match the lockfile, from `atk audit --json`, as
23
- // "<name> <version> <status>" lines. One the lockfile doesn't list is `not installed`.
24
- export function staleSkills(audit, names) {
25
- const parsed = auditSchema.safeParse(audit);
26
- if (!parsed.success)
27
- throw new Error('atk audit --json printed no tools list');
28
- const entries = parsed.data.tools.flatMap((t) => t.entries ?? []);
29
- return names.flatMap((name) => {
30
- const found = entries.filter((e) => e.name === name);
31
- if (found.length === 0)
32
- return [`${name} not installed`];
33
- return found.filter((e) => e.status !== 'ok').map((e) => `${name}${e.version ? ` ${e.version}` : ''} ${e.status}`);
34
- });
35
- }
36
- export function worktreePath(root, name) {
37
- return join(worktreesDir(root), name);
38
- }
39
- function worktreesDir(root) {
40
- return join(root, '.claude', 'worktrees');
41
- }
42
- const auditSchema = z.looseObject({
43
- tools: z.array(z.looseObject({
44
- entries: z
45
- .array(z.looseObject({ name: z.string(), status: z.string(), version: z.string().nullish() }))
46
- .optional(),
47
- })),
48
- });
49
20
  export function gitWorktrees(deps = {}) {
50
21
  const gitRun = deps.git ?? runGit;
51
22
  const skillsHome = deps.skillsHome ?? claudeSkillsDir();
@@ -63,14 +34,13 @@ export function gitWorktrees(deps = {}) {
63
34
  };
64
35
  const branchOf = async (path) => (await git(['symbolic-ref', '--quiet', '--short', 'HEAD'], path))?.trim() || null;
65
36
  const create = async (request) => {
66
- const { base, env, localFilesFrom, name, root, sessionEnv, setup } = request;
67
- const path = worktreePath(root, name);
37
+ const { base, clone, env, localFilesFrom, name, path, sessionEnv, setup } = request;
68
38
  const reused = existsSync(join(path, '.git'));
69
39
  if (reused) {
70
40
  // Never deleted: it may hold someone's work, and a git call can fail for a moment.
71
41
  if ((await git(['rev-parse', '--is-inside-work-tree'], path))?.trim() !== 'true')
72
42
  throw new ConductorError(`${path} has a .git that git can't read`, [
73
- 'look at what is in it, then delete it, or run git worktree repair in the main checkout',
43
+ `look at what is in it, then delete it, or run git -C "${clone}" worktree repair`,
74
44
  ]);
75
45
  }
76
46
  else {
@@ -78,16 +48,17 @@ export function gitWorktrees(deps = {}) {
78
48
  if (existsSync(path))
79
49
  await rm(path, { force: true, maxRetries: 3, recursive: true });
80
50
  // Git still lists a worktree whose directory went without it, and refuses to add at its path.
81
- await git(['worktree', 'prune'], root);
82
- // Deep node_modules paths under .claude/worktrees/<name> pass 260 characters, and without this
83
- // Git for Windows can't check them out or remove them.
51
+ await git(['worktree', 'prune'], clone);
52
+ // Deep node_modules paths in a worktree pass 260 characters, and without this Git for Windows
53
+ // can't check them out or remove them.
84
54
  if (platform === 'win32')
85
- await git(['config', 'core.longpaths', 'true'], root);
55
+ await git(['config', 'core.longpaths', 'true'], clone);
86
56
  // Offline, the worktree starts from the origin/<base> fetched last; with none, the add says so.
87
- await git(['fetch', '--quiet', 'origin', base], root);
57
+ await git(['fetch', '--quiet', 'origin', base], clone);
88
58
  const branch = `${BRANCH_PREFIX}${name}`;
89
- const known = await hasBranch(root, branch);
90
- await must(known ? ['worktree', 'add', path, branch] : ['worktree', 'add', '-b', branch, path, `origin/${base}`], root, `git worktree add failed for ${path}`);
59
+ const known = await hasBranch(clone, branch);
60
+ mkdirSync(dirname(path), { recursive: true });
61
+ await must(known ? ['worktree', 'add', path, branch] : ['worktree', 'add', '-b', branch, path, `origin/${base}`], clone, `git worktree add failed for ${path}`);
91
62
  }
92
63
  // A reused worktree's own changes (a kept worker's) are its; only what setup changes counts.
93
64
  const before = new Set(reused ? (await realDirty(gitRun, path)).dirty : []);
@@ -105,8 +76,8 @@ export function gitWorktrees(deps = {}) {
105
76
  throw new ConductorError(`setup "${command}" failed in ${path}`, [outputOf(result, 1500)]);
106
77
  }
107
78
  // A worker that starts with changes it didn't make takes them for its own, and retire then
108
- // refuses them as unfinished work: setup builds gitignored files only. (atk install rewrites
109
- // .atk-lock.json when the registry's checksums aren't the base branch's.)
79
+ // refuses them as unfinished work: setup builds gitignored files only. (An installer that
80
+ // rewrites a tracked lockfile, for one, would trip it.)
110
81
  const dirty = (await realDirty(gitRun, path)).dirty.filter((file) => !before.has(file));
111
82
  if (dirty.length > 0)
112
83
  throw new ConductorError(`setup left changes in ${path}: ${dirty.join(', ')}`, [
@@ -117,20 +88,47 @@ export function gitWorktrees(deps = {}) {
117
88
  return path;
118
89
  };
119
90
  const hasBranch = async (root, branch) => (await git(['show-ref', '--verify', '--quiet', `refs/heads/${branch}`], root)) !== null;
91
+ const repoOf = async (path) => {
92
+ if (!existsSync(path))
93
+ return null;
94
+ const common = (await git(['rev-parse', '--path-format=absolute', '--git-common-dir'], path))?.trim();
95
+ return common ? dirname(resolve(common)) : null;
96
+ };
97
+ // The linked worktrees git lists for a repository: not its main checkout, which comes first.
98
+ const linked = async (repo) => ((await git(['worktree', 'list', '--porcelain'], repo)) ?? '')
99
+ .split(/\r?\n/)
100
+ .filter((line) => line.startsWith('worktree '))
101
+ .slice(1)
102
+ .map((line) => line.slice('worktree '.length));
120
103
  // Not `git worktree remove`, which leaves pnpm's node_modules junctions behind on Windows: the
121
104
  // worktree is moved aside, which frees its path at once, git forgets it, and Node deletes the
122
- // directory, unlinking junctions without following them (the worktree-kit hook's way).
123
- const remove = async (root, path, { deleteBranch }) => {
124
- const dir = worktreesDir(root);
125
- if (!isInside(dir, path))
126
- throw new ConductorError(`${path} isn't under ${dir}`, ['the conductor removes only the worktrees it makes']);
127
- // With the directory gone already, the branch a launch made, but only while no commit of it is
128
- // anywhere else: nothing on a remote is lost by deleting it, and nothing else is deleted.
129
- let branch = existsSync(path) ? await branchOf(path) : null;
105
+ // directory, unlinking junctions without following them (the worktree-kit hook's way). It removes
106
+ // only a linked worktree its repository lists, or a folder with no .git under a `worktrees`
107
+ // folder (a create that failed part way): never a main checkout, never anything else.
108
+ const remove = async (path, { deleteBranch, repo: given }) => {
109
+ const there = existsSync(path);
110
+ // Git runs in the folder only when it has a .git of its own: in one without, git would walk up to
111
+ // whatever repository encloses it.
112
+ const own = there && existsSync(join(path, '.git'));
113
+ const repo = (own ? await repoOf(path) : null) ?? given;
114
+ if (own) {
115
+ // Real paths on both sides: git lists the long form of a path given in 8.3 short form.
116
+ if (!(await linked(repo)).some((listed) => samePath(realOr(listed), realOr(path))))
117
+ throw new ConductorError(`${path} isn't a linked worktree of ${repo}`, [
118
+ 'the conductor removes only the worktrees it makes',
119
+ ]);
120
+ }
121
+ else if (there && basename(dirname(path)) !== 'worktrees') {
122
+ throw new ConductorError(`${path} isn't a worktree`, ['the conductor removes only the worktrees it makes']);
123
+ }
124
+ // With no worktree there (gone, or a create that failed before git made it), the branch a launch
125
+ // made, but only while no commit of it is anywhere else: nothing on a remote is lost by deleting
126
+ // it, and nothing else is deleted.
127
+ let branch = own ? await branchOf(path) : null;
130
128
  if (branch === null && deleteBranch) {
131
129
  const made = `${BRANCH_PREFIX}${basename(path)}`;
132
- const unpushed = (await hasBranch(root, made))
133
- ? await git(['rev-list', '--count', made, '--not', '--remotes'], root)
130
+ const unpushed = (await hasBranch(repo, made))
131
+ ? await git(['rev-list', '--count', made, '--not', '--remotes'], repo)
134
132
  : null;
135
133
  if (unpushed?.trim() === '0')
136
134
  branch = made;
@@ -146,15 +144,16 @@ export function gitWorktrees(deps = {}) {
146
144
  ]);
147
145
  await sleep(1000);
148
146
  }
149
- await must(['worktree', 'prune'], root, 'git worktree prune failed');
147
+ await must(['worktree', 'prune'], repo, 'git worktree prune failed');
150
148
  if (deleteBranch && branch)
151
- await must(['branch', '-D', branch], root, `git couldn't delete the branch ${branch}`);
149
+ await must(['branch', '-D', branch], repo, `git couldn't delete the branch ${branch}`);
152
150
  // Asynchronous: a worktree's node_modules takes a minute to delete, and the daemon's API and
153
151
  // sweeps go on answering meanwhile.
154
152
  if (trash)
155
153
  await rm(trash, { force: true, maxRetries: 5, recursive: true, retryDelay: 500 });
156
154
  // A removal interrupted earlier leaves its .trash-* folder; one under an hour old may be another
157
155
  // removal's, still deleting.
156
+ const dir = dirname(path);
158
157
  for (const entry of existsSync(dir) ? readdirSync(dir) : []) {
159
158
  const at = Number(/^\.trash-.+-(\d+)$/.exec(entry)?.[1] ?? Number.NaN);
160
159
  if (Date.now() - at > STALE_TRASH_MS)
@@ -173,44 +172,12 @@ export function gitWorktrees(deps = {}) {
173
172
  ...(count === null ? { unknown: `git rev-list failed in ${path}` } : {}),
174
173
  };
175
174
  };
176
- const atk = (args) => run('atk', args, { shell: true, timeoutMs: ATK_MS });
177
- const audit = async (worktree, skills) => {
178
- const result = await atk(['audit', '--json', '-P', worktree]); // exits 1 when a checksum fails
179
- try {
180
- return staleSkills(JSON.parse(result.stdout), skills);
181
- }
182
- catch (error) {
183
- // An audit that can't run proves nothing matches.
184
- return [`atk audit failed (${String(error)}: ${outputOf(result, 300)})`];
185
- }
186
- };
187
175
  return {
188
- auditSkills: async (checkout, skills) => (existsSync(join(checkout, LOCKFILE)) ? audit(checkout, skills) : null),
189
176
  branchOf,
190
- checkSkills: async (worktree, skills) => {
191
- if (!existsSync(join(worktree, LOCKFILE)))
192
- return null;
193
- let stale = await audit(worktree, skills);
194
- let installError = '';
195
- if (stale.length > 0) {
196
- const installed = await atk(['install', '--json', '-P', worktree]);
197
- if (installed.code !== 0)
198
- installError = ` (atk install: ${outputOf(installed, 300)})`;
199
- stale = await audit(worktree, skills);
200
- }
201
- if (stale.length > 0)
202
- return `${stale.join(', ')} against ${LOCKFILE}, and atk install didn't fix it${installError}`;
203
- // atk install rewrites the lockfile when its checksums aren't the registry's. The worker would
204
- // start with a change it didn't make, and retire would refuse it as uncommitted work.
205
- if (await git(['status', '--porcelain', '--', LOCKFILE], worktree)) {
206
- await git(['checkout', '--', LOCKFILE], worktree); // not work to keep
207
- return `atk install rewrote ${LOCKFILE}: the checksums on the base branch differ from the registry's`;
208
- }
209
- return null;
210
- },
211
177
  create,
212
178
  missingSkills: (worktree, skills) => missingProjectSkills(worktree, skills, skillsHome),
213
179
  remove,
180
+ repoOf,
214
181
  unfinishedWork: async (path) => {
215
182
  if (!existsSync(path))
216
183
  return null;
@@ -253,10 +220,6 @@ export function writeSessionEnv(worktree, env) {
253
220
  }
254
221
  const settingsSchema = z.record(z.string(), z.unknown());
255
222
  const envSchema = z.record(z.string(), z.string());
256
- function isInside(parent, child) {
257
- const rel = relative(resolve(parent), resolve(child));
258
- return rel !== '' && !rel.startsWith('..') && !isAbsolute(rel);
259
- }
260
223
  // Renames a directory to .trash-<name>-<time> beside it; null when something holds it.
261
224
  function moveAside(dir) {
262
225
  const trash = join(dirname(dir), `.trash-${basename(dir)}-${Date.now()}`);
@@ -1 +1 @@
1
- {"version":3,"file":"worktrees.js","sourceRoot":"","sources":["../src/worktrees.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worktrees.js","sourceRoot":"","sources":["../src/worktrees.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,62 +1,62 @@
1
1
  {
2
- "name": "@detergent-software/conductor",
3
- "version": "3.0.0-dev.8",
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
- "plugin",
13
- "!plugin/tests",
14
- "!plugin/.claude-plugin/types",
15
- "protocol",
16
- "CHANGELOG.md"
17
- ],
18
- "scripts": {
19
- "build": "tsc",
20
- "dev": "tsc --watch",
21
- "format": "prettier --write \"src/**/*.{ts,tsx}\" \"plugin/**/*.{ts,tsx}\" \"scripts/**/*.mjs\"",
22
- "format:check": "prettier --check \"src/**/*.{ts,tsx}\" \"plugin/**/*.{ts,tsx}\" \"scripts/**/*.mjs\"",
23
- "lint": "eslint src/ plugin/",
24
- "lint:fix": "eslint src/ plugin/ --fix --cache",
25
- "test": "vitest run",
26
- "test:watch": "vitest",
27
- "typecheck": "tsc --noEmit && tsc -p tsconfig.mod.json && tsc -p tsconfig.mod-specs.json"
28
- },
29
- "repository": {
30
- "type": "git",
31
- "url": "https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit",
32
- "directory": "apps/conductor"
33
- },
34
- "engines": {
35
- "node": ">=24.5.0"
36
- },
37
- "publishConfig": {
38
- "registry": "https://registry.npmjs.org",
39
- "access": "public"
40
- },
41
- "dependencies": {
42
- "jsonc-parser": "^3.3.1",
43
- "semver": "^7.7.0",
44
- "zod": "^4.0.0"
45
- },
46
- "devDependencies": {
47
- "@atk/eslint-config": "workspace:*",
48
- "@atk/tsconfig": "workspace:*",
49
- "@semantic-release/changelog": "^6.0.3",
50
- "@semantic-release/commit-analyzer": "^13.0.1",
51
- "@semantic-release/git": "^10.0.1",
52
- "@semantic-release/release-notes-generator": "^14.1.0",
53
- "@types/node": "catalog:",
54
- "@types/semver": "catalog:",
55
- "conventional-changelog-conventionalcommits": "^9.1.0",
56
- "eslint": "catalog:",
57
- "prettier": "catalog:",
58
- "semantic-release": "^25.0.3",
59
- "typescript": "catalog:",
60
- "vitest": "catalog:"
61
- }
62
- }
2
+ "name": "@detergent-software/conductor",
3
+ "version": "3.0.0",
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
+ "plugin",
13
+ "!plugin/tests",
14
+ "!plugin/.claude-plugin/types",
15
+ "protocol",
16
+ "CHANGELOG.md"
17
+ ],
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit",
21
+ "directory": "apps/conductor"
22
+ },
23
+ "engines": {
24
+ "node": ">=24.5.0"
25
+ },
26
+ "publishConfig": {
27
+ "registry": "https://registry.npmjs.org",
28
+ "access": "public"
29
+ },
30
+ "dependencies": {
31
+ "jsonc-parser": "^3.3.1",
32
+ "semver": "^7.7.0",
33
+ "zod": "^4.0.0"
34
+ },
35
+ "devDependencies": {
36
+ "@semantic-release/changelog": "^6.0.3",
37
+ "@semantic-release/commit-analyzer": "^13.0.1",
38
+ "@semantic-release/git": "^10.0.1",
39
+ "@semantic-release/release-notes-generator": "^14.1.0",
40
+ "@types/node": "^24.19.0",
41
+ "@types/semver": "^7.8.0",
42
+ "conventional-changelog-conventionalcommits": "^9.1.0",
43
+ "eslint": "^10.11.0",
44
+ "prettier": "^3.9.9",
45
+ "semantic-release": "^25.0.3",
46
+ "typescript": "~6.0.3",
47
+ "vitest": "^5.0.3",
48
+ "@atk/eslint-config": "0.0.0",
49
+ "@atk/tsconfig": "0.0.0"
50
+ },
51
+ "scripts": {
52
+ "build": "tsc",
53
+ "dev": "tsc --watch",
54
+ "format": "prettier --write \"src/**/*.{ts,tsx}\" \"plugin/**/*.{ts,tsx}\" \"scripts/**/*.mjs\"",
55
+ "format:check": "prettier --check \"src/**/*.{ts,tsx}\" \"plugin/**/*.{ts,tsx}\" \"scripts/**/*.mjs\"",
56
+ "lint": "eslint src/ plugin/",
57
+ "lint:fix": "eslint src/ plugin/ --fix --cache",
58
+ "test": "vitest run",
59
+ "test:watch": "vitest",
60
+ "typecheck": "tsc --noEmit && tsc -p tsconfig.mod.json && tsc -p tsconfig.mod-specs.json"
61
+ }
62
+ }
@@ -2,6 +2,6 @@
2
2
  "name": "conductor",
3
3
  "version": "2.0.0",
4
4
  "description": "The conductor's plugin, loaded only into the sessions it starts: the mod (the console's band, pane and commands, and each session's report to the daemon), the console skill, the reference work skill and the verification-skill pair.",
5
- "author": { "name": "Emergent Software" },
5
+ "author": { "name": "Detergent Software" },
6
6
  "types": "./types/index.d.ts"
7
7
  }
@@ -9,7 +9,7 @@ export type ApiAnswer = { body: unknown; status: number };
9
9
 
10
10
  // What a Remote Control push came to: reached the phone (ok); not, as Remote Control is off
11
11
  // (inactive) or pushes are off in Claude Code's config (disabled); not sent to the phone on
12
- // purpose (skipped: Jason is at the terminal, or the answer says nothing about the phone); or the
12
+ // purpose (skipped: the operator is at the terminal, or the answer says nothing about the phone); or the
13
13
  // call failed (failed: it threw, was denied, or answered an error).
14
14
  export type PushOutcome = { detail: string; state: 'disabled' | 'failed' | 'inactive' | 'ok' | 'skipped' };
15
15
 
@@ -211,7 +211,7 @@ export type FleetRow = {
211
211
  };
212
212
 
213
213
  // A wait's condition key (conditions.ts's formatCondition) in words, the telling part first so a
214
- // truncated row keeps it: `PR #557 to merge (agentic-toolkit-registry)`, `npm 1.2.3 on dev (atk)`.
214
+ // truncated row keeps it: `PR #557 to merge (skills-registry)`, `npm 1.2.3 on dev (cli)`.
215
215
  // A kind this doesn't know, or a key it can't read, stays as it is.
216
216
  export function waitLabel(condition: string, now: number): string {
217
217
  const colon = condition.indexOf(':');
@@ -301,10 +301,13 @@ export function findPlan(inbox: readonly ConductorInboxItem[], ref: string): Fou
301
301
  const item = inbox.find((i) => i.id === Number(byId[1]));
302
302
  return item ? { found: item } : { error: `no open inbox item ${ref}` };
303
303
  }
304
- if (/^\d+$/.test(ref.trim()))
305
- return {
306
- error: `"${ref}" is ambiguous: name the item, such as ATK-${ref.trim()}, or the inbox id as #${ref.trim()}`,
307
- };
304
+ if (/^\d+$/.test(ref.trim())) {
305
+ const n = ref.trim();
306
+ // The waiting plans whose key ends in the number, else a placeholder: the project's key isn't known here.
307
+ const keys = inbox.flatMap((i) => (i.kind === 'plan' && i.item?.endsWith(`-${n}`) ? [i.item] : []));
308
+ const item = keys.length > 0 ? keys.join(' or ') : `<KEY>-${n}`;
309
+ return { error: `"${ref}" is ambiguous: name the item, such as ${item}, or the inbox id as #${n}` };
310
+ }
308
311
  const plans = inbox.filter((i) => i.kind === 'plan' && i.item?.toUpperCase() === ref.trim().toUpperCase());
309
312
  if (plans.length === 1 && plans[0]) return { found: plans[0] };
310
313
  if (plans.length === 0) return { error: `no plan of ${ref} waits in the inbox` };
@@ -553,6 +556,14 @@ export function answerText(action: 'approve' | 'done' | 'revise', id: number, an
553
556
  return `${action === 'approve' ? 'approved' : 'asked for a revision of'} ${key}: ${where}`;
554
557
  }
555
558
 
559
+ // The item a /revise names when no plan of it waits in the inbox, which `conduct revise` then revises
560
+ // as an approved plan (ATK-664); null for an inbox id, a bare number, or an item whose plan waits.
561
+ export function approvedPlanItem(inbox: readonly ConductorInboxItem[], ref: string): null | string {
562
+ const key = ref.trim().toUpperCase();
563
+ if (!/^[A-Z]+-\d+$/.test(key)) return null;
564
+ return inbox.some((i) => i.kind === 'plan' && i.item?.toUpperCase() === key) ? null : key;
565
+ }
566
+
556
567
  // The conductor this plugin folder belongs to: the CLI the mod runs, and the daemon's home. The
557
568
  // daemon's copy (<CONDUCTOR_HOME>/plugin) names both in conductor.json, written on each refresh.
558
569
  // The home matters because a `claude --bg` session doesn't see its launcher's environment: a worker
@@ -636,6 +647,35 @@ export function pushOutcome(answer: unknown): PushOutcome {
636
647
  return { detail: detail || 'PushNotification said nothing about the phone', state: 'skipped' };
637
648
  }
638
649
 
650
+ // POST /items/:item/revise's answer as the line to show, as `conduct revise` says it (reviseOutcome
651
+ // in src/cli.ts, which the mod doesn't import). A daemon from before ATK-664 has no such route (404).
652
+ export function reviseText(item: string, answer: ApiAnswer): string {
653
+ if (answer.status === 404)
654
+ return `not revised: no plan of ${item} waits in the inbox, and a conductor started before ATK-664 revises no approved plan: restart it for that`;
655
+ if (answer.status !== 200) {
656
+ const unknown = answer.status === 502 && isRecord(answer.body) && answer.body.posted === 'unknown';
657
+ return `not revised: ${errorOf(answer)}${unknown ? `; ${MAYBE_POSTED}` : ''}`;
658
+ }
659
+ const r = isRecord(answer.body) && isRecord(answer.body.revise) ? answer.body.revise : {};
660
+ const comment = isRecord(r.comment) ? r.comment : {};
661
+ const where =
662
+ typeof comment.url === 'string' ? comment.url : typeof comment.id === 'string' ? comment.id : 'comment posted';
663
+ const none = 'no worker is on it: one launched on it reads the revise in its brief';
664
+ const outcome =
665
+ typeof r.pending === 'string'
666
+ ? `nothing recorded yet (${r.pending}): ${r.worker === true ? 'the revise sweep records it and wakes its worker within 5 minutes' : none}`
667
+ : r.revised !== true
668
+ ? 'a revise of its plan was recorded already: its worker re-plans on the first one'
669
+ : typeof r.woken === 'number' && r.woken > 0
670
+ ? 'woke its worker to re-plan'
671
+ : r.landed === true
672
+ ? 'its PR has merged: its worker learns of it at its next note, for a follow-up PR'
673
+ : r.worker === true
674
+ ? 'its worker is running: its next note is held back, and it re-plans'
675
+ : none;
676
+ return `asked for a revision of ${item}'s approved plan: ${where}; ${outcome}`;
677
+ }
678
+
639
679
  // A `conduct` run (attach, approve, revise) as the line to show: what it printed when it succeeded
640
680
  // (`woke …`, `approved …`), else `failed`, then its error and details without the `conduct: `
641
681
  // prefix, and without anything node wrote before it (a warning).
@@ -8,6 +8,7 @@ import {
8
8
  age,
9
9
  answerText,
10
10
  type ApiAnswer,
11
+ approvedPlanItem,
11
12
  bandEntries,
12
13
  clearedText,
13
14
  CONSOLE_SKILL,
@@ -39,6 +40,7 @@ import {
39
40
  pushWarning,
40
41
  reaction,
41
42
  reportedState,
43
+ reviseText,
42
44
  runText,
43
45
  snapshotOf,
44
46
  spendToday,
@@ -65,6 +67,9 @@ const ATTACH_RUN_MS = 10 * 60_000;
65
67
  // An approve or a revise asks Linear twice, and `conduct approve|revise` allows that 60 s (ATK-508);
66
68
  // this adds node's start.
67
69
  const ANSWER_RUN_MS = 2 * 60_000;
70
+ // A revise of an approved plan reads the brief up to three times after it posts, and
71
+ // `conduct revise` allows that 3 min (ATK-664).
72
+ const REVISE_RUN_MS = 4 * 60_000;
68
73
  const NOT_RUNNING = 'the conductor is not running (conduct serve)';
69
74
 
70
75
  const snapshot = atom({ key: 'snapshot', plugin: 'conductor' } as const, null);
@@ -98,7 +103,7 @@ let isWindows = false;
98
103
 
99
104
  type Endpoint = { port: number; token: string };
100
105
 
101
- // Jason's answer to an inbox item, as `conduct approve|revise|done` posts it; the line to show.
106
+ // The operator's answer to an inbox item, as `conduct approve|revise|done` posts it; the line to show.
102
107
  // Approve and revise run `conduct` (ANSWER_RUN_MS), by inbox id. Without the CLI, the API, which
103
108
  // $.http.fetch cuts off after 30 s, possibly after the comment was posted. Done doesn't ask Linear.
104
109
  async function answer(
@@ -549,6 +554,38 @@ async function reportPlugin($: EngineInterface): Promise<void> {
549
554
  }
550
555
  }
551
556
 
557
+ // /revise of an item with no plan in the inbox: `conduct revise <item>` revises its approved plan
558
+ // (ATK-664), as `answer` runs it, or POST /items/:item/revise without the CLI.
559
+ async function reviseApproved($: EngineInterface, item: string, text: string): Promise<string> {
560
+ try {
561
+ const cli = await cliPath($);
562
+ if (await $.fs.exists(cli)) {
563
+ let run;
564
+ try {
565
+ run = await $.process.run(['node', cli, 'revise', item, text], {
566
+ ...(await cliInit($)),
567
+ timeoutMs: REVISE_RUN_MS,
568
+ });
569
+ } catch (error) {
570
+ return `not revised: ${error instanceof Error ? error.message : String(error)}`;
571
+ }
572
+ refreshSoon($);
573
+ return runText(run, { failed: 'not revised', ok: `asked for a revision of ${item}'s approved plan` });
574
+ }
575
+ const at = await endpoint($);
576
+ let result: ApiAnswer;
577
+ try {
578
+ result = await callApi($, 'POST', `/items/${encodeURIComponent(item)}/revise`, { text }, at);
579
+ } catch (error) {
580
+ return `not revised: ${error instanceof Error ? error.message : String(error)}; ${MAYBE_POSTED}`;
581
+ }
582
+ refreshSoon($);
583
+ return reviseText(item, result);
584
+ } catch (error) {
585
+ return error instanceof Error ? error.message : String(error);
586
+ }
587
+ }
588
+
552
589
  // `/notify <profile> [--until <when>]` and the pane's picker: switch the notification profile.
553
590
  async function switchProfile($: EngineInterface, name: string, until: null | string = null): Promise<string> {
554
591
  try {
@@ -671,7 +708,9 @@ export const register: Register = (on) => {
671
708
  const snap = await refresh($);
672
709
  if (snap.error !== null) return { text: snap.error };
673
710
  const plan = findPlan(snap.inbox, ref);
674
- return { text: plan.found ? await answer($, plan.found.id, { action: 'revise', text }) : plan.error };
711
+ if (plan.found) return { text: await answer($, plan.found.id, { action: 'revise', text }) };
712
+ const approved = approvedPlanItem(snap.inbox, ref);
713
+ return { text: approved === null ? plan.error : await reviseApproved($, approved, text) };
675
714
  });
676
715
 
677
716
  on('command.run', { command: 'attach' }, async ($, e) => {