@on-par/factory-cli 0.0.0-stage → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +40 -2
- package/dist/cli/admission.d.ts +17 -0
- package/dist/cli/admission.d.ts.map +1 -0
- package/dist/cli/admission.js +37 -0
- package/dist/cli/admission.js.map +1 -0
- package/dist/cli/base-hold.d.ts +63 -0
- package/dist/cli/base-hold.d.ts.map +1 -0
- package/dist/cli/base-hold.js +122 -0
- package/dist/cli/base-hold.js.map +1 -0
- package/dist/cli/branch-prefix.d.ts +8 -0
- package/dist/cli/branch-prefix.d.ts.map +1 -0
- package/dist/cli/branch-prefix.js +16 -0
- package/dist/cli/branch-prefix.js.map +1 -0
- package/dist/cli/classifier-backtest.d.ts +50 -0
- package/dist/cli/classifier-backtest.d.ts.map +1 -0
- package/dist/cli/classifier-backtest.js +112 -0
- package/dist/cli/classifier-backtest.js.map +1 -0
- package/dist/cli/cost-json.d.ts +37 -0
- package/dist/cli/cost-json.d.ts.map +1 -0
- package/dist/cli/cost-json.js +48 -0
- package/dist/cli/cost-json.js.map +1 -0
- package/dist/cli/daemon.d.ts +162 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +393 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/doctor.d.ts +127 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +400 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/feedback.d.ts +74 -0
- package/dist/cli/feedback.d.ts.map +1 -0
- package/dist/cli/feedback.js +180 -0
- package/dist/cli/feedback.js.map +1 -0
- package/dist/cli/filing.d.ts +22 -0
- package/dist/cli/filing.d.ts.map +1 -0
- package/dist/cli/filing.js +53 -0
- package/dist/cli/filing.js.map +1 -0
- package/dist/cli/first-run.d.ts +9 -0
- package/dist/cli/first-run.d.ts.map +1 -0
- package/dist/cli/first-run.js +34 -0
- package/dist/cli/first-run.js.map +1 -0
- package/dist/cli/help-groups.d.ts +17 -0
- package/dist/cli/help-groups.d.ts.map +1 -0
- package/dist/cli/help-groups.js +59 -0
- package/dist/cli/help-groups.js.map +1 -0
- package/dist/cli/hosted-queue.d.ts +45 -0
- package/dist/cli/hosted-queue.d.ts.map +1 -0
- package/dist/cli/hosted-queue.js +74 -0
- package/dist/cli/hosted-queue.js.map +1 -0
- package/dist/cli/hosted-runner.d.ts +44 -0
- package/dist/cli/hosted-runner.d.ts.map +1 -0
- package/dist/cli/hosted-runner.js +68 -0
- package/dist/cli/hosted-runner.js.map +1 -0
- package/dist/cli/hosted.d.ts +38 -0
- package/dist/cli/hosted.d.ts.map +1 -0
- package/dist/cli/hosted.js +82 -0
- package/dist/cli/hosted.js.map +1 -0
- package/dist/cli/index.d.ts +674 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +4916 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init-files.d.ts +8 -0
- package/dist/cli/init-files.d.ts.map +1 -0
- package/dist/cli/init-files.js +45 -0
- package/dist/cli/init-files.js.map +1 -0
- package/dist/cli/logs.d.ts +27 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +52 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/merge-scope.d.ts +7 -0
- package/dist/cli/merge-scope.d.ts.map +1 -0
- package/dist/cli/merge-scope.js +14 -0
- package/dist/cli/merge-scope.js.map +1 -0
- package/dist/cli/octokit.d.ts +43 -0
- package/dist/cli/octokit.d.ts.map +1 -0
- package/dist/cli/octokit.js +87 -0
- package/dist/cli/octokit.js.map +1 -0
- package/dist/cli/queue-add-json.d.ts +25 -0
- package/dist/cli/queue-add-json.d.ts.map +1 -0
- package/dist/cli/queue-add-json.js +24 -0
- package/dist/cli/queue-add-json.js.map +1 -0
- package/dist/cli/queue-clear.d.ts +15 -0
- package/dist/cli/queue-clear.d.ts.map +1 -0
- package/dist/cli/queue-clear.js +58 -0
- package/dist/cli/queue-clear.js.map +1 -0
- package/dist/cli/queue-list.d.ts +24 -0
- package/dist/cli/queue-list.d.ts.map +1 -0
- package/dist/cli/queue-list.js +25 -0
- package/dist/cli/queue-list.js.map +1 -0
- package/dist/cli/ready-check.d.ts +98 -0
- package/dist/cli/ready-check.d.ts.map +1 -0
- package/dist/cli/ready-check.js +169 -0
- package/dist/cli/ready-check.js.map +1 -0
- package/dist/cli/reset.d.ts +40 -0
- package/dist/cli/reset.d.ts.map +1 -0
- package/dist/cli/reset.js +215 -0
- package/dist/cli/reset.js.map +1 -0
- package/dist/cli/run-children.d.ts +24 -0
- package/dist/cli/run-children.d.ts.map +1 -0
- package/dist/cli/run-children.js +73 -0
- package/dist/cli/run-children.js.map +1 -0
- package/dist/cli/run-flags.d.ts +14 -0
- package/dist/cli/run-flags.d.ts.map +1 -0
- package/dist/cli/run-flags.js +43 -0
- package/dist/cli/run-flags.js.map +1 -0
- package/dist/cli/runs-diffstat.d.ts +43 -0
- package/dist/cli/runs-diffstat.d.ts.map +1 -0
- package/dist/cli/runs-diffstat.js +91 -0
- package/dist/cli/runs-diffstat.js.map +1 -0
- package/dist/cli/runs.d.ts +36 -0
- package/dist/cli/runs.d.ts.map +1 -0
- package/dist/cli/runs.js +102 -0
- package/dist/cli/runs.js.map +1 -0
- package/dist/cli/self-update.d.ts +68 -0
- package/dist/cli/self-update.d.ts.map +1 -0
- package/dist/cli/self-update.js +167 -0
- package/dist/cli/self-update.js.map +1 -0
- package/dist/cli/staleness.d.ts +30 -0
- package/dist/cli/staleness.d.ts.map +1 -0
- package/dist/cli/staleness.js +132 -0
- package/dist/cli/staleness.js.map +1 -0
- package/dist/cli/state-root.d.ts +5 -0
- package/dist/cli/state-root.d.ts.map +1 -0
- package/dist/cli/state-root.js +12 -0
- package/dist/cli/state-root.js.map +1 -0
- package/dist/cli/status-json.d.ts +49 -0
- package/dist/cli/status-json.d.ts.map +1 -0
- package/dist/cli/status-json.js +23 -0
- package/dist/cli/status-json.js.map +1 -0
- package/dist/cli/stop-resume-json.d.ts +18 -0
- package/dist/cli/stop-resume-json.d.ts.map +1 -0
- package/dist/cli/stop-resume-json.js +10 -0
- package/dist/cli/stop-resume-json.js.map +1 -0
- package/dist/cli/stop-sentinel.d.ts +23 -0
- package/dist/cli/stop-sentinel.d.ts.map +1 -0
- package/dist/cli/stop-sentinel.js +61 -0
- package/dist/cli/stop-sentinel.js.map +1 -0
- package/dist/cli/sweep-heartbeat.d.ts +33 -0
- package/dist/cli/sweep-heartbeat.d.ts.map +1 -0
- package/dist/cli/sweep-heartbeat.js +65 -0
- package/dist/cli/sweep-heartbeat.js.map +1 -0
- package/dist/cli/unpark.d.ts +28 -0
- package/dist/cli/unpark.d.ts.map +1 -0
- package/dist/cli/unpark.js +68 -0
- package/dist/cli/unpark.js.map +1 -0
- package/dist/cli/update-state.d.ts +44 -0
- package/dist/cli/update-state.d.ts.map +1 -0
- package/dist/cli/update-state.js +154 -0
- package/dist/cli/update-state.js.map +1 -0
- package/dist/cli/usage-json.d.ts +20 -0
- package/dist/cli/usage-json.d.ts.map +1 -0
- package/dist/cli/usage-json.js +36 -0
- package/dist/cli/usage-json.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -0
- package/dist/entry.d.ts +6 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +13 -0
- package/dist/entry.js.map +1 -0
- package/package.json +56 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-json.js","sourceRoot":"","sources":["../../src/cli/cost-json.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { type RepoState } from '@on-par/factory-core/internal';
|
|
2
|
+
export declare const FACTORYD_LABEL = "com.onpar.factoryd";
|
|
3
|
+
/** Expected daemon-control failure. index.ts's commander wrappers map it onto
|
|
4
|
+
* CliExitError (importing CliExitError here would be circular — index.ts
|
|
5
|
+
* imports this module). */
|
|
6
|
+
export declare class DaemonCtlError extends Error {
|
|
7
|
+
readonly code: number;
|
|
8
|
+
constructor(message: string, code: number);
|
|
9
|
+
}
|
|
10
|
+
export type LaunchctlExec = (cmd: string, args: string[]) => Promise<{
|
|
11
|
+
code: number;
|
|
12
|
+
stdout: string;
|
|
13
|
+
stderr: string;
|
|
14
|
+
}>;
|
|
15
|
+
export interface DaemonCtlDeps {
|
|
16
|
+
/** Runs launchctl / ps without a shell. Default: promisified execFile that
|
|
17
|
+
* never rejects on non-zero exit (resolves { code, stdout, stderr }). */
|
|
18
|
+
exec?: LaunchctlExec;
|
|
19
|
+
/** Default os.homedir(). Tests point this at a temp dir. */
|
|
20
|
+
home?: string;
|
|
21
|
+
/** Default process.getuid?.() ?? 0. */
|
|
22
|
+
uid?: number;
|
|
23
|
+
/** Default process.platform. */
|
|
24
|
+
platform?: NodeJS.Platform;
|
|
25
|
+
/** Default process.stdout. */
|
|
26
|
+
out?: {
|
|
27
|
+
write(s: string): unknown;
|
|
28
|
+
};
|
|
29
|
+
/** Default process.execPath. */
|
|
30
|
+
nodePath?: string;
|
|
31
|
+
/** Default realpathSync(process.argv[1]) — unwraps the bin symlink. */
|
|
32
|
+
cliScriptPath?: string;
|
|
33
|
+
/** Default defaultRegistryPath(). */
|
|
34
|
+
registryFile?: string;
|
|
35
|
+
/** Follow-mode poll interval; tests pass ~10. Default 250. */
|
|
36
|
+
pollMs?: number;
|
|
37
|
+
}
|
|
38
|
+
/** Where a given home directory keeps the LaunchAgent plist and the daemon log. */
|
|
39
|
+
export declare function factorydFiles(home: string): {
|
|
40
|
+
launchAgentsDir: string;
|
|
41
|
+
plistPath: string;
|
|
42
|
+
logPath: string;
|
|
43
|
+
};
|
|
44
|
+
export declare const UPDATE_MODES: readonly ['manual', 'stable', 'prerelease'];
|
|
45
|
+
export type UpdateMode = (typeof UPDATE_MODES)[number];
|
|
46
|
+
export type UpdateChannel = 'latest' | 'next';
|
|
47
|
+
/** The single mode → npm dist-tag mapping (#2246). */
|
|
48
|
+
export declare function updateChannel(mode: UpdateMode): UpdateChannel | null;
|
|
49
|
+
/** Exact, case-sensitive parse of an update mode. Throws DaemonCtlError (code 2). */
|
|
50
|
+
export declare function parseUpdateMode(value: string, source: string): UpdateMode;
|
|
51
|
+
export type InstallKind = 'npm-global' | 'source' | 'unknown';
|
|
52
|
+
export interface InstallInfo {
|
|
53
|
+
kind: InstallKind;
|
|
54
|
+
prefix: string;
|
|
55
|
+
version: string;
|
|
56
|
+
}
|
|
57
|
+
export interface DetectInstallDeps {
|
|
58
|
+
execPath?: string;
|
|
59
|
+
cliPath?: string;
|
|
60
|
+
env?: NodeJS.ProcessEnv;
|
|
61
|
+
version?: string;
|
|
62
|
+
exists?: (p: string) => boolean;
|
|
63
|
+
}
|
|
64
|
+
/** Classifies the running cli.js as npm-global, source or unknown (#2246). Pure
|
|
65
|
+
* apart from the injectable fs probe; never spawns npm or git. */
|
|
66
|
+
export declare function detectInstall(deps?: DetectInstallDeps): InstallInfo;
|
|
67
|
+
/** Optional daemon-scoped config file (<registry dir>/daemon.json). */
|
|
68
|
+
export interface DaemonFileConfig {
|
|
69
|
+
autoUpdate?: {
|
|
70
|
+
mode?: string;
|
|
71
|
+
checkIntervalMinutes?: unknown;
|
|
72
|
+
drainTimeoutMinutes?: unknown;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** Reads daemon.json. A missing file is `{}`; malformed structure throws DaemonCtlError (code 2). */
|
|
76
|
+
export declare function loadDaemonFileConfig(file: string): DaemonFileConfig;
|
|
77
|
+
export interface ResolvedAutoUpdate {
|
|
78
|
+
/** Effective mode (after the source/unknown downgrade). */
|
|
79
|
+
mode: UpdateMode;
|
|
80
|
+
/** Mode requested before the downgrade. */
|
|
81
|
+
requestedMode: UpdateMode;
|
|
82
|
+
channel: UpdateChannel | null;
|
|
83
|
+
checkIntervalMinutes: number;
|
|
84
|
+
drainTimeoutMinutes: number;
|
|
85
|
+
}
|
|
86
|
+
/** Resolved options for the foreground `factory daemon run` process. */
|
|
87
|
+
export interface FactorydConfig {
|
|
88
|
+
/** Registry file served (default ~/.factory/registry.json). */
|
|
89
|
+
registryFile: string;
|
|
90
|
+
/** Port to bind on 127.0.0.1 (default DEFAULT_FACTORYD_PORT). */
|
|
91
|
+
port: number;
|
|
92
|
+
/** Resolved self-update setting (#2246). Nothing acts on it yet; the registry query, install and restart come in later #1936 issues. */
|
|
93
|
+
autoUpdate: ResolvedAutoUpdate;
|
|
94
|
+
install: InstallInfo;
|
|
95
|
+
/** One-time startup notices (deprecation, downgrade); cmdFactoryd logs each once. */
|
|
96
|
+
notices: string[];
|
|
97
|
+
}
|
|
98
|
+
/** Resolves `factory daemon run` options into a FactorydConfig. Throws
|
|
99
|
+
* DaemonCtlError (code 2) on an invalid --port, --update-mode or daemon.json value. */
|
|
100
|
+
export declare function resolveFactorydConfig(opts: {
|
|
101
|
+
port?: string;
|
|
102
|
+
registry?: string;
|
|
103
|
+
updateMode?: string;
|
|
104
|
+
autoUpdate?: boolean;
|
|
105
|
+
}, deps?: {
|
|
106
|
+
install?: InstallInfo;
|
|
107
|
+
fileConfig?: DaemonFileConfig;
|
|
108
|
+
}): FactorydConfig;
|
|
109
|
+
/** Pure renderer for ~/Library/LaunchAgents/com.onpar.factoryd.plist. KeepAlive
|
|
110
|
+
* relaunches factoryd after any exit; RunAtLoad starts it at login/bootstrap;
|
|
111
|
+
* launchd redirects stdout+stderr to the daemon log. ProgramArguments invokes
|
|
112
|
+
* the foreground `factory daemon run` command with its defaults. */
|
|
113
|
+
export declare function renderFactorydPlist(opts: {
|
|
114
|
+
nodePath: string;
|
|
115
|
+
cliScriptPath: string;
|
|
116
|
+
logPath: string;
|
|
117
|
+
}): string;
|
|
118
|
+
/** Extracts the running pid from `launchctl print gui/<uid>/<label>` output. */
|
|
119
|
+
/** `factory daemon status --json` payload (#2267). Additive changes only; bump schemaVersion on a breaking change. */
|
|
120
|
+
export interface DaemonStatusJson {
|
|
121
|
+
schemaVersion: 1;
|
|
122
|
+
running: boolean;
|
|
123
|
+
pid: number | null;
|
|
124
|
+
uptimeSec: number | null;
|
|
125
|
+
plistInstalled: boolean;
|
|
126
|
+
repos: Array<{
|
|
127
|
+
slug: string;
|
|
128
|
+
checkoutPath: string;
|
|
129
|
+
state: RepoState;
|
|
130
|
+
}>;
|
|
131
|
+
}
|
|
132
|
+
/** ps `etime` ([[dd-]hh:]mm:ss) → whole seconds; null when empty or malformed. */
|
|
133
|
+
export declare function parseEtime(etime: string): number | null;
|
|
134
|
+
export declare function parseLaunchctlPid(printOutput: string): number | null;
|
|
135
|
+
/** Last n lines of text, ignoring a trailing newline. */
|
|
136
|
+
export declare function lastLines(text: string, n: number): string[];
|
|
137
|
+
/** The production exec seam: execFile without a shell, resolving (never
|
|
138
|
+
* rejecting) `{ code, stdout, stderr }` — a missing binary or non-numeric
|
|
139
|
+
* error code becomes code 1. Exported for direct coverage in daemon.test.ts. */
|
|
140
|
+
export declare function defaultExec(): LaunchctlExec;
|
|
141
|
+
/** Install (or reinstall) and load the LaunchAgent. Always a full reinstall:
|
|
142
|
+
* regenerate the plist, bootout (ignoring failure — handles both "already
|
|
143
|
+
* loaded" and "not loaded"), then bootstrap into the gui domain so the daemon's
|
|
144
|
+
* Claude workers keep login-keychain access (docs/runbooks/macos-keychain-launchagent.md). */
|
|
145
|
+
export declare function cmdDaemonStart(deps?: DaemonCtlDeps): Promise<void>;
|
|
146
|
+
/** Unload the LaunchAgent. Idempotent: a not-loaded agent is success. The plist
|
|
147
|
+
* stays on disk so `factory daemon start` re-enables it. */
|
|
148
|
+
export declare function cmdDaemonStop(deps?: DaemonCtlDeps): Promise<void>;
|
|
149
|
+
/** Report running/not-loaded, pid + uptime, plist install state, and the
|
|
150
|
+
* attached repos from the registry. Exit code 0 when running, 1 when not.
|
|
151
|
+
* With `opts.json`, print one DaemonStatusJson object instead of text. */
|
|
152
|
+
export declare function cmdDaemonStatus(deps?: DaemonCtlDeps, opts?: {
|
|
153
|
+
json?: boolean;
|
|
154
|
+
}): Promise<void>;
|
|
155
|
+
/** Print the last N lines of ~/.factory/daemon.log; with --follow, keep
|
|
156
|
+
* streaming appended bytes until Ctrl-C (size-offset poll, like logs.ts's
|
|
157
|
+
* followEvents — no `tail -f` child process). Works on any platform. */
|
|
158
|
+
export declare function cmdDaemonLogs(opts: {
|
|
159
|
+
follow?: boolean;
|
|
160
|
+
lines?: string;
|
|
161
|
+
}, deps?: DaemonCtlDeps): Promise<void>;
|
|
162
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
// packages/cli/src/cli/daemon.ts — factory daemon start|stop|status|logs: launchctl
|
|
2
|
+
// wrappers around the foreground factoryd (#1179, epic #764), plus `daemon run`
|
|
3
|
+
// option resolution into FactorydConfig (#2128).
|
|
4
|
+
import { execFile } from 'node:child_process';
|
|
5
|
+
import { closeSync, existsSync, fstatSync, mkdirSync, openSync, readFileSync, readSync, realpathSync, writeFileSync, } from 'node:fs';
|
|
6
|
+
import { homedir } from 'node:os';
|
|
7
|
+
import { createRequire } from 'node:module';
|
|
8
|
+
import { dirname, join, sep } from 'node:path';
|
|
9
|
+
import { DEFAULT_FACTORYD_PORT, defaultRegistryPath, listRepos, loadRegistry, } from '@on-par/factory-core/internal';
|
|
10
|
+
export const FACTORYD_LABEL = 'com.onpar.factoryd';
|
|
11
|
+
/** Expected daemon-control failure. index.ts's commander wrappers map it onto
|
|
12
|
+
* CliExitError (importing CliExitError here would be circular — index.ts
|
|
13
|
+
* imports this module). */
|
|
14
|
+
export class DaemonCtlError extends Error {
|
|
15
|
+
code;
|
|
16
|
+
constructor(message, code) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.code = code;
|
|
19
|
+
this.name = 'DaemonCtlError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Where a given home directory keeps the LaunchAgent plist and the daemon log. */
|
|
23
|
+
export function factorydFiles(home) {
|
|
24
|
+
const launchAgentsDir = join(home, 'Library', 'LaunchAgents');
|
|
25
|
+
return {
|
|
26
|
+
launchAgentsDir,
|
|
27
|
+
plistPath: join(launchAgentsDir, `${FACTORYD_LABEL}.plist`),
|
|
28
|
+
logPath: join(home, '.factory', 'daemon.log'),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export const UPDATE_MODES = ['manual', 'stable', 'prerelease'];
|
|
32
|
+
/** The single mode → npm dist-tag mapping (#2246). */
|
|
33
|
+
export function updateChannel(mode) {
|
|
34
|
+
switch (mode) {
|
|
35
|
+
case 'stable':
|
|
36
|
+
return 'latest';
|
|
37
|
+
case 'prerelease':
|
|
38
|
+
return 'next';
|
|
39
|
+
case 'manual':
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Exact, case-sensitive parse of an update mode. Throws DaemonCtlError (code 2). */
|
|
44
|
+
export function parseUpdateMode(value, source) {
|
|
45
|
+
if (UPDATE_MODES.includes(value))
|
|
46
|
+
return value;
|
|
47
|
+
throw new DaemonCtlError(`invalid ${source} "${value}" — expected one of ${UPDATE_MODES.join(', ')}`, 2);
|
|
48
|
+
}
|
|
49
|
+
function defaultCliPath() {
|
|
50
|
+
try {
|
|
51
|
+
return realpathSync(process.argv[1] ?? '');
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return '';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Classifies the running cli.js as npm-global, source or unknown (#2246). Pure
|
|
58
|
+
* apart from the injectable fs probe; never spawns npm or git. */
|
|
59
|
+
export function detectInstall(deps = {}) {
|
|
60
|
+
const execPath = deps.execPath ?? process.execPath;
|
|
61
|
+
const cliPath = deps.cliPath ?? defaultCliPath();
|
|
62
|
+
const env = deps.env ?? process.env;
|
|
63
|
+
const version = deps.version ?? createRequire(import.meta.url)('../../package.json').version;
|
|
64
|
+
const exists = deps.exists ?? existsSync;
|
|
65
|
+
const prefix = dirname(dirname(execPath));
|
|
66
|
+
const info = (kind) => ({ kind, prefix, version });
|
|
67
|
+
if (env.FACTORY_FROM_SOURCE === '1')
|
|
68
|
+
return info('source');
|
|
69
|
+
const pkgDir = join(prefix, 'lib', 'node_modules', '@on-par', 'factory-cli');
|
|
70
|
+
if (cliPath.startsWith(pkgDir + sep))
|
|
71
|
+
return info('npm-global');
|
|
72
|
+
if (cliPath !== '') {
|
|
73
|
+
let dir = dirname(cliPath);
|
|
74
|
+
for (;;) {
|
|
75
|
+
if (exists(join(dir, '.git')))
|
|
76
|
+
return info('source');
|
|
77
|
+
const parent = dirname(dir);
|
|
78
|
+
if (parent === dir)
|
|
79
|
+
break;
|
|
80
|
+
dir = parent;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return info('unknown');
|
|
84
|
+
}
|
|
85
|
+
/** Reads daemon.json. A missing file is `{}`; malformed structure throws DaemonCtlError (code 2). */
|
|
86
|
+
export function loadDaemonFileConfig(file) {
|
|
87
|
+
if (!existsSync(file))
|
|
88
|
+
return {};
|
|
89
|
+
const fail = (reason) => new DaemonCtlError(`invalid daemon config ${file}: ${reason}`, 2);
|
|
90
|
+
let parsed;
|
|
91
|
+
try {
|
|
92
|
+
parsed = JSON.parse(readFileSync(file, 'utf8'));
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
throw fail(err instanceof Error ? err.message : String(err));
|
|
96
|
+
}
|
|
97
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
|
|
98
|
+
throw fail('expected a JSON object');
|
|
99
|
+
const autoUpdate = parsed.autoUpdate;
|
|
100
|
+
if (autoUpdate !== undefined &&
|
|
101
|
+
(typeof autoUpdate !== 'object' || autoUpdate === null || Array.isArray(autoUpdate))) {
|
|
102
|
+
throw fail('autoUpdate must be an object');
|
|
103
|
+
}
|
|
104
|
+
return parsed;
|
|
105
|
+
}
|
|
106
|
+
function positiveInt(value, fallback, name) {
|
|
107
|
+
if (value === undefined)
|
|
108
|
+
return fallback;
|
|
109
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value <= 0) {
|
|
110
|
+
throw new DaemonCtlError(`invalid ${name} "${String(value)}" — expected a positive integer`, 2);
|
|
111
|
+
}
|
|
112
|
+
return value;
|
|
113
|
+
}
|
|
114
|
+
/** Resolves `factory daemon run` options into a FactorydConfig. Throws
|
|
115
|
+
* DaemonCtlError (code 2) on an invalid --port, --update-mode or daemon.json value. */
|
|
116
|
+
export function resolveFactorydConfig(opts, deps = {}) {
|
|
117
|
+
const port = opts.port === undefined ? DEFAULT_FACTORYD_PORT : Number(opts.port);
|
|
118
|
+
if (!Number.isInteger(port) || port < 0 || port > 65535) {
|
|
119
|
+
throw new DaemonCtlError(`invalid --port "${opts.port}" — expected an integer 0-65535`, 2);
|
|
120
|
+
}
|
|
121
|
+
const install = deps.install ?? detectInstall();
|
|
122
|
+
const fileAutoUpdate = (deps.fileConfig ?? {}).autoUpdate;
|
|
123
|
+
const notices = [];
|
|
124
|
+
if (opts.autoUpdate === true)
|
|
125
|
+
notices.push('--auto-update is deprecated; use --update-mode stable');
|
|
126
|
+
let requested;
|
|
127
|
+
if (opts.updateMode !== undefined)
|
|
128
|
+
requested = parseUpdateMode(opts.updateMode, '--update-mode');
|
|
129
|
+
else if (opts.autoUpdate === true)
|
|
130
|
+
requested = 'stable';
|
|
131
|
+
else if (fileAutoUpdate?.mode !== undefined) {
|
|
132
|
+
requested = parseUpdateMode(String(fileAutoUpdate.mode), 'autoUpdate.mode in daemon.json');
|
|
133
|
+
}
|
|
134
|
+
else
|
|
135
|
+
requested = install.kind === 'npm-global' ? 'stable' : 'manual';
|
|
136
|
+
let mode = requested;
|
|
137
|
+
if (install.kind !== 'npm-global' && requested !== 'manual') {
|
|
138
|
+
notices.push(`update mode ${requested} needs an npm install; staying manual`);
|
|
139
|
+
mode = 'manual';
|
|
140
|
+
}
|
|
141
|
+
const autoUpdate = {
|
|
142
|
+
mode,
|
|
143
|
+
requestedMode: requested,
|
|
144
|
+
channel: updateChannel(mode),
|
|
145
|
+
checkIntervalMinutes: positiveInt(fileAutoUpdate?.checkIntervalMinutes, 30, 'autoUpdate.checkIntervalMinutes'),
|
|
146
|
+
drainTimeoutMinutes: positiveInt(fileAutoUpdate?.drainTimeoutMinutes, 60, 'autoUpdate.drainTimeoutMinutes'),
|
|
147
|
+
};
|
|
148
|
+
return { registryFile: opts.registry ?? defaultRegistryPath(), port, autoUpdate, install, notices };
|
|
149
|
+
}
|
|
150
|
+
function xmlEscape(s) {
|
|
151
|
+
return s.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>');
|
|
152
|
+
}
|
|
153
|
+
/** Pure renderer for ~/Library/LaunchAgents/com.onpar.factoryd.plist. KeepAlive
|
|
154
|
+
* relaunches factoryd after any exit; RunAtLoad starts it at login/bootstrap;
|
|
155
|
+
* launchd redirects stdout+stderr to the daemon log. ProgramArguments invokes
|
|
156
|
+
* the foreground `factory daemon run` command with its defaults. */
|
|
157
|
+
export function renderFactorydPlist(opts) {
|
|
158
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
159
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
160
|
+
<plist version="1.0">
|
|
161
|
+
<dict>
|
|
162
|
+
<key>Label</key>
|
|
163
|
+
<string>${FACTORYD_LABEL}</string>
|
|
164
|
+
<key>ProgramArguments</key>
|
|
165
|
+
<array>
|
|
166
|
+
<string>${xmlEscape(opts.nodePath)}</string>
|
|
167
|
+
<string>${xmlEscape(opts.cliScriptPath)}</string>
|
|
168
|
+
<string>daemon</string>
|
|
169
|
+
<string>run</string>
|
|
170
|
+
</array>
|
|
171
|
+
<key>RunAtLoad</key>
|
|
172
|
+
<true/>
|
|
173
|
+
<key>KeepAlive</key>
|
|
174
|
+
<true/>
|
|
175
|
+
<key>StandardOutPath</key>
|
|
176
|
+
<string>${xmlEscape(opts.logPath)}</string>
|
|
177
|
+
<key>StandardErrorPath</key>
|
|
178
|
+
<string>${xmlEscape(opts.logPath)}</string>
|
|
179
|
+
</dict>
|
|
180
|
+
</plist>
|
|
181
|
+
`;
|
|
182
|
+
}
|
|
183
|
+
/** ps `etime` ([[dd-]hh:]mm:ss) → whole seconds; null when empty or malformed. */
|
|
184
|
+
export function parseEtime(etime) {
|
|
185
|
+
const m = /^(?:(\d+)-)?(?:(\d+):)?(\d+):(\d+)$/.exec(etime.trim());
|
|
186
|
+
if (!m)
|
|
187
|
+
return null;
|
|
188
|
+
const [, dd, hh, mm, ss] = m;
|
|
189
|
+
if (dd !== undefined && hh === undefined)
|
|
190
|
+
return null;
|
|
191
|
+
return ((Number(dd ?? 0) * 24 + Number(hh ?? 0)) * 60 + Number(mm)) * 60 + Number(ss);
|
|
192
|
+
}
|
|
193
|
+
export function parseLaunchctlPid(printOutput) {
|
|
194
|
+
const m = /^\s*pid\s*=\s*(\d+)\s*$/m.exec(printOutput);
|
|
195
|
+
return m ? Number(m[1]) : null;
|
|
196
|
+
}
|
|
197
|
+
/** Last n lines of text, ignoring a trailing newline. */
|
|
198
|
+
export function lastLines(text, n) {
|
|
199
|
+
const lines = text.split('\n');
|
|
200
|
+
if (lines.at(-1) === '')
|
|
201
|
+
lines.pop();
|
|
202
|
+
return lines.slice(-n);
|
|
203
|
+
}
|
|
204
|
+
/** The production exec seam: execFile without a shell, resolving (never
|
|
205
|
+
* rejecting) `{ code, stdout, stderr }` — a missing binary or non-numeric
|
|
206
|
+
* error code becomes code 1. Exported for direct coverage in daemon.test.ts. */
|
|
207
|
+
export function defaultExec() {
|
|
208
|
+
return (cmd, args) => new Promise((res) => {
|
|
209
|
+
execFile(cmd, args, (error, stdout, stderr) => {
|
|
210
|
+
const code = error ? (error.code ?? 1) : 0;
|
|
211
|
+
res({ code: typeof code === 'number' ? code : 1, stdout, stderr });
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
function resolveDeps(deps) {
|
|
216
|
+
return {
|
|
217
|
+
exec: deps.exec ?? defaultExec(),
|
|
218
|
+
home: deps.home ?? homedir(),
|
|
219
|
+
uid: deps.uid ?? process.getuid?.() ?? 0,
|
|
220
|
+
platform: deps.platform ?? process.platform,
|
|
221
|
+
out: deps.out ?? process.stdout,
|
|
222
|
+
nodePath: deps.nodePath ?? process.execPath,
|
|
223
|
+
cliScriptPath: deps.cliScriptPath ?? realpathSync(process.argv[1] ?? ''),
|
|
224
|
+
registryFile: deps.registryFile ?? defaultRegistryPath(),
|
|
225
|
+
pollMs: deps.pollMs ?? 250,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
function requireDarwin(platform) {
|
|
229
|
+
if (platform !== 'darwin') {
|
|
230
|
+
throw new DaemonCtlError('factory daemon start|stop|status requires macOS launchd', 2);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/** Install (or reinstall) and load the LaunchAgent. Always a full reinstall:
|
|
234
|
+
* regenerate the plist, bootout (ignoring failure — handles both "already
|
|
235
|
+
* loaded" and "not loaded"), then bootstrap into the gui domain so the daemon's
|
|
236
|
+
* Claude workers keep login-keychain access (docs/runbooks/macos-keychain-launchagent.md). */
|
|
237
|
+
export async function cmdDaemonStart(deps = {}) {
|
|
238
|
+
const d = resolveDeps(deps);
|
|
239
|
+
requireDarwin(d.platform);
|
|
240
|
+
const { launchAgentsDir, plistPath, logPath } = factorydFiles(d.home);
|
|
241
|
+
mkdirSync(launchAgentsDir, { recursive: true });
|
|
242
|
+
mkdirSync(dirname(logPath), { recursive: true });
|
|
243
|
+
writeFileSync(plistPath, renderFactorydPlist({ nodePath: d.nodePath, cliScriptPath: d.cliScriptPath, logPath }));
|
|
244
|
+
await d.exec('launchctl', ['bootout', `gui/${d.uid}/${FACTORYD_LABEL}`]);
|
|
245
|
+
const boot = await d.exec('launchctl', ['bootstrap', `gui/${d.uid}`, plistPath]);
|
|
246
|
+
if (boot.code !== 0) {
|
|
247
|
+
throw new DaemonCtlError(`launchctl bootstrap failed: ${boot.stderr.trim() || boot.stdout.trim() || `exit ${boot.code}`}`, 1);
|
|
248
|
+
}
|
|
249
|
+
const print = await d.exec('launchctl', ['print', `gui/${d.uid}/${FACTORYD_LABEL}`]);
|
|
250
|
+
const pid = parseLaunchctlPid(print.stdout);
|
|
251
|
+
d.out.write(`factoryd: installed ${plistPath}\n`);
|
|
252
|
+
d.out.write(pid === null ? 'factoryd: loaded — launchd will start it (RunAtLoad)\n' : `factoryd: running (pid ${pid})\n`);
|
|
253
|
+
}
|
|
254
|
+
/** Unload the LaunchAgent. Idempotent: a not-loaded agent is success. The plist
|
|
255
|
+
* stays on disk so `factory daemon start` re-enables it. */
|
|
256
|
+
export async function cmdDaemonStop(deps = {}) {
|
|
257
|
+
const d = resolveDeps(deps);
|
|
258
|
+
requireDarwin(d.platform);
|
|
259
|
+
const res = await d.exec('launchctl', ['bootout', `gui/${d.uid}/${FACTORYD_LABEL}`]);
|
|
260
|
+
if (res.code === 0) {
|
|
261
|
+
d.out.write('factoryd: stopped (unloaded from launchd)\n');
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
d.out.write('factoryd: not loaded — already stopped\n');
|
|
265
|
+
}
|
|
266
|
+
d.out.write(' plist stays installed; `factory daemon start` re-enables it\n');
|
|
267
|
+
}
|
|
268
|
+
/** Report running/not-loaded, pid + uptime, plist install state, and the
|
|
269
|
+
* attached repos from the registry. Exit code 0 when running, 1 when not.
|
|
270
|
+
* With `opts.json`, print one DaemonStatusJson object instead of text. */
|
|
271
|
+
export async function cmdDaemonStatus(deps = {}, opts = {}) {
|
|
272
|
+
const d = resolveDeps(deps);
|
|
273
|
+
requireDarwin(d.platform);
|
|
274
|
+
const { plistPath, logPath } = factorydFiles(d.home);
|
|
275
|
+
if (opts.json) {
|
|
276
|
+
const printed = await d.exec('launchctl', ['print', `gui/${d.uid}/${FACTORYD_LABEL}`]);
|
|
277
|
+
const pid = printed.code === 0 ? parseLaunchctlPid(printed.stdout) : null;
|
|
278
|
+
const uptimeSec = pid === null ? null : parseEtime((await d.exec('ps', ['-o', 'etime=', '-p', String(pid)])).stdout);
|
|
279
|
+
const payload = {
|
|
280
|
+
schemaVersion: 1,
|
|
281
|
+
running: pid !== null,
|
|
282
|
+
pid,
|
|
283
|
+
uptimeSec,
|
|
284
|
+
plistInstalled: existsSync(plistPath),
|
|
285
|
+
repos: listRepos(await loadRegistry(d.registryFile)).map((r) => ({
|
|
286
|
+
slug: r.slug,
|
|
287
|
+
checkoutPath: r.path,
|
|
288
|
+
state: r.state,
|
|
289
|
+
})),
|
|
290
|
+
};
|
|
291
|
+
d.out.write(`${JSON.stringify(payload)}\n`);
|
|
292
|
+
if (pid === null)
|
|
293
|
+
process.exitCode = 1;
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const print = await d.exec('launchctl', ['print', `gui/${d.uid}/${FACTORYD_LABEL}`]);
|
|
297
|
+
if (print.code !== 0) {
|
|
298
|
+
d.out.write('factoryd: not loaded\n');
|
|
299
|
+
d.out.write(existsSync(plistPath) ? ` plist installed: ${plistPath}\n` : ' plist not installed\n');
|
|
300
|
+
d.out.write(' run: factory daemon start\n');
|
|
301
|
+
process.exitCode = 1;
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
const pid = parseLaunchctlPid(print.stdout);
|
|
305
|
+
if (pid === null) {
|
|
306
|
+
d.out.write('factoryd: loaded (not currently running)\n');
|
|
307
|
+
process.exitCode = 1;
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
const ps = await d.exec('ps', ['-o', 'etime=', '-p', String(pid)]);
|
|
311
|
+
const uptime = ps.stdout.trim() || 'unknown';
|
|
312
|
+
d.out.write(`factoryd: running (pid ${pid}, uptime ${uptime})\n`);
|
|
313
|
+
}
|
|
314
|
+
d.out.write(` plist: ${plistPath}\n`);
|
|
315
|
+
}
|
|
316
|
+
d.out.write(` log: ${logPath}\n`);
|
|
317
|
+
const registry = await loadRegistry(d.registryFile);
|
|
318
|
+
const repos = listRepos(registry);
|
|
319
|
+
if (repos.length === 0) {
|
|
320
|
+
d.out.write(' attached repos: none\n');
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
d.out.write(` attached repos (${repos.length}):\n`);
|
|
324
|
+
for (const repo of repos)
|
|
325
|
+
d.out.write(` ${repo.slug} [${repo.state}]\n`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/** Print the last N lines of ~/.factory/daemon.log; with --follow, keep
|
|
329
|
+
* streaming appended bytes until Ctrl-C (size-offset poll, like logs.ts's
|
|
330
|
+
* followEvents — no `tail -f` child process). Works on any platform. */
|
|
331
|
+
export async function cmdDaemonLogs(opts, deps = {}) {
|
|
332
|
+
const d = resolveDeps(deps);
|
|
333
|
+
const { logPath } = factorydFiles(d.home);
|
|
334
|
+
const n = Number(opts.lines ?? '100');
|
|
335
|
+
if (!Number.isInteger(n) || n < 0) {
|
|
336
|
+
throw new DaemonCtlError(`invalid --lines "${opts.lines}" — expected a non-negative integer`, 2);
|
|
337
|
+
}
|
|
338
|
+
let initial;
|
|
339
|
+
try {
|
|
340
|
+
initial = readFileSync(logPath, 'utf-8');
|
|
341
|
+
}
|
|
342
|
+
catch (err) {
|
|
343
|
+
if (err.code !== 'ENOENT')
|
|
344
|
+
throw err;
|
|
345
|
+
d.out.write(`no daemon log yet at ${logPath} — is the daemon started?\n`);
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
const tail = lastLines(initial, n);
|
|
349
|
+
if (tail.length > 0)
|
|
350
|
+
d.out.write(tail.join('\n') + '\n');
|
|
351
|
+
if (!opts.follow)
|
|
352
|
+
return;
|
|
353
|
+
let offset = Buffer.byteLength(initial);
|
|
354
|
+
const poll = setInterval(() => {
|
|
355
|
+
let fd;
|
|
356
|
+
try {
|
|
357
|
+
fd = openSync(logPath, 'r');
|
|
358
|
+
}
|
|
359
|
+
catch {
|
|
360
|
+
return; // transiently missing (rotation) — keep polling
|
|
361
|
+
}
|
|
362
|
+
let size;
|
|
363
|
+
try {
|
|
364
|
+
size = fstatSync(fd).size;
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
closeSync(fd);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
if (size < offset)
|
|
371
|
+
offset = 0; // truncated/rotated: start over
|
|
372
|
+
if (size === offset) {
|
|
373
|
+
closeSync(fd);
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
try {
|
|
377
|
+
const buf = Buffer.alloc(size - offset);
|
|
378
|
+
const read = readSync(fd, buf, 0, buf.length, offset);
|
|
379
|
+
offset += read;
|
|
380
|
+
d.out.write(buf.subarray(0, read).toString('utf-8'));
|
|
381
|
+
}
|
|
382
|
+
finally {
|
|
383
|
+
closeSync(fd);
|
|
384
|
+
}
|
|
385
|
+
}, d.pollMs);
|
|
386
|
+
await new Promise((res) => {
|
|
387
|
+
const done = () => res();
|
|
388
|
+
process.once('SIGINT', done);
|
|
389
|
+
process.once('SIGTERM', done);
|
|
390
|
+
});
|
|
391
|
+
clearInterval(poll);
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
|