@detergent-software/conductor 3.0.0-dev.4 → 3.0.0-dev.40

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 (212) hide show
  1. package/CHANGELOG.md +339 -0
  2. package/README.md +270 -123
  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 +15 -10
  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/claude.js +48 -2
  12. package/build/claude.js.map +1 -1
  13. package/build/cli.js +221 -71
  14. package/build/cli.js.map +1 -1
  15. package/build/clones.js +92 -0
  16. package/build/clones.js.map +1 -0
  17. package/build/code-host-cli.js +158 -39
  18. package/build/code-host-cli.js.map +1 -1
  19. package/build/code-host-service.js +35 -2
  20. package/build/code-host-service.js.map +1 -1
  21. package/build/code-host.js +140 -16
  22. package/build/code-host.js.map +1 -1
  23. package/build/conditions.js +33 -16
  24. package/build/conditions.js.map +1 -1
  25. package/build/config.js +58 -28
  26. package/build/config.js.map +1 -1
  27. package/build/console.js +43 -27
  28. package/build/console.js.map +1 -1
  29. package/build/credentials.js +49 -36
  30. package/build/credentials.js.map +1 -1
  31. package/build/daemon.js +57 -66
  32. package/build/daemon.js.map +1 -1
  33. package/build/file-lock.js +35 -3
  34. package/build/file-lock.js.map +1 -1
  35. package/build/follow-ups.js +2 -2
  36. package/build/follow-ups.js.map +1 -1
  37. package/build/help.js +228 -82
  38. package/build/help.js.map +1 -1
  39. package/build/history.js +10 -4
  40. package/build/history.js.map +1 -1
  41. package/build/host/credential-manager.js +109 -0
  42. package/build/host/credential-manager.js.map +1 -0
  43. package/build/host/keychain.js +44 -0
  44. package/build/host/keychain.js.map +1 -0
  45. package/build/host/launchd.js +118 -0
  46. package/build/host/launchd.js.map +1 -0
  47. package/build/host/libsecret.js +40 -0
  48. package/build/host/libsecret.js.map +1 -0
  49. package/build/host/macos-terminal.js +63 -0
  50. package/build/host/macos-terminal.js.map +1 -0
  51. package/build/host/platform.js +4 -0
  52. package/build/host/platform.js.map +1 -0
  53. package/build/host/secrets.js +46 -0
  54. package/build/host/secrets.js.map +1 -0
  55. package/build/host/shell.js +26 -0
  56. package/build/host/shell.js.map +1 -0
  57. package/build/host/startup.js +26 -0
  58. package/build/host/startup.js.map +1 -0
  59. package/build/host/systemd.js +91 -0
  60. package/build/host/systemd.js.map +1 -0
  61. package/build/host/task-scheduler.js +78 -0
  62. package/build/host/task-scheduler.js.map +1 -0
  63. package/build/host/terminal.js +46 -0
  64. package/build/host/terminal.js.map +1 -0
  65. package/build/host/tmux.js +39 -0
  66. package/build/host/tmux.js.map +1 -0
  67. package/build/host/windows-terminal.js +46 -0
  68. package/build/host/windows-terminal.js.map +1 -0
  69. package/build/in-process.js +6 -5
  70. package/build/in-process.js.map +1 -1
  71. package/build/inbox.js +50 -34
  72. package/build/inbox.js.map +1 -1
  73. package/build/init.js +509 -0
  74. package/build/init.js.map +1 -0
  75. package/build/landing.js +86 -7
  76. package/build/landing.js.map +1 -1
  77. package/build/lib/providers/ado/code-host.js +5 -1
  78. package/build/lib/providers/ado/code-host.js.map +1 -1
  79. package/build/lib/providers/ado/pipelines.js +138 -26
  80. package/build/lib/providers/ado/pipelines.js.map +1 -1
  81. package/build/lib/providers/ado/trigger.js +5 -0
  82. package/build/lib/providers/ado/trigger.js.map +1 -1
  83. package/build/lib/providers/ado/writes.js +17 -2
  84. package/build/lib/providers/ado/writes.js.map +1 -1
  85. package/build/lib/providers/github/actions.js +90 -3
  86. package/build/lib/providers/github/actions.js.map +1 -1
  87. package/build/lib/providers/github/code-host.js +2 -0
  88. package/build/lib/providers/github/code-host.js.map +1 -1
  89. package/build/lib/providers/github/writes.js +25 -2
  90. package/build/lib/providers/github/writes.js.map +1 -1
  91. package/build/lib/providers/index.js +4 -3
  92. package/build/lib/providers/index.js.map +1 -1
  93. package/build/lib/providers/npm/stage.js +28 -5
  94. package/build/lib/providers/npm/stage.js.map +1 -1
  95. package/build/lib/providers/timing.js +10 -0
  96. package/build/lib/providers/timing.js.map +1 -0
  97. package/build/lib/providers/verdicts/pr.js +47 -6
  98. package/build/lib/providers/verdicts/pr.js.map +1 -1
  99. package/build/lib/providers/verdicts/runs.js +12 -2
  100. package/build/lib/providers/verdicts/runs.js.map +1 -1
  101. package/build/logins.js +1 -1
  102. package/build/logins.js.map +1 -1
  103. package/build/manager.js +131 -55
  104. package/build/manager.js.map +1 -1
  105. package/build/note.js +5 -15
  106. package/build/note.js.map +1 -1
  107. package/build/notes.js +130 -23
  108. package/build/notes.js.map +1 -1
  109. package/build/notify.js +104 -42
  110. package/build/notify.js.map +1 -1
  111. package/build/npm-reads.js +323 -0
  112. package/build/npm-reads.js.map +1 -0
  113. package/build/ownership.js +2 -2
  114. package/build/paths.js +44 -1
  115. package/build/paths.js.map +1 -1
  116. package/build/plugin.js +4 -2
  117. package/build/plugin.js.map +1 -1
  118. package/build/profile-fields.js +153 -0
  119. package/build/profile-fields.js.map +1 -0
  120. package/build/profile-layers.js +264 -0
  121. package/build/profile-layers.js.map +1 -0
  122. package/build/profile.js +107 -51
  123. package/build/profile.js.map +1 -1
  124. package/build/project-check-cli.js +19 -19
  125. package/build/project-check-cli.js.map +1 -1
  126. package/build/project-check.js +194 -108
  127. package/build/project-check.js.map +1 -1
  128. package/build/protocol.js +5 -21
  129. package/build/protocol.js.map +1 -1
  130. package/build/pushover.js +5 -5
  131. package/build/pushover.js.map +1 -1
  132. package/build/queue.js +4 -4
  133. package/build/queue.js.map +1 -1
  134. package/build/registry.js +195 -36
  135. package/build/registry.js.map +1 -1
  136. package/build/release-kinds.js +34 -0
  137. package/build/release-kinds.js.map +1 -0
  138. package/build/rule-actions.js +8 -6
  139. package/build/rule-actions.js.map +1 -1
  140. package/build/rules-service.js +104 -47
  141. package/build/rules-service.js.map +1 -1
  142. package/build/rules.js +23 -23
  143. package/build/rules.js.map +1 -1
  144. package/build/run.js +20 -7
  145. package/build/run.js.map +1 -1
  146. package/build/runs.js +218 -68
  147. package/build/runs.js.map +1 -1
  148. package/build/scheduler.js +89 -13
  149. package/build/scheduler.js.map +1 -1
  150. package/build/search.js +2 -1
  151. package/build/search.js.map +1 -1
  152. package/build/server.js +51 -14
  153. package/build/server.js.map +1 -1
  154. package/build/spend.js +1 -1
  155. package/build/spend.js.map +1 -1
  156. package/build/store.js +79 -20
  157. package/build/store.js.map +1 -1
  158. package/build/supervise.js +1 -1
  159. package/build/supervise.js.map +1 -1
  160. package/build/timeline.js +104 -0
  161. package/build/timeline.js.map +1 -0
  162. package/build/tracker-reads-cli.js +4 -5
  163. package/build/tracker-reads-cli.js.map +1 -1
  164. package/build/trackers.js +56 -10
  165. package/build/trackers.js.map +1 -1
  166. package/build/train-cli.js +6 -5
  167. package/build/train-cli.js.map +1 -1
  168. package/build/train.js +2 -2
  169. package/build/train.js.map +1 -1
  170. package/build/upgrade.js +8 -9
  171. package/build/upgrade.js.map +1 -1
  172. package/build/wait.js +10 -10
  173. package/build/wait.js.map +1 -1
  174. package/build/watchers/ado.js +42 -18
  175. package/build/watchers/ado.js.map +1 -1
  176. package/build/watchers/github.js +19 -4
  177. package/build/watchers/github.js.map +1 -1
  178. package/build/watchers/index.js +2 -2
  179. package/build/watchers/index.js.map +1 -1
  180. package/build/watchers/linear-queue.js +47 -14
  181. package/build/watchers/linear-queue.js.map +1 -1
  182. package/build/watchers/linear-writes.js +26 -12
  183. package/build/watchers/linear-writes.js.map +1 -1
  184. package/build/watchers/linear.js +2 -2
  185. package/build/watchers/linear.js.map +1 -1
  186. package/build/watchers/npm.js +6 -4
  187. package/build/watchers/npm.js.map +1 -1
  188. package/build/webhook.js +80 -0
  189. package/build/webhook.js.map +1 -0
  190. package/build/why.js +1 -1
  191. package/build/why.js.map +1 -1
  192. package/build/worktrees.js +56 -93
  193. package/build/worktrees.js.map +1 -1
  194. package/package.json +61 -61
  195. package/plugin/.claude-plugin/plugin.json +1 -1
  196. package/plugin/hooks/model.ts +46 -6
  197. package/plugin/hooks/register.tsx +41 -2
  198. package/plugin/skills/conductor-console/SKILL.md +26 -27
  199. package/plugin/skills/work-item/SKILL.md +57 -53
  200. package/plugin/skills/work-item/trackers/ado-boards.md +2 -2
  201. package/plugin/skills/work-item/trackers/github-issues.md +1 -1
  202. package/plugin/skills/work-item/trackers/linear.md +2 -2
  203. package/plugin/types/index.d.ts +1 -1
  204. package/protocol/PROTOCOL.md +3 -9
  205. package/build/checkout-sync.js +0 -249
  206. package/build/checkout-sync.js.map +0 -1
  207. package/build/credential.js +0 -66
  208. package/build/credential.js.map +0 -1
  209. package/build/startup.js +0 -92
  210. package/build/startup.js.map +0 -1
  211. package/build/tab.js +0 -32
  212. package/build/tab.js.map +0 -1
@@ -1,249 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { z } from 'zod';
4
- import { link } from "./links.js";
5
- import { outputOf, run } from "./run.js";
6
- import {} from "./store.js";
7
- const LOCKFILE = '.atk-lock.json';
8
- const FETCH_MS = 60_000;
9
- // How often the timer looks for a due project; a check put off by a launch runs on the next look.
10
- const POLL_MS = 60_000;
11
- const pinChangeSchema = z.object({
12
- // Null: the asset is new on origin (from) or gone from it (to).
13
- from: z.string().nullable(),
14
- name: z.string(),
15
- to: z.string().nullable(),
16
- type: z.string().nullable(),
17
- });
18
- const lockSchema = z.looseObject({
19
- assets: z.array(z.looseObject({ name: z.string(), type: z.string().nullish(), version: z.string().nullish() })),
20
- });
21
- export function checkoutSync(deps) {
22
- const { config, inbox, log, ports, store } = deps;
23
- const now = deps.now ?? (() => new Date());
24
- const { intervalMinutes, mode } = config.checkout;
25
- // When each project was last checked (ms), and its last check failure, logged once.
26
- const checkedAt = new Map();
27
- const failing = new Map();
28
- // By project. A pull's install that failed or never ran stays here and is tried again on every
29
- // check; the `checkout.pending` event keeps it across a restart.
30
- const pending = new Map();
31
- const restored = new Set();
32
- let running = null;
33
- let timer;
34
- // A read the check needs (a fetch offline, a lockfile that doesn't parse) throws: logged, and
35
- // tried again on the next check, never an inbox item.
36
- const git = async (root, args) => {
37
- const result = await ports.git(args, root);
38
- if (!result.ok)
39
- throw new Error(`git ${args.join(' ')}: ${result.output}`);
40
- return result.stdout;
41
- };
42
- // The items this raises for a main checkout carry its path as their link, and an ask to bring it
43
- // up to date starts its commands with the pull.
44
- const pull = (root) => `git -C "${root}" pull --ff-only`;
45
- const ours = (project) => inbox
46
- .open()
47
- .filter((i) => i.kind === 'operator' && i.item === null && i.project === project.name && i.links[0]?.href === project.root);
48
- const stale = (project) => ours(project).filter((i) => i.commands[0] === pull(project.root));
49
- // One open item per kind of ask: the same text stays, a different one replaces it.
50
- const raise = (project, open, text, commands) => {
51
- if (open.some((i) => i.text === text))
52
- return;
53
- for (const item of open)
54
- inbox.resolve(item, 'replaced by a newer check');
55
- inbox.raise({
56
- commands,
57
- condition: null,
58
- item: null,
59
- kind: 'operator',
60
- links: [link(project.root, 'checkout')],
61
- project: project.name,
62
- text,
63
- worker: null,
64
- });
65
- };
66
- const askToUpdate = (project, why) => raise(project, stale(project), why, [pull(project.root), `atk install -P "${project.root}"`]);
67
- const resolveAsks = (project, by) => {
68
- for (const item of stale(project))
69
- inbox.resolve(item, by);
70
- };
71
- const remember = (project, base, next) => {
72
- const before = pending.get(project.name);
73
- if (next === null)
74
- pending.delete(project.name);
75
- else
76
- pending.set(project.name, next);
77
- if (next !== null && JSON.stringify(before?.changes) !== JSON.stringify(next.changes)) {
78
- store.appendEvent({
79
- data: { base, changes: next.changes, root: project.root },
80
- kind: 'checkout.pending',
81
- project: project.name,
82
- });
83
- }
84
- };
85
- // What an earlier daemon left to install: a `checkout.pending` with no `checkout.updated` after it.
86
- const restore = (project) => {
87
- if (restored.has(project.name))
88
- return;
89
- restored.add(project.name);
90
- const last = store.latestEvent(['checkout.pending', 'checkout.updated'], project.name);
91
- if (last?.kind !== 'checkout.pending')
92
- return;
93
- const changes = z.array(pinChangeSchema).safeParse(last.data.changes);
94
- if (changes.success && changes.data.length > 0)
95
- pending.set(project.name, { changes: changes.data });
96
- };
97
- const sync = async (project, base) => {
98
- const root = project.root;
99
- restore(project);
100
- await git(root, ['fetch', '--quiet', 'origin', base]);
101
- const changes = pinChanges(await git(root, ['show', `HEAD:${LOCKFILE}`]), await git(root, ['show', `origin/${base}:${LOCKFILE}`]));
102
- if (changes.length > 0) {
103
- remember(project, base, { changes: mergeChanges(pending.get(project.name)?.changes ?? [], changes) });
104
- const behind = `origin/${base} pins ${changes.map(describeChange).join(', ')}, and the main checkout doesn't have them yet`;
105
- if (mode === 'notify')
106
- return askToUpdate(project, behind);
107
- const branch = await ports.git(['symbolic-ref', '--quiet', '--short', 'HEAD'], root);
108
- const on = branch.ok ? branch.stdout.trim() : '(detached)';
109
- if (on !== base)
110
- return askToUpdate(project, `${behind}: it is on ${on}, not ${base}, so the conductor left it`);
111
- // Exit 1 is a change; an error proves nothing is changed either.
112
- if (!(await ports.git(['diff', '--quiet', '--ignore-cr-at-eol', 'HEAD', '--', LOCKFILE], root)).ok)
113
- return askToUpdate(project, `${behind}: its ${LOCKFILE} has local changes, so the conductor left it`);
114
- const merged = await ports.git(['merge', '--ff-only', '--quiet', `origin/${base}`], root);
115
- if (!merged.ok) {
116
- // git's last line is its reason; the hints above it say what to type.
117
- const reason = merged.output.trim().split('\n').at(-1);
118
- return askToUpdate(project, `${behind}: git refused the fast-forward (${reason})`);
119
- }
120
- }
121
- // HEAD has origin's pins now: by this pull, by Jason's, or by an earlier check whose install
122
- // didn't finish.
123
- const todo = pending.get(project.name);
124
- if (!todo)
125
- return;
126
- const pins = todo.changes.map(describeChange).join(', ');
127
- if (mode === 'notify') {
128
- remember(project, base, null);
129
- return resolveAsks(project, `the main checkout has the pins of origin/${base}`);
130
- }
131
- const head = (await git(root, ['rev-parse', '--short', 'HEAD'])).trim();
132
- const names = [...new Set(todo.changes.flatMap((c) => (c.to === null ? [] : [c.name])))];
133
- const problem = names.length === 0 ? null : await ports.checkSkills(root, names);
134
- if (problem !== null)
135
- return askToUpdate(project, `pulled to ${head} for ${pins}, but the install didn't take: ${problem}`);
136
- store.appendEvent({
137
- data: { base, changes: todo.changes.map(describeChange), head, root },
138
- kind: 'checkout.updated',
139
- project: project.name,
140
- });
141
- log.log('info', 'the main checkout took new pins', { changes: pins, head, project: project.name });
142
- remember(project, base, null);
143
- resolveAsks(project, `the conductor installed ${pins} at ${head}`);
144
- };
145
- const checkAll = async () => {
146
- const at = now().getTime();
147
- for (const project of store.listProjects()) {
148
- if (!project.enabled || !project.profile || !existsSync(join(project.root, LOCKFILE)))
149
- continue;
150
- if (at - (checkedAt.get(project.name) ?? -Infinity) < intervalMinutes * 60_000)
151
- continue;
152
- // A worktree being created copies the main checkout's skills: check on a later look.
153
- if (store.listWorkers(['launching']).some((w) => w.project === project.name))
154
- continue;
155
- checkedAt.set(project.name, at);
156
- try {
157
- await sync(project, project.profile.baseBranch);
158
- failing.delete(project.name);
159
- }
160
- catch (error) {
161
- const message = error instanceof Error ? error.message : String(error);
162
- if (failing.get(project.name) === message)
163
- continue;
164
- failing.set(project.name, message);
165
- log.log('warn', 'the main checkout check failed', { error: message, project: project.name });
166
- }
167
- }
168
- };
169
- const check = () => {
170
- if (mode === 'off')
171
- return Promise.resolve();
172
- running ??= checkAll().finally(() => (running = null));
173
- return running;
174
- };
175
- return {
176
- check,
177
- settled: async () => {
178
- await running;
179
- },
180
- start: () => {
181
- if (mode === 'off')
182
- return;
183
- const safeCheck = () => {
184
- check().catch((error) => log.log('error', 'the main checkout check failed', { error: String(error) }));
185
- };
186
- safeCheck();
187
- timer = setInterval(safeCheck, POLL_MS);
188
- timer.unref();
189
- },
190
- stop: async () => {
191
- clearInterval(timer);
192
- timer = undefined;
193
- await running;
194
- },
195
- };
196
- }
197
- export function describeChange({ from, name, to }) {
198
- if (from === null)
199
- return `${name} ${to ?? '?'} (new)`;
200
- if (to === null)
201
- return `${name} ${from} (removed)`;
202
- return `${name} ${from} → ${to}`;
203
- }
204
- export function gitPort() {
205
- return async (args, cwd) => {
206
- const result = await run('git', args, { cwd, timeoutMs: FETCH_MS });
207
- return result.code === 0 ? { ok: true, stdout: result.stdout } : { ok: false, output: outputOf(result, 500) };
208
- };
209
- }
210
- // Pins still to install after a further change on origin: each asset keeps the version it had
211
- // before the first change and takes the newest one; an asset back where it started drops out.
212
- export function mergeChanges(earlier, later) {
213
- const byKey = new Map(earlier.map((c) => [keyOf(c), c]));
214
- for (const c of later) {
215
- const first = byKey.get(keyOf(c));
216
- byKey.set(keyOf(c), first ? { ...c, from: first.from } : c);
217
- }
218
- return [...byKey.values()].filter((c) => c.from !== c.to).sort(byName);
219
- }
220
- // The pins that differ between two .atk-lock.json texts, by asset type and name.
221
- export function pinChanges(before, after) {
222
- const pins = (text) => new Map(lockSchema
223
- .parse(JSON.parse(text))
224
- .assets.map((a) => [
225
- keyOf({ name: a.name, type: a.type ?? null }),
226
- { name: a.name, type: a.type ?? null, version: a.version ?? null },
227
- ]));
228
- const was = pins(before);
229
- const now = pins(after);
230
- const changes = [];
231
- for (const [key, { name, type, version }] of now) {
232
- const old = was.get(key);
233
- if (!old)
234
- changes.push({ from: null, name, to: version, type });
235
- else if (old.version !== version)
236
- changes.push({ from: old.version, name, to: version, type });
237
- }
238
- for (const [key, { name, type, version }] of was)
239
- if (!now.has(key))
240
- changes.push({ from: version, name, to: null, type });
241
- return changes.sort(byName);
242
- }
243
- function byName(a, b) {
244
- return a.name.localeCompare(b.name) || (a.type ?? '').localeCompare(b.type ?? '');
245
- }
246
- function keyOf({ name, type }) {
247
- return `${type ?? ''}:${name}`;
248
- }
249
- //# sourceMappingURL=checkout-sync.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"checkout-sync.js","sourceRoot":"","sources":["../src/checkout-sync.ts"],"names":[],"mappings":"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"}
@@ -1,66 +0,0 @@
1
- import { run } from "./run.js";
2
- const NOT_FOUND = 3;
3
- // Win32 ERROR_NOT_FOUND: CredRead's "no such credential". Any other failure is a broken read.
4
- const ERROR_NOT_FOUND = 1168;
5
- // Writes the user name, a newline, then the password.
6
- const CRED_READ = `
7
- $ErrorActionPreference = 'Stop'
8
- try {
9
- Add-Type -Namespace AtkConduct -Name Cred -MemberDefinition @'
10
- [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
11
- public static extern bool CredRead(string target, int type, int flags, out System.IntPtr cred);
12
- [DllImport("advapi32.dll")]
13
- public static extern void CredFree(System.IntPtr cred);
14
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
15
- public struct CREDENTIAL { public int Flags; public int Type; public string TargetName; public string Comment;
16
- public long LastWritten; public int CredentialBlobSize; public System.IntPtr CredentialBlob; public int Persist;
17
- public int AttributeCount; public System.IntPtr Attributes; public string TargetAlias; public string UserName; }
18
- '@
19
- $p = [IntPtr]::Zero
20
- if (-not [AtkConduct.Cred]::CredRead($env:ATK_CONDUCT_CRED_TARGET, 1, 0, [ref]$p)) {
21
- $code = [Runtime.InteropServices.Marshal]::GetLastWin32Error()
22
- if ($code -eq ${ERROR_NOT_FOUND}) { exit ${NOT_FOUND} }
23
- [Console]::Error.WriteLine("CredRead failed with Win32 error $code"); exit 4
24
- }
25
- try {
26
- $c = [Runtime.InteropServices.Marshal]::PtrToStructure($p, [type][AtkConduct.Cred+CREDENTIAL])
27
- [Console]::Out.Write([string]$c.UserName + [char]10)
28
- [Console]::Out.Write([Runtime.InteropServices.Marshal]::PtrToStringUni($c.CredentialBlob, $c.CredentialBlobSize / 2))
29
- } finally { [AtkConduct.Cred]::CredFree($p) }
30
- } catch { [Console]::Error.WriteLine($_.Exception.Message); exit 4 }
31
- `;
32
- export async function credentialSaved(target, env = process.env) {
33
- if (process.platform !== 'win32')
34
- return 'missing';
35
- const result = await run('cmdkey', [`/list:${target}`], { env, timeoutMs: 15_000 });
36
- if (result.code !== 0)
37
- return 'unknown';
38
- if (/\*\s*NONE\s*\*/.test(result.stdout))
39
- return 'missing';
40
- return /^\s*Target:/m.test(result.stdout) ? 'saved' : 'unknown';
41
- }
42
- // Reads the generic credential `target`. Windows only.
43
- export async function readCredential(target, env = process.env) {
44
- if (process.platform !== 'win32')
45
- return { found: false, missing: true, reason: `the ${target} credential is Windows-only` };
46
- const result = await run('powershell.exe', ['-NoProfile', '-NonInteractive', '-EncodedCommand', Buffer.from(CRED_READ, 'utf16le').toString('base64')], { env: { ...env, ATK_CONDUCT_CRED_TARGET: target }, timeoutMs: 30_000 });
47
- if (result.code === 0) {
48
- const newline = result.stdout.indexOf('\n');
49
- const secret = result.stdout.slice(newline + 1).trim();
50
- if (newline >= 0 && secret)
51
- return { credential: { secret, user: result.stdout.slice(0, newline).trim() }, found: true };
52
- }
53
- if (result.code === NOT_FOUND)
54
- return { found: false, missing: true, reason: `no credential ${target}` };
55
- // Never echo stdout here: on a partial failure it could hold the secret.
56
- const line = result.stderr
57
- .split(/\r?\n/)
58
- .map((l) => l.trim())
59
- .find((l) => l && !l.startsWith('#< CLIXML') && !l.startsWith('<Objs'));
60
- return {
61
- found: false,
62
- missing: false,
63
- reason: `the credential ${target} couldn't be read (${result.error ?? line ?? `exit ${result.code}`})`,
64
- };
65
- }
66
- //# sourceMappingURL=credential.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"credential.js","sourceRoot":"","sources":["../src/credential.ts"],"names":[],"mappings":"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"}
package/build/startup.js DELETED
@@ -1,92 +0,0 @@
1
- import { execFileSync, spawnSync } from 'node:child_process';
2
- import { ConductorError } from "./errors.js";
3
- export const TASK_NAME = 'Conductor';
4
- // Registers a per-user Task Scheduler task that runs `conduct supervise` at logon, which keeps
5
- // `conduct serve` running (supervise.ts). No elevation is needed for a task that runs as the
6
- // current user. conhost --headless keeps a console window (or a Windows Terminal tab) from
7
- // opening, and the zero time limit stops Task Scheduler from ending the daemon after its default
8
- // 72 hours. A second start while one runs exits on the pid lock, and its supervisor with it.
9
- export function installStartup({ cliPath, nodePath }) {
10
- requireWindows();
11
- const script = [
12
- "$ErrorActionPreference = 'Stop'",
13
- '$user = "$env:USERDOMAIN\\$env:USERNAME"',
14
- '$action = New-ScheduledTaskAction -Execute "$env:SystemRoot\\System32\\conhost.exe" -Argument $env:CONDUCTOR_TASK_ARGS',
15
- '$trigger = New-ScheduledTaskTrigger -AtLogOn -User $user',
16
- '$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -MultipleInstances IgnoreNew -ExecutionTimeLimit ([TimeSpan]::Zero)',
17
- '$principal = New-ScheduledTaskPrincipal -UserId $user -LogonType Interactive -RunLevel Limited',
18
- `Register-ScheduledTask -TaskName '${TASK_NAME}' -Description 'Starts the conductor daemon (conduct supervise) at logon.' -Action $action -Trigger $trigger -Settings $settings -Principal $principal -Force | Out-Null`,
19
- ].join('\n');
20
- powershell(script, { CONDUCTOR_TASK_ARGS: `--headless "${nodePath}" "${cliPath}" supervise` });
21
- }
22
- // True when a task was removed, false when there was none.
23
- export function removeStartup() {
24
- requireWindows();
25
- if (!startupInstalled())
26
- return false;
27
- execFileSync('schtasks', ['/Delete', '/TN', TASK_NAME, '/F'], { stdio: 'ignore' });
28
- return true;
29
- }
30
- export function runStartup() {
31
- const result = spawnSync('schtasks', ['/Run', '/TN', TASK_NAME], { encoding: 'utf8' });
32
- if (result.status !== 0) {
33
- throw new ConductorError(`could not run the "${TASK_NAME}" logon task`, [
34
- result.stderr?.trim() || result.error?.message || `exit ${result.status}`,
35
- ]);
36
- }
37
- }
38
- export function startupInstalled() {
39
- return spawnSync('schtasks', ['/Query', '/TN', TASK_NAME], { stdio: 'ignore' }).status === 0;
40
- }
41
- // True when the logon task exists and its action runs this cli.js, so running it starts this
42
- // build. A task registered from another build (a linked checkout) would start that one.
43
- export function startupRunsCli(cliPath) {
44
- if (process.platform !== 'win32')
45
- return false;
46
- const result = spawnSync('schtasks', ['/Query', '/TN', TASK_NAME, '/XML'], { encoding: 'utf8' });
47
- return result.status === 0 && taskRunsCli(result.stdout, cliPath);
48
- }
49
- // True when the logon task runs `conduct supervise`. One an install-startup from before ATK-417
50
- // registered runs `conduct serve`, which nothing restarts.
51
- export function startupSupervises() {
52
- if (process.platform !== 'win32')
53
- return false;
54
- const result = spawnSync('schtasks', ['/Query', '/TN', TASK_NAME, '/XML'], { encoding: 'utf8' });
55
- return result.status === 0 && taskSupervises(result.stdout);
56
- }
57
- // The task's <Arguments> quote the cli.js path (installStartup); XML escapes it, and Windows paths
58
- // compare without case.
59
- export function taskRunsCli(xml, cliPath) {
60
- const args = taskArguments(xml);
61
- return args !== undefined && args.toLowerCase().includes(`"${cliPath.toLowerCase()}"`);
62
- }
63
- export function taskSupervises(xml) {
64
- return /\ssupervise\s*$/.test(taskArguments(xml) ?? '');
65
- }
66
- function powershell(script, env) {
67
- const result = spawnSync('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', script], {
68
- encoding: 'utf8',
69
- env: { ...process.env, ...env },
70
- });
71
- if (result.status !== 0) {
72
- throw new ConductorError('could not register the logon task', [result.stderr.trim() || `exit ${result.status}`]);
73
- }
74
- }
75
- function requireWindows() {
76
- if (process.platform !== 'win32') {
77
- throw new ConductorError('install-startup supports Windows only', [
78
- 'start `conduct serve` from your own login items',
79
- ]);
80
- }
81
- }
82
- // The task action's <Arguments>, XML unescaped.
83
- function taskArguments(xml) {
84
- return /<Arguments>([^<]*)<\/Arguments>/
85
- .exec(xml)?.[1]
86
- ?.replaceAll('&quot;', '"')
87
- .replaceAll('&apos;', "'")
88
- .replaceAll('&lt;', '<')
89
- .replaceAll('&gt;', '>')
90
- .replaceAll('&amp;', '&');
91
- }
92
- //# sourceMappingURL=startup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"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"}
package/build/tab.js DELETED
@@ -1,32 +0,0 @@
1
- import { outputOf, run } from "./run.js";
2
- // Runs wt.exe for a worker's tab or the console's. Not hidden: when the named window doesn't exist
3
- // yet, Windows Terminal creates it with the spawn's SW_HIDE, and the tab runs where nobody sees it
4
- // (ATK-469, ATK-336).
5
- export function openWindowsTerminal(args, cwd, runCommand = run) {
6
- return runCommand('wt.exe', args, { cwd, timeoutMs: 60_000, windowsHide: false });
7
- }
8
- // A tab in the project's Windows Terminal window, attached to the session. wt.exe splits its own
9
- // arguments on `;`, so titles lose it and the command chains with `||`. The tab closes when the
10
- // session stops (a park), and stays open only to show a failed attach (ATK-260).
11
- export function tabArgs(tab) {
12
- const clean = (text) => text.replace(/;/g, ',').replace(/\s+/g, ' ').trim();
13
- return [
14
- '-w',
15
- clean(tab.window),
16
- 'new-tab',
17
- '--title',
18
- clean(tab.title).slice(0, 80),
19
- 'pwsh',
20
- '-Command',
21
- `claude attach ${tab.handle} || Read-Host 'claude attach failed, press Enter to close this tab'`,
22
- ];
23
- }
24
- export function windowsTerminalTab() {
25
- return async (tab) => {
26
- if (process.platform !== 'win32')
27
- return 'tabs need Windows Terminal';
28
- const result = await openWindowsTerminal(tabArgs(tab), tab.cwd);
29
- return result.code === 0 ? null : outputOf(result, 500);
30
- };
31
- }
32
- //# sourceMappingURL=tab.js.map
package/build/tab.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"tab.js","sourceRoot":"","sources":["../src/tab.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAkB,MAAM,UAAU,CAAC;AAazD,mGAAmG;AACnG,mGAAmG;AACnG,sBAAsB;AACtB,MAAM,UAAU,mBAAmB,CAAC,IAAuB,EAAE,GAAW,EAAE,UAAU,GAAG,GAAG;IACxF,OAAO,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;AACpF,CAAC;AAED,iGAAiG;AACjG,gGAAgG;AAChG,iFAAiF;AACjF,MAAM,UAAU,OAAO,CAAC,GAAQ;IAC9B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5F,OAAO;QACL,IAAI;QACJ,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QACjB,SAAS;QACT,SAAS;QACT,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM;QACN,UAAU;QACV,iBAAiB,GAAG,CAAC,MAAM,qEAAqE;KACjG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE;QACnB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO,4BAA4B,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1D,CAAC,CAAC;AACJ,CAAC"}