@lumenflow/cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +116 -0
  3. package/dist/gates.d.ts +41 -0
  4. package/dist/gates.d.ts.map +1 -0
  5. package/dist/gates.js +684 -0
  6. package/dist/gates.js.map +1 -0
  7. package/dist/initiative-add-wu.d.ts +22 -0
  8. package/dist/initiative-add-wu.d.ts.map +1 -0
  9. package/dist/initiative-add-wu.js +234 -0
  10. package/dist/initiative-add-wu.js.map +1 -0
  11. package/dist/initiative-create.d.ts +28 -0
  12. package/dist/initiative-create.d.ts.map +1 -0
  13. package/dist/initiative-create.js +172 -0
  14. package/dist/initiative-create.js.map +1 -0
  15. package/dist/initiative-edit.d.ts +34 -0
  16. package/dist/initiative-edit.d.ts.map +1 -0
  17. package/dist/initiative-edit.js +440 -0
  18. package/dist/initiative-edit.js.map +1 -0
  19. package/dist/initiative-list.d.ts +12 -0
  20. package/dist/initiative-list.d.ts.map +1 -0
  21. package/dist/initiative-list.js +101 -0
  22. package/dist/initiative-list.js.map +1 -0
  23. package/dist/initiative-status.d.ts +11 -0
  24. package/dist/initiative-status.d.ts.map +1 -0
  25. package/dist/initiative-status.js +221 -0
  26. package/dist/initiative-status.js.map +1 -0
  27. package/dist/mem-checkpoint.d.ts +16 -0
  28. package/dist/mem-checkpoint.d.ts.map +1 -0
  29. package/dist/mem-checkpoint.js +237 -0
  30. package/dist/mem-checkpoint.js.map +1 -0
  31. package/dist/mem-cleanup.d.ts +29 -0
  32. package/dist/mem-cleanup.d.ts.map +1 -0
  33. package/dist/mem-cleanup.js +267 -0
  34. package/dist/mem-cleanup.js.map +1 -0
  35. package/dist/mem-create.d.ts +17 -0
  36. package/dist/mem-create.d.ts.map +1 -0
  37. package/dist/mem-create.js +265 -0
  38. package/dist/mem-create.js.map +1 -0
  39. package/dist/mem-inbox.d.ts +35 -0
  40. package/dist/mem-inbox.d.ts.map +1 -0
  41. package/dist/mem-inbox.js +373 -0
  42. package/dist/mem-inbox.js.map +1 -0
  43. package/dist/mem-init.d.ts +15 -0
  44. package/dist/mem-init.d.ts.map +1 -0
  45. package/dist/mem-init.js +146 -0
  46. package/dist/mem-init.js.map +1 -0
  47. package/dist/mem-ready.d.ts +16 -0
  48. package/dist/mem-ready.d.ts.map +1 -0
  49. package/dist/mem-ready.js +224 -0
  50. package/dist/mem-ready.js.map +1 -0
  51. package/dist/mem-signal.d.ts +16 -0
  52. package/dist/mem-signal.d.ts.map +1 -0
  53. package/dist/mem-signal.js +204 -0
  54. package/dist/mem-signal.js.map +1 -0
  55. package/dist/mem-start.d.ts +16 -0
  56. package/dist/mem-start.d.ts.map +1 -0
  57. package/dist/mem-start.js +158 -0
  58. package/dist/mem-start.js.map +1 -0
  59. package/dist/mem-summarize.d.ts +22 -0
  60. package/dist/mem-summarize.d.ts.map +1 -0
  61. package/dist/mem-summarize.js +213 -0
  62. package/dist/mem-summarize.js.map +1 -0
  63. package/dist/mem-triage.d.ts +22 -0
  64. package/dist/mem-triage.d.ts.map +1 -0
  65. package/dist/mem-triage.js +328 -0
  66. package/dist/mem-triage.js.map +1 -0
  67. package/dist/spawn-list.d.ts +16 -0
  68. package/dist/spawn-list.d.ts.map +1 -0
  69. package/dist/spawn-list.js +140 -0
  70. package/dist/spawn-list.js.map +1 -0
  71. package/dist/wu-block.d.ts +16 -0
  72. package/dist/wu-block.d.ts.map +1 -0
  73. package/dist/wu-block.js +241 -0
  74. package/dist/wu-block.js.map +1 -0
  75. package/dist/wu-claim.d.ts +32 -0
  76. package/dist/wu-claim.d.ts.map +1 -0
  77. package/dist/wu-claim.js +1106 -0
  78. package/dist/wu-claim.js.map +1 -0
  79. package/dist/wu-cleanup.d.ts +17 -0
  80. package/dist/wu-cleanup.d.ts.map +1 -0
  81. package/dist/wu-cleanup.js +194 -0
  82. package/dist/wu-cleanup.js.map +1 -0
  83. package/dist/wu-create.d.ts +38 -0
  84. package/dist/wu-create.d.ts.map +1 -0
  85. package/dist/wu-create.js +520 -0
  86. package/dist/wu-create.js.map +1 -0
  87. package/dist/wu-deps.d.ts +13 -0
  88. package/dist/wu-deps.d.ts.map +1 -0
  89. package/dist/wu-deps.js +119 -0
  90. package/dist/wu-deps.js.map +1 -0
  91. package/dist/wu-done.d.ts +153 -0
  92. package/dist/wu-done.d.ts.map +1 -0
  93. package/dist/wu-done.js +2096 -0
  94. package/dist/wu-done.js.map +1 -0
  95. package/dist/wu-edit.d.ts +29 -0
  96. package/dist/wu-edit.d.ts.map +1 -0
  97. package/dist/wu-edit.js +852 -0
  98. package/dist/wu-edit.js.map +1 -0
  99. package/dist/wu-infer-lane.d.ts +17 -0
  100. package/dist/wu-infer-lane.d.ts.map +1 -0
  101. package/dist/wu-infer-lane.js +135 -0
  102. package/dist/wu-infer-lane.js.map +1 -0
  103. package/dist/wu-preflight.d.ts +47 -0
  104. package/dist/wu-preflight.d.ts.map +1 -0
  105. package/dist/wu-preflight.js +167 -0
  106. package/dist/wu-preflight.js.map +1 -0
  107. package/dist/wu-prune.d.ts +16 -0
  108. package/dist/wu-prune.d.ts.map +1 -0
  109. package/dist/wu-prune.js +259 -0
  110. package/dist/wu-prune.js.map +1 -0
  111. package/dist/wu-repair.d.ts +60 -0
  112. package/dist/wu-repair.d.ts.map +1 -0
  113. package/dist/wu-repair.js +226 -0
  114. package/dist/wu-repair.js.map +1 -0
  115. package/dist/wu-spawn-completion.d.ts +10 -0
  116. package/dist/wu-spawn-completion.js +30 -0
  117. package/dist/wu-spawn.d.ts +168 -0
  118. package/dist/wu-spawn.d.ts.map +1 -0
  119. package/dist/wu-spawn.js +1327 -0
  120. package/dist/wu-spawn.js.map +1 -0
  121. package/dist/wu-unblock.d.ts +16 -0
  122. package/dist/wu-unblock.d.ts.map +1 -0
  123. package/dist/wu-unblock.js +234 -0
  124. package/dist/wu-unblock.js.map +1 -0
  125. package/dist/wu-validate.d.ts +16 -0
  126. package/dist/wu-validate.d.ts.map +1 -0
  127. package/dist/wu-validate.js +193 -0
  128. package/dist/wu-validate.js.map +1 -0
  129. package/package.json +92 -0
@@ -0,0 +1,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":";AACA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AACxE,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,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,6CAA6C;KAC3D;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,wDAAwD;KACtE;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;;GAEG;AACH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE/E;;;;GAIG;AACH,SAAS,qBAAqB;IAC5B,MAAM,cAAc,GAAG,EAAE,CAAC;IAC1B,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE5B,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,GAAG,KAAK,CAAC;YACjB,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtC,SAAS;QACX,CAAC;QAED,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc;IACrB,MAAM,IAAI,GAAG,cAAc,CAAC;QAC1B,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,4CAA4C;QACzD,OAAO,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC;QACjF,QAAQ,EAAE,EAAE;QACZ,iBAAiB,EAAE,IAAI;KACxB,CAAC,CAAC;IAEH,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC3B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,cAAc,GAAG,qBAAqB,EAAE,CAAC;QAC/C,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,MAAM;IAChC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE1B,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,iBAAiB,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAE3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,UAAU,6BAA6B,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC3E,OAAO,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;QACzF,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,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,CAAC;IACX,IAAI,KAAK,GAAG,IAAI,CAAC;IAEjB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE;YACnC,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,EAAE;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,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,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB;QACD,MAAM,EAAE,MAAM;YACZ,CAAC,CAAC;gBACE,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE;gBAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK;gBAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI;aAC1B;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,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC7B,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
+ * 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 {};