@on-par/factory-cli 0.9.11-next.5 → 0.9.11-next.51
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/README.md +1 -1
- package/dist/cli/base-health-ci.d.ts +18 -0
- package/dist/cli/base-health-ci.d.ts.map +1 -0
- package/dist/cli/base-health-ci.js +34 -0
- package/dist/cli/base-health-ci.js.map +1 -0
- package/dist/cli/base-hold.d.ts +16 -11
- package/dist/cli/base-hold.d.ts.map +1 -1
- package/dist/cli/base-hold.js +64 -20
- package/dist/cli/base-hold.js.map +1 -1
- package/dist/cli/cost-json.d.ts +5 -31
- package/dist/cli/cost-json.d.ts.map +1 -1
- package/dist/cli/cost-json.js +13 -2
- package/dist/cli/cost-json.js.map +1 -1
- package/dist/cli/daemon.d.ts +2 -15
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +5 -11
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/doctor.js +1 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +10 -48
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +43 -191
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/json-contract.d.ts +306 -0
- package/dist/cli/json-contract.d.ts.map +1 -0
- package/dist/cli/json-contract.js +208 -0
- package/dist/cli/json-contract.js.map +1 -0
- package/dist/cli/land-pr.d.ts.map +1 -1
- package/dist/cli/land-pr.js +5 -0
- package/dist/cli/land-pr.js.map +1 -1
- package/dist/cli/lane-environment-pause-error.d.ts +22 -0
- package/dist/cli/lane-environment-pause-error.d.ts.map +1 -0
- package/dist/cli/lane-environment-pause-error.js +28 -0
- package/dist/cli/lane-environment-pause-error.js.map +1 -0
- package/dist/cli/logs.d.ts +14 -0
- package/dist/cli/logs.d.ts.map +1 -1
- package/dist/cli/logs.js +46 -4
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/program-observe.d.ts.map +1 -1
- package/dist/cli/program-observe.js +5 -2
- package/dist/cli/program-observe.js.map +1 -1
- package/dist/cli/queue-add-json.d.ts +3 -25
- package/dist/cli/queue-add-json.d.ts.map +1 -1
- package/dist/cli/queue-add-json.js.map +1 -1
- package/dist/cli/queue-list.d.ts +6 -24
- package/dist/cli/queue-list.d.ts.map +1 -1
- package/dist/cli/queue-list.js +6 -1
- package/dist/cli/queue-list.js.map +1 -1
- package/dist/cli/queue-preflight.d.ts +45 -0
- package/dist/cli/queue-preflight.d.ts.map +1 -0
- package/dist/cli/queue-preflight.js +277 -0
- package/dist/cli/queue-preflight.js.map +1 -0
- package/dist/cli/run-branch.d.ts +24 -0
- package/dist/cli/run-branch.d.ts.map +1 -0
- package/dist/cli/run-branch.js +38 -0
- package/dist/cli/run-branch.js.map +1 -0
- package/dist/cli/run-lane.d.ts.map +1 -1
- package/dist/cli/run-lane.js +6 -2
- package/dist/cli/run-lane.js.map +1 -1
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +17 -3
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/runs-diffstat.d.ts +6 -25
- package/dist/cli/runs-diffstat.d.ts.map +1 -1
- package/dist/cli/runs-diffstat.js.map +1 -1
- package/dist/cli/runs.d.ts +4 -19
- package/dist/cli/runs.d.ts.map +1 -1
- package/dist/cli/runs.js +1 -1
- package/dist/cli/runs.js.map +1 -1
- package/dist/cli/self-update-stop.d.ts +7 -0
- package/dist/cli/self-update-stop.d.ts.map +1 -0
- package/dist/cli/self-update-stop.js +27 -0
- package/dist/cli/self-update-stop.js.map +1 -0
- package/dist/cli/ship-run-state.d.ts +5 -0
- package/dist/cli/ship-run-state.d.ts.map +1 -0
- package/dist/cli/ship-run-state.js +12 -0
- package/dist/cli/ship-run-state.js.map +1 -0
- package/dist/cli/ship-steps.d.ts +1 -1
- package/dist/cli/ship-steps.d.ts.map +1 -1
- package/dist/cli/ship-steps.js +15 -12
- package/dist/cli/ship-steps.js.map +1 -1
- package/dist/cli/ship.d.ts.map +1 -1
- package/dist/cli/ship.js +27 -24
- package/dist/cli/ship.js.map +1 -1
- package/dist/cli/status-json.d.ts +7 -28
- package/dist/cli/status-json.d.ts.map +1 -1
- package/dist/cli/status-json.js +3 -1
- package/dist/cli/status-json.js.map +1 -1
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js +4 -1
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/stop-resume-json.d.ts +2 -10
- package/dist/cli/stop-resume-json.d.ts.map +1 -1
- package/dist/cli/stop-resume-json.js +1 -0
- package/dist/cli/stop-resume-json.js.map +1 -1
- package/dist/cli/usage-json.d.ts +4 -13
- package/dist/cli/usage-json.d.ts.map +1 -1
- package/dist/cli/usage-json.js.map +1 -1
- package/dist/cli/worktree-reap.d.ts.map +1 -1
- package/dist/cli/worktree-reap.js +7 -1
- package/dist/cli/worktree-reap.js.map +1 -1
- package/package.json +8 -5
- package/schemas/cost.schema.json +114 -0
- package/schemas/daemon-status.schema.json +44 -0
- package/schemas/logs-line.schema.json +118 -0
- package/schemas/queue-add.schema.json +73 -0
- package/schemas/queue-list.schema.json +77 -0
- package/schemas/resume.schema.json +36 -0
- package/schemas/runs-diffstat.schema.json +81 -0
- package/schemas/runs.schema.json +75 -0
- package/schemas/status.schema.json +200 -0
- package/schemas/stop.schema.json +36 -0
- package/schemas/unpark.schema.json +57 -0
- package/schemas/usage.schema.json +28 -0
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ factory --version
|
|
|
16
16
|
factory doctor
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
Also requires `git`, one supported coding agent CLI (see [docs/agents.md](https://github.com/on-par/software-factory/blob/main/docs/agents.md)), signed in, and the GitHub CLI signed in with `gh auth login`. The factory reads `GITHUB_TOKEN`, then `GH_TOKEN`, and falls back to `gh auth token`. `factory doctor` checks all of this and prints a fix for anything missing. It also checks your git identity and the sandbox runtime, and it runs outside a repo. Global or repo-local `git config` for `user.name` and `user.email` both work. On Linux, install `firejail` first
|
|
19
|
+
Also requires `git`, one supported coding agent CLI (see [docs/agents.md](https://github.com/on-par/software-factory/blob/main/docs/agents.md)), signed in, and the GitHub CLI signed in with `gh auth login`. The factory reads `GITHUB_TOKEN`, then `GH_TOKEN`, and falls back to `gh auth token`. `factory doctor` checks all of this and prints a fix for anything missing. It also checks your git identity and the sandbox runtime, and it runs outside a repo. Global or repo-local `git config` for `user.name` and `user.email` both work. On Linux, install `firejail` first; without it, Codex still runs with `--sandbox workspace-write`.
|
|
20
20
|
|
|
21
21
|
`factory init` creates a local-only `.factory/` (git-excluded) with a `default-code` constitution. See the main README quick start.
|
|
22
22
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Octokit } from '@octokit/rest';
|
|
2
|
+
import { checkBaseHealth, fetchRequiredChecksVerdict } from '@on-par/factory-core/internal';
|
|
3
|
+
type RequiredChecksVerdict = Awaited<ReturnType<typeof fetchRequiredChecksVerdict>>;
|
|
4
|
+
interface BaseChecksOptions {
|
|
5
|
+
checks?: readonly string[];
|
|
6
|
+
events?: string;
|
|
7
|
+
lane?: string;
|
|
8
|
+
}
|
|
9
|
+
/** Test-only: forget which failed push workflows were already reported. */
|
|
10
|
+
export declare function resetBasePushWorkflowReports(): void;
|
|
11
|
+
/**
|
|
12
|
+
* The base verdict shared by the base-hold gate and base health (#3287, #3290): only code-health checks decide it.
|
|
13
|
+
* A failed non-code push workflow (Release, deploy) logs one `base_push_workflow_failed` event per repo, SHA and workflow.
|
|
14
|
+
*/
|
|
15
|
+
export declare function baseChecksVerdict(octokit: Octokit, owner: string, repo: string, opts: BaseChecksOptions): (sha: string) => Promise<RequiredChecksVerdict>;
|
|
16
|
+
export declare function baseHealthWithCi(octokit: Octokit, owner: string, repo: string, opts?: BaseChecksOptions): (opts: Parameters<typeof checkBaseHealth>[0]) => ReturnType<typeof checkBaseHealth>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=base-health-ci.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-health-ci.d.ts","sourceRoot":"","sources":["../../src/cli/base-health-ci.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAY,MAAM,+BAA+B,CAAC;AAEtG,KAAK,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC,CAAC;AAEpF,UAAU,iBAAiB;IACzB,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,2EAA2E;AAC3E,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,iBAAiB,GACtB,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAuBjD;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,iBAAsB,GAC3B,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,OAAO,eAAe,CAAC,CAOrF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// packages/cli/src/cli/base-health-ci.ts — base health port with the strict GitHub CI lookup bound in (#3186)
|
|
2
|
+
import { checkBaseHealth, fetchRequiredChecksVerdict, logEvent } from '@on-par/factory-core/internal';
|
|
3
|
+
const reported = new Set();
|
|
4
|
+
/** Test-only: forget which failed push workflows were already reported. */
|
|
5
|
+
export function resetBasePushWorkflowReports() {
|
|
6
|
+
reported.clear();
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The base verdict shared by the base-hold gate and base health (#3287, #3290): only code-health checks decide it.
|
|
10
|
+
* A failed non-code push workflow (Release, deploy) logs one `base_push_workflow_failed` event per repo, SHA and workflow.
|
|
11
|
+
*/
|
|
12
|
+
export function baseChecksVerdict(octokit, owner, repo, opts) {
|
|
13
|
+
return (sha) => fetchRequiredChecksVerdict(octokit, { owner, repo, branch: 'main', sha }, {
|
|
14
|
+
pushFallback: true,
|
|
15
|
+
checks: opts.checks,
|
|
16
|
+
onPushWorkflowFailed: (f) => {
|
|
17
|
+
const key = `${owner}/${repo}@${f.sha}:${f.workflow}`;
|
|
18
|
+
if (reported.has(key))
|
|
19
|
+
return;
|
|
20
|
+
reported.add(key);
|
|
21
|
+
if (!opts.events)
|
|
22
|
+
return;
|
|
23
|
+
logEvent(opts.events, 'base_push_workflow_failed', opts.lane ?? '-', `push workflow ${f.workflow} ${f.conclusion} on ${f.sha.slice(0, 8)}; not a code-health check, base not held`, { lane: opts.lane });
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export function baseHealthWithCi(octokit, owner, repo, opts = {}) {
|
|
28
|
+
return (healthOpts) => checkBaseHealth({
|
|
29
|
+
...healthOpts,
|
|
30
|
+
// The gate in run.ts uses the same helper, so both see the same verdict on 403-protection repos (#3287, #3290).
|
|
31
|
+
requiredChecksVerdict: baseChecksVerdict(octokit, owner, repo, opts),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=base-health-ci.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-health-ci.js","sourceRoot":"","sources":["../../src/cli/base-health-ci.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAG9G,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAUtG,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;AAEnC,2EAA2E;AAC3E,MAAM,UAAU,4BAA4B;IAC1C,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAgB,EAChB,KAAa,EACb,IAAY,EACZ,IAAuB;IAEvB,OAAO,CAAC,GAAG,EAAE,EAAE,CACb,0BAA0B,CACxB,OAAO,EACP,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EACpC;QACE,YAAY,EAAE,IAAI;QAClB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE;YAC1B,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACtD,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO;YAC9B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO;YACzB,QAAQ,CACN,IAAI,CAAC,MAAM,EACX,2BAA2B,EAC3B,IAAI,CAAC,IAAI,IAAI,GAAG,EAChB,iBAAiB,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,UAAU,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,0CAA0C,EAC7G,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CACpB,CAAC;QACJ,CAAC;KACF,CACF,CAAC;AACN,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAgB,EAChB,KAAa,EACb,IAAY,EACZ,IAAI,GAAsB,EAAE;IAE5B,OAAO,CAAC,UAAU,EAAE,EAAE,CACpB,eAAe,CAAC;QACd,GAAG,UAAU;QACb,gHAAgH;QAChH,qBAAqB,EAAE,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;KACrE,CAAC,CAAC;AACP,CAAC"}
|
package/dist/cli/base-hold.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { RequiredChecksVerdict } from '@on-par/factory-core/internal';
|
|
1
2
|
/** A base SHA found broken by an environment pause (ADR-0141). */
|
|
2
3
|
export interface BaseHold {
|
|
3
4
|
/** `owner/name` of the repo the hold applies to. */
|
|
@@ -6,7 +7,13 @@ export interface BaseHold {
|
|
|
6
7
|
failingChecks: string[];
|
|
7
8
|
/** ISO-8601 time the hold was recorded. */
|
|
8
9
|
since: string;
|
|
10
|
+
/** ISO-8601 time; set when the hold awaits GitHub CI on a timed-out base compile (#3186). */
|
|
11
|
+
ciRecheckAfter?: string;
|
|
12
|
+
/** A fresh local re-run failed while CI was green (#3287); CI green never clears it. */
|
|
13
|
+
confirmedLocally?: true;
|
|
9
14
|
}
|
|
15
|
+
/** Backoff between strict CI re-checks of a ci-awaiting hold (#3186). */
|
|
16
|
+
export declare const BASE_HOLD_CI_RECHECK_MS: number;
|
|
10
17
|
export declare function writeBaseHold(file: string, hold: BaseHold): void;
|
|
11
18
|
/** Fails soft: a missing, unreadable, non-JSON, non-object or wrongly-typed file is no hold (null). */
|
|
12
19
|
export declare function readBaseHold(file: string): BaseHold | null;
|
|
@@ -18,6 +25,8 @@ export interface BaseHoldCleared {
|
|
|
18
25
|
reason: BaseHoldClearReason;
|
|
19
26
|
/** origin/main SHA seen on the clearing poll. */
|
|
20
27
|
currentSha: string;
|
|
28
|
+
/** What a ci-green verdict was based on (#3195). */
|
|
29
|
+
basis?: string;
|
|
21
30
|
}
|
|
22
31
|
/** Deletes the hold only if it is still on `baseSha`; true only when this call deleted it. Fully
|
|
23
32
|
* synchronous, so concurrent lanes in one process cannot both get true. */
|
|
@@ -30,12 +39,15 @@ export type BaseHoldDecision = {
|
|
|
30
39
|
} | {
|
|
31
40
|
kind: 'hold';
|
|
32
41
|
hold: BaseHold;
|
|
42
|
+
ciReason?: string;
|
|
33
43
|
};
|
|
34
44
|
export interface BaseHoldGateDeps {
|
|
35
45
|
/** Current origin/main SHA; null (or a throw) means unknown. */
|
|
36
46
|
currentBaseSha: () => Promise<string | null>;
|
|
37
|
-
/**
|
|
38
|
-
|
|
47
|
+
/** Strict CI verdict used for every hold (#3186, #3195); absent = not green. */
|
|
48
|
+
requiredChecksVerdict?: (sha: string) => Promise<RequiredChecksVerdict>;
|
|
49
|
+
/** Clock in epoch ms; defaults to Date.now. */
|
|
50
|
+
now?: () => number;
|
|
39
51
|
/** Called once, only by the poll that actually deleted the hold. A throw is swallowed. */
|
|
40
52
|
onCleared?: (cleared: BaseHoldCleared) => void;
|
|
41
53
|
}
|
|
@@ -43,21 +55,14 @@ export interface BaseHoldGateDeps {
|
|
|
43
55
|
* its CI is not green. Unknown origin/main fails open; a failed CI lookup counts as not green.
|
|
44
56
|
* Clears the hold when origin/main moved or its CI is green (#2350). */
|
|
45
57
|
export declare function evaluateBaseHold(file: string, repo: string, deps: BaseHoldGateDeps): Promise<BaseHoldDecision>;
|
|
46
|
-
/** Green = at least one check run, all completed, all on the ADR-0014 passing allow-list. */
|
|
47
|
-
export declare function isGreenCheckRunSet(runs: ReadonlyArray<{
|
|
48
|
-
status: string | null;
|
|
49
|
-
conclusion: string | null;
|
|
50
|
-
}>): boolean;
|
|
51
58
|
/** SHA from the first line of `git ls-remote` output, or null when absent or malformed. */
|
|
52
59
|
export declare function parseLsRemoteSha(stdout: string): string | null;
|
|
53
60
|
export declare function createBaseHoldGate(opts: {
|
|
54
61
|
file: string;
|
|
55
62
|
repo: string;
|
|
56
63
|
git: (cmd: string) => Promise<string>;
|
|
57
|
-
|
|
58
|
-
status: string | null;
|
|
59
|
-
conclusion: string | null;
|
|
60
|
-
}>>;
|
|
64
|
+
requiredChecksVerdict?: (sha: string) => Promise<RequiredChecksVerdict>;
|
|
61
65
|
onCleared?: (cleared: BaseHoldCleared) => void;
|
|
66
|
+
now?: () => number;
|
|
62
67
|
}): () => Promise<BaseHoldDecision>;
|
|
63
68
|
//# sourceMappingURL=base-hold.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-hold.d.ts","sourceRoot":"","sources":["../../src/cli/base-hold.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base-hold.d.ts","sourceRoot":"","sources":["../../src/cli/base-hold.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/base-hold.js
CHANGED
|
@@ -2,10 +2,14 @@
|
|
|
2
2
|
// base SHA (#2348), so a restarted supervisor remembers the pause. #2349 reads it back as the
|
|
3
3
|
// claim gate: no claiming while origin/main is still at the held SHA and its CI is not green.
|
|
4
4
|
// #2350 clears the hold once origin/main moves or its CI goes green. #2351 reads it for
|
|
5
|
-
// `factory status`.
|
|
5
|
+
// `factory status`. #3186 adds `ciRecheckAfter`: a hold awaiting GitHub CI on a timed-out base
|
|
6
|
+
// compile backs off and is re-checked with the strict required-checks verdict, not the lenient one.
|
|
7
|
+
// #3287 adds `confirmedLocally`: a hold whose fresh local re-run failed while CI was green is
|
|
8
|
+
// never cleared by CI green, only when origin/main moves.
|
|
6
9
|
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
7
10
|
import { dirname } from 'node:path';
|
|
8
|
-
|
|
11
|
+
/** Backoff between strict CI re-checks of a ci-awaiting hold (#3186). */
|
|
12
|
+
export const BASE_HOLD_CI_RECHECK_MS = 5 * 60 * 1000;
|
|
9
13
|
export function writeBaseHold(file, hold) {
|
|
10
14
|
mkdirSync(dirname(file), { recursive: true });
|
|
11
15
|
const record = {
|
|
@@ -13,6 +17,8 @@ export function writeBaseHold(file, hold) {
|
|
|
13
17
|
baseSha: hold.baseSha,
|
|
14
18
|
failingChecks: [...hold.failingChecks],
|
|
15
19
|
since: hold.since,
|
|
20
|
+
...(hold.ciRecheckAfter !== undefined ? { ciRecheckAfter: hold.ciRecheckAfter } : {}),
|
|
21
|
+
...(hold.confirmedLocally === true ? { confirmedLocally: true } : {}),
|
|
16
22
|
};
|
|
17
23
|
writeFileSync(file, `${JSON.stringify(record, null, 2)}\n`);
|
|
18
24
|
}
|
|
@@ -29,12 +35,20 @@ export function readBaseHold(file) {
|
|
|
29
35
|
}
|
|
30
36
|
if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
|
|
31
37
|
return null;
|
|
32
|
-
const { repo, baseSha, failingChecks, since } = raw;
|
|
38
|
+
const { repo, baseSha, failingChecks, since, ciRecheckAfter, confirmedLocally } = raw;
|
|
33
39
|
if (typeof repo !== 'string' || typeof baseSha !== 'string' || typeof since !== 'string')
|
|
34
40
|
return null;
|
|
35
41
|
if (!Array.isArray(failingChecks) || !failingChecks.every((c) => typeof c === 'string'))
|
|
36
42
|
return null;
|
|
37
|
-
|
|
43
|
+
const recheck = typeof ciRecheckAfter === 'string' && Number.isFinite(Date.parse(ciRecheckAfter)) ? { ciRecheckAfter } : {};
|
|
44
|
+
return {
|
|
45
|
+
repo,
|
|
46
|
+
baseSha,
|
|
47
|
+
failingChecks: [...failingChecks],
|
|
48
|
+
since,
|
|
49
|
+
...recheck,
|
|
50
|
+
...(confirmedLocally === true ? { confirmedLocally: true } : {}),
|
|
51
|
+
};
|
|
38
52
|
}
|
|
39
53
|
export function deleteBaseHold(file) {
|
|
40
54
|
rmSync(file, { force: true });
|
|
@@ -53,12 +67,20 @@ export function formatBaseHoldCleared(c) {
|
|
|
53
67
|
const now = c.currentSha.slice(0, 8);
|
|
54
68
|
return c.reason === 'sha-changed'
|
|
55
69
|
? `base hold on ${held} cleared (reason: sha-changed): origin/main moved to ${now}`
|
|
56
|
-
: `base hold on ${held} cleared (reason: ci-green): main CI on ${now} is green`;
|
|
70
|
+
: `base hold on ${held} cleared (reason: ci-green): main CI on ${now} is green (${c.basis ?? 'required checks'})`;
|
|
57
71
|
}
|
|
58
72
|
/** `factory status` lines for an active hold (#2351). */
|
|
59
73
|
export function formatBaseHoldStatus(hold) {
|
|
60
74
|
const checks = hold.failingChecks.length > 0 ? hold.failingChecks.join(', ') : '(none recorded)';
|
|
61
|
-
|
|
75
|
+
const lines = [
|
|
76
|
+
` repo: ${hold.repo}`,
|
|
77
|
+
` baseSha: ${hold.baseSha}`,
|
|
78
|
+
` failingChecks: ${checks}`,
|
|
79
|
+
` since: ${hold.since}`,
|
|
80
|
+
];
|
|
81
|
+
if (hold.confirmedLocally === true)
|
|
82
|
+
lines.push(' confirmedLocally: true');
|
|
83
|
+
return lines;
|
|
62
84
|
}
|
|
63
85
|
/** Decides whether a lane may claim: hold only while origin/main is still at the held SHA and
|
|
64
86
|
* its CI is not green. Unknown origin/main fails open; a failed CI lookup counts as not green.
|
|
@@ -76,11 +98,11 @@ export async function evaluateBaseHold(file, repo, deps) {
|
|
|
76
98
|
}
|
|
77
99
|
if (sha === null)
|
|
78
100
|
return { kind: 'claim' };
|
|
79
|
-
const clear = (reason, currentSha) => {
|
|
101
|
+
const clear = (reason, currentSha, basis) => {
|
|
80
102
|
if (!clearBaseHold(file, hold.baseSha))
|
|
81
103
|
return;
|
|
82
104
|
try {
|
|
83
|
-
deps.onCleared?.({ hold, reason, currentSha });
|
|
105
|
+
deps.onCleared?.({ hold, reason, currentSha, ...(basis !== undefined ? { basis } : {}) });
|
|
84
106
|
}
|
|
85
107
|
catch {
|
|
86
108
|
// an observer failure must not change the decision
|
|
@@ -90,21 +112,42 @@ export async function evaluateBaseHold(file, repo, deps) {
|
|
|
90
112
|
clear('sha-changed', sha);
|
|
91
113
|
return { kind: 'claim' };
|
|
92
114
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
green = await deps.baseCiGreen(sha);
|
|
115
|
+
if (hold.confirmedLocally === true) {
|
|
116
|
+
return { kind: 'hold', hold, ciReason: 'confirmed locally: a fresh base re-run failed while CI was green' };
|
|
96
117
|
}
|
|
97
|
-
|
|
98
|
-
|
|
118
|
+
if (hold.ciRecheckAfter !== undefined) {
|
|
119
|
+
const now = deps.now ?? Date.now;
|
|
120
|
+
if (now() < Date.parse(hold.ciRecheckAfter))
|
|
121
|
+
return { kind: 'hold', hold };
|
|
122
|
+
const v = await strictVerdict(deps, sha);
|
|
123
|
+
if (v.green) {
|
|
124
|
+
clear('ci-green', sha, v.basis);
|
|
125
|
+
return { kind: 'claim' };
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
writeBaseHold(file, { ...hold, ciRecheckAfter: new Date(now() + BASE_HOLD_CI_RECHECK_MS).toISOString() });
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// a failed re-arm only means the next poll re-checks sooner
|
|
132
|
+
}
|
|
133
|
+
return { kind: 'hold', hold, ciReason: v.reason };
|
|
99
134
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
135
|
+
const v = await strictVerdict(deps, sha);
|
|
136
|
+
if (!v.green)
|
|
137
|
+
return { kind: 'hold', hold, ciReason: v.reason };
|
|
138
|
+
clear('ci-green', sha, v.basis);
|
|
103
139
|
return { kind: 'claim' };
|
|
104
140
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
141
|
+
async function strictVerdict(deps, sha) {
|
|
142
|
+
if (!deps.requiredChecksVerdict)
|
|
143
|
+
return { green: false, reason: 'no CI lookup configured' };
|
|
144
|
+
try {
|
|
145
|
+
const v = await deps.requiredChecksVerdict(sha);
|
|
146
|
+
return v.green ? v : { ...v, green: false };
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
return { green: false, reason: `CI lookup failed: ${err instanceof Error ? err.message : String(err)}` };
|
|
150
|
+
}
|
|
108
151
|
}
|
|
109
152
|
/** SHA from the first line of `git ls-remote` output, or null when absent or malformed. */
|
|
110
153
|
export function parseLsRemoteSha(stdout) {
|
|
@@ -115,8 +158,9 @@ export function parseLsRemoteSha(stdout) {
|
|
|
115
158
|
export function createBaseHoldGate(opts) {
|
|
116
159
|
return () => evaluateBaseHold(opts.file, opts.repo, {
|
|
117
160
|
currentBaseSha: async () => parseLsRemoteSha(await opts.git('git ls-remote origin refs/heads/main')),
|
|
118
|
-
|
|
161
|
+
requiredChecksVerdict: opts.requiredChecksVerdict,
|
|
119
162
|
onCleared: opts.onCleared,
|
|
163
|
+
now: opts.now,
|
|
120
164
|
});
|
|
121
165
|
}
|
|
122
166
|
//# sourceMappingURL=base-hold.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-hold.js","sourceRoot":"","sources":["../../src/cli/base-hold.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,8FAA8F;AAC9F,8FAA8F;AAC9F,wFAAwF;AACxF,
|
|
1
|
+
{"version":3,"file":"base-hold.js","sourceRoot":"","sources":["../../src/cli/base-hold.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/cost-json.d.ts
CHANGED
|
@@ -1,37 +1,11 @@
|
|
|
1
1
|
import { type CostEntry } from '@on-par/factory-core';
|
|
2
|
+
import type { CostJson } from './json-contract.js';
|
|
3
|
+
/** `factory cost --json` payload (#2269); additive changes bump schemaVersion only when breaking. */
|
|
4
|
+
export type { CostJson } from './json-contract.js';
|
|
2
5
|
/** One cost row in `factory cost --json` (#2269). CostEntry field names. */
|
|
3
|
-
export
|
|
4
|
-
ts: string;
|
|
5
|
-
issue: string;
|
|
6
|
-
task: string;
|
|
7
|
-
model: string;
|
|
8
|
-
inputTokens: number;
|
|
9
|
-
outputTokens: number;
|
|
10
|
-
cacheReadTokens: number | null;
|
|
11
|
-
cacheCreationTokens: number | null;
|
|
12
|
-
/** null when unpriced (ADR-0020); never 0 for an unpriced row. */
|
|
13
|
-
cost: number | null;
|
|
14
|
-
}
|
|
6
|
+
export type CostRowJson = CostJson['rows'][number];
|
|
15
7
|
/** Per-model rollup over the (filtered) rows, first-seen model order. */
|
|
16
|
-
export
|
|
17
|
-
model: string;
|
|
18
|
-
tasks: number;
|
|
19
|
-
inputTokens: number;
|
|
20
|
-
outputTokens: number;
|
|
21
|
-
/** Sum of priced rows; null when every row for the model is unpriced. */
|
|
22
|
-
cost: number | null;
|
|
23
|
-
unpricedCount: number;
|
|
24
|
-
}
|
|
25
|
-
/** `factory cost --json` payload (#2269). Additive changes only; bump schemaVersion on a breaking change. */
|
|
26
|
-
export interface CostJson {
|
|
27
|
-
schemaVersion: 1;
|
|
28
|
-
rows: CostRowJson[];
|
|
29
|
-
perModel: CostModelRowJson[];
|
|
30
|
-
total: {
|
|
31
|
-
cost: number | null;
|
|
32
|
-
unpricedCount: number;
|
|
33
|
-
};
|
|
34
|
-
}
|
|
8
|
+
export type CostModelRowJson = CostJson['perModel'][number];
|
|
35
9
|
/** Build the `factory cost --json` payload; `issue` keeps only that issue's rows. */
|
|
36
10
|
export declare function buildCostJson(entries: CostEntry[], issue?: string): CostJson;
|
|
37
11
|
//# sourceMappingURL=cost-json.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost-json.d.ts","sourceRoot":"","sources":["../../src/cli/cost-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"cost-json.d.ts","sourceRoot":"","sources":["../../src/cli/cost-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,qGAAqG;AACrG,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,4EAA4E;AAC5E,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,yEAAyE;AACzE,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAiE5E"}
|
package/dist/cli/cost-json.js
CHANGED
|
@@ -4,6 +4,7 @@ export function buildCostJson(entries, issue) {
|
|
|
4
4
|
const filtered = issue === undefined ? entries : entries.filter((e) => e.issue === String(issue));
|
|
5
5
|
const rows = [];
|
|
6
6
|
const models = new Map();
|
|
7
|
+
let cachedRateMissingTotal = 0;
|
|
7
8
|
for (const e of filtered) {
|
|
8
9
|
const cost = e.unpriced === true || e.cost == null ? null : e.cost;
|
|
9
10
|
const inputTokens = e.inputTokens ?? 0;
|
|
@@ -21,12 +22,16 @@ export function buildCostJson(entries, issue) {
|
|
|
21
22
|
});
|
|
22
23
|
let m = models.get(e.model);
|
|
23
24
|
if (m === undefined) {
|
|
24
|
-
m = { tasks: 0, inputTokens: 0, outputTokens: 0, sum: 0, priced: 0, unpriced: 0 };
|
|
25
|
+
m = { tasks: 0, inputTokens: 0, outputTokens: 0, sum: 0, priced: 0, unpriced: 0, cachedRateMissing: 0 };
|
|
25
26
|
models.set(e.model, m);
|
|
26
27
|
}
|
|
27
28
|
m.tasks += 1;
|
|
28
29
|
m.inputTokens += inputTokens;
|
|
29
30
|
m.outputTokens += outputTokens;
|
|
31
|
+
if (e.cachedRateMissing === true) {
|
|
32
|
+
m.cachedRateMissing += 1;
|
|
33
|
+
cachedRateMissingTotal += 1;
|
|
34
|
+
}
|
|
30
35
|
if (cost === null)
|
|
31
36
|
m.unpriced += 1;
|
|
32
37
|
else {
|
|
@@ -41,8 +46,14 @@ export function buildCostJson(entries, issue) {
|
|
|
41
46
|
outputTokens: m.outputTokens,
|
|
42
47
|
cost: m.priced === 0 && m.unpriced > 0 ? null : m.sum,
|
|
43
48
|
unpricedCount: m.unpriced,
|
|
49
|
+
cachedRateMissingCount: m.cachedRateMissing,
|
|
44
50
|
}));
|
|
45
51
|
const t = aggregateCosts(filtered).total;
|
|
46
|
-
return {
|
|
52
|
+
return {
|
|
53
|
+
schemaVersion: 1,
|
|
54
|
+
rows,
|
|
55
|
+
perModel,
|
|
56
|
+
total: { cost: t.cost, unpricedCount: t.unpricedCount, cachedRateMissingCount: cachedRateMissingTotal },
|
|
57
|
+
};
|
|
47
58
|
}
|
|
48
59
|
//# sourceMappingURL=cost-json.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost-json.js","sourceRoot":"","sources":["../../src/cli/cost-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAkB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"cost-json.js","sourceRoot":"","sources":["../../src/cli/cost-json.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/daemon.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type RunRuntime } from '@on-par/factory-core/internal';
|
|
2
|
+
export type { DaemonStatusJson } from './json-contract.js';
|
|
2
3
|
import { type UpdateState } from './update-state.js';
|
|
3
4
|
export declare const FACTORYD_LABEL = "com.onpar.factoryd";
|
|
4
5
|
/** Expected daemon-control failure. index.ts's commander wrappers map it onto
|
|
@@ -119,19 +120,6 @@ export declare function renderFactorydPlist(opts: {
|
|
|
119
120
|
logPath: string;
|
|
120
121
|
}): string;
|
|
121
122
|
/** Extracts the running pid from `launchctl print gui/<uid>/<label>` output. */
|
|
122
|
-
/** `factory daemon status --json` payload (#2267). Additive changes only; bump schemaVersion on a breaking change. */
|
|
123
|
-
export interface DaemonStatusJson {
|
|
124
|
-
schemaVersion: 1;
|
|
125
|
-
running: boolean;
|
|
126
|
-
pid: number | null;
|
|
127
|
-
uptimeSec: number | null;
|
|
128
|
-
plistInstalled: boolean;
|
|
129
|
-
repos: Array<{
|
|
130
|
-
slug: string;
|
|
131
|
-
checkoutPath: string;
|
|
132
|
-
state: RepoState;
|
|
133
|
-
}>;
|
|
134
|
-
}
|
|
135
123
|
/** ps `etime` ([[dd-]hh:]mm:ss) → whole seconds; null when empty or malformed. */
|
|
136
124
|
export declare function parseEtime(etime: string): number | null;
|
|
137
125
|
export declare function parseLaunchctlPid(printOutput: string): number | null;
|
|
@@ -221,5 +209,4 @@ export declare function createAutoUpdateDeps(opts: {
|
|
|
221
209
|
log: (line: string) => void;
|
|
222
210
|
exit: (code: number) => Promise<void> | void;
|
|
223
211
|
}): AutoUpdateDeps;
|
|
224
|
-
export {};
|
|
225
212
|
//# sourceMappingURL=daemon.d.ts.map
|
package/dist/cli/daemon.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/daemon.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// wrappers around the foreground factoryd (#1179, epic #764), plus `daemon run`
|
|
3
3
|
// option resolution into FactorydConfig (#2128).
|
|
4
4
|
import { execFile } from 'node:child_process';
|
|
5
|
-
import { closeSync, existsSync, fstatSync, mkdirSync, openSync, readFileSync, readSync, realpathSync,
|
|
5
|
+
import { closeSync, existsSync, fstatSync, mkdirSync, openSync, readFileSync, readSync, realpathSync, writeFileSync, } from 'node:fs';
|
|
6
6
|
import { homedir } from 'node:os';
|
|
7
7
|
import { createRequire } from 'node:module';
|
|
8
8
|
import { dirname, join, sep } from 'node:path';
|
|
@@ -10,6 +10,7 @@ import { DEFAULT_FACTORYD_PORT, defaultRegistryPath, listRepos, loadRegistry, re
|
|
|
10
10
|
import { defaultIsPidAlive, getFactoryPaths } from '@on-par/factory-core';
|
|
11
11
|
import { bootstrapFailureMessage, reloadLaunchAgent } from './daemon-launchctl.js';
|
|
12
12
|
import { runSelfUpdateCommand } from './self-update-exec.js';
|
|
13
|
+
import { clearSelfUpdateStops, writeSelfUpdateStop } from './self-update-stop.js';
|
|
13
14
|
import { initialUpdateState, readUpdateState, recordUpdateCheck, writeUpdateState, } from './update-state.js';
|
|
14
15
|
export const FACTORYD_LABEL = 'com.onpar.factoryd';
|
|
15
16
|
/** Expected daemon-control failure. index.ts's commander wrappers map it onto
|
|
@@ -184,6 +185,7 @@ export function renderFactorydPlist(opts) {
|
|
|
184
185
|
</plist>
|
|
185
186
|
`;
|
|
186
187
|
}
|
|
188
|
+
/** Extracts the running pid from `launchctl print gui/<uid>/<label>` output. */
|
|
187
189
|
/** ps `etime` ([[dd-]hh:]mm:ss) → whole seconds; null when empty or malformed. */
|
|
188
190
|
export function parseEtime(etime) {
|
|
189
191
|
const m = /^(?:(\d+)-)?(?:(\d+):)?(\d+):(\d+)$/.exec(etime.trim());
|
|
@@ -598,7 +600,7 @@ export function createAutoUpdateDeps(opts) {
|
|
|
598
600
|
const stop = getFactoryPaths(e.path, e.stateRoot).stop;
|
|
599
601
|
try {
|
|
600
602
|
mkdirSync(dirname(stop), { recursive: true });
|
|
601
|
-
|
|
603
|
+
writeSelfUpdateStop(stop);
|
|
602
604
|
created.push(stop);
|
|
603
605
|
}
|
|
604
606
|
catch (err) {
|
|
@@ -610,15 +612,7 @@ export function createAutoUpdateDeps(opts) {
|
|
|
610
612
|
return created;
|
|
611
613
|
},
|
|
612
614
|
async clearStops(files) {
|
|
613
|
-
|
|
614
|
-
try {
|
|
615
|
-
unlinkSync(f);
|
|
616
|
-
}
|
|
617
|
-
catch (err) {
|
|
618
|
-
if (err.code !== 'ENOENT')
|
|
619
|
-
throw err;
|
|
620
|
-
}
|
|
621
|
-
}
|
|
615
|
+
clearSelfUpdateStops(files);
|
|
622
616
|
},
|
|
623
617
|
now: Date.now,
|
|
624
618
|
sleep: (ms) => new Promise((res) => {
|