@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.
- package/CHANGELOG.md +339 -0
- package/README.md +270 -123
- 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 +15 -10
- package/build/broker-cli.js.map +1 -1
- package/build/broker.js +1 -1
- package/build/broker.js.map +1 -1
- package/build/claude.js +48 -2
- package/build/claude.js.map +1 -1
- package/build/cli.js +221 -71
- 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 +158 -39
- 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 +140 -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 +43 -27
- package/build/console.js.map +1 -1
- package/build/credentials.js +49 -36
- package/build/credentials.js.map +1 -1
- package/build/daemon.js +57 -66
- package/build/daemon.js.map +1 -1
- package/build/file-lock.js +35 -3
- 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 +228 -82
- 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 +50 -34
- package/build/inbox.js.map +1 -1
- package/build/init.js +509 -0
- package/build/init.js.map +1 -0
- package/build/landing.js +86 -7
- 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 +4 -3
- package/build/lib/providers/index.js.map +1 -1
- package/build/lib/providers/npm/stage.js +28 -5
- 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 +1 -1
- package/build/logins.js.map +1 -1
- package/build/manager.js +131 -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 +323 -0
- package/build/npm-reads.js.map +1 -0
- 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 +19 -19
- package/build/project-check-cli.js.map +1 -1
- package/build/project-check.js +194 -108
- 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 -18
- package/build/watchers/ado.js.map +1 -1
- package/build/watchers/github.js +19 -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/npm.js +6 -4
- package/build/watchers/npm.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 +57 -53
- 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
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import http from 'node:http';
|
|
3
|
+
import https from 'node:https';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { Readable } from 'node:stream';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { ProviderError, registryFor } from "./lib/providers/index.js";
|
|
8
|
+
import { outputOf, run } from "./run.js";
|
|
9
|
+
const npmConfig = z.record(z.string(), z.unknown());
|
|
10
|
+
const REDIRECTS = new Set([301, 302, 303, 307, 308]);
|
|
11
|
+
// The agent settings of a read with a credential but no proxy, CA or TLS change.
|
|
12
|
+
const DIRECT = { noProxy: [], proxy: {}, rejectUnauthorized: true };
|
|
13
|
+
// The .npmrc keys npm authorizes a registry with (npm-registry-fetch's auth.js): `//host/path/:<kind>`.
|
|
14
|
+
const CREDENTIAL_KEY = /^\/\/.+:(?:_auth|_authToken|_password|username)$/;
|
|
15
|
+
// npm's ${VAR} in an .npmrc key or value (@npmcli/config's env-replace.js): an unset VAR stays as
|
|
16
|
+
// written, ${VAR?} is empty when unset, and a backslash escapes it.
|
|
17
|
+
const ENV_EXPR = /(?<!\\)(\\*)\$\{([^${}?]+)(\?)?\}/g;
|
|
18
|
+
// How long a failed load of npm's settings stands before a read asks npm again: a lasting failure
|
|
19
|
+
// (npm off the daemon's PATH) shouldn't start a shell on every read.
|
|
20
|
+
const RETRY_LOAD_MS = 60_000;
|
|
21
|
+
// A fetch over Node's http and https agents, which route through a proxy (a CONNECT tunnel for
|
|
22
|
+
// https) and take a CA; Node's own fetch takes neither from npm's settings. Enough of fetch for
|
|
23
|
+
// npmStage: method, headers, signal, and a streamed body. Each hop sends the credential
|
|
24
|
+
// hopAuthorization gives it.
|
|
25
|
+
export function agentFetch(settings, authorization = () => undefined) {
|
|
26
|
+
const agents = new Map();
|
|
27
|
+
const agentFor = (url) => {
|
|
28
|
+
const proxy = proxyFor(settings, url);
|
|
29
|
+
const key = `${url.protocol} ${proxy ?? ''}`;
|
|
30
|
+
let agent = agents.get(key);
|
|
31
|
+
if (!agent) {
|
|
32
|
+
agent =
|
|
33
|
+
url.protocol === 'https:'
|
|
34
|
+
? new https.Agent({
|
|
35
|
+
ca: settings.ca,
|
|
36
|
+
proxyEnv: proxy ? { HTTPS_PROXY: proxy } : undefined,
|
|
37
|
+
rejectUnauthorized: settings.rejectUnauthorized,
|
|
38
|
+
})
|
|
39
|
+
: new http.Agent({ proxyEnv: proxy ? { HTTP_PROXY: proxy } : undefined });
|
|
40
|
+
agents.set(key, agent);
|
|
41
|
+
}
|
|
42
|
+
return agent;
|
|
43
|
+
};
|
|
44
|
+
// Follows a redirect as fetch does (a mirror may answer with its canonical path), up to 5 times.
|
|
45
|
+
const send = (url, init, redirects, authFor) => {
|
|
46
|
+
const secure = url.protocol === 'https:';
|
|
47
|
+
const headers = new Headers(init?.headers);
|
|
48
|
+
const auth = authFor(url);
|
|
49
|
+
if (auth)
|
|
50
|
+
headers.set('authorization', auth);
|
|
51
|
+
const options = {
|
|
52
|
+
agent: agentFor(url),
|
|
53
|
+
headers: Object.fromEntries(headers),
|
|
54
|
+
method: init?.method ?? 'GET',
|
|
55
|
+
signal: init?.signal ?? undefined,
|
|
56
|
+
};
|
|
57
|
+
return new Promise((resolve, reject) => {
|
|
58
|
+
const answer = (response) => {
|
|
59
|
+
const status = response.statusCode ?? 0;
|
|
60
|
+
const { location } = response.headers;
|
|
61
|
+
if (REDIRECTS.has(status) && location) {
|
|
62
|
+
response.resume();
|
|
63
|
+
if (redirects >= 5) {
|
|
64
|
+
reject(new TypeError(`more than 5 redirects from ${url.origin}`));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// A caller's own authorization stays on its origin, as fetch keeps it.
|
|
68
|
+
const next = new URL(location, url);
|
|
69
|
+
const kept = new Headers(init?.headers);
|
|
70
|
+
kept.delete('authorization');
|
|
71
|
+
resolve(send(next, next.origin === url.origin ? init : { ...init, headers: kept }, redirects + 1, authFor));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const headers = new Headers();
|
|
75
|
+
for (const [name, value] of Object.entries(response.headers)) {
|
|
76
|
+
for (const one of [value ?? []].flat())
|
|
77
|
+
headers.append(name, one);
|
|
78
|
+
}
|
|
79
|
+
if (status === 204 || status === 205 || status === 304) {
|
|
80
|
+
response.resume();
|
|
81
|
+
resolve(new Response(null, { headers, status }));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
resolve(new Response(Readable.toWeb(response), { headers, status }));
|
|
85
|
+
};
|
|
86
|
+
const request = secure ? https.request(url, options, answer) : http.request(url, options, answer);
|
|
87
|
+
request.on('error', reject);
|
|
88
|
+
request.end();
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
return (input, init) => {
|
|
92
|
+
const url = new URL(input instanceof Request ? input.url : input);
|
|
93
|
+
return send(url, init, 0, hopAuthorization(authorization, url));
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// npm's proxy, CA and TLS settings for the reads, or null when plain fetch does. The proxy is the one
|
|
97
|
+
// npm picks (@npmcli/agent's getProxy): https-proxy or proxy from its settings, for either protocol;
|
|
98
|
+
// with neither, from the environment (either case), https_proxy for an https registry and
|
|
99
|
+
// https_proxy, http_proxy or proxy for an http one. noproxy, else NO_PROXY, names the hosts it skips.
|
|
100
|
+
export function agentSettings(config, env, readFile = (path) => readFileSync(path, 'utf8')) {
|
|
101
|
+
const configured = text(config['https-proxy'], config.proxy);
|
|
102
|
+
const forHttps = configured ?? text(env.https_proxy, env.HTTPS_PROXY);
|
|
103
|
+
const forHttp = configured ?? text(env.https_proxy, env.HTTPS_PROXY, env.http_proxy, env.HTTP_PROXY, env.proxy, env.PROXY);
|
|
104
|
+
const listed = [config.noproxy].flat().filter((entry) => typeof entry === 'string' && entry !== '');
|
|
105
|
+
const noProxy = (listed.length > 0 ? listed.join(',') : (text(env.no_proxy, env.NO_PROXY) ?? ''))
|
|
106
|
+
.split(',')
|
|
107
|
+
.map((entry) => entry.trim())
|
|
108
|
+
.filter(Boolean);
|
|
109
|
+
const ca = caOf(config, readFile);
|
|
110
|
+
const rejectUnauthorized = config['strict-ssl'] !== false;
|
|
111
|
+
if (!forHttps && !forHttp && !ca && rejectUnauthorized)
|
|
112
|
+
return null;
|
|
113
|
+
return {
|
|
114
|
+
...(ca ? { ca } : {}),
|
|
115
|
+
noProxy,
|
|
116
|
+
proxy: { ...(forHttp ? { http: forHttp } : {}), ...(forHttps ? { https: forHttps } : {}) },
|
|
117
|
+
rejectUnauthorized,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// The credential each hop of a read that starts at `start` sends: npm's for the hop's own URL, else,
|
|
121
|
+
// on the start's origin, the start's, as npm falls back to the registry's. A redirect to another
|
|
122
|
+
// origin carries none of the start's, and a hop from https down to http carries none at all.
|
|
123
|
+
export function hopAuthorization(authorization, start) {
|
|
124
|
+
const first = authorization(start);
|
|
125
|
+
return (hop) => {
|
|
126
|
+
if (start.protocol === 'https:' && hop.protocol === 'http:')
|
|
127
|
+
return undefined;
|
|
128
|
+
return authorization(hop) ?? (hop.origin === start.origin ? first : undefined);
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
// The settings `npm install --global` reads (`conduct upgrade` installs that way): --global skips a
|
|
132
|
+
// project .npmrc, and the home folder keeps the caller's checkout out of it. npm leaves its tokens
|
|
133
|
+
// out of the list: npmCredentials reads them.
|
|
134
|
+
export async function loadNpmConfig() {
|
|
135
|
+
const result = await run('npm', ['config', 'list', '--json', '--global'], {
|
|
136
|
+
cwd: homedir(),
|
|
137
|
+
shell: process.platform === 'win32',
|
|
138
|
+
timeoutMs: 60_000,
|
|
139
|
+
});
|
|
140
|
+
if (result.code !== 0) {
|
|
141
|
+
throw new ProviderError(`could not read npm's settings (npm config list): ${outputOf(result, 300)}`, {
|
|
142
|
+
transient: true,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
return npmConfig.parse(JSON.parse(result.stdout));
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
throw new ProviderError("npm config list --json answered something other than npm's settings");
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// npm's registry credentials, which `npm config list` leaves out: the `//host/path/:` keys of the
|
|
153
|
+
// .npmrc files it names, the user's over the global one (a global install reads no project
|
|
154
|
+
// .npmrc), or none when there are none. A file that isn't there has none; one that can't be read
|
|
155
|
+
// fails the reads. A URL takes the key npm-registry-fetch's auth.js picks: from `//host/path`,
|
|
156
|
+
// strip a segment or a slash at a time to the first with a token, an _auth, or a username and
|
|
157
|
+
// _password. The values stay in here: no message, event or log carries them. They are read once,
|
|
158
|
+
// with the rest of npm's settings: a new token reaches a running daemon on its next start.
|
|
159
|
+
export function npmCredentials(config, env, readFile = (path) => readFileSync(path, 'utf8')) {
|
|
160
|
+
const keys = new Map();
|
|
161
|
+
for (const setting of ['globalconfig', 'userconfig']) {
|
|
162
|
+
const path = text(config[setting]);
|
|
163
|
+
const rc = path ? readOptional(setting, path, readFile) : undefined;
|
|
164
|
+
for (const [key, value] of rc ? credentialsIn(rc, env) : [])
|
|
165
|
+
keys.set(key, value);
|
|
166
|
+
}
|
|
167
|
+
if (keys.size === 0)
|
|
168
|
+
return undefined;
|
|
169
|
+
return (url) => {
|
|
170
|
+
let key = `//${url.host}${url.pathname}`;
|
|
171
|
+
while (key.length > '//'.length) {
|
|
172
|
+
const token = keys.get(`${key}:_authToken`);
|
|
173
|
+
if (token)
|
|
174
|
+
return `Bearer ${token}`;
|
|
175
|
+
const auth = keys.get(`${key}:_auth`);
|
|
176
|
+
if (auth)
|
|
177
|
+
return `Basic ${auth}`;
|
|
178
|
+
const username = keys.get(`${key}:username`);
|
|
179
|
+
const password = keys.get(`${key}:_password`);
|
|
180
|
+
if (username && password) {
|
|
181
|
+
const plain = Buffer.from(password, 'base64').toString('utf8');
|
|
182
|
+
return `Basic ${Buffer.from(`${username}:${plain}`, 'utf8').toString('base64')}`;
|
|
183
|
+
}
|
|
184
|
+
key = key.replace(/(?:[^/]+|\/)$/, '');
|
|
185
|
+
}
|
|
186
|
+
return undefined;
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
// The reads npmStage takes, from npm's settings, loaded once on the first read. A failed load fails
|
|
190
|
+
// the reads with npm's reason, and a read a minute later loads again; a changed setting reaches a
|
|
191
|
+
// running daemon on its next start.
|
|
192
|
+
export function npmReads({ env = process.env, load = loadNpmConfig, now = () => Date.now(), readFile, } = {}) {
|
|
193
|
+
let loading = null;
|
|
194
|
+
let failed = null;
|
|
195
|
+
const settings = () => {
|
|
196
|
+
if (loading)
|
|
197
|
+
return loading;
|
|
198
|
+
if (failed && now() - failed.at < RETRY_LOAD_MS)
|
|
199
|
+
return failed.settings;
|
|
200
|
+
const current = load().then((config) => {
|
|
201
|
+
const agent = agentSettings(config, env, readFile);
|
|
202
|
+
const authorization = npmCredentials(config, env, readFile);
|
|
203
|
+
const fetcher = agent || authorization ? agentFetch(agent ?? DIRECT, authorization) : globalThis.fetch;
|
|
204
|
+
return { config, fetch: fetcher };
|
|
205
|
+
});
|
|
206
|
+
loading = current;
|
|
207
|
+
current.catch(() => {
|
|
208
|
+
if (loading !== current)
|
|
209
|
+
return;
|
|
210
|
+
loading = null;
|
|
211
|
+
failed = { at: now(), settings: current };
|
|
212
|
+
});
|
|
213
|
+
return current;
|
|
214
|
+
};
|
|
215
|
+
return {
|
|
216
|
+
fetch: async (input, init) => (await settings()).fetch(input, init),
|
|
217
|
+
registry: async (pkg) => registryFor((await settings()).config, pkg),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
let shared = null;
|
|
221
|
+
// The process's reads from npm's settings, shared so npm is asked for them once. The default of
|
|
222
|
+
// every npmStage the conductor builds; a test passes its own fetch (npmjs) or reads.
|
|
223
|
+
export function sharedNpmReads() {
|
|
224
|
+
shared ??= npmReads();
|
|
225
|
+
return shared;
|
|
226
|
+
}
|
|
227
|
+
// npm's CA: cafile's certificates, else ca. Either replaces Node's own roots, as it does for npm. A
|
|
228
|
+
// cafile that isn't there is no CA, as npm takes it; one that can't be read fails the reads.
|
|
229
|
+
function caOf(config, readFile) {
|
|
230
|
+
const cafile = text(config.cafile);
|
|
231
|
+
if (cafile)
|
|
232
|
+
return readOptional('cafile', cafile, readFile);
|
|
233
|
+
const ca = [config.ca].flat().filter((entry) => typeof entry === 'string' && entry !== '');
|
|
234
|
+
if (ca.length === 0)
|
|
235
|
+
return undefined;
|
|
236
|
+
return ca.length === 1 ? ca[0] : ca;
|
|
237
|
+
}
|
|
238
|
+
// The credential keys of an .npmrc, with npm's ${VAR} expanded in keys and values: ini's
|
|
239
|
+
// `key = value` lines above the first [section] line, as npm reads them.
|
|
240
|
+
function credentialsIn(rc, env) {
|
|
241
|
+
const found = [];
|
|
242
|
+
for (const raw of rc.split(/[\r\n]+/)) {
|
|
243
|
+
if (/^\[[^\]]*\]\s*$/.test(raw))
|
|
244
|
+
break;
|
|
245
|
+
const line = raw.trim();
|
|
246
|
+
const equals = line.indexOf('=');
|
|
247
|
+
if (line.startsWith(';') || line.startsWith('#') || equals < 0)
|
|
248
|
+
continue;
|
|
249
|
+
const key = envReplace(iniValue(line.slice(0, equals)), env);
|
|
250
|
+
if (CREDENTIAL_KEY.test(key))
|
|
251
|
+
found.push([key, envReplace(iniValue(line.slice(equals + 1)), env)]);
|
|
252
|
+
}
|
|
253
|
+
return found;
|
|
254
|
+
}
|
|
255
|
+
function envReplace(value, env) {
|
|
256
|
+
return value.replace(ENV_EXPR, (match, escapes, name, optional) => {
|
|
257
|
+
if (escapes.length % 2 === 1)
|
|
258
|
+
return match.slice((escapes.length + 1) / 2);
|
|
259
|
+
return escapes.slice(escapes.length / 2) + (env[name] ?? (optional ? '' : `\${${name}}`));
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
// An ini value as the ini package's unsafe() reads it: a quoted one as JSON (a single-quoted one
|
|
263
|
+
// without its quotes first), kept as it is when that isn't JSON; else up to an unescaped ; or #,
|
|
264
|
+
// with \; \# and \\ unescaped.
|
|
265
|
+
function iniValue(raw) {
|
|
266
|
+
const value = raw.trim();
|
|
267
|
+
if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
|
|
268
|
+
const json = value.startsWith("'") ? value.slice(1, -1) : value;
|
|
269
|
+
try {
|
|
270
|
+
const parsed = JSON.parse(json);
|
|
271
|
+
return typeof parsed === 'string' ? parsed : JSON.stringify(parsed);
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
return json;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
let plain = '';
|
|
278
|
+
let escaped = false;
|
|
279
|
+
for (const char of value) {
|
|
280
|
+
if (escaped) {
|
|
281
|
+
plain += '\\;#'.includes(char) ? char : `\\${char}`;
|
|
282
|
+
escaped = false;
|
|
283
|
+
}
|
|
284
|
+
else if (char === '\\')
|
|
285
|
+
escaped = true;
|
|
286
|
+
else if (char === ';' || char === '#')
|
|
287
|
+
break;
|
|
288
|
+
else
|
|
289
|
+
plain += char;
|
|
290
|
+
}
|
|
291
|
+
return (escaped ? `${plain}\\` : plain).trim();
|
|
292
|
+
}
|
|
293
|
+
// npm's proxy for a registry URL, or none when noProxy names its host or a domain above it
|
|
294
|
+
// (@npmcli/agent's isNoProxy: `acme.test` covers `npm.acme.test`).
|
|
295
|
+
function proxyFor(settings, url) {
|
|
296
|
+
const host = url.hostname.split('.').reverse();
|
|
297
|
+
const skipped = settings.noProxy.some((entry) => {
|
|
298
|
+
const segments = entry.split('.').filter(Boolean).reverse();
|
|
299
|
+
return segments.length > 0 && segments.every((segment, i) => host[i] === segment);
|
|
300
|
+
});
|
|
301
|
+
if (skipped)
|
|
302
|
+
return undefined;
|
|
303
|
+
return url.protocol === 'https:' ? settings.proxy.https : settings.proxy.http;
|
|
304
|
+
}
|
|
305
|
+
// One of npm's settings files, or none when it isn't there, as npm takes it; one that can't be
|
|
306
|
+
// read fails the reads.
|
|
307
|
+
function readOptional(setting, path, readFile) {
|
|
308
|
+
try {
|
|
309
|
+
return readFile(path);
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
if (!(error instanceof Error))
|
|
313
|
+
throw error;
|
|
314
|
+
if ('code' in error && error.code === 'ENOENT')
|
|
315
|
+
return undefined;
|
|
316
|
+
throw new ProviderError(`could not read npm's ${setting} ${path}: ${error.message}`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// The first value that is a string with something in it.
|
|
320
|
+
function text(...values) {
|
|
321
|
+
return values.find((value) => typeof value === 'string' && value !== '');
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=npm-reads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-reads.js","sourceRoot":"","sources":["../src/npm-reads.ts"],"names":[],"mappings":"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"}
|
package/build/ownership.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// touch a PR that isn't the asking worker's: another item's, a branch the worktree isn't on, a title
|
|
4
4
|
// without the key, or auto mode where the landing rules say review.
|
|
5
5
|
const BRANCH_TYPES = ['build', 'chore', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'style', 'test'];
|
|
6
|
-
// <type>/<key>-<slug>, such as feat/
|
|
6
|
+
// <type>/<key>-<slug>, such as feat/eng-454-code-host-writes, or null when the type isn't a
|
|
7
7
|
// conventional commit type or the slug is empty once cleaned.
|
|
8
8
|
export function branchName(type, slug, item) {
|
|
9
9
|
const clean = slug
|
|
@@ -12,7 +12,7 @@ export function branchName(type, slug, item) {
|
|
|
12
12
|
.replace(/^-|-$/g, '');
|
|
13
13
|
return BRANCH_TYPES.includes(type) && clean ? `${type}/${item.toLowerCase()}-${clean}` : null;
|
|
14
14
|
}
|
|
15
|
-
// The item key in a branch or worktree name, with the project's key prefix:
|
|
15
|
+
// The item key in a branch or worktree name, with the project's key prefix: eng-454 → ENG-454.
|
|
16
16
|
export function itemKey(text, prefix) {
|
|
17
17
|
const found = new RegExp(`(?:^|[^A-Za-z0-9])(${escape(prefix)}-\\d+)(?![0-9])`, 'i').exec(text);
|
|
18
18
|
return found?.[1]?.toUpperCase() ?? null;
|
package/build/paths.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { realpathSync } from 'node:fs';
|
|
1
2
|
import { homedir } from 'node:os';
|
|
2
|
-
import { join, resolve } from 'node:path';
|
|
3
|
+
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
4
|
+
// A project's name, as its profile and its folder under <home>/projects give it.
|
|
5
|
+
export const PROJECT_NAME = /^[a-z][a-z0-9-]*$/;
|
|
3
6
|
export function conductorPaths(home = process.env.CONDUCTOR_HOME || defaultHome()) {
|
|
4
7
|
const logs = join(home, 'logs');
|
|
5
8
|
return {
|
|
@@ -12,6 +15,7 @@ export function conductorPaths(home = process.env.CONDUCTOR_HOME || defaultHome(
|
|
|
12
15
|
pid: join(home, 'conductor.pid'),
|
|
13
16
|
plugin: join(home, 'plugin'),
|
|
14
17
|
port: join(home, 'port'),
|
|
18
|
+
projects: join(home, 'projects'),
|
|
15
19
|
rules: join(home, 'rules.json'),
|
|
16
20
|
stopRequest: join(home, 'supervisor.stop'),
|
|
17
21
|
supervisorPid: join(home, 'supervisor.pid'),
|
|
@@ -23,6 +27,45 @@ export function conductorPaths(home = process.env.CONDUCTOR_HOME || defaultHome(
|
|
|
23
27
|
export function isDefaultHome(home) {
|
|
24
28
|
return samePath(home, defaultHome());
|
|
25
29
|
}
|
|
30
|
+
// The project whose clone or worktree a path is in (<projects>/<name>/repo or
|
|
31
|
+
// <projects>/<name>/worktrees/<item>, or a folder below either), or null.
|
|
32
|
+
export function projectOfPath(paths, path) {
|
|
33
|
+
// Real paths on both sides: git reports a checkout's long form, and the home may be a junction or
|
|
34
|
+
// an 8.3 short name.
|
|
35
|
+
const rel = relative(realOr(paths.projects), realOr(path));
|
|
36
|
+
if (rel === '' || rel.startsWith('..') || isAbsolute(rel))
|
|
37
|
+
return null;
|
|
38
|
+
const [name, part] = rel.split(sep);
|
|
39
|
+
if (name === undefined || !(part === 'repo' || part === 'worktrees'))
|
|
40
|
+
return null;
|
|
41
|
+
return PROJECT_NAME.test(name) ? name : null;
|
|
42
|
+
}
|
|
43
|
+
export function projectPaths(paths, name) {
|
|
44
|
+
const dir = join(paths.projects, name);
|
|
45
|
+
return {
|
|
46
|
+
clone: join(dir, 'repo'),
|
|
47
|
+
dir,
|
|
48
|
+
profile: join(paths.projects, `${name}.json`),
|
|
49
|
+
worktrees: join(dir, 'worktrees'),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// The path with links and short names resolved. A path that isn't there is its deepest folder that
|
|
53
|
+
// is, resolved, with the rest after it, so two spellings of one place still compare equal.
|
|
54
|
+
export function realOr(path) {
|
|
55
|
+
const full = resolve(path);
|
|
56
|
+
for (let dir = full, rest = '';;) {
|
|
57
|
+
try {
|
|
58
|
+
return join(realpathSync.native(dir), rest);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
const parent = dirname(dir);
|
|
62
|
+
if (parent === dir)
|
|
63
|
+
return full;
|
|
64
|
+
rest = join(basename(dir), rest);
|
|
65
|
+
dir = parent;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
26
69
|
// Whether two paths name the same file, ignoring case on Windows.
|
|
27
70
|
export function samePath(a, b) {
|
|
28
71
|
const norm = (p) => {
|
package/build/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
|
package/build/plugin.js
CHANGED
|
@@ -12,6 +12,8 @@ import { outputOf } from "./run.js";
|
|
|
12
12
|
// runs on silently without the plugin (ATK-522). Other sessions never see it.
|
|
13
13
|
// The plugin's name, which namespaces its skills: /conductor:work-item.
|
|
14
14
|
export const PLUGIN_NAME = 'conductor';
|
|
15
|
+
// The plugin's reference work skill: what `conduct init` writes as a new profile's `skills.work`.
|
|
16
|
+
export const WORK_SKILL = `${PLUGIN_NAME}:work-item`;
|
|
15
17
|
const USER_MOD = `${PLUGIN_NAME}@${PLUGIN_NAME}`;
|
|
16
18
|
// Claude Code writes these into a plugin folder each time it loads it (its API's types, a
|
|
17
19
|
// tsconfig), and the tests aren't shipped: a refresh neither copies nor removes them.
|
|
@@ -30,7 +32,7 @@ export function missingPluginSkills(dir, names) {
|
|
|
30
32
|
}
|
|
31
33
|
// Which of the named skills outside the plugin a session in the worktree wouldn't find: neither in
|
|
32
34
|
// its .claude/skills nor in the user's (`skillsHome`, ~/.claude/skills). A project's skills arrive
|
|
33
|
-
// through its `setup` (
|
|
35
|
+
// through its `setup` (a command that installs them), so this checks only that they arrived.
|
|
34
36
|
export function missingProjectSkills(worktree, names, skillsHome) {
|
|
35
37
|
const found = (dir, name) => existsSync(join(dir, name, 'SKILL.md'));
|
|
36
38
|
const missing = projectSkills(names).filter((name) => !found(join(worktree, '.claude', 'skills'), name) && !found(skillsHome, name));
|
|
@@ -39,7 +41,7 @@ export function missingProjectSkills(worktree, names, skillsHome) {
|
|
|
39
41
|
: `${missing.join(', ')} not in ${join(worktree, '.claude', 'skills')} or ${skillsHome} after setup`;
|
|
40
42
|
}
|
|
41
43
|
// A skill named `conductor:<skill>` is the conductor plugin's, which `--plugin-dir` loads; any
|
|
42
|
-
// other is one the project installs
|
|
44
|
+
// other is one the project installs itself. The note headings take the bare name.
|
|
43
45
|
export function noteName(name) {
|
|
44
46
|
return pluginSkill(name) ?? name;
|
|
45
47
|
}
|
package/build/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9G,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAkB,MAAM,UAAU,CAAC;AAEpD,mGAAmG;AACnG,iGAAiG;AACjG,iGAAiG;AACjG,oGAAoG;AACpG,8EAA8E;AAE9E,wEAAwE;AACxE,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC;AACvC,MAAM,QAAQ,GAAG,GAAG,WAAW,IAAI,WAAW,EAAE,CAAC;AAEjD,0FAA0F;AAC1F,sFAAsF;AACtF,MAAM,SAAS,GAAG,CAAC,UAAU,EAAE,2BAA2B,EAAE,uBAAuB,CAAC,CAAC;AAErF,gGAAgG;AAChG,0DAA0D;AAC1D,MAAM,IAAI,GAAG,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;AAOxD,uGAAuG;AACvG,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,KAAwB;IACvE,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC,GAAG,GAAG,CAAC;AACpG,CAAC;AAED,mGAAmG;AACnG,mGAAmG;AACnG,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|