@pleri/olam-cli 0.1.103 → 0.1.105

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,49 @@
1
+ /**
2
+ * olam kg watch <workspace> — opt-in pristine watcher.
3
+ *
4
+ * Phase C2 of olam-kg-service (plan ~/.claude/plans/olam-kg-service.md).
5
+ *
6
+ * Runs `graphify <workspacePath> --watch --update --graph <pristinePath>/graph.json`
7
+ * as a managed subprocess against the operator's workspace clone so the
8
+ * pristine KG stays fresh as host-side commits land. Off by default;
9
+ * operator opts in per workspace.
10
+ *
11
+ * Single-instance enforcement via PID file at
12
+ * `~/.olam/kg/<workspace>/.watch.pid`. Reclaim stale PIDs (process gone
13
+ * but file remains) silently. Reject when an active PID still owns the
14
+ * file.
15
+ *
16
+ * Lifecycle:
17
+ * 1. CLI process spawns graphify in the FOREGROUND (`detached: false`)
18
+ * so the operator's terminal owns it; Ctrl-C kills both cleanly.
19
+ * 2. SIGINT/SIGTERM on this process → forwarded to graphify; subprocess
20
+ * exits; CLI removes PID file; CLI exits.
21
+ * 3. graphify exiting on its own → CLI removes PID file + exits with
22
+ * graphify's status code.
23
+ *
24
+ * Risk T7 mitigation: workspace name regex-validated via @olam/core's
25
+ * `validateWorkspaceName`; `--graph` path resolved via `kgPristinePath`
26
+ * (which asserts the resolved path stays under `~/.olam/kg/`). All
27
+ * subprocess invocations use argv arrays (no shell interpolation).
28
+ */
29
+ import type { Command } from 'commander';
30
+ import { spawn } from 'node:child_process';
31
+ interface KgWatchOptions {
32
+ readonly cwd?: string;
33
+ }
34
+ export interface RunKgWatchDeps {
35
+ /** Spawn factory; injectable for tests so we don't fork real graphify. */
36
+ readonly spawnImpl?: typeof spawn;
37
+ /** Resolve workspace cwd; defaults to process.cwd(). */
38
+ readonly cwd?: string;
39
+ /** Suppresses signal-handler registration during tests. */
40
+ readonly registerSignalHandlers?: boolean;
41
+ }
42
+ interface RunResult {
43
+ readonly exitCode: number;
44
+ readonly pidWritten: boolean;
45
+ }
46
+ export declare function runKgWatch(workspaceArg: string | undefined, opts: KgWatchOptions, deps?: RunKgWatchDeps): Promise<RunResult>;
47
+ export declare function registerKgWatchCommand(kg: Command): void;
48
+ export {};
49
+ //# sourceMappingURL=kg-watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kg-watch.d.ts","sourceRoot":"","sources":["../../src/commands/kg-watch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAO9D,UAAU,cAAc;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAqED,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,wDAAwD;IACxD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAC3C;AAED,UAAU,SAAS;IACjB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAsB,UAAU,CAC9B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,IAAI,EAAE,cAAc,EACpB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,SAAS,CAAC,CAyEpB;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAWxD"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * olam kg watch <workspace> — opt-in pristine watcher.
3
+ *
4
+ * Phase C2 of olam-kg-service (plan ~/.claude/plans/olam-kg-service.md).
5
+ *
6
+ * Runs `graphify <workspacePath> --watch --update --graph <pristinePath>/graph.json`
7
+ * as a managed subprocess against the operator's workspace clone so the
8
+ * pristine KG stays fresh as host-side commits land. Off by default;
9
+ * operator opts in per workspace.
10
+ *
11
+ * Single-instance enforcement via PID file at
12
+ * `~/.olam/kg/<workspace>/.watch.pid`. Reclaim stale PIDs (process gone
13
+ * but file remains) silently. Reject when an active PID still owns the
14
+ * file.
15
+ *
16
+ * Lifecycle:
17
+ * 1. CLI process spawns graphify in the FOREGROUND (`detached: false`)
18
+ * so the operator's terminal owns it; Ctrl-C kills both cleanly.
19
+ * 2. SIGINT/SIGTERM on this process → forwarded to graphify; subprocess
20
+ * exits; CLI removes PID file; CLI exits.
21
+ * 3. graphify exiting on its own → CLI removes PID file + exits with
22
+ * graphify's status code.
23
+ *
24
+ * Risk T7 mitigation: workspace name regex-validated via @olam/core's
25
+ * `validateWorkspaceName`; `--graph` path resolved via `kgPristinePath`
26
+ * (which asserts the resolved path stays under `~/.olam/kg/`). All
27
+ * subprocess invocations use argv arrays (no shell interpolation).
28
+ */
29
+ import { spawn } from 'node:child_process';
30
+ import fs from 'node:fs';
31
+ import path from 'node:path';
32
+ import { kgPristinePath } from '@olam/core/src/kg/storage-paths.js';
33
+ import { validateWorkspaceName } from '@olam/core/src/world/workspace-name.js';
34
+ import { printError, printInfo, printSuccess } from '../output.js';
35
+ function pidFilePath(workspace) {
36
+ return path.join(kgPristinePath(workspace), '.watch.pid');
37
+ }
38
+ /**
39
+ * Check whether a given PID is currently a live process.
40
+ *
41
+ * `process.kill(pid, 0)` returns truthy AND doesn't actually send a
42
+ * signal when called with signal=0 — it's the standard POSIX liveness
43
+ * check. Throws ESRCH when the PID is dead. EPERM means "exists but
44
+ * I can't signal it" (different user); we treat EPERM as "alive" because
45
+ * the same operator owning olam should own the graphify subprocess.
46
+ */
47
+ function isPidAlive(pid) {
48
+ if (!Number.isInteger(pid) || pid <= 0)
49
+ return false;
50
+ try {
51
+ process.kill(pid, 0);
52
+ return true;
53
+ }
54
+ catch (err) {
55
+ const code = err.code;
56
+ if (code === 'EPERM')
57
+ return true; // exists, different user
58
+ return false; // ESRCH or other → dead
59
+ }
60
+ }
61
+ function readAndClassifyPid(workspace) {
62
+ const file = pidFilePath(workspace);
63
+ if (!fs.existsSync(file))
64
+ return { status: 'no-pidfile', pid: null };
65
+ let pid;
66
+ try {
67
+ const raw = fs.readFileSync(file, 'utf-8').trim();
68
+ pid = Number.parseInt(raw, 10);
69
+ }
70
+ catch {
71
+ // Unreadable → treat as stale; the writer must have been killed mid-flush
72
+ fs.rmSync(file, { force: true });
73
+ return { status: 'stale-reclaimed', pid: null };
74
+ }
75
+ if (!Number.isInteger(pid) || pid <= 0) {
76
+ fs.rmSync(file, { force: true });
77
+ return { status: 'stale-reclaimed', pid: null };
78
+ }
79
+ if (isPidAlive(pid))
80
+ return { status: 'active', pid };
81
+ fs.rmSync(file, { force: true });
82
+ return { status: 'stale-reclaimed', pid: null };
83
+ }
84
+ function writePidFile(workspace, pid) {
85
+ const file = pidFilePath(workspace);
86
+ const dir = path.dirname(file);
87
+ fs.mkdirSync(dir, { recursive: true });
88
+ fs.writeFileSync(file, String(pid), { encoding: 'utf-8' });
89
+ }
90
+ function removePidFile(workspace) {
91
+ const file = pidFilePath(workspace);
92
+ try {
93
+ fs.rmSync(file, { force: true });
94
+ }
95
+ catch {
96
+ // best-effort cleanup
97
+ }
98
+ }
99
+ export async function runKgWatch(workspaceArg, opts, deps = {}) {
100
+ const cwd = deps.cwd ?? opts.cwd ?? process.cwd();
101
+ const name = workspaceArg ?? path.basename(cwd).toLowerCase();
102
+ try {
103
+ validateWorkspaceName(name);
104
+ }
105
+ catch (err) {
106
+ printError(err.message);
107
+ return { exitCode: 1, pidWritten: false };
108
+ }
109
+ const pristinePath = kgPristinePath(name);
110
+ const graphPath = path.join(pristinePath, 'graphify-out', 'graph.json');
111
+ // Single-instance gate. PRE-spawn so we never start a duplicate watcher.
112
+ const pidState = readAndClassifyPid(name);
113
+ if (pidState.status === 'active') {
114
+ printError(`olam kg watch ${name} — already running (PID ${pidState.pid}). `
115
+ + `Send SIGINT to that process to stop the existing watcher first.`);
116
+ return { exitCode: 1, pidWritten: false };
117
+ }
118
+ if (pidState.status === 'stale-reclaimed') {
119
+ printInfo('stale-pid', `reclaimed dead PID file at ${pidFilePath(name)}`);
120
+ }
121
+ const spawnFn = deps.spawnImpl ?? spawn;
122
+ const child = spawnFn('graphify', [cwd, '--watch', '--update', '--graph', graphPath], {
123
+ cwd,
124
+ env: process.env,
125
+ detached: false,
126
+ stdio: 'inherit',
127
+ });
128
+ if (typeof child.pid !== 'number') {
129
+ printError('graphify failed to launch (no PID assigned)');
130
+ return { exitCode: 1, pidWritten: false };
131
+ }
132
+ writePidFile(name, child.pid);
133
+ printSuccess(`olam kg watch ${name} — graphify PID ${child.pid} (Ctrl-C to stop)`);
134
+ if (deps.registerSignalHandlers !== false) {
135
+ const forward = (sig) => {
136
+ if (child.pid && !child.killed) {
137
+ try {
138
+ process.kill(child.pid, sig);
139
+ }
140
+ catch {
141
+ // child already dead; fall through to wait
142
+ }
143
+ }
144
+ };
145
+ process.on('SIGINT', () => forward('SIGINT'));
146
+ process.on('SIGTERM', () => forward('SIGTERM'));
147
+ }
148
+ return new Promise((resolve) => {
149
+ child.on('exit', (code, signal) => {
150
+ removePidFile(name);
151
+ const exitCode = typeof code === 'number' ? code : signal === 'SIGINT' || signal === 'SIGTERM' ? 0 : 1;
152
+ resolve({ exitCode, pidWritten: true });
153
+ });
154
+ child.on('error', (err) => {
155
+ removePidFile(name);
156
+ printError(`graphify subprocess error: ${err.message}`);
157
+ resolve({ exitCode: 1, pidWritten: true });
158
+ });
159
+ });
160
+ }
161
+ export function registerKgWatchCommand(kg) {
162
+ kg.command('watch')
163
+ .description('Run graphify --watch against a workspace, keeping its pristine KG fresh '
164
+ + 'as host-side commits land. Single-instance via PID file; Ctrl-C cleanly stops.')
165
+ .argument('[workspace]', 'workspace name (lowercase alphanumeric + hyphens/underscores)')
166
+ .action(async (workspaceArg) => {
167
+ const r = await runKgWatch(workspaceArg, {});
168
+ if (r.exitCode !== 0)
169
+ process.exitCode = r.exitCode;
170
+ });
171
+ }
172
+ //# sourceMappingURL=kg-watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kg-watch.js","sourceRoot":"","sources":["../../src/commands/kg-watch.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "auth": "sha256:4853cf21c4f63ffcc0e44bf1b1e1240aa5bd33348cbced2e1e2960aca0744484",
3
- "devbox": "sha256:90fc750afe69e792042809276546b9fdd372691561776dfbfc4c9ad835b985f2",
4
- "devbox-base": "sha256:473ff96011309dccefefba830f332bbab394950c774f7bcd75d18751b79797d2",
5
- "host-cp": "sha256:9af7f646a39eac1d68bf8de80a450fa531da0c73f082d2724429a01e2704e796",
3
+ "devbox": "sha256:18fc033b88991def36ceef33b2614b67c45896375a9954b2de7d5137aa9f0604",
4
+ "devbox-base": "sha256:494a7434d22e2018ad88c4c50bb35cdf57e665a07ee8c6d4bb8b5f822507914a",
5
+ "host-cp": "sha256:82de19cb665e7e368e5133e263bc3a837da03ac614f4687f05bf4a72dccaf0c1",
6
6
  "mcp-auth": "sha256:5da67023e96f685589676b191105fa260eaa0199ef1af43e7a63f982880c7bf7",
7
7
  "$schema_version": 1,
8
- "$published_version": "0.1.103",
8
+ "$published_version": "0.1.105",
9
9
  "$registry": "ghcr.io/pleri"
10
10
  }