@lumenflow/cli 5.3.2 → 5.5.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/gate-defaults.js +154 -9
- package/dist/gate-defaults.js.map +1 -1
- package/dist/gate-registry.js.map +1 -1
- package/dist/gates-runners.js +358 -0
- package/dist/gates-runners.js.map +1 -1
- package/dist/gates.js +347 -3
- package/dist/gates.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/metrics-cli.js +19 -2
- package/dist/metrics-cli.js.map +1 -1
- package/dist/metrics-snapshot.js +25 -2
- package/dist/metrics-snapshot.js.map +1 -1
- 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-done-gates.js +112 -3
- package/dist/wu-done-gates.js.map +1 -1
- package/dist/wu-done.js +30 -6
- package/dist/wu-done.js.map +1 -1
- package/dist/wu-prep.js +185 -2
- 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/src/constants/wu-cli-constants.ts +12 -0
- 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 +98 -8
- package/templates/core/LUMENFLOW.md.template +197 -19
- package/templates/core/ai/onboarding/agent-invocation-guide.md.template +0 -5
- package/templates/core/ai/onboarding/agent-safety-card.md.template +63 -1
- package/templates/core/ai/onboarding/initiative-orchestration.md.template +4 -0
- package/templates/core/ai/onboarding/release-process.md.template +7 -7
- package/templates/core/ai/onboarding/vendor-support.md.template +74 -10
- package/templates/vendors/claude/.claude/skills/frontend-design/SKILL.md.template +1 -1
- package/templates/vendors/claude/.claude/skills/wu-lifecycle/SKILL.md.template +28 -0
|
@@ -205,7 +205,7 @@ intentionally exempt and the workspace policy does not already exclude it.
|
|
|
205
205
|
## Core Principles
|
|
206
206
|
|
|
207
207
|
1. **Design-First** (feature/refactor WUs): Load the `design-first` skill before implementation. Question requirements, delete unnecessary, simplify before optimizing. Invocation varies by vendor — see [Skills & Agents](#skills--agents) below.
|
|
208
|
-
2. **Fit-For-Surface Verification**: Choose the least brittle verification that gives strong confidence. Prefer TDD for runtime logic when repository policy requires it; prefer behavior-focused integration, smoke, visual, or manual verification for UI, content, and presentation work. Never assert inline styles, CSS values, exact copy, or DOM shape in E2E/integration tests.
|
|
208
|
+
2. **Fit-For-Surface Verification**: Choose the least brittle verification that gives strong confidence. Prefer TDD for runtime logic when repository policy requires it; prefer behavior-focused integration, smoke, visual, or manual verification for UI, content, and presentation work. Never assert inline styles, CSS values, exact copy, or DOM shape in E2E/integration tests. For the boundary between framework-owned gates, generated brief content, and consumer-authored local guidance, see [ADR-017](docs/09-architecture-decisions/ADR-017-lumenflow-configurability-principle.md).
|
|
209
209
|
3. **Library-First**: Search existing libraries before custom code
|
|
210
210
|
4. **DRY/SOLID/KISS/YAGNI**: No magic numbers, no hardcoded strings
|
|
211
211
|
5. **Worktree Discipline**: After `wu:claim`, work ONLY in the worktree
|
|
@@ -252,17 +252,59 @@ pnpm mem:inbox # coordination signals (defaults to unread)
|
|
|
252
252
|
The memory layer also supports live-session addressing for active agents:
|
|
253
253
|
|
|
254
254
|
```bash
|
|
255
|
-
pnpm mem:roster # list active session_id/display_name/role rows
|
|
256
|
-
pnpm mem:signal 'please review' --wu WU-XXXX --to Planck
|
|
257
|
-
pnpm mem:inbox --for Planck
|
|
255
|
+
pnpm mem:roster # list active session_id/display_name/agent_identity/role rows
|
|
256
|
+
pnpm mem:signal 'please review' --wu WU-XXXX --to Planck,codex:implementer:host42 --intent PROPOSE --requires-ack
|
|
257
|
+
pnpm mem:inbox --for Planck --thread thread-1234 # directed + broadcast signals for that identity
|
|
258
|
+
pnpm mem:converged --thread thread-1234 # exit 0 when every root recipient replied AGREE
|
|
258
259
|
pnpm mem:context --wu WU-XXXX --no-roster # opt out when a test needs stable output
|
|
259
260
|
```
|
|
260
261
|
|
|
262
|
+
The wire contract for agent-to-agent coordination is `A2A.V1`, exported from
|
|
263
|
+
`@lumenflow/control-plane-sdk/a2a`. Local files under `.lumenflow/memory/`, the
|
|
264
|
+
Claude `PostToolUse` hook, and `mem:watch` are adapters over that contract, not
|
|
265
|
+
separate schemas. `workspace_id` is optional for local worktrees and required
|
|
266
|
+
for hosted transports such as lumenflow.cloud, where it is the tenant/workspace
|
|
267
|
+
routing key.
|
|
268
|
+
|
|
261
269
|
`display_name` is an ephemeral live-session handle, not a stable role alias. It
|
|
262
270
|
is assigned from `.lumenflow/agents/display-name-pool.yaml` when a session
|
|
263
271
|
starts and released when the session ends. `mem:signal --to` / `mem:inbox --for`
|
|
264
|
-
|
|
265
|
-
|
|
272
|
+
accept a `session_id`, current `display_name`, or explicit `agent_identity`.
|
|
273
|
+
`mem:signal --to` also accepts comma-separated recipients. Directed signals are
|
|
274
|
+
persisted as canonical A2A `recipients[]`; `target_agent` remains only as the
|
|
275
|
+
single-recipient legacy alias.
|
|
276
|
+
|
|
277
|
+
`agent_identity` is an explicit stable reader identity for A2A receipt
|
|
278
|
+
coalescing across restarts or concurrent sessions. Set it with
|
|
279
|
+
`pnpm agent:session --agent-identity <owner>:<role>:<purpose>` or
|
|
280
|
+
`LUMENFLOW_AGENT_IDENTITY`; LumenFlow never derives it from PID, hostname, or
|
|
281
|
+
runtime metadata. When it is absent, receipt state falls back to the ephemeral
|
|
282
|
+
`session_id`.
|
|
283
|
+
|
|
284
|
+
A2A signal semantics are structured, not prose-only. `mem:signal` supports
|
|
285
|
+
`--thread`, `--reply-to`, `--intent INFO|PROPOSE|COUNTER|AGREE|REJECT`,
|
|
286
|
+
`--interrupt advisory|priority|urgent|soon|immediate`, and `--requires-ack`.
|
|
287
|
+
Directed root signals default to `interrupt_class: priority` and get a generated
|
|
288
|
+
`thread_id`; broadcasts default to `interrupt_class: advisory`. Replies inherit
|
|
289
|
+
the parent thread unless `--thread` is explicit. When a recipient posts
|
|
290
|
+
`--intent AGREE` or `--intent REJECT` on that thread, the root signal receipt is
|
|
291
|
+
promoted to `acked` or `rejected`, and `mem:converged --thread <id>` reports
|
|
292
|
+
whether every root recipient has agreed. Local JSONL remains only the dev
|
|
293
|
+
adapter over `A2ASignalV1` / `A2AReceiptV1`; lumenflow.cloud should use the same
|
|
294
|
+
contract over its hosted transport.
|
|
295
|
+
|
|
296
|
+
Claude Code projects with generated LumenFlow hooks receive addressed
|
|
297
|
+
`signal:received` events at the next `PostToolUse` boundary. The hook surfaces
|
|
298
|
+
`intent`, `interrupt_class`, `requires_ack`, and same-thread ACK/REJECT commands
|
|
299
|
+
without replacing the `wu:prep` unread-directed-signal gate. Other local clients
|
|
300
|
+
can run `pnpm mem:watch --session <session_id|display_name|agent_identity>` in
|
|
301
|
+
a side terminal for foreground `signal:received` delivery through the same event
|
|
302
|
+
queue and receipt model.
|
|
303
|
+
|
|
304
|
+
Before `wu:prep`, any unread directed signal addressed to the current reader on
|
|
305
|
+
the WU or its initiative is a decision point. Read, ACK, or dismiss it before
|
|
306
|
+
continuing. `pnpm wu:prep --allow-unread-signals --reason '<audit reason>'`
|
|
307
|
+
exists for explicit audited overrides only.
|
|
266
308
|
|
|
267
309
|
### During the WU (capture, don't hoard)
|
|
268
310
|
|
|
@@ -552,6 +594,126 @@ For the full worktree lifecycle (parallel execution, bootstrap, isolation guaran
|
|
|
552
594
|
| `pnpm typecheck` | Run TypeScript type checking |
|
|
553
595
|
| `pnpm test` | Run all tests (Vitest) |
|
|
554
596
|
|
|
597
|
+
#### Per-gate skip (WU-2925)
|
|
598
|
+
|
|
599
|
+
`pnpm wu:prep` and `pnpm wu:done` accept `--skip-gate <name>` (repeatable) to
|
|
600
|
+
suppress a single named gate. The legacy `--skip-gates` (binary) is deprecated
|
|
601
|
+
for one minor cycle and emits a deprecation warning pointing to the public
|
|
602
|
+
[Gates Reference](https://lumenflow.dev/reference/gates#per-gate-skip); use
|
|
603
|
+
`--skip-gate` per gate.
|
|
604
|
+
|
|
605
|
+
```bash
|
|
606
|
+
# Skip a single environmental gate (allow-list)
|
|
607
|
+
pnpm wu:done --id WU-XXX --skip-gate lane-health \
|
|
608
|
+
--reason "pre-existing 50-file coverage gap" --fix-wu WU-YYY
|
|
609
|
+
|
|
610
|
+
# Repeat the flag to skip multiple gates
|
|
611
|
+
pnpm wu:prep --id WU-XXX \
|
|
612
|
+
--skip-gate lane-health --skip-gate migration-verify \
|
|
613
|
+
--reason "no DB infra in agent worktree" --fix-wu WU-YYY
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
**Allow-list (skippable: true by default):** `migration-verify`,
|
|
617
|
+
`lane-health`, `tdd-diff-evidence`, plus the WU-2927 opt-in local-prep gates
|
|
618
|
+
`build`, `integration-test`, `e2e-smoke`. All other framework gates default to
|
|
619
|
+
`skippable: false` and require a per-repo override at
|
|
620
|
+
`software_delivery.gates.overrides.<gate_id>.skippable=true` to be skipped:
|
|
621
|
+
|
|
622
|
+
```bash
|
|
623
|
+
pnpm config:set software_delivery.gates.overrides.db-dod-gate.skippable=true
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
Audit format gains a discriminated `source` field
|
|
627
|
+
(`agent` | `auto-skip-not-applicable` | `auto-skip-missing-prereq` | `blocked`)
|
|
628
|
+
and a `lifecycle` field (`prep` | `done`) so the trail spans both lifecycle
|
|
629
|
+
commands. Legacy entries without `source` are read as `agent` for DORA/CFR
|
|
630
|
+
back-compat. CFR (Change Failure Rate) only counts `source: 'agent'` rows;
|
|
631
|
+
auto-skips and blocks are excluded.
|
|
632
|
+
|
|
633
|
+
MCP exposes both `skip_gate` (array, preferred) and `skip_gates` (boolean,
|
|
634
|
+
deprecated) for one minor cycle, symmetric with the CLI.
|
|
635
|
+
|
|
636
|
+
#### Discriminated GateResult states (WU-2926)
|
|
637
|
+
|
|
638
|
+
Each gate run produces one of six `GateResult` discriminated states. Stable
|
|
639
|
+
glyphs/labels (also surfaced verbatim in the public
|
|
640
|
+
[Gates Reference](https://lumenflow.dev/reference/gates#discriminated-gateresult-states)):
|
|
641
|
+
|
|
642
|
+
| State | Glyph | Meaning |
|
|
643
|
+
| ----------------------------- | ------------------- | ----------------------------------------------------------------------------------------------------- |
|
|
644
|
+
| `passed` | ✅ PASSED | Gate ran successfully. |
|
|
645
|
+
| `failed` | ❌ FAILED | Gate ran and failed (or `applicable + missing + skippable + 'fail'`). |
|
|
646
|
+
| `skipped-by-agent` | ⏭ SKIPPED-BY-AGENT | Explicit `--skip-gate <name>` (audit `source: 'agent'`). |
|
|
647
|
+
| `skipped-auto-not-applicable` | ⊘ AUTO-SKIPPED | `checkApplicability` returned not-applicable (audit `source: 'auto-skip-not-applicable'`). |
|
|
648
|
+
| `skipped-auto-missing-prereq` | ⊘ AUTO-SKIPPED | Applicable + missing prereq + skippable + `'auto-skip'` (audit `source: 'auto-skip-missing-prereq'`). |
|
|
649
|
+
| `blocked-missing-prereq` | 🚫 BLOCKED | Applicable + missing prereq + `skippable: false` (audit `source: 'blocked'`, exits non-zero). |
|
|
650
|
+
|
|
651
|
+
Decision matrix:
|
|
652
|
+
|
|
653
|
+
| Applicability | Preconditions | Skippable | `prereq_strategy` | Result |
|
|
654
|
+
| -------------- | ------------- | --------- | ----------------- | -------------------------------- |
|
|
655
|
+
| not-applicable | — | — | — | `skipped-auto-not-applicable` |
|
|
656
|
+
| applicable | satisfied | — | — | run → `passed` or `failed` |
|
|
657
|
+
| applicable | missing | false | — | `blocked-missing-prereq` (BLOCK) |
|
|
658
|
+
| applicable | missing | true | `'auto-skip'` | `skipped-auto-missing-prereq` |
|
|
659
|
+
| applicable | missing | true | `'fail'` | `failed` |
|
|
660
|
+
|
|
661
|
+
Each `GateDefinition` may implement `checkApplicability` and
|
|
662
|
+
`checkPreconditions`. Defaults return `'applicable'` and `'satisfied'` so
|
|
663
|
+
existing simple gates inherit always-runs semantics with no per-gate code
|
|
664
|
+
change. `safety-critical-test` ships with `skippable_default: false` and a
|
|
665
|
+
default applicability of `'applicable'` for every change set — preserving
|
|
666
|
+
today's runs-on-every-WU behaviour. Per-repo override:
|
|
667
|
+
|
|
668
|
+
```bash
|
|
669
|
+
# Narrow safety-critical-test applicability without flipping the default
|
|
670
|
+
pnpm config:set software_delivery.gates.overrides.safety-critical-test.applicability_paths \
|
|
671
|
+
--json-value '["app/security/**","lib/auth/**"]'
|
|
672
|
+
```
|
|
673
|
+
|
|
674
|
+
Auto-skip + blocked states write audit NDJSON with the discriminated `source`
|
|
675
|
+
field; CFR only counts `source: 'agent'` rows so auto-skips and blocks never
|
|
676
|
+
inflate change-failure-rate.
|
|
677
|
+
|
|
678
|
+
#### Extended local-prep profile (WU-2927)
|
|
679
|
+
|
|
680
|
+
`software_delivery.gates.local_prep` is an opt-in profile that extends
|
|
681
|
+
`wu:prep` with the build / integration-test / e2e-smoke gates that previously
|
|
682
|
+
only ran in CI. Driven by lumenflow.cloud's three P0 hotfixes in 24h
|
|
683
|
+
(WU-1497..WU-1499) — each slipped past local gates because `wu:prep` did not
|
|
684
|
+
run `pnpm build`, `pnpm test:integration`, or `pnpm test:e2e --smoke`.
|
|
685
|
+
|
|
686
|
+
```yaml
|
|
687
|
+
software_delivery:
|
|
688
|
+
gates:
|
|
689
|
+
local_prep:
|
|
690
|
+
build:
|
|
691
|
+
enabled: false # opt-in: pnpm build on every wu:prep
|
|
692
|
+
integration_test:
|
|
693
|
+
enabled: false # opt-in: pnpm test:integration on every wu:prep
|
|
694
|
+
e2e_smoke:
|
|
695
|
+
enabled: false # opt-in: pnpm test:e2e --tag <tag>
|
|
696
|
+
tag: smoke
|
|
697
|
+
latency_budget_warn_ms: 180000 # 3 min soft warn, never blocks
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
| Field | Default | Effect |
|
|
701
|
+
| --------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
702
|
+
| `build.enabled` | `false` | When `true`, registers a build gate that runs `pnpm build`. `prereq_strategy: 'fail'` — missing `build` script in `package.json` is a misconfig (`failed`), not an environmental gap. |
|
|
703
|
+
| `integration_test.enabled` | `false` | When `true`, makes the (now unconditionally registered) `integration-test` gate applicable. Runs `RUN_INTEGRATION_TESTS=1 pnpm vitest run '**/*.integration.*' '**/golden-*.test.*'`. Missing script → `failed`. |
|
|
704
|
+
| `e2e_smoke.enabled` + `tag` | `false` / `smoke` | When `true` AND `playwright.config.{ts,js,mjs}` exists at repo root, registers an `e2e-smoke` gate that runs `pnpm test:e2e --tag <tag>`. Repos without Playwright are auto `not-applicable` (clean opt-out — no explicit disable required). |
|
|
705
|
+
| `latency_budget_warn_ms` | `180000` | `wu:prep` prints total elapsed seconds; if it exceeds the budget, emits a non-failing warning. Soft signal only. |
|
|
706
|
+
|
|
707
|
+
All three gates are added to the `--skip-gate` allow-list (`skippable: true`),
|
|
708
|
+
extending WU-2925's initial `{migration-verify, lane-health, tdd-diff-evidence}`
|
|
709
|
+
set. Rationale: local-prep gates are opt-in environmental gates; agents need
|
|
710
|
+
`--skip-gate <name>` for legitimate hotfix scenarios where the gate is broken
|
|
711
|
+
or irrelevant for that WU. Skips are captured in audit per WU-2925 semantics
|
|
712
|
+
with `source: 'agent'`.
|
|
713
|
+
|
|
714
|
+
Backward-compat: omitting `local_prep` (the default) preserves today's
|
|
715
|
+
behaviour — none of the new gates is applicable, no new commands run.
|
|
716
|
+
|
|
555
717
|
### Lane Management
|
|
556
718
|
|
|
557
719
|
| Command | Description |
|
|
@@ -578,7 +740,9 @@ For the full worktree lifecycle (parallel execution, bootstrap, isolation guaran
|
|
|
578
740
|
| `pnpm mem:cleanup` | Clean up stale memory data |
|
|
579
741
|
| `pnpm mem:context` | Get context for current lane/WU |
|
|
580
742
|
| `pnpm mem:create` | Create memory node (bug discovery) |
|
|
743
|
+
| `pnpm mem:converged` | Check A2A thread agreement |
|
|
581
744
|
| `pnpm mem:inbox` | Check coordination signals |
|
|
745
|
+
| `pnpm mem:watch` | Deliver A2A signal events without hooks |
|
|
582
746
|
| `pnpm mem:roster` | List active sessions and display names |
|
|
583
747
|
| `pnpm mem:summarize` | Summarize memory context |
|
|
584
748
|
| `pnpm mem:triage` | Triage discovered bugs |
|
|
@@ -635,6 +799,7 @@ For the full worktree lifecycle (parallel execution, bootstrap, isolation guaran
|
|
|
635
799
|
| `pnpm lumenflow:doctor` | Diagnose LumenFlow configuration |
|
|
636
800
|
| `pnpm lumenflow:commands` | List all available CLI commands |
|
|
637
801
|
| `pnpm lumenflow:release` | Run release workflow |
|
|
802
|
+
| `pnpm distribution:preflight` | Audit consumer repos for npm-access flip readiness |
|
|
638
803
|
| `pnpm lumenflow:docs-sync` | Refresh core docs, onboarding docs, and vendor assets |
|
|
639
804
|
| `pnpm lumenflow:sync-templates` | Sync templates to project |
|
|
640
805
|
| `pnpm lumenflow:upgrade` | Upgrade LumenFlow packages |
|
|
@@ -678,19 +843,6 @@ For the full worktree lifecycle (parallel execution, bootstrap, isolation guaran
|
|
|
678
843
|
| `pnpm pack:install` | Install a domain pack into workspace |
|
|
679
844
|
| `pnpm pack:search` | Search for domain packs in a registry |
|
|
680
845
|
|
|
681
|
-
### Audited Wrappers
|
|
682
|
-
|
|
683
|
-
| Command | Description |
|
|
684
|
-
| ------------------ | -------------------------------- |
|
|
685
|
-
| `pnpm file:read` | Read file with audit trail |
|
|
686
|
-
| `pnpm file:write` | Write file with audit trail |
|
|
687
|
-
| `pnpm file:edit` | Edit file with audit trail |
|
|
688
|
-
| `pnpm file:delete` | Delete file with audit trail |
|
|
689
|
-
| `pnpm git:status` | Show git status with audit trail |
|
|
690
|
-
| `pnpm git:diff` | Show git diff with audit trail |
|
|
691
|
-
| `pnpm git:log` | Show git log with audit trail |
|
|
692
|
-
| `pnpm git:branch` | Show git branch with audit trail |
|
|
693
|
-
|
|
694
846
|
Commands include **context-aware validation** that checks location, WU status, and git state. When validation fails, commands provide copy-paste ready fix commands.
|
|
695
847
|
|
|
696
848
|
---
|
|
@@ -727,6 +879,16 @@ If you're an AI agent, read the onboarding docs:
|
|
|
727
879
|
|
|
728
880
|
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
881
|
|
|
882
|
+
Agent plugins are a distribution on-ramp, not a replacement for these repo-level
|
|
883
|
+
projections or for the Software Delivery Pack runtime. Per
|
|
884
|
+
[ADR-018](docs/09-architecture-decisions/ADR-018-agent-plugin-distribution-boundary.md),
|
|
885
|
+
standalone projected skills keep local names such as `design-first`, while
|
|
886
|
+
plugin-installed Claude skills use plugin-qualified names such as
|
|
887
|
+
`/lumenflow:design-first`. If both surfaces exist, prompts and handoff text must
|
|
888
|
+
say which one they mean. Installing a plugin gives the agent methodology and
|
|
889
|
+
entrypoint guidance; repo-level enforcement still requires `npx lumenflow init`,
|
|
890
|
+
`pnpm lumenflow:integrate`, or `pnpm lumenflow:integrate --sync`.
|
|
891
|
+
|
|
730
892
|
### Core skills (vendor-neutral)
|
|
731
893
|
|
|
732
894
|
| Skill | Load before... |
|
|
@@ -752,6 +914,15 @@ A skill name written in prose does nothing — it must be **loaded** through the
|
|
|
752
914
|
| Aider | `CONVENTIONS.md` | `/read CONVENTIONS.md` or `aider --read CONVENTIONS.md` |
|
|
753
915
|
| Cline | `.clinerules` | Auto-loaded |
|
|
754
916
|
|
|
917
|
+
For plugin-distributed skills, prefer the vendor's plugin-qualified invocation
|
|
918
|
+
surface instead of rewriting all canonical skill names. Claude Code plugin
|
|
919
|
+
skills are namespaced as `/lumenflow:<skill>`. Codex plugin use should name the
|
|
920
|
+
installed `lumenflow` plugin or one of its bundled skills through Codex's `@`
|
|
921
|
+
plugin selection surface. **Plugin packaging is scoped under INIT-065 and not
|
|
922
|
+
yet shipped as of 5.4.0** — these invocations apply once the packaging WUs land.
|
|
923
|
+
Standalone projections remain valid until a future explicit cleanup command such
|
|
924
|
+
as `--plugin-only` exists and is run intentionally.
|
|
925
|
+
|
|
755
926
|
For vendor-specific setup details and per-vendor quirks, see:
|
|
756
927
|
|
|
757
928
|
- Claude Code: [.claude/CLAUDE.md](.claude/CLAUDE.md)
|
|
@@ -794,6 +965,12 @@ Durable artifacts carry `requested_role` (from the orchestrator) and `actual_rol
|
|
|
794
965
|
|
|
795
966
|
---
|
|
796
967
|
|
|
968
|
+
## Remote / MCP Dispatch
|
|
969
|
+
|
|
970
|
+
LumenFlow ships `pnpm file:*` and `pnpm git:*` CLIs (`file:read`, `file:write`, `file:edit`, `file:delete`, `git:status`, `git:diff`, `git:log`, `git:branch`). These commands exist for non-native-tool agents (MCP remote dispatch, server-side sandbox). Local agents with native Read/Edit/Write should use those directly — they're faster and already audited via the client transcript. The wrappers are not part of the canonical local-development CLI surface.
|
|
971
|
+
|
|
972
|
+
---
|
|
973
|
+
|
|
797
974
|
## References
|
|
798
975
|
|
|
799
976
|
- [LumenFlow Agent Capsule]({{DOCS_OPERATIONS_PATH}}/_frameworks/lumenflow/lumenflow-agent-capsule.md) -- Full framework reference (lifecycle, lanes, gates, DoD)
|
|
@@ -802,5 +979,6 @@ Durable artifacts carry `requested_role` (from the orchestrator) and `actual_rol
|
|
|
802
979
|
- [.lumenflow/constraints.md](.lumenflow/constraints.md) -- Non-negotiable rules and forbidden commands
|
|
803
980
|
- [WU Sizing Guide]({{DOCS_OPERATIONS_PATH}}/_frameworks/lumenflow/wu-sizing-guide.md) -- Scoping work without needless fragmentation
|
|
804
981
|
- [ADR-014: Typed Agent-Role Contract](docs/09-architecture-decisions/ADR-014-typed-agent-role-contract.md) — Canonical orchestration role vocabulary
|
|
982
|
+
- [ADR-017: LumenFlow Configurability Principle](docs/09-architecture-decisions/ADR-017-lumenflow-configurability-principle.md) — Defaults are allowed; framework prescription must be configurable or consumer-authored
|
|
805
983
|
- [Skills Index](.lumenflow/skills/INDEX.md)
|
|
806
984
|
- [Agents README](.claude/agents/README.md)
|
|
@@ -146,10 +146,6 @@ These surfaces already assemble the objective, scope, code paths, tests, recover
|
|
|
146
146
|
constraints block, and evidence metadata. Do not prepend or append a second wrapper block around
|
|
147
147
|
them.
|
|
148
148
|
|
|
149
|
-
The role aliases referenced by these handoffs are vendor-neutral framework names (`general-purpose`,
|
|
150
|
-
`lumenflow-pm`, `initiative-architect`, and so on). Client-specific overlays may implement those
|
|
151
|
-
aliases differently, but the orchestration brief should keep the shared alias vocabulary intact.
|
|
152
|
-
|
|
153
149
|
If you are building a fully custom or experimental prompt outside those canonical surfaces, use
|
|
154
150
|
this structure:
|
|
155
151
|
|
|
@@ -218,7 +214,6 @@ Before spawning:
|
|
|
218
214
|
|
|
219
215
|
- Confirm WU status and lane availability
|
|
220
216
|
- Ensure worktree exists (or claim first)
|
|
221
|
-
- Use the shared framework alias vocabulary in the brief, not vendor-specific display names
|
|
222
217
|
- Provide explicit code_paths and tests
|
|
223
218
|
- Require `mem:checkpoint` at 50+ tool calls
|
|
224
219
|
- Require `mem:signal` for milestones
|
|
@@ -98,7 +98,69 @@ not guess-and-retry.
|
|
|
98
98
|
1. Read the error message
|
|
99
99
|
2. Fix the underlying issue
|
|
100
100
|
3. Re-run gates
|
|
101
|
-
4. Never use `--skip-gates` for new failures
|
|
101
|
+
4. Never use `--skip-gate` (or legacy `--skip-gates`) for new failures
|
|
102
|
+
5. WU-2925: prefer `--skip-gate <name>` (repeatable, per-gate) over
|
|
103
|
+
`--skip-gates` (legacy binary, deprecated for one minor cycle). Only gates
|
|
104
|
+
marked `skippable: true` (allow-list: `migration-verify`, `lane-health`,
|
|
105
|
+
`tdd-diff-evidence`, plus the WU-2927 opt-in local-prep gates `build`,
|
|
106
|
+
`integration-test`, `e2e-smoke`) or overridden per-repo at
|
|
107
|
+
`software_delivery.gates.overrides.<gate_id>.skippable=true` may be skipped.
|
|
108
|
+
Both flags require `--reason` and `--fix-wu`.
|
|
109
|
+
|
|
110
|
+
### Skip-vs-Block decision matrix (WU-2926)
|
|
111
|
+
|
|
112
|
+
The runtime distinguishes six discriminated `GateResult` states with stable
|
|
113
|
+
glyphs. The decision matrix encodes when a gate runs, auto-skips, or BLOCKS:
|
|
114
|
+
|
|
115
|
+
| Applicability | Preconditions | Skippable | `prereq_strategy` | Result | Glyph |
|
|
116
|
+
| -------------- | ------------- | --------- | ----------------- | -------------------------------- | ----- |
|
|
117
|
+
| not-applicable | — | — | — | `skipped-auto-not-applicable` | ⊘ |
|
|
118
|
+
| applicable | satisfied | — | — | run → `passed` or `failed` | ✅/❌ |
|
|
119
|
+
| applicable | missing | false | — | `blocked-missing-prereq` (BLOCK) | 🚫 |
|
|
120
|
+
| applicable | missing | true | `'auto-skip'` | `skipped-auto-missing-prereq` | ⊘ |
|
|
121
|
+
| applicable | missing | true | `'fail'` | `failed` | ❌ |
|
|
122
|
+
|
|
123
|
+
Key invariant: `applicable + missing + skippable=false` ALWAYS blocks. This is
|
|
124
|
+
the silent-bypass guard. `--skip-gate <name>` cannot bypass it. The only
|
|
125
|
+
escape hatch is a deliberate per-repo override at
|
|
126
|
+
`software_delivery.gates.overrides.<gate_id>.skippable=true`, used only when
|
|
127
|
+
the missing prerequisite is genuinely environmental (not a missing
|
|
128
|
+
implementation).
|
|
129
|
+
|
|
130
|
+
Audit NDJSON `source` field discriminates all four non-running outcomes:
|
|
131
|
+
`agent` | `auto-skip-not-applicable` | `auto-skip-missing-prereq` | `blocked`.
|
|
132
|
+
CFR/DORA only counts `source: 'agent'` so auto-skips and blocks never inflate
|
|
133
|
+
change-failure-rate.
|
|
134
|
+
|
|
135
|
+
### Override syntax (copy-pasteable, WU-2925/2926)
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# Per-gate skip at wu:prep or wu:done (--skip-gate is repeatable)
|
|
139
|
+
pnpm wu:prep --id WU-XXX --skip-gate lane-health \
|
|
140
|
+
--reason "no DB infra in agent worktree" --fix-wu WU-YYY
|
|
141
|
+
|
|
142
|
+
# Make a non-allow-listed gate skippable per repo
|
|
143
|
+
pnpm config:set software_delivery.gates.overrides.<gate_id>.skippable=true
|
|
144
|
+
|
|
145
|
+
# Narrow a safety-critical gate's reach via applicability_paths
|
|
146
|
+
# (preferred over flipping skippable for safety-critical gates)
|
|
147
|
+
pnpm config:set software_delivery.gates.overrides.safety-critical-test.applicability_paths \
|
|
148
|
+
--json-value '["app/security/**","lib/auth/**"]'
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Latency-budget guidance (`local_prep` profile, WU-2927)
|
|
152
|
+
|
|
153
|
+
The opt-in `software_delivery.gates.local_prep` profile extends `wu:prep` with
|
|
154
|
+
`build`, `integration-test`, and `e2e-smoke` gates. All three are
|
|
155
|
+
`skippable: true` and accept `--skip-gate <name>`. Latency budget defaults:
|
|
156
|
+
|
|
157
|
+
- **`latency_budget_warn_ms: 180000`** (3 min): default soft warn, never blocks.
|
|
158
|
+
- **60–90s**: tight, suits greenfield repos; expect false-positive warnings as
|
|
159
|
+
suites grow.
|
|
160
|
+
- **5–10 min**: loose, suits monorepos with full Playwright; consider
|
|
161
|
+
`--skip-gate e2e-smoke` per-WU for cosmetic-only changes.
|
|
162
|
+
|
|
163
|
+
Public reference: <https://lumenflow.dev/reference/gates#local_prep-profile-550>.
|
|
102
164
|
|
|
103
165
|
---
|
|
104
166
|
|
|
@@ -87,6 +87,10 @@ pnpm wu:brief --id WU-100 --client claude-code
|
|
|
87
87
|
pnpm wu:delegate --id WU-100 --parent-wu WU-050 --client claude-code
|
|
88
88
|
```
|
|
89
89
|
|
|
90
|
+
When the work is initiative decomposition or execution design rather than direct implementation, the
|
|
91
|
+
default framework role to brief or delegate is `initiative-architect`. That role now replaces the
|
|
92
|
+
retired docs-planning vocabulary in the default agent roster.
|
|
93
|
+
|
|
90
94
|
**Use `wu:delegate` (not `wu:brief`) when:**
|
|
91
95
|
|
|
92
96
|
- You are the orchestrator agent managing the initiative
|
|
@@ -39,14 +39,14 @@ pnpm release --release-version 1.3.0 --skip-publish
|
|
|
39
39
|
|
|
40
40
|
### Options
|
|
41
41
|
|
|
42
|
-
| Flag | Description
|
|
43
|
-
| --------------------------- |
|
|
44
|
-
| `--release-version <X.Y.Z>` | **Required.** Semver version to release
|
|
45
|
-
| `--dry-run` | Preview changes without making them
|
|
42
|
+
| Flag | Description |
|
|
43
|
+
| --------------------------- | -------------------------------------------- |
|
|
44
|
+
| `--release-version <X.Y.Z>` | **Required.** Semver version to release |
|
|
45
|
+
| `--dry-run` | Preview changes without making them |
|
|
46
46
|
| `--skip-publish` | Skip npm publish only; validation still runs |
|
|
47
|
-
| `--skip-build` | Skip build step (use existing dist)
|
|
48
|
-
| `--version`, `-V` | Show CLI version
|
|
49
|
-
| `--help`, `-h` | Show help
|
|
47
|
+
| `--skip-build` | Skip build step (use existing dist) |
|
|
48
|
+
| `--version`, `-V` | Show CLI version |
|
|
49
|
+
| `--help`, `-h` | Show help |
|
|
50
50
|
|
|
51
51
|
### Examples
|
|
52
52
|
|
|
@@ -31,15 +31,73 @@ 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
|
|
35
|
-
| ----------- |
|
|
36
|
-
| Claude Code | `CLAUDE.md`, `.claude/`
|
|
37
|
-
| Cursor | `.cursor/rules
|
|
38
|
-
| Windsurf | `.windsurf/rules
|
|
39
|
-
| Cline | `.clinerules`
|
|
40
|
-
| Codex | `AGENTS.md
|
|
41
|
-
| Aider | `.aider.conf.yml`
|
|
42
|
-
| Antigravity | `AGENTS.md` (native)
|
|
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 | `AGENTS.md`, `.cursor/rules/` | Yes | Rules integration; foreground `mem:watch` A2A delivery |
|
|
38
|
+
| Windsurf | `AGENTS.md`, `.agents/skills/`, `.windsurf/rules/` | Yes | Rules integration plus shared skills; foreground `mem:watch` A2A |
|
|
39
|
+
| Cline | `.clinerules` | No | Rules file; foreground `mem:watch` or `mem:inbox` for A2A |
|
|
40
|
+
| Codex | `AGENTS.md`, `.agents/skills/`, `.codex/agents/` | No | Universal files plus overlays; foreground `mem:watch` A2A |
|
|
41
|
+
| Aider | `.aider.conf.yml` | No | Config file; foreground `mem:watch` or `mem:inbox` for A2A |
|
|
42
|
+
| Antigravity | `AGENTS.md` (native) | Unknown | Research phase |
|
|
43
|
+
|
|
44
|
+
### Shared Cross-Vendor Surfaces
|
|
45
|
+
|
|
46
|
+
LumenFlow stays vendor-agnostic by anchoring on shared repo surfaces first, then layering
|
|
47
|
+
vendor-specific overlays where a client has extra capabilities.
|
|
48
|
+
|
|
49
|
+
- `AGENTS.md` is the shared instruction baseline. Codex reads it natively, Cursor and Windsurf
|
|
50
|
+
both support it as a repo instruction surface, and other vendors can usually consume it as plain
|
|
51
|
+
project guidance.
|
|
52
|
+
- `.agents/skills/` is the shared skills projection surface. Codex and Windsurf can both consume
|
|
53
|
+
it today, while Claude Code still uses its own `.claude/skills/` overlay.
|
|
54
|
+
- Vendor overlays stay additive: `.claude/agents/`, `.codex/agents/`, `.cursor/rules/`,
|
|
55
|
+
`.windsurf/rules/`, and similar files add client-specific behavior on top of the shared
|
|
56
|
+
instruction and skills layers.
|
|
57
|
+
|
|
58
|
+
### Agent Plugin Distribution
|
|
59
|
+
|
|
60
|
+
ADR-018 adds plugin distribution as a discoverability on-ramp for Claude Code and Codex. It does
|
|
61
|
+
not replace the repo-level integration surfaces above and it does not replace the Software Delivery
|
|
62
|
+
Pack runtime.
|
|
63
|
+
|
|
64
|
+
**Current source identity:**
|
|
65
|
+
|
|
66
|
+
- Canonical bundle: `plugins/lumenflow/`
|
|
67
|
+
- Claude manifest: `plugins/lumenflow/.claude-plugin/plugin.json`
|
|
68
|
+
- Codex manifest: `plugins/lumenflow/.codex-plugin/plugin.json`
|
|
69
|
+
- Claude repo marketplace catalog: `.claude-plugin/marketplace.json`
|
|
70
|
+
- Codex repo marketplace catalog: `.agents/plugins/marketplace.json`
|
|
71
|
+
|
|
72
|
+
The `lumenflow-dev` repository is the first release train's marketplace source repository. Do not
|
|
73
|
+
create a separate `lumenflow-marketplace` repository unless ADR-018 is amended.
|
|
74
|
+
|
|
75
|
+
**Namespace and coexistence rules:**
|
|
76
|
+
|
|
77
|
+
- Canonical skill authoring remains `.lumenflow/skills/<name>/SKILL.md`.
|
|
78
|
+
- Standalone projections keep local names such as `design-first` and `tdd-workflow`.
|
|
79
|
+
- Claude plugin skills are plugin-qualified, for example `/lumenflow:design-first`.
|
|
80
|
+
- Codex plugin prompts should name the installed `lumenflow` plugin or bundled skill through
|
|
81
|
+
Codex's `@` plugin selection surface; do not invent a Codex slash namespace.
|
|
82
|
+
- Plugin installation must not delete `.claude/skills/`, `.agents/skills/`, or other standalone
|
|
83
|
+
projections. A future `--plugin-only` cleanup path must be explicit and dry-run-first.
|
|
84
|
+
|
|
85
|
+
**First-run handoff:**
|
|
86
|
+
|
|
87
|
+
The plugin can provide skills, hooks, MCP configuration, and first-run guidance. It cannot install
|
|
88
|
+
`.husky/`, GitHub Actions, WU state, conditional gates, co-change gates, or package aliases inside a
|
|
89
|
+
consumer repository. First-run plugin text must direct users to run `npx lumenflow init` for a new
|
|
90
|
+
repo or `pnpm lumenflow:integrate --sync` in an already initialized repo when they want governed
|
|
91
|
+
workflow state, enforcement, gates, and evidence.
|
|
92
|
+
|
|
93
|
+
**Marketplace preflight:**
|
|
94
|
+
|
|
95
|
+
- Anthropic official marketplace submission exists today, so a maintainer must confirm or reserve
|
|
96
|
+
the `lumenflow` plugin name through the Anthropic submission path before marketplace packaging
|
|
97
|
+
relies on `/lumenflow:*` names.
|
|
98
|
+
- Codex official self-serve publishing is documented as coming later. Until then, Codex readiness
|
|
99
|
+
targets repo/personal marketplace install with the `lumenflow` id and an official-directory
|
|
100
|
+
checklist that does not claim undocumented vendor gates.
|
|
43
101
|
|
|
44
102
|
---
|
|
45
103
|
|
|
@@ -70,6 +128,7 @@ Cursor is an AI-first code editor built on VS Code.
|
|
|
70
128
|
|
|
71
129
|
**Config Files:**
|
|
72
130
|
|
|
131
|
+
- `AGENTS.md` - Shared repo instructions
|
|
73
132
|
- `.cursor/rules/lumenflow.md` - LumenFlow rules
|
|
74
133
|
|
|
75
134
|
**Auto-detection:** Environment variables starting with `CURSOR_`
|
|
@@ -86,6 +145,8 @@ Windsurf (Codeium) is an AI IDE with agentic capabilities.
|
|
|
86
145
|
|
|
87
146
|
**Config Files:**
|
|
88
147
|
|
|
148
|
+
- `AGENTS.md` - Shared repo instructions
|
|
149
|
+
- `.agents/skills/` - Shared skills discovered by Windsurf
|
|
89
150
|
- `.windsurf/rules/lumenflow.md` - LumenFlow rules
|
|
90
151
|
|
|
91
152
|
**Auto-detection:** Environment variables starting with `WINDSURF_`
|
|
@@ -114,11 +175,14 @@ lumenflow init --client cline
|
|
|
114
175
|
|
|
115
176
|
### OpenAI Codex
|
|
116
177
|
|
|
117
|
-
Codex reads
|
|
178
|
+
Codex reads shared repo instructions from `AGENTS.md`, shared skills from `.agents/skills/`, and
|
|
179
|
+
vendor-specific subagent overlays from `.codex/agents/`.
|
|
118
180
|
|
|
119
181
|
**Config Files:**
|
|
120
182
|
|
|
121
183
|
- `AGENTS.md` - Universal agent instructions (always created)
|
|
184
|
+
- `.agents/skills/` - Shared skills surface
|
|
185
|
+
- `.codex/agents/` - Codex subagent overlays (explicit invocation only)
|
|
122
186
|
|
|
123
187
|
**Initialize:**
|
|
124
188
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: frontend-design
|
|
3
3
|
description: Create distinctive, production-grade frontend interfaces. Use when building React components, pages, UI features, or when user requests visual/design work.
|
|
4
4
|
version: 1.0.0
|
|
5
|
-
source:
|
|
5
|
+
source: {{DOCS_OPERATIONS_PATH}}/_frameworks/lumenflow/lumenflow-agent-capsule.md
|
|
6
6
|
last_updated: {{DATE}}
|
|
7
7
|
allowed-tools: Read, Write, Edit, Bash
|
|
8
8
|
---
|
|
@@ -65,6 +65,34 @@ pnpm wu:prune --execute # Clean stale worktrees
|
|
|
65
65
|
pnpm wu:cleanup --id WU-XXX # After PR merge
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
+
## Coordination Signal Checkpoints
|
|
69
|
+
|
|
70
|
+
`wu:brief` includes an Inbox Snapshot for the current WU/session when memory is enabled.
|
|
71
|
+
Treat every unread signal surfaced there, at any `mem:checkpoint`, or before `wu:prep`
|
|
72
|
+
as a decision point, not background noise.
|
|
73
|
+
|
|
74
|
+
Before continuing after an unread signal:
|
|
75
|
+
|
|
76
|
+
1. Read the signal context.
|
|
77
|
+
2. Decide whether it changes the work, blocks progress, or is not actionable.
|
|
78
|
+
3. Reply, acknowledge, or dismiss it through `mem:signal` / shared memory before moving on.
|
|
79
|
+
|
|
80
|
+
Do not wait until `wu:done` to inspect coordination traffic. Mid-flight redirects, peer review,
|
|
81
|
+
and orchestrator-worker handoffs depend on agents consuming signals during the WU.
|
|
82
|
+
|
|
83
|
+
## A2A Signal Hook Delivery
|
|
84
|
+
|
|
85
|
+
Claude Code sessions with generated LumenFlow hooks receive directed A2A
|
|
86
|
+
`signal:received` events at the next `PostToolUse` boundary. Treat the hook
|
|
87
|
+
payload the same way as an unread `mem:inbox` result:
|
|
88
|
+
|
|
89
|
+
1. Read the signal message, `intent`, `interrupt_class`, and WU/thread scope.
|
|
90
|
+
2. If `requires_ack: true`, reply on the same thread with `pnpm mem:signal ... --reply-to <signal_id> --intent AGREE` or `--intent REJECT`.
|
|
91
|
+
3. Continue only after the decision is recorded, unless an explicit `wu:prep --allow-unread-signals --reason '<audit reason>'` override is justified.
|
|
92
|
+
|
|
93
|
+
Non-hook clients still rely on `wu:brief`, `mem:checkpoint`, and explicit
|
|
94
|
+
`mem:inbox` polling until the daemon fallback lands.
|
|
95
|
+
|
|
68
96
|
## wu:prep + wu:done Workflow (WU-1223)
|
|
69
97
|
|
|
70
98
|
**Two-step completion:**
|