@detergent-software/conductor 1.3.0-dev.4 → 1.3.0-dev.6
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 +21 -0
- package/README.md +19 -4
- package/build/checkout.js +139 -0
- package/build/checkout.js.map +1 -0
- package/build/cli.js +60 -23
- package/build/cli.js.map +1 -1
- package/build/code-host-cli.js +334 -0
- package/build/code-host-cli.js.map +1 -0
- package/build/code-host-service.js +42 -0
- package/build/code-host-service.js.map +1 -0
- package/build/code-host.js +115 -0
- package/build/code-host.js.map +1 -0
- package/build/conditions.js +5 -2
- package/build/conditions.js.map +1 -1
- package/build/credentials.js +14 -7
- package/build/credentials.js.map +1 -1
- package/build/daemon.js +3 -0
- package/build/daemon.js.map +1 -1
- package/build/help.js +43 -0
- package/build/help.js.map +1 -1
- package/build/lib/providers/ado/code-host.js +18 -6
- package/build/lib/providers/ado/code-host.js.map +1 -1
- package/build/lib/providers/ado/http.js +24 -1
- package/build/lib/providers/ado/http.js.map +1 -1
- package/build/lib/providers/ado/writes.js +130 -0
- package/build/lib/providers/ado/writes.js.map +1 -0
- package/build/lib/providers/github/code-host.js +20 -16
- package/build/lib/providers/github/code-host.js.map +1 -1
- package/build/lib/providers/github/gh.js.map +1 -1
- package/build/lib/providers/github/writes.js +200 -0
- package/build/lib/providers/github/writes.js.map +1 -0
- package/build/lib/providers/index.js +5 -3
- package/build/lib/providers/index.js.map +1 -1
- package/build/lib/providers/types.js +2 -1
- package/build/lib/providers/types.js.map +1 -1
- package/build/lib/providers/verdicts/pr.js.map +1 -1
- package/build/ownership.js +57 -0
- package/build/ownership.js.map +1 -0
- package/build/profile.js +23 -1
- package/build/profile.js.map +1 -1
- package/build/server.js +46 -6
- package/build/server.js.map +1 -1
- package/build/train-cli.js +7 -4
- package/build/train-cli.js.map +1 -1
- package/build/train.js +0 -10
- package/build/train.js.map +1 -1
- package/build/watchers/boards.js +6 -2
- package/build/watchers/boards.js.map +1 -1
- package/build/worktrees.js +26 -36
- package/build/worktrees.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
// GENERATED from packages/providers by `pnpm sync-conductor`. Do not edit.
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { NotFound, ProviderError } from "../errors.js";
|
|
4
|
+
import { githubSummary, pull } from "./code-host.js";
|
|
5
|
+
import { repoName } from "./gh.js";
|
|
6
|
+
const comment = z.looseObject({ html_url: z.string().nullish(), id: z.number() });
|
|
7
|
+
const settings = z.looseObject({
|
|
8
|
+
data: z.looseObject({
|
|
9
|
+
repository: z.looseObject({
|
|
10
|
+
autoMergeAllowed: z.boolean(),
|
|
11
|
+
branchProtectionRules: z.looseObject({
|
|
12
|
+
nodes: z.array(z.looseObject({
|
|
13
|
+
pattern: z.string(),
|
|
14
|
+
requiredApprovingReviewCount: z.number().nullish(),
|
|
15
|
+
requiresApprovingReviews: z.boolean().nullish(),
|
|
16
|
+
requiresCodeOwnerReviews: z.boolean().nullish(),
|
|
17
|
+
requiresLinearHistory: z.boolean().nullish(),
|
|
18
|
+
requiresStatusChecks: z.boolean().nullish(),
|
|
19
|
+
})),
|
|
20
|
+
}),
|
|
21
|
+
mergeCommitAllowed: z.boolean(),
|
|
22
|
+
}),
|
|
23
|
+
}),
|
|
24
|
+
});
|
|
25
|
+
const rules = z.array(z.looseObject({
|
|
26
|
+
parameters: z
|
|
27
|
+
.looseObject({
|
|
28
|
+
allowed_merge_methods: z.array(z.string()).optional(),
|
|
29
|
+
require_code_owner_review: z.boolean().optional(),
|
|
30
|
+
required_approving_review_count: z.number().optional(),
|
|
31
|
+
})
|
|
32
|
+
.nullish(),
|
|
33
|
+
type: z.string(),
|
|
34
|
+
}));
|
|
35
|
+
const SETTINGS_QUERY = `query($owner: String!, $name: String!) {
|
|
36
|
+
repository(owner: $owner, name: $name) {
|
|
37
|
+
autoMergeAllowed
|
|
38
|
+
mergeCommitAllowed
|
|
39
|
+
branchProtectionRules(first: 100) {
|
|
40
|
+
nodes {
|
|
41
|
+
pattern
|
|
42
|
+
requiresApprovingReviews
|
|
43
|
+
requiredApprovingReviewCount
|
|
44
|
+
requiresCodeOwnerReviews
|
|
45
|
+
requiresLinearHistory
|
|
46
|
+
requiresStatusChecks
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}`;
|
|
51
|
+
const ENABLE_AUTO_MERGE = `mutation($id: ID!) {
|
|
52
|
+
enablePullRequestAutoMerge(input: { pullRequestId: $id, mergeMethod: MERGE }) {
|
|
53
|
+
pullRequest { number }
|
|
54
|
+
}
|
|
55
|
+
}`;
|
|
56
|
+
// GitHub's writes, through `gh` as the person (design note, decision 8): auto mode is GitHub's own
|
|
57
|
+
// auto-merge with the merge method and no approval, so the conductor never merges a PR itself.
|
|
58
|
+
export function githubCodeHostWrites(gh) {
|
|
59
|
+
const base = (repo) => `repos/${repoName(repo)}`;
|
|
60
|
+
const postComment = async ({ number, repo }, body) => {
|
|
61
|
+
const found = comment.parse(await gh.write('POST', `${base(repo)}/issues/${number}/comments`, { body }));
|
|
62
|
+
return { id: found.id, url: found.html_url ?? null };
|
|
63
|
+
};
|
|
64
|
+
return {
|
|
65
|
+
arm: async (ref, mode) => {
|
|
66
|
+
// Review mode arms nothing: a person merges on GitHub, with a merge commit.
|
|
67
|
+
if (mode === 'review')
|
|
68
|
+
return [];
|
|
69
|
+
const found = pull.parse(await gh.api(`${base(ref.repo)}/pulls/${ref.number}`));
|
|
70
|
+
if (found.auto_merge?.merge_method === 'merge')
|
|
71
|
+
return [];
|
|
72
|
+
// Someone armed it with another method: that is theirs to change, not the conductor's.
|
|
73
|
+
if (found.auto_merge) {
|
|
74
|
+
throw new ProviderError(`#${ref.number} already has auto-merge on with ${found.auto_merge.merge_method ?? 'another method'}, not a merge commit`);
|
|
75
|
+
}
|
|
76
|
+
if (!found.node_id)
|
|
77
|
+
throw new ProviderError(`GitHub gave PR #${ref.number} no node id to arm`);
|
|
78
|
+
try {
|
|
79
|
+
await gh.write('POST', 'graphql', { query: ENABLE_AUTO_MERGE, variables: { id: found.node_id } });
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
// GitHub won't arm a PR it can merge now (its required checks have passed): the conductor
|
|
83
|
+
// doesn't merge it either, so a person does.
|
|
84
|
+
throw new ProviderError(`GitHub refused auto-merge on #${ref.number}: ${messageOf(error)}`);
|
|
85
|
+
}
|
|
86
|
+
return ['enabled auto-merge (merge commit)'];
|
|
87
|
+
},
|
|
88
|
+
createPr: async (repo, { base: into, body, head, title }) => {
|
|
89
|
+
const made = pull.parse(await gh.write('POST', `${base(repo)}/pulls`, { base: into, body, head, title }));
|
|
90
|
+
return { ...githubSummary(made), descriptionChars: made.body?.length ?? 0 };
|
|
91
|
+
},
|
|
92
|
+
identity: async () => z.looseObject({ login: z.string() }).parse(await gh.api('user')).login,
|
|
93
|
+
keepArmed: async () => ({ did: [], requeued: [] }),
|
|
94
|
+
landingCheck: (repo, into, mode) => mode === 'review' ? Promise.resolve({ ok: true }) : autoLanding(gh, repo, into),
|
|
95
|
+
note: postComment,
|
|
96
|
+
reply: async (ref, thread, body) => {
|
|
97
|
+
if (thread !== null)
|
|
98
|
+
throw new ProviderError('a GitHub PR has no threads: reply to the PR, without a thread');
|
|
99
|
+
return postComment(ref, body);
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// Whether a pattern of GitHub's branch protection (fnmatch) names the branch: `*` and `?` within a
|
|
104
|
+
// path segment, `**` across them, and `[...]` a character class.
|
|
105
|
+
export function protects(pattern, branch) {
|
|
106
|
+
let source = '';
|
|
107
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
108
|
+
const c = pattern[i] ?? '';
|
|
109
|
+
if (c === '*' && pattern[i + 1] === '*') {
|
|
110
|
+
source += '.*';
|
|
111
|
+
i++;
|
|
112
|
+
}
|
|
113
|
+
else if (c === '*')
|
|
114
|
+
source += '[^/]*';
|
|
115
|
+
else if (c === '?')
|
|
116
|
+
source += '[^/]';
|
|
117
|
+
else if (c === '[' && pattern.indexOf(']', i + 2) !== -1) {
|
|
118
|
+
const end = pattern.indexOf(']', i + 2);
|
|
119
|
+
const inside = pattern
|
|
120
|
+
.slice(i + 1, end)
|
|
121
|
+
.replace(/^!/, '^')
|
|
122
|
+
.replace(/\\/g, '\\\\');
|
|
123
|
+
source += `[${inside}]`;
|
|
124
|
+
i = end;
|
|
125
|
+
}
|
|
126
|
+
else
|
|
127
|
+
source += c.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
|
|
128
|
+
}
|
|
129
|
+
return new RegExp(`^${source}$`).test(branch);
|
|
130
|
+
}
|
|
131
|
+
// Auto mode needs the repo's "Allow auto-merge" and merge commits, no required review or code
|
|
132
|
+
// owner's review (auto mode approves nothing), no rule against a merge commit (linear history, a
|
|
133
|
+
// ruleset's merge methods), no merge queue, and a required status check: GitHub arms auto-merge only on a PR it can't merge
|
|
134
|
+
// yet, so without one there is nothing to wait for. The branch's protection rules come from GraphQL
|
|
135
|
+
// and its rulesets from REST; a plan without rulesets (a private repo on GitHub Free) answers 403,
|
|
136
|
+
// which means none apply. Anything it can't read refuses: an unknown is not a yes.
|
|
137
|
+
async function autoLanding(gh, repo, branch) {
|
|
138
|
+
const name = repoName(repo);
|
|
139
|
+
let found;
|
|
140
|
+
try {
|
|
141
|
+
const answer = await gh.write('POST', 'graphql', {
|
|
142
|
+
query: SETTINGS_QUERY,
|
|
143
|
+
variables: { name: repo.repo, owner: repo.owner },
|
|
144
|
+
});
|
|
145
|
+
found = settings.parse(answer).data.repository;
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
return { ok: false, reason: `couldn't read ${name}'s merge settings: ${messageOf(error)}` };
|
|
149
|
+
}
|
|
150
|
+
let ruleset = [];
|
|
151
|
+
try {
|
|
152
|
+
ruleset = rules.parse(await gh.api(`repos/${name}/rules/branches/${encodeURIComponent(branch)}`));
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (!(error instanceof NotFound) && !/Upgrade to GitHub Pro/i.test(messageOf(error))) {
|
|
156
|
+
return { ok: false, reason: `couldn't read the rulesets on ${name}'s ${branch}: ${messageOf(error)}` };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (!found.autoMergeAllowed)
|
|
160
|
+
return { ok: false, reason: `${name} doesn't allow auto-merge (Settings, General, "Allow auto-merge")` };
|
|
161
|
+
if (!found.mergeCommitAllowed)
|
|
162
|
+
return { ok: false, reason: `${name} doesn't allow merge commits` };
|
|
163
|
+
const protections = found.branchProtectionRules.nodes.filter((r) => protects(r.pattern, branch));
|
|
164
|
+
const reviews = Math.max(0, ...protections.map((r) => (r.requiresApprovingReviews ? (r.requiredApprovingReviewCount ?? 1) : 0)), ...ruleset.filter((r) => r.type === 'pull_request').map((r) => r.parameters?.required_approving_review_count ?? 0));
|
|
165
|
+
if (reviews > 0) {
|
|
166
|
+
return {
|
|
167
|
+
ok: false,
|
|
168
|
+
reason: `${name}'s ${branch} requires ${reviews} approving review${reviews === 1 ? '' : 's'}, and auto mode approves nothing: land it in review mode`,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const pullRules = ruleset.filter((r) => r.type === 'pull_request');
|
|
172
|
+
if (protections.some((r) => r.requiresCodeOwnerReviews) ||
|
|
173
|
+
pullRules.some((r) => r.parameters?.require_code_owner_review)) {
|
|
174
|
+
return { ok: false, reason: `${name}'s ${branch} requires a code owner's review: land it in review mode` };
|
|
175
|
+
}
|
|
176
|
+
if (pullRules.some((r) => r.parameters?.allowed_merge_methods && !r.parameters.allowed_merge_methods.includes('merge'))) {
|
|
177
|
+
return { ok: false, reason: `a ruleset on ${name}'s ${branch} doesn't allow merge commits` };
|
|
178
|
+
}
|
|
179
|
+
if (protections.some((r) => r.requiresLinearHistory) || ruleset.some((r) => r.type === 'required_linear_history')) {
|
|
180
|
+
return { ok: false, reason: `${name}'s ${branch} requires a linear history, so a merge commit can't land there` };
|
|
181
|
+
}
|
|
182
|
+
if (ruleset.some((r) => r.type === 'merge_queue')) {
|
|
183
|
+
return {
|
|
184
|
+
ok: false,
|
|
185
|
+
reason: `${name}'s ${branch} uses a merge queue, which auto mode doesn't drive: land it in review mode`,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
const checks = protections.some((r) => r.requiresStatusChecks) || ruleset.some((r) => r.type === 'required_status_checks');
|
|
189
|
+
if (!checks) {
|
|
190
|
+
return {
|
|
191
|
+
ok: false,
|
|
192
|
+
reason: `${name}'s ${branch} has no required status check, so GitHub can't arm auto-merge (it merges at once or not at all): land it in review mode`,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
return { ok: true };
|
|
196
|
+
}
|
|
197
|
+
function messageOf(error) {
|
|
198
|
+
return error instanceof Error ? error.message : String(error);
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=writes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writes.js","sourceRoot":"","sources":["../../../../src/lib/providers/github/writes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
// GENERATED from packages/providers by `pnpm sync-conductor`. Do not edit.
|
|
2
|
-
export { ADO_CAPABILITIES, adoChecks, adoCodeHost, adoPrState, adoReviews, adoThreads, } from "./ado/code-host.js";
|
|
3
|
-
export { adoBase, adoHttp, adoPrUrl, adoRepoFromRemote, adoRequest, adoRunUrl, adoUrl, repoPath, } from "./ado/http.js";
|
|
2
|
+
export { ADO_CAPABILITIES, adoChecks, adoCodeHost, adoPrState, adoPullRequest, adoReviews, adoThreads, } from "./ado/code-host.js";
|
|
3
|
+
export { adoBase, adoHttp, adoOrgUrl, adoPrUrl, adoRepoFromRemote, adoRequest, adoRunUrl, adoSend, adoUrl, apiPath, repoPath, } from "./ado/http.js";
|
|
4
4
|
export { adoPipelines, buildState, pendingApprovals } from "./ado/pipelines.js";
|
|
5
5
|
export { parseTrigger, triggerFires } from "./ado/trigger.js";
|
|
6
|
+
export { adoCodeHostWrites, COMPLETION } from "./ado/writes.js";
|
|
6
7
|
export { NotFound, ProviderError } from "./errors.js";
|
|
7
8
|
export { githubActions, logText, workflowRunSnapshot, workflowRunState } from "./github/actions.js";
|
|
8
|
-
export { GITHUB_CAPABILITIES, githubChecks, githubCodeHost, githubPrState, githubReviews, githubThreads, } from "./github/code-host.js";
|
|
9
|
+
export { GITHUB_CAPABILITIES, githubChecks, githubCodeHost, githubPrState, githubReviews, githubSummary, githubThreads, } from "./github/code-host.js";
|
|
9
10
|
export { githubRepoRef, PASSING, repoName } from "./github/gh.js";
|
|
11
|
+
export { githubCodeHostWrites, protects } from "./github/writes.js";
|
|
10
12
|
export { isNote, noteHeading } from "./notes.js";
|
|
11
13
|
export { NPM_REGISTRY, npmStage, parseStageLine } from "./npm/stage.js";
|
|
12
14
|
export { checksSettled, needsAnswer, prVerdict } from "./verdicts/pr.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/providers/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,WAAW,EAEX,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/providers/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,WAAW,EAEX,UAAU,EACV,cAAc,EAEd,UAAU,EAEV,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,OAAO,EAEP,OAAO,EACP,SAAS,EACT,QAAQ,EACR,iBAAiB,EAEjB,UAAU,EACV,SAAS,EAET,OAAO,EAEP,MAAM,EACN,OAAO,EACP,QAAQ,GACT,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAgB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACpG,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,GACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAA0B,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,MAAM,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,EAAsB,aAAa,EAAE,WAAW,EAAkB,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7G,OAAO,EACL,SAAS,EACT,cAAc,EACd,YAAY,EAGZ,WAAW,EACX,SAAS,GACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAuC,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// writes", sections 2 and 3): a tracker for items, a code host for git and PRs, a CI for the runs a
|
|
4
4
|
// merge starts, and a release for what those runs stage. Each axis is an interface with one adapter
|
|
5
5
|
// per provider, every adapter normalizes its host's answers into the snapshots below, and the
|
|
6
|
-
// verdicts (verdicts/) read only the snapshots.
|
|
6
|
+
// verdicts (verdicts/) read only the snapshots. A code host's writes (CodeHostWrites) take their own
|
|
7
|
+
// transport, so a caller that only reads never holds one that writes.
|
|
7
8
|
export {};
|
|
8
9
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/providers/types.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,6FAA6F;AAC7F,oGAAoG;AACpG,oGAAoG;AACpG,8FAA8F;AAC9F,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/providers/types.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,6FAA6F;AAC7F,oGAAoG;AACpG,oGAAoG;AACpG,8FAA8F;AAC9F,qGAAqG;AACrG,sEAAsE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../../../src/lib/providers/verdicts/pr.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../../../src/lib/providers/verdicts/pr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Who may ask for a code-host write (providers design note, section 7). The threat model is
|
|
2
|
+
// mistakes, not malice: one person, one machine, a loopback API. So a write is refused when it would
|
|
3
|
+
// touch a PR that isn't the asking worker's: another item's, a branch the worktree isn't on, a title
|
|
4
|
+
// without the key, or auto mode where the landing rules say review.
|
|
5
|
+
const BRANCH_TYPES = ['build', 'chore', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'style', 'test'];
|
|
6
|
+
// <type>/<key>-<slug>, such as feat/atk-454-code-host-writes, or null when the type isn't a
|
|
7
|
+
// conventional commit type or the slug is empty once cleaned.
|
|
8
|
+
export function branchName(type, slug, item) {
|
|
9
|
+
const clean = slug
|
|
10
|
+
.toLowerCase()
|
|
11
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
12
|
+
.replace(/^-|-$/g, '');
|
|
13
|
+
return BRANCH_TYPES.includes(type) && clean ? `${type}/${item.toLowerCase()}-${clean}` : null;
|
|
14
|
+
}
|
|
15
|
+
// The item key in a branch or worktree name, with the project's key prefix: atk-454 → ATK-454.
|
|
16
|
+
export function itemKey(text, prefix) {
|
|
17
|
+
const found = new RegExp(`(?:^|[^A-Za-z0-9])(${escape(prefix)}-\\d+)(?![0-9])`, 'i').exec(text);
|
|
18
|
+
return found?.[1]?.toUpperCase() ?? null;
|
|
19
|
+
}
|
|
20
|
+
// Which landing mode a change gets: review when it touches a review path or its plan's tier is a
|
|
21
|
+
// review tier, else auto. The reasons say which.
|
|
22
|
+
export function landingMode({ files, review, reviewTiers, tier, }) {
|
|
23
|
+
const under = (file) => review.find((prefix) => file === prefix.replace(/\/$/, '') || file.startsWith(prefix));
|
|
24
|
+
const matched = files.filter((file) => under(file) !== undefined);
|
|
25
|
+
const reasons = [
|
|
26
|
+
...(tier !== null && reviewTiers.includes(tier) ? [`a ${tier}-tier plan`] : []),
|
|
27
|
+
...(matched.length > 0 ? [`changes under ${[...new Set(matched.map(under))].join(', ')}`] : []),
|
|
28
|
+
];
|
|
29
|
+
return { matched, mode: reasons.length > 0 ? 'review' : 'auto', reasons };
|
|
30
|
+
}
|
|
31
|
+
// Why a worker on `item` may not open (or land) a PR from `head` with `title`, or null. The head is
|
|
32
|
+
// the branch the checkout is on now; a branch without the item's key is another item's work.
|
|
33
|
+
export function prRefusal({ base, head, item, prefix, title, }) {
|
|
34
|
+
if (!head)
|
|
35
|
+
return 'the checkout is on no branch (a detached HEAD)';
|
|
36
|
+
if (head === base || head === 'main')
|
|
37
|
+
return `refusing a PR from ${head}, the base branch`;
|
|
38
|
+
if (itemKey(head, prefix) !== item)
|
|
39
|
+
return `the branch ${head} doesn't carry ${item}: rename it (conduct branch)`;
|
|
40
|
+
const keys = titleKeys(title, prefix);
|
|
41
|
+
if (keys === null) {
|
|
42
|
+
return `the title must carry the item keys, such as "fix(api): … (${item})" or "fix(cli): … (${item}, ${prefix}-130)"`;
|
|
43
|
+
}
|
|
44
|
+
if (!keys.includes(item))
|
|
45
|
+
return `the title carries ${keys.join(', ')}, not ${item}`;
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
// The keys a PR title carries in parentheses, "(KEY-72)" or "(KEY-128, KEY-130)", or null without.
|
|
49
|
+
export function titleKeys(title, prefix) {
|
|
50
|
+
const key = `${escape(prefix)}-\\d+`;
|
|
51
|
+
const found = new RegExp(`\\((${key}(?:, ${key})*)\\)`, 'i').exec(title);
|
|
52
|
+
return found?.[1] ? found[1].split(', ').map((k) => k.toUpperCase()) : null;
|
|
53
|
+
}
|
|
54
|
+
function escape(text) {
|
|
55
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownership.js","sourceRoot":"","sources":["../src/ownership.ts"],"names":[],"mappings":"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"}
|
package/build/profile.js
CHANGED
|
@@ -13,11 +13,17 @@ const text = z.string().trim().min(1);
|
|
|
13
13
|
const port = z.int().min(1).max(65535);
|
|
14
14
|
// A repo's .claude/conductor.json: what the conductor needs to know about a project, as data.
|
|
15
15
|
// Each adapter kind is a discriminated union, so ADO Boards (Cadence) arrives as one more variant.
|
|
16
|
-
|
|
16
|
+
const profileFields = z.strictObject({
|
|
17
17
|
baseBranch: text,
|
|
18
18
|
ci: z.discriminatedUnion('kind', [z.strictObject({ kind: z.literal('ado-pipelines') })]),
|
|
19
19
|
codeHost: z.discriminatedUnion('kind', [
|
|
20
20
|
z.strictObject({ kind: z.literal('ado'), organization: z.url(), project: text, repository: text }),
|
|
21
|
+
// A GitHub repo (ATK-428): its PRs, checks and auto-merge.
|
|
22
|
+
z.strictObject({
|
|
23
|
+
kind: z.literal('github'),
|
|
24
|
+
owner: z.string().regex(/^[\w.-]+$/, 'a GitHub owner, such as EmergentSoftware'),
|
|
25
|
+
repo: z.string().regex(/^[\w.-]+$/, 'a GitHub repo name, without the owner'),
|
|
26
|
+
}),
|
|
21
27
|
]),
|
|
22
28
|
// The kinds of note that wait on a person in this project (worker protocol v1).
|
|
23
29
|
gates: z.array(z.enum(['merge', 'npm-otp', 'plan'])).min(1),
|
|
@@ -113,6 +119,22 @@ export const profileSchema = z.strictObject({
|
|
|
113
119
|
// attached to its background session.
|
|
114
120
|
workers: z.strictObject({ tab: z.boolean().default(false) }).prefault({}),
|
|
115
121
|
});
|
|
122
|
+
// ADO Boards takes its organization and project from an Azure DevOps code host; beside a GitHub
|
|
123
|
+
// one it names them.
|
|
124
|
+
export const profileSchema = profileFields.superRefine((profile, ctx) => {
|
|
125
|
+
const { codeHost, tracker } = profile;
|
|
126
|
+
if (tracker.kind !== 'ado-boards' || codeHost.kind === 'ado')
|
|
127
|
+
return;
|
|
128
|
+
for (const key of ['organization', 'project']) {
|
|
129
|
+
if (tracker[key] === undefined) {
|
|
130
|
+
ctx.addIssue({
|
|
131
|
+
code: 'custom',
|
|
132
|
+
message: `required beside a ${codeHost.kind} code host: the board's Azure DevOps ${key}`,
|
|
133
|
+
path: ['tracker', key],
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
});
|
|
116
138
|
// The profile's base ports by name, without maxSlot.
|
|
117
139
|
export function basePorts(profile) {
|
|
118
140
|
const { maxSlot: _maxSlot, ...ports } = profile.ports;
|
package/build/profile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,oGAAoG;AACpG,mFAAmF;AACnF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC;AAC1B,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAE9D,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,mBAAmB,EAAE,8DAA8D,CAAC,CAAC;AACnH,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACtC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAEvC,8FAA8F;AAC9F,mGAAmG;AACnG,MAAM,
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
|
package/build/server.js
CHANGED
|
@@ -2,8 +2,10 @@ import { createServer } from 'node:http';
|
|
|
2
2
|
import { isAbsolute } from 'node:path';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { BriefError } from "./brief.js";
|
|
5
|
+
import {} from "./code-host-service.js";
|
|
5
6
|
import { CHANNELS } from "./config.js";
|
|
6
7
|
import { consoleGate, NoEscalationError } from "./console.js";
|
|
8
|
+
import { LoginNeeded } from "./credentials.js";
|
|
7
9
|
import { ConductorError } from "./errors.js";
|
|
8
10
|
import { historyReport } from "./history.js";
|
|
9
11
|
import { NotePostError, PlanRevisedError } from "./notes.js";
|
|
@@ -15,7 +17,9 @@ import { INBOX_KINDS } from "./store.js";
|
|
|
15
17
|
import { bearerMatches } from "./token.js";
|
|
16
18
|
import { explain } from "./why.js";
|
|
17
19
|
const KEEPALIVE_MS = 15_000;
|
|
18
|
-
|
|
20
|
+
// A PR's description travels in a body: GitHub keeps 65,536 characters, up to 3 bytes each in
|
|
21
|
+
// UTF-8 and more once JSON escapes them.
|
|
22
|
+
const MAX_BODY_BYTES = 512 * 1024;
|
|
19
23
|
const addProjectBody = z.strictObject({
|
|
20
24
|
path: z.string().refine((path) => isAbsolute(path), 'must be an absolute path'),
|
|
21
25
|
});
|
|
@@ -36,6 +40,12 @@ const lockBody = z.strictObject({
|
|
|
36
40
|
owner: z.string().trim().min(1).optional(),
|
|
37
41
|
});
|
|
38
42
|
const waitBody = z.strictObject({ condition: z.string().min(1), worker: z.int().positive() });
|
|
43
|
+
// POST /workers/:id/prs: open the worker's PR (`conduct pr create`); `repo` as --repo names it.
|
|
44
|
+
const prBody = z.strictObject({
|
|
45
|
+
body: z.string().trim().min(1),
|
|
46
|
+
repo: z.string().min(1).optional(),
|
|
47
|
+
title: z.string().trim().min(1),
|
|
48
|
+
});
|
|
39
49
|
const noteBody = z.strictObject({ body: z.string().trim().min(1), worker: z.int().positive().optional() });
|
|
40
50
|
const answerBody = z.discriminatedUnion('action', [
|
|
41
51
|
z.strictObject({ action: z.literal('approve'), text: z.string().trim().min(1).optional() }),
|
|
@@ -84,7 +94,7 @@ const cacheBody = z.discriminatedUnion('action', [
|
|
|
84
94
|
]);
|
|
85
95
|
const ESCALATION_ROUTE = /^\/console\/escalations\/(\d+)$/;
|
|
86
96
|
const INBOX_ROUTE = /^\/inbox\/(\d+)\/resolve$/;
|
|
87
|
-
const WORKER_ROUTE = /^\/workers\/(\d+)(
|
|
97
|
+
const WORKER_ROUTE = /^\/workers\/(\d+)(?:\/(attach|prs))?$/;
|
|
88
98
|
const WAIT_ROUTE = /^\/waits\/(\d+)$/;
|
|
89
99
|
const ITEM_ROUTE = /^\/items\/([^/]+)\/(brief|notes)$/;
|
|
90
100
|
const LOCK_ROUTE = /^\/locks\/([\w-]+)$/;
|
|
@@ -132,7 +142,8 @@ export function createApi(deps) {
|
|
|
132
142
|
const url = new URL(req.url ?? '/', 'http://127.0.0.1');
|
|
133
143
|
const workerRoute = WORKER_ROUTE.exec(url.pathname);
|
|
134
144
|
if (workerRoute) {
|
|
135
|
-
|
|
145
|
+
const sub = workerRoute[2] === 'attach' || workerRoute[2] === 'prs' ? workerRoute[2] : 'worker';
|
|
146
|
+
await worker(req, res, url, Number(workerRoute[1]), sub);
|
|
136
147
|
return;
|
|
137
148
|
}
|
|
138
149
|
const whyRoute = WHY_ROUTE.exec(url.pathname);
|
|
@@ -477,14 +488,21 @@ export function createApi(deps) {
|
|
|
477
488
|
throw error;
|
|
478
489
|
}
|
|
479
490
|
}
|
|
480
|
-
// GET /workers/:id, DELETE /workers/:id[?force=true] (retire), POST /workers/:id/attach
|
|
481
|
-
|
|
491
|
+
// GET /workers/:id, DELETE /workers/:id[?force=true] (retire), POST /workers/:id/attach, and the
|
|
492
|
+
// worker's own code-host writes: POST /workers/:id/prs.
|
|
493
|
+
async function worker(req, res, url, id, sub) {
|
|
482
494
|
const found = deps.store.getWorker(id);
|
|
483
495
|
if (!found) {
|
|
484
496
|
send(res, 404, { error: 'not_found' });
|
|
485
497
|
return;
|
|
486
498
|
}
|
|
487
|
-
const route = `${req.method} ${
|
|
499
|
+
const route = `${req.method} ${sub}`;
|
|
500
|
+
if (route === 'POST prs') {
|
|
501
|
+
const body = await parseBody(req, res, prBody);
|
|
502
|
+
if (body)
|
|
503
|
+
await codeHostWrite(res, 201, () => deps.codeHost.openPr(id, body));
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
488
506
|
try {
|
|
489
507
|
if (route === 'GET worker') {
|
|
490
508
|
send(res, 200, { events: deps.store.workerEvents(id, 5), worker: found });
|
|
@@ -506,6 +524,28 @@ export function createApi(deps) {
|
|
|
506
524
|
send(res, 409, { details: error.details, error: error.message });
|
|
507
525
|
}
|
|
508
526
|
}
|
|
527
|
+
// A worker's code-host write: 409 for a refusal (ownership, a PR already open), 503 for a lost
|
|
528
|
+
// login (the verb exits 5 and the worker waits on `conduct wait login`), 502 when the host failed.
|
|
529
|
+
async function codeHostWrite(res, status, write) {
|
|
530
|
+
try {
|
|
531
|
+
send(res, status, await write());
|
|
532
|
+
}
|
|
533
|
+
catch (error) {
|
|
534
|
+
if (error instanceof LoginNeeded) {
|
|
535
|
+
send(res, 503, {
|
|
536
|
+
details: error.details,
|
|
537
|
+
error: error.message,
|
|
538
|
+
login: { command: error.account.command, provider: error.account.provider },
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
else if (error instanceof ConductorError) {
|
|
542
|
+
send(res, 409, { details: error.details, error: error.message });
|
|
543
|
+
}
|
|
544
|
+
else {
|
|
545
|
+
send(res, 502, { error: error instanceof Error ? error.message : String(error) });
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
509
549
|
// Server-sent events from the append-only log. `Last-Event-ID` (a reconnecting EventSource) or
|
|
510
550
|
// `?since=<id>` replays everything after that id first; without either the stream starts live.
|
|
511
551
|
// Replay and subscribe run in one synchronous block, so no event falls between them.
|