
Spec Stack
- 17 installs
- 40 repo stars
- Updated August 4, 2026
- akillness/oh-my-skills
spec-stack is a Claude Code skill that composes spec-kit, Ouroboros, and CLI-Anything into one spec-driven delivery stack (write, freeze, run) that loops until verification passes.
About
spec-stack composes GitHub spec-kit, Ouroboros (ooo), and HKUDS CLI-Anything into a single spec-driven delivery stack that goes from a written spec to a verified artifact. A developer uses it when spec authoring, an immutable verified loop, and real software harnesses all need to work together without fighting over the same job. It matters because it hands a concrete artifact between layers (spec feeds the seed, the seed names the harnesses, harness JSON output is evaluate evidence).
- Composes spec-kit, Ouroboros, and CLI-Anything into one Write -> Freeze -> Run stack
- Assigns each layer a job: spec-kit writes, ooo freezes and loops, cli-anything is the hands
- Routes three patterns (full-stack, loop-only, docs-only) with explicit anti-patterns
Spec Stack by the numbers
- 17 all-time installs (skills.sh)
- Ranked #2,076 of 3,282 Productivity & Planning skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
spec-stack capabilities & compatibility
Free; installs open-source specify-cli, cli-anything-hub, and ouroboros
- Capabilities
- spec authoring · spec freeze · verify loop · harness generation
- Works with
- github
- Use cases
- planning · orchestration · testing
- Pricing
- Free
What spec-stack says it does
The stack's one rule: **spec-kit writes, ooo freezes and loops, cli-anything is the hands.**
Compose GitHub spec-kit, Ouroboros (ooo), and HKUDS CLI-Anything into one
npx skills add https://github.com/akillness/oh-my-skills --skill spec-stackAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 17 |
|---|---|
| repo stars | ★ 40 |
| Last updated | August 4, 2026 |
| Repository | akillness/oh-my-skills ↗ |
What it does
Drive a written spec through an immutable verified loop with agent-native CLI harnesses to a verified artifact.
Who is it for?
The full path from a written spec to a verified artifact using all three composed tools
Skip if: Using only one layer (spec-kit docs, ooo loop, or cli-anything harness) alone
When should I use this skill?
The user wants spec-to-verified-artifact delivery or wants spec-kit and ooo to work together
What you get
A verified artifact produced by handing concrete artifacts between the write, freeze, and run layers
- Immutable seed with machine-checkable criteria
- Verified artifact
By the numbers
- composes 3 upstream tools
- 3 routing patterns (full-stack, loop-only, docs-only)
Files
spec-stack — Write → Freeze → Run, Verified
spec-stack composes three skills that own different layers of spec-driven delivery and keeps them from fighting over the same job:
| Layer | Skill | Owns |
|---|---|---|
| Spec (what) | `spec-kit` | Human-readable SDD artifacts via /speckit.constitution → specify → plan → tasks; shareable across 30+ agents |
| Loop (until done) | `ooo` | Socratic interview to ambiguity ≤ 0.2, immutable seed, drift measurement, persistent verify-before-done loop (ralph) |
| Tools (with what) | `cli-anything` | Agent-native CLIs for real software — CLI-Hub registry, --json output, artifact-level verification |
The stack's one rule: spec-kit writes, ooo freezes and loops, cli-anything is the hands. Each layer hands a concrete artifact to the next — spec.md/plan.md feed the seed interview, the seed names the harnesses the loop may use, and harness --json output is the evidence the evaluate step accepts.
When to use this skill
- The user wants the **full path from a written spec to a verified
artifact**, not just one of the three tools
- The user asks how spec-kit and ooo should work together (which owns
the spec, which owns completion) or how to avoid duplicating the spec
- The implementation must drive real software (image/video/office/3D/
GIS/game tooling) inside a verified loop instead of one-shot codegen
- The user says "spec-stack", "write freeze run", or names two or more of
spec-kit, ooo, cli-anything in one workflow
When not to use this skill
- Only authoring SDD documents for one or more agents → use
spec-kit - Only a verify-until-done loop with no document artifacts → use
ooo - Only installing or generating a CLI harness → use
cli-anything - Deciding which planning artifact comes next (brief, PRD,
architecture) → use bmad
- Human review/approval of an existing plan or diff → use
plannotator
Prerequisites
| Requirement | Notes |
|---|---|
| Python 3.11+ | specify-cli requires 3.11+; CLI-Hub needs 3.10+ |
uv (recommended) or pipx/pip | Used by scripts/install.sh for all three tools |
| One supported AI agent | Claude Code, Codex, Gemini, Cursor, opencode, … |
| Target software (pattern A) | Harnesses call the real backend — install the upstream app too |
Instructions
Step 0 — Choose the composition pattern
| Pattern | When | Layers |
|---|---|---|
| A — full-stack | Medium+ work that touches real software and needs both shared docs and a verified loop | spec-kit → ooo → cli-anything |
| B — loop-only | Single-session "keep going until verified" with no document deliverable | ooo (+ cli-anything if software is involved) |
| C — docs-only | Multi-agent/team needs the .specify/ artifacts; completion is enforced elsewhere | spec-kit |
If the user has not stated a pattern, default to A when external software or acceptance evidence is involved, B for code-only persistence, C for documentation handoffs.
Step 1 — Install the stack
bash scripts/install.sh # specify-cli + cli-anything-hub
SPEC_STACK_OOO=1 bash scripts/install.sh # also pip-install ouroboros-aiOn Claude Code, prefer the ooo plugin instead of pip: claude plugin marketplace add Q00/ouroboros. Verify with specify --version, cli-hub list, and ouroboros --help (or the ouroboros_* MCP tools).
Step 2 — Write the spec (spec-kit)
specify init . --integration claudeThen inside the agent: /speckit.constitution → /speckit.specify → /speckit.clarify (only if open questions remain). Stop before /speckit.implement — implementation belongs to the loop layer in pattern A. Write success criteria as machine-checkable statements ("output PNG is 1024×1024, verified by pixel inspection"), not vibes ("image looks right") — Step 3 and Step 5 depend on this.
Step 3 — Freeze the contract (ooo)
Feed spec.md/plan.md into the ooo interview (brownfield weighting), drive ambiguity ≤ 0.2, then generate the immutable seed:
ouroboros interview --context .specify/ # or MCP: ouroboros_interview
ouroboros seed generate # or MCP: ouroboros_generate_seedTwo seed rules that make the stack work:
1. Success criteria mirror the spec's acceptance criteria in machine-checkable form — the evaluate step will demand evidence. 2. Constraints name the tools: e.g. "image operations go through the cli-anything-gimp harness; GUI automation is out of contract." This turns tool drift into measurable spec drift.
The seed is the execution SSOT from here on; spec.md stays the document SSOT. Direction is one-way: spec-kit → seed. If requirements change, update the spec first, then re-freeze.
Step 4 — Arm the tools (cli-anything)
Before writing integration code, search the registry:
cli-hub search <keyword> # 40+ harnesses exist — seconds, not a session
cli-hub install <name> # install the harness + the upstream appOnly when the registry has no match, generate: /cli-anything <path-or-repo> (7-phase pipeline), then /cli-anything:refine as needed. Generation is the fallback, never the default.
Step 5 — Run the loop
ouroboros run # or MCP: ouroboros_execute_seed; ralph for persistence
ouroboros evaluate # or MCP: ouroboros_evaluateIn the evaluate step, verify artifacts, not exit codes: use the harness --json output, magic bytes, document structure, or pixel/audio checks as evidence — the same discipline cli-anything's own test suite uses. On failure the loop continues; on repeated failure use ooo's unstuck step instead of blind retries. Pattern A users who want the spec-kit task list can run /speckit.implement per task inside the loop — the seed still gates completion.
Step 6 — Plugin-style installation alongside jeo-skills
# Project install (writes into .agents/skills/spec-stack/)
npx skills add https://github.com/akillness/jeo-skills --skill spec-stack
# Global install for every detected agent
npx skills add -g https://github.com/akillness/jeo-skills --skill spec-stack
# Target specific agents
npx skills add -g https://github.com/akillness/jeo-skills --skill spec-stack -a claude-code -a codex -yInstalling spec-stack does not auto-install the three layer skills; install whichever you lack the same way (--skill spec-kit, --skill ooo, --skill cli-anything).
Output format
When the user asks spec-stack for help, return a compact brief:
# spec-stack Routing Brief
## Scope
- Pattern: full-stack | loop-only | docs-only
- Target software: <name> | none | undecided
- Stack state: nothing-installed | spec-written | seed-frozen | tools-armed | loop-running
## Recommended next move
- install-stack | specify-init | write-spec | freeze-seed | hub-search | run-loop | evaluate
## Why
- 2-3 bullets grounded in the user's packet
## Route-outs
- `spec-kit` / `ooo` / `cli-anything` for single-layer work
- `bmad` for choosing the next planning artifact
- `plannotator` for human plan approval before implementExamples
Example 1 — Pattern A end to end (image pipeline against real software)
bash scripts/install.sh # specify-cli + cli-anything-hub
specify init . --integration claude # spec layer
# in the agent: /speckit.constitution → /speckit.specify → /speckit.clarify
ouroboros interview --context .specify/ # loop layer: drive ambiguity ≤ 0.2
ouroboros seed generate # freeze; criteria mirror spec.md
cli-hub search image && cli-hub install gimp # tool layer: registry first
ouroboros run # implement against the seed
ouroboros evaluate # verify --json artifacts, loop on failExample 2 — Routing a vague combined request
User: "spec-kit이랑 ooo 같이 쓰고 싶은데 어디서부터?" → Return the Routing Brief with Pattern: full-stack, Stack state: nothing-installed, Recommended next move: install-stack, and route-outs left intact. Do not start /speckit.implement — in pattern A completion belongs to the ooo loop.
Example 3 — Near-miss that should route out
User: "GIMP용 CLI 하니스만 만들어줘" → single-layer work; hand off to cli-anything (registry search first), no seed or spec ceremony.
Best practices
1. One SSOT per concern — spec.md is the document SSOT, seed.yaml the execution SSOT, flowing one way. Running both pipelines fully in parallel creates two competing specs. 2. Registry before generation — cli-hub search costs seconds; a 7-phase harness build costs a session. 3. Machine-checkable acceptance criteria — write them in /speckit.specify, mirror them in the seed, demand them in evaluate. 4. Name tools in seed constraints — uncontracted tool choice is invisible drift. 5. No ralph without a seed — a persistent loop without verification criteria runs "until tired", not "until done". Seed first, loop second. 6. Hand the plan to `plannotator` before implement on level 2+ work; the approval gate sits between Step 3 and Step 5.
References
- Layer skills: `../spec-kit/SKILL.md`,
`../ooo/SKILL.md`, `../cli-anything/SKILL.md`
- Upstream: <https://github.com/github/spec-kit>,
<https://github.com/Q00/ouroboros>, <https://github.com/HKUDS/CLI-Anything>
- Installer script: `scripts/install.sh`
- Command crosswalk + handoff map: `references/commands.md`
- Adjacent skills:
../bmad/SKILL.md,../plannotator/SKILL.md - License: MIT (this wrapper); upstream licenses apply to each tool
{
"skill_name": "spec-stack",
"evals": [
{
"id": 1,
"prompt": "Use spec-stack. We need to automate product-shot retouching with GIMP: the requirements are still fuzzy, the team shares specs across Claude and Codex, and last time the agent declared success without checking the output files.",
"expected_output": "A spec-stack routing brief that selects the full-stack pattern and sequences spec-kit authoring, ooo seed freeze, CLI-Hub harness install, and a run/evaluate loop with artifact-level evidence.",
"assertions": [
"Output selects exactly one pattern (full-stack) and names the stack state.",
"Output sequences the layers in order: /speckit.* authoring before seed freeze, cli-hub search/install before any harness generation, loop last.",
"Output requires machine-checkable acceptance criteria mirrored into the seed and --json artifact evidence in the evaluate step, not exit codes."
]
},
{
"id": 2,
"prompt": "How should spec-kit and ooo work together on one repo? I'm worried they will both try to own the spec.",
"expected_output": "An explanation of the one-way SSOT split: spec.md is the document SSOT, seed.yaml the execution SSOT, flowing spec-kit → ooo only, with requirement changes re-entering through the spec.",
"assertions": [
"Output states the one-way flow spec.md → seed.yaml and forbids running both pipelines to completion in parallel.",
"Output names the two-SSOT situation as an anti-pattern explicitly.",
"Output keeps /speckit.implement subordinate to the ooo loop in pattern A or routes the user to docs-only if no loop is wanted."
]
},
{
"id": 3,
"prompt": "Just generate a CLI harness for Blender so my agent can drive it.",
"expected_output": "A route-out to the cli-anything skill (registry search before generation) without invoking spec or seed ceremony.",
"assertions": [
"Output routes to cli-anything instead of running the spec-stack pipeline.",
"Output recommends cli-hub search before the 7-phase generation pipeline.",
"Output does not create a constitution, spec, or seed for this single-layer request."
]
}
]
}
spec-stack command crosswalk
Three tools, one delivery path. Layer skills own the detail: `../../spec-kit/references/commands.md`, ../../ooo/SKILL.md, ../../cli-anything/references/commands.md.
The handoff map
| Stage | Artifact produced | Consumed by |
|---|---|---|
/speckit.constitution | constitution.md (principles) | /speckit.plan, seed Constraints |
/speckit.specify (+ clarify) | spec.md (requirements, acceptance criteria) | ooo interview context |
/speckit.plan → /speckit.tasks | plan.md, task list | loop iterations (optional in pattern A) |
ouroboros interview → seed generate | immutable seed.yaml | ouroboros run / ralph, drift measurement |
cli-hub install <name> | agent-native CLI harness on PATH | implementation steps inside the loop |
cli-anything-<name> --json … | structured artifact evidence | ouroboros evaluate verification |
Stage 1 — Spec (spec-kit)
| Command | Purpose |
|---|---|
specify init . --integration <agent> | Bootstrap .specify/ for the chosen agent |
/speckit.constitution | Principles and non-negotiables (feeds seed Constraints) |
/speckit.specify | Requirements + machine-checkable acceptance criteria |
/speckit.clarify | Resolve open questions before freezing anything |
/speckit.plan · /speckit.tasks | Technical strategy and task breakdown |
/speckit.analyze | Constitution ↔ spec ↔ plan consistency check |
In pattern A, stop before /speckit.implement — the loop layer gates completion.
Stage 2 — Contract (ooo)
| Command / MCP tool | Purpose |
|---|---|
ouroboros interview / ouroboros_interview | Socratic interview (brownfield weighting when a spec exists); proceed only at ambiguity ≤ 0.2 |
ouroboros seed generate / ouroboros_generate_seed | Freeze the immutable seed from the interview + spec |
ouroboros run / ouroboros_execute_seed | Execute against the seed |
ouroboros evaluate / ouroboros_evaluate | Verify before done; demands the evidence the seed promised |
ralph (ooo ralph) / ouroboros_ralph | Persistent completion loop until evaluation passes |
ouroboros_measure_drift | Distance between implementation and the frozen contract |
Seed authoring rules: success criteria mirror spec.md acceptance criteria in machine-checkable form; constraints name the permitted harnesses (e.g. cli-anything-gimp, no GUI automation).
Stage 3 — Tools (cli-anything)
| Command / MCP tool | Purpose |
|---|---|
cli-hub search <kw> / hub_search | Registry first — 40+ harnesses already exist |
cli-hub install <name> / hub_install | Install a harness (install the upstream app too) |
cli-anything-<name> --json <cmd> | Structured output → evaluate-step evidence |
/cli-anything <path-or-repo> | Generate a new harness (7-phase) only when the registry has no match |
/cli-anything:refine · :test · :validate | Iterate harness coverage during the loop |
Pattern quick reference
| Pattern | Command sequence |
|---|---|
| A — full-stack | specify init → /speckit.specify → ouroboros interview → seed generate → cli-hub install → ouroboros run/ralph ↔ evaluate |
| B — loop-only | ouroboros interview → seed generate → (cli-hub install if software) → ralph ↔ evaluate |
| C — docs-only | specify init → full /speckit.* pipeline including /speckit.implement |
Anti-patterns
- Two SSOTs: running
/speckit.implementto completion and an ooo
loop against a separately-evolved seed. Flow is one-way: spec → seed.
- Generate-first: building a harness before
cli-hub search. - Seedless ralph: a persistence loop with no frozen verification
criteria.
- Exit-code verification:
evaluateshould inspect artifacts
(--json output, file structure, pixels), not just process status.
#!/usr/bin/env bash
# spec-stack installer wrapper.
# Installs the stack's CLI surfaces: specify-cli (spec layer) and
# cli-anything-hub (tool layer). The loop layer (ouroboros) is opt-in
# because Claude Code users typically install it as a plugin instead
# (claude plugin marketplace add Q00/ouroboros).
#
# Env knobs:
# SPEC_STACK_OOO — "1" also pip-installs ouroboros-ai[all]
# SPEC_KIT_REF — git ref for spec-kit (default: main)
# CLI_ANYTHING_HUB_SPEC — pip requirement spec (default: cli-anything-hub)
#
# Usage:
# bash scripts/install.sh
# SPEC_STACK_OOO=1 bash scripts/install.sh
# SPEC_KIT_REF=v0.0.10 bash scripts/install.sh
set -euo pipefail
SPEC_KIT_REF="${SPEC_KIT_REF:-main}"
CLI_ANYTHING_HUB_SPEC="${CLI_ANYTHING_HUB_SPEC:-cli-anything-hub}"
SPEC_KIT_FROM="git+https://github.com/github/spec-kit.git@${SPEC_KIT_REF}"
echo "=== spec-stack installer ==="
echo "spec-kit ref: ${SPEC_KIT_REF}"
echo "cli-hub spec: ${CLI_ANYTHING_HUB_SPEC}"
echo "ooo via pip: ${SPEC_STACK_OOO:-0}"
# Fast path: all requested layers already on PATH → skip network installs.
# Set FORCE=1 to reinstall/upgrade.
if [ "${FORCE:-0}" != "1" ] \
&& command -v specify >/dev/null 2>&1 \
&& command -v cli-hub >/dev/null 2>&1 \
&& { [ "${SPEC_STACK_OOO:-0}" != "1" ] || command -v ouroboros >/dev/null 2>&1; }; then
echo "All stack layers already installed — set FORCE=1 to reinstall/upgrade."
exit 0
fi
install_pkg() {
# $1 = pip requirement spec, $2 = optional --from source for uv tool
local spec="$1" from="${2:-}"
if [ -n "${VIRTUAL_ENV:-}" ]; then
if command -v uv >/dev/null 2>&1; then
if [ -n "$from" ]; then uv pip install --upgrade "${spec} @ ${from}"; else uv pip install --upgrade "$spec"; fi
else
if [ -n "$from" ]; then pip install --upgrade "${spec} @ ${from}"; else pip install --upgrade "$spec"; fi
fi
elif command -v uv >/dev/null 2>&1; then
# No venv: isolated tool env keeps system/Homebrew Python untouched (PEP 668)
if [ -n "$from" ]; then uv tool install --force "$spec" --from "$from"; else uv tool install --upgrade "$spec"; fi
elif command -v pipx >/dev/null 2>&1; then
if [ -n "$from" ]; then pipx install --force "$from"; else pipx install --force "$spec"; fi
elif command -v pip3 >/dev/null 2>&1; then
local target="${from:-$spec}"
pip3 install --upgrade "$target" 2>/dev/null \
|| pip3 install --user --break-system-packages --upgrade "$target"
else
echo "ERROR: none of uv / pipx / pip is installed." >&2
echo " Install uv: curl -LsSf https://astral.sh/uv/install.sh | sh" >&2
exit 1
fi
}
echo "[1/3] Installing specify-cli (spec layer)"
install_pkg specify-cli "${SPEC_KIT_FROM}"
echo "[2/3] Installing cli-anything-hub (tool layer)"
install_pkg "${CLI_ANYTHING_HUB_SPEC}"
if [ "${SPEC_STACK_OOO:-0}" = "1" ]; then
echo "[3/3] Installing ouroboros-ai (loop layer)"
install_pkg "ouroboros-ai[all]"
else
echo "[3/3] Skipping ouroboros pip install (set SPEC_STACK_OOO=1 to include)."
echo " Claude Code plugin route: claude plugin marketplace add Q00/ouroboros"
fi
echo ""
echo "Verify:"
for bin in specify cli-hub ouroboros; do
if command -v "$bin" >/dev/null 2>&1; then
echo " ✅ $bin"
else
echo " ⚠️ $bin not on PATH (check your tool bin dir, e.g. ~/.local/bin)"
fi
done
echo ""
echo "Next (pattern A — full-stack):"
echo " specify init . --integration claude # write the spec"
echo " /speckit.constitution → /speckit.specify → /speckit.clarify"
echo " ouroboros interview && ouroboros seed generate # freeze the contract"
echo " cli-hub search <keyword> # arm the tools (registry first)"
echo " ouroboros run / ralph ↔ ouroboros evaluate # loop until verified"
N:spec-stack
D:Compose spec-kit, ooo (Ouroboros), and cli-anything into one spec-driven delivery stack — Write (author the spec with /speckit.*), Freeze (immutable ooo seed with machine-checkable acceptance criteria), Run (loop with agent-native CLI harnesses whose --json output is the evaluate evidence) until verification passes; three patterns: full-stack, loop-only (ooo), docs-only (spec-kit), with a one-way spec.md → seed.yaml SSOT flow.
T:Bash|Read|Write|Edit|Glob|Grep|WebFetch
G:spec-stack|spec stack|write freeze run|spec-kit ooo cli-anything|spec to seed|verified delivery stack
F:Claude|Codex|Gemini|OpenCode
S:
1:Pick the pattern — full-stack (spec-kit → ooo → cli-anything), loop-only (ooo), or docs-only (spec-kit)
2:Write — author spec.md via /speckit.constitution → /speckit.specify → /speckit.clarify
3:Freeze — mirror acceptance criteria into an immutable ooo seed.yaml (one-way spec → seed; never two SSOTs)
4:Arm — `cli-hub search/install` agent-native harnesses; their `--json` output becomes evaluate evidence
5:Run — ooo run/ralph ↔ evaluate loop until acceptance criteria verify (artifacts, not exit codes)
6:Change control — requirement changes re-enter through the spec, then re-freeze the seed
R:
spec-kit:Use for docs-only SDD pipeline work
ooo:Use for loop-only immutable-seed execution
cli-anything:Use for harness install/generation alone
plannotator:Use for plan review/approval gates
Related skills
FAQ
What is the stack's one rule?
spec-kit writes, ooo freezes and loops, and cli-anything is the hands.
What are the three composition patterns?
Full-stack (spec-kit to ooo to cli-anything), loop-only (ooo), and docs-only (spec-kit).