@lumenflow/cli 1.0.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 (129) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +116 -0
  3. package/dist/gates.d.ts +41 -0
  4. package/dist/gates.d.ts.map +1 -0
  5. package/dist/gates.js +684 -0
  6. package/dist/gates.js.map +1 -0
  7. package/dist/initiative-add-wu.d.ts +22 -0
  8. package/dist/initiative-add-wu.d.ts.map +1 -0
  9. package/dist/initiative-add-wu.js +234 -0
  10. package/dist/initiative-add-wu.js.map +1 -0
  11. package/dist/initiative-create.d.ts +28 -0
  12. package/dist/initiative-create.d.ts.map +1 -0
  13. package/dist/initiative-create.js +172 -0
  14. package/dist/initiative-create.js.map +1 -0
  15. package/dist/initiative-edit.d.ts +34 -0
  16. package/dist/initiative-edit.d.ts.map +1 -0
  17. package/dist/initiative-edit.js +440 -0
  18. package/dist/initiative-edit.js.map +1 -0
  19. package/dist/initiative-list.d.ts +12 -0
  20. package/dist/initiative-list.d.ts.map +1 -0
  21. package/dist/initiative-list.js +101 -0
  22. package/dist/initiative-list.js.map +1 -0
  23. package/dist/initiative-status.d.ts +11 -0
  24. package/dist/initiative-status.d.ts.map +1 -0
  25. package/dist/initiative-status.js +221 -0
  26. package/dist/initiative-status.js.map +1 -0
  27. package/dist/mem-checkpoint.d.ts +16 -0
  28. package/dist/mem-checkpoint.d.ts.map +1 -0
  29. package/dist/mem-checkpoint.js +237 -0
  30. package/dist/mem-checkpoint.js.map +1 -0
  31. package/dist/mem-cleanup.d.ts +29 -0
  32. package/dist/mem-cleanup.d.ts.map +1 -0
  33. package/dist/mem-cleanup.js +267 -0
  34. package/dist/mem-cleanup.js.map +1 -0
  35. package/dist/mem-create.d.ts +17 -0
  36. package/dist/mem-create.d.ts.map +1 -0
  37. package/dist/mem-create.js +265 -0
  38. package/dist/mem-create.js.map +1 -0
  39. package/dist/mem-inbox.d.ts +35 -0
  40. package/dist/mem-inbox.d.ts.map +1 -0
  41. package/dist/mem-inbox.js +373 -0
  42. package/dist/mem-inbox.js.map +1 -0
  43. package/dist/mem-init.d.ts +15 -0
  44. package/dist/mem-init.d.ts.map +1 -0
  45. package/dist/mem-init.js +146 -0
  46. package/dist/mem-init.js.map +1 -0
  47. package/dist/mem-ready.d.ts +16 -0
  48. package/dist/mem-ready.d.ts.map +1 -0
  49. package/dist/mem-ready.js +224 -0
  50. package/dist/mem-ready.js.map +1 -0
  51. package/dist/mem-signal.d.ts +16 -0
  52. package/dist/mem-signal.d.ts.map +1 -0
  53. package/dist/mem-signal.js +204 -0
  54. package/dist/mem-signal.js.map +1 -0
  55. package/dist/mem-start.d.ts +16 -0
  56. package/dist/mem-start.d.ts.map +1 -0
  57. package/dist/mem-start.js +158 -0
  58. package/dist/mem-start.js.map +1 -0
  59. package/dist/mem-summarize.d.ts +22 -0
  60. package/dist/mem-summarize.d.ts.map +1 -0
  61. package/dist/mem-summarize.js +213 -0
  62. package/dist/mem-summarize.js.map +1 -0
  63. package/dist/mem-triage.d.ts +22 -0
  64. package/dist/mem-triage.d.ts.map +1 -0
  65. package/dist/mem-triage.js +328 -0
  66. package/dist/mem-triage.js.map +1 -0
  67. package/dist/spawn-list.d.ts +16 -0
  68. package/dist/spawn-list.d.ts.map +1 -0
  69. package/dist/spawn-list.js +140 -0
  70. package/dist/spawn-list.js.map +1 -0
  71. package/dist/wu-block.d.ts +16 -0
  72. package/dist/wu-block.d.ts.map +1 -0
  73. package/dist/wu-block.js +241 -0
  74. package/dist/wu-block.js.map +1 -0
  75. package/dist/wu-claim.d.ts +32 -0
  76. package/dist/wu-claim.d.ts.map +1 -0
  77. package/dist/wu-claim.js +1106 -0
  78. package/dist/wu-claim.js.map +1 -0
  79. package/dist/wu-cleanup.d.ts +17 -0
  80. package/dist/wu-cleanup.d.ts.map +1 -0
  81. package/dist/wu-cleanup.js +194 -0
  82. package/dist/wu-cleanup.js.map +1 -0
  83. package/dist/wu-create.d.ts +38 -0
  84. package/dist/wu-create.d.ts.map +1 -0
  85. package/dist/wu-create.js +520 -0
  86. package/dist/wu-create.js.map +1 -0
  87. package/dist/wu-deps.d.ts +13 -0
  88. package/dist/wu-deps.d.ts.map +1 -0
  89. package/dist/wu-deps.js +119 -0
  90. package/dist/wu-deps.js.map +1 -0
  91. package/dist/wu-done.d.ts +153 -0
  92. package/dist/wu-done.d.ts.map +1 -0
  93. package/dist/wu-done.js +2096 -0
  94. package/dist/wu-done.js.map +1 -0
  95. package/dist/wu-edit.d.ts +29 -0
  96. package/dist/wu-edit.d.ts.map +1 -0
  97. package/dist/wu-edit.js +852 -0
  98. package/dist/wu-edit.js.map +1 -0
  99. package/dist/wu-infer-lane.d.ts +17 -0
  100. package/dist/wu-infer-lane.d.ts.map +1 -0
  101. package/dist/wu-infer-lane.js +135 -0
  102. package/dist/wu-infer-lane.js.map +1 -0
  103. package/dist/wu-preflight.d.ts +47 -0
  104. package/dist/wu-preflight.d.ts.map +1 -0
  105. package/dist/wu-preflight.js +167 -0
  106. package/dist/wu-preflight.js.map +1 -0
  107. package/dist/wu-prune.d.ts +16 -0
  108. package/dist/wu-prune.d.ts.map +1 -0
  109. package/dist/wu-prune.js +259 -0
  110. package/dist/wu-prune.js.map +1 -0
  111. package/dist/wu-repair.d.ts +60 -0
  112. package/dist/wu-repair.d.ts.map +1 -0
  113. package/dist/wu-repair.js +226 -0
  114. package/dist/wu-repair.js.map +1 -0
  115. package/dist/wu-spawn-completion.d.ts +10 -0
  116. package/dist/wu-spawn-completion.js +30 -0
  117. package/dist/wu-spawn.d.ts +168 -0
  118. package/dist/wu-spawn.d.ts.map +1 -0
  119. package/dist/wu-spawn.js +1327 -0
  120. package/dist/wu-spawn.js.map +1 -0
  121. package/dist/wu-unblock.d.ts +16 -0
  122. package/dist/wu-unblock.d.ts.map +1 -0
  123. package/dist/wu-unblock.js +234 -0
  124. package/dist/wu-unblock.js.map +1 -0
  125. package/dist/wu-validate.d.ts +16 -0
  126. package/dist/wu-validate.d.ts.map +1 -0
  127. package/dist/wu-validate.js +193 -0
  128. package/dist/wu-validate.js.map +1 -0
  129. package/package.json +92 -0
@@ -0,0 +1,221 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Initiative Status Helper (WU-1247)
4
+ *
5
+ * Shows detailed initiative view with phases and WUs.
6
+ *
7
+ * Usage:
8
+ * pnpm initiative:status INIT-001
9
+ * pnpm initiative:status --id INIT-001 --format json
10
+ */
11
+ import { createWUParser, WU_OPTIONS } from '@lumenflow/core/dist/arg-parser.js';
12
+ import { die } from '@lumenflow/core/dist/error-handler.js';
13
+ import { findInitiative, getInitiativeProgress, getInitiativeWUs, getInitiativePhases, } from '@lumenflow/initiatives/dist/initiative-yaml.js';
14
+ import { OUTPUT_FORMATS } from '@lumenflow/initiatives/dist/initiative-constants.js';
15
+ import { WU_STATUS } from '@lumenflow/core/dist/wu-constants.js';
16
+ function getWUBlockers(doc) {
17
+ return doc.blocked_by || doc.dependencies || [];
18
+ }
19
+ function priorityRank(priority) {
20
+ const p = String(priority || '').toUpperCase();
21
+ const map = { P0: 0, P1: 1, P2: 2, P3: 3 };
22
+ return map[p] ?? 9;
23
+ }
24
+ function isRunnableReady(wu, wuById) {
25
+ if (wu.doc.status !== WU_STATUS.READY)
26
+ return false;
27
+ const blockers = getWUBlockers(wu.doc);
28
+ return blockers.every((blockerId) => {
29
+ const blocker = wuById.get(blockerId);
30
+ return !blocker || blocker.doc.status === WU_STATUS.DONE;
31
+ });
32
+ }
33
+ function renderDetailed(initiative, useColor) {
34
+ const { id, doc } = initiative;
35
+ const progress = getInitiativeProgress(id);
36
+ const wus = getInitiativeWUs(id);
37
+ const wuById = new Map(wus.map((wu) => [wu.id, wu]));
38
+ const phaseGroups = getInitiativePhases(id);
39
+ // Header
40
+ console.log(`\n${id}: ${doc.title}`);
41
+ console.log(`Status: ${doc.status} | Progress: ${progress.percentage}% (${progress.done}/${progress.total} WUs)`);
42
+ // Start here (actionable next steps)
43
+ console.log('\nStart here:');
44
+ console.log(` 1) Plan waves (recommended): pnpm orchestrate:initiative --initiative ${id} --dry-run`);
45
+ const runnableReady = wus
46
+ .filter((wu) => isRunnableReady(wu, wuById))
47
+ .sort((a, b) => {
48
+ const byPriority = priorityRank(a.doc.priority) - priorityRank(b.doc.priority);
49
+ if (byPriority !== 0)
50
+ return byPriority;
51
+ return a.id.localeCompare(b.id);
52
+ });
53
+ if (runnableReady.length > 0) {
54
+ const next = runnableReady[0];
55
+ console.log(` 2) Start next WU: pnpm wu:claim --id ${next.id} --lane "${next.doc.lane}"`);
56
+ console.log(` Then cd into the created worktree (shown by wu:claim output)`);
57
+ }
58
+ else if (progress.inProgress > 0) {
59
+ console.log(` 2) Continue: ${progress.inProgress} WU(s) already in progress (finish those first)`);
60
+ }
61
+ else if (progress.blocked > 0) {
62
+ console.log(` 2) Unblock: ${progress.blocked} WU(s) blocked (resolve blockers first)`);
63
+ }
64
+ else {
65
+ console.log(' 2) No runnable ready WUs found (check dependencies/blocked_by)');
66
+ }
67
+ if (doc.description) {
68
+ console.log(`\nDescription: ${doc.description}`);
69
+ }
70
+ if (doc.owner) {
71
+ console.log(`Owner: ${doc.owner}`);
72
+ }
73
+ if (doc.target_date) {
74
+ console.log(`Target: ${doc.target_date}`);
75
+ }
76
+ // Phases
77
+ if (doc.phases && doc.phases.length > 0) {
78
+ console.log('\nPhases:');
79
+ for (const phase of doc.phases) {
80
+ const phaseWUs = phaseGroups.get(phase.id) || [];
81
+ const phaseStatus = formatStatus(phase.status, useColor);
82
+ console.log(` ${phase.id}. ${phase.title.padEnd(30)} [${phaseStatus}] ${phaseWUs.length} WUs`);
83
+ }
84
+ // WUs without phase
85
+ const unassigned = phaseGroups.get(null) || [];
86
+ if (unassigned.length > 0) {
87
+ console.log(` -. Unassigned ${unassigned.length} WUs`);
88
+ }
89
+ }
90
+ // WU summary by status
91
+ console.log('\nWork Units by Status:');
92
+ const byStatus = groupWUsByStatus(wus);
93
+ for (const [status, statusWUs] of Object.entries(byStatus)) {
94
+ if (statusWUs.length > 0) {
95
+ console.log(` ${capitalizeFirst(status)} (${statusWUs.length}):`);
96
+ for (const wu of statusWUs.slice(0, 5)) {
97
+ console.log(` - ${wu.id}: ${truncate(wu.doc.title, 50)}`);
98
+ }
99
+ if (statusWUs.length > 5) {
100
+ console.log(` ... and ${statusWUs.length - 5} more`);
101
+ }
102
+ }
103
+ }
104
+ // Success metrics
105
+ if (doc.success_metrics && doc.success_metrics.length > 0) {
106
+ console.log('\nSuccess Metrics:');
107
+ for (const metric of doc.success_metrics) {
108
+ console.log(` - ${metric}`);
109
+ }
110
+ }
111
+ console.log('');
112
+ }
113
+ function renderJSON(initiative) {
114
+ const { id, doc } = initiative;
115
+ const progress = getInitiativeProgress(id);
116
+ const wus = getInitiativeWUs(id);
117
+ const phaseGroups = getInitiativePhases(id);
118
+ const output = {
119
+ id,
120
+ slug: doc.slug,
121
+ title: doc.title,
122
+ description: doc.description,
123
+ status: doc.status,
124
+ priority: doc.priority,
125
+ owner: doc.owner,
126
+ created: doc.created,
127
+ targetDate: doc.target_date,
128
+ progress: {
129
+ percentage: progress.percentage,
130
+ done: progress.done,
131
+ inProgress: progress.inProgress,
132
+ ready: progress.ready,
133
+ blocked: progress.blocked,
134
+ total: progress.total,
135
+ },
136
+ phases: (doc.phases || []).map((phase) => {
137
+ const phaseWUs = phaseGroups.get(phase.id) || [];
138
+ return {
139
+ id: phase.id,
140
+ title: phase.title,
141
+ status: phase.status,
142
+ wuCount: phaseWUs.length,
143
+ wus: phaseWUs.map((w) => ({ id: w.id, title: w.doc.title, status: w.doc.status })),
144
+ };
145
+ }),
146
+ workUnits: wus.map((w) => ({
147
+ id: w.id,
148
+ title: w.doc.title,
149
+ status: w.doc.status,
150
+ phase: w.doc.phase,
151
+ })),
152
+ successMetrics: doc.success_metrics || [],
153
+ labels: doc.labels || [],
154
+ };
155
+ console.log(JSON.stringify(output, null, 2));
156
+ }
157
+ function groupWUsByStatus(wus) {
158
+ const groups = {
159
+ [WU_STATUS.DONE]: [],
160
+ [WU_STATUS.IN_PROGRESS]: [],
161
+ [WU_STATUS.READY]: [],
162
+ [WU_STATUS.BLOCKED]: [],
163
+ other: [],
164
+ };
165
+ for (const wu of wus) {
166
+ const status = wu.doc.status;
167
+ if (groups[status]) {
168
+ groups[status].push(wu);
169
+ }
170
+ else {
171
+ groups.other.push(wu);
172
+ }
173
+ }
174
+ return groups;
175
+ }
176
+ function formatStatus(status, useColor) {
177
+ if (!useColor)
178
+ return status;
179
+ // Color support is opt-in, but we keep it simple for now
180
+ return status;
181
+ }
182
+ function truncate(str, maxLen) {
183
+ if (!str)
184
+ return '';
185
+ return str.length > maxLen ? `${str.substring(0, maxLen - 3)}...` : str;
186
+ }
187
+ function capitalizeFirst(str) {
188
+ return str.charAt(0).toUpperCase() + str.slice(1).replace(/_/g, ' ');
189
+ }
190
+ async function main() {
191
+ const args = createWUParser({
192
+ name: 'initiative-status',
193
+ description: 'Show detailed initiative view with phases and WUs',
194
+ options: [WU_OPTIONS.id, WU_OPTIONS.format, WU_OPTIONS.color],
195
+ required: [],
196
+ allowPositionalId: true,
197
+ });
198
+ const initRef = args.id;
199
+ if (!initRef) {
200
+ die('Initiative ID or slug is required.\n\nUsage: pnpm initiative:status INIT-001');
201
+ }
202
+ const initiative = findInitiative(initRef);
203
+ if (!initiative) {
204
+ die(`Initiative not found: ${initRef}\n\n` +
205
+ `Run 'pnpm initiative:list' to see available initiatives.`);
206
+ }
207
+ const format = args.format || OUTPUT_FORMATS.TABLE;
208
+ switch (format) {
209
+ case OUTPUT_FORMATS.JSON:
210
+ renderJSON(initiative);
211
+ break;
212
+ default:
213
+ renderDetailed(initiative, args.color);
214
+ break;
215
+ }
216
+ }
217
+ // Guard main() for testability (WU-1366)
218
+ import { fileURLToPath } from 'node:url';
219
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
220
+ main();
221
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initiative-status.js","sourceRoot":"","sources":["../src/initiative-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Memory Checkpoint CLI (WU-1467)
4
+ *
5
+ * Create a checkpoint node for context snapshots.
6
+ * Used before /clear or session handoff to preserve progress state.
7
+ *
8
+ * Includes audit logging to .beacon/telemetry/tools.ndjson.
9
+ *
10
+ * Usage:
11
+ * pnpm mem:checkpoint 'note' [--session <id>] [--wu <id>] [--progress <text>] [--next-steps <text>] [--trigger <type>] [--quiet]
12
+ *
13
+ * @see {@link tools/lib/mem-checkpoint-core.mjs} - Core logic
14
+ * @see {@link tools/__tests__/mem-checkpoint.test.mjs} - Tests
15
+ */
16
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-checkpoint.d.ts","sourceRoot":"","sources":["../src/mem-checkpoint.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG"}
@@ -0,0 +1,237 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Memory Checkpoint CLI (WU-1467)
4
+ *
5
+ * Create a checkpoint node for context snapshots.
6
+ * Used before /clear or session handoff to preserve progress state.
7
+ *
8
+ * Includes audit logging to .beacon/telemetry/tools.ndjson.
9
+ *
10
+ * Usage:
11
+ * pnpm mem:checkpoint 'note' [--session <id>] [--wu <id>] [--progress <text>] [--next-steps <text>] [--trigger <type>] [--quiet]
12
+ *
13
+ * @see {@link tools/lib/mem-checkpoint-core.mjs} - Core logic
14
+ * @see {@link tools/__tests__/mem-checkpoint.test.mjs} - Tests
15
+ */
16
+ import fs from 'node:fs/promises';
17
+ import path from 'node:path';
18
+ import { createCheckpoint } from '@lumenflow/memory/dist/mem-checkpoint-core.js';
19
+ import { createWUParser, WU_OPTIONS } from '@lumenflow/core/dist/arg-parser.js';
20
+ import { EXIT_CODES } from '@lumenflow/core/dist/wu-constants.js';
21
+ /**
22
+ * Log prefix for mem:checkpoint output
23
+ */
24
+ const LOG_PREFIX = '[mem:checkpoint]';
25
+ /**
26
+ * Tool name for audit logging
27
+ */
28
+ const TOOL_NAME = 'mem:checkpoint';
29
+ /**
30
+ * Audit log file path
31
+ */
32
+ const AUDIT_LOG_PATH = '.beacon/telemetry/tools.ndjson';
33
+ /**
34
+ * CLI argument options specific to mem:checkpoint
35
+ */
36
+ const CLI_OPTIONS = {
37
+ note: {
38
+ name: 'note',
39
+ flags: '-n, --note <text>',
40
+ description: 'Checkpoint note (required if not positional)',
41
+ },
42
+ session: {
43
+ name: 'session',
44
+ flags: '-s, --session <id>',
45
+ description: 'Session ID to link checkpoint to (UUID)',
46
+ },
47
+ progress: {
48
+ name: 'progress',
49
+ flags: '-p, --progress <text>',
50
+ description: 'Progress summary',
51
+ },
52
+ nextSteps: {
53
+ name: 'nextSteps',
54
+ flags: '--next-steps <text>',
55
+ description: 'Next steps description',
56
+ },
57
+ trigger: {
58
+ name: 'trigger',
59
+ flags: '-t, --trigger <type>',
60
+ description: 'Handoff trigger type (e.g., clear, handoff)',
61
+ },
62
+ baseDir: {
63
+ name: 'baseDir',
64
+ flags: '-d, --base-dir <path>',
65
+ description: 'Base directory (defaults to current directory)',
66
+ },
67
+ quiet: {
68
+ name: 'quiet',
69
+ flags: '-q, --quiet',
70
+ description: 'Suppress output except errors',
71
+ },
72
+ };
73
+ /**
74
+ * Write audit log entry for tool execution
75
+ *
76
+ * @param {string} baseDir - Base directory
77
+ * @param {object} entry - Audit log entry
78
+ */
79
+ async function writeAuditLog(baseDir, entry) {
80
+ try {
81
+ const logPath = path.join(baseDir, AUDIT_LOG_PATH);
82
+ const logDir = path.dirname(logPath);
83
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool creates known directory
84
+ await fs.mkdir(logDir, { recursive: true });
85
+ const line = `${JSON.stringify(entry)}\n`;
86
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool writes audit log
87
+ await fs.appendFile(logPath, line, 'utf-8');
88
+ }
89
+ catch {
90
+ // Audit logging is non-fatal - silently ignore errors
91
+ }
92
+ }
93
+ /**
94
+ * Parse CLI arguments and extract the note
95
+ *
96
+ * @returns {{args: object, note: string|undefined}} Parsed args and note
97
+ */
98
+ function parseArguments() {
99
+ const args = createWUParser({
100
+ name: 'mem-checkpoint',
101
+ description: 'Create a checkpoint node for context snapshots',
102
+ options: [
103
+ CLI_OPTIONS.note,
104
+ CLI_OPTIONS.session,
105
+ WU_OPTIONS.wu,
106
+ CLI_OPTIONS.progress,
107
+ CLI_OPTIONS.nextSteps,
108
+ CLI_OPTIONS.trigger,
109
+ CLI_OPTIONS.baseDir,
110
+ CLI_OPTIONS.quiet,
111
+ ],
112
+ required: [],
113
+ allowPositionalId: true,
114
+ });
115
+ let note = args.note;
116
+ if (!note && process.argv.length > 2) {
117
+ const positionalArgs = process.argv.slice(2).filter((arg) => !arg.startsWith('-'));
118
+ if (positionalArgs.length > 0) {
119
+ note = positionalArgs[0];
120
+ }
121
+ }
122
+ return { args, note };
123
+ }
124
+ /**
125
+ * Print checkpoint details to console
126
+ *
127
+ * @param {object} checkpoint - The checkpoint node
128
+ */
129
+ function printCheckpointDetails(checkpoint) {
130
+ console.log(`${LOG_PREFIX} Checkpoint created (${checkpoint.id})`);
131
+ console.log('');
132
+ console.log('Checkpoint Details:');
133
+ console.log(` ID: ${checkpoint.id}`);
134
+ console.log(` Type: ${checkpoint.type}`);
135
+ console.log(` Lifecycle: ${checkpoint.lifecycle}`);
136
+ console.log(` Created At: ${checkpoint.created_at}`);
137
+ if (checkpoint.wu_id) {
138
+ console.log(` WU: ${checkpoint.wu_id}`);
139
+ }
140
+ if (checkpoint.session_id) {
141
+ console.log(` Session: ${checkpoint.session_id}`);
142
+ }
143
+ console.log('');
144
+ console.log('Content:');
145
+ console.log(` ${checkpoint.content}`);
146
+ if (checkpoint.metadata) {
147
+ printMetadata(checkpoint.metadata);
148
+ }
149
+ console.log('');
150
+ }
151
+ /**
152
+ * Print metadata section to console
153
+ *
154
+ * @param {object} metadata - Checkpoint metadata
155
+ */
156
+ function printMetadata(metadata) {
157
+ console.log('');
158
+ console.log('Metadata:');
159
+ if (metadata.progress) {
160
+ console.log(` Progress: ${metadata.progress}`);
161
+ }
162
+ if (metadata.nextSteps) {
163
+ console.log(` Next Steps: ${metadata.nextSteps}`);
164
+ }
165
+ if (metadata.trigger) {
166
+ console.log(` Trigger: ${metadata.trigger}`);
167
+ }
168
+ }
169
+ /**
170
+ * Main CLI entry point
171
+ */
172
+ async function main() {
173
+ const { args, note } = parseArguments();
174
+ if (!note) {
175
+ console.error(`${LOG_PREFIX} Error: note is required`);
176
+ console.error('');
177
+ console.error("Usage: pnpm mem:checkpoint 'note' [options]");
178
+ console.error(" pnpm mem:checkpoint --note 'note' [options]");
179
+ process.exit(EXIT_CODES.ERROR);
180
+ }
181
+ const baseDir = args.baseDir || process.cwd();
182
+ const startedAt = new Date().toISOString();
183
+ const startTime = Date.now();
184
+ let result;
185
+ let error = null;
186
+ try {
187
+ result = await createCheckpoint(baseDir, {
188
+ note,
189
+ sessionId: args.session,
190
+ wuId: args.wu,
191
+ progress: args.progress,
192
+ nextSteps: args.nextSteps,
193
+ trigger: args.trigger,
194
+ });
195
+ }
196
+ catch (err) {
197
+ error = err.message;
198
+ }
199
+ const durationMs = Date.now() - startTime;
200
+ await writeAuditLog(baseDir, {
201
+ tool: TOOL_NAME,
202
+ status: error ? 'failed' : 'success',
203
+ startedAt,
204
+ completedAt: new Date().toISOString(),
205
+ durationMs,
206
+ input: {
207
+ baseDir,
208
+ note,
209
+ sessionId: args.session,
210
+ wuId: args.wu,
211
+ progress: args.progress,
212
+ nextSteps: args.nextSteps,
213
+ trigger: args.trigger,
214
+ },
215
+ output: result
216
+ ? {
217
+ success: result.success,
218
+ checkpointId: result.checkpoint?.id,
219
+ wuId: result.checkpoint?.wu_id,
220
+ }
221
+ : null,
222
+ error: error ? { message: error } : null,
223
+ });
224
+ if (error) {
225
+ console.error(`${LOG_PREFIX} Error: ${error}`);
226
+ process.exit(EXIT_CODES.ERROR);
227
+ }
228
+ if (args.quiet) {
229
+ console.log(result.checkpoint.id);
230
+ process.exit(EXIT_CODES.SUCCESS);
231
+ }
232
+ printCheckpointDetails(result.checkpoint);
233
+ }
234
+ main().catch((e) => {
235
+ console.error(`${LOG_PREFIX} ${e.message}`);
236
+ process.exit(EXIT_CODES.ERROR);
237
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-checkpoint.js","sourceRoot":"","sources":["../src/mem-checkpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Memory Cleanup CLI (WU-1472, WU-1554)
4
+ *
5
+ * Prune closed memory nodes based on lifecycle policy and TTL.
6
+ * Implements compaction to prevent memory bloat.
7
+ *
8
+ * Features:
9
+ * - Remove ephemeral nodes (always discarded)
10
+ * - Remove session nodes when session is closed
11
+ * - Archive summarized nodes (marked with summarized_into)
12
+ * - Respect sensitive:true flag for stricter retention
13
+ * - Support dry-run mode for preview
14
+ * - Report compaction metrics (ratio, bytes freed)
15
+ * - WU-1554: TTL-based expiration (e.g., --ttl 30d)
16
+ * - WU-1554: Active session protection (never removed)
17
+ *
18
+ * Usage:
19
+ * pnpm mem:cleanup # Cleanup based on lifecycle policy
20
+ * pnpm mem:cleanup --dry-run # Preview without changes
21
+ * pnpm mem:cleanup --ttl 30d # Remove nodes older than 30 days
22
+ * pnpm mem:cleanup --ttl 7d --dry-run # Preview TTL cleanup
23
+ * pnpm mem:cleanup --session-id <uuid> # Close specific session
24
+ * pnpm mem:cleanup --json # Output as JSON
25
+ *
26
+ * @see {@link tools/lib/mem-cleanup-core.mjs} - Core logic
27
+ * @see {@link tools/__tests__/mem-cleanup.test.mjs} - Tests
28
+ */
29
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-cleanup.d.ts","sourceRoot":"","sources":["../src/mem-cleanup.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG"}