@keel_flow/cli 0.2.0

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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +170 -0
  3. package/dist/build.d.ts +57 -0
  4. package/dist/build.d.ts.map +1 -0
  5. package/dist/build.js +350 -0
  6. package/dist/build.js.map +1 -0
  7. package/dist/claude-auth.d.ts +16 -0
  8. package/dist/claude-auth.d.ts.map +1 -0
  9. package/dist/claude-auth.js +75 -0
  10. package/dist/claude-auth.js.map +1 -0
  11. package/dist/doctor.d.ts +18 -0
  12. package/dist/doctor.d.ts.map +1 -0
  13. package/dist/doctor.js +547 -0
  14. package/dist/doctor.js.map +1 -0
  15. package/dist/git.d.ts +4 -0
  16. package/dist/git.d.ts.map +1 -0
  17. package/dist/git.js +138 -0
  18. package/dist/git.js.map +1 -0
  19. package/dist/goals.d.ts +34 -0
  20. package/dist/goals.d.ts.map +1 -0
  21. package/dist/goals.js +218 -0
  22. package/dist/goals.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +1015 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/kb-reindex.d.ts +31 -0
  28. package/dist/kb-reindex.d.ts.map +1 -0
  29. package/dist/kb-reindex.js +71 -0
  30. package/dist/kb-reindex.js.map +1 -0
  31. package/dist/keys.d.ts +26 -0
  32. package/dist/keys.d.ts.map +1 -0
  33. package/dist/keys.js +209 -0
  34. package/dist/keys.js.map +1 -0
  35. package/dist/learn.d.ts +37 -0
  36. package/dist/learn.d.ts.map +1 -0
  37. package/dist/learn.js +274 -0
  38. package/dist/learn.js.map +1 -0
  39. package/dist/lifecycle.d.ts +27 -0
  40. package/dist/lifecycle.d.ts.map +1 -0
  41. package/dist/lifecycle.js +193 -0
  42. package/dist/lifecycle.js.map +1 -0
  43. package/dist/load-ts.d.ts +2 -0
  44. package/dist/load-ts.d.ts.map +1 -0
  45. package/dist/load-ts.js +20 -0
  46. package/dist/load-ts.js.map +1 -0
  47. package/dist/map-repo.d.ts +15 -0
  48. package/dist/map-repo.d.ts.map +1 -0
  49. package/dist/map-repo.js +36 -0
  50. package/dist/map-repo.js.map +1 -0
  51. package/dist/memory.d.ts +23 -0
  52. package/dist/memory.d.ts.map +1 -0
  53. package/dist/memory.js +84 -0
  54. package/dist/memory.js.map +1 -0
  55. package/dist/orchestrate.d.ts +61 -0
  56. package/dist/orchestrate.d.ts.map +1 -0
  57. package/dist/orchestrate.js +556 -0
  58. package/dist/orchestrate.js.map +1 -0
  59. package/dist/reflect.d.ts +12 -0
  60. package/dist/reflect.d.ts.map +1 -0
  61. package/dist/reflect.js +67 -0
  62. package/dist/reflect.js.map +1 -0
  63. package/dist/report.d.ts +3 -0
  64. package/dist/report.d.ts.map +1 -0
  65. package/dist/report.js +56 -0
  66. package/dist/report.js.map +1 -0
  67. package/dist/rules.d.ts +16 -0
  68. package/dist/rules.d.ts.map +1 -0
  69. package/dist/rules.js +65 -0
  70. package/dist/rules.js.map +1 -0
  71. package/dist/telemetry-helper.d.ts +12 -0
  72. package/dist/telemetry-helper.d.ts.map +1 -0
  73. package/dist/telemetry-helper.js +40 -0
  74. package/dist/telemetry-helper.js.map +1 -0
  75. package/dist/up.d.ts +97 -0
  76. package/dist/up.d.ts.map +1 -0
  77. package/dist/up.js +656 -0
  78. package/dist/up.js.map +1 -0
  79. package/package.json +58 -0
package/dist/learn.js ADDED
@@ -0,0 +1,274 @@
1
+ import { promises as fs } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import pc from "picocolors";
4
+ import { applyAccepted, loadByStatus, loadPending, loadEmerging, markStatus, proposalToDiff, } from "@keel_flow/learn";
5
+ import { createCliEmitter } from "./telemetry-helper.js";
6
+ import { resolveProviderConfig } from "./orchestrate.js";
7
+ async function defaultProviders() {
8
+ const mod = await import("@inquirer/prompts");
9
+ return {
10
+ select: (opts) => mod.select(opts),
11
+ };
12
+ }
13
+ function severityBadge(s) {
14
+ if (s === "high")
15
+ return pc.red(`[${s}]`);
16
+ if (s === "medium")
17
+ return pc.yellow(`[${s}]`);
18
+ return pc.dim(`[${s}]`);
19
+ }
20
+ function printRecordHeader(rec, idx, total) {
21
+ process.stdout.write(`\n${pc.bold(`Proposal ${idx + 1} of ${total}`)} ` +
22
+ `${pc.cyan(rec.proposal.id.slice(0, 12))} ` +
23
+ `${severityBadge(rec.proposal.severity)} ` +
24
+ `${pc.dim(`target=${rec.proposal.target}`)}\n` +
25
+ ` ${pc.bold(rec.suggestion.title)}\n` +
26
+ ` ${pc.dim("rationale:")} ${rec.suggestion.rationale}\n` +
27
+ ` ${pc.dim("change:")} ${rec.suggestion.change}\n` +
28
+ ` ${pc.dim("from:")} ${rec.reflectionPath}\n`);
29
+ }
30
+ export async function runLearn(opts, overrides = {}) {
31
+ const cwd = resolve(opts.cwd);
32
+ const pending = await loadPending({ cwd });
33
+ if (pending.length === 0) {
34
+ process.stdout.write(pc.dim("(no pending proposals)\n"));
35
+ return;
36
+ }
37
+ const providers = overrides.providers ?? (await defaultProviders());
38
+ const providerKindRaw = (opts.provider ?? process.env["KEEL_PROVIDER_KIND"] ?? "anthropic");
39
+ if (providerKindRaw !== "anthropic" && providerKindRaw !== "openai-compatible" && providerKindRaw !== "claude-bridge") {
40
+ throw new Error(`Unknown --provider kind: ${providerKindRaw}`);
41
+ }
42
+ const resolved = await resolveProviderConfig({
43
+ providerKind: providerKindRaw,
44
+ ...(opts.model ? { model: opts.model } : {}),
45
+ });
46
+ const { emitter, sessionId } = createCliEmitter({ command: "learn", cwd });
47
+ emitter?.emit({
48
+ sessionId,
49
+ parentEventId: null,
50
+ workspaceId: null,
51
+ triggeredBy: { kind: "user" },
52
+ kind: "session.start",
53
+ payload: { command: "learn", pendingCount: pending.length },
54
+ });
55
+ try {
56
+ for (let i = 0; i < pending.length; i += 1) {
57
+ const rec = pending[i];
58
+ emitter?.emit({
59
+ sessionId,
60
+ parentEventId: null,
61
+ workspaceId: null,
62
+ triggeredBy: { kind: "user" },
63
+ kind: "learn.proposal-loaded",
64
+ payload: { proposalId: rec.proposal.id, target: rec.proposal.target },
65
+ });
66
+ printRecordHeader(rec, i, pending.length);
67
+ let cachedDiff = null;
68
+ let next = "next";
69
+ while (true) {
70
+ const choice = await providers.select({
71
+ message: "Action?",
72
+ choices: [
73
+ { name: "accept (generate diff, branch, verify)", value: "accept" },
74
+ { name: "reject", value: "reject" },
75
+ { name: "defer", value: "defer" },
76
+ { name: "view full diff", value: "view" },
77
+ { name: "skip (leave pending)", value: "skip" },
78
+ { name: "quit", value: "quit" },
79
+ ],
80
+ });
81
+ if (choice === "quit") {
82
+ next = "stop";
83
+ break;
84
+ }
85
+ if (choice === "skip") {
86
+ break;
87
+ }
88
+ if (choice === "view") {
89
+ const diff = cachedDiff ??
90
+ (await (overrides.diffFn ?? proposalToDiff)({
91
+ proposal: rec.proposal,
92
+ suggestion: rec.suggestion,
93
+ cwd,
94
+ provider: resolved.provider,
95
+ ...(opts.model ? { model: opts.model } : {}),
96
+ }));
97
+ cachedDiff = diff;
98
+ process.stdout.write(`\n${pc.bold("--- proposed diff ---")}\n${diff.diff}\n${pc.bold("---")}\n\n`);
99
+ continue;
100
+ }
101
+ if (choice === "reject") {
102
+ await markStatus(rec.proposal.id, "rejected", cwd);
103
+ emitter?.emit({
104
+ sessionId,
105
+ parentEventId: null,
106
+ workspaceId: null,
107
+ triggeredBy: { kind: "user" },
108
+ kind: "learn.proposal-rejected",
109
+ payload: { proposalId: rec.proposal.id },
110
+ });
111
+ process.stdout.write(pc.dim("(rejected)\n"));
112
+ break;
113
+ }
114
+ if (choice === "defer") {
115
+ await markStatus(rec.proposal.id, "deferred", cwd);
116
+ emitter?.emit({
117
+ sessionId,
118
+ parentEventId: null,
119
+ workspaceId: null,
120
+ triggeredBy: { kind: "user" },
121
+ kind: "learn.proposal-deferred",
122
+ payload: { proposalId: rec.proposal.id },
123
+ });
124
+ process.stdout.write(pc.dim("(deferred)\n"));
125
+ break;
126
+ }
127
+ if (choice === "accept") {
128
+ const diff = cachedDiff ??
129
+ (await (overrides.diffFn ?? proposalToDiff)({
130
+ proposal: rec.proposal,
131
+ suggestion: rec.suggestion,
132
+ cwd,
133
+ provider: resolved.provider,
134
+ ...(opts.model ? { model: opts.model } : {}),
135
+ }));
136
+ cachedDiff = diff;
137
+ const result = await (overrides.applyFn ?? applyAccepted)({
138
+ proposal: rec.proposal,
139
+ diff: diff.diff,
140
+ cwd,
141
+ });
142
+ emitter?.emit({
143
+ sessionId,
144
+ parentEventId: null,
145
+ workspaceId: null,
146
+ triggeredBy: { kind: "user" },
147
+ kind: result.deferred ? "learn.proposal-deferred" : "learn.proposal-accepted",
148
+ payload: {
149
+ proposalId: rec.proposal.id,
150
+ branch: result.branch,
151
+ verifyExitCode: result.verifyExitCode,
152
+ reason: result.reason ?? null,
153
+ },
154
+ });
155
+ emitter?.emit({
156
+ sessionId,
157
+ parentEventId: null,
158
+ workspaceId: null,
159
+ triggeredBy: { kind: "user" },
160
+ kind: "learn.applied",
161
+ payload: {
162
+ proposalId: rec.proposal.id,
163
+ branch: result.branch,
164
+ applied: result.applied,
165
+ verifyExitCode: result.verifyExitCode,
166
+ },
167
+ });
168
+ if (result.deferred) {
169
+ process.stdout.write(pc.yellow(`(deferred: ${result.reason ?? "see status log"})\n`));
170
+ }
171
+ else {
172
+ process.stdout.write(pc.green(`(accepted; branch=${result.branch} verify=${String(result.verifyExitCode)})\n`));
173
+ }
174
+ break;
175
+ }
176
+ }
177
+ if (next === "stop")
178
+ break;
179
+ }
180
+ }
181
+ finally {
182
+ emitter?.emit({
183
+ sessionId,
184
+ parentEventId: null,
185
+ workspaceId: null,
186
+ triggeredBy: { kind: "user" },
187
+ kind: "session.end",
188
+ payload: { command: "learn" },
189
+ });
190
+ if (emitter)
191
+ await emitter.close();
192
+ }
193
+ }
194
+ export async function runLearnList(opts) {
195
+ const cwd = resolve(opts.cwd);
196
+ const status = opts.status ?? "pending";
197
+ // For the pending queue, apply the recurrence/severity gate (the review
198
+ // queue shows promoted lessons only) and surface the held "emerging" set
199
+ // below it so nothing is hidden. Other statuses list as before.
200
+ if (status === "pending") {
201
+ const promoted = await loadPending({ cwd });
202
+ const emerging = await loadEmerging({ cwd });
203
+ if (promoted.length === 0 && emerging.length === 0) {
204
+ process.stdout.write(pc.dim("(no pending proposals)\n"));
205
+ return;
206
+ }
207
+ if (promoted.length > 0) {
208
+ process.stdout.write(pc.bold("Promoted — ready for review:\n"));
209
+ for (const r of promoted) {
210
+ process.stdout.write(`${pc.cyan(r.proposal.id.slice(0, 12))} ` +
211
+ `${severityBadge(r.proposal.severity)} ` +
212
+ `${pc.dim(`target=${r.proposal.target}`)} ` +
213
+ `${r.suggestion.title}\n` +
214
+ ` ${pc.dim("from:")} ${r.reflectionPath}\n`);
215
+ }
216
+ }
217
+ if (emerging.length > 0) {
218
+ process.stdout.write(pc.dim("\nEmerging — held until they recur across a second reflection or escalate to high severity:\n"));
219
+ for (const g of emerging) {
220
+ process.stdout.write(pc.dim(` · ${g.record.suggestion.title} (target=${g.record.suggestion.target}, ${g.occurrences}×)\n`));
221
+ }
222
+ }
223
+ return;
224
+ }
225
+ const records = await loadByStatus({ cwd, status });
226
+ if (records.length === 0) {
227
+ process.stdout.write(pc.dim(`(no proposals with status=${status})\n`));
228
+ return;
229
+ }
230
+ for (const r of records) {
231
+ process.stdout.write(`${pc.cyan(r.proposal.id.slice(0, 12))} ` +
232
+ `${severityBadge(r.proposal.severity)} ` +
233
+ `${pc.dim(`target=${r.proposal.target}`)} ` +
234
+ `${r.suggestion.title}\n` +
235
+ ` ${pc.dim("from:")} ${r.reflectionPath}\n`);
236
+ }
237
+ }
238
+ export async function runLearnApply(opts, overrides = {}) {
239
+ const cwd = resolve(opts.cwd);
240
+ const pending = await loadPending({ cwd });
241
+ const rec = pending.find((r) => r.proposal.id === opts.proposalId || r.proposal.id.startsWith(opts.proposalId)) ??
242
+ (await loadByStatus({ cwd, status: "deferred" })).find((r) => r.proposal.id === opts.proposalId || r.proposal.id.startsWith(opts.proposalId));
243
+ if (!rec) {
244
+ process.stderr.write(pc.red(`No matching proposal for id=${opts.proposalId}\n`));
245
+ process.exitCode = 1;
246
+ return;
247
+ }
248
+ const providerKindRaw = (opts.provider ?? process.env["KEEL_PROVIDER_KIND"] ?? "anthropic");
249
+ if (providerKindRaw !== "anthropic" && providerKindRaw !== "openai-compatible" && providerKindRaw !== "claude-bridge") {
250
+ throw new Error(`Unknown --provider kind: ${providerKindRaw}`);
251
+ }
252
+ const resolved = await resolveProviderConfig({
253
+ providerKind: providerKindRaw,
254
+ ...(opts.model ? { model: opts.model } : {}),
255
+ });
256
+ const diff = await (overrides.diffFn ?? proposalToDiff)({
257
+ proposal: rec.proposal,
258
+ suggestion: rec.suggestion,
259
+ cwd,
260
+ provider: resolved.provider,
261
+ ...(opts.model ? { model: opts.model } : {}),
262
+ });
263
+ await fs.mkdir(resolve(cwd, ".keel", "learn"), { recursive: true });
264
+ const result = await (overrides.applyFn ?? applyAccepted)({
265
+ proposal: rec.proposal,
266
+ diff: diff.diff,
267
+ cwd,
268
+ });
269
+ process.stdout.write(`branch=${result.branch} applied=${result.applied} verify=${String(result.verifyExitCode)} deferred=${result.deferred}\n`);
270
+ if (result.reason) {
271
+ process.stdout.write(pc.dim(`reason: ${result.reason}\n`));
272
+ }
273
+ }
274
+ //# sourceMappingURL=learn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learn.js","sourceRoot":"","sources":["../src/learn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface UpLock {
2
+ apiPort: number;
3
+ uiPort: number;
4
+ apiUrl: string;
5
+ uiUrl: string;
6
+ dockerContainer: string | null;
7
+ repoRoot: string;
8
+ startedAt: string;
9
+ }
10
+ export declare function keelStateDir(): string;
11
+ export declare function lockfilePath(apiPort: number): string;
12
+ export declare function writeLock(lock: UpLock): void;
13
+ export declare function readLock(apiPort: number): UpLock | null;
14
+ export declare function removeLock(apiPort: number): void;
15
+ export declare function listLocks(): UpLock[];
16
+ export declare function listenerPidsOnPort(port: number): number[];
17
+ export declare function pgidOf(pid: number): number | null;
18
+ export declare function processAlive(pid: number): boolean;
19
+ export interface StopOutcome {
20
+ killedGroups: number[];
21
+ warnings: string[];
22
+ }
23
+ export declare function stopListenersOnPorts(ports: number[], graceMs?: number, sleep?: (ms: number) => Promise<void>): Promise<StopOutcome>;
24
+ export declare function dockerContainerStatus(container: string): "running" | "exited" | "absent";
25
+ export declare function stopDockerContainer(container: string): boolean;
26
+ export declare function lockExists(apiPort: number): boolean;
27
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAID,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAG5C;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMvD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAMhD;AAED,wBAAgB,SAAS,IAAI,MAAM,EAAE,CAepC;AAKD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAazD;AAKD,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAajD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CASjD;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAKD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,SAAO,EACd,KAAK,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAiD,GACnF,OAAO,CAAC,WAAW,CAAC,CA0CtB;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAWxF;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAO9D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEnD"}
@@ -0,0 +1,193 @@
1
+ // Lifecycle substrate for `keel down` / `keel status` / `keel restart`.
2
+ //
3
+ // Design decision — kill by PORT, not by stored PID. An earlier sketch recorded
4
+ // the spawned child PIDs in a lockfile and SIGTERMed them on `down`. That is
5
+ // fragile two ways: (1) `keel up` spawns the API/UI via a `pnpm --filter ... dev`
6
+ // wrapper, so the recorded PID is the wrapper, not the `next dev`/api server it
7
+ // forks — SIGTERMing the wrapper orphans the real listener; (2) PIDs are
8
+ // recycled, so a stale lockfile can name a PID the OS has since reassigned to an
9
+ // unrelated process, and `down` would kill a stranger.
10
+ //
11
+ // Instead, `down` resolves the process actually LISTENING on keel's API/UI port
12
+ // (lsof), confirms via the /health fingerprint that the API port is really keel,
13
+ // and kills that listener's whole process GROUP (the job group `keel up` created,
14
+ // which contains the wrapper + the dev server + its compiler workers). This
15
+ // targets exactly what is bound to keel's ports, verified to be keel, with no
16
+ // reliance on a possibly-stale recorded PID.
17
+ //
18
+ // The lockfile (~/.keel/up-<apiPort>.json) is kept only as an informational index
19
+ // — it lets `status` enumerate instances and tells `down` which docker container
20
+ // to stop — and is never trusted for the kill decision.
21
+ import { execFileSync } from "node:child_process";
22
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
23
+ import { homedir } from "node:os";
24
+ import { join } from "node:path";
25
+ export function keelStateDir() {
26
+ return join(homedir(), ".keel");
27
+ }
28
+ // One lockfile per API port so multiple workspaces on different ports — a
29
+ // documented single-user-mode use case — don't clobber each other's state.
30
+ export function lockfilePath(apiPort) {
31
+ return join(keelStateDir(), `up-${apiPort}.json`);
32
+ }
33
+ export function writeLock(lock) {
34
+ mkdirSync(keelStateDir(), { recursive: true });
35
+ writeFileSync(lockfilePath(lock.apiPort), JSON.stringify(lock, null, 2), "utf8");
36
+ }
37
+ export function readLock(apiPort) {
38
+ try {
39
+ return JSON.parse(readFileSync(lockfilePath(apiPort), "utf8"));
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ export function removeLock(apiPort) {
46
+ try {
47
+ rmSync(lockfilePath(apiPort), { force: true });
48
+ }
49
+ catch {
50
+ /* best-effort */
51
+ }
52
+ }
53
+ export function listLocks() {
54
+ try {
55
+ return readdirSync(keelStateDir())
56
+ .filter((f) => /^up-\d+\.json$/.test(f))
57
+ .map((f) => {
58
+ try {
59
+ return JSON.parse(readFileSync(join(keelStateDir(), f), "utf8"));
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ })
65
+ .filter((l) => l !== null);
66
+ }
67
+ catch {
68
+ return [];
69
+ }
70
+ }
71
+ // PIDs listening on a TCP port (POSIX, via lsof). Empty on Windows or when
72
+ // nothing listens. We intentionally resolve the live listener rather than trust a
73
+ // recorded PID — see the module header.
74
+ export function listenerPidsOnPort(port) {
75
+ if (process.platform === "win32")
76
+ return [];
77
+ try {
78
+ const out = execFileSync("lsof", ["-nP", `-iTCP:${port}`, "-sTCP:LISTEN", "-t"], {
79
+ stdio: ["ignore", "pipe", "ignore"],
80
+ })
81
+ .toString()
82
+ .trim();
83
+ if (out.length === 0)
84
+ return [];
85
+ return [...new Set(out.split(/\s+/).map((s) => Number(s)).filter((n) => Number.isInteger(n) && n > 0))];
86
+ }
87
+ catch {
88
+ return [];
89
+ }
90
+ }
91
+ // The process-group id of a pid (POSIX). Killing the group (`kill -<pgid>`) reaps
92
+ // the whole `keel up` job — the pnpm wrapper, the dev server, and its workers —
93
+ // in one shot. Returns null if the pid is gone or on Windows.
94
+ export function pgidOf(pid) {
95
+ if (process.platform === "win32")
96
+ return null;
97
+ try {
98
+ const out = execFileSync("ps", ["-o", "pgid=", "-p", String(pid)], {
99
+ stdio: ["ignore", "pipe", "ignore"],
100
+ })
101
+ .toString()
102
+ .trim();
103
+ const pgid = Number(out);
104
+ return Number.isInteger(pgid) && pgid > 0 ? pgid : null;
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ }
110
+ export function processAlive(pid) {
111
+ try {
112
+ // Signal 0 doesn't deliver — it only tests existence/permission.
113
+ process.kill(pid, 0);
114
+ return true;
115
+ }
116
+ catch (err) {
117
+ // EPERM means it exists but we can't signal it; ESRCH means it's gone.
118
+ return err.code === "EPERM";
119
+ }
120
+ }
121
+ // Stop the keel processes bound to the given ports by killing their process
122
+ // group(s): SIGTERM, then SIGKILL after a grace period for any survivors. Returns
123
+ // the pgids actioned plus any warnings. Pure POSIX; the caller gates Windows.
124
+ export async function stopListenersOnPorts(ports, graceMs = 4000, sleep = (ms) => new Promise((r) => setTimeout(r, ms))) {
125
+ const warnings = [];
126
+ const pgids = new Set();
127
+ for (const port of ports) {
128
+ for (const pid of listenerPidsOnPort(port)) {
129
+ const pgid = pgidOf(pid);
130
+ // Fall back to the pid itself only if we couldn't resolve a group.
131
+ pgids.add(pgid ?? pid);
132
+ }
133
+ }
134
+ if (pgids.size === 0)
135
+ return { killedGroups: [], warnings };
136
+ for (const pgid of pgids) {
137
+ try {
138
+ process.kill(-pgid, "SIGTERM");
139
+ }
140
+ catch {
141
+ try {
142
+ process.kill(pgid, "SIGTERM");
143
+ }
144
+ catch {
145
+ /* already gone */
146
+ }
147
+ }
148
+ }
149
+ await sleep(graceMs);
150
+ // Escalate to SIGKILL for any group still holding a listener.
151
+ for (const pgid of pgids) {
152
+ if (processAlive(pgid)) {
153
+ try {
154
+ process.kill(-pgid, "SIGKILL");
155
+ }
156
+ catch {
157
+ try {
158
+ process.kill(pgid, "SIGKILL");
159
+ }
160
+ catch {
161
+ /* gone between checks */
162
+ }
163
+ }
164
+ }
165
+ }
166
+ return { killedGroups: [...pgids], warnings };
167
+ }
168
+ export function dockerContainerStatus(container) {
169
+ try {
170
+ const out = execFileSync("docker", ["inspect", "--format", "{{.State.Status}}", container], {
171
+ stdio: ["ignore", "pipe", "ignore"],
172
+ })
173
+ .toString()
174
+ .trim();
175
+ return out === "running" ? "running" : "exited";
176
+ }
177
+ catch {
178
+ return "absent";
179
+ }
180
+ }
181
+ export function stopDockerContainer(container) {
182
+ try {
183
+ execFileSync("docker", ["stop", container], { stdio: ["ignore", "pipe", "ignore"] });
184
+ return true;
185
+ }
186
+ catch {
187
+ return false;
188
+ }
189
+ }
190
+ export function lockExists(apiPort) {
191
+ return existsSync(lockfilePath(apiPort));
192
+ }
193
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function importTsConfig(url: string): Promise<Record<string, unknown>>;
2
+ //# sourceMappingURL=load-ts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-ts.d.ts","sourceRoot":"","sources":["../src/load-ts.ts"],"names":[],"mappings":"AAgBA,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAGlF"}
@@ -0,0 +1,20 @@
1
+ let registered = false;
2
+ // architecture/data.ts and principles/index.ts are authored as TypeScript and
3
+ // imported at runtime. Node 22.6+/24 strip types natively, but the supported
4
+ // runtime floor is Node 20 (see CLAUDE.md), which throws ERR_UNKNOWN_FILE_EXTENSION
5
+ // on a bare `import()` of a .ts file. Registering the tsx ESM loader once, lazily,
6
+ // makes those imports work on every supported Node without changing how callers
7
+ // invoke the CLI. The register is idempotent and harmless on runtimes that already
8
+ // strip types.
9
+ async function ensureTsLoader() {
10
+ if (registered)
11
+ return;
12
+ registered = true;
13
+ const { register } = await import("tsx/esm/api");
14
+ register();
15
+ }
16
+ export async function importTsConfig(url) {
17
+ await ensureTsLoader();
18
+ return (await import(url));
19
+ }
20
+ //# sourceMappingURL=load-ts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-ts.js","sourceRoot":"","sources":["../src/load-ts.ts"],"names":[],"mappings":"AAAA,IAAI,UAAU,GAAG,KAAK,CAAC;AAEvB,8EAA8E;AAC9E,6EAA6E;AAC7E,oFAAoF;AACpF,mFAAmF;AACnF,gFAAgF;AAChF,mFAAmF;AACnF,eAAe;AACf,KAAK,UAAU,cAAc;IAC3B,IAAI,UAAU;QAAE,OAAO;IACvB,UAAU,GAAG,IAAI,CAAC;IAClB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACjD,QAAQ,EAAE,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,MAAM,cAAc,EAAE,CAAC;IACvB,OAAO,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAA4B,CAAC;AACxD,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type RepoMap } from "@keel_flow/repo-map";
2
+ export interface RunMapRepoArgs {
3
+ cwd: string;
4
+ noCache?: boolean;
5
+ output?: string;
6
+ json?: boolean;
7
+ maxTokens?: number;
8
+ }
9
+ export interface MapRepoResult {
10
+ map: RepoMap;
11
+ cacheHit: boolean;
12
+ ageMs: number | null;
13
+ }
14
+ export declare function runMapRepo(args: RunMapRepoArgs): Promise<MapRepoResult>;
15
+ //# sourceMappingURL=map-repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-repo.d.ts","sourceRoot":"","sources":["../src/map-repo.ts"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,OAAO,EACb,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA+B7E"}
@@ -0,0 +1,36 @@
1
+ import { writeFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { buildRepoMap, cacheAgeMs, isCacheStale, loadCache, saveCache, toMarkdown, } from "@keel_flow/repo-map";
4
+ export async function runMapRepo(args) {
5
+ const cwd = resolve(args.cwd);
6
+ let map = null;
7
+ let cacheHit = false;
8
+ if (!args.noCache) {
9
+ const cached = loadCache(cwd);
10
+ if (cached && !isCacheStale(cwd, cached.files)) {
11
+ map = cached;
12
+ cacheHit = true;
13
+ }
14
+ }
15
+ if (!map) {
16
+ map = await buildRepoMap({
17
+ cwd,
18
+ ...(args.maxTokens !== undefined ? { maxTokens: args.maxTokens } : {}),
19
+ });
20
+ if (!args.noCache)
21
+ saveCache(cwd, map);
22
+ }
23
+ const out = args.json
24
+ ? JSON.stringify(map, null, 2)
25
+ : toMarkdown(map.entries);
26
+ if (args.output) {
27
+ writeFileSync(resolve(args.output), out, "utf-8");
28
+ }
29
+ else {
30
+ process.stdout.write(out);
31
+ if (!out.endsWith("\n"))
32
+ process.stdout.write("\n");
33
+ }
34
+ return { map, cacheHit, ageMs: cacheHit ? cacheAgeMs(cwd) : 0 };
35
+ }
36
+ //# sourceMappingURL=map-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-repo.js","sourceRoot":"","sources":["../src/map-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,SAAS,EACT,SAAS,EACT,UAAU,GAEX,MAAM,qBAAqB,CAAC;AAgB7B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAoB;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,GAAG,GAAmB,IAAI,CAAC;IAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,GAAG,GAAG,MAAM,CAAC;YACb,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,MAAM,YAAY,CAAC;YACvB,GAAG;YACH,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvE,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI;QACnB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE5B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAClE,CAAC"}
@@ -0,0 +1,23 @@
1
+ export interface MemoryListOptions {
2
+ cwd: string;
3
+ global?: boolean;
4
+ }
5
+ export declare function runMemoryList(opts: MemoryListOptions): Promise<void>;
6
+ export interface MemoryAddOptions {
7
+ cwd: string;
8
+ global?: boolean;
9
+ fact: string;
10
+ }
11
+ export declare function runMemoryAdd(opts: MemoryAddOptions): Promise<void>;
12
+ export interface MemoryShowOptions {
13
+ cwd: string;
14
+ global?: boolean;
15
+ pattern: string;
16
+ }
17
+ export declare function runMemoryShow(opts: MemoryShowOptions): Promise<void>;
18
+ export interface MemoryRemoveOptions {
19
+ cwd: string;
20
+ id: string;
21
+ }
22
+ export declare function runMemoryRemove(opts: MemoryRemoveOptions): Promise<void>;
23
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAMD,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAc1E;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBxE;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAc1E;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC9E"}