@lossless-claude/lcm 0.5.0 → 0.6.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 (152) hide show
  1. package/.claude-plugin/commands/lcm-compact.md +10 -0
  2. package/.claude-plugin/commands/lcm-curate.md +16 -6
  3. package/.claude-plugin/commands/lcm-diagnose.md +10 -0
  4. package/.claude-plugin/commands/lcm-doctor.md +1 -1
  5. package/.claude-plugin/commands/lcm-dogfood.md +1 -1
  6. package/.claude-plugin/commands/lcm-import.md +10 -0
  7. package/.claude-plugin/commands/lcm-promote.md +10 -0
  8. package/.claude-plugin/commands/lcm-sensitive.md +10 -0
  9. package/.claude-plugin/commands/lcm-stats.md +1 -1
  10. package/.claude-plugin/commands/lcm-status.md +10 -0
  11. package/.claude-plugin/hooks/README.md +1 -1
  12. package/.claude-plugin/marketplace.json +1 -1
  13. package/.claude-plugin/plugin.json +8 -2
  14. package/.claude-plugin/skills/lcm-context/SKILL.md +10 -0
  15. package/.claude-plugin/skills/lcm-dogfood/SKILL.md +1 -1
  16. package/.claude-plugin/skills/lcm-dogfood/references/checks.md +1 -1
  17. package/README.md +2 -2
  18. package/dist/bin/lcm.js +828 -474
  19. package/dist/bin/lcm.js.map +1 -1
  20. package/dist/installer/install.d.ts +6 -5
  21. package/dist/installer/install.js +97 -107
  22. package/dist/installer/install.js.map +1 -1
  23. package/dist/src/batch-compact.d.ts +7 -1
  24. package/dist/src/batch-compact.js +80 -6
  25. package/dist/src/batch-compact.js.map +1 -1
  26. package/dist/src/bootstrap.d.ts +24 -0
  27. package/dist/src/bootstrap.js +76 -0
  28. package/dist/src/bootstrap.js.map +1 -0
  29. package/dist/src/cli/pipeline-runner.d.ts +47 -0
  30. package/dist/src/cli/pipeline-runner.js +106 -0
  31. package/dist/src/cli/pipeline-runner.js.map +1 -0
  32. package/dist/src/cli/pipeline-step.d.ts +20 -0
  33. package/dist/src/cli/pipeline-step.js +6 -0
  34. package/dist/src/cli/pipeline-step.js.map +1 -0
  35. package/dist/src/cli/progress-state.d.ts +61 -0
  36. package/dist/src/cli/progress-state.js +16 -0
  37. package/dist/src/cli/progress-state.js.map +1 -0
  38. package/dist/src/cli/render-frame.d.ts +26 -0
  39. package/dist/src/cli/render-frame.js +153 -0
  40. package/dist/src/cli/render-frame.js.map +1 -0
  41. package/dist/src/cli/render-summary.d.ts +8 -0
  42. package/dist/src/cli/render-summary.js +79 -0
  43. package/dist/src/cli/render-summary.js.map +1 -0
  44. package/dist/src/cli-help.js +15 -9
  45. package/dist/src/cli-help.js.map +1 -1
  46. package/dist/src/codex-transcript.d.ts +50 -0
  47. package/dist/src/codex-transcript.js +207 -0
  48. package/dist/src/codex-transcript.js.map +1 -0
  49. package/dist/src/daemon/auth.d.ts +2 -0
  50. package/dist/src/daemon/auth.js +40 -0
  51. package/dist/src/daemon/auth.js.map +1 -0
  52. package/dist/src/daemon/client.d.ts +5 -1
  53. package/dist/src/daemon/client.js +21 -2
  54. package/dist/src/daemon/client.js.map +1 -1
  55. package/dist/src/daemon/config.d.ts +5 -0
  56. package/dist/src/daemon/config.js +23 -8
  57. package/dist/src/daemon/config.js.map +1 -1
  58. package/dist/src/daemon/content-fence.d.ts +7 -0
  59. package/dist/src/daemon/content-fence.js +14 -0
  60. package/dist/src/daemon/content-fence.js.map +1 -0
  61. package/dist/src/daemon/lifecycle.js +5 -0
  62. package/dist/src/daemon/lifecycle.js.map +1 -1
  63. package/dist/src/daemon/orientation.d.ts +1 -0
  64. package/dist/src/daemon/orientation.js +35 -6
  65. package/dist/src/daemon/orientation.js.map +1 -1
  66. package/dist/src/daemon/project.d.ts +1 -0
  67. package/dist/src/daemon/project.js +95 -3
  68. package/dist/src/daemon/project.js.map +1 -1
  69. package/dist/src/daemon/routes/compact.js +41 -10
  70. package/dist/src/daemon/routes/compact.js.map +1 -1
  71. package/dist/src/daemon/routes/describe.js +12 -1
  72. package/dist/src/daemon/routes/describe.js.map +1 -1
  73. package/dist/src/daemon/routes/expand.js +12 -1
  74. package/dist/src/daemon/routes/expand.js.map +1 -1
  75. package/dist/src/daemon/routes/grep.js +11 -2
  76. package/dist/src/daemon/routes/grep.js.map +1 -1
  77. package/dist/src/daemon/routes/ingest.js +36 -8
  78. package/dist/src/daemon/routes/ingest.js.map +1 -1
  79. package/dist/src/daemon/routes/promote.js +18 -3
  80. package/dist/src/daemon/routes/promote.js.map +1 -1
  81. package/dist/src/daemon/routes/prompt-search.js +11 -2
  82. package/dist/src/daemon/routes/prompt-search.js.map +1 -1
  83. package/dist/src/daemon/routes/recent.js +11 -2
  84. package/dist/src/daemon/routes/recent.js.map +1 -1
  85. package/dist/src/daemon/routes/restore.js +89 -72
  86. package/dist/src/daemon/routes/restore.js.map +1 -1
  87. package/dist/src/daemon/routes/search.js +12 -1
  88. package/dist/src/daemon/routes/search.js.map +1 -1
  89. package/dist/src/daemon/routes/session-complete.d.ts +2 -0
  90. package/dist/src/daemon/routes/session-complete.js +36 -0
  91. package/dist/src/daemon/routes/session-complete.js.map +1 -0
  92. package/dist/src/daemon/routes/status.js +77 -64
  93. package/dist/src/daemon/routes/status.js.map +1 -1
  94. package/dist/src/daemon/routes/store.d.ts +2 -1
  95. package/dist/src/daemon/routes/store.js +42 -8
  96. package/dist/src/daemon/routes/store.js.map +1 -1
  97. package/dist/src/daemon/safe-error.d.ts +5 -0
  98. package/dist/src/daemon/safe-error.js +15 -0
  99. package/dist/src/daemon/safe-error.js.map +1 -0
  100. package/dist/src/daemon/server.d.ts +1 -0
  101. package/dist/src/daemon/server.js +33 -4
  102. package/dist/src/daemon/server.js.map +1 -1
  103. package/dist/src/daemon/validate-cwd.d.ts +5 -0
  104. package/dist/src/daemon/validate-cwd.js +38 -0
  105. package/dist/src/daemon/validate-cwd.js.map +1 -0
  106. package/dist/src/db/migration.js +8 -0
  107. package/dist/src/db/migration.js.map +1 -1
  108. package/dist/src/diagnose.js +14 -1
  109. package/dist/src/diagnose.js.map +1 -1
  110. package/dist/src/doctor/doctor.js +45 -2
  111. package/dist/src/doctor/doctor.js.map +1 -1
  112. package/dist/src/hooks/auto-heal.js +24 -1
  113. package/dist/src/hooks/auto-heal.js.map +1 -1
  114. package/dist/src/hooks/dispatch.d.ts +1 -1
  115. package/dist/src/hooks/dispatch.js +14 -1
  116. package/dist/src/hooks/dispatch.js.map +1 -1
  117. package/dist/src/hooks/session-end.d.ts +2 -0
  118. package/dist/src/hooks/session-end.js +50 -5
  119. package/dist/src/hooks/session-end.js.map +1 -1
  120. package/dist/src/hooks/session-snapshot.d.ts +12 -0
  121. package/dist/src/hooks/session-snapshot.js +88 -0
  122. package/dist/src/hooks/session-snapshot.js.map +1 -0
  123. package/dist/src/hooks/user-prompt.js +17 -5
  124. package/dist/src/hooks/user-prompt.js.map +1 -1
  125. package/dist/src/import-summary.d.ts +4 -0
  126. package/dist/src/import-summary.js +34 -0
  127. package/dist/src/import-summary.js.map +1 -0
  128. package/dist/src/import.d.ts +11 -1
  129. package/dist/src/import.js +218 -88
  130. package/dist/src/import.js.map +1 -1
  131. package/dist/src/installer/settings.d.ts +5 -0
  132. package/dist/src/installer/settings.js +73 -0
  133. package/dist/src/installer/settings.js.map +1 -0
  134. package/dist/src/mcp/server.d.ts +15 -0
  135. package/dist/src/mcp/server.js +78 -5
  136. package/dist/src/mcp/server.js.map +1 -1
  137. package/dist/src/promotion/detector.js +19 -5
  138. package/dist/src/promotion/detector.js.map +1 -1
  139. package/dist/src/scrub.js +26 -0
  140. package/dist/src/scrub.js.map +1 -1
  141. package/dist/src/stats.d.ts +1 -0
  142. package/dist/src/stats.js +5 -0
  143. package/dist/src/stats.js.map +1 -1
  144. package/dist/src/store/conversation-store.js +2 -1
  145. package/dist/src/store/conversation-store.js.map +1 -1
  146. package/dist/src/store/regex-safety.d.ts +1 -0
  147. package/dist/src/store/regex-safety.js +22 -0
  148. package/dist/src/store/regex-safety.js.map +1 -0
  149. package/dist/src/store/summary-store.js +2 -1
  150. package/dist/src/store/summary-store.js.map +1 -1
  151. package/lcm.mjs +20 -1
  152. package/package.json +5 -2
@@ -1 +1 @@
1
- {"version":3,"file":"batch-compact.js","sourceRoot":"","sources":["../../src/batch-compact.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"batch-compact.js","sourceRoot":"","sources":["../../src/batch-compact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface EnsureCoreDeps {
2
+ configPath: string;
3
+ settingsPath: string;
4
+ existsSync: (path: string) => boolean;
5
+ readFileSync: (path: string, encoding: BufferEncoding) => string;
6
+ writeFileSync: (path: string, data: string) => void;
7
+ mkdirSync: (path: string, opts?: {
8
+ recursive: boolean;
9
+ }) => void;
10
+ chmodSync?: (path: string, mode: number) => void;
11
+ ensureDaemon: (opts: {
12
+ port: number;
13
+ pidFilePath: string;
14
+ spawnTimeoutMs: number;
15
+ }) => Promise<{
16
+ connected: boolean;
17
+ }>;
18
+ }
19
+ export declare function ensureCore(deps?: EnsureCoreDeps): Promise<void>;
20
+ export interface BootstrapDeps extends EnsureCoreDeps {
21
+ flagExists: (path: string) => boolean;
22
+ writeFlag: (path: string) => void;
23
+ }
24
+ export declare function ensureBootstrapped(sessionId: string, deps?: BootstrapDeps): Promise<void>;
@@ -0,0 +1,76 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join, dirname } from "node:path";
4
+ import { mergeClaudeSettings } from "./installer/settings.js";
5
+ import { loadDaemonConfig } from "./daemon/config.js";
6
+ function defaultDeps() {
7
+ return {
8
+ configPath: join(homedir(), ".lossless-claude", "config.json"),
9
+ settingsPath: join(homedir(), ".claude", "settings.json"),
10
+ existsSync,
11
+ readFileSync: (p, enc) => readFileSync(p, enc),
12
+ writeFileSync,
13
+ mkdirSync,
14
+ chmodSync: chmodSync,
15
+ ensureDaemon: async (opts) => {
16
+ const { ensureDaemon } = await import("./daemon/lifecycle.js");
17
+ return ensureDaemon(opts);
18
+ },
19
+ };
20
+ }
21
+ export async function ensureCore(deps = defaultDeps()) {
22
+ // 1. Create config.json with defaults if missing
23
+ if (!deps.existsSync(deps.configPath)) {
24
+ deps.mkdirSync(dirname(deps.configPath), { recursive: true });
25
+ const defaults = loadDaemonConfig("/nonexistent");
26
+ deps.writeFileSync(deps.configPath, JSON.stringify(defaults, null, 2));
27
+ try {
28
+ deps.chmodSync?.(deps.configPath, 0o600);
29
+ }
30
+ catch { }
31
+ }
32
+ // 2. Clean stale/duplicate hooks from settings.json (fixes #94)
33
+ // Only rewrite settings.json if mergeClaudeSettings actually changed the data
34
+ if (deps.existsSync(deps.settingsPath)) {
35
+ try {
36
+ const existing = JSON.parse(deps.readFileSync(deps.settingsPath, "utf-8"));
37
+ const merged = mergeClaudeSettings(existing);
38
+ if (JSON.stringify(existing) !== JSON.stringify(merged)) {
39
+ deps.mkdirSync(dirname(deps.settingsPath), { recursive: true });
40
+ deps.writeFileSync(deps.settingsPath, JSON.stringify(merged, null, 2));
41
+ }
42
+ }
43
+ catch { }
44
+ }
45
+ // 3. Start daemon if not running
46
+ const config = loadDaemonConfig(deps.configPath);
47
+ await deps.ensureDaemon({
48
+ port: config.daemon?.port ?? 3737,
49
+ pidFilePath: join(dirname(deps.configPath), "daemon.pid"),
50
+ spawnTimeoutMs: 5000,
51
+ });
52
+ }
53
+ function defaultBootstrapDeps() {
54
+ return {
55
+ ...defaultDeps(),
56
+ flagExists: existsSync,
57
+ writeFlag: (p) => writeFileSync(p, ""),
58
+ };
59
+ }
60
+ export async function ensureBootstrapped(sessionId, deps = defaultBootstrapDeps()) {
61
+ const safeId = sessionId.replace(/[^a-zA-Z0-9_-]/g, "_");
62
+ const flagDir = join(homedir(), ".lossless-claude", "tmp");
63
+ mkdirSync(flagDir, { recursive: true });
64
+ const flagPath = join(flagDir, `bootstrapped-${safeId}.flag`);
65
+ try {
66
+ if (deps.flagExists(flagPath))
67
+ return;
68
+ }
69
+ catch { }
70
+ await ensureCore(deps);
71
+ try {
72
+ deps.writeFlag(flagPath);
73
+ }
74
+ catch { }
75
+ }
76
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Lifecycle orchestrator for the ninja CLI renderer.
3
+ * Manages the render loop, SIGINT/SIGWINCH handlers, and session iteration.
4
+ */
5
+ import type { ProgressState } from './progress-state.js';
6
+ import { type RenderOpts } from './render-frame.js';
7
+ export interface PipelineRunnerOpts {
8
+ state: ProgressState;
9
+ renderOpts: RenderOpts;
10
+ /** Called once the runner has started (before session iteration begins) */
11
+ onReady?: () => void;
12
+ }
13
+ /**
14
+ * NinjaRenderer — manages the live display lifecycle.
15
+ *
16
+ * Usage:
17
+ * const renderer = new NinjaRenderer({ state, renderOpts });
18
+ * renderer.start();
19
+ * // ... mutate state ...
20
+ * renderer.sessionDone(lastResult); // emit non-TTY/verbose line
21
+ * renderer.stop(); // stop render loop
22
+ * renderer.printSummary();
23
+ */
24
+ export declare class NinjaRenderer {
25
+ private state;
26
+ private opts;
27
+ private intervalId?;
28
+ private firstFrame;
29
+ private sigintHandler?;
30
+ private sigwinchHandler?;
31
+ constructor(opts: PipelineRunnerOpts);
32
+ /** Start the render loop and register signal handlers. */
33
+ start(): void;
34
+ /** Stop the render loop and remove signal handlers. */
35
+ stop(): void;
36
+ /**
37
+ * Called when a session finishes.
38
+ * In non-TTY or verbose mode, emits a log line.
39
+ * In TTY non-verbose, the render loop handles it.
40
+ */
41
+ sessionDone(): void;
42
+ /** Print the final summary. */
43
+ printSummary(): void;
44
+ /** Update the render opts (e.g. after SIGWINCH) */
45
+ updateOpts(patch: Partial<RenderOpts>): void;
46
+ private _writeFrame;
47
+ }
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Lifecycle orchestrator for the ninja CLI renderer.
3
+ * Manages the render loop, SIGINT/SIGWINCH handlers, and session iteration.
4
+ */
5
+ import { renderFrame, FRAME_LINES } from './render-frame.js';
6
+ import { printSummary } from './render-summary.js';
7
+ /**
8
+ * NinjaRenderer — manages the live display lifecycle.
9
+ *
10
+ * Usage:
11
+ * const renderer = new NinjaRenderer({ state, renderOpts });
12
+ * renderer.start();
13
+ * // ... mutate state ...
14
+ * renderer.sessionDone(lastResult); // emit non-TTY/verbose line
15
+ * renderer.stop(); // stop render loop
16
+ * renderer.printSummary();
17
+ */
18
+ export class NinjaRenderer {
19
+ state;
20
+ opts;
21
+ intervalId;
22
+ firstFrame = true;
23
+ sigintHandler;
24
+ sigwinchHandler;
25
+ constructor(opts) {
26
+ this.state = opts.state;
27
+ this.opts = opts.renderOpts;
28
+ }
29
+ /** Start the render loop and register signal handlers. */
30
+ start() {
31
+ const { isTTY, verbose } = this.opts;
32
+ // Register SIGWINCH to update terminal width
33
+ this.sigwinchHandler = () => {
34
+ this.opts.width = process.stdout.columns ?? 80;
35
+ };
36
+ process.on('SIGWINCH', this.sigwinchHandler);
37
+ // Register SIGINT for clean partial summary
38
+ this.sigintHandler = () => {
39
+ this.state.aborted = true;
40
+ this.stop();
41
+ this.printSummary();
42
+ process.exit(130);
43
+ };
44
+ process.on('SIGINT', this.sigintHandler);
45
+ if (isTTY && !verbose) {
46
+ // Emit blank lines to reserve space for the 3-line frame
47
+ process.stdout.write('\n\n\n');
48
+ this.firstFrame = false;
49
+ // 16 fps render loop
50
+ this.intervalId = setInterval(() => {
51
+ this._writeFrame();
52
+ }, 62);
53
+ }
54
+ }
55
+ /** Stop the render loop and remove signal handlers. */
56
+ stop() {
57
+ if (this.intervalId !== undefined) {
58
+ clearInterval(this.intervalId);
59
+ this.intervalId = undefined;
60
+ }
61
+ if (this.sigintHandler) {
62
+ process.removeListener('SIGINT', this.sigintHandler);
63
+ this.sigintHandler = undefined;
64
+ }
65
+ if (this.sigwinchHandler) {
66
+ process.removeListener('SIGWINCH', this.sigwinchHandler);
67
+ this.sigwinchHandler = undefined;
68
+ }
69
+ // Write one final frame to reflect the completed state
70
+ if (this.opts.isTTY && !this.opts.verbose) {
71
+ this._writeFrame();
72
+ }
73
+ }
74
+ /**
75
+ * Called when a session finishes.
76
+ * In non-TTY or verbose mode, emits a log line.
77
+ * In TTY non-verbose, the render loop handles it.
78
+ */
79
+ sessionDone() {
80
+ const { isTTY, verbose } = this.opts;
81
+ if (!isTTY || verbose) {
82
+ const line = renderFrame(this.state, this.opts, 0);
83
+ if (line)
84
+ process.stdout.write(line);
85
+ }
86
+ }
87
+ /** Print the final summary. */
88
+ printSummary() {
89
+ // In TTY non-verbose mode we need to move past the live frame
90
+ if (this.opts.isTTY && !this.opts.verbose) {
91
+ process.stdout.write('\n');
92
+ }
93
+ printSummary(this.state, this.opts);
94
+ }
95
+ /** Update the render opts (e.g. after SIGWINCH) */
96
+ updateOpts(patch) {
97
+ Object.assign(this.opts, patch);
98
+ }
99
+ _writeFrame() {
100
+ const frame = renderFrame(this.state, this.opts, this.firstFrame ? 0 : FRAME_LINES);
101
+ this.firstFrame = false;
102
+ if (frame)
103
+ process.stdout.write(frame);
104
+ }
105
+ }
106
+ //# sourceMappingURL=pipeline-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-runner.js","sourceRoot":"","sources":["../../../src/cli/pipeline-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AASnD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,aAAa;IAChB,KAAK,CAAgB;IACrB,IAAI,CAAa;IACjB,UAAU,CAAkC;IAC5C,UAAU,GAAG,IAAI,CAAC;IAClB,aAAa,CAAc;IAC3B,eAAe,CAAc;IAErC,YAAY,IAAwB;QAClC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;IAC9B,CAAC;IAED,0DAA0D;IAC1D,KAAK;QACH,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAErC,6CAA6C;QAC7C,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE;YAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACjD,CAAC,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAE7C,4CAA4C;QAC5C,IAAI,CAAC,aAAa,GAAG,GAAG,EAAE;YACxB,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEzC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YACtB,yDAAyD;YACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YAExB,qBAAqB;YACrB,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;gBACjC,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,CAAC,EAAE,EAAE,CAAC,CAAC;QACT,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,IAAI;QACF,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YAClC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACrD,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QACjC,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YACzD,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACnC,CAAC;QACD,uDAAuD;QACvD,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,WAAW;QACT,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACnD,IAAI,IAAI;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,YAAY;QACV,8DAA8D;QAC9D,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,mDAAmD;IACnD,UAAU,CAAC,KAA0B;QACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAEO,WAAW;QACjB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACpF,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,KAAK;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * PipelineStep interface + PipelineSession type.
3
+ * Defines the contract for commands integrated with the ninja renderer.
4
+ */
5
+ import type { ProgressState } from './progress-state.js';
6
+ export interface PipelineSession {
7
+ sessionId: string;
8
+ path: string;
9
+ messages?: number;
10
+ tokens?: number;
11
+ }
12
+ export type ProgressUpdate = (patch: Partial<ProgressState>) => void;
13
+ export interface PipelineStep {
14
+ name: string;
15
+ count(opts: Record<string, unknown>): Promise<number>;
16
+ run(session: PipelineSession, update: ProgressUpdate): Promise<{
17
+ success: boolean;
18
+ error?: string;
19
+ }>;
20
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * PipelineStep interface + PipelineSession type.
3
+ * Defines the contract for commands integrated with the ninja renderer.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=pipeline-step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-step.js","sourceRoot":"","sources":["../../../src/cli/pipeline-step.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,61 @@
1
+ /** State model for the ninja CLI progress renderer. */
2
+ export interface ProgressPhase {
3
+ name: string;
4
+ status: 'pending' | 'active' | 'done';
5
+ }
6
+ export interface ProgressError {
7
+ sessionId: string;
8
+ message: string;
9
+ }
10
+ export interface ProgressCurrentSession {
11
+ sessionId: string;
12
+ messages: number;
13
+ tokens: number;
14
+ startedAt: number;
15
+ }
16
+ export interface ProgressLastResult {
17
+ sessionId: string;
18
+ messages: number;
19
+ tokensBefore: number;
20
+ tokensAfter?: number;
21
+ provider?: string;
22
+ elapsed: number;
23
+ }
24
+ export interface ProgressDag {
25
+ nodes: number;
26
+ newNodes: number;
27
+ depth: number;
28
+ memoriesPromoted: number;
29
+ }
30
+ export interface ProgressState {
31
+ /** Phase tracking (multi-phase pipelines like curate) */
32
+ phases: ProgressPhase[];
33
+ /** Multi-project tracking (--all mode) */
34
+ currentProject?: string;
35
+ /** Total sessions to process */
36
+ total: number;
37
+ /** Completed sessions (success + skip) */
38
+ completed: number;
39
+ /** Failed sessions — derived from errors.length to avoid drift */
40
+ errors: ProgressError[];
41
+ /** Running metrics */
42
+ tokensIn: number;
43
+ tokensOut: number;
44
+ messagesIn: number;
45
+ /** Current session being processed */
46
+ current?: ProgressCurrentSession;
47
+ /** Last completed session (drives line 3 of ninja display) */
48
+ lastResult?: ProgressLastResult;
49
+ /** DAG metrics (updated after compact/promote phases) */
50
+ dag?: ProgressDag;
51
+ /** Wall-clock start time */
52
+ startedAt: number;
53
+ /** Flags */
54
+ dryRun: boolean;
55
+ aborted: boolean;
56
+ }
57
+ export declare function makeProgressState(opts: {
58
+ phases?: ProgressPhase[];
59
+ total?: number;
60
+ dryRun?: boolean;
61
+ }): ProgressState;
@@ -0,0 +1,16 @@
1
+ /** State model for the ninja CLI progress renderer. */
2
+ export function makeProgressState(opts) {
3
+ return {
4
+ phases: opts.phases ?? [],
5
+ total: opts.total ?? 0,
6
+ completed: 0,
7
+ errors: [],
8
+ tokensIn: 0,
9
+ tokensOut: 0,
10
+ messagesIn: 0,
11
+ startedAt: Date.now(),
12
+ dryRun: opts.dryRun ?? false,
13
+ aborted: false,
14
+ };
15
+ }
16
+ //# sourceMappingURL=progress-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-state.js","sourceRoot":"","sources":["../../../src/cli/progress-state.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAuEvD,MAAM,UAAU,iBAAiB,CAAC,IAIjC;IACC,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;QACtB,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;QAC5B,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Pure renderFrame() function — no side effects, no IO.
3
+ * Returns the string to write to stdout.
4
+ */
5
+ import type { ProgressState } from './progress-state.js';
6
+ export interface RenderOpts {
7
+ isTTY: boolean;
8
+ width: number;
9
+ color: boolean;
10
+ verbose: boolean;
11
+ }
12
+ /**
13
+ * Render one frame.
14
+ *
15
+ * In TTY mode: returns 3 lines prefixed with cursor-up + clear sequences so the
16
+ * caller can overwrite the previous frame in-place. On the very first render
17
+ * (prevLines === 0) no cursor movement is emitted.
18
+ *
19
+ * In non-TTY mode (and verbose TTY): returns a single line per completed session.
20
+ */
21
+ export declare function renderFrame(state: ProgressState, opts: RenderOpts, prevLines?: number): string;
22
+ /**
23
+ * The number of lines renderFrame emits in TTY non-verbose mode.
24
+ * The caller tracks this as `prevLines` for the next call.
25
+ */
26
+ export declare const FRAME_LINES = 3;
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Pure renderFrame() function — no side effects, no IO.
3
+ * Returns the string to write to stdout.
4
+ */
5
+ // ANSI helpers
6
+ const ESC = '\x1b';
7
+ const RESET = `${ESC}[0m`;
8
+ const RED = `${ESC}[31m`;
9
+ const GREEN = `${ESC}[32m`;
10
+ const YELLOW = `${ESC}[33m`;
11
+ /** Move cursor up N lines */
12
+ const cursorUp = (n) => `${ESC}[${n}A`;
13
+ /** Clear from cursor to end of line */
14
+ const clearLine = `${ESC}[2K`;
15
+ /** Carriage return */
16
+ const CR = '\r';
17
+ /** Format token count with K/M suffix */
18
+ function fmtTokens(n) {
19
+ if (n >= 1_000_000)
20
+ return `~${(n / 1_000_000).toFixed(1)}M`;
21
+ if (n >= 1_000)
22
+ return `~${(n / 1_000).toFixed(1)}k`;
23
+ return String(n);
24
+ }
25
+ /** Format elapsed milliseconds */
26
+ function fmtElapsed(ms) {
27
+ if (ms >= 60_000)
28
+ return `${(ms / 60_000).toFixed(1)}m`;
29
+ return `${(ms / 1_000).toFixed(1)}s`;
30
+ }
31
+ /** Format compression ratio, coloured when color=true */
32
+ function fmtRatio(ratio, color) {
33
+ const text = `${ratio.toFixed(1)}×`;
34
+ if (!color)
35
+ return text;
36
+ if (ratio >= 10)
37
+ return `${GREEN}${text}${RESET}`;
38
+ if (ratio >= 5)
39
+ return `${YELLOW}${text}${RESET}`;
40
+ return text;
41
+ }
42
+ /** Build the phase bar string, e.g. "● Import → ○ Compact" */
43
+ function renderPhaseBar(state) {
44
+ if (state.phases.length === 0)
45
+ return '';
46
+ return state.phases
47
+ .map(p => `${p.status === 'pending' ? '○' : '●'} ${p.name}`)
48
+ .join(' → ');
49
+ }
50
+ /** Build a progress bar of a given bar width */
51
+ function renderBar(completed, total, barWidth) {
52
+ if (total === 0)
53
+ return '[' + '░'.repeat(barWidth) + ']';
54
+ const filled = Math.round((completed / total) * barWidth);
55
+ const empty = barWidth - filled;
56
+ return '[' + '█'.repeat(filled) + '░'.repeat(empty) + ']';
57
+ }
58
+ /**
59
+ * Render one frame.
60
+ *
61
+ * In TTY mode: returns 3 lines prefixed with cursor-up + clear sequences so the
62
+ * caller can overwrite the previous frame in-place. On the very first render
63
+ * (prevLines === 0) no cursor movement is emitted.
64
+ *
65
+ * In non-TTY mode (and verbose TTY): returns a single line per completed session.
66
+ */
67
+ export function renderFrame(state, opts, prevLines = 3) {
68
+ const { isTTY, color, width } = opts;
69
+ if (!isTTY) {
70
+ // Non-TTY: emit one line per completed session (called by caller when a session finishes)
71
+ const last = state.lastResult;
72
+ if (!last)
73
+ return '';
74
+ const counter = `[${state.completed}/${state.total}]`;
75
+ const tokens = last.tokensAfter !== undefined && last.tokensAfter < last.tokensBefore
76
+ ? `${fmtTokens(last.tokensBefore)} → ${fmtTokens(last.tokensAfter)}`
77
+ : fmtTokens(last.tokensBefore);
78
+ const provider = last.provider ? ` [${last.provider}]` : '';
79
+ return ` ${counter} ${last.sessionId}: ${last.messages} msgs, ${tokens}${provider} ${fmtElapsed(last.elapsed)}\n`;
80
+ }
81
+ if (opts.verbose) {
82
+ // Verbose TTY: sequential log lines, no overwrite
83
+ const last = state.lastResult;
84
+ if (!last)
85
+ return '';
86
+ const tokens = last.tokensAfter !== undefined && last.tokensAfter < last.tokensBefore
87
+ ? `${fmtTokens(last.tokensBefore)} → ${fmtTokens(last.tokensAfter)}`
88
+ : fmtTokens(last.tokensBefore);
89
+ const provider = last.provider ? ` [${last.provider}]` : '';
90
+ const ratio = last.tokensAfter !== undefined && last.tokensAfter < last.tokensBefore
91
+ ? ` (${fmtRatio(last.tokensBefore / last.tokensAfter, color)})`
92
+ : '';
93
+ return ` ✓ ${last.sessionId} ${last.messages} msgs ${tokens}${ratio}${provider} ${fmtElapsed(last.elapsed)}\n`;
94
+ }
95
+ // ── TTY non-verbose: 3-line ninja display ──────────────────────────────────
96
+ const effectiveWidth = Math.max(width, 40);
97
+ const now = Date.now();
98
+ // Line 1: phase bar + progress counter + failures
99
+ const phaseBar = renderPhaseBar(state);
100
+ const counter = state.total > 0 ? `${state.completed}/${state.total}` : '';
101
+ const failCount = state.errors.length;
102
+ const failStr = failCount > 0
103
+ ? (color ? ` ${RED}${failCount} failed${RESET}` : ` ${failCount} failed`)
104
+ : '';
105
+ const dryRunBadge = state.dryRun ? ' [dry-run]' : '';
106
+ const line1Parts = [phaseBar, counter, failStr, dryRunBadge].filter(Boolean);
107
+ const line1 = ' ' + line1Parts.join(' ');
108
+ // Line 2: progress bar + running totals
109
+ const barWidth = effectiveWidth < 60 ? 0 : 22;
110
+ const pct = state.total > 0 ? Math.round((state.completed / state.total) * 100) : 0;
111
+ const barStr = barWidth > 0 ? renderBar(state.completed, state.total, barWidth) + ' ' : '';
112
+ const pctStr = `${pct}%`;
113
+ const msgs = state.messagesIn > 0 ? ` ${state.messagesIn.toLocaleString()} msgs` : '';
114
+ let tokenFlow = '';
115
+ if (state.tokensIn > 0) {
116
+ if (state.tokensOut > 0 && state.tokensOut < state.tokensIn) {
117
+ const ratio = state.tokensIn / state.tokensOut;
118
+ tokenFlow = ` (${fmtTokens(state.tokensIn)} → ${fmtTokens(state.tokensOut)} tokens, ${fmtRatio(ratio, color)})`;
119
+ }
120
+ else {
121
+ tokenFlow = ` (${fmtTokens(state.tokensIn)} tokens)`;
122
+ }
123
+ }
124
+ const line2 = ` ${barStr}${pctStr}${msgs}${tokenFlow}`;
125
+ // Line 3: current or last session detail
126
+ let line3 = '';
127
+ if (state.current) {
128
+ const elapsed = fmtElapsed(now - state.current.startedAt);
129
+ line3 = ` ● ${state.current.sessionId} ${state.current.messages} msgs processing... ${elapsed}`;
130
+ }
131
+ else if (state.lastResult) {
132
+ const last = state.lastResult;
133
+ const tokens = last.tokensAfter !== undefined && last.tokensAfter < last.tokensBefore
134
+ ? `${fmtTokens(last.tokensBefore)} → ${fmtTokens(last.tokensAfter)}`
135
+ : fmtTokens(last.tokensBefore);
136
+ const provider = last.provider ? ` [${last.provider}]` : '';
137
+ line3 = ` ● ${last.sessionId} ${last.messages} msgs ${tokens}${provider} ${fmtElapsed(last.elapsed)}`;
138
+ }
139
+ else {
140
+ line3 = ' …';
141
+ }
142
+ // Overwrite the previous frame: cursor up N lines then clear+rewrite each line
143
+ const overwrite = prevLines > 0
144
+ ? cursorUp(prevLines) + [line1, line2, line3].map(l => CR + clearLine + l).join('\n')
145
+ : [line1, line2, line3].join('\n');
146
+ return overwrite + '\n';
147
+ }
148
+ /**
149
+ * The number of lines renderFrame emits in TTY non-verbose mode.
150
+ * The caller tracks this as `prevLines` for the next call.
151
+ */
152
+ export const FRAME_LINES = 3;
153
+ //# sourceMappingURL=render-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-frame.js","sourceRoot":"","sources":["../../../src/cli/render-frame.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Summary renderer — prints the final summary after all sessions are processed.
3
+ * Replaces import-summary.ts for commands that use the ninja renderer.
4
+ */
5
+ import type { ProgressState } from './progress-state.js';
6
+ import type { RenderOpts } from './render-frame.js';
7
+ /** Print the compact (non-verbose) summary table to stdout. */
8
+ export declare function printSummary(state: ProgressState, opts: RenderOpts): void;