feat(pipeline): SDLC pipeline primitive — engine, store, registries (dark) - #204
Conversation
…efinements Add §2a (Spec Kit / BMAD / Kiro / Roo / Aider + 2026 papers + omnigent/kiss_ai) and §5a (per-phase tool scoping, typed artifacts, entry/grounding gates, constitution/steering layer, gate enforcement tiers). Resolve open Q3/Q4/Q6; default the pipeline off (freestyle) until a pack is selected. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #204 +/- ##
==========================================
+ Coverage 87.52% 87.66% +0.13%
==========================================
Files 118 124 +6
Lines 21122 21390 +268
==========================================
+ Hits 18488 18752 +264
- Misses 2634 2638 +4
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
🤖 Gemini code reviewThis PR implements a generic, methodology-agnostic SDLC pipeline primitive including the engine, store, in-memory registries, and a manager. The architecture is solid and clean, but there are reliability issues around unhandled plugin exceptions causing crash loops, and a performance bottleneck in the SQLite store where active pipelines are loaded via a full table scan rather than utilizing the status index. Findings: 🔴 0 · 🟠 3 · 🟡 0 · 🟢 0 Tokens spent · ⬆️ Input: 16,955 · ⬇️ Output: 688 · Σ Total: 24,699 |
df421bd to
2d76c7c
Compare
…dark) Methodology-agnostic pipeline foundation (docs/sdlc-pipeline.md §5): PhaseDef/PipelineState types + the four plugin seams (PhaseKind, GatePlugin, SkillPlugin, Pack), a Map-backed registry, a built-in noop phase kind + always/manual gates, the advance engine (entry/exit gates; onFail halt/retry/abort), durable bun:sqlite state, and PipelineManager with resume() for restart survival. No daemon wiring, no methodology content — lands dark. 26 unit tests; tsc + biome clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2d76c7c to
ab8bf98
Compare
|
Addressed all three Gemini findings in
|
…205) * feat(pipeline): config schema (off by default) + daemon boot wiring Add a PipelineSchema to config (enabled=false default, defaultPack=null) with a CODEOID_PIPELINE_ENABLED env switch, and construct a PipelineManager in SessionManager when enabled — sharing the daemon DB and rehydrating non-terminal pipelines on boot (resume). Undefined when disabled, so the daemon stays dark by default. Pure createPipelineManagerFromConfig() factory keeps the enable/disable + share-DB + restart-survival behavior unit-tested without a full SessionManager. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(pipeline): skill phase kind + PhaseRunner seam + halt/answer/resume (#206) Add the runtime layer. A 'skill' PhaseKind runs fn skills natively and drives prompt/slash skills through an injectable PhaseRunner (the backend seam; a SessionManager-backed adapter lands in a follow-up). PipelineManager.answer(id, requestId, {approved, value}) is the daemon side of halt -> answer-from-a-frontend -> resume: it resolves a halted phase (pass/fail) and continues advancing to the next halt or terminal. Fully unit-tested with fakes; no live backend required. Still dark (pipeline off by default). Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bump package.json 0.3.1 → 0.3.2 and roll the 0.3.2 CHANGELOG section (the release workflow gates on package.json matching the tag). 0.3.2 carries the SDLC pipeline primitive (#204–#209), the /settings MCP Servers surface (#203), embedded-handoff ZeroID token consumption (#210), and the cross-cutting audit fixes (#211). Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
What
First slice of the SDLC pipeline (
docs/sdlc-pipeline.md): the generic, methodology-agnostic pipeline primitive. Lands dark — no daemon wiring, no methodology content, no behavior change until a manager is instantiated (PR #2).New package
src/daemon/pipeline/:interface.tsPhaseDef/PipelineState/PhaseState+ the four plugin seams —PhaseKind,GatePlugin(at: entry|exit),SkillPlugin,Pack— plus the §5a fields (tools,reads/writes,entryGate, per-phaseprovider/model)registry.tsMapRegistry(register/unregister/resolve/list/has, last-wins-with-warn) +createRegistries()builtin.tsnoopphase kind +always/manualgatesengine.tsstep/run, entry+exit gates,onFailhalt/retry/abort, terminal/halted guardsstore.tspipelinestable onbun:sqlite, mirroringStoreconventions;listActive()drives restart rehydrationmanager.tsPipelineManager— create/get/list/advance/abort +resume()(rehydrate non-terminal pipelines)Why this shape
Follows the design's three-layer split: a generic pipeline primitive (this PR) → blocker-approval + audit (reuses existing seams) → swappable capability packs. The primitive is pure data + a side-effect-free engine, so the transition rules are unit-testable and the whole thing is off by default.
Verification
bun test src/daemon/pipeline— 26 pass / 0 failtsc --noEmit— cleanbiome check— cleanmanual-gated pipeline halts, and a brand-newPipelineManagerover the same store comes back halted at the same phase (the concrete win over ADLC'spipeline-state.json).Not in this PR (next slices)
PipelineSchema(off by default) + daemon-boot wiring +resumePipelines()on boot + the first backend-drivenPhaseKind.ui_request→ answer from Web/Telegram → resume, with additive protocol fields.Also includes the design-doc enrichment (external prior-art §2a, refinements §5a, open Q3/Q4/Q6 resolved, default flipped to off/freestyle).
🤖 Generated with Claude Code