@neonwatty/limner 0.1.3 → 0.1.5

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 (57) hide show
  1. package/README.md +35 -0
  2. package/dist/cli.js +4 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/ledger.d.ts +43 -0
  5. package/dist/commands/ledger.js +93 -0
  6. package/dist/commands/ledger.js.map +1 -0
  7. package/dist/commands/loop-cli.d.ts +2 -0
  8. package/dist/commands/loop-cli.js +71 -0
  9. package/dist/commands/loop-cli.js.map +1 -0
  10. package/dist/commands/loop-comparison-adapters.d.ts +17 -0
  11. package/dist/commands/loop-comparison-adapters.js +85 -0
  12. package/dist/commands/loop-comparison-adapters.js.map +1 -0
  13. package/dist/commands/loop.d.ts +41 -0
  14. package/dist/commands/loop.js +151 -0
  15. package/dist/commands/loop.js.map +1 -0
  16. package/dist/core/agent-comparison-pack.d.ts +1 -1
  17. package/dist/core/agent-comparison-profiles.d.ts +1 -1
  18. package/dist/core/agent-comparison-profiles.js +11 -2
  19. package/dist/core/agent-comparison-profiles.js.map +1 -1
  20. package/dist/core/ledger-db.d.ts +6 -0
  21. package/dist/core/ledger-db.js +106 -0
  22. package/dist/core/ledger-db.js.map +1 -0
  23. package/dist/core/ledger-events.d.ts +3 -0
  24. package/dist/core/ledger-events.js +23 -0
  25. package/dist/core/ledger-events.js.map +1 -0
  26. package/dist/core/ledger-ids.d.ts +3 -0
  27. package/dist/core/ledger-ids.js +12 -0
  28. package/dist/core/ledger-ids.js.map +1 -0
  29. package/dist/core/ledger-markdown.d.ts +31 -0
  30. package/dist/core/ledger-markdown.js +46 -0
  31. package/dist/core/ledger-markdown.js.map +1 -0
  32. package/dist/core/ledger-paths.d.ts +9 -0
  33. package/dist/core/ledger-paths.js +14 -0
  34. package/dist/core/ledger-paths.js.map +1 -0
  35. package/dist/core/ledger-queries.d.ts +13 -0
  36. package/dist/core/ledger-queries.js +47 -0
  37. package/dist/core/ledger-queries.js.map +1 -0
  38. package/dist/core/ledger-store.d.ts +64 -0
  39. package/dist/core/ledger-store.js +134 -0
  40. package/dist/core/ledger-store.js.map +1 -0
  41. package/dist/core/loop-instructions.d.ts +2 -0
  42. package/dist/core/loop-instructions.js +8 -0
  43. package/dist/core/loop-instructions.js.map +1 -0
  44. package/dist/index.d.ts +4 -0
  45. package/dist/index.js +3 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/schemas/comparison.d.ts +1 -0
  48. package/dist/schemas/comparison.js +1 -1
  49. package/dist/schemas/comparison.js.map +1 -1
  50. package/dist/schemas/ledger.d.ts +25 -0
  51. package/dist/schemas/ledger.js +7 -0
  52. package/dist/schemas/ledger.js.map +1 -0
  53. package/docs/agent-workflow.md +18 -0
  54. package/docs/superpowers/plans/2026-06-12-global-loop-ledger.md +160 -0
  55. package/docs/superpowers/specs/2026-06-12-global-loop-ledger-design.md +254 -0
  56. package/package.json +3 -1
  57. package/skills/limner/SKILL.md +16 -0
@@ -8,12 +8,21 @@ export function getAgentComparisonProfile(name) {
8
8
  instruction: 'Focus on changes to the HTML/CSS mockup that will make the next screenshot closer to the ideal.',
9
9
  };
10
10
  }
11
+ if (name === 'mockup-to-implementation') {
12
+ return {
13
+ name,
14
+ expectedRole: 'approved HTML mockup screenshot',
15
+ actualRole: 'implementation screenshot',
16
+ editableSurface: 'implementation',
17
+ instruction: 'Treat the mockup as canonical and focus on implementation changes that will match it.',
18
+ };
19
+ }
11
20
  return {
12
21
  name,
13
- expectedRole: 'approved HTML mockup screenshot',
22
+ expectedRole: 'ideal image',
14
23
  actualRole: 'implementation screenshot',
15
24
  editableSurface: 'implementation',
16
- instruction: 'Treat the mockup as canonical and focus on implementation changes that will match it.',
25
+ instruction: 'Treat the source image as canonical and focus on implementation changes that will match it without an approved mockup bridge.',
17
26
  };
18
27
  }
19
28
  //# sourceMappingURL=agent-comparison-profiles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-comparison-profiles.js","sourceRoot":"","sources":["../../src/core/agent-comparison-profiles.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,yBAAyB,CAAC,IAAgC;IACxE,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI;YACJ,YAAY,EAAE,aAAa;YAC3B,UAAU,EAAE,wBAAwB;YACpC,eAAe,EAAE,QAAQ;YACzB,WAAW,EAAE,iGAAiG;SAC/G,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI;QACJ,YAAY,EAAE,iCAAiC;QAC/C,UAAU,EAAE,2BAA2B;QACvC,eAAe,EAAE,gBAAgB;QACjC,WAAW,EAAE,uFAAuF;KACrG,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"agent-comparison-profiles.js","sourceRoot":"","sources":["../../src/core/agent-comparison-profiles.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,yBAAyB,CAAC,IAAgC;IACxE,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI;YACJ,YAAY,EAAE,aAAa;YAC3B,UAAU,EAAE,wBAAwB;YACpC,eAAe,EAAE,QAAQ;YACzB,WAAW,EAAE,iGAAiG;SAC/G,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,KAAK,0BAA0B,EAAE,CAAC;QACxC,OAAO;YACL,IAAI;YACJ,YAAY,EAAE,iCAAiC;YAC/C,UAAU,EAAE,2BAA2B;YACvC,eAAe,EAAE,gBAAgB;YACjC,WAAW,EAAE,uFAAuF;SACrG,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI;QACJ,YAAY,EAAE,aAAa;QAC3B,UAAU,EAAE,2BAA2B;QACvC,eAAe,EAAE,gBAAgB;QACjC,WAAW,EAAE,+HAA+H;KAC7I,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import Database from 'better-sqlite3';
2
+ export type LedgerDatabaseInput = {
3
+ databasePath: string;
4
+ };
5
+ export type LedgerDatabase = Database.Database;
6
+ export declare function openLedgerDatabase(input: LedgerDatabaseInput): LedgerDatabase;
@@ -0,0 +1,106 @@
1
+ import Database from 'better-sqlite3';
2
+ import { mkdirSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ const schemaVersion = 1;
5
+ export function openLedgerDatabase(input) {
6
+ mkdirSync(path.dirname(input.databasePath), { recursive: true });
7
+ const db = new Database(input.databasePath);
8
+ db.pragma('foreign_keys = ON');
9
+ migrate(db);
10
+ return db;
11
+ }
12
+ function migrate(db) {
13
+ db.exec(`
14
+ create table if not exists schema_meta (
15
+ key text primary key,
16
+ value text not null
17
+ );
18
+
19
+ create table if not exists trajectories (
20
+ trajectory_id text primary key,
21
+ human_id text not null,
22
+ mode text not null,
23
+ project_root text not null,
24
+ workspace_root text not null,
25
+ target text not null,
26
+ status text not null,
27
+ max_iterations integer,
28
+ active_iteration_id text,
29
+ context_json text not null,
30
+ instructions_json text not null,
31
+ created_at text not null,
32
+ updated_at text not null
33
+ );
34
+
35
+ create table if not exists iterations (
36
+ iteration_id text not null,
37
+ trajectory_id text not null references trajectories(trajectory_id) on delete cascade,
38
+ sequence integer not null,
39
+ focus text,
40
+ status text not null,
41
+ instructions_json text not null,
42
+ created_at text not null,
43
+ closed_at text,
44
+ primary key (trajectory_id, iteration_id)
45
+ );
46
+
47
+ create table if not exists runs (
48
+ run_id text primary key,
49
+ trajectory_id text not null references trajectories(trajectory_id) on delete cascade,
50
+ iteration_id text not null,
51
+ command text not null,
52
+ status text not null,
53
+ started_at text not null,
54
+ completed_at text
55
+ );
56
+
57
+ create table if not exists artifacts (
58
+ artifact_id text primary key,
59
+ trajectory_id text not null references trajectories(trajectory_id) on delete cascade,
60
+ iteration_id text,
61
+ run_id text,
62
+ kind text not null,
63
+ path text not null,
64
+ hash text,
65
+ snapshot_path text,
66
+ created_at text not null
67
+ );
68
+
69
+ create table if not exists instruction_versions (
70
+ version_id text primary key,
71
+ trajectory_id text not null references trajectories(trajectory_id) on delete cascade,
72
+ iteration_id text,
73
+ instructions_json text not null,
74
+ created_at text not null
75
+ );
76
+
77
+ create table if not exists notes (
78
+ note_id text primary key,
79
+ trajectory_id text not null references trajectories(trajectory_id) on delete cascade,
80
+ iteration_id text,
81
+ body text not null,
82
+ created_at text not null
83
+ );
84
+
85
+ create table if not exists ledger_events (
86
+ event_id text primary key,
87
+ trajectory_id text,
88
+ iteration_id text,
89
+ run_id text,
90
+ event_type text not null,
91
+ actor text not null,
92
+ command text,
93
+ inputs_summary text,
94
+ result_status text,
95
+ artifact_refs_json text not null,
96
+ agent_feedback text,
97
+ notes text,
98
+ created_at text not null
99
+ );
100
+
101
+ insert into schema_meta (key, value)
102
+ values ('schemaVersion', '${schemaVersion}')
103
+ on conflict(key) do update set value = excluded.value;
104
+ `);
105
+ }
106
+ //# sourceMappingURL=ledger-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-db.js","sourceRoot":"","sources":["../../src/core/ledger-db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,aAAa,GAAG,CAAC,CAAC;AAQxB,MAAM,UAAU,kBAAkB,CAAC,KAA0B;IAC3D,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5C,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,EAAkB;IACjC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAyFsB,aAAa;;GAE1C,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LedgerDatabase } from './ledger-db.js';
2
+ import type { AppendEventInput } from './ledger-store.js';
3
+ export declare function insertLedgerEvent(db: LedgerDatabase, input: AppendEventInput, now: string): void;
@@ -0,0 +1,23 @@
1
+ import { agentFeedbackSchema } from '../schemas/ledger.js';
2
+ import { createLedgerId } from './ledger-ids.js';
3
+ export function insertLedgerEvent(db, input, now) {
4
+ const feedback = agentFeedbackSchema.parse(input.agentFeedback);
5
+ db.prepare(`
6
+ insert into ledger_events (
7
+ event_id, trajectory_id, iteration_id, run_id, event_type, actor, command,
8
+ inputs_summary, result_status, artifact_refs_json, agent_feedback, notes, created_at
9
+ ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
10
+ `).run(createLedgerId('evt'), input.trajectoryId ?? null, input.iterationId ?? null, input.runId ?? null, input.eventType, input.actor ?? 'cli', input.command ?? null, input.inputsSummary ?? null, input.resultStatus ?? null, JSON.stringify(input.artifactRefs ?? []), feedback ?? null, input.notes ?? null, now);
11
+ if (input.trajectoryId) {
12
+ for (const artifactPath of input.artifactRefs ?? []) {
13
+ if (typeof artifactPath !== 'string')
14
+ continue;
15
+ db.prepare(`
16
+ insert into artifacts (
17
+ artifact_id, trajectory_id, iteration_id, run_id, kind, path, hash, snapshot_path, created_at
18
+ ) values (?, ?, ?, ?, 'event-artifact', ?, null, null, ?)
19
+ `).run(createLedgerId('art'), input.trajectoryId, input.iterationId ?? null, input.runId ?? null, artifactPath, now);
20
+ }
21
+ }
22
+ }
23
+ //# sourceMappingURL=ledger-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-events.js","sourceRoot":"","sources":["../../src/core/ledger-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,UAAU,iBAAiB,CAAC,EAAkB,EAAE,KAAuB,EAAE,GAAW;IACxF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAChE,EAAE,CAAC,OAAO,CAAC;;;;;GAKV,CAAC,CAAC,GAAG,CACJ,cAAc,CAAC,KAAK,CAAC,EACrB,KAAK,CAAC,YAAY,IAAI,IAAI,EAC1B,KAAK,CAAC,WAAW,IAAI,IAAI,EACzB,KAAK,CAAC,KAAK,IAAI,IAAI,EACnB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,KAAK,IAAI,KAAK,EACpB,KAAK,CAAC,OAAO,IAAI,IAAI,EACrB,KAAK,CAAC,aAAa,IAAI,IAAI,EAC3B,KAAK,CAAC,YAAY,IAAI,IAAI,EAC1B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,EACxC,QAAQ,IAAI,IAAI,EAChB,KAAK,CAAC,KAAK,IAAI,IAAI,EACnB,GAAG,CACJ,CAAC;IACF,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,KAAK,MAAM,YAAY,IAAI,KAAK,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;YACpD,IAAI,OAAO,YAAY,KAAK,QAAQ;gBAAE,SAAS;YAC/C,EAAE,CAAC,OAAO,CAAC;;;;OAIV,CAAC,CAAC,GAAG,CACJ,cAAc,CAAC,KAAK,CAAC,EACrB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,WAAW,IAAI,IAAI,EACzB,KAAK,CAAC,KAAK,IAAI,IAAI,EACnB,YAAY,EACZ,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { StartTrajectoryInput } from './ledger-store.js';
2
+ export declare function createTrajectoryId(input: StartTrajectoryInput): string;
3
+ export declare function createLedgerId(prefix: string): string;
@@ -0,0 +1,12 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ export function createTrajectoryId(input) {
3
+ const hash = createHash('sha256')
4
+ .update([input.projectRoot, input.workspaceRoot, input.target, input.mode, input.name, new Date().toISOString(), randomUUID()].join('\0'))
5
+ .digest('hex')
6
+ .slice(0, 16);
7
+ return `traj_${hash}`;
8
+ }
9
+ export function createLedgerId(prefix) {
10
+ return `${prefix}_${randomUUID().replace(/-/g, '').slice(0, 16)}`;
11
+ }
12
+ //# sourceMappingURL=ledger-ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-ids.js","sourceRoot":"","sources":["../../src/core/ledger-ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIrD,MAAM,UAAU,kBAAkB,CAAC,KAA2B;IAC5D,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC;SAC9B,MAAM,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACzI,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,OAAO,QAAQ,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACpE,CAAC"}
@@ -0,0 +1,31 @@
1
+ type ExportedTrajectory = {
2
+ trajectory: {
3
+ trajectoryId: string;
4
+ humanId: string;
5
+ mode: string;
6
+ status: string;
7
+ target?: string;
8
+ };
9
+ iterations: Array<{
10
+ iterationId?: string;
11
+ sequence?: number;
12
+ status?: string;
13
+ }>;
14
+ events: Array<{
15
+ eventType: string;
16
+ actor?: string;
17
+ command?: string;
18
+ resultStatus?: string;
19
+ artifactRefsJson?: string;
20
+ agentFeedback?: string;
21
+ notes?: string;
22
+ createdAt?: string;
23
+ }>;
24
+ artifacts: Array<{
25
+ kind: string;
26
+ path: string;
27
+ snapshotPath?: string | null;
28
+ }>;
29
+ };
30
+ export declare function formatLedgerMarkdown(exported: ExportedTrajectory): string;
31
+ export {};
@@ -0,0 +1,46 @@
1
+ export function formatLedgerMarkdown(exported) {
2
+ const lines = [
3
+ '# Limner Trajectory',
4
+ '',
5
+ `Trajectory: ${exported.trajectory.trajectoryId}`,
6
+ `Name: ${exported.trajectory.humanId}`,
7
+ `Mode: ${exported.trajectory.mode}`,
8
+ `Target: ${exported.trajectory.target ?? 'unknown'}`,
9
+ `Status: ${exported.trajectory.status}`,
10
+ `Iterations: ${exported.iterations.length}`,
11
+ `Events: ${exported.events.length}`,
12
+ `Artifacts: ${exported.artifacts.length}`,
13
+ '',
14
+ '## Timeline',
15
+ '',
16
+ ...exported.events.flatMap(formatEvent),
17
+ '## Artifacts',
18
+ '',
19
+ ...(exported.artifacts.length > 0 ? exported.artifacts.map((artifact) => `- ${artifact.kind}: ${artifact.path}`) : ['- None recorded']),
20
+ '',
21
+ ];
22
+ return lines.join('\n');
23
+ }
24
+ function formatEvent(event) {
25
+ const refs = parseRefs(event.artifactRefsJson);
26
+ return [
27
+ `- ${event.createdAt ?? 'unknown'} ${event.eventType} (${event.resultStatus ?? 'unknown'})`,
28
+ ` - actor: ${event.actor ?? 'unknown'}`,
29
+ ` - command: ${event.command ?? 'unknown'}`,
30
+ ...(event.agentFeedback ? [` - feedback: ${event.agentFeedback}`] : []),
31
+ ...(event.notes ? [` - notes: ${event.notes}`] : []),
32
+ ...refs.map((ref) => ` - artifact: ${ref}`),
33
+ ];
34
+ }
35
+ function parseRefs(raw) {
36
+ if (!raw)
37
+ return [];
38
+ try {
39
+ const parsed = JSON.parse(raw);
40
+ return Array.isArray(parsed) ? parsed.filter((value) => typeof value === 'string') : [];
41
+ }
42
+ catch {
43
+ return [];
44
+ }
45
+ }
46
+ //# sourceMappingURL=ledger-markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-markdown.js","sourceRoot":"","sources":["../../src/core/ledger-markdown.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,oBAAoB,CAAC,QAA4B;IAC/D,MAAM,KAAK,GAAG;QACZ,qBAAqB;QACrB,EAAE;QACF,eAAe,QAAQ,CAAC,UAAU,CAAC,YAAY,EAAE;QACjD,SAAS,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE;QACtC,SAAS,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE;QACnC,WAAW,QAAQ,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS,EAAE;QACpD,WAAW,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE;QACvC,eAAe,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE;QAC3C,WAAW,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QACnC,cAAc,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE;QACzC,EAAE;QACF,aAAa;QACb,EAAE;QACF,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACvC,cAAc;QACd,EAAE;QACF,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACvI,EAAE;KACH,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,WAAW,CAAC,KAA2C;IAC9D,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC/C,OAAO;QACL,KAAK,KAAK,CAAC,SAAS,IAAI,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,YAAY,IAAI,SAAS,GAAG;QAC3F,cAAc,KAAK,CAAC,KAAK,IAAI,SAAS,EAAE;QACxC,gBAAgB,KAAK,CAAC,OAAO,IAAI,SAAS,EAAE;QAC5C,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,iBAAiB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,GAAG,EAAE,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,GAAuB;IACxC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3G,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type LedgerPaths = {
2
+ homeDir: string;
3
+ databasePath: string;
4
+ snapshotsDir: string;
5
+ };
6
+ type LedgerPathEnv = Partial<Pick<NodeJS.ProcessEnv, 'LIMNER_LEDGER_HOME'>>;
7
+ export declare function resolveLedgerHome(env?: LedgerPathEnv): string;
8
+ export declare function resolveLedgerPaths(env?: LedgerPathEnv): LedgerPaths;
9
+ export {};
@@ -0,0 +1,14 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ export function resolveLedgerHome(env = process.env) {
4
+ return path.resolve(env.LIMNER_LEDGER_HOME ?? path.join(os.homedir(), '.limner'));
5
+ }
6
+ export function resolveLedgerPaths(env = process.env) {
7
+ const homeDir = resolveLedgerHome(env);
8
+ return {
9
+ homeDir,
10
+ databasePath: path.join(homeDir, 'ledger.sqlite'),
11
+ snapshotsDir: path.join(homeDir, 'snapshots'),
12
+ };
13
+ }
14
+ //# sourceMappingURL=ledger-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-paths.js","sourceRoot":"","sources":["../../src/core/ledger-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,MAAM,UAAU,iBAAiB,CAAC,MAAqB,OAAO,CAAC,GAAG;IAChE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAqB,OAAO,CAAC,GAAG;IACjE,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO;QACL,OAAO;QACP,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;QACjD,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;KAC9C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { LedgerDatabase } from './ledger-db.js';
2
+ import type { ResolveTrajectoryInput, TrajectorySummary } from './ledger-store.js';
3
+ export declare function queryTrajectories(db: LedgerDatabase, input: ResolveTrajectoryInput): TrajectorySummary[];
4
+ export declare function getTrajectory(db: LedgerDatabase, trajectoryId: string): TrajectorySummary | undefined;
5
+ export declare function getIterations(db: LedgerDatabase, trajectoryId: string): unknown[];
6
+ export declare function exportTrajectoryRows(db: LedgerDatabase, trajectory: TrajectorySummary): {
7
+ trajectory: TrajectorySummary;
8
+ iterations: unknown[];
9
+ events: unknown[];
10
+ instructionVersions: unknown[];
11
+ notes: unknown[];
12
+ artifacts: unknown[];
13
+ };
@@ -0,0 +1,47 @@
1
+ export function queryTrajectories(db, input) {
2
+ const conditions = [];
3
+ const params = [];
4
+ for (const [column, value] of [
5
+ ['trajectory_id', input.trajectoryId],
6
+ ['target', input.target],
7
+ ['mode', input.mode],
8
+ ['project_root', input.projectRoot],
9
+ ['status', input.status ?? (input.trajectoryId ? undefined : 'active')],
10
+ ]) {
11
+ if (value) {
12
+ conditions.push(`${column} = ?`);
13
+ params.push(value);
14
+ }
15
+ }
16
+ const where = conditions.length > 0 ? `where ${conditions.join(' and ')}` : '';
17
+ return db.prepare(`select ${trajectoryColumns} from trajectories ${where} order by created_at, human_id`).all(...params);
18
+ }
19
+ export function getTrajectory(db, trajectoryId) {
20
+ return db.prepare(`select ${trajectoryColumns} from trajectories where trajectory_id = ?`).get(trajectoryId);
21
+ }
22
+ export function getIterations(db, trajectoryId) {
23
+ return db.prepare('select iteration_id as iterationId, sequence, status from iterations where trajectory_id = ? order by sequence').all(trajectoryId);
24
+ }
25
+ export function exportTrajectoryRows(db, trajectory) {
26
+ const trajectoryId = trajectory.trajectoryId;
27
+ return {
28
+ trajectory,
29
+ iterations: getIterations(db, trajectoryId),
30
+ events: db.prepare(`select event_type as eventType, actor, command, result_status as resultStatus,
31
+ artifact_refs_json as artifactRefsJson, agent_feedback as agentFeedback, notes, created_at as createdAt
32
+ from ledger_events where trajectory_id = ? order by rowid`).all(trajectoryId),
33
+ instructionVersions: db.prepare('select version_id as versionId, instructions_json as instructionsJson from instruction_versions where trajectory_id = ? order by rowid').all(trajectoryId),
34
+ notes: db.prepare('select note_id as noteId, body from notes where trajectory_id = ? order by rowid').all(trajectoryId),
35
+ artifacts: db.prepare('select artifact_id as artifactId, kind, path, hash, snapshot_path as snapshotPath from artifacts where trajectory_id = ? order by rowid').all(trajectoryId),
36
+ };
37
+ }
38
+ const trajectoryColumns = `
39
+ trajectory_id as trajectoryId,
40
+ human_id as humanId,
41
+ mode,
42
+ target,
43
+ status,
44
+ active_iteration_id as activeIterationId,
45
+ max_iterations as maxIterations
46
+ `;
47
+ //# sourceMappingURL=ledger-queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-queries.js","sourceRoot":"","sources":["../../src/core/ledger-queries.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,iBAAiB,CAAC,EAAkB,EAAE,KAA6B;IACjF,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI;QAC5B,CAAC,eAAe,EAAE,KAAK,CAAC,YAAY,CAAC;QACrC,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;QACxB,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC;QACpB,CAAC,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC;QACnC,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;KAC/D,EAAE,CAAC;QACX,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,OAAO,EAAE,CAAC,OAAO,CAAC,UAAU,iBAAiB,sBAAsB,KAAK,gCAAgC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAwB,CAAC;AAClJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAkB,EAAE,YAAoB;IACpE,OAAO,EAAE,CAAC,OAAO,CAAC,UAAU,iBAAiB,4CAA4C,CAAC,CAAC,GAAG,CAAC,YAAY,CAAkC,CAAC;AAChJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAkB,EAAE,YAAoB;IACpE,OAAO,EAAE,CAAC,OAAO,CAAC,gHAAgH,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACxJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAkB,EAAE,UAA6B;IACpF,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,CAAC;IAC7C,OAAO;QACL,UAAU;QACV,UAAU,EAAE,aAAa,CAAC,EAAE,EAAE,YAAY,CAAC;QAC3C,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC;;gEAEyC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;QAC/E,mBAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,wIAAwI,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;QAC3L,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,kFAAkF,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;QACvH,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,yIAAyI,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC;KACnL,CAAC;AACJ,CAAC;AAED,MAAM,iBAAiB,GAAG;;;;;;;;CAQzB,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { type LedgerEventActor, type LedgerMode } from '../schemas/ledger.js';
2
+ import type { LedgerDatabase } from './ledger-db.js';
3
+ export type StartTrajectoryInput = {
4
+ mode: LedgerMode;
5
+ target: string;
6
+ name: string;
7
+ projectRoot: string;
8
+ workspaceRoot: string;
9
+ maxIterations?: number;
10
+ context?: Record<string, unknown>;
11
+ instructions?: Record<string, unknown>;
12
+ };
13
+ export type TrajectorySummary = {
14
+ trajectoryId: string;
15
+ humanId: string;
16
+ mode: LedgerMode;
17
+ target: string;
18
+ status: 'active' | 'closed';
19
+ activeIterationId: string | null;
20
+ maxIterations: number | null;
21
+ };
22
+ export type AppendEventInput = {
23
+ trajectoryId?: string;
24
+ iterationId?: string;
25
+ runId?: string;
26
+ eventType: string;
27
+ actor?: LedgerEventActor;
28
+ command?: string;
29
+ inputsSummary?: string;
30
+ resultStatus?: string;
31
+ artifactRefs?: unknown[];
32
+ agentFeedback?: string;
33
+ notes?: string;
34
+ };
35
+ export type ResolveTrajectoryInput = {
36
+ trajectoryId?: string;
37
+ target?: string;
38
+ mode?: LedgerMode;
39
+ projectRoot?: string;
40
+ status?: 'active' | 'closed';
41
+ };
42
+ export declare class LedgerAmbiguityError extends Error {
43
+ readonly candidates: TrajectorySummary[];
44
+ constructor(candidates: TrajectorySummary[]);
45
+ }
46
+ export declare function createLedgerStore(db: LedgerDatabase): {
47
+ startTrajectory(input: StartTrajectoryInput): TrajectorySummary;
48
+ appendEvent(input: AppendEventInput): {
49
+ eventId: unknown;
50
+ };
51
+ resolveTrajectory(input: ResolveTrajectoryInput): TrajectorySummary;
52
+ advanceIteration(trajectoryId: string): {
53
+ iterationId: string;
54
+ };
55
+ closeTrajectory(trajectoryId: string): TrajectorySummary;
56
+ exportTrajectoryJson(trajectoryId: string): {
57
+ trajectory: TrajectorySummary;
58
+ iterations: unknown[];
59
+ events: unknown[];
60
+ instructionVersions: unknown[];
61
+ notes: unknown[];
62
+ artifacts: unknown[];
63
+ };
64
+ };
@@ -0,0 +1,134 @@
1
+ import { ledgerModeSchema } from '../schemas/ledger.js';
2
+ import { insertLedgerEvent } from './ledger-events.js';
3
+ import { createLedgerId, createTrajectoryId } from './ledger-ids.js';
4
+ import { exportTrajectoryRows, getIterations, getTrajectory, queryTrajectories } from './ledger-queries.js';
5
+ export class LedgerAmbiguityError extends Error {
6
+ candidates;
7
+ constructor(candidates) {
8
+ super(`Multiple trajectories matched: ${candidates.map((candidate) => candidate.trajectoryId).join(', ')}`);
9
+ this.candidates = candidates;
10
+ }
11
+ }
12
+ class LedgerNotFoundError extends Error {
13
+ constructor(message) {
14
+ super(message);
15
+ }
16
+ }
17
+ export function createLedgerStore(db) {
18
+ return {
19
+ startTrajectory(input) {
20
+ const mode = ledgerModeSchema.parse(input.mode);
21
+ const now = new Date().toISOString();
22
+ const trajectoryId = createTrajectoryId(input);
23
+ const iterationId = 'iter_001';
24
+ const instructions = input.instructions ?? {};
25
+ const context = input.context ?? {};
26
+ const transaction = db.transaction(() => {
27
+ db.prepare(`
28
+ insert into trajectories (
29
+ trajectory_id, human_id, mode, project_root, workspace_root, target, status,
30
+ max_iterations, active_iteration_id, context_json, instructions_json, created_at, updated_at
31
+ ) values (?, ?, ?, ?, ?, ?, 'active', ?, ?, ?, ?, ?, ?)
32
+ `).run(trajectoryId, input.name, mode, input.projectRoot, input.workspaceRoot, input.target, input.maxIterations ?? null, iterationId, json(context), json(instructions), now, now);
33
+ db.prepare(`
34
+ insert into iterations (
35
+ iteration_id, trajectory_id, sequence, focus, status, instructions_json, created_at
36
+ ) values (?, ?, 1, null, 'active', ?, ?)
37
+ `).run(iterationId, trajectoryId, json(instructions), now);
38
+ db.prepare(`
39
+ insert into instruction_versions (version_id, trajectory_id, iteration_id, instructions_json, created_at)
40
+ values (?, ?, ?, ?, ?)
41
+ `).run(createLedgerId('instr'), trajectoryId, iterationId, json(instructions), now);
42
+ insertLedgerEvent(db, {
43
+ trajectoryId,
44
+ iterationId,
45
+ eventType: 'loop.started',
46
+ actor: 'cli',
47
+ command: 'loop start',
48
+ resultStatus: 'ok',
49
+ }, now);
50
+ });
51
+ transaction();
52
+ return mustGetTrajectory(db, trajectoryId);
53
+ },
54
+ appendEvent(input) {
55
+ const now = new Date().toISOString();
56
+ insertLedgerEvent(db, input, now);
57
+ return { eventId: db.prepare('select event_id as eventId from ledger_events order by rowid desc limit 1').get() };
58
+ },
59
+ resolveTrajectory(input) {
60
+ const candidates = queryTrajectories(db, input);
61
+ if (candidates.length === 0)
62
+ throw new LedgerNotFoundError('No matching trajectory found');
63
+ if (candidates.length > 1)
64
+ throw new LedgerAmbiguityError(candidates);
65
+ return candidates[0];
66
+ },
67
+ advanceIteration(trajectoryId) {
68
+ const trajectory = mustGetTrajectory(db, trajectoryId);
69
+ const rows = getIterations(db, trajectoryId);
70
+ const nextSequence = rows.length + 1;
71
+ const nextIterationId = `iter_${String(nextSequence).padStart(3, '0')}`;
72
+ const now = new Date().toISOString();
73
+ const source = db.prepare('select instructions_json from trajectories where trajectory_id = ?').get(trajectoryId);
74
+ const transaction = db.transaction(() => {
75
+ if (trajectory.activeIterationId) {
76
+ db.prepare("update iterations set status = 'closed', closed_at = ? where trajectory_id = ? and iteration_id = ?")
77
+ .run(now, trajectoryId, trajectory.activeIterationId);
78
+ }
79
+ db.prepare(`
80
+ insert into iterations (iteration_id, trajectory_id, sequence, focus, status, instructions_json, created_at)
81
+ values (?, ?, ?, null, 'active', ?, ?)
82
+ `).run(nextIterationId, trajectoryId, nextSequence, source.instructions_json, now);
83
+ db.prepare('update trajectories set active_iteration_id = ?, updated_at = ? where trajectory_id = ?')
84
+ .run(nextIterationId, now, trajectoryId);
85
+ insertLedgerEvent(db, {
86
+ trajectoryId,
87
+ iterationId: nextIterationId,
88
+ eventType: 'loop.next.started',
89
+ actor: 'cli',
90
+ command: 'loop next',
91
+ resultStatus: 'ok',
92
+ }, now);
93
+ });
94
+ transaction();
95
+ return { iterationId: nextIterationId };
96
+ },
97
+ closeTrajectory(trajectoryId) {
98
+ const trajectory = mustGetTrajectory(db, trajectoryId);
99
+ const now = new Date().toISOString();
100
+ const transaction = db.transaction(() => {
101
+ if (trajectory.activeIterationId) {
102
+ db.prepare("update iterations set status = 'closed', closed_at = ? where trajectory_id = ? and iteration_id = ?")
103
+ .run(now, trajectoryId, trajectory.activeIterationId);
104
+ }
105
+ db.prepare("update trajectories set status = 'closed', active_iteration_id = null, updated_at = ? where trajectory_id = ?")
106
+ .run(now, trajectoryId);
107
+ insertLedgerEvent(db, {
108
+ trajectoryId,
109
+ iterationId: trajectory.activeIterationId ?? undefined,
110
+ eventType: 'loop.iteration.closed',
111
+ actor: 'cli',
112
+ command: 'loop close',
113
+ resultStatus: 'ok',
114
+ }, now);
115
+ });
116
+ transaction();
117
+ return mustGetTrajectory(db, trajectoryId);
118
+ },
119
+ exportTrajectoryJson(trajectoryId) {
120
+ const trajectory = mustGetTrajectory(db, trajectoryId);
121
+ return exportTrajectoryRows(db, trajectory);
122
+ },
123
+ };
124
+ }
125
+ function mustGetTrajectory(db, trajectoryId) {
126
+ const row = getTrajectory(db, trajectoryId);
127
+ if (!row)
128
+ throw new LedgerNotFoundError(`Trajectory not found: ${trajectoryId}`);
129
+ return row;
130
+ }
131
+ function json(value) {
132
+ return JSON.stringify(value);
133
+ }
134
+ //# sourceMappingURL=ledger-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-store.js","sourceRoot":"","sources":["../../src/core/ledger-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { LedgerMode } from '../schemas/ledger.js';
2
+ export declare function defaultLoopInstructions(mode: LedgerMode): Record<string, unknown>;
@@ -0,0 +1,8 @@
1
+ export function defaultLoopInstructions(mode) {
2
+ if (mode === 'image-mockup')
3
+ return { editableSurface: 'mockup', editInstructions: ['Edit the Limner reference mockup.'] };
4
+ if (mode === 'mockup-implementation')
5
+ return { editableSurface: 'implementation', editInstructions: ['Edit the implementation to match the approved mockup.'] };
6
+ return { editableSurface: 'implementation', editInstructions: ['Edit the implementation to match the source image.'] };
7
+ }
8
+ //# sourceMappingURL=loop-instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-instructions.js","sourceRoot":"","sources":["../../src/core/loop-instructions.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CAAC,IAAgB;IACtD,IAAI,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,mCAAmC,CAAC,EAAE,CAAC;IAC3H,IAAI,IAAI,KAAK,uBAAuB;QAAE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC,uDAAuD,CAAC,EAAE,CAAC;IAChK,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC,oDAAoD,CAAC,EAAE,CAAC;AACzH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -6,9 +6,13 @@ export { visualSpecBundleSchema, visualSpecDiffSchema, visualSpecSchema, createV
6
6
  export type { VisualSpec, VisualSpecBundle, VisualSpecDiff } from './schemas/visual-spec.js';
7
7
  export { agentComparisonBundleSchema, imageComparisonSchema, structureComparisonSchema, createAgentComparisonBundleExample, createAgentComparisonJsonSchema, } from './schemas/comparison.js';
8
8
  export type { AgentComparisonBundle, ImageComparison, StructureComparison } from './schemas/comparison.js';
9
+ export { agentFeedbackSchema, iterationStatusSchema, ledgerEventActorSchema, ledgerModeSchema, trajectoryStatusSchema, } from './schemas/ledger.js';
10
+ export type { AgentFeedback, IterationStatus, LedgerEventActor, LedgerMode, TrajectoryStatus } from './schemas/ledger.js';
9
11
  export { initTarget } from './commands/init.js';
10
12
  export { captureReference } from './commands/capture.js';
11
13
  export { compareImageReference, compareReferenceImplementation } from './commands/compare.js';
14
+ export { exportLedger, getLedgerNext, getLedgerStatus, listLedger, showLedger } from './commands/ledger.js';
15
+ export { advanceLoop, closeLoop, compareLoop, getLoopStatus, startLoop } from './commands/loop.js';
12
16
  export { createRunId, createRunLogger } from './core/run-logger.js';
13
17
  export { resolveWorkspace, validateTargetName } from './core/workspace.js';
14
18
  export { collectReferenceDomFacts } from './core/reference-dom-facts.js';