@on-par/factory-cli 0.0.0-stage → 0.9.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/LICENSE +21 -0
- package/README.md +40 -2
- package/dist/cli/admission.d.ts +17 -0
- package/dist/cli/admission.d.ts.map +1 -0
- package/dist/cli/admission.js +37 -0
- package/dist/cli/admission.js.map +1 -0
- package/dist/cli/base-hold.d.ts +63 -0
- package/dist/cli/base-hold.d.ts.map +1 -0
- package/dist/cli/base-hold.js +122 -0
- package/dist/cli/base-hold.js.map +1 -0
- package/dist/cli/branch-prefix.d.ts +8 -0
- package/dist/cli/branch-prefix.d.ts.map +1 -0
- package/dist/cli/branch-prefix.js +16 -0
- package/dist/cli/branch-prefix.js.map +1 -0
- package/dist/cli/classifier-backtest.d.ts +50 -0
- package/dist/cli/classifier-backtest.d.ts.map +1 -0
- package/dist/cli/classifier-backtest.js +112 -0
- package/dist/cli/classifier-backtest.js.map +1 -0
- package/dist/cli/cost-json.d.ts +37 -0
- package/dist/cli/cost-json.d.ts.map +1 -0
- package/dist/cli/cost-json.js +48 -0
- package/dist/cli/cost-json.js.map +1 -0
- package/dist/cli/daemon.d.ts +162 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +393 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/doctor.d.ts +127 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +400 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/feedback.d.ts +74 -0
- package/dist/cli/feedback.d.ts.map +1 -0
- package/dist/cli/feedback.js +180 -0
- package/dist/cli/feedback.js.map +1 -0
- package/dist/cli/filing.d.ts +22 -0
- package/dist/cli/filing.d.ts.map +1 -0
- package/dist/cli/filing.js +53 -0
- package/dist/cli/filing.js.map +1 -0
- package/dist/cli/first-run.d.ts +9 -0
- package/dist/cli/first-run.d.ts.map +1 -0
- package/dist/cli/first-run.js +34 -0
- package/dist/cli/first-run.js.map +1 -0
- package/dist/cli/help-groups.d.ts +17 -0
- package/dist/cli/help-groups.d.ts.map +1 -0
- package/dist/cli/help-groups.js +59 -0
- package/dist/cli/help-groups.js.map +1 -0
- package/dist/cli/hosted-queue.d.ts +45 -0
- package/dist/cli/hosted-queue.d.ts.map +1 -0
- package/dist/cli/hosted-queue.js +74 -0
- package/dist/cli/hosted-queue.js.map +1 -0
- package/dist/cli/hosted-runner.d.ts +44 -0
- package/dist/cli/hosted-runner.d.ts.map +1 -0
- package/dist/cli/hosted-runner.js +68 -0
- package/dist/cli/hosted-runner.js.map +1 -0
- package/dist/cli/hosted.d.ts +38 -0
- package/dist/cli/hosted.d.ts.map +1 -0
- package/dist/cli/hosted.js +82 -0
- package/dist/cli/hosted.js.map +1 -0
- package/dist/cli/index.d.ts +674 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +4916 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init-files.d.ts +8 -0
- package/dist/cli/init-files.d.ts.map +1 -0
- package/dist/cli/init-files.js +45 -0
- package/dist/cli/init-files.js.map +1 -0
- package/dist/cli/logs.d.ts +27 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +52 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/merge-scope.d.ts +7 -0
- package/dist/cli/merge-scope.d.ts.map +1 -0
- package/dist/cli/merge-scope.js +14 -0
- package/dist/cli/merge-scope.js.map +1 -0
- package/dist/cli/octokit.d.ts +43 -0
- package/dist/cli/octokit.d.ts.map +1 -0
- package/dist/cli/octokit.js +87 -0
- package/dist/cli/octokit.js.map +1 -0
- package/dist/cli/queue-add-json.d.ts +25 -0
- package/dist/cli/queue-add-json.d.ts.map +1 -0
- package/dist/cli/queue-add-json.js +24 -0
- package/dist/cli/queue-add-json.js.map +1 -0
- package/dist/cli/queue-clear.d.ts +15 -0
- package/dist/cli/queue-clear.d.ts.map +1 -0
- package/dist/cli/queue-clear.js +58 -0
- package/dist/cli/queue-clear.js.map +1 -0
- package/dist/cli/queue-list.d.ts +24 -0
- package/dist/cli/queue-list.d.ts.map +1 -0
- package/dist/cli/queue-list.js +25 -0
- package/dist/cli/queue-list.js.map +1 -0
- package/dist/cli/ready-check.d.ts +98 -0
- package/dist/cli/ready-check.d.ts.map +1 -0
- package/dist/cli/ready-check.js +169 -0
- package/dist/cli/ready-check.js.map +1 -0
- package/dist/cli/reset.d.ts +40 -0
- package/dist/cli/reset.d.ts.map +1 -0
- package/dist/cli/reset.js +215 -0
- package/dist/cli/reset.js.map +1 -0
- package/dist/cli/run-children.d.ts +24 -0
- package/dist/cli/run-children.d.ts.map +1 -0
- package/dist/cli/run-children.js +73 -0
- package/dist/cli/run-children.js.map +1 -0
- package/dist/cli/run-flags.d.ts +14 -0
- package/dist/cli/run-flags.d.ts.map +1 -0
- package/dist/cli/run-flags.js +43 -0
- package/dist/cli/run-flags.js.map +1 -0
- package/dist/cli/runs-diffstat.d.ts +43 -0
- package/dist/cli/runs-diffstat.d.ts.map +1 -0
- package/dist/cli/runs-diffstat.js +91 -0
- package/dist/cli/runs-diffstat.js.map +1 -0
- package/dist/cli/runs.d.ts +36 -0
- package/dist/cli/runs.d.ts.map +1 -0
- package/dist/cli/runs.js +102 -0
- package/dist/cli/runs.js.map +1 -0
- package/dist/cli/self-update.d.ts +68 -0
- package/dist/cli/self-update.d.ts.map +1 -0
- package/dist/cli/self-update.js +167 -0
- package/dist/cli/self-update.js.map +1 -0
- package/dist/cli/staleness.d.ts +30 -0
- package/dist/cli/staleness.d.ts.map +1 -0
- package/dist/cli/staleness.js +132 -0
- package/dist/cli/staleness.js.map +1 -0
- package/dist/cli/state-root.d.ts +5 -0
- package/dist/cli/state-root.d.ts.map +1 -0
- package/dist/cli/state-root.js +12 -0
- package/dist/cli/state-root.js.map +1 -0
- package/dist/cli/status-json.d.ts +49 -0
- package/dist/cli/status-json.d.ts.map +1 -0
- package/dist/cli/status-json.js +23 -0
- package/dist/cli/status-json.js.map +1 -0
- package/dist/cli/stop-resume-json.d.ts +18 -0
- package/dist/cli/stop-resume-json.d.ts.map +1 -0
- package/dist/cli/stop-resume-json.js +10 -0
- package/dist/cli/stop-resume-json.js.map +1 -0
- package/dist/cli/stop-sentinel.d.ts +23 -0
- package/dist/cli/stop-sentinel.d.ts.map +1 -0
- package/dist/cli/stop-sentinel.js +61 -0
- package/dist/cli/stop-sentinel.js.map +1 -0
- package/dist/cli/sweep-heartbeat.d.ts +33 -0
- package/dist/cli/sweep-heartbeat.d.ts.map +1 -0
- package/dist/cli/sweep-heartbeat.js +65 -0
- package/dist/cli/sweep-heartbeat.js.map +1 -0
- package/dist/cli/unpark.d.ts +28 -0
- package/dist/cli/unpark.d.ts.map +1 -0
- package/dist/cli/unpark.js +68 -0
- package/dist/cli/unpark.js.map +1 -0
- package/dist/cli/update-state.d.ts +44 -0
- package/dist/cli/update-state.d.ts.map +1 -0
- package/dist/cli/update-state.js +154 -0
- package/dist/cli/update-state.js.map +1 -0
- package/dist/cli/usage-json.d.ts +20 -0
- package/dist/cli/usage-json.d.ts.map +1 -0
- package/dist/cli/usage-json.js +36 -0
- package/dist/cli/usage-json.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -0
- package/dist/entry.d.ts +6 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +13 -0
- package/dist/entry.js.map +1 -0
- package/package.json +56 -4
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** One changed file. `added`/`deleted` are null for binary files. */
|
|
2
|
+
export interface RunDiffstatFileJson {
|
|
3
|
+
path: string;
|
|
4
|
+
added: number | null;
|
|
5
|
+
deleted: number | null;
|
|
6
|
+
}
|
|
7
|
+
export interface RunDiffstatTotalsJson {
|
|
8
|
+
files: number;
|
|
9
|
+
added: number;
|
|
10
|
+
deleted: number;
|
|
11
|
+
}
|
|
12
|
+
export type RunDiffstatReason = 'branch-missing' | 'base-missing' | 'no-branch';
|
|
13
|
+
/**
|
|
14
|
+
* Machine-readable output of `factory runs --json --diffstat <issue>`.
|
|
15
|
+
* Additive changes only; bump schemaVersion on a breaking change.
|
|
16
|
+
* `files`/`totals` are null (with a `reason`) when the diff cannot be computed.
|
|
17
|
+
*/
|
|
18
|
+
export interface RunDiffstatJson {
|
|
19
|
+
schemaVersion: 1;
|
|
20
|
+
issue: number;
|
|
21
|
+
branch: string | null;
|
|
22
|
+
base: string;
|
|
23
|
+
files: RunDiffstatFileJson[] | null;
|
|
24
|
+
totals: RunDiffstatTotalsJson | null;
|
|
25
|
+
reason: RunDiffstatReason | null;
|
|
26
|
+
}
|
|
27
|
+
/** Runs `git <args>` in cwd without a shell. Resolves stdout; rejects on nonzero exit. */
|
|
28
|
+
export type DiffstatGit = (args: readonly string[], cwd: string) => Promise<string>;
|
|
29
|
+
/** Thrown when the issue has no readable run state. cmdRuns maps it to exit 1. */
|
|
30
|
+
export declare class NoRunError extends Error {
|
|
31
|
+
}
|
|
32
|
+
/** Parse the `--diffstat <issue>` value: a positive integer, else throw. */
|
|
33
|
+
export declare function parseDiffstatIssue(raw: string): number;
|
|
34
|
+
/** Parse `git diff --numstat -z --no-renames` output into file rows, in git's order. */
|
|
35
|
+
export declare function parseNumstat(raw: string): RunDiffstatFileJson[];
|
|
36
|
+
export declare function buildRunDiffstatJson(opts: {
|
|
37
|
+
runsDir: string;
|
|
38
|
+
repoRoot: string;
|
|
39
|
+
issue: number;
|
|
40
|
+
git?: DiffstatGit;
|
|
41
|
+
resolveBase?: (repoRoot: string) => Promise<string>;
|
|
42
|
+
}): Promise<RunDiffstatJson>;
|
|
43
|
+
//# sourceMappingURL=runs-diffstat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs-diffstat.d.ts","sourceRoot":"","sources":["../../src/cli/runs-diffstat.ts"],"names":[],"mappings":"AAKA,qEAAqE;AACrE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,iBAAiB,GAAG,gBAAgB,GAAG,cAAc,GAAG,WAAW,CAAC;AAEhF;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,CAAC,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACrC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAClC;AAED,0FAA0F;AAC1F,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEpF,kFAAkF;AAClF,qBAAa,UAAW,SAAQ,KAAK;CAAG;AAmBxC,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAe/D;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACrD,GAAG,OAAO,CAAC,eAAe,CAAC,CA4C3B"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { defaultRemoteBase, readIssueRunState } from '@on-par/factory-core/internal';
|
|
4
|
+
/** Thrown when the issue has no readable run state. cmdRuns maps it to exit 1. */
|
|
5
|
+
export class NoRunError extends Error {
|
|
6
|
+
}
|
|
7
|
+
const defaultGit = (args, cwd) => new Promise((resolve, reject) => {
|
|
8
|
+
execFile('git', [...args], { cwd, timeout: 120_000, maxBuffer: 64 * 1024 * 1024, encoding: 'utf-8' }, (error, stdout, stderr) => {
|
|
9
|
+
if (error) {
|
|
10
|
+
const detail = String(stderr).trim();
|
|
11
|
+
reject(new Error(detail ? `${error.message}: ${detail}` : error.message));
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
resolve(stdout);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
/** Parse the `--diffstat <issue>` value: a positive integer, else throw. */
|
|
18
|
+
export function parseDiffstatIssue(raw) {
|
|
19
|
+
const n = /^\d+$/.test(raw) ? Number(raw) : 0;
|
|
20
|
+
if (!Number.isSafeInteger(n) || n < 1) {
|
|
21
|
+
throw new Error(`invalid --diffstat '${raw}' — expected a positive issue number`);
|
|
22
|
+
}
|
|
23
|
+
return n;
|
|
24
|
+
}
|
|
25
|
+
/** Parse `git diff --numstat -z --no-renames` output into file rows, in git's order. */
|
|
26
|
+
export function parseNumstat(raw) {
|
|
27
|
+
const files = [];
|
|
28
|
+
for (const token of raw.split('\0')) {
|
|
29
|
+
if (token === '')
|
|
30
|
+
continue;
|
|
31
|
+
const first = token.indexOf('\t');
|
|
32
|
+
const second = first === -1 ? -1 : token.indexOf('\t', first + 1);
|
|
33
|
+
if (second === -1)
|
|
34
|
+
continue;
|
|
35
|
+
const count = (s) => (s === '-' ? null : Number(s));
|
|
36
|
+
files.push({
|
|
37
|
+
path: token.slice(second + 1),
|
|
38
|
+
added: count(token.slice(0, first)),
|
|
39
|
+
deleted: count(token.slice(first + 1, second)),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return files;
|
|
43
|
+
}
|
|
44
|
+
export async function buildRunDiffstatJson(opts) {
|
|
45
|
+
const { runsDir, repoRoot, issue, git = defaultGit, resolveBase = defaultRemoteBase } = opts;
|
|
46
|
+
const state = await readIssueRunState(join(runsDir, `issue-${issue}.json`));
|
|
47
|
+
if (state === null)
|
|
48
|
+
throw new NoRunError(`no run for issue #${issue}`);
|
|
49
|
+
const base = await resolveBase(repoRoot);
|
|
50
|
+
const branch = typeof state.branch === 'string' && state.branch !== '' ? state.branch : null;
|
|
51
|
+
const unavailable = (reason) => ({
|
|
52
|
+
schemaVersion: 1,
|
|
53
|
+
issue,
|
|
54
|
+
branch,
|
|
55
|
+
base,
|
|
56
|
+
files: null,
|
|
57
|
+
totals: null,
|
|
58
|
+
reason,
|
|
59
|
+
});
|
|
60
|
+
if (branch === null)
|
|
61
|
+
return unavailable('no-branch');
|
|
62
|
+
const resolves = async (ref) => {
|
|
63
|
+
try {
|
|
64
|
+
await git(['rev-parse', '--verify', '-q', `${ref}^{commit}`], repoRoot);
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
if (!(await resolves(base)))
|
|
72
|
+
return unavailable('base-missing');
|
|
73
|
+
let ref = null;
|
|
74
|
+
for (const candidate of [`refs/heads/${branch}`, `refs/remotes/origin/${branch}`]) {
|
|
75
|
+
if (await resolves(candidate)) {
|
|
76
|
+
ref = candidate;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (ref === null)
|
|
81
|
+
return unavailable('branch-missing');
|
|
82
|
+
const raw = await git(['diff', '--numstat', '-z', '--no-renames', '--no-ext-diff', `${base}...${ref}`], repoRoot);
|
|
83
|
+
const files = parseNumstat(raw);
|
|
84
|
+
const totals = { files: files.length, added: 0, deleted: 0 };
|
|
85
|
+
for (const f of files) {
|
|
86
|
+
totals.added += f.added ?? 0;
|
|
87
|
+
totals.deleted += f.deleted ?? 0;
|
|
88
|
+
}
|
|
89
|
+
return { schemaVersion: 1, issue, branch, base, files, totals, reason: null };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=runs-diffstat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs-diffstat.js","sourceRoot":"","sources":["../../src/cli/runs-diffstat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type FailurePhase, type RunStatus } from '@on-par/factory-core/internal';
|
|
2
|
+
/** Row cap when `--limit` is not given. */
|
|
3
|
+
export declare const DEFAULT_RUNS_LIMIT = 50;
|
|
4
|
+
/** One row of `factory runs --json` (#2271). Unknown values are null, never omitted. */
|
|
5
|
+
export interface RunsRowJson {
|
|
6
|
+
issue: number;
|
|
7
|
+
lane: string | null;
|
|
8
|
+
repo: string | null;
|
|
9
|
+
status: RunStatus | null;
|
|
10
|
+
phase: FailurePhase | null;
|
|
11
|
+
branch: string | null;
|
|
12
|
+
prNumber: number | null;
|
|
13
|
+
model: string | null;
|
|
14
|
+
attempts: number | null;
|
|
15
|
+
startedAt: string | null;
|
|
16
|
+
updatedAt: string;
|
|
17
|
+
}
|
|
18
|
+
/** `factory runs --json` payload (#2271). Additive changes only; bump schemaVersion on a breaking change. */
|
|
19
|
+
export interface RunsJson {
|
|
20
|
+
schemaVersion: 1;
|
|
21
|
+
runs: RunsRowJson[];
|
|
22
|
+
}
|
|
23
|
+
/** Parse `--limit`: absent → the default, otherwise a positive integer or an Error. */
|
|
24
|
+
export declare function parseRunsLimit(raw: string | undefined): number;
|
|
25
|
+
/**
|
|
26
|
+
* Merge `issue-<n>.json` (IssueRunState) and `issue-<n>.phase.json` (RunPhaseSnapshot)
|
|
27
|
+
* in `runsDir` into one row per issue, newest `updatedAt` first, capped at `limit`.
|
|
28
|
+
* A missing dir is an empty list; malformed files are skipped and named in `skipped`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildRunsJson(runsDir: string, { limit }?: {
|
|
31
|
+
limit?: number;
|
|
32
|
+
}): Promise<{
|
|
33
|
+
json: RunsJson;
|
|
34
|
+
skipped: string[];
|
|
35
|
+
}>;
|
|
36
|
+
//# sourceMappingURL=runs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/cli/runs.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,SAAS,EACf,MAAM,+BAA+B,CAAC;AAEvC,2CAA2C;AAC3C,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,wFAAwF;AACxF,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,6GAA6G;AAC7G,MAAM,WAAW,QAAQ;IACvB,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB;AAED,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAI9D;AAUD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,EAAE,KAA0B,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACtD,OAAO,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA4EhD"}
|
package/dist/cli/runs.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { readdir } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { readPhaseSnapshot } from '@on-par/factory-core';
|
|
4
|
+
import { readIssueRunState, } from '@on-par/factory-core/internal';
|
|
5
|
+
/** Row cap when `--limit` is not given. */
|
|
6
|
+
export const DEFAULT_RUNS_LIMIT = 50;
|
|
7
|
+
/** Parse `--limit`: absent → the default, otherwise a positive integer or an Error. */
|
|
8
|
+
export function parseRunsLimit(raw) {
|
|
9
|
+
if (raw === undefined)
|
|
10
|
+
return DEFAULT_RUNS_LIMIT;
|
|
11
|
+
if (/^\d+$/.test(raw) && Number(raw) >= 1)
|
|
12
|
+
return Number(raw);
|
|
13
|
+
throw new Error(`invalid --limit '${raw}' — expected a positive integer`);
|
|
14
|
+
}
|
|
15
|
+
const str = (v) => (typeof v === 'string' && v.length > 0 ? v : null);
|
|
16
|
+
const num = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : null);
|
|
17
|
+
function time(iso) {
|
|
18
|
+
const t = Date.parse(iso);
|
|
19
|
+
return Number.isNaN(t) ? -Infinity : t;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Merge `issue-<n>.json` (IssueRunState) and `issue-<n>.phase.json` (RunPhaseSnapshot)
|
|
23
|
+
* in `runsDir` into one row per issue, newest `updatedAt` first, capped at `limit`.
|
|
24
|
+
* A missing dir is an empty list; malformed files are skipped and named in `skipped`.
|
|
25
|
+
*/
|
|
26
|
+
export async function buildRunsJson(runsDir, { limit = DEFAULT_RUNS_LIMIT } = {}) {
|
|
27
|
+
let names;
|
|
28
|
+
try {
|
|
29
|
+
names = await readdir(runsDir);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
if (err.code === 'ENOENT')
|
|
33
|
+
return { json: { schemaVersion: 1, runs: [] }, skipped: [] };
|
|
34
|
+
throw err;
|
|
35
|
+
}
|
|
36
|
+
const byIssue = new Map();
|
|
37
|
+
for (const name of names) {
|
|
38
|
+
const phaseMatch = /^issue-(\d+)\.phase\.json$/.exec(name);
|
|
39
|
+
const runMatch = phaseMatch ? null : /^issue-(\d+)\.json$/.exec(name);
|
|
40
|
+
const match = phaseMatch ?? runMatch;
|
|
41
|
+
if (!match)
|
|
42
|
+
continue;
|
|
43
|
+
const issue = Number(match[1]);
|
|
44
|
+
const entry = byIssue.get(issue) ?? {};
|
|
45
|
+
if (phaseMatch)
|
|
46
|
+
entry.phase = name;
|
|
47
|
+
else
|
|
48
|
+
entry.run = name;
|
|
49
|
+
byIssue.set(issue, entry);
|
|
50
|
+
}
|
|
51
|
+
const issues = [...byIssue.keys()].sort((a, b) => a - b);
|
|
52
|
+
const skipped = [];
|
|
53
|
+
const rows = [];
|
|
54
|
+
const note = (name) => {
|
|
55
|
+
skipped.push(`factory: runs — skipped malformed ${name}`);
|
|
56
|
+
};
|
|
57
|
+
const loaded = await Promise.all(issues.map(async (issue) => {
|
|
58
|
+
const files = byIssue.get(issue) ?? {};
|
|
59
|
+
const bad = [];
|
|
60
|
+
let state = null;
|
|
61
|
+
let snapshot = null;
|
|
62
|
+
if (files.run !== undefined) {
|
|
63
|
+
state = await readIssueRunState(join(runsDir, files.run));
|
|
64
|
+
if (state === null || typeof state.updatedAt !== 'string') {
|
|
65
|
+
state = null;
|
|
66
|
+
bad.push(files.run);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (files.phase !== undefined) {
|
|
70
|
+
snapshot = await readPhaseSnapshot(join(runsDir, files.phase));
|
|
71
|
+
if (snapshot === null)
|
|
72
|
+
bad.push(files.phase);
|
|
73
|
+
}
|
|
74
|
+
return { issue, state, snapshot, bad };
|
|
75
|
+
}));
|
|
76
|
+
for (const { issue, state, snapshot, bad } of loaded) {
|
|
77
|
+
bad.forEach(note);
|
|
78
|
+
if (state === null && snapshot === null)
|
|
79
|
+
continue;
|
|
80
|
+
const updatedAt = state !== null && snapshot !== null
|
|
81
|
+
? time(snapshot.updatedAt) > time(state.updatedAt)
|
|
82
|
+
? snapshot.updatedAt
|
|
83
|
+
: state.updatedAt
|
|
84
|
+
: (state?.updatedAt ?? snapshot?.updatedAt ?? '');
|
|
85
|
+
rows.push({
|
|
86
|
+
issue,
|
|
87
|
+
lane: str(state?.lane),
|
|
88
|
+
repo: str(state?.repo),
|
|
89
|
+
status: str(state?.status),
|
|
90
|
+
phase: snapshot?.phase ?? null,
|
|
91
|
+
branch: str(state?.branch),
|
|
92
|
+
prNumber: num(state?.prNumber),
|
|
93
|
+
model: str(state?.model),
|
|
94
|
+
attempts: num(state?.attempts),
|
|
95
|
+
startedAt: str(state?.startedAt),
|
|
96
|
+
updatedAt,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
rows.sort((a, b) => time(b.updatedAt) - time(a.updatedAt) || b.issue - a.issue);
|
|
100
|
+
return { json: { schemaVersion: 1, runs: rows.slice(0, limit) }, skipped };
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=runs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/cli/runs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type RequestOptions } from 'node:https';
|
|
2
|
+
import { type DetectInstallDeps, type InstallKind, type UpdateChannel } from './daemon.js';
|
|
3
|
+
export declare const PACKAGE_NAME = "@on-par/factory-cli";
|
|
4
|
+
export declare const DEFAULT_REGISTRY = "https://registry.npmjs.org";
|
|
5
|
+
export declare const DEFAULT_TIMEOUT_MS = 10000;
|
|
6
|
+
export declare const EXIT_UP_TO_DATE = 0;
|
|
7
|
+
export declare const EXIT_UPDATE_AVAILABLE = 10;
|
|
8
|
+
export declare const EXIT_ERROR = 1;
|
|
9
|
+
/** One GET; resolves with status + body, rejects on network error or timeout. */
|
|
10
|
+
export type RegistryFetch = (url: string, opts: {
|
|
11
|
+
timeoutMs: number;
|
|
12
|
+
}) => Promise<{
|
|
13
|
+
status: number;
|
|
14
|
+
body: string;
|
|
15
|
+
}>;
|
|
16
|
+
export interface SelfUpdateDeps {
|
|
17
|
+
fetch?: RegistryFetch;
|
|
18
|
+
install?: DetectInstallDeps;
|
|
19
|
+
registry?: string;
|
|
20
|
+
timeoutMs?: number;
|
|
21
|
+
out?: {
|
|
22
|
+
write(s: string): unknown;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export interface SelfUpdateCheckResult {
|
|
26
|
+
installKind: InstallKind;
|
|
27
|
+
prefix: string;
|
|
28
|
+
channel: UpdateChannel;
|
|
29
|
+
current: string;
|
|
30
|
+
candidate: string | null;
|
|
31
|
+
updateAvailable: boolean;
|
|
32
|
+
applies: boolean;
|
|
33
|
+
error: string | null;
|
|
34
|
+
}
|
|
35
|
+
export declare function parseSemver(v: string): {
|
|
36
|
+
major: number;
|
|
37
|
+
minor: number;
|
|
38
|
+
patch: number;
|
|
39
|
+
prerelease: string[];
|
|
40
|
+
} | null;
|
|
41
|
+
/** SemVer 2.0.0 precedence; build metadata ignored. Throws on a malformed version. */
|
|
42
|
+
export declare function compareSemver(a: string, b: string): number;
|
|
43
|
+
export declare function selectCandidate(distTags: Record<string, string>, mode: 'stable' | 'prerelease'): string | null;
|
|
44
|
+
/** The response surface `httpsRegistryFetch` reads; node's IncomingMessage satisfies it. */
|
|
45
|
+
export interface HttpsResponse {
|
|
46
|
+
statusCode?: number;
|
|
47
|
+
on(event: 'data', fn: (chunk: Buffer) => void): unknown;
|
|
48
|
+
on(event: 'end', fn: () => void): unknown;
|
|
49
|
+
on(event: 'error', fn: (err: Error) => void): unknown;
|
|
50
|
+
}
|
|
51
|
+
/** The slice of node:https `request` that `httpsRegistryFetch` uses. */
|
|
52
|
+
export type HttpsRequest = (url: string, options: RequestOptions, onResponse: (res: HttpsResponse) => void) => {
|
|
53
|
+
on(event: 'error', fn: (err: Error) => void): unknown;
|
|
54
|
+
end(): unknown;
|
|
55
|
+
};
|
|
56
|
+
/** A RegistryFetch over node:https that honours HTTPS_PROXY/NO_PROXY and aborts after `timeoutMs`. */
|
|
57
|
+
export declare function httpsRegistryFetch(requestImpl?: HttpsRequest): RegistryFetch;
|
|
58
|
+
export declare function fetchDistTags(fetchImpl: RegistryFetch, opts?: {
|
|
59
|
+
registry?: string;
|
|
60
|
+
timeoutMs?: number;
|
|
61
|
+
}): Promise<Record<string, string>>;
|
|
62
|
+
export declare function checkForUpdate(mode: 'stable' | 'prerelease', deps?: SelfUpdateDeps): Promise<SelfUpdateCheckResult>;
|
|
63
|
+
export declare function formatUpdateCheck(r: SelfUpdateCheckResult): string;
|
|
64
|
+
export declare function cmdSelfUpdateCheck(opts: {
|
|
65
|
+
json?: boolean;
|
|
66
|
+
updateMode?: string;
|
|
67
|
+
}, deps?: SelfUpdateDeps): Promise<number>;
|
|
68
|
+
//# sourceMappingURL=self-update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-update.d.ts","sourceRoot":"","sources":["../../src/cli/self-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// packages/cli/src/cli/self-update.ts — factory self-update --check (#2354)
|
|
2
|
+
import { Agent, request } from 'node:https';
|
|
3
|
+
import { DaemonCtlError, detectInstall, parseUpdateMode, updateChannel, } from './daemon.js';
|
|
4
|
+
export const PACKAGE_NAME = '@on-par/factory-cli';
|
|
5
|
+
export const DEFAULT_REGISTRY = 'https://registry.npmjs.org';
|
|
6
|
+
export const DEFAULT_TIMEOUT_MS = 10_000;
|
|
7
|
+
export const EXIT_UP_TO_DATE = 0;
|
|
8
|
+
export const EXIT_UPDATE_AVAILABLE = 10;
|
|
9
|
+
export const EXIT_ERROR = 1;
|
|
10
|
+
const SEMVER_RE = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/;
|
|
11
|
+
export function parseSemver(v) {
|
|
12
|
+
const m = SEMVER_RE.exec(v.trim());
|
|
13
|
+
if (!m)
|
|
14
|
+
return null;
|
|
15
|
+
return {
|
|
16
|
+
major: Number(m[1]),
|
|
17
|
+
minor: Number(m[2]),
|
|
18
|
+
patch: Number(m[3]),
|
|
19
|
+
prerelease: m[4] === undefined ? [] : m[4].split('.'),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** SemVer 2.0.0 precedence; build metadata ignored. Throws on a malformed version. */
|
|
23
|
+
export function compareSemver(a, b) {
|
|
24
|
+
const pa = parseSemver(a);
|
|
25
|
+
const pb = parseSemver(b);
|
|
26
|
+
if (!pa)
|
|
27
|
+
throw new Error(`invalid version "${a}"`);
|
|
28
|
+
if (!pb)
|
|
29
|
+
throw new Error(`invalid version "${b}"`);
|
|
30
|
+
for (const k of ['major', 'minor', 'patch']) {
|
|
31
|
+
if (pa[k] !== pb[k])
|
|
32
|
+
return pa[k] < pb[k] ? -1 : 1;
|
|
33
|
+
}
|
|
34
|
+
if (pa.prerelease.length === 0 || pb.prerelease.length === 0) {
|
|
35
|
+
if (pa.prerelease.length === pb.prerelease.length)
|
|
36
|
+
return 0;
|
|
37
|
+
return pa.prerelease.length === 0 ? 1 : -1;
|
|
38
|
+
}
|
|
39
|
+
const n = Math.min(pa.prerelease.length, pb.prerelease.length);
|
|
40
|
+
for (let i = 0; i < n; i++) {
|
|
41
|
+
const x = pa.prerelease[i];
|
|
42
|
+
const y = pb.prerelease[i];
|
|
43
|
+
if (x === y)
|
|
44
|
+
continue;
|
|
45
|
+
const xn = /^\d+$/.test(x);
|
|
46
|
+
const yn = /^\d+$/.test(y);
|
|
47
|
+
if (xn && yn)
|
|
48
|
+
return Number(x) < Number(y) ? -1 : 1;
|
|
49
|
+
if (xn)
|
|
50
|
+
return -1;
|
|
51
|
+
if (yn)
|
|
52
|
+
return 1;
|
|
53
|
+
return x < y ? -1 : 1;
|
|
54
|
+
}
|
|
55
|
+
if (pa.prerelease.length === pb.prerelease.length)
|
|
56
|
+
return 0;
|
|
57
|
+
return pa.prerelease.length < pb.prerelease.length ? -1 : 1;
|
|
58
|
+
}
|
|
59
|
+
export function selectCandidate(distTags, mode) {
|
|
60
|
+
if (mode === 'stable') {
|
|
61
|
+
const v = distTags.latest;
|
|
62
|
+
if (typeof v !== 'string')
|
|
63
|
+
return null;
|
|
64
|
+
const p = parseSemver(v);
|
|
65
|
+
return p && p.prerelease.length === 0 ? v : null;
|
|
66
|
+
}
|
|
67
|
+
let best = null;
|
|
68
|
+
for (const v of [distTags.next, distTags.latest]) {
|
|
69
|
+
if (typeof v !== 'string' || !parseSemver(v))
|
|
70
|
+
continue;
|
|
71
|
+
if (best === null || compareSemver(v, best) > 0)
|
|
72
|
+
best = v;
|
|
73
|
+
}
|
|
74
|
+
return best;
|
|
75
|
+
}
|
|
76
|
+
/** A RegistryFetch over node:https that honours HTTPS_PROXY/NO_PROXY and aborts after `timeoutMs`. */
|
|
77
|
+
export function httpsRegistryFetch(requestImpl = request) {
|
|
78
|
+
return (url, { timeoutMs }) => new Promise((resolve, reject) => {
|
|
79
|
+
// proxyEnv exists from Node 24.5; older @types/node lacks it on AgentOptions.
|
|
80
|
+
const agent = new Agent({ proxyEnv: process.env });
|
|
81
|
+
const req = requestImpl(url, { method: 'GET', headers: { accept: 'application/json' }, agent, signal: AbortSignal.timeout(timeoutMs) }, (res) => {
|
|
82
|
+
const chunks = [];
|
|
83
|
+
res.on('data', (c) => chunks.push(c));
|
|
84
|
+
res.on('end', () => resolve({ status: res.statusCode ?? 0, body: Buffer.concat(chunks).toString('utf8') }));
|
|
85
|
+
res.on('error', reject);
|
|
86
|
+
});
|
|
87
|
+
req.on('error', reject);
|
|
88
|
+
req.end();
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
export async function fetchDistTags(fetchImpl, opts = {}) {
|
|
92
|
+
const registry = (opts.registry ?? DEFAULT_REGISTRY).replace(/\/+$/, '');
|
|
93
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
94
|
+
const url = `${registry}/-/package/${encodeURIComponent(PACKAGE_NAME)}/dist-tags`;
|
|
95
|
+
let res;
|
|
96
|
+
try {
|
|
97
|
+
res = await fetchImpl(url, { timeoutMs });
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
if (err instanceof Error && (err.name === 'TimeoutError' || err.name === 'AbortError')) {
|
|
101
|
+
throw new Error(`registry request timed out after ${timeoutMs} ms`);
|
|
102
|
+
}
|
|
103
|
+
throw err;
|
|
104
|
+
}
|
|
105
|
+
if (res.status < 200 || res.status > 299)
|
|
106
|
+
throw new Error(`registry returned HTTP ${res.status}`);
|
|
107
|
+
let parsed;
|
|
108
|
+
try {
|
|
109
|
+
parsed = JSON.parse(res.body);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
throw new Error('registry returned malformed dist-tags');
|
|
113
|
+
}
|
|
114
|
+
if (typeof parsed !== 'object' ||
|
|
115
|
+
parsed === null ||
|
|
116
|
+
Array.isArray(parsed) ||
|
|
117
|
+
!Object.values(parsed).every((v) => typeof v === 'string')) {
|
|
118
|
+
throw new Error('registry returned malformed dist-tags');
|
|
119
|
+
}
|
|
120
|
+
return parsed;
|
|
121
|
+
}
|
|
122
|
+
export async function checkForUpdate(mode, deps = {}) {
|
|
123
|
+
const install = detectInstall(deps.install);
|
|
124
|
+
const channel = updateChannel(mode);
|
|
125
|
+
const base = {
|
|
126
|
+
installKind: install.kind,
|
|
127
|
+
prefix: install.prefix,
|
|
128
|
+
channel,
|
|
129
|
+
current: install.version,
|
|
130
|
+
applies: install.kind === 'npm-global',
|
|
131
|
+
};
|
|
132
|
+
try {
|
|
133
|
+
const tags = await fetchDistTags(deps.fetch ?? httpsRegistryFetch(), {
|
|
134
|
+
registry: deps.registry,
|
|
135
|
+
timeoutMs: deps.timeoutMs,
|
|
136
|
+
});
|
|
137
|
+
const candidate = selectCandidate(tags, mode);
|
|
138
|
+
const updateAvailable = candidate !== null && compareSemver(candidate, install.version) > 0;
|
|
139
|
+
return { ...base, candidate, updateAvailable, error: null };
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
return {
|
|
143
|
+
...base,
|
|
144
|
+
candidate: null,
|
|
145
|
+
updateAvailable: false,
|
|
146
|
+
error: err instanceof Error ? err.message : String(err),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export function formatUpdateCheck(r) {
|
|
151
|
+
if (r.error !== null)
|
|
152
|
+
return `factory ${r.current}: update check failed (${r.channel}): ${r.error}`;
|
|
153
|
+
if (r.updateAvailable) {
|
|
154
|
+
const note = r.applies ? '' : `; not applied to a ${r.installKind} install`;
|
|
155
|
+
return `factory ${r.current} → ${r.candidate} available on ${r.channel} (${r.installKind} install)${note}`;
|
|
156
|
+
}
|
|
157
|
+
return `factory ${r.current} is up to date on ${r.channel}`;
|
|
158
|
+
}
|
|
159
|
+
export async function cmdSelfUpdateCheck(opts, deps = {}) {
|
|
160
|
+
const mode = parseUpdateMode(opts.updateMode ?? 'stable', '--update-mode');
|
|
161
|
+
if (mode === 'manual')
|
|
162
|
+
throw new DaemonCtlError('--check needs --update-mode stable or prerelease', 2);
|
|
163
|
+
const result = await checkForUpdate(mode, deps);
|
|
164
|
+
(deps.out ?? process.stdout).write(opts.json ? `${JSON.stringify(result)}\n` : `${formatUpdateCheck(result)}\n`);
|
|
165
|
+
return result.error !== null ? EXIT_ERROR : result.updateAvailable ? EXIT_UPDATE_AVAILABLE : EXIT_UP_TO_DATE;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=self-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/cli/self-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface StalenessDeps {
|
|
2
|
+
exists: (p: string) => boolean;
|
|
3
|
+
readFile: (p: string) => string;
|
|
4
|
+
/** Absolute paths of all files under dir, recursive. */
|
|
5
|
+
listFiles: (dir: string) => string[];
|
|
6
|
+
mtimeMs: (p: string) => number;
|
|
7
|
+
}
|
|
8
|
+
export declare function defaultStalenessDeps(): StalenessDeps;
|
|
9
|
+
export declare function findWorkspaceRoot(startDir: string, deps: StalenessDeps): string | undefined;
|
|
10
|
+
export interface PackageStaleness {
|
|
11
|
+
pkg: string;
|
|
12
|
+
stale: boolean;
|
|
13
|
+
reason: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function checkDistFreshness(rootDir: string, deps: StalenessDeps): PackageStaleness[];
|
|
16
|
+
export declare function formatStaleDistMessage(stale: PackageStaleness[], rootDir: string): string;
|
|
17
|
+
export interface StalenessGuardOpts {
|
|
18
|
+
entryUrl: string;
|
|
19
|
+
env: NodeJS.ProcessEnv;
|
|
20
|
+
argv: string[];
|
|
21
|
+
error: (msg: string) => void;
|
|
22
|
+
warn: (msg: string) => void;
|
|
23
|
+
deps?: StalenessDeps;
|
|
24
|
+
}
|
|
25
|
+
export declare function runStalenessGuard(opts: StalenessGuardOpts): number | null;
|
|
26
|
+
export declare function distFreshnessProbe(entryUrl: string, deps?: StalenessDeps): (() => {
|
|
27
|
+
fresh: boolean;
|
|
28
|
+
detail: string;
|
|
29
|
+
}) | undefined;
|
|
30
|
+
//# sourceMappingURL=staleness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staleness.d.ts","sourceRoot":"","sources":["../../src/cli/staleness.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/B,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAChC,wDAAwD;IACxD,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAChC;AAED,wBAAgB,oBAAoB,IAAI,aAAa,CAUpD;AAID,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAgB3F;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAeD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,gBAAgB,EAAE,CAuC3F;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQzF;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAyBzE;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,aAAsC,GAC3C,CAAC,MAAM;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,CAexD"}
|