@pleri/olam-cli 0.1.7
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/dist/__tests__/auth-status.test.d.ts +2 -0
- package/dist/__tests__/auth-status.test.d.ts.map +1 -0
- package/dist/__tests__/auth-status.test.js +290 -0
- package/dist/__tests__/auth-status.test.js.map +1 -0
- package/dist/__tests__/auth-upgrade.test.d.ts +9 -0
- package/dist/__tests__/auth-upgrade.test.d.ts.map +1 -0
- package/dist/__tests__/auth-upgrade.test.js +161 -0
- package/dist/__tests__/auth-upgrade.test.js.map +1 -0
- package/dist/__tests__/create-app-urls.test.d.ts +2 -0
- package/dist/__tests__/create-app-urls.test.d.ts.map +1 -0
- package/dist/__tests__/create-app-urls.test.js +102 -0
- package/dist/__tests__/create-app-urls.test.js.map +1 -0
- package/dist/__tests__/enter.test.d.ts +2 -0
- package/dist/__tests__/enter.test.d.ts.map +1 -0
- package/dist/__tests__/enter.test.js +90 -0
- package/dist/__tests__/enter.test.js.map +1 -0
- package/dist/__tests__/host-cp-gh-token.test.d.ts +9 -0
- package/dist/__tests__/host-cp-gh-token.test.d.ts.map +1 -0
- package/dist/__tests__/host-cp-gh-token.test.js +119 -0
- package/dist/__tests__/host-cp-gh-token.test.js.map +1 -0
- package/dist/__tests__/host-cp.test.d.ts +9 -0
- package/dist/__tests__/host-cp.test.d.ts.map +1 -0
- package/dist/__tests__/host-cp.test.js +254 -0
- package/dist/__tests__/host-cp.test.js.map +1 -0
- package/dist/__tests__/keys.test.d.ts +9 -0
- package/dist/__tests__/keys.test.d.ts.map +1 -0
- package/dist/__tests__/keys.test.js +145 -0
- package/dist/__tests__/keys.test.js.map +1 -0
- package/dist/__tests__/logs.test.d.ts +9 -0
- package/dist/__tests__/logs.test.d.ts.map +1 -0
- package/dist/__tests__/logs.test.js +124 -0
- package/dist/__tests__/logs.test.js.map +1 -0
- package/dist/__tests__/ps.test.d.ts +2 -0
- package/dist/__tests__/ps.test.d.ts.map +1 -0
- package/dist/__tests__/ps.test.js +172 -0
- package/dist/__tests__/ps.test.js.map +1 -0
- package/dist/__tests__/status-app-urls.test.d.ts +2 -0
- package/dist/__tests__/status-app-urls.test.d.ts.map +1 -0
- package/dist/__tests__/status-app-urls.test.js +125 -0
- package/dist/__tests__/status-app-urls.test.js.map +1 -0
- package/dist/__tests__/upgrade.test.d.ts +9 -0
- package/dist/__tests__/upgrade.test.d.ts.map +1 -0
- package/dist/__tests__/upgrade.test.js +262 -0
- package/dist/__tests__/upgrade.test.js.map +1 -0
- package/dist/commands/__tests__/carry-uncommitted.test.d.ts +14 -0
- package/dist/commands/__tests__/carry-uncommitted.test.d.ts.map +1 -0
- package/dist/commands/__tests__/carry-uncommitted.test.js +83 -0
- package/dist/commands/__tests__/carry-uncommitted.test.js.map +1 -0
- package/dist/commands/__tests__/openHostCpUrl.test.d.ts +2 -0
- package/dist/commands/__tests__/openHostCpUrl.test.d.ts.map +1 -0
- package/dist/commands/__tests__/openHostCpUrl.test.js +63 -0
- package/dist/commands/__tests__/openHostCpUrl.test.js.map +1 -0
- package/dist/commands/__tests__/refresh.test.d.ts +13 -0
- package/dist/commands/__tests__/refresh.test.d.ts.map +1 -0
- package/dist/commands/__tests__/refresh.test.js +170 -0
- package/dist/commands/__tests__/refresh.test.js.map +1 -0
- package/dist/commands/auth-status.d.ts +43 -0
- package/dist/commands/auth-status.d.ts.map +1 -0
- package/dist/commands/auth-status.js +208 -0
- package/dist/commands/auth-status.js.map +1 -0
- package/dist/commands/auth-upgrade.d.ts +47 -0
- package/dist/commands/auth-upgrade.d.ts.map +1 -0
- package/dist/commands/auth-upgrade.js +277 -0
- package/dist/commands/auth-upgrade.js.map +1 -0
- package/dist/commands/auth.d.ts +16 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +283 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/create.d.ts +8 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +512 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/crystallize.d.ts +8 -0
- package/dist/commands/crystallize.d.ts.map +1 -0
- package/dist/commands/crystallize.js +101 -0
- package/dist/commands/crystallize.js.map +1 -0
- package/dist/commands/destroy.d.ts +6 -0
- package/dist/commands/destroy.d.ts.map +1 -0
- package/dist/commands/destroy.js +54 -0
- package/dist/commands/destroy.js.map +1 -0
- package/dist/commands/dispatch.d.ts +9 -0
- package/dist/commands/dispatch.d.ts.map +1 -0
- package/dist/commands/dispatch.js +94 -0
- package/dist/commands/dispatch.js.map +1 -0
- package/dist/commands/enter.d.ts +63 -0
- package/dist/commands/enter.d.ts.map +1 -0
- package/dist/commands/enter.js +206 -0
- package/dist/commands/enter.js.map +1 -0
- package/dist/commands/host-cp.d.ts +191 -0
- package/dist/commands/host-cp.d.ts.map +1 -0
- package/dist/commands/host-cp.js +797 -0
- package/dist/commands/host-cp.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +143 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +22 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +203 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/keys.d.ts +26 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +151 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/lanes.d.ts +18 -0
- package/dist/commands/lanes.d.ts.map +1 -0
- package/dist/commands/lanes.js +122 -0
- package/dist/commands/lanes.js.map +1 -0
- package/dist/commands/list.d.ts +6 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +39 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/logs.d.ts +38 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +177 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/observe.d.ts +9 -0
- package/dist/commands/observe.d.ts.map +1 -0
- package/dist/commands/observe.js +34 -0
- package/dist/commands/observe.js.map +1 -0
- package/dist/commands/policy-check.d.ts +14 -0
- package/dist/commands/policy-check.d.ts.map +1 -0
- package/dist/commands/policy-check.js +76 -0
- package/dist/commands/policy-check.js.map +1 -0
- package/dist/commands/pr.d.ts +17 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +148 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/ps.d.ts +25 -0
- package/dist/commands/ps.d.ts.map +1 -0
- package/dist/commands/ps.js +164 -0
- package/dist/commands/ps.js.map +1 -0
- package/dist/commands/refresh-helpers.d.ts +25 -0
- package/dist/commands/refresh-helpers.d.ts.map +1 -0
- package/dist/commands/refresh-helpers.js +56 -0
- package/dist/commands/refresh-helpers.js.map +1 -0
- package/dist/commands/refresh.d.ts +23 -0
- package/dist/commands/refresh.d.ts.map +1 -0
- package/dist/commands/refresh.js +237 -0
- package/dist/commands/refresh.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +51 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/upgrade.d.ts +67 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +358 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/workspace.d.ts +23 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +198 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/commands/world-snapshot.d.ts +18 -0
- package/dist/commands/world-snapshot.d.ts.map +1 -0
- package/dist/commands/world-snapshot.js +327 -0
- package/dist/commands/world-snapshot.js.map +1 -0
- package/dist/context.d.ts +26 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +51 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18007 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.js +32236 -0
- package/dist/output.d.ts +10 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +31 -0
- package/dist/output.js.map +1 -0
- package/host-cp/compose.yaml +126 -0
- package/host-cp/src/auth-secret-hint.mjs +45 -0
- package/host-cp/src/auth.mjs +155 -0
- package/host-cp/src/compose-worlds-sources.mjs +170 -0
- package/host-cp/src/container-secret-fetcher.mjs +163 -0
- package/host-cp/src/docker-events.mjs +184 -0
- package/host-cp/src/local-worlds-source.mjs +83 -0
- package/host-cp/src/plan-orchestrator.mjs +829 -0
- package/host-cp/src/plan-progress.mjs +282 -0
- package/host-cp/src/pr-cache.mjs +201 -0
- package/host-cp/src/pr-merge-poller.mjs +154 -0
- package/host-cp/src/process-poller.mjs +250 -0
- package/host-cp/src/proxy.mjs +245 -0
- package/host-cp/src/pylon-worlds-source.mjs +68 -0
- package/host-cp/src/redact.mjs +67 -0
- package/host-cp/src/secret-cache.mjs +104 -0
- package/host-cp/src/server.mjs +2215 -0
- package/host-cp/src/sse-gate.mjs +117 -0
- package/host-cp/src/version-status.mjs +209 -0
- package/host-cp/src/workspace-catalog.mjs +149 -0
- package/host-cp/src/world-names-store.mjs +176 -0
- package/host-cp/src/world-pr-state.mjs +97 -0
- package/host-cp/src/world-progress.mjs +322 -0
- package/host-cp/src/world-tunnel-manager.mjs +288 -0
- package/host-cp/src/worlds-db-source.mjs +191 -0
- package/host-cp/src/worlds-source.mjs +59 -0
- package/package.json +38 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase C8 (olam-dogfood-vision): `olam lanes <subcommand>` — operator-
|
|
3
|
+
* facing CRUD for claude-lane-* tmux sessions in a running world.
|
|
4
|
+
*
|
|
5
|
+
* Subcommands:
|
|
6
|
+
* list <world> — GET /lanes
|
|
7
|
+
* create <world> --name <n> --task <t> — POST /lanes/create
|
|
8
|
+
* destroy <world> <name> — DELETE /lanes/<name>
|
|
9
|
+
* dispatch <world> <name> <prompt> — POST /lanes/<name>/dispatch
|
|
10
|
+
*
|
|
11
|
+
* Goes through host-cp's `/api/world/<id>/*` proxy (Bearer-auth) so the
|
|
12
|
+
* operator never handles the per-world CP's CONTAINER_SECRET directly.
|
|
13
|
+
* The host-cp proxy injects X-Olam-Secret server-side per the
|
|
14
|
+
* established Phase F-2-D proxy contract.
|
|
15
|
+
*/
|
|
16
|
+
import type { Command } from 'commander';
|
|
17
|
+
export declare function registerLanes(program: Command): void;
|
|
18
|
+
//# sourceMappingURL=lanes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lanes.d.ts","sourceRoot":"","sources":["../../src/commands/lanes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmGzC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqCpD"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase C8 (olam-dogfood-vision): `olam lanes <subcommand>` — operator-
|
|
3
|
+
* facing CRUD for claude-lane-* tmux sessions in a running world.
|
|
4
|
+
*
|
|
5
|
+
* Subcommands:
|
|
6
|
+
* list <world> — GET /lanes
|
|
7
|
+
* create <world> --name <n> --task <t> — POST /lanes/create
|
|
8
|
+
* destroy <world> <name> — DELETE /lanes/<name>
|
|
9
|
+
* dispatch <world> <name> <prompt> — POST /lanes/<name>/dispatch
|
|
10
|
+
*
|
|
11
|
+
* Goes through host-cp's `/api/world/<id>/*` proxy (Bearer-auth) so the
|
|
12
|
+
* operator never handles the per-world CP's CONTAINER_SECRET directly.
|
|
13
|
+
* The host-cp proxy injects X-Olam-Secret server-side per the
|
|
14
|
+
* established Phase F-2-D proxy contract.
|
|
15
|
+
*/
|
|
16
|
+
import { callHostCpProxy } from './host-cp.js';
|
|
17
|
+
import { printError, printSuccess, printInfo, printHeader } from '../output.js';
|
|
18
|
+
async function handleList(world) {
|
|
19
|
+
printHeader(`Lanes in world ${world}`);
|
|
20
|
+
const result = await callHostCpProxy('GET', world, '/lanes');
|
|
21
|
+
if (!result.ok) {
|
|
22
|
+
printError(`List failed: ${result.error}`);
|
|
23
|
+
if (result.status === 0) {
|
|
24
|
+
printInfo('Hint', 'Is host CP running? `olam host-cp status`');
|
|
25
|
+
}
|
|
26
|
+
process.exitCode = 1;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const data = result.data;
|
|
30
|
+
const lanes = data?.lanes ?? [];
|
|
31
|
+
if (lanes.length === 0) {
|
|
32
|
+
printInfo('Lanes', '(none — dispatch a task to spawn claude-main)');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
for (const l of lanes) {
|
|
36
|
+
const marker = l.isMain ? '◉' : '·';
|
|
37
|
+
const taskPreview = l.task.length > 60 ? l.task.slice(0, 57) + '...' : l.task;
|
|
38
|
+
printInfo(`${marker} ${l.name}`.padEnd(24), `${l.status.padEnd(8)} ${l.tmuxSession.padEnd(28)} ${taskPreview}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function handleCreate(world, opts) {
|
|
42
|
+
printHeader(`Create lane ${opts.name} in ${world}`);
|
|
43
|
+
const result = await callHostCpProxy('POST', world, '/lanes/create', {
|
|
44
|
+
name: opts.name,
|
|
45
|
+
task: opts.task,
|
|
46
|
+
});
|
|
47
|
+
if (!result.ok) {
|
|
48
|
+
printError(`Create failed (HTTP ${result.status}): ${result.error}`);
|
|
49
|
+
process.exitCode = 1;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const data = result.data;
|
|
53
|
+
if (!data) {
|
|
54
|
+
printError('Create succeeded but response body was empty');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
printSuccess(`${data.action ?? 'created'} lane ${data.name} → ${data.tmuxSession} (${data.status})`);
|
|
58
|
+
}
|
|
59
|
+
async function handleDestroy(world, name) {
|
|
60
|
+
printHeader(`Destroy lane ${name} in ${world}`);
|
|
61
|
+
const result = await callHostCpProxy('DELETE', world, `/lanes/${encodeURIComponent(name)}`);
|
|
62
|
+
if (!result.ok) {
|
|
63
|
+
printError(`Destroy failed (HTTP ${result.status}): ${result.error}`);
|
|
64
|
+
if (result.status === 404) {
|
|
65
|
+
printInfo('Hint', 'Lane already gone? Check `olam lanes list <world>`.');
|
|
66
|
+
}
|
|
67
|
+
process.exitCode = 1;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
printSuccess(`Destroyed lane ${name} (transcript retained)`);
|
|
71
|
+
}
|
|
72
|
+
async function handleDispatch(world, name, prompt) {
|
|
73
|
+
printHeader(`Dispatch to lane ${name} in ${world}`);
|
|
74
|
+
if (!prompt || prompt.trim().length === 0) {
|
|
75
|
+
printError('prompt must be a non-empty string');
|
|
76
|
+
process.exitCode = 1;
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const result = await callHostCpProxy('POST', world, `/lanes/${encodeURIComponent(name)}/dispatch`, {
|
|
80
|
+
prompt,
|
|
81
|
+
});
|
|
82
|
+
if (!result.ok) {
|
|
83
|
+
printError(`Dispatch failed (HTTP ${result.status}): ${result.error}`);
|
|
84
|
+
if (result.status === 503) {
|
|
85
|
+
printInfo('Hint', 'Lane exists but claude is not running. Try `olam lanes destroy` then re-create.');
|
|
86
|
+
}
|
|
87
|
+
process.exitCode = 1;
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
printSuccess(`Dispatched to ${name} (status accepted)`);
|
|
91
|
+
}
|
|
92
|
+
export function registerLanes(program) {
|
|
93
|
+
const lanes = program
|
|
94
|
+
.command('lanes')
|
|
95
|
+
.description('Manage claude-lane-* tmux sessions inside a running world');
|
|
96
|
+
lanes
|
|
97
|
+
.command('list')
|
|
98
|
+
.description('Enumerate lanes in a world')
|
|
99
|
+
.argument('<world>', 'World id (e.g. ember-elk-8412)')
|
|
100
|
+
.action((world) => handleList(world));
|
|
101
|
+
lanes
|
|
102
|
+
.command('create')
|
|
103
|
+
.description('Spawn a new claude-lane-<name> session with an initial task')
|
|
104
|
+
.argument('<world>', 'World id')
|
|
105
|
+
.requiredOption('--name <name>', 'Lane name (lowercase + digits + hyphens)')
|
|
106
|
+
.requiredOption('--task <task>', 'Initial task prompt sent to the new lane')
|
|
107
|
+
.action((world, opts) => handleCreate(world, opts));
|
|
108
|
+
lanes
|
|
109
|
+
.command('destroy')
|
|
110
|
+
.description("Kill a lane's tmux session (transcript retained)")
|
|
111
|
+
.argument('<world>', 'World id')
|
|
112
|
+
.argument('<name>', 'Lane name')
|
|
113
|
+
.action((world, name) => handleDestroy(world, name));
|
|
114
|
+
lanes
|
|
115
|
+
.command('dispatch')
|
|
116
|
+
.description('Re-prompt an existing lane')
|
|
117
|
+
.argument('<world>', 'World id')
|
|
118
|
+
.argument('<name>', 'Lane name')
|
|
119
|
+
.argument('<prompt...>', 'Prompt to send (multi-arg joined with spaces)')
|
|
120
|
+
.action((world, name, promptParts) => handleDispatch(world, name, promptParts.join(' ')));
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=lanes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lanes.js","sourceRoot":"","sources":["../../src/commands/lanes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuCnD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam list — List all active worlds.
|
|
3
|
+
*/
|
|
4
|
+
import pc from 'picocolors';
|
|
5
|
+
import { loadContext } from '../context.js';
|
|
6
|
+
import { printError, formatAge } from '../output.js';
|
|
7
|
+
export function registerList(program) {
|
|
8
|
+
program
|
|
9
|
+
.command('list')
|
|
10
|
+
.alias('ls')
|
|
11
|
+
.description('List active worlds')
|
|
12
|
+
.action(async () => {
|
|
13
|
+
const { ctx, error } = await loadContext();
|
|
14
|
+
if (!ctx) {
|
|
15
|
+
printError(error?.message ?? 'Olam is not configured. Run `olam init` first.');
|
|
16
|
+
process.exitCode = 1;
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const worlds = ctx.worldManager.listWorlds();
|
|
20
|
+
if (worlds.length === 0) {
|
|
21
|
+
console.log(pc.dim('No worlds. Create one with `olam create --name my-world`.'));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
console.log(`${pc.bold(String(worlds.length))} world(s)\n`);
|
|
25
|
+
for (const w of worlds) {
|
|
26
|
+
const statusColor = w.status === 'running'
|
|
27
|
+
? pc.green(w.status)
|
|
28
|
+
: w.status === 'error'
|
|
29
|
+
? pc.red(w.status)
|
|
30
|
+
: pc.yellow(w.status);
|
|
31
|
+
const age = formatAge(w.createdAt);
|
|
32
|
+
const cost = `$${w.totalCostUsd.toFixed(2)}`;
|
|
33
|
+
console.log(` ${pc.bold(w.name)} ${pc.dim(`(${w.id})`)}`);
|
|
34
|
+
console.log(` ${statusColor} ${pc.dim('|')} ${w.repos.join(', ')} ${pc.dim('|')} ${cost} ${pc.dim('|')} ${age}`);
|
|
35
|
+
console.log();
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,oBAAoB,CAAC;SACjC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,UAAU,CAAC,KAAK,EAAE,OAAO,IAAI,gDAAgD,CAAC,CAAC;YAC/E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;QAE7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;QAE5D,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,KAAK,SAAS;gBACxC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;gBACpB,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO;oBACpB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;oBAClB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAE1B,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAE7C,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CACT,OAAO,WAAW,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAC7G,CAAC;YACF,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam logs <world> — Stream application logs from a world.
|
|
3
|
+
*
|
|
4
|
+
* Connects to the per-world CP's /api/logs SSE endpoints through the
|
|
5
|
+
* host-cp proxy at http://127.0.0.1:19000/api/world/<worldId>/api/logs.
|
|
6
|
+
*
|
|
7
|
+
* Options:
|
|
8
|
+
* --service <name> Stream a single service (default: all interleaved)
|
|
9
|
+
* --follow Stream indefinitely until Ctrl-C (default: false)
|
|
10
|
+
* --tail <n> Lines to show before exiting (default: 200)
|
|
11
|
+
*/
|
|
12
|
+
import type { Command } from 'commander';
|
|
13
|
+
/**
|
|
14
|
+
* Color a log line based on its log-level keyword.
|
|
15
|
+
* ERROR → red, WARN → yellow, INFO → dim, default → unchanged.
|
|
16
|
+
*/
|
|
17
|
+
export declare function colorLine(line: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Format a log line for terminal output.
|
|
20
|
+
* Prepends `[service] ` (cyan) when showService is true.
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatLine(line: string, service: string | undefined, showService: boolean): string;
|
|
23
|
+
interface SseReplay {
|
|
24
|
+
type: 'replay';
|
|
25
|
+
service?: string;
|
|
26
|
+
lines: string[];
|
|
27
|
+
}
|
|
28
|
+
interface SseLine {
|
|
29
|
+
type: 'line';
|
|
30
|
+
service?: string;
|
|
31
|
+
line: string;
|
|
32
|
+
ts: number;
|
|
33
|
+
}
|
|
34
|
+
type SseEvent = SseReplay | SseLine;
|
|
35
|
+
export declare function parseSseEvent(raw: string): SseEvent | null;
|
|
36
|
+
export declare function registerLogs(program: Command): void;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=logs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,OAAO,GAAG,MAAM,CAGlG;AAMD,UAAU,SAAS;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,KAAK,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpC,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAY1D;AAMD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuHnD"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam logs <world> — Stream application logs from a world.
|
|
3
|
+
*
|
|
4
|
+
* Connects to the per-world CP's /api/logs SSE endpoints through the
|
|
5
|
+
* host-cp proxy at http://127.0.0.1:19000/api/world/<worldId>/api/logs.
|
|
6
|
+
*
|
|
7
|
+
* Options:
|
|
8
|
+
* --service <name> Stream a single service (default: all interleaved)
|
|
9
|
+
* --follow Stream indefinitely until Ctrl-C (default: false)
|
|
10
|
+
* --tail <n> Lines to show before exiting (default: 200)
|
|
11
|
+
*/
|
|
12
|
+
import * as http from 'node:http';
|
|
13
|
+
import pc from 'picocolors';
|
|
14
|
+
import { readToken } from './host-cp.js';
|
|
15
|
+
import { loadContext } from '../context.js';
|
|
16
|
+
import { printError } from '../output.js';
|
|
17
|
+
const HOST_CP_PORT = 19000;
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Pure helpers — exported for unit testing
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* Color a log line based on its log-level keyword.
|
|
23
|
+
* ERROR → red, WARN → yellow, INFO → dim, default → unchanged.
|
|
24
|
+
*/
|
|
25
|
+
export function colorLine(line) {
|
|
26
|
+
if (/\bERROR\b/.test(line))
|
|
27
|
+
return pc.red(line);
|
|
28
|
+
if (/\bWARN\b/.test(line))
|
|
29
|
+
return pc.yellow(line);
|
|
30
|
+
if (/\bINFO\b/.test(line))
|
|
31
|
+
return pc.dim(line);
|
|
32
|
+
return line;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Format a log line for terminal output.
|
|
36
|
+
* Prepends `[service] ` (cyan) when showService is true.
|
|
37
|
+
*/
|
|
38
|
+
export function formatLine(line, service, showService) {
|
|
39
|
+
const prefix = showService && service ? `${pc.cyan(`[${service}]`)} ` : '';
|
|
40
|
+
return prefix + colorLine(line);
|
|
41
|
+
}
|
|
42
|
+
export function parseSseEvent(raw) {
|
|
43
|
+
if (!raw.startsWith('data: '))
|
|
44
|
+
return null;
|
|
45
|
+
try {
|
|
46
|
+
const parsed = JSON.parse(raw.slice(6));
|
|
47
|
+
if (!parsed || typeof parsed !== 'object')
|
|
48
|
+
return null;
|
|
49
|
+
const ev = parsed;
|
|
50
|
+
if (ev.type === 'replay' && Array.isArray(ev.lines))
|
|
51
|
+
return ev;
|
|
52
|
+
if (ev.type === 'line' && typeof ev.line === 'string')
|
|
53
|
+
return ev;
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Command registration
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
export function registerLogs(program) {
|
|
64
|
+
program
|
|
65
|
+
.command('logs')
|
|
66
|
+
.description('Stream application logs from a world')
|
|
67
|
+
.argument('<world>', 'World ID')
|
|
68
|
+
.option('--service <name>', 'Stream a specific service (default: all services)')
|
|
69
|
+
.option('--follow', 'Stream indefinitely until Ctrl-C', false)
|
|
70
|
+
.option('--tail <n>', 'Number of lines to display before exiting', '200')
|
|
71
|
+
.action(async (worldId, opts) => {
|
|
72
|
+
const { ctx, error } = await loadContext();
|
|
73
|
+
if (!ctx) {
|
|
74
|
+
printError(error?.message ?? 'Olam is not configured. Run `olam init` first.');
|
|
75
|
+
process.exitCode = 1;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const world = ctx.worldManager.getWorld(worldId);
|
|
79
|
+
if (!world) {
|
|
80
|
+
printError(`World "${worldId}" not found. Run \`olam list\` to see worlds.`);
|
|
81
|
+
process.exitCode = 1;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const token = readToken();
|
|
85
|
+
if (!token) {
|
|
86
|
+
printError('Host CP is not running. Start it with `olam host-cp start`.');
|
|
87
|
+
process.exitCode = 1;
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const tailLimit = Math.max(1, parseInt(opts.tail, 10) || 200);
|
|
91
|
+
const showService = opts.service === undefined;
|
|
92
|
+
const subPath = opts.service
|
|
93
|
+
? `/api/logs/${encodeURIComponent(opts.service)}`
|
|
94
|
+
: '/api/logs';
|
|
95
|
+
const url = `http://127.0.0.1:${HOST_CP_PORT}/api/world/${encodeURIComponent(worldId)}${subPath}`;
|
|
96
|
+
let lineCount = 0;
|
|
97
|
+
let done = false;
|
|
98
|
+
let resolveStream;
|
|
99
|
+
const streamDone = new Promise((r) => { resolveStream = r; });
|
|
100
|
+
const finish = () => {
|
|
101
|
+
if (!done) {
|
|
102
|
+
done = true;
|
|
103
|
+
resolveStream();
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const emit = (line, service) => {
|
|
107
|
+
process.stdout.write(formatLine(line, service, showService) + '\n');
|
|
108
|
+
lineCount++;
|
|
109
|
+
if (!opts.follow && lineCount >= tailLimit) {
|
|
110
|
+
finish();
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
};
|
|
115
|
+
const req = http.get(url, { headers: { Authorization: `Bearer ${token}` } }, (res) => {
|
|
116
|
+
if (res.statusCode !== 200) {
|
|
117
|
+
printError(`Log stream returned HTTP ${res.statusCode ?? 'unknown'}`);
|
|
118
|
+
process.exitCode = 1;
|
|
119
|
+
finish();
|
|
120
|
+
res.destroy();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
let buf = '';
|
|
124
|
+
res.on('data', (chunk) => {
|
|
125
|
+
if (done)
|
|
126
|
+
return;
|
|
127
|
+
buf += chunk.toString('utf8');
|
|
128
|
+
const rawLines = buf.split('\n');
|
|
129
|
+
buf = rawLines.pop() ?? '';
|
|
130
|
+
for (const raw of rawLines) {
|
|
131
|
+
if (done)
|
|
132
|
+
break;
|
|
133
|
+
const ev = parseSseEvent(raw);
|
|
134
|
+
if (!ev)
|
|
135
|
+
continue;
|
|
136
|
+
if (ev.type === 'replay') {
|
|
137
|
+
for (const l of ev.lines) {
|
|
138
|
+
if (!emit(l, ev.service)) {
|
|
139
|
+
req.destroy();
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else if (ev.type === 'line') {
|
|
145
|
+
if (!emit(ev.line, ev.service))
|
|
146
|
+
req.destroy();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
res.on('end', () => finish());
|
|
151
|
+
res.on('error', (err) => {
|
|
152
|
+
if (!done)
|
|
153
|
+
printError(`Stream error: ${err.message}`);
|
|
154
|
+
finish();
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
req.on('error', (err) => {
|
|
158
|
+
if (!done) {
|
|
159
|
+
const msg = err.code === 'ECONNREFUSED'
|
|
160
|
+
? 'Host CP is not reachable. Is it running? (`olam host-cp start`)'
|
|
161
|
+
: `Connection error: ${err.message}`;
|
|
162
|
+
printError(msg);
|
|
163
|
+
process.exitCode = 1;
|
|
164
|
+
}
|
|
165
|
+
finish();
|
|
166
|
+
});
|
|
167
|
+
// once: prevents listener accumulation in test harnesses that invoke
|
|
168
|
+
// the action handler multiple times in the same process.
|
|
169
|
+
process.once('SIGINT', () => {
|
|
170
|
+
done = true;
|
|
171
|
+
req.destroy();
|
|
172
|
+
process.exit(0);
|
|
173
|
+
});
|
|
174
|
+
await streamDone;
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam observe <world> — Stream thoughts from a world.
|
|
3
|
+
*
|
|
4
|
+
* Currently a placeholder matching the MCP server's stub.
|
|
5
|
+
* Will connect to the container's SSE /api/stream endpoint.
|
|
6
|
+
*/
|
|
7
|
+
import type { Command } from 'commander';
|
|
8
|
+
export declare function registerObserve(program: Command): void;
|
|
9
|
+
//# sourceMappingURL=observe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../../src/commands/observe.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgCtD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam observe <world> — Stream thoughts from a world.
|
|
3
|
+
*
|
|
4
|
+
* Currently a placeholder matching the MCP server's stub.
|
|
5
|
+
* Will connect to the container's SSE /api/stream endpoint.
|
|
6
|
+
*/
|
|
7
|
+
import pc from 'picocolors';
|
|
8
|
+
import { loadContext } from '../context.js';
|
|
9
|
+
import { printError } from '../output.js';
|
|
10
|
+
export function registerObserve(program) {
|
|
11
|
+
program
|
|
12
|
+
.command('observe')
|
|
13
|
+
.description('Stream thoughts from a world (coming soon)')
|
|
14
|
+
.argument('<world>', 'World ID')
|
|
15
|
+
.action(async (worldId) => {
|
|
16
|
+
const { ctx, error } = await loadContext();
|
|
17
|
+
if (!ctx) {
|
|
18
|
+
printError(error?.message ?? 'Olam is not configured. Run `olam init` first.');
|
|
19
|
+
process.exitCode = 1;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const world = ctx.worldManager.getWorld(worldId);
|
|
23
|
+
if (!world) {
|
|
24
|
+
printError(`World "${worldId}" not found. Run \`olam list\` to see worlds.`);
|
|
25
|
+
process.exitCode = 1;
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
console.log(pc.yellow('Observation is coming in a future release.'));
|
|
29
|
+
console.log(pc.dim('This will stream the world\'s reasoning in real-time.'));
|
|
30
|
+
const containerName = `olam-${worldId}-devbox`;
|
|
31
|
+
console.log(`\n${pc.dim(`For now: docker exec -it ${containerName} tmux attach -t claude-main -r`)}`);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=observe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../../src/commands/observe.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,4CAA4C,CAAC;SACzD,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QAChC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,UAAU,CAAC,KAAK,EAAE,OAAO,IAAI,gDAAgD,CAAC,CAAC;YAC/E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,UAAU,CAAC,UAAU,OAAO,+CAA+C,CAAC,CAAC;YAC7E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CACT,EAAE,CAAC,MAAM,CAAC,4CAA4C,CAAC,CACxD,CAAC;QACF,OAAO,CAAC,GAAG,CACT,EAAE,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAChE,CAAC;QAEF,MAAM,aAAa,GAAG,QAAQ,OAAO,SAAS,CAAC;QAC/C,OAAO,CAAC,GAAG,CACT,KAAK,EAAE,CAAC,GAAG,CAAC,4BAA4B,aAAa,gCAAgC,CAAC,EAAE,CACzF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam policy-check — validate PR policies against the current diff.
|
|
3
|
+
*
|
|
4
|
+
* Reads `.olam/policies/*.md` from the workspace root, diffs the current
|
|
5
|
+
* branch against origin/main (or a custom base), and exits non-zero if
|
|
6
|
+
* any error-severity policy is violated.
|
|
7
|
+
*
|
|
8
|
+
* olam policy-check check from cwd against origin/main
|
|
9
|
+
* olam policy-check --base origin/HEAD custom base ref
|
|
10
|
+
* olam policy-check --workspace <path> custom workspace root
|
|
11
|
+
*/
|
|
12
|
+
import type { Command } from 'commander';
|
|
13
|
+
export declare function registerPolicyCheck(program: Command): void;
|
|
14
|
+
//# sourceMappingURL=policy-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-check.d.ts","sourceRoot":"","sources":["../../src/commands/policy-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoC1D"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam policy-check — validate PR policies against the current diff.
|
|
3
|
+
*
|
|
4
|
+
* Reads `.olam/policies/*.md` from the workspace root, diffs the current
|
|
5
|
+
* branch against origin/main (or a custom base), and exits non-zero if
|
|
6
|
+
* any error-severity policy is violated.
|
|
7
|
+
*
|
|
8
|
+
* olam policy-check check from cwd against origin/main
|
|
9
|
+
* olam policy-check --base origin/HEAD custom base ref
|
|
10
|
+
* olam policy-check --workspace <path> custom workspace root
|
|
11
|
+
*/
|
|
12
|
+
import { execSync } from 'node:child_process';
|
|
13
|
+
import pc from 'picocolors';
|
|
14
|
+
import { loadPolicies } from '@olam/core/src/policies/loader.js';
|
|
15
|
+
import { enforcePolicies } from '@olam/core/src/policies/enforce.js';
|
|
16
|
+
function getDiff(base, cwd) {
|
|
17
|
+
// Try `base...HEAD` three-dot diff first; fall back to two-dot diff on failure.
|
|
18
|
+
for (const range of [`${base}...HEAD`, `${base}..HEAD`]) {
|
|
19
|
+
try {
|
|
20
|
+
return execSync(`git diff --name-only ${range}`, {
|
|
21
|
+
cwd,
|
|
22
|
+
encoding: 'utf8',
|
|
23
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// try next
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Last resort: just list uncommitted changes
|
|
31
|
+
try {
|
|
32
|
+
return execSync('git diff --name-only HEAD', {
|
|
33
|
+
cwd,
|
|
34
|
+
encoding: 'utf8',
|
|
35
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return '';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function registerPolicyCheck(program) {
|
|
43
|
+
program
|
|
44
|
+
.command('policy-check')
|
|
45
|
+
.description('Check .olam/policies/ against the current diff')
|
|
46
|
+
.option('--base <ref>', 'Base git ref to diff against', 'origin/main')
|
|
47
|
+
.option('--workspace <path>', 'Workspace root (defaults to cwd)')
|
|
48
|
+
.action((opts) => {
|
|
49
|
+
const workspaceRoot = opts.workspace ?? process.cwd();
|
|
50
|
+
const policies = loadPolicies(workspaceRoot);
|
|
51
|
+
if (policies.length === 0) {
|
|
52
|
+
console.log(pc.dim('policy-check: no policies found in .olam/policies/ — nothing to enforce'));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const diff = getDiff(opts.base, workspaceRoot);
|
|
56
|
+
const results = enforcePolicies(policies, diff);
|
|
57
|
+
let hasErrorFailure = false;
|
|
58
|
+
for (const result of results) {
|
|
59
|
+
if (result.passed)
|
|
60
|
+
continue;
|
|
61
|
+
if (result.severity === 'error') {
|
|
62
|
+
console.error(`${pc.red('policy error')} [${result.policyId}]`);
|
|
63
|
+
console.error(result.message);
|
|
64
|
+
hasErrorFailure = true;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.warn(`${pc.yellow('policy warn')} [${result.policyId}]`);
|
|
68
|
+
console.warn(result.message);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (hasErrorFailure) {
|
|
72
|
+
process.exitCode = 1;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=policy-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-check.js","sourceRoot":"","sources":["../../src/commands/policy-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAErE,SAAS,OAAO,CAAC,IAAY,EAAE,GAAW;IACxC,gFAAgF;IAChF,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,SAAS,EAAE,GAAG,IAAI,QAAQ,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,wBAAwB,KAAK,EAAE,EAAE;gBAC/C,GAAG;gBACH,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IACD,6CAA6C;IAC7C,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,2BAA2B,EAAE;YAC3C,GAAG;YACH,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,cAAc,EAAE,8BAA8B,EAAE,aAAa,CAAC;SACrE,MAAM,CAAC,oBAAoB,EAAE,kCAAkC,CAAC;SAChE,MAAM,CAAC,CAAC,IAA0C,EAAE,EAAE;QACrD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;QAE7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC,CAAC;YAC/F,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEhD,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM;gBAAE,SAAS;YAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;gBAChE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC9B,eAAe,GAAG,IAAI,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACjE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam pr — inspect and decide PR-gate requests opened by in-world hooks.
|
|
3
|
+
*
|
|
4
|
+
* Each running world's PreToolUse hook intercepts `gh pr create` and
|
|
5
|
+
* POSTs a gate to its own control plane. This CLI surface lets the
|
|
6
|
+
* human fan out across all running worlds, pick a gate, and approve
|
|
7
|
+
* or block it. Codex adversarial review (future) will plug in beside
|
|
8
|
+
* this as a second decision source.
|
|
9
|
+
*
|
|
10
|
+
* olam pr list list all pending gates
|
|
11
|
+
* olam pr show <id> full detail (diff, cmd)
|
|
12
|
+
* olam pr approve <id> [--reason <r>] let the PR proceed
|
|
13
|
+
* olam pr reject <id> [--reason <r>] block with a reason
|
|
14
|
+
*/
|
|
15
|
+
import type { Command } from 'commander';
|
|
16
|
+
export declare function registerPr(program: Command): void;
|
|
17
|
+
//# sourceMappingURL=pr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2EzC,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6EjD"}
|