@on-par/factory-cli 0.9.11-next.8 → 0.9.11-next.80
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 +16 -2
- package/dist/cli/base-health-ci.d.ts.map +1 -1
- package/dist/cli/base-health-ci.js +30 -5
- package/dist/cli/base-health-ci.js.map +1 -1
- package/dist/cli/base-hold.d.ts +7 -13
- package/dist/cli/base-hold.d.ts.map +1 -1
- package/dist/cli/base-hold.js +44 -30
- 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.d.ts.map +1 -1
- package/dist/cli/doctor.js +3 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/harness-check.d.ts.map +1 -1
- package/dist/cli/harness-check.js +8 -3
- package/dist/cli/harness-check.js.map +1 -1
- package/dist/cli/help-groups.d.ts.map +1 -1
- package/dist/cli/help-groups.js +16 -2
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/index.d.ts +29 -32
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +88 -174
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/json-contract.d.ts +309 -0
- package/dist/cli/json-contract.d.ts.map +1 -0
- package/dist/cli/json-contract.js +211 -0
- package/dist/cli/json-contract.js.map +1 -0
- package/dist/cli/land-pr.d.ts +4 -4
- package/dist/cli/land-pr.d.ts.map +1 -1
- package/dist/cli/land-pr.js +18 -17
- package/dist/cli/land-pr.js.map +1 -1
- package/dist/cli/land-risk.d.ts +29 -0
- package/dist/cli/land-risk.d.ts.map +1 -0
- package/dist/cli/land-risk.js +92 -0
- package/dist/cli/land-risk.js.map +1 -0
- package/dist/cli/land-runtime.d.ts +2 -1
- package/dist/cli/land-runtime.d.ts.map +1 -1
- package/dist/cli/land-runtime.js +3 -0
- package/dist/cli/land-runtime.js.map +1 -1
- package/dist/cli/land.d.ts +2 -0
- package/dist/cli/land.d.ts.map +1 -1
- package/dist/cli/land.js +46 -4
- package/dist/cli/land.js.map +1 -1
- package/dist/cli/lane-environment-pause-error.d.ts +3 -0
- package/dist/cli/lane-environment-pause-error.d.ts.map +1 -1
- package/dist/cli/lane-environment-pause-error.js +4 -0
- package/dist/cli/lane-environment-pause-error.js.map +1 -1
- package/dist/cli/logs.d.ts +4 -0
- package/dist/cli/logs.d.ts.map +1 -1
- package/dist/cli/logs.js +6 -2
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/model-override-messages.d.ts +4 -0
- package/dist/cli/model-override-messages.d.ts.map +1 -0
- package/dist/cli/model-override-messages.js +15 -0
- package/dist/cli/model-override-messages.js.map +1 -0
- package/dist/cli/program-observe.d.ts.map +1 -1
- package/dist/cli/program-observe.js +11 -0
- package/dist/cli/program-observe.js.map +1 -1
- package/dist/cli/program-run-work.d.ts.map +1 -1
- package/dist/cli/program-run-work.js +12 -0
- package/dist/cli/program-run-work.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 +52 -0
- package/dist/cli/queue-preflight.d.ts.map +1 -0
- package/dist/cli/queue-preflight.js +358 -0
- package/dist/cli/queue-preflight.js.map +1 -0
- package/dist/cli/risk-policy.d.ts +8 -0
- package/dist/cli/risk-policy.d.ts.map +1 -0
- package/dist/cli/risk-policy.js +39 -0
- package/dist/cli/risk-policy.js.map +1 -0
- package/dist/cli/risk.d.ts +42 -0
- package/dist/cli/risk.d.ts.map +1 -0
- package/dist/cli/risk.js +103 -0
- package/dist/cli/risk.js.map +1 -0
- package/dist/cli/run-branch.d.ts +26 -0
- package/dist/cli/run-branch.d.ts.map +1 -0
- package/dist/cli/run-branch.js +42 -0
- package/dist/cli/run-branch.js.map +1 -0
- package/dist/cli/run-lane.d.ts +6 -1
- package/dist/cli/run-lane.d.ts.map +1 -1
- package/dist/cli/run-lane.js +53 -6
- package/dist/cli/run-lane.js.map +1 -1
- package/dist/cli/run-restack.d.ts +14 -0
- package/dist/cli/run-restack.d.ts.map +1 -0
- package/dist/cli/run-restack.js +21 -0
- package/dist/cli/run-restack.js.map +1 -0
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +19 -11
- 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-reports.d.ts +34 -0
- package/dist/cli/ship-reports.d.ts.map +1 -0
- package/dist/cli/ship-reports.js +54 -0
- package/dist/cli/ship-reports.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 +17 -0
- package/dist/cli/ship-run-state.js.map +1 -0
- package/dist/cli/ship-steps.d.ts +4 -47
- package/dist/cli/ship-steps.d.ts.map +1 -1
- package/dist/cli/ship-steps.js +22 -82
- package/dist/cli/ship-steps.js.map +1 -1
- package/dist/cli/ship.d.ts +2 -0
- package/dist/cli/ship.d.ts.map +1 -1
- package/dist/cli/ship.js +64 -67
- package/dist/cli/ship.js.map +1 -1
- package/dist/cli/slice-index.d.ts +16 -0
- package/dist/cli/slice-index.d.ts.map +1 -0
- package/dist/cli/slice-index.js +27 -0
- package/dist/cli/slice-index.js.map +1 -0
- 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/steer.d.ts +50 -0
- package/dist/cli/steer.d.ts.map +1 -0
- package/dist/cli/steer.js +145 -0
- package/dist/cli/steer.js.map +1 -0
- package/dist/cli/steerability-report.d.ts +9 -0
- package/dist/cli/steerability-report.d.ts.map +1 -0
- package/dist/cli/steerability-report.js +28 -0
- package/dist/cli/steerability-report.js.map +1 -0
- 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 +9 -5
- package/schemas/cost.schema.json +114 -0
- package/schemas/daemon-status.schema.json +44 -0
- package/schemas/logs-line.schema.json +133 -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
|
|
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
import type { Octokit } from '@octokit/rest';
|
|
2
|
-
import { checkBaseHealth } from '@on-par/factory-core/internal';
|
|
3
|
-
|
|
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 {};
|
|
4
18
|
//# sourceMappingURL=base-health-ci.d.ts.map
|
|
@@ -1 +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,
|
|
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"}
|
|
@@ -1,9 +1,34 @@
|
|
|
1
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 } from '@on-par/factory-core/internal';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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),
|
|
7
32
|
});
|
|
8
33
|
}
|
|
9
34
|
//# sourceMappingURL=base-health-ci.js.map
|
|
@@ -1 +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,MAAM,+BAA+B,CAAC;
|
|
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,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { RequiredChecksVerdict } from '@on-par/factory-core/internal';
|
|
2
2
|
/** A base SHA found broken by an environment pause (ADR-0141). */
|
|
3
3
|
export interface BaseHold {
|
|
4
4
|
/** `owner/name` of the repo the hold applies to. */
|
|
@@ -9,6 +9,8 @@ export interface BaseHold {
|
|
|
9
9
|
since: string;
|
|
10
10
|
/** ISO-8601 time; set when the hold awaits GitHub CI on a timed-out base compile (#3186). */
|
|
11
11
|
ciRecheckAfter?: string;
|
|
12
|
+
/** A fresh local re-run failed while CI was green (#3287); CI green never clears it. */
|
|
13
|
+
confirmedLocally?: true;
|
|
12
14
|
}
|
|
13
15
|
/** Backoff between strict CI re-checks of a ci-awaiting hold (#3186). */
|
|
14
16
|
export declare const BASE_HOLD_CI_RECHECK_MS: number;
|
|
@@ -23,6 +25,8 @@ export interface BaseHoldCleared {
|
|
|
23
25
|
reason: BaseHoldClearReason;
|
|
24
26
|
/** origin/main SHA seen on the clearing poll. */
|
|
25
27
|
currentSha: string;
|
|
28
|
+
/** What a ci-green verdict was based on (#3195). */
|
|
29
|
+
basis?: string;
|
|
26
30
|
}
|
|
27
31
|
/** Deletes the hold only if it is still on `baseSha`; true only when this call deleted it. Fully
|
|
28
32
|
* synchronous, so concurrent lanes in one process cannot both get true. */
|
|
@@ -35,13 +39,12 @@ export type BaseHoldDecision = {
|
|
|
35
39
|
} | {
|
|
36
40
|
kind: 'hold';
|
|
37
41
|
hold: BaseHold;
|
|
42
|
+
ciReason?: string;
|
|
38
43
|
};
|
|
39
44
|
export interface BaseHoldGateDeps {
|
|
40
45
|
/** Current origin/main SHA; null (or a throw) means unknown. */
|
|
41
46
|
currentBaseSha: () => Promise<string | null>;
|
|
42
|
-
/**
|
|
43
|
-
baseCiGreen: (sha: string) => Promise<boolean>;
|
|
44
|
-
/** Strict required-checks lookup for a hold with `ciRecheckAfter` (#3186); absent = not green. */
|
|
47
|
+
/** Strict CI verdict used for every hold (#3186, #3195); absent = not green. */
|
|
45
48
|
requiredChecksVerdict?: (sha: string) => Promise<RequiredChecksVerdict>;
|
|
46
49
|
/** Clock in epoch ms; defaults to Date.now. */
|
|
47
50
|
now?: () => number;
|
|
@@ -52,21 +55,12 @@ export interface BaseHoldGateDeps {
|
|
|
52
55
|
* its CI is not green. Unknown origin/main fails open; a failed CI lookup counts as not green.
|
|
53
56
|
* Clears the hold when origin/main moved or its CI is green (#2350). */
|
|
54
57
|
export declare function evaluateBaseHold(file: string, repo: string, deps: BaseHoldGateDeps): Promise<BaseHoldDecision>;
|
|
55
|
-
/** Green = at least one check run, all completed, all on the ADR-0014 passing allow-list. */
|
|
56
|
-
export declare function isGreenCheckRunSet(runs: ReadonlyArray<{
|
|
57
|
-
status: string | null;
|
|
58
|
-
conclusion: string | null;
|
|
59
|
-
}>): boolean;
|
|
60
58
|
/** SHA from the first line of `git ls-remote` output, or null when absent or malformed. */
|
|
61
59
|
export declare function parseLsRemoteSha(stdout: string): string | null;
|
|
62
60
|
export declare function createBaseHoldGate(opts: {
|
|
63
61
|
file: string;
|
|
64
62
|
repo: string;
|
|
65
63
|
git: (cmd: string) => Promise<string>;
|
|
66
|
-
listCheckRuns: (ref: string) => Promise<Array<{
|
|
67
|
-
status: string | null;
|
|
68
|
-
conclusion: string | null;
|
|
69
|
-
}>>;
|
|
70
64
|
requiredChecksVerdict?: (sha: string) => Promise<RequiredChecksVerdict>;
|
|
71
65
|
onCleared?: (cleared: BaseHoldCleared) => void;
|
|
72
66
|
now?: () => number;
|
|
@@ -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
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
// #2350 clears the hold once origin/main moves or its CI goes green. #2351 reads it for
|
|
5
5
|
// `factory status`. #3186 adds `ciRecheckAfter`: a hold awaiting GitHub CI on a timed-out base
|
|
6
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.
|
|
7
9
|
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
8
10
|
import { dirname } from 'node:path';
|
|
9
|
-
import { isPassingConclusion } from '@on-par/factory-core/internal';
|
|
10
11
|
/** Backoff between strict CI re-checks of a ci-awaiting hold (#3186). */
|
|
11
12
|
export const BASE_HOLD_CI_RECHECK_MS = 5 * 60 * 1000;
|
|
12
13
|
export function writeBaseHold(file, hold) {
|
|
@@ -17,6 +18,7 @@ export function writeBaseHold(file, hold) {
|
|
|
17
18
|
failingChecks: [...hold.failingChecks],
|
|
18
19
|
since: hold.since,
|
|
19
20
|
...(hold.ciRecheckAfter !== undefined ? { ciRecheckAfter: hold.ciRecheckAfter } : {}),
|
|
21
|
+
...(hold.confirmedLocally === true ? { confirmedLocally: true } : {}),
|
|
20
22
|
};
|
|
21
23
|
writeFileSync(file, `${JSON.stringify(record, null, 2)}\n`);
|
|
22
24
|
}
|
|
@@ -33,13 +35,20 @@ export function readBaseHold(file) {
|
|
|
33
35
|
}
|
|
34
36
|
if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
|
|
35
37
|
return null;
|
|
36
|
-
const { repo, baseSha, failingChecks, since, ciRecheckAfter } = raw;
|
|
38
|
+
const { repo, baseSha, failingChecks, since, ciRecheckAfter, confirmedLocally } = raw;
|
|
37
39
|
if (typeof repo !== 'string' || typeof baseSha !== 'string' || typeof since !== 'string')
|
|
38
40
|
return null;
|
|
39
41
|
if (!Array.isArray(failingChecks) || !failingChecks.every((c) => typeof c === 'string'))
|
|
40
42
|
return null;
|
|
41
43
|
const recheck = typeof ciRecheckAfter === 'string' && Number.isFinite(Date.parse(ciRecheckAfter)) ? { ciRecheckAfter } : {};
|
|
42
|
-
return {
|
|
44
|
+
return {
|
|
45
|
+
repo,
|
|
46
|
+
baseSha,
|
|
47
|
+
failingChecks: [...failingChecks],
|
|
48
|
+
since,
|
|
49
|
+
...recheck,
|
|
50
|
+
...(confirmedLocally === true ? { confirmedLocally: true } : {}),
|
|
51
|
+
};
|
|
43
52
|
}
|
|
44
53
|
export function deleteBaseHold(file) {
|
|
45
54
|
rmSync(file, { force: true });
|
|
@@ -58,12 +67,20 @@ export function formatBaseHoldCleared(c) {
|
|
|
58
67
|
const now = c.currentSha.slice(0, 8);
|
|
59
68
|
return c.reason === 'sha-changed'
|
|
60
69
|
? `base hold on ${held} cleared (reason: sha-changed): origin/main moved to ${now}`
|
|
61
|
-
: `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'})`;
|
|
62
71
|
}
|
|
63
72
|
/** `factory status` lines for an active hold (#2351). */
|
|
64
73
|
export function formatBaseHoldStatus(hold) {
|
|
65
74
|
const checks = hold.failingChecks.length > 0 ? hold.failingChecks.join(', ') : '(none recorded)';
|
|
66
|
-
|
|
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;
|
|
67
84
|
}
|
|
68
85
|
/** Decides whether a lane may claim: hold only while origin/main is still at the held SHA and
|
|
69
86
|
* its CI is not green. Unknown origin/main fails open; a failed CI lookup counts as not green.
|
|
@@ -81,11 +98,11 @@ export async function evaluateBaseHold(file, repo, deps) {
|
|
|
81
98
|
}
|
|
82
99
|
if (sha === null)
|
|
83
100
|
return { kind: 'claim' };
|
|
84
|
-
const clear = (reason, currentSha) => {
|
|
101
|
+
const clear = (reason, currentSha, basis) => {
|
|
85
102
|
if (!clearBaseHold(file, hold.baseSha))
|
|
86
103
|
return;
|
|
87
104
|
try {
|
|
88
|
-
deps.onCleared?.({ hold, reason, currentSha });
|
|
105
|
+
deps.onCleared?.({ hold, reason, currentSha, ...(basis !== undefined ? { basis } : {}) });
|
|
89
106
|
}
|
|
90
107
|
catch {
|
|
91
108
|
// an observer failure must not change the decision
|
|
@@ -95,19 +112,16 @@ export async function evaluateBaseHold(file, repo, deps) {
|
|
|
95
112
|
clear('sha-changed', sha);
|
|
96
113
|
return { kind: 'claim' };
|
|
97
114
|
}
|
|
115
|
+
if (hold.confirmedLocally === true) {
|
|
116
|
+
return { kind: 'hold', hold, ciReason: 'confirmed locally: a fresh base re-run failed while CI was green' };
|
|
117
|
+
}
|
|
98
118
|
if (hold.ciRecheckAfter !== undefined) {
|
|
99
119
|
const now = deps.now ?? Date.now;
|
|
100
120
|
if (now() < Date.parse(hold.ciRecheckAfter))
|
|
101
121
|
return { kind: 'hold', hold };
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
strictGreen = false;
|
|
108
|
-
}
|
|
109
|
-
if (strictGreen) {
|
|
110
|
-
clear('ci-green', sha);
|
|
122
|
+
const v = await strictVerdict(deps, sha);
|
|
123
|
+
if (v.green) {
|
|
124
|
+
clear('ci-green', sha, v.basis);
|
|
111
125
|
return { kind: 'claim' };
|
|
112
126
|
}
|
|
113
127
|
try {
|
|
@@ -116,23 +130,24 @@ export async function evaluateBaseHold(file, repo, deps) {
|
|
|
116
130
|
catch {
|
|
117
131
|
// a failed re-arm only means the next poll re-checks sooner
|
|
118
132
|
}
|
|
119
|
-
return { kind: 'hold', hold };
|
|
133
|
+
return { kind: 'hold', hold, ciReason: v.reason };
|
|
120
134
|
}
|
|
121
|
-
|
|
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);
|
|
139
|
+
return { kind: 'claim' };
|
|
140
|
+
}
|
|
141
|
+
async function strictVerdict(deps, sha) {
|
|
142
|
+
if (!deps.requiredChecksVerdict)
|
|
143
|
+
return { green: false, reason: 'no CI lookup configured' };
|
|
122
144
|
try {
|
|
123
|
-
|
|
145
|
+
const v = await deps.requiredChecksVerdict(sha);
|
|
146
|
+
return v.green ? v : { ...v, green: false };
|
|
124
147
|
}
|
|
125
|
-
catch {
|
|
126
|
-
green
|
|
148
|
+
catch (err) {
|
|
149
|
+
return { green: false, reason: `CI lookup failed: ${err instanceof Error ? err.message : String(err)}` };
|
|
127
150
|
}
|
|
128
|
-
if (!green)
|
|
129
|
-
return { kind: 'hold', hold };
|
|
130
|
-
clear('ci-green', sha);
|
|
131
|
-
return { kind: 'claim' };
|
|
132
|
-
}
|
|
133
|
-
/** Green = at least one check run, all completed, all on the ADR-0014 passing allow-list. */
|
|
134
|
-
export function isGreenCheckRunSet(runs) {
|
|
135
|
-
return runs.length > 0 && runs.every((r) => r.status === 'completed' && isPassingConclusion(r.conclusion));
|
|
136
151
|
}
|
|
137
152
|
/** SHA from the first line of `git ls-remote` output, or null when absent or malformed. */
|
|
138
153
|
export function parseLsRemoteSha(stdout) {
|
|
@@ -143,7 +158,6 @@ export function parseLsRemoteSha(stdout) {
|
|
|
143
158
|
export function createBaseHoldGate(opts) {
|
|
144
159
|
return () => evaluateBaseHold(opts.file, opts.repo, {
|
|
145
160
|
currentBaseSha: async () => parseLsRemoteSha(await opts.git('git ls-remote origin refs/heads/main')),
|
|
146
|
-
baseCiGreen: async (sha) => isGreenCheckRunSet(await opts.listCheckRuns(sha)),
|
|
147
161
|
requiredChecksVerdict: opts.requiredChecksVerdict,
|
|
148
162
|
onCleared: opts.onCleared,
|
|
149
163
|
now: opts.now,
|
|
@@ -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,+FAA+F;AAC/F,oGAAoG;
|
|
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) => {
|