@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 @@
1
+ {"version":3,"file":"mem-summarize.d.ts","sourceRoot":"","sources":["../src/mem-summarize.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG"}
@@ -0,0 +1,213 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Memory Summarize CLI (WU-1471)
4
+ *
5
+ * Rollup older memory nodes into summary nodes for compaction.
6
+ * Implements forgetting as first-class feature.
7
+ *
8
+ * Features:
9
+ * - Aggregate checkpoint/note/discovery nodes into summaries
10
+ * - Mark originals for cleanup after summary creation
11
+ * - Respect lifecycle TTL (ephemeral, session, wu, project)
12
+ * - Support dry-run mode for preview
13
+ *
14
+ * Usage:
15
+ * pnpm mem:summarize --wu WU-1234 # Create summary from WU nodes
16
+ * pnpm mem:summarize --wu WU-1234 --dry-run # Preview without changes
17
+ * pnpm mem:summarize --wu WU-1234 --json # Output as JSON
18
+ *
19
+ * @see {@link tools/lib/mem-summarize-core.mjs} - Core logic
20
+ * @see {@link tools/__tests__/mem-summarize.test.mjs} - Tests
21
+ */
22
+ import fs from 'node:fs/promises';
23
+ import path from 'node:path';
24
+ import { summarizeWu } from '@lumenflow/memory/dist/mem-summarize-core.js';
25
+ import { createWUParser } from '@lumenflow/core/dist/arg-parser.js';
26
+ import { EXIT_CODES } from '@lumenflow/core/dist/wu-constants.js';
27
+ /**
28
+ * Log prefix for mem:summarize output
29
+ */
30
+ const LOG_PREFIX = '[mem:summarize]';
31
+ /**
32
+ * Tool name for audit logging
33
+ */
34
+ const TOOL_NAME = 'mem:summarize';
35
+ /**
36
+ * Audit log file path
37
+ */
38
+ const AUDIT_LOG_PATH = '.beacon/telemetry/tools.ndjson';
39
+ /**
40
+ * CLI argument options specific to mem:summarize
41
+ */
42
+ const CLI_OPTIONS = {
43
+ wu: {
44
+ name: 'wu',
45
+ flags: '--wu <id>',
46
+ description: 'WU ID to summarize (e.g., WU-1234)',
47
+ },
48
+ dryRun: {
49
+ name: 'dryRun',
50
+ flags: '--dry-run',
51
+ description: 'Preview summary without making changes',
52
+ },
53
+ json: {
54
+ name: 'json',
55
+ flags: '--json',
56
+ description: 'Output as JSON',
57
+ },
58
+ quiet: {
59
+ name: 'quiet',
60
+ flags: '-q, --quiet',
61
+ description: 'Suppress output except errors',
62
+ },
63
+ baseDir: {
64
+ name: 'baseDir',
65
+ flags: '-b, --base-dir <path>',
66
+ description: 'Base directory (defaults to current directory)',
67
+ },
68
+ };
69
+ /**
70
+ * Write audit log entry for tool execution
71
+ *
72
+ * @param {string} baseDir - Base directory
73
+ * @param {object} entry - Audit log entry
74
+ */
75
+ async function writeAuditLog(baseDir, entry) {
76
+ try {
77
+ const logPath = path.join(baseDir, AUDIT_LOG_PATH);
78
+ const logDir = path.dirname(logPath);
79
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool creates known directory
80
+ await fs.mkdir(logDir, { recursive: true });
81
+ const line = `${JSON.stringify(entry)}\n`;
82
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool writes audit log
83
+ await fs.appendFile(logPath, line, 'utf-8');
84
+ }
85
+ catch {
86
+ // Audit logging is non-fatal - silently ignore errors
87
+ }
88
+ }
89
+ /**
90
+ * Parse CLI arguments
91
+ *
92
+ * @returns {object} Parsed arguments
93
+ */
94
+ function parseArguments() {
95
+ return createWUParser({
96
+ name: 'mem-summarize',
97
+ description: 'Rollup older memory nodes into summary nodes for compaction',
98
+ options: [
99
+ CLI_OPTIONS.wu,
100
+ CLI_OPTIONS.dryRun,
101
+ CLI_OPTIONS.json,
102
+ CLI_OPTIONS.quiet,
103
+ CLI_OPTIONS.baseDir,
104
+ ],
105
+ required: ['wu'],
106
+ allowPositionalId: false,
107
+ });
108
+ }
109
+ /**
110
+ * Print summary result to console
111
+ *
112
+ * @param {object} result - Summarization result
113
+ * @param {boolean} quiet - Suppress verbose output
114
+ */
115
+ function printResult(result, quiet) {
116
+ if (result.dryRun) {
117
+ console.log(`${LOG_PREFIX} Dry-run: Would create summary with:`);
118
+ }
119
+ else {
120
+ console.log(`${LOG_PREFIX} ✅ Summary created`);
121
+ }
122
+ if (quiet) {
123
+ console.log(result.summary.id);
124
+ return;
125
+ }
126
+ console.log('');
127
+ console.log('Summary Node:');
128
+ console.log(` ID: ${result.summary.id}`);
129
+ console.log(` Type: ${result.summary.type}`);
130
+ console.log(` Lifecycle: ${result.summary.lifecycle}`);
131
+ console.log(` WU: ${result.summary.wu_id}`);
132
+ console.log(` Created At: ${result.summary.created_at}`);
133
+ console.log('');
134
+ console.log('Metrics:');
135
+ console.log(` Source Nodes: ${result.summary.metadata.source_count}`);
136
+ console.log(` Marked Cleanup: ${result.markedForCleanup.length}`);
137
+ console.log(` Compaction Ratio: ${result.compactionRatio}:1`);
138
+ if (result.markedForCleanup.length > 0) {
139
+ console.log('');
140
+ console.log('Marked for Cleanup:');
141
+ for (const nodeId of result.markedForCleanup.slice(0, 10)) {
142
+ console.log(` - ${nodeId}`);
143
+ }
144
+ if (result.markedForCleanup.length > 10) {
145
+ console.log(` ... and ${result.markedForCleanup.length - 10} more`);
146
+ }
147
+ }
148
+ console.log('');
149
+ console.log('Content Preview:');
150
+ const preview = result.summary.content.slice(0, 200);
151
+ console.log(` ${preview}${result.summary.content.length > 200 ? '...' : ''}`);
152
+ if (result.dryRun) {
153
+ console.log('');
154
+ console.log('To execute, run without --dry-run');
155
+ }
156
+ }
157
+ /**
158
+ * Main CLI entry point
159
+ */
160
+ async function main() {
161
+ const args = parseArguments();
162
+ const baseDir = args.baseDir || process.cwd();
163
+ const startedAt = new Date().toISOString();
164
+ const startTime = Date.now();
165
+ let result = null;
166
+ let error = null;
167
+ try {
168
+ result = await summarizeWu(baseDir, {
169
+ wuId: args.wu,
170
+ dryRun: args.dryRun,
171
+ });
172
+ }
173
+ catch (err) {
174
+ error = err.message;
175
+ }
176
+ const durationMs = Date.now() - startTime;
177
+ await writeAuditLog(baseDir, {
178
+ tool: TOOL_NAME,
179
+ status: error ? 'failed' : 'success',
180
+ startedAt,
181
+ completedAt: new Date().toISOString(),
182
+ durationMs,
183
+ input: {
184
+ baseDir,
185
+ wuId: args.wu,
186
+ dryRun: args.dryRun,
187
+ },
188
+ output: result
189
+ ? {
190
+ success: result.success,
191
+ summaryId: result.summary?.id,
192
+ sourceCount: result.summary?.metadata?.source_count,
193
+ markedForCleanup: result.markedForCleanup?.length,
194
+ compactionRatio: result.compactionRatio,
195
+ dryRun: result.dryRun,
196
+ }
197
+ : null,
198
+ error: error ? { message: error } : null,
199
+ });
200
+ if (error) {
201
+ console.error(`${LOG_PREFIX} Error: ${error}`);
202
+ process.exit(EXIT_CODES.ERROR);
203
+ }
204
+ if (args.json) {
205
+ console.log(JSON.stringify(result, null, 2));
206
+ process.exit(EXIT_CODES.SUCCESS);
207
+ }
208
+ printResult(result, args.quiet);
209
+ }
210
+ main().catch((e) => {
211
+ console.error(`${LOG_PREFIX} ${e.message}`);
212
+ process.exit(EXIT_CODES.ERROR);
213
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-summarize.js","sourceRoot":"","sources":["../src/mem-summarize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Memory Triage CLI (WU-1470)
4
+ *
5
+ * Review discovery nodes and promote to WUs or archive.
6
+ *
7
+ * Features:
8
+ * - List open discovery nodes
9
+ * - Promote discovery to WU (integrates with wu:create)
10
+ * - Archive discovery without promotion
11
+ * - Interactive mode for human review
12
+ *
13
+ * Usage:
14
+ * pnpm mem:triage # List open discoveries
15
+ * pnpm mem:triage --wu WU-1234 # List discoveries for specific WU
16
+ * pnpm mem:triage --promote mem-aaa1 --lane "Operations: Tooling"
17
+ * pnpm mem:triage --archive mem-aaa1 --reason "Duplicate"
18
+ *
19
+ * @see {@link tools/lib/mem-triage-core.mjs} - Core logic
20
+ * @see {@link tools/__tests__/mem-triage.test.mjs} - Tests
21
+ */
22
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-triage.d.ts","sourceRoot":"","sources":["../src/mem-triage.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG"}
@@ -0,0 +1,328 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Memory Triage CLI (WU-1470)
4
+ *
5
+ * Review discovery nodes and promote to WUs or archive.
6
+ *
7
+ * Features:
8
+ * - List open discovery nodes
9
+ * - Promote discovery to WU (integrates with wu:create)
10
+ * - Archive discovery without promotion
11
+ * - Interactive mode for human review
12
+ *
13
+ * Usage:
14
+ * pnpm mem:triage # List open discoveries
15
+ * pnpm mem:triage --wu WU-1234 # List discoveries for specific WU
16
+ * pnpm mem:triage --promote mem-aaa1 --lane "Operations: Tooling"
17
+ * pnpm mem:triage --archive mem-aaa1 --reason "Duplicate"
18
+ *
19
+ * @see {@link tools/lib/mem-triage-core.mjs} - Core logic
20
+ * @see {@link tools/__tests__/mem-triage.test.mjs} - Tests
21
+ */
22
+ import fs from 'node:fs/promises';
23
+ import path from 'node:path';
24
+ import { listOpenDiscoveries, promoteDiscovery, archiveDiscovery, } from '@lumenflow/memory/dist/mem-triage-core.js';
25
+ import { createWUParser } from '@lumenflow/core/dist/arg-parser.js';
26
+ import { EXIT_CODES } from '@lumenflow/core/dist/wu-constants.js';
27
+ /**
28
+ * Log prefix for mem:triage output
29
+ */
30
+ const LOG_PREFIX = '[mem:triage]';
31
+ /**
32
+ * Tool name for audit logging
33
+ */
34
+ const TOOL_NAME = 'mem:triage';
35
+ /**
36
+ * Audit log file path
37
+ */
38
+ const AUDIT_LOG_PATH = '.beacon/telemetry/tools.ndjson';
39
+ /**
40
+ * CLI argument options specific to mem:triage
41
+ */
42
+ const CLI_OPTIONS = {
43
+ list: {
44
+ name: 'list',
45
+ flags: '-l, --list',
46
+ description: 'List open discoveries (default action)',
47
+ },
48
+ promote: {
49
+ name: 'promote',
50
+ flags: '-p, --promote <nodeId>',
51
+ description: 'Promote discovery to WU (mem-XXXX format)',
52
+ },
53
+ archive: {
54
+ name: 'archive',
55
+ flags: '-a, --archive <nodeId>',
56
+ description: 'Archive discovery without promotion (mem-XXXX format)',
57
+ },
58
+ reason: {
59
+ name: 'reason',
60
+ flags: '-r, --reason <text>',
61
+ description: 'Reason for archiving (required with --archive)',
62
+ },
63
+ title: {
64
+ name: 'title',
65
+ flags: '--title <text>',
66
+ description: 'Custom title for promoted WU (optional)',
67
+ },
68
+ lane: {
69
+ name: 'lane',
70
+ flags: '--lane <lane>',
71
+ description: 'Lane for promoted WU (required with --promote)',
72
+ },
73
+ wuId: {
74
+ name: 'wuId',
75
+ flags: '--wu-id <id>',
76
+ description: 'Explicit WU ID for promotion (optional)',
77
+ },
78
+ filterWu: {
79
+ name: 'filterWu',
80
+ flags: '--wu <id>',
81
+ description: 'Filter discoveries by WU ID (or "unlinked")',
82
+ },
83
+ filterTag: {
84
+ name: 'filterTag',
85
+ flags: '--tag <tag>',
86
+ description: 'Filter discoveries by tag',
87
+ },
88
+ dryRun: {
89
+ name: 'dryRun',
90
+ flags: '--dry-run',
91
+ description: 'Preview promotion without creating WU',
92
+ },
93
+ json: {
94
+ name: 'json',
95
+ flags: '--json',
96
+ description: 'Output as JSON',
97
+ },
98
+ quiet: {
99
+ name: 'quiet',
100
+ flags: '-q, --quiet',
101
+ description: 'Suppress output except errors',
102
+ },
103
+ };
104
+ /**
105
+ * Write audit log entry for tool execution
106
+ *
107
+ * @param {string} baseDir - Base directory
108
+ * @param {object} entry - Audit log entry
109
+ */
110
+ async function writeAuditLog(baseDir, entry) {
111
+ try {
112
+ const logPath = path.join(baseDir, AUDIT_LOG_PATH);
113
+ const logDir = path.dirname(logPath);
114
+ await fs.mkdir(logDir, { recursive: true });
115
+ const line = `${JSON.stringify(entry)}\n`;
116
+ await fs.appendFile(logPath, line, 'utf-8');
117
+ }
118
+ catch {
119
+ // Audit logging is non-fatal - silently ignore errors
120
+ }
121
+ }
122
+ /**
123
+ * Format a discovery node for display
124
+ *
125
+ * @param {object} node - Discovery node
126
+ * @returns {string} Formatted display string
127
+ */
128
+ function formatDiscovery(node) {
129
+ const parts = [];
130
+ parts.push(` ${node.id}`);
131
+ if (node.metadata?.priority) {
132
+ parts.push(`[${node.metadata.priority}]`);
133
+ }
134
+ if (node.wu_id) {
135
+ parts.push(`(${node.wu_id})`);
136
+ }
137
+ parts.push('-');
138
+ parts.push(node.content.substring(0, 60) + (node.content.length > 60 ? '...' : ''));
139
+ return parts.join(' ');
140
+ }
141
+ async function handleList(baseDir, args) {
142
+ const options = {};
143
+ if (args.filterWu) {
144
+ options.wuId = args.filterWu;
145
+ }
146
+ if (args.filterTag) {
147
+ options.tag = args.filterTag;
148
+ }
149
+ const discoveries = await listOpenDiscoveries(baseDir, options);
150
+ if (args.json) {
151
+ console.log(JSON.stringify(discoveries, null, 2));
152
+ return { success: true, count: discoveries.length };
153
+ }
154
+ if (discoveries.length === 0) {
155
+ if (!args.quiet) {
156
+ console.log(`${LOG_PREFIX} No open discoveries found.`);
157
+ }
158
+ return { success: true, count: 0 };
159
+ }
160
+ console.log(`${LOG_PREFIX} ${discoveries.length} open discovery(ies):`);
161
+ console.log('');
162
+ for (const node of discoveries) {
163
+ console.log(formatDiscovery(node));
164
+ }
165
+ console.log('');
166
+ console.log('Actions:');
167
+ console.log(' pnpm mem:triage --promote <nodeId> --lane "<lane>" # Promote to WU');
168
+ console.log(' pnpm mem:triage --archive <nodeId> --reason "..." # Archive');
169
+ return { success: true, count: discoveries.length };
170
+ }
171
+ /**
172
+ * Handle promote command
173
+ *
174
+ * @param {string} baseDir - Base directory
175
+ * @param {object} args - CLI arguments
176
+ */
177
+ async function handlePromote(baseDir, args) {
178
+ if (!args.lane) {
179
+ console.error(`${LOG_PREFIX} Error: --lane is required for promotion`);
180
+ console.error('');
181
+ console.error('Usage: pnpm mem:triage --promote mem-XXXX --lane "Operations: Tooling"');
182
+ process.exit(EXIT_CODES.ERROR);
183
+ }
184
+ const result = await promoteDiscovery(baseDir, {
185
+ nodeId: args.promote,
186
+ lane: args.lane,
187
+ title: args.title,
188
+ wuId: args.wuId,
189
+ dryRun: args.dryRun,
190
+ });
191
+ if (args.json) {
192
+ console.log(JSON.stringify(result, null, 2));
193
+ return result;
194
+ }
195
+ if (args.dryRun) {
196
+ console.log(`${LOG_PREFIX} Dry-run: Would create WU with:`);
197
+ console.log('');
198
+ console.log(` ID: ${result.wuSpec.id}`);
199
+ console.log(` Title: ${result.wuSpec.title}`);
200
+ console.log(` Lane: ${result.wuSpec.lane}`);
201
+ console.log(` Priority: ${result.wuSpec.priority}`);
202
+ console.log(` Notes: ${result.wuSpec.notes}`);
203
+ console.log('');
204
+ console.log('To execute, run without --dry-run');
205
+ return result;
206
+ }
207
+ console.log(`${LOG_PREFIX} ✅ Promotion spec generated:`);
208
+ console.log('');
209
+ console.log(` ID: ${result.wuSpec.id}`);
210
+ console.log(` Title: ${result.wuSpec.title}`);
211
+ console.log(` Lane: ${result.wuSpec.lane}`);
212
+ console.log(` Priority: ${result.wuSpec.priority}`);
213
+ console.log('');
214
+ console.log('Next: To create the WU, run:');
215
+ console.log(` pnpm wu:create --id ${result.wuSpec.id} --lane "${result.wuSpec.lane}" --title "${result.wuSpec.title}" --priority ${result.wuSpec.priority}`);
216
+ return result;
217
+ }
218
+ /**
219
+ * Handle archive command
220
+ *
221
+ * @param {string} baseDir - Base directory
222
+ * @param {object} args - CLI arguments
223
+ */
224
+ async function handleArchive(baseDir, args) {
225
+ if (!args.reason) {
226
+ console.error(`${LOG_PREFIX} Error: --reason is required for archiving`);
227
+ console.error('');
228
+ console.error('Usage: pnpm mem:triage --archive mem-XXXX --reason "Duplicate of WU-1234"');
229
+ process.exit(EXIT_CODES.ERROR);
230
+ }
231
+ const result = await archiveDiscovery(baseDir, {
232
+ nodeId: args.archive,
233
+ reason: args.reason,
234
+ });
235
+ if (args.json) {
236
+ console.log(JSON.stringify(result, null, 2));
237
+ return result;
238
+ }
239
+ if (!args.quiet) {
240
+ console.log(`${LOG_PREFIX} ✅ Archived ${result.nodeId}`);
241
+ console.log(` Reason: ${args.reason}`);
242
+ }
243
+ return result;
244
+ }
245
+ /**
246
+ * Parse CLI arguments
247
+ *
248
+ * @returns {object} Parsed arguments
249
+ */
250
+ function parseArguments() {
251
+ return createWUParser({
252
+ name: 'mem-triage',
253
+ description: 'Review discovery nodes and promote to WUs or archive',
254
+ options: [
255
+ CLI_OPTIONS.list,
256
+ CLI_OPTIONS.promote,
257
+ CLI_OPTIONS.archive,
258
+ CLI_OPTIONS.reason,
259
+ CLI_OPTIONS.title,
260
+ CLI_OPTIONS.lane,
261
+ CLI_OPTIONS.wuId,
262
+ CLI_OPTIONS.filterWu,
263
+ CLI_OPTIONS.filterTag,
264
+ CLI_OPTIONS.dryRun,
265
+ CLI_OPTIONS.json,
266
+ CLI_OPTIONS.quiet,
267
+ ],
268
+ required: [],
269
+ allowPositionalId: false,
270
+ });
271
+ }
272
+ /**
273
+ * Main CLI entry point
274
+ */
275
+ async function main() {
276
+ const args = parseArguments();
277
+ const baseDir = process.cwd();
278
+ const startedAt = new Date().toISOString();
279
+ const startTime = Date.now();
280
+ let result = null;
281
+ let error = null;
282
+ let action = 'list';
283
+ try {
284
+ if (args.promote) {
285
+ action = 'promote';
286
+ result = await handlePromote(baseDir, args);
287
+ }
288
+ else if (args.archive) {
289
+ action = 'archive';
290
+ result = await handleArchive(baseDir, args);
291
+ }
292
+ else {
293
+ action = 'list';
294
+ result = await handleList(baseDir, args);
295
+ }
296
+ }
297
+ catch (err) {
298
+ error = err.message;
299
+ console.error(`${LOG_PREFIX} Error: ${error}`);
300
+ process.exit(EXIT_CODES.ERROR);
301
+ }
302
+ const durationMs = Date.now() - startTime;
303
+ await writeAuditLog(baseDir, {
304
+ tool: TOOL_NAME,
305
+ action,
306
+ status: error ? 'failed' : 'success',
307
+ startedAt,
308
+ completedAt: new Date().toISOString(),
309
+ durationMs,
310
+ input: {
311
+ baseDir,
312
+ action,
313
+ nodeId: args.promote || args.archive,
314
+ lane: args.lane,
315
+ reason: args.reason,
316
+ wuId: args.wuId,
317
+ filterWu: args.filterWu,
318
+ filterTag: args.filterTag,
319
+ dryRun: args.dryRun,
320
+ },
321
+ output: result,
322
+ error: error ? { message: error } : null,
323
+ });
324
+ }
325
+ main().catch((e) => {
326
+ console.error(`${LOG_PREFIX} ${e.message}`);
327
+ process.exit(EXIT_CODES.ERROR);
328
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-triage.js","sourceRoot":"","sources":["../src/mem-triage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Spawn List Command (WU-1950)
4
+ *
5
+ * Displays spawn trees for WUs or initiatives.
6
+ * Shows parent-child relationships with status indicators.
7
+ *
8
+ * Usage:
9
+ * pnpm spawn:list --wu WU-XXX # Spawns for a specific WU
10
+ * pnpm spawn:list --initiative INIT-XXX # All spawns in an initiative
11
+ * pnpm spawn:list --json # JSON output
12
+ *
13
+ * @see {@link tools/lib/spawn-tree.mjs} - Tree builder
14
+ * @see {@link tools/__tests__/spawn-list.test.mjs} - Tests
15
+ */
16
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-list.d.ts","sourceRoot":"","sources":["../src/spawn-list.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG"}