@aligndottech/cli 0.65.0 → 0.65.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.
- package/dist/commands/check.d.ts +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +57 -14
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/connect-agents.d.ts +1 -0
- package/dist/commands/connect-agents.d.ts.map +1 -1
- package/dist/commands/connect-agents.js +15 -8
- package/dist/commands/connect-agents.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +6 -3
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/why.d.ts.map +1 -1
- package/dist/commands/why.js +20 -20
- package/dist/commands/why.js.map +1 -1
- package/dist/lib/ask-listing.d.ts +14 -0
- package/dist/lib/ask-listing.d.ts.map +1 -1
- package/dist/lib/ask-listing.js +38 -0
- package/dist/lib/ask-listing.js.map +1 -1
- package/dist/lib/blame-attribution.d.ts +36 -0
- package/dist/lib/blame-attribution.d.ts.map +1 -0
- package/dist/lib/blame-attribution.js +131 -0
- package/dist/lib/blame-attribution.js.map +1 -0
- package/dist/lib/commit-shape.d.ts +22 -0
- package/dist/lib/commit-shape.d.ts.map +1 -1
- package/dist/lib/commit-shape.js +52 -0
- package/dist/lib/commit-shape.js.map +1 -1
- package/dist/lib/connect-prompt.d.ts +9 -0
- package/dist/lib/connect-prompt.d.ts.map +1 -1
- package/dist/lib/connect-prompt.js +13 -0
- package/dist/lib/connect-prompt.js.map +1 -1
- package/dist/lib/fetchers/git.js +1 -1
- package/dist/lib/fetchers/git.js.map +1 -1
- package/dist/lib/first-run-pr-import.d.ts +2 -21
- package/dist/lib/first-run-pr-import.d.ts.map +1 -1
- package/dist/lib/first-run-pr-import.js +29 -2
- package/dist/lib/first-run-pr-import.js.map +1 -1
- package/dist/lib/found-summary.d.ts.map +1 -1
- package/dist/lib/found-summary.js +5 -10
- package/dist/lib/found-summary.js.map +1 -1
- package/dist/lib/git.js +2 -2
- package/dist/lib/git.js.map +1 -1
- package/dist/lib/local-db.d.ts +6 -0
- package/dist/lib/local-db.d.ts.map +1 -1
- package/dist/lib/local-db.js +14 -0
- package/dist/lib/local-db.js.map +1 -1
- package/dist/lib/local-gateway-client.d.ts +10 -0
- package/dist/lib/local-gateway-client.d.ts.map +1 -1
- package/dist/lib/local-gateway-client.js +7 -0
- package/dist/lib/local-gateway-client.js.map +1 -1
- package/dist/lib/next-step.d.ts.map +1 -1
- package/dist/lib/next-step.js +6 -4
- package/dist/lib/next-step.js.map +1 -1
- package/dist/lib/reason-extract.d.ts +1 -0
- package/dist/lib/reason-extract.d.ts.map +1 -1
- package/dist/lib/reason-extract.js +1 -1
- package/dist/lib/reason-extract.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { isHousekeepingTitle, isNonBehaviouralType } from './commit-shape.js';
|
|
5
|
+
/** Inside the hook's 10s timeout and the 2.5s retrieval race it runs beside. */
|
|
6
|
+
export const BLAME_TIMEOUT_MS = 1500;
|
|
7
|
+
/** A rewrite of a huge file would blame thousands of lines for no extra signal. */
|
|
8
|
+
const MAX_BLAME_LINES = 400;
|
|
9
|
+
const MAX_OCCURRENCES = 3;
|
|
10
|
+
const lineOf = (text, index) => {
|
|
11
|
+
let n = 1;
|
|
12
|
+
for (let i = text.indexOf('\n'); i !== -1 && i < index; i = text.indexOf('\n', i + 1))
|
|
13
|
+
n++;
|
|
14
|
+
return n;
|
|
15
|
+
};
|
|
16
|
+
/** 1-based line ranges in `current` covered by each occurrence of `needle`. */
|
|
17
|
+
function rangesOfText(current, needle) {
|
|
18
|
+
const out = [];
|
|
19
|
+
const trimmed = needle.replace(/\n+$/, '');
|
|
20
|
+
if (!trimmed)
|
|
21
|
+
return out;
|
|
22
|
+
const span = trimmed.split('\n').length - 1;
|
|
23
|
+
for (let at = current.indexOf(trimmed); at !== -1 && out.length < MAX_OCCURRENCES; at = current.indexOf(trimmed, at + trimmed.length)) {
|
|
24
|
+
const start = lineOf(current, at);
|
|
25
|
+
out.push([start, start + span]);
|
|
26
|
+
}
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
/** For a Write: the lines of the current file the new content does not keep (common prefix and suffix trimmed). */
|
|
30
|
+
function rangesChangedBy(current, next) {
|
|
31
|
+
const a = current.split('\n');
|
|
32
|
+
const b = next.split('\n');
|
|
33
|
+
let head = 0;
|
|
34
|
+
while (head < a.length && head < b.length && a[head] === b[head])
|
|
35
|
+
head++;
|
|
36
|
+
let tail = 0;
|
|
37
|
+
while (tail < a.length - head && tail < b.length - head && a[a.length - 1 - tail] === b[b.length - 1 - tail])
|
|
38
|
+
tail++;
|
|
39
|
+
const end = a.length - tail; // exclusive, 0-based
|
|
40
|
+
return end > head ? [[head + 1, end]] : [];
|
|
41
|
+
}
|
|
42
|
+
function capped(ranges) {
|
|
43
|
+
let budget = MAX_BLAME_LINES;
|
|
44
|
+
const out = [];
|
|
45
|
+
for (const [s, e] of ranges) {
|
|
46
|
+
if (budget <= 0)
|
|
47
|
+
break;
|
|
48
|
+
const end = Math.min(e, s + budget - 1);
|
|
49
|
+
out.push([s, end]);
|
|
50
|
+
budget -= end - s + 1;
|
|
51
|
+
}
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
/** owner/repo from a GitHub remote url (https or ssh), lower-cased; null for anything else. */
|
|
55
|
+
function githubRepoOf(remote) {
|
|
56
|
+
const m = /github\.com[:/]([^/\s]+)\/([^/\s]+?)(?:\.git)?\/?$/i.exec(remote.trim());
|
|
57
|
+
return m ? `${m[1]}/${m[2]}`.toLowerCase() : null;
|
|
58
|
+
}
|
|
59
|
+
const prNumberOf = (subject) => /\(#(\d+)\)\s*$/.exec(subject)?.[1] ?? /^Merge pull request #(\d+)\b/.exec(subject)?.[1] ?? null;
|
|
60
|
+
export async function findLineWriters(input, cwd, opts = {}) {
|
|
61
|
+
try {
|
|
62
|
+
if (!input || typeof input.file_path !== 'string' || !input.file_path)
|
|
63
|
+
return null;
|
|
64
|
+
const file = path.resolve(cwd, input.file_path);
|
|
65
|
+
const current = await readFile(file, 'utf8');
|
|
66
|
+
let ranges = [];
|
|
67
|
+
if (typeof input.content === 'string') {
|
|
68
|
+
ranges = rangesChangedBy(current, input.content);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const olds = Array.isArray(input.edits) ? input.edits.map((e) => e.old_string) : [input.old_string];
|
|
72
|
+
for (const old of olds)
|
|
73
|
+
if (typeof old === 'string')
|
|
74
|
+
ranges.push(...rangesOfText(current, old));
|
|
75
|
+
}
|
|
76
|
+
ranges = capped(ranges);
|
|
77
|
+
if (!ranges.length)
|
|
78
|
+
return null;
|
|
79
|
+
const timeout = opts.timeoutMs ?? BLAME_TIMEOUT_MS;
|
|
80
|
+
const runGit = opts.runGit ?? ((args, cwd, ms) => execa('git', args, { cwd, timeout: ms, reject: true, stdin: 'ignore' }));
|
|
81
|
+
// The budget is enforced here too, not only by execa's own kill, so it holds for any runner.
|
|
82
|
+
const run = (args) => {
|
|
83
|
+
let timer;
|
|
84
|
+
const expired = new Promise((_, reject) => { timer = setTimeout(() => reject(new Error('blame budget exceeded')), timeout); });
|
|
85
|
+
return Promise.race([runGit(args, path.dirname(file), timeout), expired]).finally(() => clearTimeout(timer));
|
|
86
|
+
};
|
|
87
|
+
const blame = await run(['blame', '-w', '-M', '--porcelain', ...ranges.flatMap(([s, e]) => ['-L', `${s},${e}`]), '--', path.basename(file)]);
|
|
88
|
+
const subjects = new Map();
|
|
89
|
+
let sha = null;
|
|
90
|
+
for (const line of blame.stdout.split('\n')) {
|
|
91
|
+
const head = /^([0-9a-f]{40}) \d+ \d+/.exec(line);
|
|
92
|
+
if (head) {
|
|
93
|
+
sha = /^0+$/.test(head[1]) ? null : head[1];
|
|
94
|
+
if (sha && !subjects.has(sha))
|
|
95
|
+
subjects.set(sha, '');
|
|
96
|
+
}
|
|
97
|
+
else if (sha && line.startsWith('summary ')) {
|
|
98
|
+
subjects.set(sha, line.slice('summary '.length));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (!subjects.size)
|
|
102
|
+
return null;
|
|
103
|
+
const prNumbers = new Set([...subjects.values()].flatMap((s) => prNumberOf(s) ?? []));
|
|
104
|
+
const prUrls = [];
|
|
105
|
+
if (prNumbers.size) {
|
|
106
|
+
// No origin (or a non-GitHub one) only costs the PR mapping; the SHAs still stand.
|
|
107
|
+
const remote = await run(['remote', 'get-url', 'origin']).then((r) => r.stdout, () => '');
|
|
108
|
+
const repo = githubRepoOf(remote);
|
|
109
|
+
if (repo)
|
|
110
|
+
for (const n of prNumbers)
|
|
111
|
+
prUrls.push(`https://github.com/${repo}/pull/${n}`);
|
|
112
|
+
}
|
|
113
|
+
return { commitShas: [...subjects.keys()], prUrls };
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Whether a decision may be shown as "the decision that wrote these lines". Routine conventional-commit
|
|
121
|
+
* types (docs, style, test, chore, ci, build, release) decide nothing an edit could violate, and a
|
|
122
|
+
* refactor rewrites lines without deciding what they do, so naming it would hide the real writer.
|
|
123
|
+
* Naming any of them would fire on most routine edits and teach people to ignore the hook. They stay
|
|
124
|
+
* eligible for the content-search related list. fix, feat, perf and untyped titles qualify.
|
|
125
|
+
* The shapes come from commit-shape.ts (non-behavioural types, plus the housekeeping shapes: merges,
|
|
126
|
+
* drafts, backports, version bumps), so there is one list of what a mechanical subject looks like.
|
|
127
|
+
*/
|
|
128
|
+
export function isWriterTitle(title) {
|
|
129
|
+
return !isNonBehaviouralType(title) && !isHousekeepingTitle(title);
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=blame-attribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blame-attribution.js","sourceRoot":"","sources":["../../src/lib/blame-attribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,4 +15,26 @@ export declare const MIN_DECISION_SUBJECT_CHARS = 20;
|
|
|
15
15
|
* Anchored and case-insensitive, as the hand-written literal it replaced was.
|
|
16
16
|
*/
|
|
17
17
|
export declare function mechanicalSubjectRegex(prefixes: readonly string[]): RegExp;
|
|
18
|
+
/**
|
|
19
|
+
* A release or version-bump subject with no stated reason. In words, after any `type(scope):` and
|
|
20
|
+
* `(#N)` are removed it is housekeeping when it is only a version ("v5.9.0"), or the word
|
|
21
|
+
* bump/release alone or followed by a dotted version ("Bumped v5.9.0", "Release 5.9.0"), or a
|
|
22
|
+
* bump/update/upgrade of something FROM a version or TO a version ("Bump x from 1 to 2", "Update
|
|
23
|
+
* dependency x to v3") - unless it also states why (because, to avoid, drops, a CVE ...). Its
|
|
24
|
+
* complement keeps: a `release` scope ("feat(release): publish with provenance"), a bump with a
|
|
25
|
+
* reason, "Release 2FA support", "feat!: v6.0.0 drops Node 18", and Revert "Bump x" (the prefix list handles that).
|
|
26
|
+
* Dependency REPLACEMENTS ("replace a with b") are decisions and never match.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isReleaseOrBumpSubject(subject: string): boolean;
|
|
29
|
+
/** What the first-run box and the starter prompts must not show as a decision. */
|
|
30
|
+
export declare function isHousekeepingTitle(title: string): boolean;
|
|
31
|
+
/** The graph keeps a title as its first 80 characters (local-gateway-client.ts), so one this long may be cut mid-word. */
|
|
32
|
+
export declare const TITLE_CUT_AT = 80;
|
|
33
|
+
export declare function isCutTitle(title: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* A conventional-commit TYPE whose commits do not decide what the lines they touch do: docs, style,
|
|
36
|
+
* test, chore, ci, build, release and refactor. Separate from `isHousekeepingTitle` on purpose: that one
|
|
37
|
+
* feeds the first-run box and starter prompts and must not start hiding refactors there.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isNonBehaviouralType(title: string): boolean;
|
|
18
40
|
//# sourceMappingURL=commit-shape.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commit-shape.d.ts","sourceRoot":"","sources":["../../src/lib/commit-shape.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,wFAE9B,CAAC;AAEX,uEAAuE;AACvE,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAG1E"}
|
|
1
|
+
{"version":3,"file":"commit-shape.d.ts","sourceRoot":"","sources":["../../src/lib/commit-shape.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,wFAE9B,CAAC;AAEX,uEAAuE;AACvE,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAG1E;AAeD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAI/D;AASD,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,0HAA0H;AAC1H,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEjD;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE3D"}
|
package/dist/lib/commit-shape.js
CHANGED
|
@@ -20,4 +20,56 @@ export function mechanicalSubjectRegex(prefixes) {
|
|
|
20
20
|
const escaped = prefixes.map((p) => p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
|
|
21
21
|
return new RegExp(`^(${escaped.join('|')})`, 'i');
|
|
22
22
|
}
|
|
23
|
+
const CONVENTIONAL_PREFIX = /^[a-z]+(?:\([^)]*\))?!?:\s*/i;
|
|
24
|
+
const PR_REFERENCE = /\s*\(#\d+[^)]*\)/g;
|
|
25
|
+
// "v5.9.0", "5.11.2", "Version 6.0.0-alpha.1": a subject that is only a version.
|
|
26
|
+
const VERSION_ONLY = /^(?:v(?:ersion)?\s*)?\d+\.\d+(?:\.\d+)?(?:[-+.][\w.-]+)?$/i;
|
|
27
|
+
// "Bump", "Bumped v5.9.0", "Release 5.9.0": the word alone, or the word and a dotted version.
|
|
28
|
+
const BARE_BUMP_OR_RELEASE = /^(?:bump\w*|releas\w*)(?:\s*$|\s+v?\d+\.\d)/i;
|
|
29
|
+
// One package token moving to a version, and nothing else: "bump x from 1 to 2", "Update dependency x to v3". More words
|
|
30
|
+
// after the version ("... and fix type definition"), or a sentence in between ("Update docs for listening to 0.0.0.0"), is prose.
|
|
31
|
+
const DEPENDENCY_MOVE = /^(?:bump\w*|updat\w*|upgrad\w*)\s+(?:dependency\s+)?[@\w./-]+\s+(?:from\s+v?\d[\w.-]*\s+)?(?:to\s+v?\d[\w.-]*)(?:\s+in\s.*|\s*\(.*\))?[.]?$/i;
|
|
32
|
+
// A subject that says why is a decision whatever its shape: "bump timeout ... because the upstream is slow",
|
|
33
|
+
// "bump minimum Node to 20, drops 18", "bump lodash to 4.17.21 (CVE-2021-23337)".
|
|
34
|
+
const STATED_WHY = /\b(?:because|so that|in order to|to avoid|to prevent|due to|since|cve-\d+|drops?|dropping|security|breaking)\b/i;
|
|
35
|
+
/**
|
|
36
|
+
* A release or version-bump subject with no stated reason. In words, after any `type(scope):` and
|
|
37
|
+
* `(#N)` are removed it is housekeeping when it is only a version ("v5.9.0"), or the word
|
|
38
|
+
* bump/release alone or followed by a dotted version ("Bumped v5.9.0", "Release 5.9.0"), or a
|
|
39
|
+
* bump/update/upgrade of something FROM a version or TO a version ("Bump x from 1 to 2", "Update
|
|
40
|
+
* dependency x to v3") - unless it also states why (because, to avoid, drops, a CVE ...). Its
|
|
41
|
+
* complement keeps: a `release` scope ("feat(release): publish with provenance"), a bump with a
|
|
42
|
+
* reason, "Release 2FA support", "feat!: v6.0.0 drops Node 18", and Revert "Bump x" (the prefix list handles that).
|
|
43
|
+
* Dependency REPLACEMENTS ("replace a with b") are decisions and never match.
|
|
44
|
+
*/
|
|
45
|
+
export function isReleaseOrBumpSubject(subject) {
|
|
46
|
+
const body = subject.trim().replace(CONVENTIONAL_PREFIX, '').replace(PR_REFERENCE, '').trim();
|
|
47
|
+
if (STATED_WHY.test(body))
|
|
48
|
+
return false;
|
|
49
|
+
return VERSION_ONLY.test(body) || BARE_BUMP_OR_RELEASE.test(body) || DEPENDENCY_MOVE.test(body);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Subjects that read as housekeeping, not as a choice. Conventional `type:` / `type(scope):` shapes
|
|
53
|
+
* only, so prose like "document the retry policy" is not demoted; git's own Merge subjects (not
|
|
54
|
+
* prose like "Merge the two workers"); a `[DRAFT` / `[WIP` / `[Backport` marker (a backport repeats a decision made in the original).
|
|
55
|
+
*/
|
|
56
|
+
const HOUSEKEEPING_SHAPE = /^(?:(?:docs|chore|ci|test|style|build)(?:\([^)]*\))?!?:|merge\s+(?:pull request|branch|remote-tracking|tag)\b|\[(?:draft|wip|backport)\b)/i;
|
|
57
|
+
/** What the first-run box and the starter prompts must not show as a decision. */
|
|
58
|
+
export function isHousekeepingTitle(title) {
|
|
59
|
+
return HOUSEKEEPING_SHAPE.test(title.trim()) || isReleaseOrBumpSubject(title);
|
|
60
|
+
}
|
|
61
|
+
/** The graph keeps a title as its first 80 characters (local-gateway-client.ts), so one this long may be cut mid-word. */
|
|
62
|
+
export const TITLE_CUT_AT = 80;
|
|
63
|
+
export function isCutTitle(title) {
|
|
64
|
+
return title.trim().length >= TITLE_CUT_AT;
|
|
65
|
+
}
|
|
66
|
+
const NON_BEHAVIOURAL_TYPE = /^(?:docs|style|test|chore|ci|build|release|refactor)(?:\([^)]*\))?!?:/i;
|
|
67
|
+
/**
|
|
68
|
+
* A conventional-commit TYPE whose commits do not decide what the lines they touch do: docs, style,
|
|
69
|
+
* test, chore, ci, build, release and refactor. Separate from `isHousekeepingTitle` on purpose: that one
|
|
70
|
+
* feeds the first-run box and starter prompts and must not start hiding refactors there.
|
|
71
|
+
*/
|
|
72
|
+
export function isNonBehaviouralType(title) {
|
|
73
|
+
return NON_BEHAVIOURAL_TYPE.test(title.trim());
|
|
74
|
+
}
|
|
23
75
|
//# sourceMappingURL=commit-shape.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commit-shape.js","sourceRoot":"","sources":["../../src/lib/commit-shape.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM;CACnE,CAAC;AAEX,uEAAuE;AACvE,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAA2B;IAChE,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9E,OAAO,IAAI,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC"}
|
|
1
|
+
{"version":3,"file":"commit-shape.js","sourceRoot":"","sources":["../../src/lib/commit-shape.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM;CACnE,CAAC;AAEX,uEAAuE;AACvE,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAA2B;IAChE,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9E,OAAO,IAAI,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAC3D,MAAM,YAAY,GAAG,mBAAmB,CAAC;AACzC,iFAAiF;AACjF,MAAM,YAAY,GAAG,4DAA4D,CAAC;AAClF,8FAA8F;AAC9F,MAAM,oBAAoB,GAAG,8CAA8C,CAAC;AAC5E,yHAAyH;AACzH,kIAAkI;AAClI,MAAM,eAAe,GAAG,8IAA8I,CAAC;AACvK,6GAA6G;AAC7G,kFAAkF;AAClF,MAAM,UAAU,GAAG,iHAAiH,CAAC;AAErI;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9F,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClG,CAAC;AAED;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,4IAA4I,CAAC;AAExK,kFAAkF;AAClF,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,sBAAsB,CAAC,KAAK,CAAC,CAAC;AAChF,CAAC;AAED,0HAA0H;AAC1H,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAC/B,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,YAAY,CAAC;AAC7C,CAAC;AAED,MAAM,oBAAoB,GAAG,wEAAwE,CAAC;AAEtG;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -50,4 +50,13 @@ export declare function statusGapLine(gap: UnresolvedGap): string;
|
|
|
50
50
|
export declare function askTrailingLine(refs: Array<{
|
|
51
51
|
platform: string;
|
|
52
52
|
}>, isConnected: (connectorId: string) => boolean): string | null;
|
|
53
|
+
/**
|
|
54
|
+
* The gap hint for a whole `align ask` result set, printed once after the rows rather than
|
|
55
|
+
* under each one. One line per distinct gap, each with how many rows carry it.
|
|
56
|
+
*/
|
|
57
|
+
export declare function askGapHints(rows: Array<{
|
|
58
|
+
refs: Array<{
|
|
59
|
+
platform: string;
|
|
60
|
+
}>;
|
|
61
|
+
}>, isConnected: (connectorId: string) => boolean): string[];
|
|
53
62
|
//# sourceMappingURL=connect-prompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect-prompt.d.ts","sourceRoot":"","sources":["../../src/lib/connect-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B;mFAC+E;IAC/E,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAClC;;uFAEmF;IACnF,SAAS,EAAE,MAAM,CAAC;IAClB;;8CAE0C;IAC1C,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAgCD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,EACrD,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,GAC5C,aAAa,EAAE,CAkBjB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,MAAM,GAAG,IAAI,CASrE;AAED,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAKxD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,EACjC,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,GAC5C,MAAM,GAAG,IAAI,CASf"}
|
|
1
|
+
{"version":3,"file":"connect-prompt.d.ts","sourceRoot":"","sources":["../../src/lib/connect-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B;mFAC+E;IAC/E,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAClC;;uFAEmF;IACnF,SAAS,EAAE,MAAM,CAAC;IAClB;;8CAE0C;IAC1C,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAgCD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,EACrD,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,GAC5C,aAAa,EAAE,CAkBjB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,MAAM,GAAG,IAAI,CASrE;AAED,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAKxD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,EACjC,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,GAC5C,MAAM,GAAG,IAAI,CASf;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,EAClD,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,GAC5C,MAAM,EAAE,CAOV"}
|
|
@@ -99,4 +99,17 @@ export function askTrailingLine(refs, isConnected) {
|
|
|
99
99
|
}
|
|
100
100
|
return null;
|
|
101
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* The gap hint for a whole `align ask` result set, printed once after the rows rather than
|
|
104
|
+
* under each one. One line per distinct gap, each with how many rows carry it.
|
|
105
|
+
*/
|
|
106
|
+
export function askGapHints(rows, isConnected) {
|
|
107
|
+
const counts = new Map();
|
|
108
|
+
for (const row of rows) {
|
|
109
|
+
const line = askTrailingLine(row.refs, isConnected);
|
|
110
|
+
if (line)
|
|
111
|
+
counts.set(line, (counts.get(line) ?? 0) + 1);
|
|
112
|
+
}
|
|
113
|
+
return [...counts].map(([line, n]) => `${n} of these ${n === 1 ? line : line.replace(/^cites /, 'cite ')}`);
|
|
114
|
+
}
|
|
102
115
|
//# sourceMappingURL=connect-prompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect-prompt.js","sourceRoot":"","sources":["../../src/lib/connect-prompt.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"connect-prompt.js","sourceRoot":"","sources":["../../src/lib/connect-prompt.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/fetchers/git.js
CHANGED
|
@@ -24,7 +24,7 @@ export function gitCaptureSkips(counts) {
|
|
|
24
24
|
count: mechanical,
|
|
25
25
|
// The list is the one the predicate is built from, so the line cannot name a
|
|
26
26
|
// different set than the one that did the rejecting.
|
|
27
|
-
detail: `skipped as housekeeping: mechanical or too-short subject (${MECHANICAL_SUBJECT_PREFIXES.join(', ')})`,
|
|
27
|
+
detail: `skipped as housekeeping: mechanical or too-short subject (${MECHANICAL_SUBJECT_PREFIXES.join(', ')}; also version bumps and releases)`,
|
|
28
28
|
}]
|
|
29
29
|
: []),
|
|
30
30
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/lib/fetchers/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAGjE;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,MAA6F;IAC3H,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC;IACtF,OAAO;QACL,GAAG,CAAC,MAAM,GAAG,CAAC;YACZ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,8HAA8H,EAAE,CAAC;YAC7J,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,mBAAmB,GAAG,CAAC;YAChC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,EAAE,6DAA6D,EAAE,CAAC;YAChH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,UAAU,GAAG,CAAC;YAChB,CAAC,CAAC,CAAC;oBACC,KAAK,EAAE,UAAU;oBACjB,6EAA6E;oBAC7E,qDAAqD;oBACrD,MAAM,EAAE,6DAA6D,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/lib/fetchers/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAGjE;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,MAA6F;IAC3H,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC;IACtF,OAAO;QACL,GAAG,CAAC,MAAM,GAAG,CAAC;YACZ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,8HAA8H,EAAE,CAAC;YAC7J,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,mBAAmB,GAAG,CAAC;YAChC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,EAAE,6DAA6D,EAAE,CAAC;YAChH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,UAAU,GAAG,CAAC;YAChB,CAAC,CAAC,CAAC;oBACC,KAAK,EAAE,UAAU;oBACjB,6EAA6E;oBAC7E,qDAAqD;oBACrD,MAAM,EAAE,6DAA6D,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,oCAAoC;iBAChJ,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAEhC;IACC,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,6FAA6F;QAC7F,QAAQ,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK;QACvC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED;kEACkE;AAClE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAsD;IACxF,qFAAqF;IACrF,sFAAsF;IACtF,0EAA0E;IAC1E,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,GAAG,MAAM,wBAAwB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1O,MAAM,KAAK,GAAG,MAAM,IAAI,UAAU,CAAC,EAAE,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;SACxF,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3C,OAAO;QACL,KAAK;QACL,MAAM,EAAE,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;KAClH,CAAC;AACJ,CAAC"}
|
|
@@ -1,24 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* First run reads the merged PR descriptions of a GitHub origin.
|
|
3
|
-
*
|
|
4
|
-
* Why: most commits never state a reason (measured null "no stated reason" rate: fastify 96.7%,
|
|
5
|
-
* vite 96.7%, pnpm 74.0%), because squash-merge repos keep the reason in the PR description, not
|
|
6
|
-
* in the commit. `extractReason` over those descriptions found one in 15-29% of merged PRs.
|
|
7
|
-
*
|
|
8
|
-
* Safe by construction, because it runs before anyone has been asked anything:
|
|
9
|
-
* - public data only. No token is needed; a token is used ONLY when the existing read-only gate
|
|
10
|
-
* (detectVerifiedCliToken) proves it cannot write, and anything it refuses is dropped, never
|
|
11
|
-
* sent. A refusal costs nothing: the unauthenticated read still runs.
|
|
12
|
-
* - bounded: 3 pages (300 PRs) without a token, 10 pages (1,000) with one, and one wall-clock
|
|
13
|
-
* deadline over the whole thing, token lookup included.
|
|
14
|
-
* - never a prompt and never an error: every failure resolves to "no PRs".
|
|
15
|
-
* - a rate limit (HTTP 403/429) degrades to commits only, with one honest line.
|
|
16
|
-
*
|
|
17
|
-
* What it imports is a decision per merged PR whose body states a reason (the same gate the git
|
|
18
|
-
* import applies to commits), at the PR's own url, so `align connect github` writes the same row
|
|
19
|
-
* and a re-run does not duplicate it. A squash commit whose PR was imported is dropped from the
|
|
20
|
-
* commit import (dropCoveredCommits) so the change is not listed twice.
|
|
21
|
-
*/
|
|
22
1
|
import type { PersonalImportItem } from './personal-import.js';
|
|
23
2
|
export declare const RATE_LIMIT_LINE = "GitHub rate limit reached, imported commits only; run `align connect github` for PR descriptions";
|
|
24
3
|
export declare const partialRateLimitLine: (imported: number) => string;
|
|
@@ -30,6 +9,8 @@ export interface FirstRunPrOutcome {
|
|
|
30
9
|
scanned: number;
|
|
31
10
|
/** PRs kept: the ones whose body states a reason. */
|
|
32
11
|
imported: number;
|
|
12
|
+
/** Merged PRs skipped by title: a release or version bump has no decision in it, whatever its notes say. */
|
|
13
|
+
housekeeping: number;
|
|
33
14
|
/** The one line to show when GitHub stopped the read; absent otherwise. */
|
|
34
15
|
note?: string;
|
|
35
16
|
numbers: ReadonlySet<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"first-run-pr-import.d.ts","sourceRoot":"","sources":["../../src/lib/first-run-pr-import.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"first-run-pr-import.d.ts","sourceRoot":"","sources":["../../src/lib/first-run-pr-import.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAI/D,eAAO,MAAM,eAAe,qGAAqG,CAAC;AAClI,eAAO,MAAM,oBAAoB,GAAI,UAAU,MAAM,KAAG,MACkD,CAAC;AAK3G,0FAA0F;AAC1F,eAAO,MAAM,cAAc,QAAS,CAAC;AAerC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,4GAA4G;IAC5G,YAAY,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC3B;AAID,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,2GAA2G;IAC3G,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAmED,sFAAsF;AACtF,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0BrI;AAKD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAClF,OAAO,EAAE,CAAC,EAAE,EACZ,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GACvC;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAOjC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,EAClE,OAAO,EAAE,CAAC,EAAE,EACZ,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC9B,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAUjC"}
|
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* First run reads the merged PR descriptions of a GitHub origin.
|
|
3
|
+
*
|
|
4
|
+
* Why: most commits never state a reason (measured null "no stated reason" rate: fastify 96.7%,
|
|
5
|
+
* vite 96.7%, pnpm 74.0%), because squash-merge repos keep the reason in the PR description, not
|
|
6
|
+
* in the commit. `extractReason` over those descriptions found one in 15-29% of merged PRs.
|
|
7
|
+
*
|
|
8
|
+
* Safe by construction, because it runs before anyone has been asked anything:
|
|
9
|
+
* - public data only. No token is needed; a token is used ONLY when the existing read-only gate
|
|
10
|
+
* (detectVerifiedCliToken) proves it cannot write, and anything it refuses is dropped, never
|
|
11
|
+
* sent. A refusal costs nothing: the unauthenticated read still runs.
|
|
12
|
+
* - bounded: 3 pages (300 PRs) without a token, 10 pages (1,000) with one, and one wall-clock
|
|
13
|
+
* deadline over the whole thing, token lookup included.
|
|
14
|
+
* - never a prompt and never an error: every failure resolves to "no PRs".
|
|
15
|
+
* - a rate limit (HTTP 403/429) degrades to commits only, with one honest line.
|
|
16
|
+
*
|
|
17
|
+
* What it imports is a decision per merged PR whose body states a reason (the same gate the git
|
|
18
|
+
* import applies to commits), at the PR's own url, so `align connect github` writes the same row
|
|
19
|
+
* and a re-run does not duplicate it. A squash commit whose PR was imported is dropped from the
|
|
20
|
+
* commit import (dropCoveredCommits) so the change is not listed twice.
|
|
21
|
+
*/
|
|
22
|
+
import { isReleaseOrBumpSubject } from './commit-shape.js';
|
|
1
23
|
import { extractReason } from './reason-extract.js';
|
|
2
24
|
import { CLI_TOKEN_SOURCES, detectVerifiedCliToken } from './setup-ux.js';
|
|
3
25
|
export const RATE_LIMIT_LINE = 'GitHub rate limit reached, imported commits only; run `align connect github` for PR descriptions';
|
|
@@ -12,7 +34,7 @@ const BODY_CAP = 8_000;
|
|
|
12
34
|
const API = 'https://api.github.com';
|
|
13
35
|
const GITHUB_PREFIX = 'github.com/';
|
|
14
36
|
const OWNER_REPO = /^(?!\.{1,2}\/)(?!.*\/\.{1,2}$)[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;
|
|
15
|
-
const EMPTY = { items: [], scanned: 0, imported: 0, numbers: new Set(), shas: new Set() };
|
|
37
|
+
const EMPTY = { items: [], scanned: 0, housekeeping: 0, imported: 0, numbers: new Set(), shas: new Set() };
|
|
16
38
|
const isBot = (u) => u?.type === 'Bot' || /\[bot\]$/i.test(u?.login ?? '') || /^(?:dependabot|renovate)\b/i.test(u?.login ?? '');
|
|
17
39
|
function toItem(p, repo) {
|
|
18
40
|
const full = p.base?.repo?.full_name ?? repo;
|
|
@@ -39,6 +61,7 @@ async function read(repo, token, fetchFn, signal) {
|
|
|
39
61
|
const numbers = new Set();
|
|
40
62
|
const shas = new Set();
|
|
41
63
|
let scanned = 0;
|
|
64
|
+
let housekeeping = 0;
|
|
42
65
|
let limited = false;
|
|
43
66
|
for (let page = 1; page <= limits.pages && scanned < limits.prs; page += 1) {
|
|
44
67
|
let res;
|
|
@@ -72,6 +95,10 @@ async function read(repo, token, fetchFn, signal) {
|
|
|
72
95
|
if (!p.merged_at || !p.html_url || !p.title || typeof p.number !== 'number' || isBot(p.user) || Number.isNaN(new Date(p.merged_at).getTime()))
|
|
73
96
|
continue;
|
|
74
97
|
scanned += 1;
|
|
98
|
+
if (isReleaseOrBumpSubject(p.title)) {
|
|
99
|
+
housekeeping += 1;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
75
102
|
if (!extractReason(p.title, p.body))
|
|
76
103
|
continue;
|
|
77
104
|
items.push(toItem(p, repo));
|
|
@@ -84,7 +111,7 @@ async function read(repo, token, fetchFn, signal) {
|
|
|
84
111
|
break;
|
|
85
112
|
}
|
|
86
113
|
const note = limited ? (items.length === 0 ? RATE_LIMIT_LINE : partialRateLimitLine(items.length)) : undefined;
|
|
87
|
-
return { items, scanned, imported: items.length, ...(note ? { note } : {}), numbers, shas };
|
|
114
|
+
return { items, scanned, housekeeping, imported: items.length, ...(note ? { note } : {}), numbers, shas };
|
|
88
115
|
}
|
|
89
116
|
/** Never rejects. Resolves to no PRs for any origin that is not a github.com repo. */
|
|
90
117
|
export async function fetchFirstRunPrs(repoIdentity, deps = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"first-run-pr-import.js","sourceRoot":"","sources":["../../src/lib/first-run-pr-import.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"first-run-pr-import.js","sourceRoot":"","sources":["../../src/lib/first-run-pr-import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAE1E,MAAM,CAAC,MAAM,eAAe,GAAG,kGAAkG,CAAC;AAClI,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAgB,EAAU,EAAE,CAC/D,mCAAmC,QAAQ,6DAA6D,CAAC;AAE3G,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAW,CAAC;AACtD,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAW,CAAC;AACxD,0FAA0F;AAC1F,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,4GAA4G;AAC5G,MAAM,QAAQ,GAAG,KAAK,CAAC;AAEvB,MAAM,GAAG,GAAG,wBAAwB,CAAC;AACrC,MAAM,aAAa,GAAG,aAAa,CAAC;AACpC,MAAM,UAAU,GAAG,iEAAiE,CAAC;AAuBrF,MAAM,KAAK,GAAsB,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AAS9H,MAAM,KAAK,GAAG,CAAC,CAAgB,EAAW,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,6BAA6B,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;AAEzJ,SAAS,MAAM,CAAC,CAAQ,EAAE,IAAY;IACpC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAmB,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7D,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,OAAO;QACL,UAAU,EAAE,CAAC,CAAC,QAAkB;QAChC,QAAQ,EAAE,QAAQ;QAClB,oHAAoH;QACpH,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,6BAA6B,IAAI,EAAE,CAAC,IAAI,EAAE;QACtG,KAAK,EAAE,CAAC,CAAC,KAAe;QACxB,4CAA4C;QAC5C,UAAU,EAAE,MAAM;QAClB,GAAG,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnH,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAY,EAAE,KAAyB,EAAE,OAAqB,EAAE,MAAmB;IACrG,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;IACpD,MAAM,OAAO,GAA2B,EAAE,MAAM,EAAE,6BAA6B,EAAE,sBAAsB,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;IACnJ,IAAI,KAAK;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IACxD,MAAM,KAAK,GAAyB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QAC3E,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,GAAG,UAAU,IAAI,4DAA4D,SAAS,SAAS,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACrJ,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,gDAAgD;QACzD,CAAC;QACD,6GAA6G;QAC7G,qFAAqF;QACrF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YAAC,OAAO,GAAG,IAAI,CAAC;YAAC,MAAM;QAAC,CAAC;QAClK,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,CAAC,iDAAiD;QACrE,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,IAAI,GAAY,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,MAAM;YAChC,IAAI,GAAG,IAAe,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,OAAO,IAAI,MAAM,CAAC,GAAG;gBAAE,MAAM;YACjC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;gBAAE,SAAS;YACxJ,OAAO,IAAI,CAAC,CAAC;YACb,IAAI,sBAAsB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAC,YAAY,IAAI,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YACrE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC9C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACtB,IAAI,CAAC,CAAC,gBAAgB;gBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,+FAA+F;QAC/F,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,KAAK,GAAG;YAAE,MAAM;IACzF,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/G,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC5G,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,YAAuC,EAAE,OAAuB,EAAE;IACvG,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,QAAQ,CAAE,CAAC,CAAC,CAAC;IAChG,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,IAAI,KAAgD,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,EAAE;QAC1D,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,IAAI,cAAc,CAAC,CAAC;QACrG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,CAAC,KAAK,IAAgC,EAAE;QACnD,IAAI,KAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,MAAM,EAAE,CAAC;YAC7B,gFAAgF;YAChF,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK;gBAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC,CAAC,2CAA2C,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9C,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAC1C,MAAM,UAAU,GAAG,qCAAqC,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAY,EACZ,OAAwC;IAExC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACnE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACjC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAY,EACZ,YAA8B,EAC9B,IAAY;IAEZ,MAAM,MAAM,GAAG,sBAAsB,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;IAChE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,YAAY;QAAE,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAClI,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACjC,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;AAC3D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"found-summary.d.ts","sourceRoot":"","sources":["../../src/lib/found-summary.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"found-summary.d.ts","sourceRoot":"","sources":["../../src/lib/found-summary.ts"],"names":[],"mappings":"AAgBA,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,4FAA4F;AAC5F,MAAM,WAAW,cAAc;IAC7B,QAAQ,IAAI;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAClC,aAAa,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACjF,SAAS,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1F;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,YAAY,CAgClE;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,GAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CA6BlG"}
|
|
@@ -12,15 +12,9 @@
|
|
|
12
12
|
* value-rollup.ts's renderValueReadout).
|
|
13
13
|
*/
|
|
14
14
|
import { localCitationFor } from './commit-cite.js';
|
|
15
|
+
import { isCutTitle, isHousekeepingTitle } from './commit-shape.js';
|
|
15
16
|
/** How many decisions the summary names. Five fits a terminal without scrolling. */
|
|
16
17
|
export const FOUND_SUMMARY_MAX = 5;
|
|
17
|
-
/**
|
|
18
|
-
* Subjects that read as housekeeping, not as a choice. The importer keeps them (a
|
|
19
|
-
* docs commit can state a reason), so this only decides what the first-run box SHOWS first.
|
|
20
|
-
* Conventional `type:` / `type(scope):` shapes only, so prose like "document the retry
|
|
21
|
-
* policy" is not demoted; plus git's own Merge subjects (not prose like "Merge the two workers") and a `[DRAFT` / `[WIP` marker.
|
|
22
|
-
*/
|
|
23
|
-
const HOUSEKEEPING_SUBJECT = /^(?:(?:docs|chore|ci|test|style|build)(?:\([^)]*\))?!?:|merge\s+(?:pull request|branch|remote-tracking|tag)\b|\[(?:draft|wip)\b)/i;
|
|
24
18
|
export function buildFoundSummary(db) {
|
|
25
19
|
// The graph total comes from the db's COUNT, never from the length of the page
|
|
26
20
|
// below - those differ by two orders of magnitude on a real repo, and reporting
|
|
@@ -37,12 +31,13 @@ export function buildFoundSummary(db) {
|
|
|
37
31
|
// listDecisions() is already ordered created_at DESC, so the head of it is the
|
|
38
32
|
// recent page. The cap is applied here rather than in the renderer so a caller
|
|
39
33
|
// reading `recent.length` gets the number that will actually be printed.
|
|
40
|
-
//
|
|
34
|
+
// Titles the graph cut at 80 characters, then housekeeping subjects, sort after the rest (stable, so db order holds inside each group)
|
|
41
35
|
// and still fill the sample when too few real changes exist.
|
|
42
36
|
const rows = db.listDecisions();
|
|
43
37
|
const ranked = [
|
|
44
|
-
...rows.filter((r) => !
|
|
45
|
-
...rows.filter((r) =>
|
|
38
|
+
...rows.filter((r) => !isHousekeepingTitle(r.title) && !isCutTitle(r.title)),
|
|
39
|
+
...rows.filter((r) => !isHousekeepingTitle(r.title) && isCutTitle(r.title)),
|
|
40
|
+
...rows.filter((r) => isHousekeepingTitle(r.title)),
|
|
46
41
|
];
|
|
47
42
|
const recent = ranked.slice(0, FOUND_SUMMARY_MAX).map((row) => {
|
|
48
43
|
const cite = localCitationFor(row.sourceUrl);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"found-summary.js","sourceRoot":"","sources":["../../src/lib/found-summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"found-summary.js","sourceRoot":"","sources":["../../src/lib/found-summary.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/git.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { execa } from 'execa';
|
|
2
2
|
import os from 'node:os';
|
|
3
|
-
import { MECHANICAL_SUBJECT_PREFIXES, mechanicalSubjectRegex, MIN_DECISION_SUBJECT_CHARS } from './commit-shape.js';
|
|
3
|
+
import { isReleaseOrBumpSubject, MECHANICAL_SUBJECT_PREFIXES, mechanicalSubjectRegex, MIN_DECISION_SUBJECT_CHARS } from './commit-shape.js';
|
|
4
4
|
/**
|
|
5
5
|
* Same as {@link getCommitHistory}, plus the raw scanned count. A separate export
|
|
6
6
|
* because {@link getCommitHistory}'s `Promise<GitCommit[]>` signature is the
|
|
@@ -173,7 +173,7 @@ export function isDecisionCommit(subject) {
|
|
|
173
173
|
const trimmed = subject.trim();
|
|
174
174
|
if (trimmed.length < MIN_DECISION_SUBJECT_CHARS)
|
|
175
175
|
return false;
|
|
176
|
-
return !MECHANICAL_SUBJECT_RE.test(trimmed);
|
|
176
|
+
return !MECHANICAL_SUBJECT_RE.test(trimmed) && !isReleaseOrBumpSubject(trimmed);
|
|
177
177
|
}
|
|
178
178
|
// A line that IS a git trailer (key: value at the start of the line), not merely a
|
|
179
179
|
// sentence that happens to mention one of these words mid-line - "Refs APP-123 and
|