@lumenflow/cli 5.3.2 → 5.4.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/README.md +20 -18
- package/dist/agent-session.js +21 -0
- package/dist/agent-session.js.map +1 -1
- package/dist/commands/integrate.js +25 -1
- package/dist/commands/integrate.js.map +1 -1
- package/dist/hooks/enforcement-generator.js +14 -8
- package/dist/hooks/enforcement-generator.js.map +1 -1
- package/dist/hooks/enforcement-sync.js +2 -1
- package/dist/hooks/enforcement-sync.js.map +1 -1
- package/dist/hooks/generators/index.js +1 -0
- package/dist/hooks/generators/index.js.map +1 -1
- package/dist/hooks/generators/signal-received.js +4 -0
- package/dist/hooks/generators/signal-received.js.map +1 -0
- package/dist/mem-converged.js +101 -0
- package/dist/mem-converged.js.map +1 -0
- package/dist/mem-inbox.js +85 -22
- package/dist/mem-inbox.js.map +1 -1
- package/dist/mem-roster.js +11 -1
- package/dist/mem-roster.js.map +1 -1
- package/dist/mem-signal.js +162 -16
- package/dist/mem-signal.js.map +1 -1
- package/dist/mem-watch.js +207 -0
- package/dist/mem-watch.js.map +1 -0
- package/dist/public-manifest.js +14 -0
- package/dist/public-manifest.js.map +1 -1
- package/dist/session-cross-link.js +14 -2
- package/dist/session-cross-link.js.map +1 -1
- package/dist/sidecar-manager.js +25 -0
- package/dist/sidecar-manager.js.map +1 -1
- package/dist/signal-hook.js +351 -0
- package/dist/signal-hook.js.map +1 -0
- package/dist/wu-prep.js +94 -1
- package/dist/wu-prep.js.map +1 -1
- package/dist/wu-spawn-prompt-builders.js.map +1 -1
- package/dist/wu-spawn-strategy-resolver.js +46 -4
- package/dist/wu-spawn-strategy-resolver.js.map +1 -1
- package/package.json +13 -11
- package/packs/agent-runtime/auto-session-integration.ts +14 -0
- package/packs/agent-runtime/package.json +1 -1
- package/packs/agent-runtime/session-schema.ts +44 -0
- package/packs/sidekick/package.json +1 -1
- package/packs/software-delivery/manifest.ts +3 -0
- package/packs/software-delivery/manifest.yaml +7 -0
- package/packs/software-delivery/package.json +1 -1
- package/packs/software-delivery/tool-impl/memory-tools.ts +56 -1
- package/packs/software-delivery/tool-impl/runtime-cli-adapter.ts +1 -0
- package/templates/core/AGENTS.md.template +19 -1
- package/templates/core/LUMENFLOW.md.template +17 -0
- package/templates/core/ai/onboarding/agent-safety-card.md.template +16 -0
- package/templates/core/ai/onboarding/vendor-support.md.template +9 -9
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lumenflow/cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.4.0",
|
|
4
4
|
"description": "Command-line interface for LumenFlow workflow framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"lumenflow",
|
|
@@ -98,6 +98,7 @@
|
|
|
98
98
|
"lumenflow-validate": "./dist/validate.js",
|
|
99
99
|
"mem-checkpoint": "./dist/mem-checkpoint.js",
|
|
100
100
|
"mem-cleanup": "./dist/mem-cleanup.js",
|
|
101
|
+
"mem-converged": "./dist/mem-converged.js",
|
|
101
102
|
"mem-context": "./dist/mem-context.js",
|
|
102
103
|
"mem-create": "./dist/mem-create.js",
|
|
103
104
|
"mem-delete": "./dist/mem-delete.js",
|
|
@@ -111,6 +112,7 @@
|
|
|
111
112
|
"mem-start": "./dist/mem-start.js",
|
|
112
113
|
"mem-summarize": "./dist/mem-summarize.js",
|
|
113
114
|
"mem-triage": "./dist/mem-triage.js",
|
|
115
|
+
"mem-watch": "./dist/mem-watch.js",
|
|
114
116
|
"metrics": "./dist/metrics-cli.js",
|
|
115
117
|
"metrics-snapshot": "./dist/metrics-snapshot.js",
|
|
116
118
|
"onboard": "./dist/onboard.js",
|
|
@@ -198,16 +200,16 @@
|
|
|
198
200
|
"xstate": "^5.28.0",
|
|
199
201
|
"yaml": "^2.8.2",
|
|
200
202
|
"zod": "^4.3.6",
|
|
201
|
-
"@lumenflow/
|
|
202
|
-
"@lumenflow/
|
|
203
|
-
"@lumenflow/
|
|
204
|
-
"@lumenflow/
|
|
205
|
-
"@lumenflow/
|
|
206
|
-
"@lumenflow/
|
|
207
|
-
"@lumenflow/
|
|
208
|
-
"@lumenflow/
|
|
209
|
-
"@lumenflow/
|
|
210
|
-
"@lumenflow/
|
|
203
|
+
"@lumenflow/core": "5.4.0",
|
|
204
|
+
"@lumenflow/host": "^5.4.0",
|
|
205
|
+
"@lumenflow/initiatives": "5.4.0",
|
|
206
|
+
"@lumenflow/kernel": "5.4.0",
|
|
207
|
+
"@lumenflow/memory": "5.4.0",
|
|
208
|
+
"@lumenflow/agent": "5.4.0",
|
|
209
|
+
"@lumenflow/packs-software-delivery": "^5.4.0",
|
|
210
|
+
"@lumenflow/metrics": "5.4.0",
|
|
211
|
+
"@lumenflow/packs-agent-runtime": "^5.4.0",
|
|
212
|
+
"@lumenflow/control-plane-sdk": "5.4.0"
|
|
211
213
|
},
|
|
212
214
|
"devDependencies": {
|
|
213
215
|
"@vitest/coverage-v8": "^4.0.18",
|
|
@@ -83,6 +83,10 @@ interface SessionFileData {
|
|
|
83
83
|
/** ADR-014 extension 2 — which skill bundle the agent identifies as carrying (WU-2754). */
|
|
84
84
|
specialty_profile?: string;
|
|
85
85
|
display_name?: string;
|
|
86
|
+
/** Stable explicit A2A reader identity. Format hint: <owner>:<role>:<purpose>. */
|
|
87
|
+
agent_identity?: string;
|
|
88
|
+
/** Reserved cloud workspace/tenant scope slot; unused by local runtime. */
|
|
89
|
+
tenant_id?: string;
|
|
86
90
|
/** ADR-014 extension 2 — parent delegation registry reference (WU-2754). */
|
|
87
91
|
delegation_id?: string;
|
|
88
92
|
}
|
|
@@ -455,6 +459,10 @@ interface StartSessionOptions {
|
|
|
455
459
|
/** ADR-014 specialty_profile for this session (e.g. 'delivery'). */
|
|
456
460
|
specialtyProfile?: string;
|
|
457
461
|
displayName?: string;
|
|
462
|
+
/** Explicit stable A2A reader identity. Format hint: <owner>:<role>:<purpose>. */
|
|
463
|
+
agentIdentity?: string;
|
|
464
|
+
/** Reserved cloud workspace/tenant scope slot; unused by local runtime. */
|
|
465
|
+
tenantId?: string;
|
|
458
466
|
/** Parent delegation-registry record reference (dlg-XXXX). */
|
|
459
467
|
delegationId?: string;
|
|
460
468
|
}
|
|
@@ -511,6 +519,8 @@ export async function startSessionForWU(options: StartSessionOptions): Promise<S
|
|
|
511
519
|
lifecycleRole,
|
|
512
520
|
specialtyProfile,
|
|
513
521
|
displayName,
|
|
522
|
+
agentIdentity,
|
|
523
|
+
tenantId,
|
|
514
524
|
delegationId,
|
|
515
525
|
} = options;
|
|
516
526
|
|
|
@@ -542,6 +552,8 @@ export async function startSessionForWU(options: StartSessionOptions): Promise<S
|
|
|
542
552
|
lifecycle_role: lifecycleRole,
|
|
543
553
|
specialty_profile: specialtyProfile,
|
|
544
554
|
display_name: displayName,
|
|
555
|
+
agent_identity: agentIdentity,
|
|
556
|
+
tenant_id: tenantId,
|
|
545
557
|
delegation_id: delegationId,
|
|
546
558
|
});
|
|
547
559
|
const resolvedDisplayName = roleAxes.display_name ?? acquireDisplayName(workspaceRoot, sessionId);
|
|
@@ -564,6 +576,8 @@ export async function startSessionForWU(options: StartSessionOptions): Promise<S
|
|
|
564
576
|
lifecycle_role: roleAxes.lifecycle_role,
|
|
565
577
|
specialty_profile: roleAxes.specialty_profile,
|
|
566
578
|
display_name: resolvedDisplayName,
|
|
579
|
+
...(roleAxes.agent_identity ? { agent_identity: roleAxes.agent_identity } : {}),
|
|
580
|
+
...(roleAxes.tenant_id ? { tenant_id: roleAxes.tenant_id } : {}),
|
|
567
581
|
...(roleAxes.delegation_id ? { delegation_id: roleAxes.delegation_id } : {}),
|
|
568
582
|
};
|
|
569
583
|
|
|
@@ -70,6 +70,7 @@ export const DISPLAY_NAME_POOL_RELATIVE_PATH = '.lumenflow/agents/display-name-p
|
|
|
70
70
|
export const DISPLAY_NAME_RESERVATIONS_RELATIVE_PATH =
|
|
71
71
|
'.lumenflow/state/display-name-reservations.jsonl';
|
|
72
72
|
export const DISPLAY_NAME_RESERVATION_TTL_HOURS = 12;
|
|
73
|
+
export const AGENT_IDENTITY_MIN_LENGTH = 3;
|
|
73
74
|
|
|
74
75
|
/** Regex for delegation_id references back into delegation registry. */
|
|
75
76
|
export const DELEGATION_ID_PATTERN = /^dlg-[0-9a-f]{4}$/;
|
|
@@ -93,6 +94,14 @@ export const SessionRoleAxesSchema = z.object({
|
|
|
93
94
|
.optional(),
|
|
94
95
|
});
|
|
95
96
|
|
|
97
|
+
const AgentIdentitySchema = z
|
|
98
|
+
.string()
|
|
99
|
+
.trim()
|
|
100
|
+
.min(AGENT_IDENTITY_MIN_LENGTH, {
|
|
101
|
+
message: `agent_identity must be at least ${AGENT_IDENTITY_MIN_LENGTH} characters`,
|
|
102
|
+
});
|
|
103
|
+
const TenantIdSchema = z.string().trim().min(1, { message: 'tenant_id must be non-empty' });
|
|
104
|
+
|
|
96
105
|
/**
|
|
97
106
|
* Base session schema — shared fields across v1 and v2.
|
|
98
107
|
*
|
|
@@ -104,6 +113,8 @@ const SessionRecordBaseSchema = z.object({
|
|
|
104
113
|
session_id: z.string().min(1),
|
|
105
114
|
wu_id: z.string().min(1),
|
|
106
115
|
started: z.string().min(1),
|
|
116
|
+
agent_identity: AgentIdentitySchema.optional(),
|
|
117
|
+
tenant_id: TenantIdSchema.optional(),
|
|
107
118
|
});
|
|
108
119
|
|
|
109
120
|
/**
|
|
@@ -172,11 +183,15 @@ export function withV2RoleDefaults(input: {
|
|
|
172
183
|
specialty_profile?: string | null;
|
|
173
184
|
display_name?: string | null;
|
|
174
185
|
delegation_id?: string | null;
|
|
186
|
+
agent_identity?: string | null;
|
|
187
|
+
tenant_id?: string | null;
|
|
175
188
|
}): {
|
|
176
189
|
lifecycle_role: string;
|
|
177
190
|
specialty_profile: string;
|
|
178
191
|
display_name?: string;
|
|
179
192
|
delegation_id?: string;
|
|
193
|
+
agent_identity?: string;
|
|
194
|
+
tenant_id?: string;
|
|
180
195
|
} {
|
|
181
196
|
const lifecycle_role =
|
|
182
197
|
typeof input.lifecycle_role === 'string' && input.lifecycle_role.trim().length > 0
|
|
@@ -194,11 +209,14 @@ export function withV2RoleDefaults(input: {
|
|
|
194
209
|
typeof input.display_name === 'string' && input.display_name.trim().length > 0
|
|
195
210
|
? input.display_name.trim()
|
|
196
211
|
: undefined;
|
|
212
|
+
const identityFields = normalizeOptionalSessionIdentityFields(input);
|
|
197
213
|
const out: {
|
|
198
214
|
lifecycle_role: string;
|
|
199
215
|
specialty_profile: string;
|
|
200
216
|
display_name?: string;
|
|
201
217
|
delegation_id?: string;
|
|
218
|
+
agent_identity?: string;
|
|
219
|
+
tenant_id?: string;
|
|
202
220
|
} = {
|
|
203
221
|
lifecycle_role,
|
|
204
222
|
specialty_profile,
|
|
@@ -209,6 +227,32 @@ export function withV2RoleDefaults(input: {
|
|
|
209
227
|
if (delegation_id) {
|
|
210
228
|
out.delegation_id = delegation_id;
|
|
211
229
|
}
|
|
230
|
+
if (identityFields.agent_identity) {
|
|
231
|
+
out.agent_identity = identityFields.agent_identity;
|
|
232
|
+
}
|
|
233
|
+
if (identityFields.tenant_id) {
|
|
234
|
+
out.tenant_id = identityFields.tenant_id;
|
|
235
|
+
}
|
|
236
|
+
return out;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export function normalizeOptionalSessionIdentityFields(input: {
|
|
240
|
+
agent_identity?: string | null;
|
|
241
|
+
tenant_id?: string | null;
|
|
242
|
+
}): {
|
|
243
|
+
agent_identity?: string;
|
|
244
|
+
tenant_id?: string;
|
|
245
|
+
} {
|
|
246
|
+
const out: {
|
|
247
|
+
agent_identity?: string;
|
|
248
|
+
tenant_id?: string;
|
|
249
|
+
} = {};
|
|
250
|
+
if (typeof input.agent_identity === 'string' && input.agent_identity.trim().length > 0) {
|
|
251
|
+
out.agent_identity = AgentIdentitySchema.parse(input.agent_identity);
|
|
252
|
+
}
|
|
253
|
+
if (typeof input.tenant_id === 'string' && input.tenant_id.trim().length > 0) {
|
|
254
|
+
out.tenant_id = TenantIdSchema.parse(input.tenant_id);
|
|
255
|
+
}
|
|
212
256
|
return out;
|
|
213
257
|
}
|
|
214
258
|
|
|
@@ -140,6 +140,7 @@ const MEM_DELETE_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memDeleteTool';
|
|
|
140
140
|
const MEM_EXPORT_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memExportTool';
|
|
141
141
|
const MEM_INBOX_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memInboxTool';
|
|
142
142
|
const MEM_SIGNAL_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memSignalTool';
|
|
143
|
+
const MEM_CONVERGED_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memConvergedTool';
|
|
143
144
|
const MEM_SUMMARIZE_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memSummarizeTool';
|
|
144
145
|
const MEM_TRIAGE_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memTriageTool';
|
|
145
146
|
const MEM_RECOVER_TOOL_ENTRY = 'tool-impl/memory-tools.ts#memRecoverTool';
|
|
@@ -245,6 +246,7 @@ const TOOL_PERMISSIONS = {
|
|
|
245
246
|
'wu:validate': 'read',
|
|
246
247
|
'mem:checkpoint': 'write',
|
|
247
248
|
'mem:cleanup': 'write',
|
|
249
|
+
'mem:converged': 'read',
|
|
248
250
|
'mem:context': 'read',
|
|
249
251
|
'mem:create': 'write',
|
|
250
252
|
'mem:delete': 'write',
|
|
@@ -371,6 +373,7 @@ const TOOL_ENTRY_OVERRIDES: Partial<Record<ToolName, string>> = {
|
|
|
371
373
|
'mem:export': MEM_EXPORT_TOOL_ENTRY,
|
|
372
374
|
'mem:inbox': MEM_INBOX_TOOL_ENTRY,
|
|
373
375
|
'mem:signal': MEM_SIGNAL_TOOL_ENTRY,
|
|
376
|
+
'mem:converged': MEM_CONVERGED_TOOL_ENTRY,
|
|
374
377
|
'mem:summarize': MEM_SUMMARIZE_TOOL_ENTRY,
|
|
375
378
|
'mem:triage': MEM_TRIAGE_TOOL_ENTRY,
|
|
376
379
|
'mem:recover': MEM_RECOVER_TOOL_ENTRY,
|
|
@@ -244,6 +244,13 @@ tools:
|
|
|
244
244
|
entry: tool-impl/memory-tools.ts#memCleanupTool
|
|
245
245
|
permission: write
|
|
246
246
|
required_scopes: *softwareDeliveryWriteScopes
|
|
247
|
+
- name: mem:converged
|
|
248
|
+
entry: tool-impl/memory-tools.ts#memConvergedTool
|
|
249
|
+
permission: read
|
|
250
|
+
required_scopes:
|
|
251
|
+
- type: path
|
|
252
|
+
pattern: '**'
|
|
253
|
+
access: read
|
|
247
254
|
- name: mem:context
|
|
248
255
|
entry: tool-impl/memory-tools.ts#memContextTool
|
|
249
256
|
permission: read
|
|
@@ -16,6 +16,7 @@ const MEMORY_TOOLS = {
|
|
|
16
16
|
MEM_EXPORT: 'mem:export',
|
|
17
17
|
MEM_INBOX: 'mem:inbox',
|
|
18
18
|
MEM_SIGNAL: 'mem:signal',
|
|
19
|
+
MEM_CONVERGED: 'mem:converged',
|
|
19
20
|
MEM_SUMMARIZE: 'mem:summarize',
|
|
20
21
|
MEM_TRIAGE: 'mem:triage',
|
|
21
22
|
MEM_RECOVER: 'mem:recover',
|
|
@@ -35,6 +36,7 @@ const MEMORY_TOOL_ERROR_CODES: Record<MemoryToolName, string> = {
|
|
|
35
36
|
'mem:export': 'MEM_EXPORT_ERROR',
|
|
36
37
|
'mem:inbox': 'MEM_INBOX_ERROR',
|
|
37
38
|
'mem:signal': 'MEM_SIGNAL_ERROR',
|
|
39
|
+
'mem:converged': 'MEM_CONVERGED_ERROR',
|
|
38
40
|
'mem:summarize': 'MEM_SUMMARIZE_ERROR',
|
|
39
41
|
'mem:triage': 'MEM_TRIAGE_ERROR',
|
|
40
42
|
'mem:recover': 'MEM_RECOVER_ERROR',
|
|
@@ -55,6 +57,7 @@ const MEMORY_TOOL_COMMANDS: Record<
|
|
|
55
57
|
'mem:export': RUNTIME_CLI_COMMANDS.MEM_EXPORT,
|
|
56
58
|
'mem:inbox': RUNTIME_CLI_COMMANDS.MEM_INBOX,
|
|
57
59
|
'mem:signal': RUNTIME_CLI_COMMANDS.MEM_SIGNAL,
|
|
60
|
+
'mem:converged': RUNTIME_CLI_COMMANDS.MEM_CONVERGED,
|
|
58
61
|
'mem:summarize': RUNTIME_CLI_COMMANDS.MEM_SUMMARIZE,
|
|
59
62
|
'mem:triage': RUNTIME_CLI_COMMANDS.MEM_TRIAGE,
|
|
60
63
|
'mem:recover': RUNTIME_CLI_COMMANDS.MEM_RECOVER,
|
|
@@ -338,6 +341,18 @@ export async function memInboxTool(input: unknown): Promise<ToolOutput> {
|
|
|
338
341
|
if (lane) {
|
|
339
342
|
args.push('--lane', lane);
|
|
340
343
|
}
|
|
344
|
+
const reader = toStringValue(parsed.for);
|
|
345
|
+
if (reader) {
|
|
346
|
+
args.push('--for', reader);
|
|
347
|
+
}
|
|
348
|
+
const thread = toStringValue(parsed.thread);
|
|
349
|
+
if (thread) {
|
|
350
|
+
args.push('--thread', thread);
|
|
351
|
+
}
|
|
352
|
+
const intent = toStringValue(parsed.intent);
|
|
353
|
+
if (intent) {
|
|
354
|
+
args.push('--intent', intent);
|
|
355
|
+
}
|
|
341
356
|
|
|
342
357
|
return executeMemoryTool(MEMORY_TOOLS.MEM_INBOX, args);
|
|
343
358
|
}
|
|
@@ -354,7 +369,47 @@ export async function memSignalTool(input: unknown): Promise<ToolOutput> {
|
|
|
354
369
|
return createMissingParameterOutput(MISSING_PARAMETER_MESSAGES.WU_REQUIRED);
|
|
355
370
|
}
|
|
356
371
|
|
|
357
|
-
|
|
372
|
+
const args = [message, '--wu', wu];
|
|
373
|
+
const to = toStringValue(parsed.to);
|
|
374
|
+
if (to) {
|
|
375
|
+
args.push('--to', to);
|
|
376
|
+
}
|
|
377
|
+
const thread = toStringValue(parsed.thread);
|
|
378
|
+
if (thread) {
|
|
379
|
+
args.push('--thread', thread);
|
|
380
|
+
}
|
|
381
|
+
const replyTo = toStringValue(parsed.reply_to);
|
|
382
|
+
if (replyTo) {
|
|
383
|
+
args.push('--reply-to', replyTo);
|
|
384
|
+
}
|
|
385
|
+
const intent = toStringValue(parsed.intent);
|
|
386
|
+
if (intent) {
|
|
387
|
+
args.push('--intent', intent);
|
|
388
|
+
}
|
|
389
|
+
const interrupt = toStringValue(parsed.interrupt);
|
|
390
|
+
if (interrupt) {
|
|
391
|
+
args.push('--interrupt', interrupt);
|
|
392
|
+
}
|
|
393
|
+
if (parsed.requires_ack === true) {
|
|
394
|
+
args.push('--requires-ack');
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
return executeMemoryTool(MEMORY_TOOLS.MEM_SIGNAL, args);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
export async function memConvergedTool(input: unknown): Promise<ToolOutput> {
|
|
401
|
+
const parsed = toRecord(input);
|
|
402
|
+
const thread = toStringValue(parsed.thread);
|
|
403
|
+
if (!thread) {
|
|
404
|
+
return createMissingParameterOutput('thread is required');
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
const args = ['--thread', thread];
|
|
408
|
+
if (parsed.quiet === true) {
|
|
409
|
+
args.push('--quiet');
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
return executeMemoryTool(MEMORY_TOOLS.MEM_CONVERGED, args);
|
|
358
413
|
}
|
|
359
414
|
|
|
360
415
|
export async function memSummarizeTool(input: unknown): Promise<ToolOutput> {
|
|
@@ -70,7 +70,7 @@ cd <project-root> && pnpm wu:done --id WU-XXXX
|
|
|
70
70
|
Step 2 above is not optional:
|
|
71
71
|
|
|
72
72
|
- `wu:brief` records checkpoint evidence; `wu:done` **blocks** without it for feature/bug WUs.
|
|
73
|
-
- `wu:brief` also auto-loads shared memory and
|
|
73
|
+
- `wu:brief` also auto-loads shared memory and an Inbox Snapshot into the generated prompt (WU-1240, WU-2607) — read the `## Memory Context` section in the brief output before coding. Manual `mem:context`/`mem:inbox` calls are still available as ad-hoc lookups mid-WU.
|
|
74
74
|
- Load relevant skills (`design-first`, `tdd-workflow`, `frontend-design`, `worktree-discipline`, `lumenflow-gates`) via your vendor's skill primitive. Claude Code, Codex, Cursor, and Windsurf all support `SKILL.md`-based skills (with minor invocation differences); Aider uses `CONVENTIONS.md`; Cline uses `.clinerules`. See [LUMENFLOW.md "Skills & Agents"](LUMENFLOW.md#skills--agents) for the invocation table, and your per-vendor rules file for specifics.
|
|
75
75
|
|
|
76
76
|
### During the WU
|
|
@@ -83,6 +83,16 @@ pnpm mem:signal '<short status>' --wu WU-XXXX
|
|
|
83
83
|
pnpm mem:checkpoint --wu WU-XXXX --note '<progress>' --next-steps '<what is next>'
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
+
### Inbox Signals Are Decision Points
|
|
87
|
+
|
|
88
|
+
At `wu:brief`, after every `mem:checkpoint`, and before `wu:prep`, inspect unread coordination
|
|
89
|
+
signals for your WU/session. A signal is not noise: read it, decide whether it changes or blocks the
|
|
90
|
+
WU, and reply, acknowledge, or dismiss it before continuing.
|
|
91
|
+
|
|
92
|
+
This convention applies to Claude Code, Codex, Cursor, Gemini CLI, and Windsurf briefs. Aider and
|
|
93
|
+
Cline do not use `wu:brief` client variants, but they must follow the same polling rule through this
|
|
94
|
+
onboarding guidance and their generated rules surfaces.
|
|
95
|
+
|
|
86
96
|
**Classification rule:** if the fact would help _another_ agent vendor working this repo, it belongs in shared memory (`mem:create`), not your vendor's personal memory folder. Examples of shared: bug discoveries, architecture decisions, CI/gates gotchas, initiative direction, cross-WU scope flags. Examples of vendor-personal: behavioural feedback, user preferences, tool-invocation mechanics.
|
|
87
97
|
|
|
88
98
|
**Shell-quoting footgun:** always **single-quote** the `--title` value. Bash expands `$var`, `$0`, backticks, and `!hist` inside double-quoted strings, silently corrupting prose containing prices (`$49`), positional refs, or exclamation marks. See [Memory section in LUMENFLOW.md](LUMENFLOW.md#memory-shared-vs-vendor-personal) for the full mem:\* contract.
|
|
@@ -204,6 +214,14 @@ LumenFlow enforces safety at the repository level via git wrappers and hooks. Fo
|
|
|
204
214
|
|
|
205
215
|
This file provides universal guidance for all AI agents. LumenFlow skills live in `.lumenflow/skills/` as `SKILL.md` files and are projected to each vendor via `pnpm lumenflow:integrate --client <x>`.
|
|
206
216
|
|
|
217
|
+
Agent plugins are a discovery and invocation on-ramp, not a replacement for repo-level LumenFlow
|
|
218
|
+
integration. If a plugin is installed alongside standalone projections, use the surface-specific
|
|
219
|
+
name: standalone skills keep local names such as `design-first`, Claude plugin skills use names such
|
|
220
|
+
as `/lumenflow:design-first`, and Codex plugin use should select the installed `lumenflow` plugin or
|
|
221
|
+
bundled skill through Codex's `@` plugin selection surface. Plugin installation must not delete
|
|
222
|
+
`.claude/skills/` or `.agents/skills/`, and governed repo enforcement still requires
|
|
223
|
+
`npx lumenflow init`, `pnpm lumenflow:integrate`, or `pnpm lumenflow:integrate --sync`.
|
|
224
|
+
|
|
207
225
|
| Vendor | Skill / rules surface | Invocation |
|
|
208
226
|
| ------------ | --------------------------------------------------- | ---------------------------------------------------------------------- |
|
|
209
227
|
| Claude Code | `.claude/skills/` + `.claude/CLAUDE.md` | `Skill` tool call, or `/skill <name>` in interactive CLI |
|
|
@@ -727,6 +727,15 @@ If you're an AI agent, read the onboarding docs:
|
|
|
727
727
|
|
|
728
728
|
Skills are reusable workflow/knowledge bundles that agents load on demand. The `SKILL.md` format pioneered by Claude Code has converged into a de-facto standard adopted by OpenAI Codex (Dec 2025), Cursor (v2.4), and Windsurf Cascade (Jan 2026). LumenFlow stores vendor-neutral skill sources in `.lumenflow/skills/` and projects them to each vendor surface via `pnpm lumenflow:integrate --client <x>`.
|
|
729
729
|
|
|
730
|
+
Agent plugins are a distribution on-ramp, not a replacement for these repo-level
|
|
731
|
+
projections or for the Software Delivery Pack runtime. Standalone projected
|
|
732
|
+
skills keep local names such as `design-first`, while plugin-installed Claude
|
|
733
|
+
skills use plugin-qualified names such as `/lumenflow:design-first`. If both
|
|
734
|
+
surfaces exist, prompts and handoff text must say which one they mean.
|
|
735
|
+
Installing a plugin gives the agent methodology and entrypoint guidance;
|
|
736
|
+
repo-level enforcement still requires `npx lumenflow init`,
|
|
737
|
+
`pnpm lumenflow:integrate`, or `pnpm lumenflow:integrate --sync`.
|
|
738
|
+
|
|
730
739
|
### Core skills (vendor-neutral)
|
|
731
740
|
|
|
732
741
|
| Skill | Load before... |
|
|
@@ -752,6 +761,14 @@ A skill name written in prose does nothing — it must be **loaded** through the
|
|
|
752
761
|
| Aider | `CONVENTIONS.md` | `/read CONVENTIONS.md` or `aider --read CONVENTIONS.md` |
|
|
753
762
|
| Cline | `.clinerules` | Auto-loaded |
|
|
754
763
|
|
|
764
|
+
For plugin-distributed skills, prefer the vendor's plugin-qualified invocation
|
|
765
|
+
surface instead of rewriting all canonical skill names. Claude Code plugin
|
|
766
|
+
skills are namespaced as `/lumenflow:<skill>`. Codex plugin use should name the
|
|
767
|
+
installed `lumenflow` plugin or one of its bundled skills through Codex's `@`
|
|
768
|
+
plugin selection surface. Standalone projections remain valid until a future
|
|
769
|
+
explicit cleanup command such as `--plugin-only` exists and is run
|
|
770
|
+
intentionally.
|
|
771
|
+
|
|
755
772
|
For vendor-specific setup details and per-vendor quirks, see:
|
|
756
773
|
|
|
757
774
|
- Claude Code: [.claude/CLAUDE.md](.claude/CLAUDE.md)
|
|
@@ -40,12 +40,28 @@ Quick reference for AI agents working in LumenFlow projects.
|
|
|
40
40
|
| Read WU spec first | Understand scope |
|
|
41
41
|
| cd to worktree after claim | Isolation |
|
|
42
42
|
| Write tests before code | TDD |
|
|
43
|
+
| Treat unread inbox signals as decisions | Prevent missed redirects |
|
|
43
44
|
| Run wu:prep in the claimed workspace | Quality and lifecycle correctness |
|
|
44
45
|
| Run wu:done from main | Complete WU |
|
|
45
46
|
| Stay within code_paths | Scope discipline |
|
|
46
47
|
|
|
47
48
|
---
|
|
48
49
|
|
|
50
|
+
## Coordination Signals
|
|
51
|
+
|
|
52
|
+
`wu:brief` includes an Inbox Snapshot when memory is available. Also check `mem:inbox`
|
|
53
|
+
after checkpoints and before `wu:prep`.
|
|
54
|
+
|
|
55
|
+
An unread signal is a decision point:
|
|
56
|
+
|
|
57
|
+
1. Read it.
|
|
58
|
+
2. Decide whether it changes, blocks, or does not affect the WU.
|
|
59
|
+
3. Reply, acknowledge, or dismiss it before continuing.
|
|
60
|
+
|
|
61
|
+
Do not leave directed signals for `wu:done`; by then the coordination window has already passed.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
49
65
|
## Universal Safety Mechanisms
|
|
50
66
|
|
|
51
67
|
### Git Safety Wrapper
|
|
@@ -31,15 +31,15 @@ lumenflow init
|
|
|
31
31
|
|
|
32
32
|
For popular AI coding assistants, LumenFlow provides **optional enhanced integrations** with deeper features like auto-detection, skills, and vendor-specific configurations.
|
|
33
33
|
|
|
34
|
-
| Assistant | Config File | Auto-detected | Enhanced Features
|
|
35
|
-
| ----------- | ------------------------------ | ------------- |
|
|
36
|
-
| Claude Code | `CLAUDE.md`, `.claude/` | Yes | Skills, agents, hooks, settings |
|
|
37
|
-
| Cursor | `.cursor/rules/lumenflow.md` | Yes | Rules integration
|
|
38
|
-
| Windsurf | `.windsurf/rules/lumenflow.md` | Yes | Rules integration
|
|
39
|
-
| Cline | `.clinerules` | No | Rules file
|
|
40
|
-
| Codex | `AGENTS.md` (native) | No |
|
|
41
|
-
| Aider | `.aider.conf.yml` | No | Config file
|
|
42
|
-
| Antigravity | `AGENTS.md` (native) | Unknown | Research phase
|
|
34
|
+
| Assistant | Config File | Auto-detected | Enhanced Features |
|
|
35
|
+
| ----------- | ------------------------------ | ------------- | ---------------------------------------------------------------- |
|
|
36
|
+
| Claude Code | `CLAUDE.md`, `.claude/` | Yes | Skills, agents, hooks, settings, A2A `signal:received` delivery |
|
|
37
|
+
| Cursor | `.cursor/rules/lumenflow.md` | Yes | Rules integration; A2A push deferred to `mem:watch` |
|
|
38
|
+
| Windsurf | `.windsurf/rules/lumenflow.md` | Yes | Rules integration; A2A push deferred to `mem:watch` |
|
|
39
|
+
| Cline | `.clinerules` | No | Rules file; poll `mem:inbox` for A2A signals |
|
|
40
|
+
| Codex | `AGENTS.md` (native) | No | Universal files directly; A2A push deferred to `mem:watch` |
|
|
41
|
+
| Aider | `.aider.conf.yml` | No | Config file; poll `mem:inbox` for A2A signals |
|
|
42
|
+
| Antigravity | `AGENTS.md` (native) | Unknown | Research phase |
|
|
43
43
|
|
|
44
44
|
---
|
|
45
45
|
|