@on-par/factory-cli 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,68 @@
1
+ import { type RequestOptions } from 'node:https';
2
+ import { type DetectInstallDeps, type InstallKind, type UpdateChannel } from './daemon.js';
3
+ export declare const PACKAGE_NAME = "@on-par/factory-cli";
4
+ export declare const DEFAULT_REGISTRY = "https://registry.npmjs.org";
5
+ export declare const DEFAULT_TIMEOUT_MS = 10000;
6
+ export declare const EXIT_UP_TO_DATE = 0;
7
+ export declare const EXIT_UPDATE_AVAILABLE = 10;
8
+ export declare const EXIT_ERROR = 1;
9
+ /** One GET; resolves with status + body, rejects on network error or timeout. */
10
+ export type RegistryFetch = (url: string, opts: {
11
+ timeoutMs: number;
12
+ }) => Promise<{
13
+ status: number;
14
+ body: string;
15
+ }>;
16
+ export interface SelfUpdateDeps {
17
+ fetch?: RegistryFetch;
18
+ install?: DetectInstallDeps;
19
+ registry?: string;
20
+ timeoutMs?: number;
21
+ out?: {
22
+ write(s: string): unknown;
23
+ };
24
+ }
25
+ export interface SelfUpdateCheckResult {
26
+ installKind: InstallKind;
27
+ prefix: string;
28
+ channel: UpdateChannel;
29
+ current: string;
30
+ candidate: string | null;
31
+ updateAvailable: boolean;
32
+ applies: boolean;
33
+ error: string | null;
34
+ }
35
+ export declare function parseSemver(v: string): {
36
+ major: number;
37
+ minor: number;
38
+ patch: number;
39
+ prerelease: string[];
40
+ } | null;
41
+ /** SemVer 2.0.0 precedence; build metadata ignored. Throws on a malformed version. */
42
+ export declare function compareSemver(a: string, b: string): number;
43
+ export declare function selectCandidate(distTags: Record<string, string>, mode: 'stable' | 'prerelease'): string | null;
44
+ /** The response surface `httpsRegistryFetch` reads; node's IncomingMessage satisfies it. */
45
+ export interface HttpsResponse {
46
+ statusCode?: number;
47
+ on(event: 'data', fn: (chunk: Buffer) => void): unknown;
48
+ on(event: 'end', fn: () => void): unknown;
49
+ on(event: 'error', fn: (err: Error) => void): unknown;
50
+ }
51
+ /** The slice of node:https `request` that `httpsRegistryFetch` uses. */
52
+ export type HttpsRequest = (url: string, options: RequestOptions, onResponse: (res: HttpsResponse) => void) => {
53
+ on(event: 'error', fn: (err: Error) => void): unknown;
54
+ end(): unknown;
55
+ };
56
+ /** A RegistryFetch over node:https that honours HTTPS_PROXY/NO_PROXY and aborts after `timeoutMs`. */
57
+ export declare function httpsRegistryFetch(requestImpl?: HttpsRequest): RegistryFetch;
58
+ export declare function fetchDistTags(fetchImpl: RegistryFetch, opts?: {
59
+ registry?: string;
60
+ timeoutMs?: number;
61
+ }): Promise<Record<string, string>>;
62
+ export declare function checkForUpdate(mode: 'stable' | 'prerelease', deps?: SelfUpdateDeps): Promise<SelfUpdateCheckResult>;
63
+ export declare function formatUpdateCheck(r: SelfUpdateCheckResult): string;
64
+ export declare function cmdSelfUpdateCheck(opts: {
65
+ json?: boolean;
66
+ updateMode?: string;
67
+ }, deps?: SelfUpdateDeps): Promise<number>;
68
+ //# sourceMappingURL=self-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-update.d.ts","sourceRoot":"","sources":["../../src/cli/self-update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,167 @@
1
+ // packages/cli/src/cli/self-update.ts — factory self-update --check (#2354)
2
+ import { Agent, request } from 'node:https';
3
+ import { DaemonCtlError, detectInstall, parseUpdateMode, updateChannel, } from './daemon.js';
4
+ export const PACKAGE_NAME = '@on-par/factory-cli';
5
+ export const DEFAULT_REGISTRY = 'https://registry.npmjs.org';
6
+ export const DEFAULT_TIMEOUT_MS = 10_000;
7
+ export const EXIT_UP_TO_DATE = 0;
8
+ export const EXIT_UPDATE_AVAILABLE = 10;
9
+ export const EXIT_ERROR = 1;
10
+ const SEMVER_RE = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z.-]+)?$/;
11
+ export function parseSemver(v) {
12
+ const m = SEMVER_RE.exec(v.trim());
13
+ if (!m)
14
+ return null;
15
+ return {
16
+ major: Number(m[1]),
17
+ minor: Number(m[2]),
18
+ patch: Number(m[3]),
19
+ prerelease: m[4] === undefined ? [] : m[4].split('.'),
20
+ };
21
+ }
22
+ /** SemVer 2.0.0 precedence; build metadata ignored. Throws on a malformed version. */
23
+ export function compareSemver(a, b) {
24
+ const pa = parseSemver(a);
25
+ const pb = parseSemver(b);
26
+ if (!pa)
27
+ throw new Error(`invalid version "${a}"`);
28
+ if (!pb)
29
+ throw new Error(`invalid version "${b}"`);
30
+ for (const k of ['major', 'minor', 'patch']) {
31
+ if (pa[k] !== pb[k])
32
+ return pa[k] < pb[k] ? -1 : 1;
33
+ }
34
+ if (pa.prerelease.length === 0 || pb.prerelease.length === 0) {
35
+ if (pa.prerelease.length === pb.prerelease.length)
36
+ return 0;
37
+ return pa.prerelease.length === 0 ? 1 : -1;
38
+ }
39
+ const n = Math.min(pa.prerelease.length, pb.prerelease.length);
40
+ for (let i = 0; i < n; i++) {
41
+ const x = pa.prerelease[i];
42
+ const y = pb.prerelease[i];
43
+ if (x === y)
44
+ continue;
45
+ const xn = /^\d+$/.test(x);
46
+ const yn = /^\d+$/.test(y);
47
+ if (xn && yn)
48
+ return Number(x) < Number(y) ? -1 : 1;
49
+ if (xn)
50
+ return -1;
51
+ if (yn)
52
+ return 1;
53
+ return x < y ? -1 : 1;
54
+ }
55
+ if (pa.prerelease.length === pb.prerelease.length)
56
+ return 0;
57
+ return pa.prerelease.length < pb.prerelease.length ? -1 : 1;
58
+ }
59
+ export function selectCandidate(distTags, mode) {
60
+ if (mode === 'stable') {
61
+ const v = distTags.latest;
62
+ if (typeof v !== 'string')
63
+ return null;
64
+ const p = parseSemver(v);
65
+ return p && p.prerelease.length === 0 ? v : null;
66
+ }
67
+ let best = null;
68
+ for (const v of [distTags.next, distTags.latest]) {
69
+ if (typeof v !== 'string' || !parseSemver(v))
70
+ continue;
71
+ if (best === null || compareSemver(v, best) > 0)
72
+ best = v;
73
+ }
74
+ return best;
75
+ }
76
+ /** A RegistryFetch over node:https that honours HTTPS_PROXY/NO_PROXY and aborts after `timeoutMs`. */
77
+ export function httpsRegistryFetch(requestImpl = request) {
78
+ return (url, { timeoutMs }) => new Promise((resolve, reject) => {
79
+ // proxyEnv exists from Node 24.5; older @types/node lacks it on AgentOptions.
80
+ const agent = new Agent({ proxyEnv: process.env });
81
+ const req = requestImpl(url, { method: 'GET', headers: { accept: 'application/json' }, agent, signal: AbortSignal.timeout(timeoutMs) }, (res) => {
82
+ const chunks = [];
83
+ res.on('data', (c) => chunks.push(c));
84
+ res.on('end', () => resolve({ status: res.statusCode ?? 0, body: Buffer.concat(chunks).toString('utf8') }));
85
+ res.on('error', reject);
86
+ });
87
+ req.on('error', reject);
88
+ req.end();
89
+ });
90
+ }
91
+ export async function fetchDistTags(fetchImpl, opts = {}) {
92
+ const registry = (opts.registry ?? DEFAULT_REGISTRY).replace(/\/+$/, '');
93
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
94
+ const url = `${registry}/-/package/${encodeURIComponent(PACKAGE_NAME)}/dist-tags`;
95
+ let res;
96
+ try {
97
+ res = await fetchImpl(url, { timeoutMs });
98
+ }
99
+ catch (err) {
100
+ if (err instanceof Error && (err.name === 'TimeoutError' || err.name === 'AbortError')) {
101
+ throw new Error(`registry request timed out after ${timeoutMs} ms`);
102
+ }
103
+ throw err;
104
+ }
105
+ if (res.status < 200 || res.status > 299)
106
+ throw new Error(`registry returned HTTP ${res.status}`);
107
+ let parsed;
108
+ try {
109
+ parsed = JSON.parse(res.body);
110
+ }
111
+ catch {
112
+ throw new Error('registry returned malformed dist-tags');
113
+ }
114
+ if (typeof parsed !== 'object' ||
115
+ parsed === null ||
116
+ Array.isArray(parsed) ||
117
+ !Object.values(parsed).every((v) => typeof v === 'string')) {
118
+ throw new Error('registry returned malformed dist-tags');
119
+ }
120
+ return parsed;
121
+ }
122
+ export async function checkForUpdate(mode, deps = {}) {
123
+ const install = detectInstall(deps.install);
124
+ const channel = updateChannel(mode);
125
+ const base = {
126
+ installKind: install.kind,
127
+ prefix: install.prefix,
128
+ channel,
129
+ current: install.version,
130
+ applies: install.kind === 'npm-global',
131
+ };
132
+ try {
133
+ const tags = await fetchDistTags(deps.fetch ?? httpsRegistryFetch(), {
134
+ registry: deps.registry,
135
+ timeoutMs: deps.timeoutMs,
136
+ });
137
+ const candidate = selectCandidate(tags, mode);
138
+ const updateAvailable = candidate !== null && compareSemver(candidate, install.version) > 0;
139
+ return { ...base, candidate, updateAvailable, error: null };
140
+ }
141
+ catch (err) {
142
+ return {
143
+ ...base,
144
+ candidate: null,
145
+ updateAvailable: false,
146
+ error: err instanceof Error ? err.message : String(err),
147
+ };
148
+ }
149
+ }
150
+ export function formatUpdateCheck(r) {
151
+ if (r.error !== null)
152
+ return `factory ${r.current}: update check failed (${r.channel}): ${r.error}`;
153
+ if (r.updateAvailable) {
154
+ const note = r.applies ? '' : `; not applied to a ${r.installKind} install`;
155
+ return `factory ${r.current} → ${r.candidate} available on ${r.channel} (${r.installKind} install)${note}`;
156
+ }
157
+ return `factory ${r.current} is up to date on ${r.channel}`;
158
+ }
159
+ export async function cmdSelfUpdateCheck(opts, deps = {}) {
160
+ const mode = parseUpdateMode(opts.updateMode ?? 'stable', '--update-mode');
161
+ if (mode === 'manual')
162
+ throw new DaemonCtlError('--check needs --update-mode stable or prerelease', 2);
163
+ const result = await checkForUpdate(mode, deps);
164
+ (deps.out ?? process.stdout).write(opts.json ? `${JSON.stringify(result)}\n` : `${formatUpdateCheck(result)}\n`);
165
+ return result.error !== null ? EXIT_ERROR : result.updateAvailable ? EXIT_UPDATE_AVAILABLE : EXIT_UP_TO_DATE;
166
+ }
167
+ //# sourceMappingURL=self-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/cli/self-update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** The flag wins over the env var. A resolved root is written back to `env` as an absolute
2
+ * path so every child process (lanes, CHECK) skips the git lookup and any cwd difference.
3
+ * Invalid values throw. */
4
+ export declare function applyStateRootOption(flag: string | undefined, repoRoot: string, env?: NodeJS.ProcessEnv): string | undefined;
5
+ //# sourceMappingURL=state-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-root.d.ts","sourceRoot":"","sources":["../../src/cli/state-root.ts"],"names":[],"mappings":"AAIA;;4BAE4B;AAC5B,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAIpB"}
@@ -0,0 +1,12 @@
1
+ // src/cli/state-root.ts — Applies the global `--state-root` flag / FACTORY_STATE_ROOT env (#2281).
2
+ import { resolveStateRoot, STATE_ROOT_ENV } from '@on-par/factory-core/internal';
3
+ /** The flag wins over the env var. A resolved root is written back to `env` as an absolute
4
+ * path so every child process (lanes, CHECK) skips the git lookup and any cwd difference.
5
+ * Invalid values throw. */
6
+ export function applyStateRootOption(flag, repoRoot, env = process.env) {
7
+ const resolved = resolveStateRoot(flag ?? env[STATE_ROOT_ENV], { repoRoot });
8
+ if (resolved !== undefined)
9
+ env[STATE_ROOT_ENV] = resolved;
10
+ return resolved;
11
+ }
12
+ //# sourceMappingURL=state-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-root.js","sourceRoot":"","sources":["../../src/cli/state-root.ts"],"names":[],"mappings":"AAAA,mGAAmG;AAEnG,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEjF;;4BAE4B;AAC5B,MAAM,UAAU,oBAAoB,CAClC,IAAwB,EACxB,QAAgB,EAChB,GAAG,GAAsB,OAAO,CAAC,GAAG;IAEpC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,IAAI,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7E,IAAI,QAAQ,KAAK,SAAS;QAAE,GAAG,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC;IAC3D,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { ActiveQueueClaim } from '@on-par/factory-core';
2
+ import type { StatusUpdateJson } from './update-state.js';
2
3
  /** One open provider in `factory status --json` (#1101). */
3
4
  export interface StatusBreakerProviderJson {
4
5
  provider: string;
@@ -27,6 +28,8 @@ export interface StatusJson {
27
28
  stop: boolean;
28
29
  breaker: StatusBreakerJson;
29
30
  active: StatusActiveRowJson[];
31
+ /** factoryd self-update state (#2129, additive); null when no readable update-state.json exists. */
32
+ update: StatusUpdateJson | null;
30
33
  }
31
34
  /** Builds the `factory status --json` payload. An unparsable `lastActivityAt` reports `ageSec: 0`, never NaN. */
32
35
  export declare function buildStatusJson(input: {
@@ -40,6 +43,7 @@ export declare function buildStatusJson(input: {
40
43
  remainingMs: number;
41
44
  }>;
42
45
  active: ReadonlyArray<Pick<ActiveQueueClaim, 'lane' | 'issue' | 'phase' | 'lastActivityAt'>>;
46
+ update: StatusUpdateJson | null;
43
47
  now: number;
44
48
  }): StatusJson;
45
49
  //# sourceMappingURL=status-json.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status-json.d.ts","sourceRoot":"","sources":["../../src/cli/status-json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,4DAA4D;AAC5D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,kGAAkG;AAClG,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,yBAAyB,EAAE,CAAC;CACxC;AAED,6CAA6C;AAC7C,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;sEACsE;AACtE,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B;AAED,iHAAiH;AACjH,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,aAAa,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrG,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAC7F,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,UAAU,CAmBb"}
1
+ {"version":3,"file":"status-json.d.ts","sourceRoot":"","sources":["../../src/cli/status-json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,4DAA4D;AAC5D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,kGAAkG;AAClG,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,yBAAyB,EAAE,CAAC;CACxC;AAED,6CAA6C;AAC7C,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;sEACsE;AACtE,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,oGAAoG;IACpG,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACjC;AAED,iHAAiH;AACjH,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,aAAa,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrG,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAC7F,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,UAAU,CAoBb"}
@@ -17,6 +17,7 @@ export function buildStatusJson(input) {
17
17
  stop: input.stop,
18
18
  breaker: { open: providers.length > 0, providers },
19
19
  active,
20
+ update: input.update,
20
21
  };
21
22
  }
22
23
  //# sourceMappingURL=status-json.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status-json.js","sourceRoot":"","sources":["../../src/cli/status-json.ts"],"names":[],"mappings":"AAmCA,iHAAiH;AACjH,MAAM,UAAU,eAAe,CAAC,KAO/B;IACC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3C,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;KAC9C,CAAC,CAAC,CAAC;IACJ,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7E,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrH,CAAC,CAAC,CAAC;IACH,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,SAAS,EAAE;QAClD,MAAM;KACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"status-json.js","sourceRoot":"","sources":["../../src/cli/status-json.ts"],"names":[],"mappings":"AAsCA,iHAAiH;AACjH,MAAM,UAAU,eAAe,CAAC,KAQ/B;IACC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3C,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;KAC9C,CAAC,CAAC,CAAC;IACJ,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7E,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrH,CAAC,CAAC,CAAC;IACH,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,SAAS,EAAE;QAClD,MAAM;QACN,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { type FactorydConfig, type InstallKind, type UpdateChannel, type UpdateMode } from './daemon.js';
2
+ export declare const UPDATE_OUTCOMES: readonly ['updated', 'rolled-back', 'failed', 'skipped'];
3
+ export type UpdateOutcome = (typeof UPDATE_OUTCOMES)[number];
4
+ export interface UpdateLastResult {
5
+ at: string;
6
+ version: string;
7
+ outcome: UpdateOutcome;
8
+ error?: string;
9
+ }
10
+ export interface UpdateDraining {
11
+ since: string;
12
+ target: string;
13
+ }
14
+ /** On-disk shape of <daemon state dir>/update-state.json (#2129). */
15
+ export interface UpdateState {
16
+ schemaVersion: 1;
17
+ mode: UpdateMode;
18
+ channel: UpdateChannel | null;
19
+ installKind: InstallKind;
20
+ current: string;
21
+ available: string | null;
22
+ lastCheckAt: string | null;
23
+ lastResult: UpdateLastResult | null;
24
+ draining: UpdateDraining | null;
25
+ }
26
+ /** `update` in `factory status --json` — UpdateState without schemaVersion. */
27
+ export type StatusUpdateJson = Omit<UpdateState, 'schemaVersion'>;
28
+ export declare function updateStatePath(stateDir: string): string;
29
+ /** Tolerant reader: a missing or invalid file is `null`; never throws. */
30
+ export declare function readUpdateState(file: string): UpdateState | null;
31
+ /** Atomic write (tmp + rename) so a concurrent `factory status` never reads a torn file. */
32
+ export declare function writeUpdateState(file: string, state: UpdateState): void;
33
+ export declare function initialUpdateState(config: Pick<FactorydConfig, 'autoUpdate' | 'install'>, previous: UpdateState | null): UpdateState;
34
+ export declare function buildStatusUpdateJson(state: UpdateState | null): StatusUpdateJson | null;
35
+ /** The one human line `factory status` prints for the update state. */
36
+ export declare function formatUpdateStatusLine(update: StatusUpdateJson | null): string;
37
+ export declare function formatUpdateStartupLine(state: UpdateState): string;
38
+ export declare function formatUpdateCheckLine(state: UpdateState): string;
39
+ /** Records one check result and logs it once. Seam for the later update checker; no production caller yet. */
40
+ export declare function recordUpdateCheck(file: string, check: {
41
+ at: string;
42
+ available: string | null;
43
+ }, log: (line: string) => void): UpdateState | null;
44
+ //# sourceMappingURL=update-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-state.d.ts","sourceRoot":"","sources":["../../src/cli/update-state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAEvH,eAAO,MAAM,eAAe,YAAI,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AACxF,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qEAAqE;AACrE,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;CACjC;AAED,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;AAIlE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD;AA0BD,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAuBhE;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAKvE;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,GAAG,SAAS,CAAC,EACtD,QAAQ,EAAE,WAAW,GAAG,IAAI,GAC3B,WAAW,CAeb;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,gBAAgB,GAAG,IAAI,CAIxF;AA0BD,uEAAuE;AACvE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAAG,MAAM,CAa9E;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAElE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAGhE;AAED,8GAA8G;AAC9G,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC/C,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC1B,WAAW,GAAG,IAAI,CAOpB"}
@@ -0,0 +1,154 @@
1
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { UPDATE_MODES } from './daemon.js';
4
+ export const UPDATE_OUTCOMES = ['updated', 'rolled-back', 'failed', 'skipped'];
5
+ const INSTALL_KINDS = ['npm-global', 'source', 'unknown'];
6
+ export function updateStatePath(stateDir) {
7
+ return join(stateDir, 'update-state.json');
8
+ }
9
+ function isRecord(value) {
10
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
11
+ }
12
+ function stringOrNull(value) {
13
+ return typeof value === 'string' ? value : null;
14
+ }
15
+ function parseLastResult(value) {
16
+ if (!isRecord(value))
17
+ return null;
18
+ const { at, version, outcome, error } = value;
19
+ if (typeof at !== 'string' || typeof version !== 'string')
20
+ return null;
21
+ if (!UPDATE_OUTCOMES.includes(outcome))
22
+ return null;
23
+ const result = { at, version, outcome: outcome };
24
+ if (typeof error === 'string')
25
+ result.error = error;
26
+ return result;
27
+ }
28
+ function parseDraining(value) {
29
+ if (!isRecord(value))
30
+ return null;
31
+ if (typeof value.since !== 'string' || typeof value.target !== 'string')
32
+ return null;
33
+ return { since: value.since, target: value.target };
34
+ }
35
+ /** Tolerant reader: a missing or invalid file is `null`; never throws. */
36
+ export function readUpdateState(file) {
37
+ try {
38
+ if (!existsSync(file))
39
+ return null;
40
+ const raw = JSON.parse(readFileSync(file, 'utf-8'));
41
+ if (!isRecord(raw))
42
+ return null;
43
+ if (!UPDATE_MODES.includes(raw.mode))
44
+ return null;
45
+ if (typeof raw.current !== 'string' || raw.current === '')
46
+ return null;
47
+ return {
48
+ schemaVersion: 1,
49
+ mode: raw.mode,
50
+ channel: raw.channel === 'latest' || raw.channel === 'next' ? raw.channel : null,
51
+ installKind: INSTALL_KINDS.includes(raw.installKind)
52
+ ? raw.installKind
53
+ : 'unknown',
54
+ current: raw.current,
55
+ available: stringOrNull(raw.available),
56
+ lastCheckAt: stringOrNull(raw.lastCheckAt),
57
+ lastResult: parseLastResult(raw.lastResult),
58
+ draining: parseDraining(raw.draining),
59
+ };
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ }
65
+ /** Atomic write (tmp + rename) so a concurrent `factory status` never reads a torn file. */
66
+ export function writeUpdateState(file, state) {
67
+ mkdirSync(dirname(file), { recursive: true });
68
+ const tmp = `${file}.tmp`;
69
+ writeFileSync(tmp, `${JSON.stringify(state, null, 2)}\n`);
70
+ renameSync(tmp, file);
71
+ }
72
+ export function initialUpdateState(config, previous) {
73
+ const { mode, channel } = config.autoUpdate;
74
+ const current = config.install.version;
75
+ const carried = previous?.available ?? null;
76
+ return {
77
+ schemaVersion: 1,
78
+ mode,
79
+ channel,
80
+ installKind: config.install.kind,
81
+ current,
82
+ available: mode === 'manual' || carried === current ? null : carried,
83
+ lastCheckAt: previous?.lastCheckAt ?? null,
84
+ lastResult: previous?.lastResult ?? null,
85
+ draining: null,
86
+ };
87
+ }
88
+ export function buildStatusUpdateJson(state) {
89
+ if (!state)
90
+ return null;
91
+ const { schemaVersion: _schemaVersion, ...update } = state;
92
+ return { ...update, available: state.mode === 'manual' ? null : state.available };
93
+ }
94
+ function installLabel(kind) {
95
+ switch (kind) {
96
+ case 'npm-global':
97
+ return 'npm';
98
+ case 'source':
99
+ return 'source';
100
+ case 'unknown':
101
+ return 'unknown install';
102
+ }
103
+ }
104
+ function outcomeLabel(outcome) {
105
+ switch (outcome) {
106
+ case 'updated':
107
+ return 'updated';
108
+ case 'rolled-back':
109
+ return 'rolled back';
110
+ case 'failed':
111
+ return 'failed';
112
+ case 'skipped':
113
+ return 'skipped';
114
+ }
115
+ }
116
+ /** The one human line `factory status` prints for the update state. */
117
+ export function formatUpdateStatusLine(update) {
118
+ if (!update)
119
+ return 'factory update: no factoryd update state (daemon not started?)';
120
+ let line = `factory ${update.current} (${update.mode}, ${installLabel(update.installKind)})`;
121
+ if (update.mode === 'manual')
122
+ line += ' — automatic updates off';
123
+ else if (update.available !== null && update.available !== update.current)
124
+ line += ` — ${update.available} available`;
125
+ else
126
+ line += ' — up to date';
127
+ if (update.lastResult) {
128
+ const { version, outcome, error } = update.lastResult;
129
+ line += `; last update to ${version} ${outcomeLabel(outcome)}`;
130
+ if (error)
131
+ line += ` (${error})`;
132
+ }
133
+ if (update.draining)
134
+ line += `; draining for ${update.draining.target} since ${update.draining.since}`;
135
+ return line;
136
+ }
137
+ export function formatUpdateStartupLine(state) {
138
+ return `update: factory ${state.current}, mode ${state.mode} (channel ${state.channel ?? 'none'}, install ${state.installKind})`;
139
+ }
140
+ export function formatUpdateCheckLine(state) {
141
+ const found = state.available && state.available !== state.current ? `${state.available} available` : 'up to date';
142
+ return `update check: ${found} on ${state.channel ?? 'none'} (current ${state.current})`;
143
+ }
144
+ /** Records one check result and logs it once. Seam for the later update checker; no production caller yet. */
145
+ export function recordUpdateCheck(file, check, log) {
146
+ const state = readUpdateState(file);
147
+ if (!state)
148
+ return null;
149
+ const next = { ...state, lastCheckAt: check.at, available: check.available };
150
+ writeUpdateState(file, next);
151
+ log(formatUpdateCheckLine(next));
152
+ return next;
153
+ }
154
+ //# sourceMappingURL=update-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-state.js","sourceRoot":"","sources":["../../src/cli/update-state.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,15 @@
1
1
  {
2
2
  "name": "@on-par/factory-cli",
3
- "version": "0.9.0",
4
- "description": "CLI for the Software Factory — ships verified GitHub issues via boss-worker-checker orchestration.",
3
+ "version": "0.9.1",
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
+ "keywords": [
6
+ "ai-agents",
7
+ "github",
8
+ "cli",
9
+ "claude-code",
10
+ "pull-requests",
11
+ "automation"
12
+ ],
5
13
  "type": "module",
6
14
  "main": "dist/cli.js",
7
15
  "bin": {
@@ -39,8 +47,8 @@
39
47
  "@octokit/plugin-retry": "^8.1.1",
40
48
  "@octokit/plugin-throttling": "^11.0.5",
41
49
  "@octokit/rest": "^22.0.0",
42
- "@on-par/factory-core": "0.9.0",
43
- "@on-par/factory-tui": "0.9.0",
50
+ "@on-par/factory-core": "0.9.1",
51
+ "@on-par/factory-tui": "0.9.1",
44
52
  "commander": "^15.0.0"
45
53
  },
46
54
  "license": "MIT",