@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.
Files changed (50) hide show
  1. package/README.md +20 -18
  2. package/dist/agent-session.js +21 -0
  3. package/dist/agent-session.js.map +1 -1
  4. package/dist/commands/integrate.js +25 -1
  5. package/dist/commands/integrate.js.map +1 -1
  6. package/dist/hooks/enforcement-generator.js +14 -8
  7. package/dist/hooks/enforcement-generator.js.map +1 -1
  8. package/dist/hooks/enforcement-sync.js +2 -1
  9. package/dist/hooks/enforcement-sync.js.map +1 -1
  10. package/dist/hooks/generators/index.js +1 -0
  11. package/dist/hooks/generators/index.js.map +1 -1
  12. package/dist/hooks/generators/signal-received.js +4 -0
  13. package/dist/hooks/generators/signal-received.js.map +1 -0
  14. package/dist/mem-converged.js +101 -0
  15. package/dist/mem-converged.js.map +1 -0
  16. package/dist/mem-inbox.js +85 -22
  17. package/dist/mem-inbox.js.map +1 -1
  18. package/dist/mem-roster.js +11 -1
  19. package/dist/mem-roster.js.map +1 -1
  20. package/dist/mem-signal.js +162 -16
  21. package/dist/mem-signal.js.map +1 -1
  22. package/dist/mem-watch.js +207 -0
  23. package/dist/mem-watch.js.map +1 -0
  24. package/dist/public-manifest.js +14 -0
  25. package/dist/public-manifest.js.map +1 -1
  26. package/dist/session-cross-link.js +14 -2
  27. package/dist/session-cross-link.js.map +1 -1
  28. package/dist/sidecar-manager.js +25 -0
  29. package/dist/sidecar-manager.js.map +1 -1
  30. package/dist/signal-hook.js +351 -0
  31. package/dist/signal-hook.js.map +1 -0
  32. package/dist/wu-prep.js +94 -1
  33. package/dist/wu-prep.js.map +1 -1
  34. package/dist/wu-spawn-prompt-builders.js.map +1 -1
  35. package/dist/wu-spawn-strategy-resolver.js +46 -4
  36. package/dist/wu-spawn-strategy-resolver.js.map +1 -1
  37. package/package.json +13 -11
  38. package/packs/agent-runtime/auto-session-integration.ts +14 -0
  39. package/packs/agent-runtime/package.json +1 -1
  40. package/packs/agent-runtime/session-schema.ts +44 -0
  41. package/packs/sidekick/package.json +1 -1
  42. package/packs/software-delivery/manifest.ts +3 -0
  43. package/packs/software-delivery/manifest.yaml +7 -0
  44. package/packs/software-delivery/package.json +1 -1
  45. package/packs/software-delivery/tool-impl/memory-tools.ts +56 -1
  46. package/packs/software-delivery/tool-impl/runtime-cli-adapter.ts +1 -0
  47. package/templates/core/AGENTS.md.template +19 -1
  48. package/templates/core/LUMENFLOW.md.template +17 -0
  49. package/templates/core/ai/onboarding/agent-safety-card.md.template +16 -0
  50. 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.2",
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/agent": "5.3.2",
202
- "@lumenflow/control-plane-sdk": "5.3.2",
203
- "@lumenflow/host": "^5.3.2",
204
- "@lumenflow/initiatives": "5.3.2",
205
- "@lumenflow/kernel": "5.3.2",
206
- "@lumenflow/metrics": "5.3.2",
207
- "@lumenflow/memory": "5.3.2",
208
- "@lumenflow/packs-agent-runtime": "^5.3.2",
209
- "@lumenflow/core": "5.3.2",
210
- "@lumenflow/packs-software-delivery": "^5.3.2"
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
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumenflow/packs-agent-runtime",
3
- "version": "5.3.2",
3
+ "version": "5.4.0",
4
4
  "description": "Agent runtime pack scaffold for LumenFlow — governed model-turn execution, pack config, and provider capability baselines",
5
5
  "keywords": [
6
6
  "lumenflow",
@@ -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
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumenflow/packs-sidekick",
3
- "version": "5.3.2",
3
+ "version": "5.4.0",
4
4
  "description": "Sidekick personal assistant pack for LumenFlow — 16 tools for task management, typed memory, channels, routines, and audit",
5
5
  "keywords": [
6
6
  "lumenflow",
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumenflow/packs-software-delivery",
3
- "version": "5.3.2",
3
+ "version": "5.4.0",
4
4
  "description": "Software delivery pack for LumenFlow — work units, gates, lanes, initiatives, and agent coordination",
5
5
  "keywords": [
6
6
  "lumenflow",
@@ -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
- return executeMemoryTool(MEMORY_TOOLS.MEM_SIGNAL, [message, '--wu', wu]);
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> {
@@ -47,6 +47,7 @@ export const RUNTIME_CLI_COMMANDS = {
47
47
  MEM_DELETE: 'mem-delete',
48
48
  MEM_EXPORT: 'mem-export',
49
49
  MEM_INBOX: 'mem-inbox',
50
+ MEM_CONVERGED: 'mem-converged',
50
51
  MEM_INIT: 'mem-init',
51
52
  MEM_READY: 'mem-ready',
52
53
  MEM_RECOVER: 'mem-recover',
@@ -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 coordination signals 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.
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 | Uses universal files directly |
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