@on-par/factory-cli 0.9.11-next.9 → 0.9.12-next.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/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 +2 -0
- package/dist/cli/base-hold.d.ts.map +1 -1
- package/dist/cli/base-hold.js +24 -3
- 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/octokit.d.ts +3 -0
- package/dist/cli/octokit.d.ts.map +1 -1
- package/dist/cli/octokit.js +1 -1
- package/dist/cli/octokit.js.map +1 -1
- 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 +52 -5
- 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 -2
- 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
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// packages/cli/src/cli/steer.ts — `factory steer <ref>`: append a human or bot steer to a run (#3401).
|
|
2
|
+
import { readdir } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { appendSteerEvent, readIssueRunState, runStateFile, STEER_PHASES, STEER_SOURCES, SteerEventError, writeIssueRunState, } from '@on-par/factory-core/internal';
|
|
5
|
+
import { getFactoryPaths } from '@on-par/factory-core';
|
|
6
|
+
export class SteerCliError extends Error {
|
|
7
|
+
code;
|
|
8
|
+
constructor(message, code, options) {
|
|
9
|
+
super(message, options);
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.name = 'SteerCliError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function parseSteerRef(raw) {
|
|
15
|
+
const text = raw.trim();
|
|
16
|
+
const found = [
|
|
17
|
+
['any', text.match(/^#?(\d+)$/)],
|
|
18
|
+
['issue', text.match(/\/issues\/(\d+)\/?$/)],
|
|
19
|
+
['pr', text.match(/\/pull\/(\d+)\/?$/)],
|
|
20
|
+
];
|
|
21
|
+
for (const [kind, match] of found) {
|
|
22
|
+
if (!match)
|
|
23
|
+
continue;
|
|
24
|
+
const n = Number(match[1]);
|
|
25
|
+
if (Number.isSafeInteger(n) && n >= 1)
|
|
26
|
+
return { kind, number: n, raw };
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
throw new SteerCliError(`invalid reference '${raw}' — expected an issue or PR number (42, #42) or a GitHub issue/pull URL`, 'bad-input');
|
|
30
|
+
}
|
|
31
|
+
export async function resolveSteerRun(runsDir, ref) {
|
|
32
|
+
if (ref.kind !== 'pr') {
|
|
33
|
+
const file = runStateFile(runsDir, ref.number);
|
|
34
|
+
const state = await readIssueRunState(file);
|
|
35
|
+
if (state)
|
|
36
|
+
return { file, state };
|
|
37
|
+
}
|
|
38
|
+
if (ref.kind !== 'issue') {
|
|
39
|
+
let names;
|
|
40
|
+
try {
|
|
41
|
+
names = await readdir(runsDir);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
names = [];
|
|
45
|
+
}
|
|
46
|
+
for (const name of names.filter((n) => /^issue-(\d+)\.json$/.test(n)).sort()) {
|
|
47
|
+
const file = join(runsDir, name);
|
|
48
|
+
const state = await readIssueRunState(file);
|
|
49
|
+
if (state?.prNumber === ref.number)
|
|
50
|
+
return { file, state };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
throw new SteerCliError(`no run found for ${ref.raw}`, 'no-run');
|
|
54
|
+
}
|
|
55
|
+
export function phaseForStatus(status) {
|
|
56
|
+
switch (status) {
|
|
57
|
+
case 'pending':
|
|
58
|
+
case 'planning':
|
|
59
|
+
return 'plan';
|
|
60
|
+
case 'building':
|
|
61
|
+
case 'reworking':
|
|
62
|
+
return 'build';
|
|
63
|
+
case 'checking':
|
|
64
|
+
return 'check';
|
|
65
|
+
case 'shipping':
|
|
66
|
+
case 'ready':
|
|
67
|
+
case 'awaiting-review':
|
|
68
|
+
case 'merged':
|
|
69
|
+
return 'ship';
|
|
70
|
+
case 'parked':
|
|
71
|
+
case 'escalated':
|
|
72
|
+
case 'failed':
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function requireMessage(opts) {
|
|
77
|
+
const message = opts.message?.trim() ?? '';
|
|
78
|
+
if (message === '')
|
|
79
|
+
throw new SteerCliError('--message must not be empty', 'bad-input');
|
|
80
|
+
return message;
|
|
81
|
+
}
|
|
82
|
+
export function buildSteerEvent(state, opts, deps) {
|
|
83
|
+
const message = requireMessage(opts);
|
|
84
|
+
const rawSource = opts.source ?? 'cli';
|
|
85
|
+
const source = STEER_SOURCES.find((s) => s === rawSource);
|
|
86
|
+
if (!source) {
|
|
87
|
+
throw new SteerCliError(`invalid --source '${rawSource}' — expected one of ${STEER_SOURCES.join(', ')}`, 'bad-input');
|
|
88
|
+
}
|
|
89
|
+
if (source === 'bot' && !opts.actor?.trim())
|
|
90
|
+
throw new SteerCliError('--source bot needs --actor <id>', 'bad-input');
|
|
91
|
+
let phase;
|
|
92
|
+
if (opts.phase !== undefined) {
|
|
93
|
+
const given = opts.phase;
|
|
94
|
+
phase = STEER_PHASES.find((p) => p === given) ?? null;
|
|
95
|
+
if (!phase) {
|
|
96
|
+
throw new SteerCliError(`invalid --phase '${given}' — expected one of ${STEER_PHASES.join(', ')}`, 'bad-input');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
phase = phaseForStatus(state.status);
|
|
101
|
+
}
|
|
102
|
+
if (!phase) {
|
|
103
|
+
throw new SteerCliError(`run #${state.issue} is ${state.status}; pass --phase ${STEER_PHASES.join('|')}`, 'bad-input');
|
|
104
|
+
}
|
|
105
|
+
const actor = opts.actor?.trim() || deps.defaultActor();
|
|
106
|
+
return { ts: deps.now(), actor, source, phase, summary: message, ...(opts.unblocked ? { unblocked: true } : {}) };
|
|
107
|
+
}
|
|
108
|
+
export async function runSteer(rawRef, opts, deps) {
|
|
109
|
+
const ref = parseSteerRef(rawRef);
|
|
110
|
+
requireMessage(opts);
|
|
111
|
+
const { file, state } = await resolveSteerRun(deps.runsDir, ref);
|
|
112
|
+
const event = buildSteerEvent(state, opts, deps);
|
|
113
|
+
let next;
|
|
114
|
+
try {
|
|
115
|
+
next = appendSteerEvent(state, event);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
if (err instanceof SteerEventError)
|
|
119
|
+
throw new SteerCliError(err.message, 'bad-input', { cause: err });
|
|
120
|
+
throw err;
|
|
121
|
+
}
|
|
122
|
+
await writeIssueRunState(file, next);
|
|
123
|
+
return { issue: state.issue, file, event };
|
|
124
|
+
}
|
|
125
|
+
/** `factory steer <ref>`: bad input exits 2, no matching run exits 1, anything else exits 1 with its detail. */
|
|
126
|
+
export async function cmdSteer(ref, opts, rt) {
|
|
127
|
+
let result;
|
|
128
|
+
try {
|
|
129
|
+
parseSteerRef(ref); // a bad <ref> exits 2 before any git lookup
|
|
130
|
+
const gitUser = (await rt.gitUserName().catch(() => '')).trim();
|
|
131
|
+
result = await runSteer(ref, opts, {
|
|
132
|
+
runsDir: getFactoryPaths(await rt.getRepoRoot()).runs,
|
|
133
|
+
now: rt.now,
|
|
134
|
+
defaultActor: () => gitUser || rt.env.USER || 'unknown',
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
if (err instanceof SteerCliError) {
|
|
139
|
+
throw new rt.CliExitError(`factory: steer — ${err.message}`, err.code === 'no-run' ? 1 : 2);
|
|
140
|
+
}
|
|
141
|
+
throw new rt.CliExitError(`factory: steer failed — ${rt.errorDetail(err)}`, 1);
|
|
142
|
+
}
|
|
143
|
+
rt.log(`factory: steer recorded on #${result.issue} (source ${result.event.source}, phase ${result.event.phase}, actor ${result.event.actor})`);
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=steer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steer.js","sourceRoot":"","sources":["../../src/cli/steer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type IssueRunState, type SteerabilityReport } from '@on-par/factory-core/internal';
|
|
2
|
+
/** Every parseable `issue-<n>.json` run state in `runsDir`; phase snapshots and malformed files are skipped. */
|
|
3
|
+
export declare function readRunStates(runsDir: string): Promise<IssueRunState[]>;
|
|
4
|
+
/** Steers per merged PR from local run states and classifier-outcomes.jsonl (#3403). */
|
|
5
|
+
export declare function buildSteerabilityReport(paths: {
|
|
6
|
+
runs: string;
|
|
7
|
+
classifierOutcomes: string;
|
|
8
|
+
}): Promise<SteerabilityReport>;
|
|
9
|
+
//# sourceMappingURL=steerability-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steerability-report.d.ts","sourceRoot":"","sources":["../../src/cli/steerability-report.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,+BAA+B,CAAC;AAWvC,gHAAgH;AAChH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAM7E;AAED,wFAAwF;AACxF,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAK9B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { parseClassifierOutcomes } from '@on-par/factory-core';
|
|
4
|
+
import { collectMergedPrSteers, readIssueRunState, summarizeSteerability, } from '@on-par/factory-core/internal';
|
|
5
|
+
async function readOrEmpty(read, empty) {
|
|
6
|
+
try {
|
|
7
|
+
return await read();
|
|
8
|
+
}
|
|
9
|
+
catch (err) {
|
|
10
|
+
if (err.code === 'ENOENT')
|
|
11
|
+
return empty;
|
|
12
|
+
throw err;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Every parseable `issue-<n>.json` run state in `runsDir`; phase snapshots and malformed files are skipped. */
|
|
16
|
+
export async function readRunStates(runsDir) {
|
|
17
|
+
const names = await readOrEmpty(() => readdir(runsDir), []);
|
|
18
|
+
const states = await Promise.all(names.filter((name) => /^issue-(\d+)\.json$/.test(name)).map((name) => readIssueRunState(join(runsDir, name))));
|
|
19
|
+
return states.filter((s) => s !== null && typeof s.issue === 'number');
|
|
20
|
+
}
|
|
21
|
+
/** Steers per merged PR from local run states and classifier-outcomes.jsonl (#3403). */
|
|
22
|
+
export async function buildSteerabilityReport(paths) {
|
|
23
|
+
const text = await readOrEmpty(() => readFile(paths.classifierOutcomes, 'utf-8'), '');
|
|
24
|
+
const runs = await readRunStates(paths.runs);
|
|
25
|
+
const { rows, unmatched } = collectMergedPrSteers(runs, parseClassifierOutcomes(text));
|
|
26
|
+
return summarizeSteerability(rows, unmatched);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=steerability-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steerability-report.js","sourceRoot":"","sources":["../../src/cli/steerability-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,GAGtB,MAAM,+BAA+B,CAAC;AAEvC,KAAK,UAAU,WAAW,CAAI,IAAsB,EAAE,KAAQ;IAC5D,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACnE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gHAAgH;AAChH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAc,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAC/G,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAsB,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;AAC7F,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAG7C;IACC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACtF,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,qBAAqB,CAAC,IAAI,EAAE,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;IACvF,OAAO,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -1,14 +1,6 @@
|
|
|
1
|
+
import type { StopResumeJson } from './json-contract.js';
|
|
2
|
+
export type { StopResumeJson } from './json-contract.js';
|
|
1
3
|
/** `factory stop|resume --json` payload (#2276). Additive changes only; bump schemaVersion on a breaking change. */
|
|
2
|
-
export interface StopResumeJson {
|
|
3
|
-
schemaVersion: 1;
|
|
4
|
-
ok: true;
|
|
5
|
-
action: 'stop' | 'resume';
|
|
6
|
-
repo: string;
|
|
7
|
-
stopFlag: {
|
|
8
|
-
before: boolean;
|
|
9
|
-
after: boolean;
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
4
|
export declare function buildStopResumeJson(input: {
|
|
13
5
|
action: 'stop' | 'resume';
|
|
14
6
|
repo: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop-resume-json.d.ts","sourceRoot":"","sources":["../../src/cli/stop-resume-json.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"stop-resume-json.d.ts","sourceRoot":"","sources":["../../src/cli/stop-resume-json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,oHAAoH;AAEpH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,cAAc,CAQjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop-resume-json.js","sourceRoot":"","sources":["../../src/cli/stop-resume-json.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stop-resume-json.js","sourceRoot":"","sources":["../../src/cli/stop-resume-json.ts"],"names":[],"mappings":"AAIA,oHAAoH;AAEpH,MAAM,UAAU,mBAAmB,CAAC,KAKnC;IACC,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;KACvD,CAAC;AACJ,CAAC"}
|
package/dist/cli/usage-json.d.ts
CHANGED
|
@@ -1,19 +1,10 @@
|
|
|
1
1
|
import type { SubscriptionUsage } from '@on-par/factory-core';
|
|
2
|
+
import type { UsageJson } from './json-contract.js';
|
|
3
|
+
/** `factory usage --json` payload (#2270); absent readings are null, never 0 (ADR-0099). */
|
|
4
|
+
export type { UsageJson } from './json-contract.js';
|
|
2
5
|
/** Hours in the trailing usage window `factory usage` reports on. */
|
|
3
6
|
export declare const USAGE_WINDOW_HOURS: number;
|
|
4
|
-
export type UsageJsonSource = '
|
|
5
|
-
/** `factory usage --json` payload (#2270). Absent readings are null, never 0 (ADR-0099).
|
|
6
|
-
* Additive changes only; bump schemaVersion on a breaking change. */
|
|
7
|
-
export interface UsageJson {
|
|
8
|
-
schemaVersion: 1;
|
|
9
|
-
source: UsageJsonSource;
|
|
10
|
-
/** Percent of the window used, 0-100 scale. */
|
|
11
|
-
utilizationPct: number | null;
|
|
12
|
-
resetsAt: string | null;
|
|
13
|
-
windowHours: number;
|
|
14
|
-
/** Trailing-window list-price estimate in USD. */
|
|
15
|
-
estimateUsd: number | null;
|
|
16
|
-
}
|
|
7
|
+
export type UsageJsonSource = UsageJson['source'];
|
|
17
8
|
/** Builds the `factory usage --json` payload: the real subscription reading when present, else the
|
|
18
9
|
* list-price heuristic against `cap`, else an explicit `unavailable` record. Numbers are not rounded. */
|
|
19
10
|
export declare function buildUsageJson(subscription: SubscriptionUsage | null, estimateUsd: number | null, cap: number): UsageJson;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-json.d.ts","sourceRoot":"","sources":["../../src/cli/usage-json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"usage-json.d.ts","sourceRoot":"","sources":["../../src/cli/usage-json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,4FAA4F;AAC5F,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,QAAiC,CAAC;AAEjE,MAAM,MAAM,eAAe,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAElD;0GAC0G;AAC1G,wBAAgB,cAAc,CAC5B,YAAY,EAAE,iBAAiB,GAAG,IAAI,EACtC,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,GAAG,EAAE,MAAM,GACV,SAAS,CA6BX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-json.js","sourceRoot":"","sources":["../../src/cli/usage-json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"usage-json.js","sourceRoot":"","sources":["../../src/cli/usage-json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAMnE,qEAAqE;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,GAAG,SAAS,CAAC;AAIjE;0GAC0G;AAC1G,MAAM,UAAU,cAAc,CAC5B,YAAsC,EACtC,WAA0B,EAC1B,GAAW;IAEX,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO;YACL,aAAa,EAAE,CAAC;YAChB,MAAM,EAAE,cAAc;YACtB,cAAc,EAAE,YAAY,CAAC,mBAAmB;YAChD,QAAQ,EAAE,YAAY,CAAC,gBAAgB;YACvC,WAAW,EAAE,kBAAkB;YAC/B,WAAW;SACZ,CAAC;IACJ,CAAC;IACD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO;YACL,aAAa,EAAE,CAAC;YAChB,MAAM,EAAE,WAAW;YACnB,cAAc,EAAE,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG;YACzC,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,kBAAkB;YAC/B,WAAW;SACZ,CAAC;IACJ,CAAC;IACD,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,MAAM,EAAE,aAAa;QACrB,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,kBAAkB;QAC/B,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-reap.d.ts","sourceRoot":"","sources":["../../src/cli/worktree-reap.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAa,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EACL,KAAK,sBAAsB,
|
|
1
|
+
{"version":3,"file":"worktree-reap.d.ts","sourceRoot":"","sources":["../../src/cli/worktree-reap.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAa,aAAa,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EACL,KAAK,sBAAsB,EAE3B,KAAK,eAAe,EAGpB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EAItB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAEhD,mGAAmG;AACnG,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,0BAA0B,GAAG,gBAAgB,CAAC,CAAC,CAAC;IACtF,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAC/F;AAED;2FAC2F;AAC3F,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,SAAS,EAChD,QAAQ,EAAE,MAAM,GACf,eAAe,GAAG,SAAS,CAI7B;AAED;uGACuG;AACvG,iBAAe,aAAa,CAAC,CAAC,EAC5B,EAAE,EAAE,WAAW,EACf,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,EACrG,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GACvF,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,CAAC,GAAG,SAAS,CAAA;CAAE,CAAC,CAkBtE;AAED;;mCAEmC;AACnC,wBAAsB,cAAc,CAClC,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,OAAO,gBAAgB,EAC7B,IAAI,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC,CAef;AAED;qFACqF;AACrF,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAkBlH;AAED;;qEAEqE;AACrE,wBAAsB,cAAc,CAClC,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,OAAO,qBAAqB,EAClC,IAAI,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// packages/cli/src/cli/worktree-reap.ts — eager lane-worktree reaps (#1007, #3008), moved out of index.ts
|
|
2
2
|
import { resolveSandboxPolicy } from '@on-par/factory-core';
|
|
3
|
-
import { logEvent, resolveEffectiveConfig, withFileLock, withGitLock, worktreeSandboxFor, } from '@on-par/factory-core/internal';
|
|
3
|
+
import { findWorktreeKeep, logEvent, resolveEffectiveConfig, withFileLock, withGitLock, worktreeSandboxFor, } from '@on-par/factory-core/internal';
|
|
4
4
|
/** The repo's current docker-sandbox descriptor for worktree-gc sweeps, or undefined for
|
|
5
5
|
* every other runtime/config state (including a fixture config with no `sandbox` key). */
|
|
6
6
|
export function gcWorktreeSandbox(sandboxCfg, repoRoot) {
|
|
@@ -32,6 +32,12 @@ async function reapUnderLock(rt, [issue, repoRoot, ghRepo, paths, prefixOverride
|
|
|
32
32
|
* gates live in reapLaneWorktree. A reap failure is logged as a warn and never surfaces —
|
|
33
33
|
* parking must always succeed. */
|
|
34
34
|
export async function reapParkedLane(rt, reap, args) {
|
|
35
|
+
const [issue, , , paths] = args;
|
|
36
|
+
const keep = findWorktreeKeep(paths.worktreeKeeps, issue, (type, msg) => logEvent(paths.events, type, issue, msg));
|
|
37
|
+
if (keep) {
|
|
38
|
+
logEvent(paths.events, 'worktree-gc', issue, `kept ${keep.path} — kept (${keep.reason}); not reaping the parked lane's worktree or branch`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
35
41
|
await reapUnderLock(rt, args, 'parked-lane worktree reap failed', (worktreePath, opts) => reap(args[1], worktreePath, opts));
|
|
36
42
|
}
|
|
37
43
|
/** The one run-output line for a PR-less ship's reap: where the worktree is and why it was kept
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-reap.js","sourceRoot":"","sources":["../../src/cli/worktree-reap.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAG1G,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"worktree-reap.js","sourceRoot":"","sources":["../../src/cli/worktree-reap.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@on-par/factory-cli",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.12-next.1",
|
|
4
4
|
"description": "On PAR Dev's Software Factory CLI: takes a GitHub issue through plan, build and check with AI agents, then opens a ready-for-review PR.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-agents",
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"files": [
|
|
19
19
|
"dist",
|
|
20
|
+
"schemas",
|
|
20
21
|
"!dist/.tsbuildinfo"
|
|
21
22
|
],
|
|
22
23
|
"publishConfig": {
|
|
@@ -47,12 +48,15 @@
|
|
|
47
48
|
"@octokit/plugin-retry": "^8.1.1",
|
|
48
49
|
"@octokit/plugin-throttling": "^11.0.5",
|
|
49
50
|
"@octokit/rest": "^22.0.0",
|
|
50
|
-
"@on-par/factory-
|
|
51
|
-
"@on-par/factory-
|
|
52
|
-
"
|
|
51
|
+
"@on-par/factory-config": "0.9.12-next.1",
|
|
52
|
+
"@on-par/factory-core": "0.9.12-next.1",
|
|
53
|
+
"@on-par/factory-tui": "0.9.12-next.1",
|
|
54
|
+
"commander": "^15.0.0",
|
|
55
|
+
"zod": "^4.6.5"
|
|
53
56
|
},
|
|
54
57
|
"license": "MIT",
|
|
55
58
|
"devDependencies": {
|
|
56
|
-
"@types/node": "^26.6.5"
|
|
59
|
+
"@types/node": "^26.6.5",
|
|
60
|
+
"ajv": "^8.20.0"
|
|
57
61
|
}
|
|
58
62
|
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"properties": {
|
|
5
|
+
"schemaVersion": {
|
|
6
|
+
"type": "number",
|
|
7
|
+
"const": 1
|
|
8
|
+
},
|
|
9
|
+
"rows": {
|
|
10
|
+
"type": "array",
|
|
11
|
+
"items": {
|
|
12
|
+
"type": "object",
|
|
13
|
+
"properties": {
|
|
14
|
+
"ts": {
|
|
15
|
+
"type": "string"
|
|
16
|
+
},
|
|
17
|
+
"issue": {
|
|
18
|
+
"type": "string"
|
|
19
|
+
},
|
|
20
|
+
"task": {
|
|
21
|
+
"type": "string"
|
|
22
|
+
},
|
|
23
|
+
"model": {
|
|
24
|
+
"type": "string"
|
|
25
|
+
},
|
|
26
|
+
"inputTokens": {
|
|
27
|
+
"type": "number"
|
|
28
|
+
},
|
|
29
|
+
"outputTokens": {
|
|
30
|
+
"type": "number"
|
|
31
|
+
},
|
|
32
|
+
"cacheReadTokens": {
|
|
33
|
+
"type": ["number", "null"]
|
|
34
|
+
},
|
|
35
|
+
"cacheCreationTokens": {
|
|
36
|
+
"type": ["number", "null"]
|
|
37
|
+
},
|
|
38
|
+
"cost": {
|
|
39
|
+
"type": ["number", "null"]
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"required": [
|
|
43
|
+
"ts",
|
|
44
|
+
"issue",
|
|
45
|
+
"task",
|
|
46
|
+
"model",
|
|
47
|
+
"inputTokens",
|
|
48
|
+
"outputTokens",
|
|
49
|
+
"cacheReadTokens",
|
|
50
|
+
"cacheCreationTokens",
|
|
51
|
+
"cost"
|
|
52
|
+
],
|
|
53
|
+
"additionalProperties": false
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"perModel": {
|
|
57
|
+
"type": "array",
|
|
58
|
+
"items": {
|
|
59
|
+
"type": "object",
|
|
60
|
+
"properties": {
|
|
61
|
+
"model": {
|
|
62
|
+
"type": "string"
|
|
63
|
+
},
|
|
64
|
+
"tasks": {
|
|
65
|
+
"type": "number"
|
|
66
|
+
},
|
|
67
|
+
"inputTokens": {
|
|
68
|
+
"type": "number"
|
|
69
|
+
},
|
|
70
|
+
"outputTokens": {
|
|
71
|
+
"type": "number"
|
|
72
|
+
},
|
|
73
|
+
"cost": {
|
|
74
|
+
"type": ["number", "null"]
|
|
75
|
+
},
|
|
76
|
+
"unpricedCount": {
|
|
77
|
+
"type": "number"
|
|
78
|
+
},
|
|
79
|
+
"cachedRateMissingCount": {
|
|
80
|
+
"type": "number"
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"required": [
|
|
84
|
+
"model",
|
|
85
|
+
"tasks",
|
|
86
|
+
"inputTokens",
|
|
87
|
+
"outputTokens",
|
|
88
|
+
"cost",
|
|
89
|
+
"unpricedCount",
|
|
90
|
+
"cachedRateMissingCount"
|
|
91
|
+
],
|
|
92
|
+
"additionalProperties": false
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"total": {
|
|
96
|
+
"type": "object",
|
|
97
|
+
"properties": {
|
|
98
|
+
"cost": {
|
|
99
|
+
"type": ["number", "null"]
|
|
100
|
+
},
|
|
101
|
+
"unpricedCount": {
|
|
102
|
+
"type": "number"
|
|
103
|
+
},
|
|
104
|
+
"cachedRateMissingCount": {
|
|
105
|
+
"type": "number"
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
"required": ["cost", "unpricedCount", "cachedRateMissingCount"],
|
|
109
|
+
"additionalProperties": false
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"required": ["schemaVersion", "rows", "perModel", "total"],
|
|
113
|
+
"additionalProperties": false
|
|
114
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"properties": {
|
|
5
|
+
"schemaVersion": {
|
|
6
|
+
"type": "number",
|
|
7
|
+
"const": 1
|
|
8
|
+
},
|
|
9
|
+
"running": {
|
|
10
|
+
"type": "boolean"
|
|
11
|
+
},
|
|
12
|
+
"pid": {
|
|
13
|
+
"type": ["number", "null"]
|
|
14
|
+
},
|
|
15
|
+
"uptimeSec": {
|
|
16
|
+
"type": ["number", "null"]
|
|
17
|
+
},
|
|
18
|
+
"plistInstalled": {
|
|
19
|
+
"type": "boolean"
|
|
20
|
+
},
|
|
21
|
+
"repos": {
|
|
22
|
+
"type": "array",
|
|
23
|
+
"items": {
|
|
24
|
+
"type": "object",
|
|
25
|
+
"properties": {
|
|
26
|
+
"slug": {
|
|
27
|
+
"type": "string"
|
|
28
|
+
},
|
|
29
|
+
"checkoutPath": {
|
|
30
|
+
"type": "string"
|
|
31
|
+
},
|
|
32
|
+
"state": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"enum": ["active", "paused", "draining", "detached"]
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"required": ["slug", "checkoutPath", "state"],
|
|
38
|
+
"additionalProperties": false
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"required": ["schemaVersion", "running", "pid", "uptimeSec", "plistInstalled", "repos"],
|
|
43
|
+
"additionalProperties": false
|
|
44
|
+
}
|