@detergent-software/conductor 1.2.1-dev.2 → 1.3.0-dev.1

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 (61) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +17 -0
  3. package/build/brief.js +2 -1
  4. package/build/brief.js.map +1 -1
  5. package/build/cli.js +4 -0
  6. package/build/cli.js.map +1 -1
  7. package/build/daemon.js +4 -0
  8. package/build/daemon.js.map +1 -1
  9. package/build/help.js +11 -0
  10. package/build/help.js.map +1 -1
  11. package/build/lib/providers/ado/code-host.js +230 -0
  12. package/build/lib/providers/ado/code-host.js.map +1 -0
  13. package/build/lib/providers/ado/http.js +95 -0
  14. package/build/lib/providers/ado/http.js.map +1 -0
  15. package/build/lib/providers/ado/pipelines.js +185 -0
  16. package/build/lib/providers/ado/pipelines.js.map +1 -0
  17. package/build/lib/providers/ado/trigger.js +99 -0
  18. package/build/lib/providers/ado/trigger.js.map +1 -0
  19. package/build/lib/providers/errors.js +23 -0
  20. package/build/lib/providers/errors.js.map +1 -0
  21. package/build/lib/providers/github/actions.js +86 -0
  22. package/build/lib/providers/github/actions.js.map +1 -0
  23. package/build/lib/providers/github/code-host.js +201 -0
  24. package/build/lib/providers/github/code-host.js.map +1 -0
  25. package/build/lib/providers/github/gh.js +15 -0
  26. package/build/lib/providers/github/gh.js.map +1 -0
  27. package/build/lib/providers/index.js +15 -0
  28. package/build/lib/providers/index.js.map +1 -0
  29. package/build/lib/providers/notes.js +22 -0
  30. package/build/lib/providers/notes.js.map +1 -0
  31. package/build/lib/providers/npm/stage.js +62 -0
  32. package/build/lib/providers/npm/stage.js.map +1 -0
  33. package/build/lib/providers/types.js +8 -0
  34. package/build/lib/providers/types.js.map +1 -0
  35. package/build/lib/providers/verdicts/pr.js +90 -0
  36. package/build/lib/providers/verdicts/pr.js.map +1 -0
  37. package/build/lib/providers/verdicts/runs.js +73 -0
  38. package/build/lib/providers/verdicts/runs.js.map +1 -0
  39. package/build/lib/providers/verdicts/stage.js +14 -0
  40. package/build/lib/providers/verdicts/stage.js.map +1 -0
  41. package/build/notes.js +1 -1
  42. package/build/notes.js.map +1 -1
  43. package/build/profile.js +10 -0
  44. package/build/profile.js.map +1 -1
  45. package/build/train-cli.js +64 -0
  46. package/build/train-cli.js.map +1 -0
  47. package/build/train.js +342 -0
  48. package/build/train.js.map +1 -0
  49. package/build/watchers/ado-api.js +2 -31
  50. package/build/watchers/ado-api.js.map +1 -1
  51. package/build/watchers/ado.js +36 -119
  52. package/build/watchers/ado.js.map +1 -1
  53. package/build/watchers/github.js +21 -48
  54. package/build/watchers/github.js.map +1 -1
  55. package/build/watchers/linear.js +2 -17
  56. package/build/watchers/linear.js.map +1 -1
  57. package/build/watchers/npm.js +1 -1
  58. package/build/watchers/npm.js.map +1 -1
  59. package/build/watchers/source.js +8 -2
  60. package/build/watchers/source.js.map +1 -1
  61. package/package.json +1 -1
@@ -0,0 +1,99 @@
1
+ export function parseTrigger(yaml) {
2
+ const lines = yaml.split(/\r?\n/);
3
+ const start = lines.findIndex((line) => /^trigger\s*:/.test(line));
4
+ if (start === -1)
5
+ return { kind: 'all' }; // no trigger key: every branch, every path
6
+ const inline = stripComment((lines[start] ?? '').replace(/^trigger\s*:/, '')).trim();
7
+ const filter = {
8
+ branches: { exclude: [], include: [] },
9
+ kind: 'filter',
10
+ paths: { exclude: [], include: [] },
11
+ };
12
+ if (inline === 'none')
13
+ return { kind: 'none' };
14
+ if (inline.startsWith('['))
15
+ return { ...filter, branches: { exclude: [], include: listItems(inline) } };
16
+ if (inline)
17
+ return { kind: 'unknown' };
18
+ const sections = { branches: filter.branches, paths: filter.paths };
19
+ let section = 'branches'; // a bare list under `trigger:` is a branch list
20
+ let which = 'include';
21
+ for (const raw of lines.slice(start + 1)) {
22
+ const line = stripComment(raw);
23
+ if (!line.trim())
24
+ continue;
25
+ if (/^\S/.test(line) && !/^-\s/.test(line))
26
+ break;
27
+ const key = /^\s+(\w+)\s*:\s*(.*)$/.exec(line);
28
+ const value = key?.[2] ?? '';
29
+ if (key?.[1] && key[1] !== 'include' && key[1] !== 'exclude') {
30
+ section = key[1];
31
+ which = 'include';
32
+ if (value.trim().startsWith('['))
33
+ sections[section]?.include.push(...listItems(value));
34
+ continue;
35
+ }
36
+ if (key?.[1]) {
37
+ which = key[1] === 'exclude' ? 'exclude' : 'include';
38
+ if (value.trim().startsWith('['))
39
+ sections[section]?.[which].push(...listItems(value));
40
+ continue;
41
+ }
42
+ const item = /^\s*-\s+(.+)$/.exec(line)?.[1];
43
+ if (item)
44
+ sections[section]?.[which].push(unquote(item.trim()));
45
+ }
46
+ return filter;
47
+ }
48
+ // Whether a trigger fires for a push to `branch` that changed `files`; null when unsure.
49
+ export function triggerFires(trigger, branch, files) {
50
+ if (trigger.kind === 'none')
51
+ return false;
52
+ if (trigger.kind === 'all')
53
+ return true;
54
+ if (trigger.kind !== 'filter')
55
+ return null;
56
+ const { branches, paths } = trigger;
57
+ const branchHit = (pattern) => globMatch(pattern.replace(/^refs\/heads\//, ''), branch);
58
+ if (branches.include.length > 0 && !branches.include.some(branchHit))
59
+ return false;
60
+ if (branches.exclude.some(branchHit))
61
+ return false;
62
+ if (paths.include.length === 0 && paths.exclude.length === 0)
63
+ return true;
64
+ // Only a trailing `*` is read; other wildcards leave the answer to the grace period.
65
+ if ([...paths.include, ...paths.exclude].some((pattern) => /[*?[]/.test(pattern.replace(/\*$/, ''))))
66
+ return null;
67
+ // Azure Pipelines reads `/apps/api/*` as `apps/api/*`: paths are from the repository root.
68
+ const pathHit = (written, file) => {
69
+ const pattern = written.replace(/^\/+/, '');
70
+ if (pattern.endsWith('*'))
71
+ return file.startsWith(pattern.slice(0, -1));
72
+ const folder = pattern.replace(/\/$/, '');
73
+ return file === folder || file.startsWith(`${folder}/`);
74
+ };
75
+ return files.some((file) => (paths.include.length === 0 || paths.include.some((p) => pathHit(p, file))) &&
76
+ !paths.exclude.some((p) => pathHit(p, file)));
77
+ }
78
+ function globMatch(pattern, text) {
79
+ const source = pattern
80
+ .split('*')
81
+ .map((part) => part.replace(/[.+?^${}()|[\]\\]/g, '\\$&'))
82
+ .join('.*');
83
+ return new RegExp(`^${source}$`).test(text);
84
+ }
85
+ function listItems(text) {
86
+ return text
87
+ .trim()
88
+ .replace(/^\[|\]$/g, '')
89
+ .split(',')
90
+ .map((item) => unquote(item.trim()))
91
+ .filter(Boolean);
92
+ }
93
+ function stripComment(line) {
94
+ return line.replace(/(^|\s+)#.*$/, '');
95
+ }
96
+ function unquote(text) {
97
+ return text.replace(/^(['"])(.*)\1$/, '$2');
98
+ }
99
+ //# sourceMappingURL=trigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigger.js","sourceRoot":"","sources":["../../../../src/lib/providers/ado/trigger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ // GENERATED from packages/providers by `pnpm sync-conductor`. Do not edit.
2
+ // An answer about the thing asked for, not the provider: a PR, run or package that doesn't exist
3
+ // (404; Azure DevOps answers 400 for an id it can't read). A caller waiting on that thing reports
4
+ // it as that wait's problem and keeps going.
5
+ export class NotFound extends Error {
6
+ constructor(message) {
7
+ super(message);
8
+ this.name = 'NotFound';
9
+ }
10
+ }
11
+ // The provider itself failed: a refused token, a 5xx, a rate limit. `transient` is true when asking
12
+ // again later may succeed.
13
+ export class ProviderError extends Error {
14
+ status;
15
+ transient;
16
+ constructor(message, { status = null, transient = false } = {}) {
17
+ super(message);
18
+ this.name = 'ProviderError';
19
+ this.status = status;
20
+ this.transient = transient;
21
+ }
22
+ }
23
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/lib/providers/errors.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,iGAAiG;AACjG,kGAAkG;AAClG,6CAA6C;AAC7C,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,oGAAoG;AACpG,2BAA2B;AAC3B,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,MAAM,CAAgB;IACtB,SAAS,CAAU;IAE5B,YACE,OAAe,EACf,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,GAAG,KAAK,KAAsD,EAAE;QAE1F,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,86 @@
1
+ // GENERATED from packages/providers by `pnpm sync-conductor`. Do not edit.
2
+ import { z } from 'zod';
3
+ import { ProviderError } from "../errors.js";
4
+ import { PASSING, repoName } from "./gh.js";
5
+ const workflowRun = z.looseObject({
6
+ conclusion: z.string().nullish(),
7
+ created_at: z.string().nullish(),
8
+ event: z.string().optional(),
9
+ head_sha: z.string().optional(),
10
+ html_url: z.string().nullish(),
11
+ id: z.number(),
12
+ name: z.string().nullish(),
13
+ path: z.string().nullish(),
14
+ status: z.string().nullish(),
15
+ workflow_id: z.number().optional(),
16
+ });
17
+ export function workflowRunSnapshot(run) {
18
+ return {
19
+ ...(run.conclusion ? { conclusion: run.conclusion } : {}),
20
+ expected: null,
21
+ pipeline: { file: run.path ?? null, id: run.workflow_id ?? null, name: run.name ?? run.path ?? `run ${run.id}` },
22
+ queued: run.created_at ?? null,
23
+ run: run.id,
24
+ sourceVersion: run.head_sha ?? null,
25
+ state: workflowRunState(run),
26
+ status: run.status ?? null,
27
+ url: run.html_url ?? null,
28
+ };
29
+ }
30
+ // A workflow with a concurrency group cancels a pending run when a newer push queues one, so
31
+ // cancelled is its own state: the newer run may have built the merge too.
32
+ export function workflowRunState(run) {
33
+ if (run.status === 'completed') {
34
+ return PASSING.has(run.conclusion ?? '') ? 'succeeded' : run.conclusion === 'cancelled' ? 'cancelled' : 'failed';
35
+ }
36
+ if (run.status === 'waiting')
37
+ return 'waiting-for-approval';
38
+ return run.status === 'in_progress' ? 'running' : 'queued';
39
+ }
40
+ const COLOUR = new RegExp(`${String.fromCharCode(27)}\\[[0-9;]*m`, 'g');
41
+ // GitHub Actions. A push queues its runs within seconds, but nothing says which workflows a merge
42
+ // should start, so no run at all waits out the grace period.
43
+ export function githubActions(gh) {
44
+ const base = (repo) => `repos/${repoName(repo)}`;
45
+ const runGh = (args) => {
46
+ if (!gh.run)
47
+ throw new ProviderError('reading an Actions log needs a gh runner');
48
+ return gh.run(args);
49
+ };
50
+ return {
51
+ failureLog: async ({ id, repo }, { lines = 40 } = {}) => {
52
+ const run = workflowRun.parse(await gh.api(`${base(repo)}/actions/runs/${id}`));
53
+ const text = logText(await runGh(['run', 'view', String(id), '--repo', repoName(repo), '--log-failed']));
54
+ return {
55
+ log: text.slice(-lines),
56
+ pipeline: run.name ?? null,
57
+ result: run.conclusion ?? null,
58
+ run: id,
59
+ tasks: [],
60
+ url: run.html_url ?? null,
61
+ };
62
+ },
63
+ logs: async function* ({ id, repo }) {
64
+ yield logText(await runGh(['run', 'view', String(id), '--repo', repoName(repo), '--log'])).join('\n');
65
+ },
66
+ run: async ({ id, repo }) => workflowRunSnapshot(workflowRun.parse(await gh.api(`${base(repo)}/actions/runs/${id}`))),
67
+ // The runs a push started for the merge commit (pull request runs of the same SHA left out).
68
+ runsForMerge: async (repo, merge) => {
69
+ const { workflow_runs: runs } = z
70
+ .looseObject({ workflow_runs: z.array(workflowRun) })
71
+ .parse(await gh.api(`${base(repo)}/actions/runs?head_sha=${merge.sha}&per_page=100`));
72
+ return runs.filter((run) => run.event === 'push').map(workflowRunSnapshot);
73
+ },
74
+ triggersKnown: false,
75
+ };
76
+ }
77
+ // The text of `gh run view --log-failed` or `--log`: each line is "<job>\t<step>\t<timestamp>
78
+ // <text>", and the text is what a reader needs.
79
+ export function logText(output) {
80
+ return output
81
+ .replace(COLOUR, '')
82
+ .split(/\r?\n/)
83
+ .map((line) => (line.split('\t').at(-1) ?? '').replace(/^\S+Z /, ''))
84
+ .filter((line) => line.trim());
85
+ }
86
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../../src/lib/providers/github/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,201 @@
1
+ // GENERATED from packages/providers by `pnpm sync-conductor`. Do not edit.
2
+ import { z } from 'zod';
3
+ import { isNote } from "../notes.js";
4
+ import { PASSING, repoName } from "./gh.js";
5
+ const user = z.looseObject({ login: z.string(), type: z.string().optional() }).nullish();
6
+ const pull = z.looseObject({
7
+ auto_merge: z.looseObject({ enabled_by: user }).nullish(),
8
+ base: z.looseObject({ ref: z.string() }).optional(),
9
+ head: z.looseObject({ ref: z.string().optional(), sha: z.string() }),
10
+ html_url: z.string().optional(),
11
+ merge_commit_sha: z.string().nullish(),
12
+ mergeable: z.boolean().nullish(),
13
+ mergeable_state: z.string().nullish(),
14
+ merged: z.boolean().optional(),
15
+ merged_at: z.string().nullish(),
16
+ number: z.number().optional(),
17
+ state: z.string(),
18
+ title: z.string().optional(),
19
+ });
20
+ const checkRuns = z.looseObject({
21
+ check_runs: z.array(z.looseObject({
22
+ conclusion: z.string().nullish(),
23
+ details_url: z.string().nullish(),
24
+ html_url: z.string().nullish(),
25
+ name: z.string(),
26
+ status: z.string(),
27
+ })),
28
+ });
29
+ const comment = z.looseObject({
30
+ body: z.string().nullish(),
31
+ created_at: z.string(),
32
+ html_url: z.string().nullish(),
33
+ id: z.number().optional(),
34
+ line: z.number().nullish(),
35
+ path: z.string().nullish(),
36
+ user,
37
+ });
38
+ const review = z.looseObject({
39
+ body: z.string().nullish(),
40
+ html_url: z.string().nullish(),
41
+ id: z.number().optional(),
42
+ state: z.string(),
43
+ submitted_at: z.string().nullish(),
44
+ user,
45
+ });
46
+ export const GITHUB_CAPABILITIES = {
47
+ autoLanding: 'auto-merge',
48
+ descriptionLimit: 65_536,
49
+ keepArmed: false,
50
+ mergeFailure: false,
51
+ threadState: false,
52
+ };
53
+ export function githubChecks(runs) {
54
+ return runs.map((c) => ({
55
+ current: true,
56
+ kind: 'check',
57
+ name: c.name,
58
+ required: true,
59
+ run: actionsRun(c.details_url ?? c.html_url),
60
+ state: c.status !== 'completed' ? 'pending' : PASSING.has(c.conclusion ?? '') ? 'passed' : 'failed',
61
+ status: c.status === 'completed' ? (c.conclusion ?? 'completed') : c.status,
62
+ url: c.html_url ?? c.details_url ?? null,
63
+ }));
64
+ }
65
+ // GitHub, through `gh api`. Paths and query strings are the ones the conductor's watcher has always
66
+ // asked, so a caller that counts requests per path (the daemon) sees the same requests.
67
+ export function githubCodeHost(gh) {
68
+ const base = (repo) => `repos/${repoName(repo)}`;
69
+ const rawPr = async ({ number, repo }) => pull.parse(await gh.api(`${base(repo)}/pulls/${number}`));
70
+ const checksAt = async (repo, sha) => githubChecks(checkRuns.parse(await gh.api(`${base(repo)}/commits/${sha}/check-runs?per_page=100`)).check_runs);
71
+ const rawReviews = async ({ number, repo }) => z.array(review).parse(await gh.api(`${base(repo)}/pulls/${number}/reviews?per_page=100`));
72
+ const threadsOf = async (ref, notePrefixes, { reviews, since } = {}) => {
73
+ // Comments come oldest first, so `since` keeps a new one on the first page. Reviews can't be
74
+ // asked that way; a PR has few.
75
+ const after = `per_page=100${since ? `&since=${encodeURIComponent(since)}` : ''}`;
76
+ const comments = z.array(comment).parse(await gh.api(`${base(ref.repo)}/issues/${ref.number}/comments?${after}`));
77
+ const reviewComments = z
78
+ .array(comment)
79
+ .parse(await gh.api(`${base(ref.repo)}/pulls/${ref.number}/comments?${after}`));
80
+ return githubThreads({ comments, reviewComments, reviews: reviews ?? (await rawReviews(ref)) }, notePrefixes);
81
+ };
82
+ return {
83
+ capabilities: () => GITHUB_CAPABILITIES,
84
+ checks: async (ref) => checksAt(ref.repo, (await rawPr(ref)).head.sha),
85
+ commit: async (repo, sha) => {
86
+ const found = z
87
+ .looseObject({
88
+ commit: z.looseObject({ committer: z.looseObject({ date: z.string() }) }),
89
+ parents: z.array(z.looseObject({ sha: z.string() })),
90
+ sha: z.string(),
91
+ })
92
+ .parse(await gh.api(`${base(repo)}/commits/${sha}`));
93
+ return { date: found.commit.committer.date, parents: found.parents.map((p) => p.sha), sha: found.sha };
94
+ },
95
+ pr: async (ref) => githubPrState(await rawPr(ref), ref.number),
96
+ prForBranch: async (repo, branch) => {
97
+ const head = encodeURIComponent(`${repo.owner}:${branch}`);
98
+ const [found] = z.array(pull).parse(await gh.api(`${base(repo)}/pulls?head=${head}&state=all&per_page=1`));
99
+ if (!found)
100
+ return null;
101
+ const state = githubPrState(found, found.number ?? 0);
102
+ return {
103
+ autoMerge: state.autoMerge.armed,
104
+ base: state.base,
105
+ mergeCommit: state.mergeCommit,
106
+ mergeStrategy: null,
107
+ number: state.number,
108
+ state: state.state,
109
+ title: state.title,
110
+ url: state.url,
111
+ };
112
+ },
113
+ read: async (ref, { notePrefixes }) => {
114
+ const raw = await rawPr(ref);
115
+ const state = githubPrState(raw, ref.number);
116
+ if (state.state !== 'open')
117
+ return { ...state, branchTip: null, checks: [], reviews: [], threads: [] };
118
+ const checks = await checksAt(ref.repo, raw.head.sha);
119
+ const reviews = await rawReviews(ref);
120
+ const threads = await threadsOf(ref, notePrefixes, { reviews });
121
+ return { ...state, branchTip: null, checks, reviews: githubReviews(reviews), threads };
122
+ },
123
+ reviews: async (ref) => githubReviews(await rawReviews(ref)),
124
+ threads: async (ref, { notePrefixes, since }) => threadsOf(ref, notePrefixes, { since }),
125
+ };
126
+ }
127
+ export function githubPrState(pr, number) {
128
+ const merged = Boolean(pr.merged || pr.merged_at);
129
+ return {
130
+ autoMerge: { armed: Boolean(pr.auto_merge), by: pr.auto_merge?.enabled_by?.login ?? null },
131
+ base: pr.base?.ref ?? null,
132
+ head: pr.head.ref ?? null,
133
+ merge: pr.mergeable_state === 'dirty' ? 'conflicts' : pr.mergeable === true ? 'clean' : 'pending',
134
+ mergeCommit: merged ? (pr.merge_commit_sha ?? null) : null,
135
+ mergeFailure: null,
136
+ number: pr.number ?? number,
137
+ sourceCommit: pr.head.sha,
138
+ state: merged ? 'merged' : pr.state === 'closed' ? 'closed' : 'open',
139
+ title: pr.title ?? '',
140
+ url: pr.html_url ?? '',
141
+ };
142
+ }
143
+ // A person's latest review decides their vote, as GitHub counts it; a bot's doesn't count.
144
+ export function githubReviews(reviews) {
145
+ const latest = new Map();
146
+ for (const r of reviews) {
147
+ if (!r.user || r.user.type === 'Bot' || !['APPROVED', 'CHANGES_REQUESTED', 'DISMISSED'].includes(r.state))
148
+ continue;
149
+ const before = latest.get(r.user.login);
150
+ if (!before || Date.parse(r.submitted_at ?? '') >= Date.parse(before.submitted_at ?? ''))
151
+ latest.set(r.user.login, r);
152
+ }
153
+ return [...latest.values()].map((r) => ({
154
+ at: r.submitted_at ?? null,
155
+ by: r.user?.login ?? null,
156
+ verdict: r.state === 'APPROVED' ? 'approved' : r.state === 'CHANGES_REQUESTED' ? 'changes-requested' : 'none',
157
+ }));
158
+ }
159
+ // GitHub has no review threads: each comment, inline comment and submitted review is one, in that
160
+ // order. Nothing resolves them, so a person's comment stays open until a note comes after it.
161
+ export function githubThreads({ comments, reviewComments, reviews, }, notePrefixes) {
162
+ const item = (kind, c, at, extra = {}) => ({
163
+ asks: true,
164
+ at,
165
+ by: c.user?.login ?? null,
166
+ byPerson: c.user?.type !== 'Bot' && !isNote(c.body, notePrefixes),
167
+ excerpt: (c.body ?? '').slice(0, 500),
168
+ file: null,
169
+ id: c.id ?? 0,
170
+ kind,
171
+ lastIsNote: isNote(c.body, notePrefixes),
172
+ line: null,
173
+ open: true,
174
+ url: c.html_url ?? null,
175
+ ...extra,
176
+ });
177
+ const all = [
178
+ ...comments.map((c) => item('comment', c, c.created_at)),
179
+ ...reviewComments.map((c) => item('review-comment', c, c.created_at, { file: c.path ?? null, line: c.line ?? null })),
180
+ ...reviews
181
+ .filter((r) => r.state !== 'PENDING')
182
+ .map((r) =>
183
+ // A review's own text asks for something only when it is a comment: an approval's text ("LGTM")
184
+ // doesn't, and a change request is a review verdict.
185
+ item('review', r, r.submitted_at ?? null, {
186
+ asks: r.state === 'COMMENTED' && Boolean((r.body ?? '').trim()),
187
+ reviewState: r.state,
188
+ })),
189
+ ];
190
+ // A time GitHub didn't give (or that doesn't parse) orders nothing: such a note is skipped, and such
191
+ // a comment is open only while no note has been written.
192
+ const time = (t) => Date.parse(t.at ?? '');
193
+ const lastNote = Math.max(-Infinity, ...all.filter((t) => t.lastIsNote && !Number.isNaN(time(t))).map(time));
194
+ return all.map((t) => ({ ...t, open: Number.isNaN(time(t)) ? lastNote === -Infinity : time(t) > lastNote }));
195
+ }
196
+ // The Actions run id in a check's details URL (…/actions/runs/<id>/job/<job>), or null.
197
+ function actionsRun(url) {
198
+ const id = /\/actions\/runs\/(\d+)/.exec(url ?? '')?.[1];
199
+ return id ? Number(id) : null;
200
+ }
201
+ //# sourceMappingURL=code-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-host.js","sourceRoot":"","sources":["../../../../src/lib/providers/github/code-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ // Conclusions that don't fail a check or an Actions run.
2
+ export const PASSING = new Set(['neutral', 'skipped', 'success']);
3
+ // The repo in "owner/repo" or a github.com URL (https or ssh, with or without .git), or null.
4
+ export function githubRepoRef(text) {
5
+ const value = (text ?? '').trim();
6
+ const match = /^(?:https:\/\/(?:[^@/]+@)?github\.com\/|git@github\.com:|ssh:\/\/git@github\.com\/)?([\w.-]+)\/([\w.-]+?)(?:\.git)?\/?$/.exec(value);
7
+ const [, owner, repo] = match ?? [];
8
+ if (!owner || !repo || /^\.+$/.test(owner) || /^\.+$/.test(repo))
9
+ return null;
10
+ return { host: 'github', owner, repo };
11
+ }
12
+ export function repoName(repo) {
13
+ return `${repo.owner}/${repo.repo}`;
14
+ }
15
+ //# sourceMappingURL=gh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh.js","sourceRoot":"","sources":["../../../../src/lib/providers/github/gh.ts"],"names":[],"mappings":"AAWA,yDAAyD;AACzD,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAElE,8FAA8F;AAC9F,MAAM,UAAU,aAAa,CAAC,IAA+B;IAC3D,MAAM,KAAK,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,KAAK,GACT,yHAAyH,CAAC,IAAI,CAC5H,KAAK,CACN,CAAC;IACJ,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAmB;IAC1C,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,15 @@
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";
4
+ export { adoPipelines, buildState, pendingApprovals } from "./ado/pipelines.js";
5
+ export { parseTrigger, triggerFires } from "./ado/trigger.js";
6
+ export { NotFound, ProviderError } from "./errors.js";
7
+ 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 { githubRepoRef, PASSING, repoName } from "./github/gh.js";
10
+ export { isNote, noteHeading } from "./notes.js";
11
+ export { NPM_REGISTRY, npmStage, parseStageLine } from "./npm/stage.js";
12
+ export { checksSettled, needsAnswer, prVerdict } from "./verdicts/pr.js";
13
+ export { answersTo, pipelinesNamed, releasedRuns, runsVerdict, SETTLE_MS, } from "./verdicts/runs.js";
14
+ export { stageVerdict } from "./verdicts/stage.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,EAEV,UAAU,EAEV,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,OAAO,EAEP,OAAO,EACP,QAAQ,EACR,iBAAiB,EAEjB,UAAU,EACV,SAAS,EAET,MAAM,EACN,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,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,GACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAW,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3E,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"}
@@ -0,0 +1,22 @@
1
+ export function isNote(body, notePrefixes) {
2
+ return noteHeading(body ?? '', notePrefixes) !== null;
3
+ }
4
+ // A `## <skill> · <Phase>[ · <kind>: <one line>]` note's heading under any of `notePrefixes`, or
5
+ // null when the body doesn't start with one. "Plan approved (via …)" reads as "Plan approved".
6
+ // Every comment a worker writes can carry the person's own identity, so this heading, not the
7
+ // author, is what tells a worker's note from a person's comment, on every tracker and code host.
8
+ export function noteHeading(body, notePrefixes) {
9
+ const first = body.split(/\r?\n/).find((line) => line.trim() !== '') ?? '';
10
+ const heading = first.replace(/^[#*\s]+/, '').replace(/[*\s]+$/, '');
11
+ const prefix = notePrefixes.find((p) => heading.startsWith(p));
12
+ if (prefix === undefined)
13
+ return null;
14
+ const rest = heading.slice(prefix.length);
15
+ const split = /^([^(·]+?) · (.+)$/.exec(rest);
16
+ const phase = (split?.[1] ?? rest.replace(/\s*\(.*\)$/, '')).trim();
17
+ if (!phase)
18
+ return null;
19
+ const kind = split?.[2] === undefined ? null : /^([a-z][a-z-]*):\s*(.*)$/.exec(split[2].trim());
20
+ return { kind: kind?.[1] ?? null, line: kind ? kind[2]?.trim() || null : null, phase };
21
+ }
22
+ //# sourceMappingURL=notes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.js","sourceRoot":"","sources":["../../../src/lib/providers/notes.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,MAAM,CAAC,IAA+B,EAAE,YAA+B;IACrF,OAAO,WAAW,CAAC,IAAI,IAAI,EAAE,EAAE,YAAY,CAAC,KAAK,IAAI,CAAC;AACxD,CAAC;AAED,iGAAiG;AACjG,+FAA+F;AAC/F,8FAA8F;AAC9F,iGAAiG;AACjG,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,YAA+B;IACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;IAC3E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AACzF,CAAC"}
@@ -0,0 +1,62 @@
1
+ export const NPM_REGISTRY = 'https://registry.npmjs.org';
2
+ // npm's staged publishing: what a release run staged (its logs, newest first, through its CI), and
3
+ // whether a version is on the registry yet. After an approve, the registry can answer 404 for 15 s
4
+ // or more (ATK-225), so a false here isn't final.
5
+ export function npmStage({ ci, fetch: fetcher = globalThis.fetch, registry = NPM_REGISTRY, }) {
6
+ return {
7
+ published: async (pkg, version) => {
8
+ try {
9
+ const response = await fetcher(`${registry}/${pkg.replace('/', '%2f')}/${encodeURIComponent(version)}`, {
10
+ cache: 'no-store',
11
+ headers: { accept: 'application/json' },
12
+ signal: AbortSignal.timeout(20_000),
13
+ });
14
+ await response.body?.cancel();
15
+ if (response.status === 200)
16
+ return true;
17
+ return response.status === 404 ? false : null;
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ },
23
+ staged: async (run) => {
24
+ for await (const text of ci.logs(run)) {
25
+ const stage = parseStageLine(text);
26
+ if (stage)
27
+ return stage;
28
+ }
29
+ return null;
30
+ },
31
+ };
32
+ }
33
+ // The stage line `npm stage publish` prints, in a run log. The release script's own source also
34
+ // contains "staged with id", so only real output lines match.
35
+ //
36
+ // A release run builds the base branch as it is when the job starts, so an earlier run can release
37
+ // and stage a merge before the merge's own run starts. Once that stage is approved, the merge's run
38
+ // prints "<package>@<version> is already published", with no stage of its own. A merge with no
39
+ // releasable commits prints the same line for the previous version, so the note says how to tell.
40
+ export function parseStageLine(text) {
41
+ const log = text ?? '';
42
+ const fresh = /\+ (@[\w.-]+\/[\w.-]+)@(\S+) \(staged with id ([0-9a-f-]{36})\)/.exec(log);
43
+ const match = fresh ?? /(@[\w.-]+\/[\w.-]+)@(\S+) is already staged with id ([0-9a-f-]{36})\./.exec(log);
44
+ if (match?.[1] && match[2] && match[3]) {
45
+ return {
46
+ approve: `npm stage approve ${match[3]} --otp=<code>`,
47
+ package: match[1],
48
+ stageId: match[3],
49
+ version: match[2],
50
+ };
51
+ }
52
+ const published = /(@[\w.-]+\/[\w.-]+)@(\S+) is already published; nothing to stage\./.exec(log);
53
+ if (!published?.[1] || !published[2])
54
+ return null;
55
+ return {
56
+ note: 'already on npm when this run reached its stage step, so nothing to approve. It carries the merge only when a release tag of this version contains it (git tag --contains <merge>): an earlier run built the merge',
57
+ package: published[1],
58
+ stageId: null,
59
+ version: published[2],
60
+ };
61
+ }
62
+ //# sourceMappingURL=stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage.js","sourceRoot":"","sources":["../../../../src/lib/providers/npm/stage.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAEzD,mGAAmG;AACnG,mGAAmG;AACnG,kDAAkD;AAClD,MAAM,UAAU,QAAQ,CAAoB,EAC1C,EAAE,EACF,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC,KAAK,EACjC,QAAQ,GAAG,YAAY,GAKxB;IACC,OAAO;QACL,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;YAChC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE;oBACtG,KAAK,EAAE,UAAU;oBACjB,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;oBACvC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;iBACpC,CAAC,CAAC;gBACH,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;gBAC9B,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;oBAAE,OAAO,IAAI,CAAC;gBACzC,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACpB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAC;YAC1B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,8DAA8D;AAC9D,EAAE;AACF,mGAAmG;AACnG,oGAAoG;AACpG,+FAA+F;AAC/F,kGAAkG;AAClG,MAAM,UAAU,cAAc,CAAC,IAA+B;IAC5D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,iEAAiE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,KAAK,IAAI,uEAAuE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,qBAAqB,KAAK,CAAC,CAAC,CAAC,eAAe;YACrD,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YACjB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YACjB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;SAClB,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,oEAAoE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO;QACL,IAAI,EAAE,mNAAmN;QACzN,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QACrB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ // GENERATED from packages/providers by `pnpm sync-conductor`. Do not edit.
2
+ // The four axes a conducted project mixes (design note "Conductor: providers and daemon-side
3
+ // writes", sections 2 and 3): a tracker for items, a code host for git and PRs, a CI for the runs a
4
+ // merge starts, and a release for what those runs stage. Each axis is an interface with one adapter
5
+ // per provider, every adapter normalizes its host's answers into the snapshots below, and the
6
+ // verdicts (verdicts/) read only the snapshots. This step has the reads; the writes come later.
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +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,gGAAgG"}