@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.
- package/LICENSE +190 -0
- package/README.md +116 -0
- package/dist/gates.d.ts +41 -0
- package/dist/gates.d.ts.map +1 -0
- package/dist/gates.js +684 -0
- package/dist/gates.js.map +1 -0
- package/dist/initiative-add-wu.d.ts +22 -0
- package/dist/initiative-add-wu.d.ts.map +1 -0
- package/dist/initiative-add-wu.js +234 -0
- package/dist/initiative-add-wu.js.map +1 -0
- package/dist/initiative-create.d.ts +28 -0
- package/dist/initiative-create.d.ts.map +1 -0
- package/dist/initiative-create.js +172 -0
- package/dist/initiative-create.js.map +1 -0
- package/dist/initiative-edit.d.ts +34 -0
- package/dist/initiative-edit.d.ts.map +1 -0
- package/dist/initiative-edit.js +440 -0
- package/dist/initiative-edit.js.map +1 -0
- package/dist/initiative-list.d.ts +12 -0
- package/dist/initiative-list.d.ts.map +1 -0
- package/dist/initiative-list.js +101 -0
- package/dist/initiative-list.js.map +1 -0
- package/dist/initiative-status.d.ts +11 -0
- package/dist/initiative-status.d.ts.map +1 -0
- package/dist/initiative-status.js +221 -0
- package/dist/initiative-status.js.map +1 -0
- package/dist/mem-checkpoint.d.ts +16 -0
- package/dist/mem-checkpoint.d.ts.map +1 -0
- package/dist/mem-checkpoint.js +237 -0
- package/dist/mem-checkpoint.js.map +1 -0
- package/dist/mem-cleanup.d.ts +29 -0
- package/dist/mem-cleanup.d.ts.map +1 -0
- package/dist/mem-cleanup.js +267 -0
- package/dist/mem-cleanup.js.map +1 -0
- package/dist/mem-create.d.ts +17 -0
- package/dist/mem-create.d.ts.map +1 -0
- package/dist/mem-create.js +265 -0
- package/dist/mem-create.js.map +1 -0
- package/dist/mem-inbox.d.ts +35 -0
- package/dist/mem-inbox.d.ts.map +1 -0
- package/dist/mem-inbox.js +373 -0
- package/dist/mem-inbox.js.map +1 -0
- package/dist/mem-init.d.ts +15 -0
- package/dist/mem-init.d.ts.map +1 -0
- package/dist/mem-init.js +146 -0
- package/dist/mem-init.js.map +1 -0
- package/dist/mem-ready.d.ts +16 -0
- package/dist/mem-ready.d.ts.map +1 -0
- package/dist/mem-ready.js +224 -0
- package/dist/mem-ready.js.map +1 -0
- package/dist/mem-signal.d.ts +16 -0
- package/dist/mem-signal.d.ts.map +1 -0
- package/dist/mem-signal.js +204 -0
- package/dist/mem-signal.js.map +1 -0
- package/dist/mem-start.d.ts +16 -0
- package/dist/mem-start.d.ts.map +1 -0
- package/dist/mem-start.js +158 -0
- package/dist/mem-start.js.map +1 -0
- package/dist/mem-summarize.d.ts +22 -0
- package/dist/mem-summarize.d.ts.map +1 -0
- package/dist/mem-summarize.js +213 -0
- package/dist/mem-summarize.js.map +1 -0
- package/dist/mem-triage.d.ts +22 -0
- package/dist/mem-triage.d.ts.map +1 -0
- package/dist/mem-triage.js +328 -0
- package/dist/mem-triage.js.map +1 -0
- package/dist/spawn-list.d.ts +16 -0
- package/dist/spawn-list.d.ts.map +1 -0
- package/dist/spawn-list.js +140 -0
- package/dist/spawn-list.js.map +1 -0
- package/dist/wu-block.d.ts +16 -0
- package/dist/wu-block.d.ts.map +1 -0
- package/dist/wu-block.js +241 -0
- package/dist/wu-block.js.map +1 -0
- package/dist/wu-claim.d.ts +32 -0
- package/dist/wu-claim.d.ts.map +1 -0
- package/dist/wu-claim.js +1106 -0
- package/dist/wu-claim.js.map +1 -0
- package/dist/wu-cleanup.d.ts +17 -0
- package/dist/wu-cleanup.d.ts.map +1 -0
- package/dist/wu-cleanup.js +194 -0
- package/dist/wu-cleanup.js.map +1 -0
- package/dist/wu-create.d.ts +38 -0
- package/dist/wu-create.d.ts.map +1 -0
- package/dist/wu-create.js +520 -0
- package/dist/wu-create.js.map +1 -0
- package/dist/wu-deps.d.ts +13 -0
- package/dist/wu-deps.d.ts.map +1 -0
- package/dist/wu-deps.js +119 -0
- package/dist/wu-deps.js.map +1 -0
- package/dist/wu-done.d.ts +153 -0
- package/dist/wu-done.d.ts.map +1 -0
- package/dist/wu-done.js +2096 -0
- package/dist/wu-done.js.map +1 -0
- package/dist/wu-edit.d.ts +29 -0
- package/dist/wu-edit.d.ts.map +1 -0
- package/dist/wu-edit.js +852 -0
- package/dist/wu-edit.js.map +1 -0
- package/dist/wu-infer-lane.d.ts +17 -0
- package/dist/wu-infer-lane.d.ts.map +1 -0
- package/dist/wu-infer-lane.js +135 -0
- package/dist/wu-infer-lane.js.map +1 -0
- package/dist/wu-preflight.d.ts +47 -0
- package/dist/wu-preflight.d.ts.map +1 -0
- package/dist/wu-preflight.js +167 -0
- package/dist/wu-preflight.js.map +1 -0
- package/dist/wu-prune.d.ts +16 -0
- package/dist/wu-prune.d.ts.map +1 -0
- package/dist/wu-prune.js +259 -0
- package/dist/wu-prune.js.map +1 -0
- package/dist/wu-repair.d.ts +60 -0
- package/dist/wu-repair.d.ts.map +1 -0
- package/dist/wu-repair.js +226 -0
- package/dist/wu-repair.js.map +1 -0
- package/dist/wu-spawn-completion.d.ts +10 -0
- package/dist/wu-spawn-completion.js +30 -0
- package/dist/wu-spawn.d.ts +168 -0
- package/dist/wu-spawn.d.ts.map +1 -0
- package/dist/wu-spawn.js +1327 -0
- package/dist/wu-spawn.js.map +1 -0
- package/dist/wu-unblock.d.ts +16 -0
- package/dist/wu-unblock.d.ts.map +1 -0
- package/dist/wu-unblock.js +234 -0
- package/dist/wu-unblock.js.map +1 -0
- package/dist/wu-validate.d.ts +16 -0
- package/dist/wu-validate.d.ts.map +1 -0
- package/dist/wu-validate.js +193 -0
- package/dist/wu-validate.js.map +1 -0
- 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":";AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAEjE;;GAEG;AACH,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAErC;;GAEG;AACH,MAAM,SAAS,GAAG,eAAe,CAAC;AAElC;;GAEG;AACH,MAAM,cAAc,GAAG,gCAAgC,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE;QACF,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,oCAAoC;KAClD;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,wCAAwC;KACtD;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,gBAAgB;KAC9B;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,+BAA+B;KAC7C;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,gDAAgD;KAC9D;CACF,CAAC;AAEF;;;;;GAKG;AACH,KAAK,UAAU,aAAa,CAAC,OAAO,EAAE,KAAK;IACzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAErC,uGAAuG;QACvG,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;QAC1C,gGAAgG;QAChG,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc;IACrB,OAAO,cAAc,CAAC;QACpB,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,6DAA6D;QAC1E,OAAO,EAAE;YACP,WAAW,CAAC,EAAE;YACd,WAAW,CAAC,MAAM;YAClB,WAAW,CAAC,IAAI;YAChB,WAAW,CAAC,KAAK;YACjB,WAAW,CAAC,OAAO;SACpB;QACD,QAAQ,EAAE,CAAC,IAAI,CAAC;QAChB,iBAAiB,EAAE,KAAK;KACzB,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,MAAM,EAAE,KAAK;IAChC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,sCAAsC,CAAC,CAAC;IACnE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,oBAAoB,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAE3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC;IAE/D,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE/E,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,KAAK,GAAG,IAAI,CAAC;IAEjB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE;YAClC,IAAI,EAAE,IAAI,CAAC,EAAE;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAE1C,MAAM,aAAa,CAAC,OAAO,EAAE;QAC3B,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QACpC,SAAS;QACT,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,UAAU;QACV,KAAK,EAAE;YACL,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,EAAE;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB;QACD,MAAM,EAAE,MAAM;YACZ,CAAC,CAAC;gBACE,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE;gBAC7B,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY;gBACnD,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM;gBACjD,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB;YACH,CAAC,CAAC,IAAI;QACR,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI;KACzC,CAAC,CAAC;IAEH,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,WAAW,KAAK,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC"}
|
|
@@ -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":";AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AACnH,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAEjE;;GAEG;AACH,MAAM,UAAU,GAAG,cAAc,CAAC;AAElC;;GAEG;AACH,MAAM,SAAS,GAAG,YAAY,CAAC;AAE/B;;GAEG;AACH,MAAM,cAAc,GAAG,gCAAgC,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,wCAAwC;KACtD;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,2CAA2C;KACzD;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,uDAAuD;KACrE;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,gDAAgD;KAC9D;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,yCAAyC;KACvD;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,gDAAgD;KAC9D;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,yCAAyC;KACvD;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,6CAA6C;KAC3D;IACD,SAAS,EAAE;QACT,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,2BAA2B;KACzC;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,uCAAuC;KACrD;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,gBAAgB;KAC9B;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,+BAA+B;KAC7C;CACF,CAAC;AAEF;;;;;GAKG;AACH,KAAK,UAAU,aAAa,CAAC,OAAO,EAAE,KAAK;IACzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAErC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;QAC1C,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,IAAI;IAC3B,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAE3B,IAAI,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpF,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,UAAU,CAAC,OAAO,EAAE,IAAI;IACrC,MAAM,OAAO,GAAG,EAAE,CAAC;IAEnB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;IAC/B,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEhE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;IACtD,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,6BAA6B,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,IAAI,WAAW,CAAC,MAAM,uBAAuB,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAE9E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;AACtD,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,aAAa,CAAC,OAAO,EAAE,IAAI;IACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,0CAA0C,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE;QAC7C,MAAM,EAAE,IAAI,CAAC,OAAO;QACpB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,iCAAiC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,8BAA8B,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,MAAM,CAAC,MAAM,CAAC,IAAI,cAAc,MAAM,CAAC,MAAM,CAAC,KAAK,gBAAgB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE9J,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,aAAa,CAAC,OAAO,EAAE,IAAI;IACxC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,4CAA4C,CAAC,CAAC;QACzE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,2EAA2E,CAAC,CAAC;QAC3F,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE;QAC7C,MAAM,EAAE,IAAI,CAAC,OAAO;QACpB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc;IACrB,OAAO,cAAc,CAAC;QACpB,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,sDAAsD;QACnE,OAAO,EAAE;YACP,WAAW,CAAC,IAAI;YAChB,WAAW,CAAC,OAAO;YACnB,WAAW,CAAC,OAAO;YACnB,WAAW,CAAC,MAAM;YAClB,WAAW,CAAC,KAAK;YACjB,WAAW,CAAC,IAAI;YAChB,WAAW,CAAC,IAAI;YAChB,WAAW,CAAC,QAAQ;YACpB,WAAW,CAAC,SAAS;YACrB,WAAW,CAAC,MAAM;YAClB,WAAW,CAAC,IAAI;YAChB,WAAW,CAAC,KAAK;SAClB;QACD,QAAQ,EAAE,EAAE;QACZ,iBAAiB,EAAE,KAAK;KACzB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,IAAI,MAAM,GAAG,MAAM,CAAC;IAEpB,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,GAAG,SAAS,CAAC;YACnB,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,GAAG,SAAS,CAAC;YACnB,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,CAAC;YAChB,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,WAAW,KAAK,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAE1C,MAAM,aAAa,CAAC,OAAO,EAAE;QAC3B,IAAI,EAAE,SAAS;QACf,MAAM;QACN,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QACpC,SAAS;QACT,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,UAAU;QACV,KAAK,EAAE;YACL,OAAO;YACP,MAAM;YACN,MAAM,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;YACpC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB;QACD,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI;KACzC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC"}
|
|
@@ -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"}
|