@lumenflow/cli 5.4.0 → 5.7.12
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 +42 -40
- package/dist/db-journal-recover.js +400 -0
- package/dist/db-journal-recover.js.map +1 -0
- package/dist/docs-sync.js +8 -3
- package/dist/docs-sync.js.map +1 -1
- package/dist/gate-defaults.js +191 -9
- package/dist/gate-defaults.js.map +1 -1
- package/dist/gate-registry.js.map +1 -1
- package/dist/gates/monolithic-file-contention-guard.js +167 -0
- package/dist/gates/monolithic-file-contention-guard.js.map +1 -0
- package/dist/gates/prod-migration-drift.js +207 -0
- package/dist/gates/prod-migration-drift.js.map +1 -0
- package/dist/gates/test-over-deletion-guard.js +255 -0
- package/dist/gates/test-over-deletion-guard.js.map +1 -0
- package/dist/gates-runners.js +401 -2
- package/dist/gates-runners.js.map +1 -1
- package/dist/gates.js +349 -4
- package/dist/gates.js.map +1 -1
- package/dist/lumenflow-setup.js +144 -0
- package/dist/lumenflow-setup.js.map +1 -0
- package/dist/lumenflow-upgrade.js +2 -1
- package/dist/lumenflow-upgrade.js.map +1 -1
- package/dist/mem-create.js +10 -1
- package/dist/mem-create.js.map +1 -1
- package/dist/mem-signal.js +21 -4
- package/dist/mem-signal.js.map +1 -1
- 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/orchestrate-initiative.js +28 -3
- package/dist/orchestrate-initiative.js.map +1 -1
- package/dist/public-manifest.js +17 -0
- package/dist/public-manifest.js.map +1 -1
- package/dist/release.js +53 -18
- package/dist/release.js.map +1 -1
- package/dist/wu-done-gates.js +121 -8
- 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-edit-operations.js +74 -0
- package/dist/wu-edit-operations.js.map +1 -1
- package/dist/wu-edit-validators.js +58 -0
- package/dist/wu-edit-validators.js.map +1 -1
- package/dist/wu-edit.js +106 -4
- package/dist/wu-edit.js.map +1 -1
- package/dist/wu-prep.js +132 -8
- package/dist/wu-prep.js.map +1 -1
- package/dist/wu-recover.js +6 -0
- package/dist/wu-recover.js.map +1 -1
- package/dist/wu-release.js +120 -2
- package/dist/wu-release.js.map +1 -1
- package/dist/wu-sizing-validation.js +47 -17
- package/dist/wu-sizing-validation.js.map +1 -1
- package/dist/wu-status.js +33 -0
- package/dist/wu-status.js.map +1 -1
- package/package.json +13 -11
- package/packs/agent-runtime/package.json +1 -1
- package/packs/sidekick/package.json +1 -1
- package/packs/software-delivery/package.json +1 -1
- package/templates/core/AGENTS.md.template +162 -26
- package/templates/core/LUMENFLOW.md.template +381 -70
- package/templates/core/ai/onboarding/agent-invocation-guide.md.template +0 -5
- package/templates/core/ai/onboarding/agent-safety-card.md.template +63 -17
- 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
- package/packs/agent-runtime/agent-heartbeat.ts +0 -163
- package/packs/agent-runtime/auto-session-integration.ts +0 -888
- package/packs/agent-runtime/capability-factory.ts +0 -104
- package/packs/agent-runtime/constants.ts +0 -21
- package/packs/agent-runtime/delegation-registry-schema.ts +0 -220
- package/packs/agent-runtime/delegation-registry-store.ts +0 -269
- package/packs/agent-runtime/delegation-tree.ts +0 -328
- package/packs/agent-runtime/index.ts +0 -20
- package/packs/agent-runtime/manifest.ts +0 -348
- package/packs/agent-runtime/memory-coordination-contract.ts +0 -86
- package/packs/agent-runtime/orchestration.ts +0 -2027
- package/packs/agent-runtime/pack-registration.ts +0 -110
- package/packs/agent-runtime/policy-factory.ts +0 -165
- package/packs/agent-runtime/remote-controls/index.ts +0 -7
- package/packs/agent-runtime/remote-controls/operations.ts +0 -405
- package/packs/agent-runtime/remote-controls/port.ts +0 -48
- package/packs/agent-runtime/remote-controls/state-store.ts +0 -258
- package/packs/agent-runtime/remote-controls/types.ts +0 -105
- package/packs/agent-runtime/session-schema.ts +0 -467
- package/packs/agent-runtime/tool-impl/agent-turn-tools.ts +0 -793
- package/packs/agent-runtime/tool-impl/index.ts +0 -6
- package/packs/agent-runtime/tool-impl/provider-adapters.ts +0 -1245
- package/packs/agent-runtime/tool-impl/remote-controls.mock.ts +0 -256
- package/packs/agent-runtime/tool-impl/remote-controls.ts +0 -273
- package/packs/agent-runtime/tools/index.ts +0 -4
- package/packs/agent-runtime/tools/types.ts +0 -47
- package/packs/agent-runtime/turn-lifecycle-events.ts +0 -590
- package/packs/agent-runtime/types.ts +0 -128
- package/packs/agent-runtime/vitest.config.ts +0 -11
- package/packs/sidekick/channel-ingress.ts +0 -137
- package/packs/sidekick/constants.ts +0 -10
- package/packs/sidekick/index.ts +0 -8
- package/packs/sidekick/manifest-schema.ts +0 -49
- package/packs/sidekick/manifest.ts +0 -512
- package/packs/sidekick/pack-registration.ts +0 -110
- package/packs/sidekick/policy-factory.ts +0 -38
- package/packs/sidekick/sidekick-events.ts +0 -694
- package/packs/sidekick/src/adapters/cloud-queue.ts +0 -101
- package/packs/sidekick/src/adapters/control-plane-bridge.adapter.ts +0 -386
- package/packs/sidekick/src/adapters/filesystem-bridge.adapter.ts +0 -228
- package/packs/sidekick/src/domain/channel.types.ts +0 -64
- package/packs/sidekick/src/ports/channel-bridge.port.ts +0 -92
- package/packs/sidekick/src/routines/commit.ts +0 -74
- package/packs/sidekick/tool-impl/channel-tools.ts +0 -577
- package/packs/sidekick/tool-impl/channel-transports.ts +0 -75
- package/packs/sidekick/tool-impl/index.ts +0 -29
- package/packs/sidekick/tool-impl/memory-tools.ts +0 -290
- package/packs/sidekick/tool-impl/routine-commit.ts +0 -102
- package/packs/sidekick/tool-impl/routine-tools.ts +0 -440
- package/packs/sidekick/tool-impl/runtime-context.ts +0 -28
- package/packs/sidekick/tool-impl/shared.ts +0 -125
- package/packs/sidekick/tool-impl/storage.ts +0 -325
- package/packs/sidekick/tool-impl/system-tools.ts +0 -160
- package/packs/sidekick/tool-impl/task-tools.ts +0 -506
- package/packs/sidekick/tools/channel-tools.ts +0 -53
- package/packs/sidekick/tools/index.ts +0 -9
- package/packs/sidekick/tools/memory-tools.ts +0 -53
- package/packs/sidekick/tools/routine-tools.ts +0 -53
- package/packs/sidekick/tools/system-tools.ts +0 -47
- package/packs/sidekick/tools/task-tools.ts +0 -61
- package/packs/sidekick/tools/types.ts +0 -57
- package/packs/sidekick/vitest.config.ts +0 -11
- package/packs/software-delivery/constants.ts +0 -10
- package/packs/software-delivery/extensions.ts +0 -140
- package/packs/software-delivery/gate-policies.ts +0 -134
- package/packs/software-delivery/index.ts +0 -8
- package/packs/software-delivery/manifest-schema.ts +0 -268
- package/packs/software-delivery/manifest.ts +0 -657
- package/packs/software-delivery/pack-registration.ts +0 -113
- package/packs/software-delivery/src/commands/index.ts +0 -5
- package/packs/software-delivery/src/config/delivery-review-contract.ts +0 -256
- package/packs/software-delivery/src/config/env-accessors.ts +0 -66
- package/packs/software-delivery/src/config/index.ts +0 -8
- package/packs/software-delivery/src/config/normalize-config-keys.ts +0 -9
- package/packs/software-delivery/src/config/schemas/lumenflow-config-schema-types.ts +0 -460
- package/packs/software-delivery/src/config/workspace-reader.ts +0 -375
- package/packs/software-delivery/src/constants/backlog-patterns.ts +0 -31
- package/packs/software-delivery/src/constants/client-ids.ts +0 -19
- package/packs/software-delivery/src/constants/config-contract.ts +0 -7
- package/packs/software-delivery/src/constants/docs-layout-presets.ts +0 -50
- package/packs/software-delivery/src/constants/duration-constants.ts +0 -20
- package/packs/software-delivery/src/constants/gate-constants.ts +0 -32
- package/packs/software-delivery/src/constants/index.ts +0 -29
- package/packs/software-delivery/src/constants/lock-constants.ts +0 -35
- package/packs/software-delivery/src/constants/object-guards.ts +0 -12
- package/packs/software-delivery/src/constants/section-headings.ts +0 -107
- package/packs/software-delivery/src/constants/wu-cli-constants.ts +0 -488
- package/packs/software-delivery/src/constants/wu-domain-constants.ts +0 -466
- package/packs/software-delivery/src/constants/wu-git-constants.ts +0 -7
- package/packs/software-delivery/src/constants/wu-id-format.ts +0 -327
- package/packs/software-delivery/src/constants/wu-paths-constants.ts +0 -384
- package/packs/software-delivery/src/constants/wu-statuses.ts +0 -287
- package/packs/software-delivery/src/constants/wu-type-helpers.ts +0 -67
- package/packs/software-delivery/src/constants/wu-ui-constants.ts +0 -267
- package/packs/software-delivery/src/constants/wu-validation-constants.ts +0 -73
- package/packs/software-delivery/src/domain/index.ts +0 -5
- package/packs/software-delivery/src/domain/orchestration.constants.ts +0 -166
- package/packs/software-delivery/src/domain/orchestration.schemas.ts +0 -238
- package/packs/software-delivery/src/domain/orchestration.types.ts +0 -176
- package/packs/software-delivery/src/methodology/incremental-test.ts +0 -122
- package/packs/software-delivery/src/methodology/index.ts +0 -6
- package/packs/software-delivery/src/methodology/manual-test-validator.ts +0 -292
- package/packs/software-delivery/src/policy/coverage-gate.ts +0 -270
- package/packs/software-delivery/src/policy/gates-agent-mode.ts +0 -223
- package/packs/software-delivery/src/policy/gates-config-internal.ts +0 -121
- package/packs/software-delivery/src/policy/gates-config.ts +0 -300
- package/packs/software-delivery/src/policy/gates-coverage.ts +0 -356
- package/packs/software-delivery/src/policy/gates-presets.ts +0 -134
- package/packs/software-delivery/src/policy/gates-schemas.ts +0 -173
- package/packs/software-delivery/src/policy/index.ts +0 -22
- package/packs/software-delivery/src/policy/package-manager-resolver.ts +0 -319
- package/packs/software-delivery/src/policy/resolve-policy.ts +0 -601
- package/packs/software-delivery/src/ports/config.ports.ts +0 -90
- package/packs/software-delivery/src/ports/dashboard-renderer.port.ts +0 -125
- package/packs/software-delivery/src/ports/index.ts +0 -10
- package/packs/software-delivery/src/ports/sync-validator.ports.ts +0 -59
- package/packs/software-delivery/src/ports/wu-helpers.ports.ts +0 -168
- package/packs/software-delivery/src/ports/wu-state.ports.ts +0 -241
- package/packs/software-delivery/src/primitives/index.ts +0 -5
- package/packs/software-delivery/src/runtime/index.ts +0 -6
- package/packs/software-delivery/src/runtime/work-classifier.ts +0 -561
- package/packs/software-delivery/src/sandbox/index.ts +0 -10
- package/packs/software-delivery/src/sandbox/sandbox-allowlist.ts +0 -118
- package/packs/software-delivery/src/sandbox/sandbox-backend-linux.ts +0 -88
- package/packs/software-delivery/src/sandbox/sandbox-backend-macos.ts +0 -154
- package/packs/software-delivery/src/sandbox/sandbox-backend-windows.ts +0 -47
- package/packs/software-delivery/src/sandbox/sandbox-profile.ts +0 -153
- package/packs/software-delivery/src/schemas/index.ts +0 -5
- package/packs/software-delivery/src/state/date-utils.ts +0 -158
- package/packs/software-delivery/src/state/index.ts +0 -15
- package/packs/software-delivery/src/state/state-machine.ts +0 -119
- package/packs/software-delivery/src/state/wu-doc-types.ts +0 -51
- package/packs/software-delivery/src/state/wu-paths.ts +0 -381
- package/packs/software-delivery/src/state/wu-schema.ts +0 -1139
- package/packs/software-delivery/src/state/wu-state-schema.ts +0 -255
- package/packs/software-delivery/src/state/wu-yaml.ts +0 -338
- package/packs/software-delivery/tool-impl/agent-tools.ts +0 -263
- package/packs/software-delivery/tool-impl/delegation-tools.ts +0 -66
- package/packs/software-delivery/tool-impl/flow-metrics-tools.ts +0 -219
- package/packs/software-delivery/tool-impl/git-runner.ts +0 -113
- package/packs/software-delivery/tool-impl/git-tools.ts +0 -316
- package/packs/software-delivery/tool-impl/index.ts +0 -15
- package/packs/software-delivery/tool-impl/initiative-orchestration-tools.ts +0 -720
- package/packs/software-delivery/tool-impl/lane-lock.ts +0 -246
- package/packs/software-delivery/tool-impl/memory-tools.ts +0 -470
- package/packs/software-delivery/tool-impl/pending-runtime-tools.ts +0 -21
- package/packs/software-delivery/tool-impl/runtime-cli-adapter.ts +0 -329
- package/packs/software-delivery/tool-impl/runtime-native-tools.ts +0 -687
- package/packs/software-delivery/tool-impl/worker-loader.ts +0 -52
- package/packs/software-delivery/tool-impl/worktree-tools.ts +0 -46
- package/packs/software-delivery/tool-impl/wu-lifecycle-tools.ts +0 -807
- package/packs/software-delivery/tools/delegation-tools.ts +0 -23
- package/packs/software-delivery/tools/git-tools.ts +0 -55
- package/packs/software-delivery/tools/index.ts +0 -8
- package/packs/software-delivery/tools/lane-lock-tool.ts +0 -37
- package/packs/software-delivery/tools/types.ts +0 -71
- package/packs/software-delivery/tools/worktree-tools.ts +0 -49
- package/packs/software-delivery/vitest.config.ts +0 -11
|
@@ -40,28 +40,12 @@ 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 |
|
|
44
43
|
| Run wu:prep in the claimed workspace | Quality and lifecycle correctness |
|
|
45
44
|
| Run wu:done from main | Complete WU |
|
|
46
45
|
| Stay within code_paths | Scope discipline |
|
|
47
46
|
|
|
48
47
|
---
|
|
49
48
|
|
|
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
|
-
|
|
65
49
|
## Universal Safety Mechanisms
|
|
66
50
|
|
|
67
51
|
### Git Safety Wrapper
|
|
@@ -114,7 +98,69 @@ not guess-and-retry.
|
|
|
114
98
|
1. Read the error message
|
|
115
99
|
2. Fix the underlying issue
|
|
116
100
|
3. Re-run gates
|
|
117
|
-
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>.
|
|
118
164
|
|
|
119
165
|
---
|
|
120
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:**
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2026 Hellmai Ltd
|
|
2
|
-
// SPDX-License-Identifier: LicenseRef-LumenFlow-Proprietary
|
|
3
|
-
|
|
4
|
-
export interface HeartbeatHealth {
|
|
5
|
-
busy?: boolean;
|
|
6
|
-
stalled?: boolean;
|
|
7
|
-
last_progress_at?: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export interface HeartbeatAssignment {
|
|
11
|
-
wu_id: string;
|
|
12
|
-
action: 'claim' | 'continue' | 'abort';
|
|
13
|
-
hint?: string;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface AgentHeartbeatInput {
|
|
17
|
-
workspace_id: string;
|
|
18
|
-
session_id: string;
|
|
19
|
-
agent_id?: string;
|
|
20
|
-
wu_id?: string;
|
|
21
|
-
health?: HeartbeatHealth;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface AgentHeartbeatResult {
|
|
25
|
-
status: 'ok';
|
|
26
|
-
server_time: string;
|
|
27
|
-
next_heartbeat_ms?: number;
|
|
28
|
-
assignment?: HeartbeatAssignment;
|
|
29
|
-
budget_remaining_usd?: number;
|
|
30
|
-
coalesced_signals?: number;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface AgentHeartbeatPort {
|
|
34
|
-
heartbeat(input: AgentHeartbeatInput): Promise<AgentHeartbeatResult>;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export interface HeartbeatManagerOptions {
|
|
38
|
-
maxAttempts?: number;
|
|
39
|
-
baseBackoffMs?: number;
|
|
40
|
-
maxBackoffMs?: number;
|
|
41
|
-
sleepFn?: (delayMs: number) => Promise<void>;
|
|
42
|
-
logger?: Pick<Console, 'warn'>;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const DEFAULT_MAX_ATTEMPTS = 3;
|
|
46
|
-
const DEFAULT_BASE_BACKOFF_MS = 500;
|
|
47
|
-
const DEFAULT_MAX_BACKOFF_MS = 30_000;
|
|
48
|
-
|
|
49
|
-
function defaultSleep(delayMs: number): Promise<void> {
|
|
50
|
-
return new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Enforces single-flight heartbeat execution and coalesces concurrent signals
|
|
55
|
-
* into one follow-up heartbeat, with retry/backoff on transient failures.
|
|
56
|
-
*/
|
|
57
|
-
export class HeartbeatManager {
|
|
58
|
-
private readonly maxAttempts: number;
|
|
59
|
-
private readonly baseBackoffMs: number;
|
|
60
|
-
private readonly maxBackoffMs: number;
|
|
61
|
-
private readonly sleepFn: (delayMs: number) => Promise<void>;
|
|
62
|
-
private readonly logger?: Pick<Console, 'warn'>;
|
|
63
|
-
|
|
64
|
-
private inFlight: Promise<AgentHeartbeatResult> | null = null;
|
|
65
|
-
private queuedInput: AgentHeartbeatInput | null = null;
|
|
66
|
-
private queuedSignals = 0;
|
|
67
|
-
private consecutiveFailures = 0;
|
|
68
|
-
|
|
69
|
-
public constructor(
|
|
70
|
-
private readonly port: AgentHeartbeatPort,
|
|
71
|
-
options: HeartbeatManagerOptions = {},
|
|
72
|
-
) {
|
|
73
|
-
this.maxAttempts = options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
|
|
74
|
-
this.baseBackoffMs = options.baseBackoffMs ?? DEFAULT_BASE_BACKOFF_MS;
|
|
75
|
-
this.maxBackoffMs = options.maxBackoffMs ?? DEFAULT_MAX_BACKOFF_MS;
|
|
76
|
-
this.sleepFn = options.sleepFn ?? defaultSleep;
|
|
77
|
-
this.logger = options.logger;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
public async heartbeat(input: AgentHeartbeatInput): Promise<AgentHeartbeatResult> {
|
|
81
|
-
if (this.inFlight) {
|
|
82
|
-
this.queuedInput = input;
|
|
83
|
-
this.queuedSignals += 1;
|
|
84
|
-
return this.inFlight;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const request = this.drainQueue(input);
|
|
88
|
-
this.inFlight = request;
|
|
89
|
-
try {
|
|
90
|
-
return await request;
|
|
91
|
-
} finally {
|
|
92
|
-
this.inFlight = null;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
public getState(): {
|
|
97
|
-
inFlight: boolean;
|
|
98
|
-
queuedSignals: number;
|
|
99
|
-
consecutiveFailures: number;
|
|
100
|
-
} {
|
|
101
|
-
return {
|
|
102
|
-
inFlight: this.inFlight !== null,
|
|
103
|
-
queuedSignals: this.queuedSignals,
|
|
104
|
-
consecutiveFailures: this.consecutiveFailures,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
private async drainQueue(initialInput: AgentHeartbeatInput): Promise<AgentHeartbeatResult> {
|
|
109
|
-
let currentInput = initialInput;
|
|
110
|
-
let localCoalescedSignals = 0;
|
|
111
|
-
|
|
112
|
-
while (true) {
|
|
113
|
-
const result = await this.sendWithRetry(currentInput);
|
|
114
|
-
const queuedInput = this.queuedInput;
|
|
115
|
-
localCoalescedSignals += this.queuedSignals;
|
|
116
|
-
this.queuedInput = null;
|
|
117
|
-
this.queuedSignals = 0;
|
|
118
|
-
|
|
119
|
-
if (!queuedInput) {
|
|
120
|
-
const mergedCoalesced = (result.coalesced_signals ?? 0) + localCoalescedSignals;
|
|
121
|
-
if (mergedCoalesced > 0) {
|
|
122
|
-
return {
|
|
123
|
-
...result,
|
|
124
|
-
coalesced_signals: mergedCoalesced,
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
return result;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
currentInput = queuedInput;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
private async sendWithRetry(input: AgentHeartbeatInput): Promise<AgentHeartbeatResult> {
|
|
135
|
-
let attempt = 0;
|
|
136
|
-
|
|
137
|
-
while (true) {
|
|
138
|
-
try {
|
|
139
|
-
const result = await this.port.heartbeat(input);
|
|
140
|
-
this.consecutiveFailures = 0;
|
|
141
|
-
return result;
|
|
142
|
-
} catch (error) {
|
|
143
|
-
this.consecutiveFailures += 1;
|
|
144
|
-
attempt += 1;
|
|
145
|
-
|
|
146
|
-
if (attempt >= this.maxAttempts) {
|
|
147
|
-
throw error;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
const delayMs = this.getBackoffDelayMs();
|
|
151
|
-
this.logger?.warn?.(
|
|
152
|
-
`[agent:heartbeat] attempt ${attempt} failed; retrying in ${delayMs}ms`,
|
|
153
|
-
);
|
|
154
|
-
await this.sleepFn(delayMs);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
private getBackoffDelayMs(): number {
|
|
160
|
-
const exponent = Math.max(0, this.consecutiveFailures - 1);
|
|
161
|
-
return Math.min(this.baseBackoffMs * 2 ** exponent, this.maxBackoffMs);
|
|
162
|
-
}
|
|
163
|
-
}
|