@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,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"}
|