@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.
- package/CHANGELOG.md +482 -0
- package/README.md +275 -125
- package/build/brief-cli.js +5 -12
- package/build/brief-cli.js.map +1 -1
- package/build/brief.js +4 -3
- package/build/brief.js.map +1 -1
- package/build/broker-cli.js +42 -15
- package/build/broker-cli.js.map +1 -1
- package/build/broker.js +1 -1
- package/build/broker.js.map +1 -1
- package/build/cli.js +221 -63
- package/build/cli.js.map +1 -1
- package/build/clones.js +92 -0
- package/build/clones.js.map +1 -0
- package/build/code-host-cli.js +172 -40
- package/build/code-host-cli.js.map +1 -1
- package/build/code-host-service.js +35 -2
- package/build/code-host-service.js.map +1 -1
- package/build/code-host.js +138 -16
- package/build/code-host.js.map +1 -1
- package/build/conditions.js +33 -16
- package/build/conditions.js.map +1 -1
- package/build/config.js +58 -28
- package/build/config.js.map +1 -1
- package/build/console.js +17 -27
- package/build/console.js.map +1 -1
- package/build/credentials.js +86 -54
- package/build/credentials.js.map +1 -1
- package/build/daemon.js +54 -65
- package/build/daemon.js.map +1 -1
- package/build/file-lock.js +155 -40
- package/build/file-lock.js.map +1 -1
- package/build/follow-ups.js +2 -2
- package/build/follow-ups.js.map +1 -1
- package/build/help.js +241 -83
- package/build/help.js.map +1 -1
- package/build/history.js +10 -4
- package/build/history.js.map +1 -1
- package/build/host/credential-manager.js +109 -0
- package/build/host/credential-manager.js.map +1 -0
- package/build/host/keychain.js +44 -0
- package/build/host/keychain.js.map +1 -0
- package/build/host/launchd.js +118 -0
- package/build/host/launchd.js.map +1 -0
- package/build/host/libsecret.js +40 -0
- package/build/host/libsecret.js.map +1 -0
- package/build/host/macos-terminal.js +63 -0
- package/build/host/macos-terminal.js.map +1 -0
- package/build/host/platform.js +4 -0
- package/build/host/platform.js.map +1 -0
- package/build/host/secrets.js +46 -0
- package/build/host/secrets.js.map +1 -0
- package/build/host/shell.js +26 -0
- package/build/host/shell.js.map +1 -0
- package/build/host/startup.js +26 -0
- package/build/host/startup.js.map +1 -0
- package/build/host/systemd.js +91 -0
- package/build/host/systemd.js.map +1 -0
- package/build/host/task-scheduler.js +78 -0
- package/build/host/task-scheduler.js.map +1 -0
- package/build/host/terminal.js +46 -0
- package/build/host/terminal.js.map +1 -0
- package/build/host/tmux.js +39 -0
- package/build/host/tmux.js.map +1 -0
- package/build/host/windows-terminal.js +46 -0
- package/build/host/windows-terminal.js.map +1 -0
- package/build/in-process.js +6 -5
- package/build/in-process.js.map +1 -1
- package/build/inbox.js +57 -39
- package/build/inbox.js.map +1 -1
- package/build/init.js +509 -0
- package/build/init.js.map +1 -0
- package/build/landing.js +107 -10
- package/build/landing.js.map +1 -1
- package/build/lib/providers/ado/code-host.js +5 -1
- package/build/lib/providers/ado/code-host.js.map +1 -1
- package/build/lib/providers/ado/pipelines.js +138 -26
- package/build/lib/providers/ado/pipelines.js.map +1 -1
- package/build/lib/providers/ado/trigger.js +5 -0
- package/build/lib/providers/ado/trigger.js.map +1 -1
- package/build/lib/providers/ado/writes.js +17 -2
- package/build/lib/providers/ado/writes.js.map +1 -1
- package/build/lib/providers/github/actions.js +90 -3
- package/build/lib/providers/github/actions.js.map +1 -1
- package/build/lib/providers/github/code-host.js +2 -0
- package/build/lib/providers/github/code-host.js.map +1 -1
- package/build/lib/providers/github/writes.js +25 -2
- package/build/lib/providers/github/writes.js.map +1 -1
- package/build/lib/providers/index.js +3 -2
- package/build/lib/providers/index.js.map +1 -1
- package/build/lib/providers/npm/stage.js +14 -1
- package/build/lib/providers/npm/stage.js.map +1 -1
- package/build/lib/providers/timing.js +10 -0
- package/build/lib/providers/timing.js.map +1 -0
- package/build/lib/providers/verdicts/pr.js +47 -6
- package/build/lib/providers/verdicts/pr.js.map +1 -1
- package/build/lib/providers/verdicts/runs.js +12 -2
- package/build/lib/providers/verdicts/runs.js.map +1 -1
- package/build/logins.js +13 -6
- package/build/logins.js.map +1 -1
- package/build/manager.js +121 -55
- package/build/manager.js.map +1 -1
- package/build/note.js +5 -15
- package/build/note.js.map +1 -1
- package/build/notes.js +130 -23
- package/build/notes.js.map +1 -1
- package/build/notify.js +104 -42
- package/build/notify.js.map +1 -1
- package/build/npm-reads.js +151 -22
- package/build/npm-reads.js.map +1 -1
- package/build/ownership.js +2 -2
- package/build/paths.js +44 -1
- package/build/paths.js.map +1 -1
- package/build/plugin.js +4 -2
- package/build/plugin.js.map +1 -1
- package/build/profile-fields.js +153 -0
- package/build/profile-fields.js.map +1 -0
- package/build/profile-layers.js +264 -0
- package/build/profile-layers.js.map +1 -0
- package/build/profile.js +107 -51
- package/build/profile.js.map +1 -1
- package/build/project-check-cli.js +17 -19
- package/build/project-check-cli.js.map +1 -1
- package/build/project-check.js +166 -104
- package/build/project-check.js.map +1 -1
- package/build/protocol.js +5 -21
- package/build/protocol.js.map +1 -1
- package/build/pushover.js +5 -5
- package/build/pushover.js.map +1 -1
- package/build/queue.js +4 -4
- package/build/queue.js.map +1 -1
- package/build/registry.js +195 -36
- package/build/registry.js.map +1 -1
- package/build/release-kinds.js +34 -0
- package/build/release-kinds.js.map +1 -0
- package/build/rule-actions.js +8 -6
- package/build/rule-actions.js.map +1 -1
- package/build/rules-service.js +104 -47
- package/build/rules-service.js.map +1 -1
- package/build/rules.js +23 -23
- package/build/rules.js.map +1 -1
- package/build/run.js +20 -7
- package/build/run.js.map +1 -1
- package/build/runs.js +218 -68
- package/build/runs.js.map +1 -1
- package/build/scheduler.js +89 -13
- package/build/scheduler.js.map +1 -1
- package/build/search.js +2 -1
- package/build/search.js.map +1 -1
- package/build/server.js +51 -14
- package/build/server.js.map +1 -1
- package/build/spend.js +1 -1
- package/build/spend.js.map +1 -1
- package/build/store.js +79 -20
- package/build/store.js.map +1 -1
- package/build/supervise.js +1 -1
- package/build/supervise.js.map +1 -1
- package/build/timeline.js +104 -0
- package/build/timeline.js.map +1 -0
- package/build/tracker-reads-cli.js +4 -5
- package/build/tracker-reads-cli.js.map +1 -1
- package/build/trackers.js +56 -10
- package/build/trackers.js.map +1 -1
- package/build/train-cli.js +6 -5
- package/build/train-cli.js.map +1 -1
- package/build/train.js +2 -2
- package/build/train.js.map +1 -1
- package/build/upgrade.js +8 -9
- package/build/upgrade.js.map +1 -1
- package/build/wait.js +10 -10
- package/build/wait.js.map +1 -1
- package/build/watchers/ado.js +42 -19
- package/build/watchers/ado.js.map +1 -1
- package/build/watchers/github.js +18 -4
- package/build/watchers/github.js.map +1 -1
- package/build/watchers/index.js +2 -2
- package/build/watchers/index.js.map +1 -1
- package/build/watchers/linear-queue.js +47 -14
- package/build/watchers/linear-queue.js.map +1 -1
- package/build/watchers/linear-writes.js +26 -12
- package/build/watchers/linear-writes.js.map +1 -1
- package/build/watchers/linear.js +2 -2
- package/build/watchers/linear.js.map +1 -1
- package/build/watchers/source.js +5 -1
- package/build/watchers/source.js.map +1 -1
- package/build/webhook.js +80 -0
- package/build/webhook.js.map +1 -0
- package/build/why.js +1 -1
- package/build/why.js.map +1 -1
- package/build/worktrees.js +56 -93
- package/build/worktrees.js.map +1 -1
- package/package.json +61 -61
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/hooks/model.ts +46 -6
- package/plugin/hooks/register.tsx +41 -2
- package/plugin/skills/conductor-console/SKILL.md +26 -27
- package/plugin/skills/work-item/SKILL.md +58 -54
- package/plugin/skills/work-item/trackers/ado-boards.md +2 -2
- package/plugin/skills/work-item/trackers/github-issues.md +1 -1
- package/plugin/skills/work-item/trackers/linear.md +2 -2
- package/plugin/types/index.d.ts +1 -1
- package/protocol/PROTOCOL.md +3 -9
- package/build/checkout-sync.js +0 -249
- package/build/checkout-sync.js.map +0 -1
- package/build/credential.js +0 -66
- package/build/credential.js.map +0 -1
- package/build/startup.js +0 -92
- package/build/startup.js.map +0 -1
- package/build/tab.js +0 -32
- package/build/tab.js.map +0 -1
package/build/worktrees.js
CHANGED
|
@@ -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,
|
|
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:
|
|
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,
|
|
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
|
-
|
|
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'],
|
|
82
|
-
// Deep node_modules paths
|
|
83
|
-
//
|
|
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'],
|
|
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],
|
|
57
|
+
await git(['fetch', '--quiet', 'origin', base], clone);
|
|
88
58
|
const branch = `${BRANCH_PREFIX}${name}`;
|
|
89
|
-
const known = await hasBranch(
|
|
90
|
-
|
|
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. (
|
|
109
|
-
//
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
//
|
|
128
|
-
//
|
|
129
|
-
|
|
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(
|
|
133
|
-
? await git(['rev-list', '--count', made, '--not', '--remotes'],
|
|
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'],
|
|
147
|
+
await must(['worktree', 'prune'], repo, 'git worktree prune failed');
|
|
150
148
|
if (deleteBranch && branch)
|
|
151
|
-
await must(['branch', '-D', 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()}`);
|
package/build/worktrees.js.map
CHANGED
|
@@ -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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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": "
|
|
5
|
+
"author": { "name": "Detergent Software" },
|
|
6
6
|
"types": "./types/index.d.ts"
|
|
7
7
|
}
|
package/plugin/hooks/model.ts
CHANGED
|
@@ -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:
|
|
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 (
|
|
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
|
-
|
|
306
|
-
|
|
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
|
-
//
|
|
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:
|
|
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) => {
|