@detergent-software/conductor 1.0.0-dev.9 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +298 -0
- package/README.md +277 -24
- package/build/brief-cli.js +68 -0
- package/build/brief-cli.js.map +1 -0
- package/build/brief.js +211 -0
- package/build/brief.js.map +1 -0
- package/build/broker-cli.js +126 -0
- package/build/broker-cli.js.map +1 -0
- package/build/broker.js +154 -0
- package/build/broker.js.map +1 -0
- package/build/cli.js +438 -132
- package/build/cli.js.map +1 -1
- package/build/conditions.js +15 -8
- package/build/conditions.js.map +1 -1
- package/build/config.js +26 -3
- package/build/config.js.map +1 -1
- package/build/console.js +176 -0
- package/build/console.js.map +1 -0
- package/build/daemon.js +136 -5
- package/build/daemon.js.map +1 -1
- package/build/events.js +2 -1
- package/build/events.js.map +1 -1
- package/build/help.js +447 -0
- package/build/help.js.map +1 -0
- package/build/history.js +637 -0
- package/build/history.js.map +1 -0
- package/build/inbox.js +117 -18
- package/build/inbox.js.map +1 -1
- package/build/manager.js +118 -43
- package/build/manager.js.map +1 -1
- package/build/notes.js +27 -43
- package/build/notes.js.map +1 -1
- package/build/notify.js +32 -3
- package/build/notify.js.map +1 -1
- package/build/overrides.js +83 -0
- package/build/overrides.js.map +1 -0
- package/build/paths.js +10 -1
- package/build/paths.js.map +1 -1
- package/build/profile.js +68 -2
- package/build/profile.js.map +1 -1
- package/build/queue.js +183 -0
- package/build/queue.js.map +1 -0
- package/build/registry.js +17 -10
- package/build/registry.js.map +1 -1
- package/build/rule-actions.js +444 -0
- package/build/rule-actions.js.map +1 -0
- package/build/rule-input.js +17 -0
- package/build/rule-input.js.map +1 -0
- package/build/rules-service.js +402 -0
- package/build/rules-service.js.map +1 -0
- package/build/rules.js +850 -0
- package/build/rules.js.map +1 -0
- package/build/scheduler.js +293 -0
- package/build/scheduler.js.map +1 -0
- package/build/serve.js +51 -0
- package/build/serve.js.map +1 -0
- package/build/server.js +230 -7
- package/build/server.js.map +1 -1
- package/build/spend.js +42 -0
- package/build/spend.js.map +1 -1
- package/build/store.js +266 -12
- package/build/store.js.map +1 -1
- package/build/trackers.js +15 -0
- package/build/trackers.js.map +1 -0
- package/build/upgrade.js +16 -14
- package/build/upgrade.js.map +1 -1
- package/build/wait.js +3 -9
- package/build/wait.js.map +1 -1
- package/build/watchers/ado-api.js +55 -0
- package/build/watchers/ado-api.js.map +1 -0
- package/build/watchers/ado.js +60 -52
- package/build/watchers/ado.js.map +1 -1
- package/build/watchers/boards-brief.js +63 -0
- package/build/watchers/boards-brief.js.map +1 -0
- package/build/watchers/boards-queue.js +120 -0
- package/build/watchers/boards-queue.js.map +1 -0
- package/build/watchers/boards-writes.js +83 -0
- package/build/watchers/boards-writes.js.map +1 -0
- package/build/watchers/boards.js +271 -0
- package/build/watchers/boards.js.map +1 -0
- package/build/watchers/conflicts.js +132 -0
- package/build/watchers/conflicts.js.map +1 -0
- package/build/watchers/github.js +5 -2
- package/build/watchers/github.js.map +1 -1
- package/build/watchers/index.js +21 -7
- package/build/watchers/index.js.map +1 -1
- package/build/watchers/linear-api.js +55 -0
- package/build/watchers/linear-api.js.map +1 -0
- package/build/watchers/linear-labels.js +43 -0
- package/build/watchers/linear-labels.js.map +1 -0
- package/build/watchers/linear-queue.js +96 -0
- package/build/watchers/linear-queue.js.map +1 -0
- package/build/watchers/linear.js +18 -16
- package/build/watchers/linear.js.map +1 -1
- package/build/watchers/source.js +3 -3
- package/build/watchers/source.js.map +1 -1
- package/build/why.js +78 -0
- package/build/why.js.map +1 -0
- package/mod/.claude-plugin/plugin.json +1 -1
- package/mod/README.md +2 -2
- package/mod/hooks/model.ts +135 -8
- package/mod/hooks/register.tsx +219 -19
- package/mod/types/index.d.ts +6 -0
- package/package.json +1 -1
package/build/upgrade.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../src/upgrade.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../src/upgrade.ts"],"names":[],"mappings":"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"}
|
package/build/wait.js
CHANGED
|
@@ -6,7 +6,8 @@ import { formatCondition, fromVerbs, sourceOf } from "./conditions.js";
|
|
|
6
6
|
import { loadConfig } from "./config.js";
|
|
7
7
|
import { ConductorError } from "./errors.js";
|
|
8
8
|
import { fleetWorkerSchema } from "./manager.js";
|
|
9
|
-
import {
|
|
9
|
+
import { samePath } from "./paths.js";
|
|
10
|
+
import { PROFILE_FILE, readProfile, trackerKey } from "./profile.js";
|
|
10
11
|
import { run } from "./run.js";
|
|
11
12
|
import { projectSchema, waitSchema } from "./store.js";
|
|
12
13
|
import { waitLocally } from "./watchers/index.js";
|
|
@@ -118,7 +119,7 @@ function itemOf(checkout, profile) {
|
|
|
118
119
|
const name = basename(checkout);
|
|
119
120
|
if (/^[A-Za-z]+-\d+$/.test(name))
|
|
120
121
|
return name.toUpperCase();
|
|
121
|
-
const team = profile
|
|
122
|
+
const team = profile ? trackerKey(profile) : undefined;
|
|
122
123
|
return team ? (new RegExp(`(?:^|[/_-])(${team}-\\d+)(?:$|[/_-])`, 'i').exec(name)?.[1]?.toUpperCase() ?? null) : null;
|
|
123
124
|
}
|
|
124
125
|
// How often and how hard a local wait may ask: the watchers' settings for its source.
|
|
@@ -139,11 +140,4 @@ async function registeredProfile(paths, project) {
|
|
|
139
140
|
return null;
|
|
140
141
|
return projectsBody.parse(body).projects.find((p) => p.name === project)?.profile ?? null;
|
|
141
142
|
}
|
|
142
|
-
function samePath(a, b) {
|
|
143
|
-
const norm = (p) => {
|
|
144
|
-
const full = resolve(p);
|
|
145
|
-
return process.platform === 'win32' ? full.toLowerCase() : full;
|
|
146
|
-
};
|
|
147
|
-
return norm(a) === norm(b);
|
|
148
|
-
}
|
|
149
143
|
//# sourceMappingURL=wait.js.map
|
package/build/wait.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../src/wait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../src/wait.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ConductorError } from "../errors.js";
|
|
2
|
+
import { outputOf, run } from "../run.js";
|
|
3
|
+
// Azure DevOps' resource id, for `az account get-access-token`.
|
|
4
|
+
const ADO_RESOURCE = '499b84ac-1321-427f-aa17-267ca6975798';
|
|
5
|
+
// An az token lasts about an hour; a fresh one well before that.
|
|
6
|
+
const TOKEN_MAX_AGE_MS = 20 * 60_000;
|
|
7
|
+
const TIMEOUT_MS = 20_000;
|
|
8
|
+
// One request to Azure DevOps with the az token, tried again once with a renewed token when ADO
|
|
9
|
+
// refuses it: 401, or 203, its sign-in page for a token it doesn't take. Throws only when fetch
|
|
10
|
+
// does (network, timeout); every status is the caller's to read.
|
|
11
|
+
export async function adoRequest(fetcher, token, url, { body, contentType = 'application/json', method = 'GET', onRetry } = {}) {
|
|
12
|
+
for (let renewed = false;; renewed = true) {
|
|
13
|
+
const response = await fetcher(url, {
|
|
14
|
+
...(body === undefined ? {} : { body: JSON.stringify(body) }),
|
|
15
|
+
cache: 'no-store',
|
|
16
|
+
headers: { authorization: `Bearer ${await token(renewed)}`, ...(body === undefined ? {} : { 'content-type': contentType }) },
|
|
17
|
+
method,
|
|
18
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
19
|
+
});
|
|
20
|
+
if ((response.status === 401 || response.status === 203) && !renewed) {
|
|
21
|
+
onRetry?.();
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const text = await response.text();
|
|
25
|
+
let parsed = null;
|
|
26
|
+
try {
|
|
27
|
+
parsed = text ? JSON.parse(text) : null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
parsed = null;
|
|
31
|
+
}
|
|
32
|
+
return { body: parsed, status: response.status };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// The az CLI's token for Azure DevOps, kept for 20 minutes and renewed on a 401. `az` is a .cmd on
|
|
36
|
+
// Windows, so it runs through a shell; its arguments are constants.
|
|
37
|
+
export function azToken({ now = Date.now } = {}) {
|
|
38
|
+
let cached = null;
|
|
39
|
+
return async (fresh) => {
|
|
40
|
+
if (!fresh && cached && now() - cached.at < TOKEN_MAX_AGE_MS)
|
|
41
|
+
return cached.value;
|
|
42
|
+
const result = await run('az', ['account', 'get-access-token', '--resource', ADO_RESOURCE, '--query', 'accessToken', '-o', 'tsv'], {
|
|
43
|
+
shell: process.platform === 'win32',
|
|
44
|
+
timeoutMs: 60_000,
|
|
45
|
+
});
|
|
46
|
+
const value = result.stdout.trim();
|
|
47
|
+
// A ConductorError: a local wait can't go on without it, so it stops there (the daemon backs off).
|
|
48
|
+
if (result.code !== 0 || !value) {
|
|
49
|
+
throw new ConductorError('az account get-access-token failed', ['run az login', outputOf(result, 300)]);
|
|
50
|
+
}
|
|
51
|
+
cached = { at: now(), value };
|
|
52
|
+
return value;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=ado-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ado-api.js","sourceRoot":"","sources":["../../src/watchers/ado-api.ts"],"names":[],"mappings":"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"}
|
package/build/watchers/ado.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const TOKEN_MAX_AGE_MS = 20 * 60_000;
|
|
2
|
+
import { notePrefixes } from "../profile.js";
|
|
3
|
+
import { adoRequest, azToken } from "./ado-api.js";
|
|
4
|
+
import { boardsWaits } from "./boards.js";
|
|
5
|
+
import { noteHeading } from "./linear.js";
|
|
6
|
+
import { perPass, perWait, spend, untilSpent, WaitProblem } from "./source.js";
|
|
7
|
+
export { azToken } from "./ado-api.js";
|
|
9
8
|
const pullRequest = z.looseObject({
|
|
10
9
|
autoCompleteSetBy: z.unknown().optional(),
|
|
11
10
|
lastMergeSourceCommit: z.looseObject({ commitId: z.string() }).optional(),
|
|
11
|
+
mergeStatus: z.string().optional(),
|
|
12
12
|
pullRequestId: z.number(),
|
|
13
13
|
repository: z.looseObject({ project: z.looseObject({ id: z.string() }) }),
|
|
14
14
|
status: z.string(),
|
|
15
|
+
targetRefName: z.string().optional(),
|
|
15
16
|
});
|
|
16
17
|
const evaluation = z.looseObject({
|
|
17
18
|
configuration: z
|
|
@@ -42,28 +43,24 @@ const thread = z.looseObject({
|
|
|
42
43
|
});
|
|
43
44
|
const build = z.looseObject({ result: z.string().nullish(), status: z.string() });
|
|
44
45
|
const list = (item) => z.looseObject({ value: z.array(item) });
|
|
45
|
-
// ADO PRs (merged, checks, comment) and pipeline runs (done), over REST
|
|
46
|
-
//
|
|
47
|
-
//
|
|
46
|
+
// ADO PRs (merged, checks, comment) and pipeline runs (done), over REST, and the waits on ADO Boards
|
|
47
|
+
// items (approval, item), so all of them share one budget. The organization and project come from
|
|
48
|
+
// the waiting worker's profile. A pass reads each PR once, and its evaluations and threads only
|
|
49
|
+
// when a wait needs them. A PR wait whose condition doesn't hold yet reports the PR's merge state,
|
|
50
|
+
// so a conflict with the base branch, which no build runs on, can wake its worker (conflicts.ts).
|
|
48
51
|
export function adoSource({ fetch: fetcher = globalThis.fetch, token = azToken() } = {}) {
|
|
49
52
|
// The first try's request was taken from the budget by the caller; a retry with a renewed token
|
|
50
53
|
// takes one more.
|
|
51
54
|
const get = async (budget, base, path, version = '7.1') => {
|
|
52
55
|
const url = `${base}/_apis/${path}${path.includes('?') ? '&' : '?'}api-version=${version}`;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
if (status === 404 || status === 400)
|
|
61
|
-
throw new WaitProblem(`Azure DevOps answered ${status} for ${path}`);
|
|
62
|
-
if (status !== 200)
|
|
63
|
-
throw new Error(`Azure DevOps answered ${status} for ${path}`);
|
|
64
|
-
return body;
|
|
65
|
-
}
|
|
56
|
+
const { body, status } = await adoRequest(fetcher, token, url, { onRetry: () => spend(budget) });
|
|
57
|
+
if (status === 404 || status === 400)
|
|
58
|
+
throw new WaitProblem(`Azure DevOps answered ${status} for ${path}`);
|
|
59
|
+
if (status !== 200)
|
|
60
|
+
throw new Error(`Azure DevOps answered ${status} for ${path}`);
|
|
61
|
+
return body;
|
|
66
62
|
};
|
|
63
|
+
const boards = boardsWaits({ fetch: fetcher, token });
|
|
67
64
|
return {
|
|
68
65
|
check: async (waits, budget) => {
|
|
69
66
|
const outcomes = new Map();
|
|
@@ -86,45 +83,45 @@ export function adoSource({ fetch: fetcher = globalThis.fetch, token = azToken()
|
|
|
86
83
|
return `pr ${c.number} merged`;
|
|
87
84
|
if (pr.status === 'abandoned')
|
|
88
85
|
return `pr ${c.number} abandoned`;
|
|
86
|
+
const merge = mergeOf(pr);
|
|
87
|
+
const found = (resolution) => resolution === null ? (merge === null ? null : { merge }) : { resolution, ...(merge === null ? {} : { merge }) };
|
|
89
88
|
if (c.on === 'merged')
|
|
90
|
-
return null;
|
|
89
|
+
return found(null);
|
|
91
90
|
if (c.on === 'checks') {
|
|
91
|
+
// No build runs on a conflicted PR, so its evaluations can only be stale: not asked.
|
|
92
|
+
if (merge?.conflicts)
|
|
93
|
+
return found(null);
|
|
92
94
|
const artifact = `vstfs:///CodeReview/CodeReviewId/${pr.repository.project.id}/${pr.pullRequestId}`;
|
|
93
95
|
const { value } = list(evaluation).parse(await once(base, `policy/evaluations?artifactId=${encodeURIComponent(artifact)}`, '7.1-preview.1'));
|
|
94
96
|
const verdict = checksVerdict(pr, value);
|
|
95
|
-
return verdict === null ? null : `pr ${c.number} ${verdict}
|
|
97
|
+
return found(verdict === null ? null : `pr ${c.number} ${verdict}`);
|
|
96
98
|
}
|
|
97
99
|
const { value } = list(thread).parse(await once(base, `git/repositories/${repo}/pullRequests/${c.number}/threads`));
|
|
98
|
-
const open = openReviewThreads(value,
|
|
99
|
-
return open.length > 0 ? `pr ${c.number} comment: ${open.length} open thread${open.length === 1 ? '' : 's'}` : null;
|
|
100
|
+
const open = openReviewThreads(value, notePrefixes(wait.profile));
|
|
101
|
+
return found(open.length > 0 ? `pr ${c.number} comment: ${open.length} open thread${open.length === 1 ? '' : 's'}` : null);
|
|
100
102
|
});
|
|
101
103
|
}
|
|
102
104
|
});
|
|
105
|
+
try {
|
|
106
|
+
await untilSpent(() => boards.check(waits, budget, outcomes));
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
// A Boards failure (ADO throttling it, a 5xx) mustn't throw away this pass's PR and run
|
|
110
|
+
// outcomes or back them off: with any of them here, it is the Boards waits' problem this pass,
|
|
111
|
+
// and they stay open. Alone, the source fails and backs off as for any API.
|
|
112
|
+
const boardWait = (w) => (w.condition.kind === 'approval' || w.condition.kind === 'item') && w.condition.tracker === 'ado-boards';
|
|
113
|
+
if (waits.every(boardWait))
|
|
114
|
+
throw error;
|
|
115
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
116
|
+
for (const wait of waits)
|
|
117
|
+
if (boardWait(wait) && !outcomes.has(wait.id))
|
|
118
|
+
outcomes.set(wait.id, { error: message });
|
|
119
|
+
}
|
|
103
120
|
return outcomes;
|
|
104
121
|
},
|
|
105
122
|
name: 'ado',
|
|
106
123
|
};
|
|
107
124
|
}
|
|
108
|
-
// The az CLI's token for Azure DevOps, kept for 20 minutes and renewed on a 401. `az` is a .cmd on
|
|
109
|
-
// Windows, so it runs through a shell; its arguments are constants.
|
|
110
|
-
export function azToken({ now = Date.now } = {}) {
|
|
111
|
-
let cached = null;
|
|
112
|
-
return async (fresh) => {
|
|
113
|
-
if (!fresh && cached && now() - cached.at < TOKEN_MAX_AGE_MS)
|
|
114
|
-
return cached.value;
|
|
115
|
-
const result = await run('az', ['account', 'get-access-token', '--resource', ADO_RESOURCE, '--query', 'accessToken', '-o', 'tsv'], {
|
|
116
|
-
shell: process.platform === 'win32',
|
|
117
|
-
timeoutMs: 60_000,
|
|
118
|
-
});
|
|
119
|
-
const value = result.stdout.trim();
|
|
120
|
-
// A ConductorError: a local wait can't go on without it, so it stops there (the daemon backs off).
|
|
121
|
-
if (result.code !== 0 || !value) {
|
|
122
|
-
throw new ConductorError('az account get-access-token failed', ['run az login', outputOf(result, 300)]);
|
|
123
|
-
}
|
|
124
|
-
cached = { at: now(), value };
|
|
125
|
-
return value;
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
125
|
// The PR's blocking builds as one verdict once none of them runs, or null while one does (or none
|
|
129
126
|
// has been evaluated yet). A path-filtered build the PR doesn't touch is `notApplicable`, which
|
|
130
127
|
// passes, as `land` reads it. Right after a push an evaluation can still describe the previous commit.
|
|
@@ -144,18 +141,29 @@ export function checksVerdict(pr, evaluations) {
|
|
|
144
141
|
const failed = live.filter((e) => e.status === 'rejected' || e.status === 'broken').map((e) => e.context?.buildDefinitionName ?? 'a build');
|
|
145
142
|
return failed.length > 0 ? `checks failed: ${failed.join(', ')}` : 'checks passed';
|
|
146
143
|
}
|
|
144
|
+
// An open PR's merge state, from what ADO last worked out: `conflicts`, or `succeeded` for a clean
|
|
145
|
+
// merge. Null while it works one out (`queued`, `notSet`), for a failure that isn't a conflict, or
|
|
146
|
+
// with no target branch to name in the wake's `git merge`.
|
|
147
|
+
export function mergeOf(pr) {
|
|
148
|
+
if ((pr.mergeStatus !== 'conflicts' && pr.mergeStatus !== 'succeeded') || !pr.targetRefName)
|
|
149
|
+
return null;
|
|
150
|
+
return {
|
|
151
|
+
base: pr.targetRefName.replace(/^refs\/heads\//, ''),
|
|
152
|
+
commit: pr.lastMergeSourceCommit?.commitId ?? null,
|
|
153
|
+
conflicts: pr.mergeStatus === 'conflicts',
|
|
154
|
+
};
|
|
155
|
+
}
|
|
147
156
|
// Threads a person opened (not a system update) that are still open and whose last word isn't a
|
|
148
157
|
// work-skill note: what a worker has to answer. Every comment here can carry the same identity, so
|
|
149
|
-
//
|
|
150
|
-
// the same way).
|
|
151
|
-
export function openReviewThreads(threads,
|
|
158
|
+
// a note heading (`noteHeading`, under any of `notePrefixes`), not the author, marks the
|
|
159
|
+
// worker's own (the work skill's `land` reads them the same way).
|
|
160
|
+
export function openReviewThreads(threads, notePrefixes) {
|
|
152
161
|
const done = new Set(['byDesign', 'closed', 'fixed', 'wontFix']);
|
|
153
162
|
return threads
|
|
154
163
|
.filter((t) => !t.isDeleted && !done.has(t.status ?? '') && !t.properties?.CodeReviewThreadType)
|
|
155
164
|
.filter((t) => {
|
|
156
165
|
const comments = (t.comments ?? []).filter((c) => !c.isDeleted && c.commentType !== 'system');
|
|
157
|
-
|
|
158
|
-
return comments.length > 0 && !last.replace(/^[#*\s]+/, '').startsWith(notePrefix);
|
|
166
|
+
return comments.length > 0 && noteHeading(comments.at(-1)?.content ?? '', notePrefixes) === null;
|
|
159
167
|
})
|
|
160
168
|
.map((t) => t.id);
|
|
161
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ado.js","sourceRoot":"","sources":["../../src/watchers/ado.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"ado.js","sourceRoot":"","sources":["../../src/watchers/ado.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { BriefError } from "../brief.js";
|
|
2
|
+
import { areaOfPath } from "./boards-queue.js";
|
|
3
|
+
import { boardsAsk, htmlText, readComments, readViewer, readWorkItems, requireBoard, stateType, tagsOf, workItemId } from "./boards.js";
|
|
4
|
+
const LINKS = new Map([
|
|
5
|
+
['System.LinkTypes.Dependency-Forward', 'blocks'],
|
|
6
|
+
['System.LinkTypes.Dependency-Reverse', 'blockedBy'],
|
|
7
|
+
['System.LinkTypes.Related', 'related'],
|
|
8
|
+
]);
|
|
9
|
+
const LINKED_FIELDS = ['System.Id', 'System.Title', 'System.State'];
|
|
10
|
+
export function boardsBriefs(options = {}) {
|
|
11
|
+
// The az login's identity by organization: it doesn't change while the daemon runs.
|
|
12
|
+
const viewers = new Map();
|
|
13
|
+
return {
|
|
14
|
+
read: async (item, profile) => {
|
|
15
|
+
const board = requireBoard(profile);
|
|
16
|
+
const id = workItemId(item, board);
|
|
17
|
+
if (id === null)
|
|
18
|
+
throw new BriefError(`${item} isn't an item of the board keyed ${board.key}`, 'missing');
|
|
19
|
+
const ask = boardsAsk(options, board, null);
|
|
20
|
+
const [found] = await readWorkItems(ask, [id], { relations: true });
|
|
21
|
+
if (!found)
|
|
22
|
+
throw new BriefError(`Azure DevOps Boards has no work item ${id} (${item})`, 'missing');
|
|
23
|
+
const links = linksOf(found);
|
|
24
|
+
const [read, comments, viewer] = await Promise.all([
|
|
25
|
+
readWorkItems(ask, [...new Set(links.map((l) => l.id))], { fields: LINKED_FIELDS }),
|
|
26
|
+
readComments(ask, id),
|
|
27
|
+
viewers.get(board.organization) ?? readViewer(ask),
|
|
28
|
+
]);
|
|
29
|
+
viewers.set(board.organization, viewer);
|
|
30
|
+
const linked = new Map(read.map((w) => [w.id, w]));
|
|
31
|
+
const linksAs = (kind) => links.filter((l) => l.kind === kind).map(({ id: to }) => {
|
|
32
|
+
const w = linked.get(to);
|
|
33
|
+
return { id: `${board.key}-${to}`, status: w ? text(w.fields['System.State']) : null, title: w ? text(w.fields['System.Title']) : null };
|
|
34
|
+
});
|
|
35
|
+
const state = String(found.fields['System.State'] ?? '');
|
|
36
|
+
return {
|
|
37
|
+
area: areaOfPath(String(found.fields['System.AreaPath'] ?? ''), board.areaRoot),
|
|
38
|
+
blockedBy: linksAs('blockedBy'),
|
|
39
|
+
blocks: linksAs('blocks'),
|
|
40
|
+
comments,
|
|
41
|
+
description: htmlText(String(found.fields['System.Description'] ?? '')).trim(),
|
|
42
|
+
labels: tagsOf(found.fields['System.Tags']),
|
|
43
|
+
related: linksAs('related'),
|
|
44
|
+
status: { name: state, type: stateType(state, board) },
|
|
45
|
+
title: String(found.fields['System.Title'] ?? ''),
|
|
46
|
+
trackerProject: null,
|
|
47
|
+
url: `${board.base}/_workitems/edit/${id}`,
|
|
48
|
+
viewer,
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function linksOf(w) {
|
|
54
|
+
return (w.relations ?? []).flatMap((r) => {
|
|
55
|
+
const kind = LINKS.get(r.rel);
|
|
56
|
+
const id = /\/workItems\/(\d+)$/i.exec(r.url)?.[1];
|
|
57
|
+
return kind && id ? [{ id: Number(id), kind }] : [];
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function text(value) {
|
|
61
|
+
return typeof value === 'string' ? value : null;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=boards-brief.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boards-brief.js","sourceRoot":"","sources":["../../src/watchers/boards-brief.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ConductorError } from "../errors.js";
|
|
3
|
+
import { boardsAsk, CLOSED_TYPES, expectOk, OPEN_TYPES, readWorkItems, requireBoard, stateType, tagsOf, workItemId } from "./boards.js";
|
|
4
|
+
// The scheduler's read of an ADO Boards queue (design note, section 12): the saved query the
|
|
5
|
+
// profile names is the conducted queue, in its own order (by default Priority, then Backlog
|
|
6
|
+
// Priority). Its items, the in-flight ones and their open Predecessors are read in batches.
|
|
7
|
+
// "B has Predecessor A" is stored on B as a Dependency-Reverse link to A.
|
|
8
|
+
const PREDECESSOR = 'System.LinkTypes.Dependency-Reverse';
|
|
9
|
+
const savedQuery = z.looseObject({ id: z.string(), isFolder: z.boolean().optional(), name: z.string() });
|
|
10
|
+
const queryRun = z.looseObject({ queryType: z.string(), workItems: z.array(z.looseObject({ id: z.number() })).nullish() });
|
|
11
|
+
// The Area of an Area Path: its path below the root, with `/` between levels (as an Area label
|
|
12
|
+
// group's sub-Areas are written); null at the root. A path outside the root keeps all of it.
|
|
13
|
+
export function areaOfPath(path, root) {
|
|
14
|
+
const levels = (p) => p.split('\\').filter((l) => l !== '');
|
|
15
|
+
const mine = levels(path);
|
|
16
|
+
const top = levels(root);
|
|
17
|
+
const below = top.every((l, i) => mine[i]?.toLowerCase() === l.toLowerCase()) ? mine.slice(top.length) : mine;
|
|
18
|
+
return below.length > 0 ? below.join('/') : null;
|
|
19
|
+
}
|
|
20
|
+
export function boardsQueue(options = {}) {
|
|
21
|
+
// A saved query's id and name, by board and the profile's path or id.
|
|
22
|
+
const queries = new Map();
|
|
23
|
+
const findQuery = async (ask, board) => {
|
|
24
|
+
const key = `${board.base} ${board.query}`;
|
|
25
|
+
const known = queries.get(key);
|
|
26
|
+
if (known)
|
|
27
|
+
return known;
|
|
28
|
+
const answer = await ask(`wit/queries/${encodeURIComponent(board.query)}`);
|
|
29
|
+
if (answer.status === 404)
|
|
30
|
+
throw new ConductorError(`Azure DevOps Boards has no saved query "${board.query}" in ${board.project}`);
|
|
31
|
+
const query = savedQuery.parse(expectOk(answer, `the saved query "${board.query}"`));
|
|
32
|
+
if (query.isFolder)
|
|
33
|
+
throw new ConductorError(`"${board.query}" is a query folder: tracker.query names a saved query`);
|
|
34
|
+
queries.set(key, query);
|
|
35
|
+
return query;
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
read: async (profile, inFlight, budget) => {
|
|
39
|
+
const board = requireBoard(profile);
|
|
40
|
+
const ask = boardsAsk(options, board, budget);
|
|
41
|
+
const query = await findQuery(ask, board);
|
|
42
|
+
const answer = await ask(`wit/wiql/${query.id}`);
|
|
43
|
+
// A query deleted and saved again has a new id: look it up again next time.
|
|
44
|
+
if (answer.status === 404)
|
|
45
|
+
queries.delete(`${board.base} ${board.query}`);
|
|
46
|
+
const ran = queryRun.parse(expectOk(answer, `the saved query "${query.name}"`));
|
|
47
|
+
if (ran.queryType !== 'flat') {
|
|
48
|
+
throw new ConductorError(`the saved query "${query.name}" is a ${ran.queryType} query: the queue is a flat list of work items`);
|
|
49
|
+
}
|
|
50
|
+
const queued = (ran.workItems ?? []).map((w) => w.id);
|
|
51
|
+
const flying = inFlight.flatMap((item) => workItemId(item, board) ?? []);
|
|
52
|
+
const items = new Map();
|
|
53
|
+
const load = async (ids) => {
|
|
54
|
+
const missing = [...new Set(ids)].filter((id) => !items.has(id));
|
|
55
|
+
for (const w of await readWorkItems(ask, missing, { relations: true }))
|
|
56
|
+
items.set(w.id, w);
|
|
57
|
+
};
|
|
58
|
+
await load([...queued, ...flying]);
|
|
59
|
+
// A Predecessor outside the query still blocks an open item, so it is read too.
|
|
60
|
+
const open = [...items.values()].filter((w) => OPEN_TYPES.has(stateType(String(w.fields['System.State'] ?? ''), board)));
|
|
61
|
+
await load(open.flatMap(predecessors));
|
|
62
|
+
return boardsSnapshot(board, query.name, queued, flying, items);
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// The snapshot from the query's ids (in its order), the in-flight ids and every item read. Open
|
|
67
|
+
// query items are the queue, in one tracker project named after the query, as are in-flight items
|
|
68
|
+
// a query on state has dropped (so the project isn't read as ready to release while they're
|
|
69
|
+
// worked); an open Predecessor outside both is listed without a project, so it holds its Area and
|
|
70
|
+
// blocks.
|
|
71
|
+
export function boardsSnapshot(board, queryName, queued, flying, items) {
|
|
72
|
+
const type = (w) => stateType(String(w.fields['System.State'] ?? ''), board);
|
|
73
|
+
const open = new Set([...items.values()].filter((w) => OPEN_TYPES.has(type(w))).map((w) => w.id));
|
|
74
|
+
const rank = new Map(queued.map((id, i) => [id, i]));
|
|
75
|
+
const listed = [...new Set([...queued, ...items.keys()])].filter((id) => open.has(id));
|
|
76
|
+
const issues = listed.flatMap((id) => {
|
|
77
|
+
const w = items.get(id);
|
|
78
|
+
if (!w)
|
|
79
|
+
return [];
|
|
80
|
+
const priority = Number(w.fields['Microsoft.VSTS.Common.Priority']);
|
|
81
|
+
const inQuery = rank.has(id);
|
|
82
|
+
return [
|
|
83
|
+
{
|
|
84
|
+
area: areaOfPath(String(w.fields['System.AreaPath'] ?? ''), board.areaRoot),
|
|
85
|
+
blockedBy: predecessors(w)
|
|
86
|
+
.filter((p) => open.has(p))
|
|
87
|
+
.map((p) => keyOf(board, p)),
|
|
88
|
+
createdAt: typeof w.fields['System.CreatedDate'] === 'string' ? w.fields['System.CreatedDate'] : null,
|
|
89
|
+
id: keyOf(board, id),
|
|
90
|
+
// ADO tags ignore case and keep the org's spelling, so the human tag is spelt as the scheduler looks for it.
|
|
91
|
+
labels: tagsOf(w.fields['System.Tags']).map((t) => (t.toLowerCase() === board.humanLabel.toLowerCase() ? board.humanLabel : t)),
|
|
92
|
+
priority: Number.isInteger(priority) ? priority : null,
|
|
93
|
+
...(inQuery ? { rank: rank.get(id) } : {}),
|
|
94
|
+
stateType: type(w),
|
|
95
|
+
title: typeof w.fields['System.Title'] === 'string' ? w.fields['System.Title'] : null,
|
|
96
|
+
trackerProject: inQuery || flying.includes(id) ? queryName : null,
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
});
|
|
100
|
+
return {
|
|
101
|
+
areaLabels: [...new Set(issues.flatMap((i) => i.area ?? []))].sort(),
|
|
102
|
+
closed: flying.filter((id) => {
|
|
103
|
+
const w = items.get(id);
|
|
104
|
+
return w !== undefined && CLOSED_TYPES.has(type(w));
|
|
105
|
+
}).map((id) => keyOf(board, id)),
|
|
106
|
+
issues,
|
|
107
|
+
projects: [{ name: queryName, priority: board.priority, sortOrder: 0 }],
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function keyOf(board, id) {
|
|
111
|
+
return `${board.key}-${id}`;
|
|
112
|
+
}
|
|
113
|
+
// The ids of a work item's Predecessors.
|
|
114
|
+
function predecessors(w) {
|
|
115
|
+
return (w.relations ?? []).flatMap((r) => {
|
|
116
|
+
const id = r.rel === PREDECESSOR ? /\/workItems\/(\d+)$/i.exec(r.url)?.[1] : undefined;
|
|
117
|
+
return id ? [Number(id)] : [];
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=boards-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boards-queue.js","sourceRoot":"","sources":["../../src/watchers/boards-queue.ts"],"names":[],"mappings":"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"}
|