@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,373 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Memory Inbox CLI (WU-1474)
|
|
4
|
+
*
|
|
5
|
+
* Read coordination signals from other agents for real-time awareness
|
|
6
|
+
* of parallel agent progress. Filter by lane, WU, or time range.
|
|
7
|
+
* Supports watch mode for continuous monitoring.
|
|
8
|
+
*
|
|
9
|
+
* Includes audit logging to .beacon/telemetry/tools.ndjson.
|
|
10
|
+
*
|
|
11
|
+
* WU-2202: Added dependency validation before operations to prevent silent
|
|
12
|
+
* failures when node_modules is corrupted or incomplete.
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* pnpm mem:inbox [--lane <name>] [--wu <id>] [--since <time>] [--watch]
|
|
16
|
+
*
|
|
17
|
+
* @see {@link tools/lib/mem-signal-core.mjs} - Core logic
|
|
18
|
+
* @see {@link tools/__tests__/mem-inbox.test.mjs} - Tests
|
|
19
|
+
*/
|
|
20
|
+
import fs from 'node:fs/promises';
|
|
21
|
+
import path from 'node:path';
|
|
22
|
+
import ms from 'ms';
|
|
23
|
+
import { loadSignals, markSignalsAsRead } from '@lumenflow/memory/dist/mem-signal-core.js';
|
|
24
|
+
import { createWUParser, WU_OPTIONS } from '@lumenflow/core/dist/arg-parser.js';
|
|
25
|
+
import { EXIT_CODES } from '@lumenflow/core/dist/wu-constants.js';
|
|
26
|
+
import { validateInboxDependencies, formatDependencyError, } from '@lumenflow/core/dist/dependency-validator.js';
|
|
27
|
+
/**
|
|
28
|
+
* Log prefix for mem:inbox output
|
|
29
|
+
*/
|
|
30
|
+
const LOG_PREFIX = '[mem:inbox]';
|
|
31
|
+
/**
|
|
32
|
+
* Tool name for audit logging
|
|
33
|
+
*/
|
|
34
|
+
const TOOL_NAME = 'mem:inbox';
|
|
35
|
+
/**
|
|
36
|
+
* Audit log file path
|
|
37
|
+
*/
|
|
38
|
+
const AUDIT_LOG_PATH = '.beacon/telemetry/tools.ndjson';
|
|
39
|
+
/**
|
|
40
|
+
* Watch mode polling interval in milliseconds
|
|
41
|
+
*/
|
|
42
|
+
const WATCH_INTERVAL_MS = 1000;
|
|
43
|
+
/**
|
|
44
|
+
* CLI argument options specific to mem:inbox
|
|
45
|
+
*/
|
|
46
|
+
const CLI_OPTIONS = {
|
|
47
|
+
since: {
|
|
48
|
+
name: 'since',
|
|
49
|
+
flags: '-s, --since <time>',
|
|
50
|
+
description: 'Filter signals since time (e.g., "1h", "30m", "2025-12-09")',
|
|
51
|
+
},
|
|
52
|
+
watch: {
|
|
53
|
+
name: 'watch',
|
|
54
|
+
flags: '-w, --watch',
|
|
55
|
+
description: 'Continuously monitor for new signals',
|
|
56
|
+
},
|
|
57
|
+
quiet: {
|
|
58
|
+
name: 'quiet',
|
|
59
|
+
flags: '-q, --quiet',
|
|
60
|
+
description: 'Suppress output except signal content',
|
|
61
|
+
},
|
|
62
|
+
noMark: {
|
|
63
|
+
name: 'noMark',
|
|
64
|
+
flags: '--no-mark',
|
|
65
|
+
description: 'Do not mark signals as read after display',
|
|
66
|
+
isNegated: true,
|
|
67
|
+
},
|
|
68
|
+
count: {
|
|
69
|
+
name: 'count',
|
|
70
|
+
flags: '-c, --count',
|
|
71
|
+
description: 'Output only signal count (lightweight polling for orchestrators)',
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Write audit log entry for tool execution
|
|
76
|
+
*
|
|
77
|
+
* @param {string} baseDir - Base directory
|
|
78
|
+
* @param {object} entry - Audit log entry
|
|
79
|
+
*/
|
|
80
|
+
async function writeAuditLog(baseDir, entry) {
|
|
81
|
+
try {
|
|
82
|
+
const logPath = path.join(baseDir, AUDIT_LOG_PATH);
|
|
83
|
+
const logDir = path.dirname(logPath);
|
|
84
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool creates known directory
|
|
85
|
+
await fs.mkdir(logDir, { recursive: true });
|
|
86
|
+
const line = `${JSON.stringify(entry)}\n`;
|
|
87
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool writes audit log
|
|
88
|
+
await fs.appendFile(logPath, line, 'utf-8');
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Audit logging is non-fatal - silently ignore errors
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Format signal count for --count flag output
|
|
96
|
+
* WU-2401: Lightweight polling for orchestrators
|
|
97
|
+
*
|
|
98
|
+
* @param {number} count - Number of unread signals
|
|
99
|
+
* @returns {string} Formatted count string
|
|
100
|
+
*/
|
|
101
|
+
export function formatCount(count) {
|
|
102
|
+
return `${count} unread signal(s)`;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Parse relative time string to Date object
|
|
106
|
+
* WU-1849: Replaced custom regex with ms package
|
|
107
|
+
*
|
|
108
|
+
* @param {string} timeStr - Time string like "1h", "30m", "2d", or ISO date
|
|
109
|
+
* @returns {Date} Parsed date
|
|
110
|
+
*/
|
|
111
|
+
export function parseTimeString(timeStr) {
|
|
112
|
+
// Try using ms package for relative time parsing (e.g., "1h", "30m", "2d", "1d")
|
|
113
|
+
const msValue = ms(timeStr);
|
|
114
|
+
if (typeof msValue === 'number') {
|
|
115
|
+
return new Date(Date.now() - msValue);
|
|
116
|
+
}
|
|
117
|
+
// Try ISO date or other date format
|
|
118
|
+
const date = new Date(timeStr);
|
|
119
|
+
if (isNaN(date.getTime())) {
|
|
120
|
+
throw new Error(`Invalid time format: ${timeStr}. Use "1h", "30m", "2d", or ISO date.`);
|
|
121
|
+
}
|
|
122
|
+
return date;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Format a signal for display
|
|
126
|
+
*
|
|
127
|
+
* @param {object} signal - Signal object
|
|
128
|
+
* @returns {string} Formatted signal string
|
|
129
|
+
*/
|
|
130
|
+
function formatSignal(signal) {
|
|
131
|
+
const timestamp = new Date(signal.created_at).toLocaleString();
|
|
132
|
+
const scope = [];
|
|
133
|
+
if (signal.wu_id) {
|
|
134
|
+
scope.push(signal.wu_id);
|
|
135
|
+
}
|
|
136
|
+
if (signal.lane) {
|
|
137
|
+
scope.push(signal.lane);
|
|
138
|
+
}
|
|
139
|
+
const scopeStr = scope.length > 0 ? ` [${scope.join(' | ')}]` : '';
|
|
140
|
+
const readIndicator = signal.read ? ' (read)' : '';
|
|
141
|
+
return `${timestamp}${scopeStr}${readIndicator}\n ${signal.id}: ${signal.message}`;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Display signals to console
|
|
145
|
+
*
|
|
146
|
+
* @param {object[]} signals - Array of signal objects
|
|
147
|
+
* @param {boolean} quiet - Suppress headers
|
|
148
|
+
*/
|
|
149
|
+
function displaySignals(signals, quiet) {
|
|
150
|
+
if (signals.length === 0) {
|
|
151
|
+
if (!quiet) {
|
|
152
|
+
console.log(`${LOG_PREFIX} No signals found`);
|
|
153
|
+
}
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (!quiet) {
|
|
157
|
+
console.log(`${LOG_PREFIX} ${signals.length} signal(s)\n`);
|
|
158
|
+
}
|
|
159
|
+
for (const signal of signals) {
|
|
160
|
+
console.log(formatSignal(signal));
|
|
161
|
+
console.log('');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Run inbox check once and optionally mark as read
|
|
166
|
+
*
|
|
167
|
+
* @param {string} baseDir - Project base directory
|
|
168
|
+
* @param {object} options - Filter options
|
|
169
|
+
* @param {boolean} markAsRead - Whether to mark signals as read
|
|
170
|
+
* @returns {Promise<object[]>} Signals found
|
|
171
|
+
*/
|
|
172
|
+
async function checkInbox(baseDir, options, markAsRead) {
|
|
173
|
+
const signals = await loadSignals(baseDir, options);
|
|
174
|
+
if (markAsRead && signals.length > 0) {
|
|
175
|
+
const signalIds = signals.map((s) => s.id);
|
|
176
|
+
await markSignalsAsRead(baseDir, signalIds);
|
|
177
|
+
}
|
|
178
|
+
return signals;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Run watch mode - continuously poll for new signals
|
|
182
|
+
*
|
|
183
|
+
* @param {string} baseDir - Project base directory
|
|
184
|
+
* @param {object} filterOptions - Filter options
|
|
185
|
+
* @param {boolean} markAsRead - Whether to mark signals as read
|
|
186
|
+
* @param {boolean} quiet - Suppress headers
|
|
187
|
+
*/
|
|
188
|
+
async function runWatchMode(baseDir, filterOptions, markAsRead, quiet) {
|
|
189
|
+
if (!quiet) {
|
|
190
|
+
console.log(`${LOG_PREFIX} Watch mode started (Ctrl+C to exit)\n`);
|
|
191
|
+
}
|
|
192
|
+
// Track the last check time to only show new signals
|
|
193
|
+
let lastCheckTime = new Date();
|
|
194
|
+
// Initial check with original filters
|
|
195
|
+
const initialSignals = await checkInbox(baseDir, filterOptions, markAsRead);
|
|
196
|
+
displaySignals(initialSignals, quiet);
|
|
197
|
+
// Poll for new signals
|
|
198
|
+
const poll = async () => {
|
|
199
|
+
try {
|
|
200
|
+
// Check for signals since last check, combined with original filters
|
|
201
|
+
const watchOptions = {
|
|
202
|
+
...filterOptions,
|
|
203
|
+
since: lastCheckTime,
|
|
204
|
+
unreadOnly: true,
|
|
205
|
+
};
|
|
206
|
+
const newSignals = await checkInbox(baseDir, watchOptions, markAsRead);
|
|
207
|
+
if (newSignals.length > 0) {
|
|
208
|
+
console.log(`\n${LOG_PREFIX} ${newSignals.length} new signal(s)\n`);
|
|
209
|
+
displaySignals(newSignals, true);
|
|
210
|
+
}
|
|
211
|
+
lastCheckTime = new Date();
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
console.error(`${LOG_PREFIX} Watch error: ${error.message}`);
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
// Set up polling interval
|
|
218
|
+
const intervalId = globalThis.setInterval(poll, WATCH_INTERVAL_MS);
|
|
219
|
+
// Handle graceful shutdown
|
|
220
|
+
const cleanup = () => {
|
|
221
|
+
globalThis.clearInterval(intervalId);
|
|
222
|
+
if (!quiet) {
|
|
223
|
+
console.log(`\n${LOG_PREFIX} Watch mode stopped`);
|
|
224
|
+
}
|
|
225
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
226
|
+
};
|
|
227
|
+
process.on('SIGINT', cleanup);
|
|
228
|
+
process.on('SIGTERM', cleanup);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Parse CLI arguments
|
|
232
|
+
*
|
|
233
|
+
* @returns {object} Parsed arguments
|
|
234
|
+
*/
|
|
235
|
+
function parseArguments() {
|
|
236
|
+
return createWUParser({
|
|
237
|
+
name: 'mem-inbox',
|
|
238
|
+
description: 'Read coordination signals from other agents',
|
|
239
|
+
options: [
|
|
240
|
+
WU_OPTIONS.wu,
|
|
241
|
+
WU_OPTIONS.lane,
|
|
242
|
+
CLI_OPTIONS.since,
|
|
243
|
+
CLI_OPTIONS.watch,
|
|
244
|
+
CLI_OPTIONS.quiet,
|
|
245
|
+
CLI_OPTIONS.noMark,
|
|
246
|
+
CLI_OPTIONS.count,
|
|
247
|
+
],
|
|
248
|
+
required: [],
|
|
249
|
+
allowPositionalId: false,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
function buildFilterOptions(args) {
|
|
253
|
+
const filterOptions = {
|
|
254
|
+
unreadOnly: true, // Default to unread only
|
|
255
|
+
};
|
|
256
|
+
if (args.wu) {
|
|
257
|
+
filterOptions.wuId = args.wu;
|
|
258
|
+
}
|
|
259
|
+
if (args.lane) {
|
|
260
|
+
filterOptions.lane = args.lane;
|
|
261
|
+
}
|
|
262
|
+
if (args.since) {
|
|
263
|
+
filterOptions.since = parseTimeString(args.since);
|
|
264
|
+
}
|
|
265
|
+
return filterOptions;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* WU-2401: Run count mode - output only signal count
|
|
269
|
+
*
|
|
270
|
+
* @param {string} baseDir - Project base directory
|
|
271
|
+
* @param {object} filterOptions - Filter options
|
|
272
|
+
* @returns {Promise<number>} Signal count
|
|
273
|
+
*/
|
|
274
|
+
async function runCountMode(baseDir, filterOptions) {
|
|
275
|
+
const signals = await loadSignals(baseDir, filterOptions);
|
|
276
|
+
const count = signals.length;
|
|
277
|
+
console.log(formatCount(count));
|
|
278
|
+
return count;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Run standard check mode - display signals and optionally mark as read
|
|
282
|
+
*
|
|
283
|
+
* @param {string} baseDir - Project base directory
|
|
284
|
+
* @param {object} filterOptions - Filter options
|
|
285
|
+
* @param {boolean} markAsRead - Whether to mark signals as read
|
|
286
|
+
* @param {boolean} quiet - Suppress headers
|
|
287
|
+
* @returns {Promise<number>} Signal count
|
|
288
|
+
*/
|
|
289
|
+
async function runStandardMode(baseDir, filterOptions, markAsRead, quiet) {
|
|
290
|
+
const signals = await checkInbox(baseDir, filterOptions, markAsRead);
|
|
291
|
+
displaySignals(signals, quiet);
|
|
292
|
+
return signals.length;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Main CLI entry point
|
|
296
|
+
*/
|
|
297
|
+
async function main() {
|
|
298
|
+
// WU-2202: Validate dependencies BEFORE any other operation
|
|
299
|
+
const depResult = await validateInboxDependencies();
|
|
300
|
+
if (!depResult.valid) {
|
|
301
|
+
console.error(formatDependencyError('mem:inbox', depResult.missing));
|
|
302
|
+
process.exit(EXIT_CODES.ERROR);
|
|
303
|
+
}
|
|
304
|
+
const args = parseArguments();
|
|
305
|
+
const baseDir = process.cwd();
|
|
306
|
+
const startedAt = new Date().toISOString();
|
|
307
|
+
const startTime = Date.now();
|
|
308
|
+
// Build filter options
|
|
309
|
+
let filterOptions;
|
|
310
|
+
try {
|
|
311
|
+
filterOptions = buildFilterOptions(args);
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
console.error(`${LOG_PREFIX} Error: ${error.message}`);
|
|
315
|
+
process.exit(EXIT_CODES.ERROR);
|
|
316
|
+
}
|
|
317
|
+
// Validate mode combinations
|
|
318
|
+
if (args.count && args.watch) {
|
|
319
|
+
console.error(`${LOG_PREFIX} Error: --count and --watch cannot be used together`);
|
|
320
|
+
process.exit(EXIT_CODES.ERROR);
|
|
321
|
+
}
|
|
322
|
+
// Handle negated --no-mark option (Commander sets mark=false when --no-mark is used)
|
|
323
|
+
// In count mode, we never mark signals as read (lightweight polling)
|
|
324
|
+
const markAsRead = args.count ? false : args.mark !== false;
|
|
325
|
+
let signalCount = 0;
|
|
326
|
+
let error = null;
|
|
327
|
+
try {
|
|
328
|
+
if (args.count) {
|
|
329
|
+
signalCount = await runCountMode(baseDir, filterOptions);
|
|
330
|
+
}
|
|
331
|
+
else if (args.watch) {
|
|
332
|
+
await runWatchMode(baseDir, filterOptions, markAsRead, args.quiet);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
signalCount = await runStandardMode(baseDir, filterOptions, markAsRead, args.quiet);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
catch (err) {
|
|
339
|
+
error = err.message;
|
|
340
|
+
}
|
|
341
|
+
const durationMs = Date.now() - startTime;
|
|
342
|
+
// Log audit entry (only for non-watch mode since watch runs indefinitely)
|
|
343
|
+
if (!args.watch) {
|
|
344
|
+
await writeAuditLog(baseDir, {
|
|
345
|
+
tool: TOOL_NAME,
|
|
346
|
+
status: error ? 'failed' : 'success',
|
|
347
|
+
startedAt,
|
|
348
|
+
completedAt: new Date().toISOString(),
|
|
349
|
+
durationMs,
|
|
350
|
+
input: {
|
|
351
|
+
wuId: args.wu,
|
|
352
|
+
lane: args.lane,
|
|
353
|
+
since: args.since,
|
|
354
|
+
watch: args.watch,
|
|
355
|
+
quiet: args.quiet,
|
|
356
|
+
count: args.count,
|
|
357
|
+
markAsRead,
|
|
358
|
+
},
|
|
359
|
+
output: {
|
|
360
|
+
signalCount,
|
|
361
|
+
},
|
|
362
|
+
error: error ? { message: error } : null,
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
if (error) {
|
|
366
|
+
console.error(`${LOG_PREFIX} Error: ${error}`);
|
|
367
|
+
process.exit(EXIT_CODES.ERROR);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
main().catch((e) => {
|
|
371
|
+
console.error(`${LOG_PREFIX} ${e.message}`);
|
|
372
|
+
process.exit(EXIT_CODES.ERROR);
|
|
373
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mem-inbox.js","sourceRoot":"","sources":["../src/mem-inbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Memory Init CLI (WU-1464)
|
|
4
|
+
*
|
|
5
|
+
* Initialize memory layer in the repository.
|
|
6
|
+
* Creates .beacon/memory/ directory with memory.jsonl and config.yaml.
|
|
7
|
+
*
|
|
8
|
+
* Includes audit logging to .beacon/telemetry/tools.ndjson.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* pnpm mem:init [--base-dir <path>] [--quiet]
|
|
12
|
+
*
|
|
13
|
+
* @see {@link tools/lib/mem-init-core.mjs} - Core logic
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mem-init.d.ts","sourceRoot":"","sources":["../src/mem-init.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
|
package/dist/mem-init.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Memory Init CLI (WU-1464)
|
|
4
|
+
*
|
|
5
|
+
* Initialize memory layer in the repository.
|
|
6
|
+
* Creates .beacon/memory/ directory with memory.jsonl and config.yaml.
|
|
7
|
+
*
|
|
8
|
+
* Includes audit logging to .beacon/telemetry/tools.ndjson.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* pnpm mem:init [--base-dir <path>] [--quiet]
|
|
12
|
+
*
|
|
13
|
+
* @see {@link tools/lib/mem-init-core.mjs} - Core logic
|
|
14
|
+
*/
|
|
15
|
+
import fs from 'node:fs/promises';
|
|
16
|
+
import path from 'node:path';
|
|
17
|
+
import { initMemory } from '@lumenflow/memory/dist/mem-init-core.js';
|
|
18
|
+
import { createWUParser } from '@lumenflow/core/dist/arg-parser.js';
|
|
19
|
+
import { EXIT_CODES, STRING_LITERALS } from '@lumenflow/core/dist/wu-constants.js';
|
|
20
|
+
/**
|
|
21
|
+
* Log prefix for mem:init output
|
|
22
|
+
*/
|
|
23
|
+
const LOG_PREFIX = '[mem:init]';
|
|
24
|
+
/**
|
|
25
|
+
* Tool name for audit logging
|
|
26
|
+
*/
|
|
27
|
+
const TOOL_NAME = 'mem:init';
|
|
28
|
+
/**
|
|
29
|
+
* Audit log file path
|
|
30
|
+
*/
|
|
31
|
+
const AUDIT_LOG_PATH = '.beacon/telemetry/tools.ndjson';
|
|
32
|
+
/**
|
|
33
|
+
* Write audit log entry for tool execution
|
|
34
|
+
*
|
|
35
|
+
* @param {string} baseDir - Base directory
|
|
36
|
+
* @param {object} entry - Audit log entry
|
|
37
|
+
*/
|
|
38
|
+
async function writeAuditLog(baseDir, entry) {
|
|
39
|
+
try {
|
|
40
|
+
const logPath = path.join(baseDir, AUDIT_LOG_PATH);
|
|
41
|
+
const logDir = path.dirname(logPath);
|
|
42
|
+
// Ensure telemetry directory exists
|
|
43
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool creates known directory
|
|
44
|
+
await fs.mkdir(logDir, { recursive: true });
|
|
45
|
+
// Append NDJSON entry
|
|
46
|
+
const line = `${JSON.stringify(entry)}\n`;
|
|
47
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool writes audit log
|
|
48
|
+
await fs.appendFile(logPath, line, 'utf-8');
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Audit logging is non-fatal - silently ignore errors
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* CLI argument options
|
|
56
|
+
*/
|
|
57
|
+
const CLI_OPTIONS = {
|
|
58
|
+
baseDir: {
|
|
59
|
+
name: 'baseDir',
|
|
60
|
+
flags: '-d, --base-dir <path>',
|
|
61
|
+
description: 'Base directory to initialize (defaults to current directory)',
|
|
62
|
+
},
|
|
63
|
+
quiet: {
|
|
64
|
+
name: 'quiet',
|
|
65
|
+
flags: '-q, --quiet',
|
|
66
|
+
description: 'Suppress output except errors',
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Main CLI entry point
|
|
71
|
+
*/
|
|
72
|
+
async function main() {
|
|
73
|
+
const args = createWUParser({
|
|
74
|
+
name: 'mem-init',
|
|
75
|
+
description: 'Initialize memory layer in repository',
|
|
76
|
+
options: [CLI_OPTIONS.baseDir, CLI_OPTIONS.quiet],
|
|
77
|
+
});
|
|
78
|
+
const baseDir = args.baseDir || process.cwd();
|
|
79
|
+
const startedAt = new Date().toISOString();
|
|
80
|
+
const startTime = Date.now();
|
|
81
|
+
let result;
|
|
82
|
+
let error = null;
|
|
83
|
+
try {
|
|
84
|
+
result = await initMemory(baseDir);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
error = err.message;
|
|
88
|
+
}
|
|
89
|
+
const durationMs = Date.now() - startTime;
|
|
90
|
+
// Write audit log entry
|
|
91
|
+
await writeAuditLog(baseDir, {
|
|
92
|
+
tool: TOOL_NAME,
|
|
93
|
+
status: error ? 'failed' : 'success',
|
|
94
|
+
startedAt,
|
|
95
|
+
completedAt: new Date().toISOString(),
|
|
96
|
+
durationMs,
|
|
97
|
+
input: { baseDir },
|
|
98
|
+
output: result
|
|
99
|
+
? {
|
|
100
|
+
initialized: result.success,
|
|
101
|
+
alreadyInitialized: result.alreadyInitialized,
|
|
102
|
+
created: result.created,
|
|
103
|
+
}
|
|
104
|
+
: null,
|
|
105
|
+
error: error ? { message: error } : null,
|
|
106
|
+
});
|
|
107
|
+
if (error) {
|
|
108
|
+
console.error(`${LOG_PREFIX} Error: ${error}`);
|
|
109
|
+
process.exit(EXIT_CODES.ERROR);
|
|
110
|
+
}
|
|
111
|
+
if (args.quiet) {
|
|
112
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
113
|
+
}
|
|
114
|
+
// Output results
|
|
115
|
+
console.log(`${STRING_LITERALS.NEWLINE}${LOG_PREFIX} Memory layer initialization complete`);
|
|
116
|
+
console.log('');
|
|
117
|
+
if (result.alreadyInitialized) {
|
|
118
|
+
console.log('Status: Already initialized (no changes made)');
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.log('Status: Initialized');
|
|
122
|
+
}
|
|
123
|
+
console.log('');
|
|
124
|
+
console.log('Paths:');
|
|
125
|
+
console.log(` Directory: ${result.paths.memoryDir}`);
|
|
126
|
+
console.log(` Memory file: ${result.paths.memoryJsonl}`);
|
|
127
|
+
console.log(` Config file: ${result.paths.configYaml}`);
|
|
128
|
+
if (!result.alreadyInitialized) {
|
|
129
|
+
console.log('');
|
|
130
|
+
console.log('Created:');
|
|
131
|
+
if (result.created.directory) {
|
|
132
|
+
console.log(' - .beacon/memory/ directory');
|
|
133
|
+
}
|
|
134
|
+
if (result.created.memoryJsonl) {
|
|
135
|
+
console.log(' - memory.jsonl (empty)');
|
|
136
|
+
}
|
|
137
|
+
if (result.created.configYaml) {
|
|
138
|
+
console.log(' - config.yaml (default settings)');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
console.log('');
|
|
142
|
+
}
|
|
143
|
+
main().catch((e) => {
|
|
144
|
+
console.error(`${LOG_PREFIX} ${e.message}`);
|
|
145
|
+
process.exit(EXIT_CODES.ERROR);
|
|
146
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mem-init.js","sourceRoot":"","sources":["../src/mem-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Memory Ready CLI (WU-1468)
|
|
4
|
+
*
|
|
5
|
+
* Deterministic ready-work query for "what next?" oracle.
|
|
6
|
+
* Returns unblocked open nodes, ordered by priority then createdAt.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* pnpm mem:ready --wu WU-1234 [--type <type>] [--format <json|human>] [--quiet]
|
|
10
|
+
*
|
|
11
|
+
* Includes audit logging to .beacon/telemetry/tools.ndjson.
|
|
12
|
+
*
|
|
13
|
+
* @see {@link tools/lib/mem-ready-core.mjs} - Core logic
|
|
14
|
+
* @see {@link tools/__tests__/mem-ready.test.mjs} - Tests
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mem-ready.d.ts","sourceRoot":"","sources":["../src/mem-ready.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG"}
|