Expose built-in extension flows as specify workflow pipelines (extension-owned workflows) #4461
Replies: 2 comments 1 reply
|
Thanks for the detailed write-up — but I don't think we want extensions to own workflows. Spec Kit's layers are deliberate: extensions provide commands + hooks, presets compose templates, workflows orchestrate, and bundles are the mechanism for grouping any of these together with coherent install/update/uninstall. So the orchestratable |
|
Yes, this is worth doing — and it's the right shape: two first-party bundles composing existing pieces, no new contribution type. It fills a real gap (only On placement: workflows have their own layer, so these belong alongside the SDD one — Want to move this to a |
Uh oh!
There was an error while loading. Please reload this page.
The
specify workflowengine currently ships exactly one workflow: the full SDD cycle (workflows/speckit/workflow.yml—specify → plan → tasks → implementwith review gates, resumable state). The two bundled pipeline extensions have multi-step flows of exactly that shape, but they can only be driven by invoking each command manually:bugextension:speckit.bug.assess → speckit.bug.fix → speckit.bug.test(per-bug reports under.specify/bugs/<slug>/)assessextension:speckit.assess.intake → research → define → shape → decide(per-idea artifacts under.specify/assessments/<slug>/)This is not a feature-parity issue — the commands work fine on their own. It's a convenience gap: the one flow that is orchestratable (
speckit) gets gates, persisted state, andworkflow resumefor free, while the extension pipelines don't, even though the engine supports everything they'd need.Proposal
Let extensions declare workflows in
extension.yml, so the workflow installs, updates, and uninstalls with the extension that owns it:With that in place, two small built-in workflows would ship with the existing extensions:
bugfix(ships withbug):assess→ gate "review the assessment before any code change" →fix→test. The gate maps the extension's "no code change before a reviewed assessment" guardrail onto engine semantics; a reject aborts the run.assess(ships withassess):intake → research → define → shape → decide→ gate to review the verdict indecision.md. Ends there — the handoff to/speckit.specifystays a deliberate, separate step, matching the extension's stated philosophy.No change to the engine itself — installed workflows are already resolved through the registry. The only new machinery is the extension lifecycle wiring:
extension addcopies the workflow YAML to.specify/workflows/<id>/workflow.ymland registers it (source:extension:<id>)extension removeuninstalls the workflow only if unmodified; edited files are skipped with a warningextension updatereinstalls the workflow on version changeworkflow remove/updateon an extension-owned workflow points at the owning extension insteadDeliberate non-goals
gitextension — its commands already run automatically via lifecycle hooks; a workflow would duplicate that.agent-contextextension — a single maintenance command driven by hooks, not a multi-step flow.Since the workflow ships inside the extension, the prerequisite problem solves itself: a workflow can't be installed without the extension that provides the commands it calls. No
requires.extensionsschema key needed.Happy to work out a full implementation plan if this sounds like something spec-kit should have.
All reactions