@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,224 @@
|
|
|
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
|
+
import fs from 'node:fs/promises';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
import { queryReadyNodes } from '@lumenflow/memory/dist/mem-ready-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
|
+
import { MEMORY_NODE_TYPES } from '@lumenflow/memory/dist/memory-schema.js';
|
|
22
|
+
/**
|
|
23
|
+
* Log prefix for mem:ready output
|
|
24
|
+
*/
|
|
25
|
+
const LOG_PREFIX = '[mem:ready]';
|
|
26
|
+
/**
|
|
27
|
+
* Tool name for audit logging
|
|
28
|
+
*/
|
|
29
|
+
const TOOL_NAME = 'mem:ready';
|
|
30
|
+
/**
|
|
31
|
+
* Audit log file path
|
|
32
|
+
*/
|
|
33
|
+
const AUDIT_LOG_PATH = '.beacon/telemetry/tools.ndjson';
|
|
34
|
+
/**
|
|
35
|
+
* CLI argument options specific to mem:ready
|
|
36
|
+
*/
|
|
37
|
+
const CLI_OPTIONS = {
|
|
38
|
+
type: {
|
|
39
|
+
name: 'type',
|
|
40
|
+
flags: '-t, --type <type>',
|
|
41
|
+
description: `Filter by node type (${MEMORY_NODE_TYPES.join(', ')})`,
|
|
42
|
+
},
|
|
43
|
+
format: {
|
|
44
|
+
name: 'format',
|
|
45
|
+
flags: '-f, --format <format>',
|
|
46
|
+
description: 'Output format (json, human). Default: human',
|
|
47
|
+
},
|
|
48
|
+
baseDir: {
|
|
49
|
+
name: 'baseDir',
|
|
50
|
+
flags: '-d, --base-dir <path>',
|
|
51
|
+
description: 'Base directory (defaults to current directory)',
|
|
52
|
+
},
|
|
53
|
+
quiet: {
|
|
54
|
+
name: 'quiet',
|
|
55
|
+
flags: '-q, --quiet',
|
|
56
|
+
description: 'Suppress header/footer output, only show nodes',
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Write audit log entry for tool execution
|
|
61
|
+
*
|
|
62
|
+
* @param {string} baseDir - Base directory
|
|
63
|
+
* @param {object} entry - Audit log entry
|
|
64
|
+
*/
|
|
65
|
+
async function writeAuditLog(baseDir, entry) {
|
|
66
|
+
try {
|
|
67
|
+
const logPath = path.join(baseDir, AUDIT_LOG_PATH);
|
|
68
|
+
const logDir = path.dirname(logPath);
|
|
69
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool creates known directory
|
|
70
|
+
await fs.mkdir(logDir, { recursive: true });
|
|
71
|
+
const line = `${JSON.stringify(entry)}\n`;
|
|
72
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool writes audit log
|
|
73
|
+
await fs.appendFile(logPath, line, 'utf-8');
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Audit logging is non-fatal - silently ignore errors
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Format a single node for human-readable output
|
|
81
|
+
*
|
|
82
|
+
* @param {object} node - Memory node
|
|
83
|
+
* @param {number} index - Position in list (0-indexed)
|
|
84
|
+
* @returns {string} Formatted output
|
|
85
|
+
*/
|
|
86
|
+
function formatNodeHuman(node, index) {
|
|
87
|
+
const priority = node.metadata?.priority || '-';
|
|
88
|
+
const lines = [
|
|
89
|
+
`${index + 1}. [${node.id}] (${node.type})`,
|
|
90
|
+
` Priority: ${priority}`,
|
|
91
|
+
` Lifecycle: ${node.lifecycle}`,
|
|
92
|
+
` Created: ${node.created_at}`,
|
|
93
|
+
];
|
|
94
|
+
if (node.wu_id) {
|
|
95
|
+
lines.push(` WU: ${node.wu_id}`);
|
|
96
|
+
}
|
|
97
|
+
// Truncate content for display
|
|
98
|
+
const maxContentLen = 60;
|
|
99
|
+
const content = node.content.length > maxContentLen
|
|
100
|
+
? `${node.content.slice(0, maxContentLen)}...`
|
|
101
|
+
: node.content;
|
|
102
|
+
lines.push(` Content: ${content}`);
|
|
103
|
+
return lines.join('\n');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Print nodes in human-readable format
|
|
107
|
+
*
|
|
108
|
+
* @param {object[]} nodes - Ready nodes
|
|
109
|
+
* @param {object} opts - CLI options
|
|
110
|
+
*/
|
|
111
|
+
function printHumanFormat(nodes, opts) {
|
|
112
|
+
if (!opts.quiet) {
|
|
113
|
+
console.log(`${LOG_PREFIX} Ready nodes for ${opts.wu}:`);
|
|
114
|
+
console.log('');
|
|
115
|
+
}
|
|
116
|
+
if (nodes.length === 0) {
|
|
117
|
+
if (!opts.quiet) {
|
|
118
|
+
console.log(' (no ready nodes)');
|
|
119
|
+
console.log('');
|
|
120
|
+
}
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
for (const [i, node] of nodes.entries()) {
|
|
124
|
+
console.log(formatNodeHuman(node, i));
|
|
125
|
+
console.log('');
|
|
126
|
+
}
|
|
127
|
+
if (!opts.quiet) {
|
|
128
|
+
console.log(`${LOG_PREFIX} ${nodes.length} node(s) ready for processing`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Print nodes in JSON format
|
|
133
|
+
*
|
|
134
|
+
* @param {object[]} nodes - Ready nodes
|
|
135
|
+
* @param {object} opts - CLI options
|
|
136
|
+
*/
|
|
137
|
+
function printJsonFormat(nodes, opts) {
|
|
138
|
+
const output = {
|
|
139
|
+
wuId: opts.wu,
|
|
140
|
+
type: opts.type || null,
|
|
141
|
+
count: nodes.length,
|
|
142
|
+
nodes,
|
|
143
|
+
};
|
|
144
|
+
console.log(JSON.stringify(output, null, 2));
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Main CLI entry point
|
|
148
|
+
*/
|
|
149
|
+
async function main() {
|
|
150
|
+
const args = createWUParser({
|
|
151
|
+
name: 'mem-ready',
|
|
152
|
+
description: 'Query ready nodes for a WU (deterministic ordering)',
|
|
153
|
+
options: [
|
|
154
|
+
WU_OPTIONS.wu,
|
|
155
|
+
CLI_OPTIONS.type,
|
|
156
|
+
CLI_OPTIONS.format,
|
|
157
|
+
CLI_OPTIONS.baseDir,
|
|
158
|
+
CLI_OPTIONS.quiet,
|
|
159
|
+
],
|
|
160
|
+
required: ['wu'],
|
|
161
|
+
});
|
|
162
|
+
const baseDir = args.baseDir || process.cwd();
|
|
163
|
+
const format = args.format || 'human';
|
|
164
|
+
const startedAt = new Date().toISOString();
|
|
165
|
+
const startTime = Date.now();
|
|
166
|
+
// Validate format option
|
|
167
|
+
if (!['json', 'human'].includes(format)) {
|
|
168
|
+
console.error(`${LOG_PREFIX} Error: Invalid format "${format}". Use "json" or "human".`);
|
|
169
|
+
process.exit(EXIT_CODES.ERROR);
|
|
170
|
+
}
|
|
171
|
+
// Validate type option if provided
|
|
172
|
+
if (args.type && !MEMORY_NODE_TYPES.includes(args.type)) {
|
|
173
|
+
console.error(`${LOG_PREFIX} Error: Invalid type "${args.type}". Valid types: ${MEMORY_NODE_TYPES.join(', ')}`);
|
|
174
|
+
process.exit(EXIT_CODES.ERROR);
|
|
175
|
+
}
|
|
176
|
+
let nodes;
|
|
177
|
+
let error = null;
|
|
178
|
+
try {
|
|
179
|
+
nodes = await queryReadyNodes(baseDir, {
|
|
180
|
+
wuId: args.wu,
|
|
181
|
+
type: args.type,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
error = err.message;
|
|
186
|
+
}
|
|
187
|
+
const durationMs = Date.now() - startTime;
|
|
188
|
+
// Write audit log entry
|
|
189
|
+
await writeAuditLog(baseDir, {
|
|
190
|
+
tool: TOOL_NAME,
|
|
191
|
+
status: error ? 'failed' : 'success',
|
|
192
|
+
startedAt,
|
|
193
|
+
completedAt: new Date().toISOString(),
|
|
194
|
+
durationMs,
|
|
195
|
+
input: {
|
|
196
|
+
baseDir,
|
|
197
|
+
wuId: args.wu,
|
|
198
|
+
type: args.type,
|
|
199
|
+
format,
|
|
200
|
+
},
|
|
201
|
+
output: nodes
|
|
202
|
+
? {
|
|
203
|
+
count: nodes.length,
|
|
204
|
+
nodeIds: nodes.map((n) => n.id),
|
|
205
|
+
}
|
|
206
|
+
: null,
|
|
207
|
+
error: error ? { message: error } : null,
|
|
208
|
+
});
|
|
209
|
+
if (error) {
|
|
210
|
+
console.error(`${LOG_PREFIX} Error: ${error}`);
|
|
211
|
+
process.exit(EXIT_CODES.ERROR);
|
|
212
|
+
}
|
|
213
|
+
// Print output based on format
|
|
214
|
+
if (format === 'json') {
|
|
215
|
+
printJsonFormat(nodes, args);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
printHumanFormat(nodes, args);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
main().catch((e) => {
|
|
222
|
+
console.error(`${LOG_PREFIX} ${e.message}`);
|
|
223
|
+
process.exit(EXIT_CODES.ERROR);
|
|
224
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mem-ready.js","sourceRoot":"","sources":["../src/mem-ready.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Memory Signal CLI (WU-1473)
|
|
4
|
+
*
|
|
5
|
+
* Send coordination signals between parallel agents for sub-100ms
|
|
6
|
+
* multi-agent swarm coordination without git sync latency.
|
|
7
|
+
*
|
|
8
|
+
* Includes audit logging to .beacon/telemetry/tools.ndjson.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* pnpm mem:signal 'message' [--wu <id>] [--lane <name>] [--quiet]
|
|
12
|
+
*
|
|
13
|
+
* @see {@link tools/lib/mem-signal-core.mjs} - Core logic
|
|
14
|
+
* @see {@link tools/__tests__/mem-signal.test.mjs} - Tests
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mem-signal.d.ts","sourceRoot":"","sources":["../src/mem-signal.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Memory Signal CLI (WU-1473)
|
|
4
|
+
*
|
|
5
|
+
* Send coordination signals between parallel agents for sub-100ms
|
|
6
|
+
* multi-agent swarm coordination without git sync latency.
|
|
7
|
+
*
|
|
8
|
+
* Includes audit logging to .beacon/telemetry/tools.ndjson.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* pnpm mem:signal 'message' [--wu <id>] [--lane <name>] [--quiet]
|
|
12
|
+
*
|
|
13
|
+
* @see {@link tools/lib/mem-signal-core.mjs} - Core logic
|
|
14
|
+
* @see {@link tools/__tests__/mem-signal.test.mjs} - Tests
|
|
15
|
+
*/
|
|
16
|
+
import fs from 'node:fs/promises';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
import { createSignal } from '@lumenflow/memory/dist/mem-signal-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:signal output
|
|
23
|
+
*/
|
|
24
|
+
const LOG_PREFIX = '[mem:signal]';
|
|
25
|
+
/**
|
|
26
|
+
* Tool name for audit logging
|
|
27
|
+
*/
|
|
28
|
+
const TOOL_NAME = 'mem:signal';
|
|
29
|
+
/**
|
|
30
|
+
* Audit log file path
|
|
31
|
+
*/
|
|
32
|
+
const AUDIT_LOG_PATH = '.beacon/telemetry/tools.ndjson';
|
|
33
|
+
/**
|
|
34
|
+
* CLI argument options specific to mem:signal
|
|
35
|
+
*/
|
|
36
|
+
const CLI_OPTIONS = {
|
|
37
|
+
message: {
|
|
38
|
+
name: 'message',
|
|
39
|
+
flags: '-m, --message <text>',
|
|
40
|
+
description: 'Signal message (required if not positional)',
|
|
41
|
+
},
|
|
42
|
+
quiet: {
|
|
43
|
+
name: 'quiet',
|
|
44
|
+
flags: '-q, --quiet',
|
|
45
|
+
description: 'Suppress output except errors (outputs signal ID only)',
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Write audit log entry for tool execution
|
|
50
|
+
*
|
|
51
|
+
* @param {string} baseDir - Base directory
|
|
52
|
+
* @param {object} entry - Audit log entry
|
|
53
|
+
*/
|
|
54
|
+
async function writeAuditLog(baseDir, entry) {
|
|
55
|
+
try {
|
|
56
|
+
const logPath = path.join(baseDir, AUDIT_LOG_PATH);
|
|
57
|
+
const logDir = path.dirname(logPath);
|
|
58
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool creates known directory
|
|
59
|
+
await fs.mkdir(logDir, { recursive: true });
|
|
60
|
+
const line = `${JSON.stringify(entry)}\n`;
|
|
61
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool writes audit log
|
|
62
|
+
await fs.appendFile(logPath, line, 'utf-8');
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Audit logging is non-fatal - silently ignore errors
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Flags that expect a value argument
|
|
70
|
+
*/
|
|
71
|
+
const FLAGS_WITH_VALUES = new Set(['-m', '--message', '--wu', '-l', '--lane']);
|
|
72
|
+
/**
|
|
73
|
+
* Extract positional arguments from argv (skipping flags and their values)
|
|
74
|
+
*
|
|
75
|
+
* @returns {string[]} Positional arguments
|
|
76
|
+
*/
|
|
77
|
+
function extractPositionalArgs() {
|
|
78
|
+
const positionalArgs = [];
|
|
79
|
+
let skipNext = false;
|
|
80
|
+
for (let i = 2; i < process.argv.length; i++) {
|
|
81
|
+
const arg = process.argv[i];
|
|
82
|
+
if (skipNext) {
|
|
83
|
+
skipNext = false;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (arg.startsWith('-')) {
|
|
87
|
+
skipNext = FLAGS_WITH_VALUES.has(arg);
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
positionalArgs.push(arg);
|
|
91
|
+
}
|
|
92
|
+
return positionalArgs;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Parse CLI arguments and extract the message
|
|
96
|
+
*
|
|
97
|
+
* @returns {{args: object, message: string|undefined}} Parsed args and message
|
|
98
|
+
*/
|
|
99
|
+
function parseArguments() {
|
|
100
|
+
const args = createWUParser({
|
|
101
|
+
name: 'mem-signal',
|
|
102
|
+
description: 'Send a coordination signal to other agents',
|
|
103
|
+
options: [CLI_OPTIONS.message, WU_OPTIONS.wu, WU_OPTIONS.lane, CLI_OPTIONS.quiet],
|
|
104
|
+
required: [],
|
|
105
|
+
allowPositionalId: true,
|
|
106
|
+
});
|
|
107
|
+
let message = args.message;
|
|
108
|
+
if (!message && process.argv.length > 2) {
|
|
109
|
+
const positionalArgs = extractPositionalArgs();
|
|
110
|
+
if (positionalArgs.length > 0) {
|
|
111
|
+
[message] = positionalArgs;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return { args, message };
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Print signal details to console
|
|
118
|
+
*
|
|
119
|
+
* @param {object} result - Creation result with signal
|
|
120
|
+
*/
|
|
121
|
+
function printSignalDetails(result) {
|
|
122
|
+
const { signal } = result;
|
|
123
|
+
console.log(`${LOG_PREFIX} Signal sent (${signal.id})`);
|
|
124
|
+
console.log('');
|
|
125
|
+
console.log('Signal Details:');
|
|
126
|
+
console.log(` ID: ${signal.id}`);
|
|
127
|
+
console.log(` Message: ${signal.message}`);
|
|
128
|
+
console.log(` Created At: ${signal.created_at}`);
|
|
129
|
+
if (signal.wu_id) {
|
|
130
|
+
console.log(` WU: ${signal.wu_id}`);
|
|
131
|
+
}
|
|
132
|
+
if (signal.lane) {
|
|
133
|
+
console.log(` Lane: ${signal.lane}`);
|
|
134
|
+
}
|
|
135
|
+
console.log('');
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Main CLI entry point
|
|
139
|
+
*/
|
|
140
|
+
async function main() {
|
|
141
|
+
const { args, message } = parseArguments();
|
|
142
|
+
if (!message) {
|
|
143
|
+
console.error(`${LOG_PREFIX} Error: message is required`);
|
|
144
|
+
console.error('');
|
|
145
|
+
console.error("Usage: pnpm mem:signal 'message' [options]");
|
|
146
|
+
console.error(" pnpm mem:signal --message 'message' [options]");
|
|
147
|
+
console.error('');
|
|
148
|
+
console.error('Options:');
|
|
149
|
+
console.error(' --wu <id> WU ID to scope signal to (e.g., WU-1473)');
|
|
150
|
+
console.error(' --lane <name> Lane to target signal to (e.g., "Operations: Tooling")');
|
|
151
|
+
console.error(' --quiet Suppress output except errors');
|
|
152
|
+
process.exit(EXIT_CODES.ERROR);
|
|
153
|
+
}
|
|
154
|
+
const baseDir = process.cwd();
|
|
155
|
+
const startedAt = new Date().toISOString();
|
|
156
|
+
const startTime = Date.now();
|
|
157
|
+
let result;
|
|
158
|
+
let error = null;
|
|
159
|
+
try {
|
|
160
|
+
result = await createSignal(baseDir, {
|
|
161
|
+
message,
|
|
162
|
+
wuId: args.wu,
|
|
163
|
+
lane: args.lane,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
error = err.message;
|
|
168
|
+
}
|
|
169
|
+
const durationMs = Date.now() - startTime;
|
|
170
|
+
await writeAuditLog(baseDir, {
|
|
171
|
+
tool: TOOL_NAME,
|
|
172
|
+
status: error ? 'failed' : 'success',
|
|
173
|
+
startedAt,
|
|
174
|
+
completedAt: new Date().toISOString(),
|
|
175
|
+
durationMs,
|
|
176
|
+
input: {
|
|
177
|
+
message,
|
|
178
|
+
wuId: args.wu,
|
|
179
|
+
lane: args.lane,
|
|
180
|
+
},
|
|
181
|
+
output: result
|
|
182
|
+
? {
|
|
183
|
+
success: result.success,
|
|
184
|
+
signalId: result.signal?.id,
|
|
185
|
+
wuId: result.signal?.wu_id,
|
|
186
|
+
lane: result.signal?.lane,
|
|
187
|
+
}
|
|
188
|
+
: null,
|
|
189
|
+
error: error ? { message: error } : null,
|
|
190
|
+
});
|
|
191
|
+
if (error) {
|
|
192
|
+
console.error(`${LOG_PREFIX} Error: ${error}`);
|
|
193
|
+
process.exit(EXIT_CODES.ERROR);
|
|
194
|
+
}
|
|
195
|
+
if (args.quiet) {
|
|
196
|
+
console.log(result.signal.id);
|
|
197
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
198
|
+
}
|
|
199
|
+
printSignalDetails(result);
|
|
200
|
+
}
|
|
201
|
+
main().catch((e) => {
|
|
202
|
+
console.error(`${LOG_PREFIX} ${e.message}`);
|
|
203
|
+
process.exit(EXIT_CODES.ERROR);
|
|
204
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mem-signal.js","sourceRoot":"","sources":["../src/mem-signal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Memory Start CLI (WU-1466)
|
|
4
|
+
*
|
|
5
|
+
* Create a session node linked to a WU.
|
|
6
|
+
* Called by wu:claim enhancement for context restoration after /clear.
|
|
7
|
+
*
|
|
8
|
+
* Includes audit logging to .beacon/telemetry/tools.ndjson.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* pnpm mem:start --wu WU-1234 [--agent-type <type>] [--context-tier <tier>] [--quiet]
|
|
12
|
+
*
|
|
13
|
+
* @see {@link tools/lib/mem-start-core.mjs} - Core logic
|
|
14
|
+
* @see {@link tools/__tests__/mem-start.test.mjs} - Tests
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mem-start.d.ts","sourceRoot":"","sources":["../src/mem-start.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Memory Start CLI (WU-1466)
|
|
4
|
+
*
|
|
5
|
+
* Create a session node linked to a WU.
|
|
6
|
+
* Called by wu:claim enhancement for context restoration after /clear.
|
|
7
|
+
*
|
|
8
|
+
* Includes audit logging to .beacon/telemetry/tools.ndjson.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* pnpm mem:start --wu WU-1234 [--agent-type <type>] [--context-tier <tier>] [--quiet]
|
|
12
|
+
*
|
|
13
|
+
* @see {@link tools/lib/mem-start-core.mjs} - Core logic
|
|
14
|
+
* @see {@link tools/__tests__/mem-start.test.mjs} - Tests
|
|
15
|
+
*/
|
|
16
|
+
import fs from 'node:fs/promises';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
import { startSession } from '@lumenflow/memory/dist/mem-start-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:start output
|
|
23
|
+
*/
|
|
24
|
+
const LOG_PREFIX = '[mem:start]';
|
|
25
|
+
/**
|
|
26
|
+
* Tool name for audit logging
|
|
27
|
+
*/
|
|
28
|
+
const TOOL_NAME = 'mem:start';
|
|
29
|
+
/**
|
|
30
|
+
* Audit log file path
|
|
31
|
+
*/
|
|
32
|
+
const AUDIT_LOG_PATH = '.beacon/telemetry/tools.ndjson';
|
|
33
|
+
/**
|
|
34
|
+
* Write audit log entry for tool execution
|
|
35
|
+
*
|
|
36
|
+
* @param {string} baseDir - Base directory
|
|
37
|
+
* @param {object} entry - Audit log entry
|
|
38
|
+
*/
|
|
39
|
+
async function writeAuditLog(baseDir, entry) {
|
|
40
|
+
try {
|
|
41
|
+
const logPath = path.join(baseDir, AUDIT_LOG_PATH);
|
|
42
|
+
const logDir = path.dirname(logPath);
|
|
43
|
+
// Ensure telemetry directory exists
|
|
44
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool creates known directory
|
|
45
|
+
await fs.mkdir(logDir, { recursive: true });
|
|
46
|
+
// Append NDJSON entry
|
|
47
|
+
const line = `${JSON.stringify(entry)}\n`;
|
|
48
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool writes audit log
|
|
49
|
+
await fs.appendFile(logPath, line, 'utf-8');
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Audit logging is non-fatal - silently ignore errors
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* CLI argument options specific to mem:start
|
|
57
|
+
*/
|
|
58
|
+
const CLI_OPTIONS = {
|
|
59
|
+
agentType: {
|
|
60
|
+
name: 'agentType',
|
|
61
|
+
flags: '-a, --agent-type <type>',
|
|
62
|
+
description: 'Agent type (e.g., general-purpose, explore, test-engineer)',
|
|
63
|
+
},
|
|
64
|
+
contextTier: {
|
|
65
|
+
name: 'contextTier',
|
|
66
|
+
flags: '-c, --context-tier <tier>',
|
|
67
|
+
description: 'Context tier (core, full, minimal)',
|
|
68
|
+
},
|
|
69
|
+
baseDir: {
|
|
70
|
+
name: 'baseDir',
|
|
71
|
+
flags: '-d, --base-dir <path>',
|
|
72
|
+
description: 'Base directory (defaults to current directory)',
|
|
73
|
+
},
|
|
74
|
+
quiet: {
|
|
75
|
+
name: 'quiet',
|
|
76
|
+
flags: '-q, --quiet',
|
|
77
|
+
description: 'Suppress output except errors',
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Main CLI entry point
|
|
82
|
+
*/
|
|
83
|
+
async function main() {
|
|
84
|
+
const args = createWUParser({
|
|
85
|
+
name: 'mem-start',
|
|
86
|
+
description: 'Create a session node linked to a WU',
|
|
87
|
+
options: [
|
|
88
|
+
WU_OPTIONS.wu,
|
|
89
|
+
CLI_OPTIONS.agentType,
|
|
90
|
+
CLI_OPTIONS.contextTier,
|
|
91
|
+
CLI_OPTIONS.baseDir,
|
|
92
|
+
CLI_OPTIONS.quiet,
|
|
93
|
+
],
|
|
94
|
+
required: ['wu'],
|
|
95
|
+
});
|
|
96
|
+
const baseDir = args.baseDir || process.cwd();
|
|
97
|
+
const startedAt = new Date().toISOString();
|
|
98
|
+
const startTime = Date.now();
|
|
99
|
+
let result;
|
|
100
|
+
let error = null;
|
|
101
|
+
try {
|
|
102
|
+
result = await startSession(baseDir, {
|
|
103
|
+
wuId: args.wu,
|
|
104
|
+
agentType: args.agentType,
|
|
105
|
+
contextTier: args.contextTier,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
error = err.message;
|
|
110
|
+
}
|
|
111
|
+
const durationMs = Date.now() - startTime;
|
|
112
|
+
// Write audit log entry
|
|
113
|
+
await writeAuditLog(baseDir, {
|
|
114
|
+
tool: TOOL_NAME,
|
|
115
|
+
status: error ? 'failed' : 'success',
|
|
116
|
+
startedAt,
|
|
117
|
+
completedAt: new Date().toISOString(),
|
|
118
|
+
durationMs,
|
|
119
|
+
input: {
|
|
120
|
+
baseDir,
|
|
121
|
+
wuId: args.wu,
|
|
122
|
+
agentType: args.agentType,
|
|
123
|
+
contextTier: args.contextTier,
|
|
124
|
+
},
|
|
125
|
+
output: result
|
|
126
|
+
? {
|
|
127
|
+
success: result.success,
|
|
128
|
+
sessionId: result.session?.id,
|
|
129
|
+
wuId: result.session?.wu_id,
|
|
130
|
+
}
|
|
131
|
+
: null,
|
|
132
|
+
error: error ? { message: error } : null,
|
|
133
|
+
});
|
|
134
|
+
if (error) {
|
|
135
|
+
console.error(`${LOG_PREFIX} Error: ${error}`);
|
|
136
|
+
process.exit(EXIT_CODES.ERROR);
|
|
137
|
+
}
|
|
138
|
+
if (args.quiet) {
|
|
139
|
+
// In quiet mode, just output the session ID for piping
|
|
140
|
+
console.log(result.session.id);
|
|
141
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
142
|
+
}
|
|
143
|
+
// Output results
|
|
144
|
+
console.log(`${LOG_PREFIX} Session started (${result.session.id})`);
|
|
145
|
+
console.log('');
|
|
146
|
+
console.log('Session Details:');
|
|
147
|
+
console.log(` ID: ${result.session.id}`);
|
|
148
|
+
console.log(` WU: ${result.session.wu_id}`);
|
|
149
|
+
console.log(` Session UUID: ${result.session.session_id}`);
|
|
150
|
+
console.log(` Agent Type: ${result.session.metadata.agentType}`);
|
|
151
|
+
console.log(` Context Tier: ${result.session.metadata.contextTier}`);
|
|
152
|
+
console.log(` Created At: ${result.session.created_at}`);
|
|
153
|
+
console.log('');
|
|
154
|
+
}
|
|
155
|
+
main().catch((e) => {
|
|
156
|
+
console.error(`${LOG_PREFIX} ${e.message}`);
|
|
157
|
+
process.exit(EXIT_CODES.ERROR);
|
|
158
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mem-start.js","sourceRoot":"","sources":["../src/mem-start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
export {};
|