Praxis

What, not how.

--- **Praxis** is a discipline framework for AI coding agents. Tell your agent *what you need* and *what done looks like*—not *how to do it*. As AI gets smarter, this gap widens: the agent can apply domain expertise, handle edge cases, and adapt faster than step-by-step instructions allow. Inspired by [Superpowers](https://github.com/obra/superpowers), rewritten to be significantly cheaper while keeping the core capabilities. **📖 [Full documentation](https://ouonet.github.io/praxis/)** ## Quick Start ```bash claude plugins marketplace add ouonet/praxis claude plugins install praxis@praxis claude 'do a todo list app' ``` ## How it works At session start, a hook injects the `praxis:using-praxis` startup skill. It tells your agent: 1. Classify scope inline using the triage table embedded in `using-praxis` — no Skill call needed. 2. Load only the skills that scope needs. **Trivial tasks skip the waterfall entirely.** 3. Follow the loaded skill literally; don't freelance past `` markers. ## Skills | Skill | When | | --------- | ------------------------------------------- | | [onboard](skills/onboard/SKILL.md) | existing project with no docs/tech-spec.md | | [design](skills/design/SKILL.md) | scope ≥ standard, anything new; also handles vague goals — clarifies before designing | | [plan](skills/plan/SKILL.md) | after design | | [tdd](skills/tdd/SKILL.md) | implementing or fixing | | [debug](skills/debug/SKILL.md) | something broken | | [review](skills/review/SKILL.md) | before merge / after subagent task | | [worktree](skills/worktree/SKILL.md) | non-trivial or parallel work | | [subagents](skills/subagents/SKILL.md) | independent tasks, fan-out | | [ship](skills/ship/SKILL.md) | merge / PR / cleanup | | [release](skills/release/SKILL.md) | version / tag / publish | Skills range from ~100 to ~400 tokens each. Compare to Superpowers' 2,500–3,500 per skill. ## Token budget | | Superpowers | Praxis | | ---------------------------- | ------------- | ----------------------------- | | Bootstrap (every session) | ~2,200 | ~450 (using-praxis + inline triage) | | Per skill load | ~2,500–3,500 | ~100–400 | | Trivial task | ~11,000 | ~450 (bootstrap only) | | Standard task (design→ship) | ~30–50k | ~1,300 (bootstrap + 4 skills) | | Complex task (all skills) | ~40–60k | ~2,900 (all skills combined) | ## Documentation Structure Praxis enforces a strict documentation structure and keeps code and docs in sync at every step. ### Living Documentation **Living documentation** — describes the current system state and direction. Always in sync with code. - **`README.md`** — for users: what it is, who for, how to use it - **`docs/tech-spec.md`** — for developers/agents: current system state ([format](skills/archive/SKILL.md#tech-spec-format)) - **`docs/specs/*.md`** — details split out of the tech-spec when it grows too bulky; referenced by path - **`docs/ROADMAP.md`** — direction and milestones (exists when project has ≥3 milestones or long-term direction) `docs/tech-spec.md` uses a structured declaration format: ``` purpose / user / use-case / architecture / stack / entry / contract / flow / invariant / constraint / convention / milestone ``` Facts only — no interpretation, no plans. If details are bulky — e.g. a complex flow (branching, async, multi-actor) that needs a diagram — split into `docs/specs/` and link; the spec keeps a one-line summary. **Project artifacts** — records and conventions. Append-only or static. - **`CHANGELOG.md`** — version history, maintained by `ship` - **`docs/decisions/`** — architectural decision log, append-only ### Staging Area During active work, Praxis uses: - **`docs/staging/specs/YYYY-MM-DD-.md`** — Working spec for the current change. - **`docs/staging/plans/YYYY-MM-DD-.md`** — Executable milestone tasks. At `ship`, the staging spec merges into living docs; staging files are deleted (Git keeps history). ### Code-Docs Sync Praxis enforces synchronization at multiple checkpoints: - **During [`tdd`](skills/tdd/SKILL.md)**: After each RED-GREEN-refactor cycle, sync docs before commit. - If staging spec exists → update it to match reality. - If no staging spec (small tasks) → update living docs directly. - **At [`ship`](skills/ship/SKILL.md) gate**: Staging spec must reflect actual code behavior. - **At [`review`](skills/review/SKILL.md)**: Check that README/comments reflect actual behavior. **The rule**: Code changes without doc updates fail review. Docs that don't match code block merge. ## Install ### Install from a branch To try an unreleased branch before it merges: **Claude Code** ```bash claude plugins marketplace add ouonet/praxis# claude plugins install praxis ``` **OpenCode** — set in `opencode.json`: ```json { "plugin": ["praxis@git+https://github.com/ouonet/praxis.git#"] } ``` **Qoder CLI CN** — clone and checkout: ```bash git clone --branch https://github.com/ouonet/praxis.git ~/.qoder-cn/praxis ln -s ~/.qoder-cn/praxis/skills ./skills ``` Replace `` with the branch name. --- ### Claude Code ``` claude plugins marketplace add ouonet/praxis claude plugins install praxis ``` To update after new releases: ``` claude plugins update praxis ``` > Claude Code does not auto-update plugins. Run the update command manually after repo changes. ### Codex (CLI / app) Praxis is distributed as a Codex marketplace. Register the marketplace from the CLI: ```bash codex plugin marketplace add ouonet/praxis ``` Then open the plugin directory and install it from the Codex UI: ``` /plugins ``` Search for `praxis` and select **Install Plugin**. If the marketplace was already added before an update, refresh it first: ```bash codex plugin marketplace upgrade praxis-marketplace ``` ### OpenCode See [`.opencode/INSTALL.md`](.opencode/INSTALL.md). ### GitHub Copilot CLI ``` copilot plugin install ouonet/praxis ``` (Or symlink `.copilot-plugin/plugin.json` per Copilot's plugin convention.) ### VsCode Copilot ``` open customization of copilot -> Plugins -> Install Plugin From Source -> input "ouonet/praxis" ``` ### Antigravity CLI ``` agy plugin install https://github.com/ouonet/praxis ``` Antigravity imports Praxis through the Gemini-compatible plugin path, including the session-start hook. ### Gemini CLI ``` gemini extensions install https://github.com/ouonet/praxis ``` The extension loads `skills/using-praxis/SKILL.md` as session context, so triage runs from the first turn. ### Qoder CLI CN Qoder CLI CN auto-discovers skills from the project's `skills/` directory — no hooks or manual loading needed. Clone this repo and symlink (or copy) the `skills/` directory into your project: ```bash git clone https://github.com/ouonet/praxis.git ~/.qoder-cn/praxis ln -s ~/.qoder-cn/praxis/skills ./skills ``` Or install as an SDK plugin by pointing to the `.qoder-plugin/` manifest in your project config. The `using-praxis` skill is auto-discovered and triggered at session start by its description. ### Manual / fallback For harnesses without plugin support, add an instruction that reads `skills/using-praxis/SKILL.md` first. ## Verify it's working Start a fresh session. Send: `let's build a react todo list`. Expected: outputs `praxis: scope=standard, loading=design,plan,tdd,review` (no `Skill(praxis:triage)` call — triage is inline) and starts asking clarifying questions before touching code. Send: `fix the typo "teh" in README`. Expected: agent outputs `praxis: scope=trivial, loading=` and just fixes it. **No design doc, no plan, no TDD ceremony.** ## Examples ### Vague goal ``` You: I want to build something that helps developers manage their workflow Agent: triage -> vague -> design ``` Design asks one clarifying question per turn until the problem is concrete enough to spec. If exploration produces a knowledge artifact (protocol spec, RE findings), it goes to `docs/decisions/` via `archive`. ### Tiny fix ``` You: fix the typo "teh" in README Agent: triage -> trivial -> edit -> done ``` ### Standard feature ``` You: add OAuth login with GitHub Agent: triage -> design -> plan -> tdd -> review -> ship ``` Design asks only needed questions, plan writes milestone tasks, ship updates living specs and CHANGELOG `Unreleased`. ### Parallel work ``` You: migrate the entire API from REST to tRPC Agent: triage -> design -> plan -> worktree -> subagents -> review -> ship ``` Subagents expand milestones at dispatch time; the coordinator reviews and marks tasks complete. ### Onboard existing project ``` You: take over this project / add Praxis to this codebase Agent: triage -> onboard ``` Onboard explores the codebase and produces `docs/tech-spec.md` — a factual record of stack, contracts, conventions, and invariants. No code changes, no plans. After confirmation, the normal `design → plan → tdd` flow resumes. ### Release ``` You: release 1.2.0 Agent: triage -> release ``` Release confirms the version, moves CHANGELOG `Unreleased`, then asks before commit, tag, push, or publish. ## Common Signals | You ask | Praxis does | | ---------------------- | ---------------------------------- | | I want to build X (vague) | vague → design (clarifies first) | | fix typo | trivial | | add small field | small -> tdd | | add feature | standard -> design/plan/tdd/review | | migrate module | complex -> worktree/subagents | | failing behavior | debug | | take over this project | onboard | | release 1.2.0 | release | ## Compared to Superpowers Praxis is directly inspired by [Superpowers](https://github.com/obra/superpowers). The core idea is the same: inject structured discipline into an agent session via skill files. | Superpowers skill | Praxis equivalent | | ----------------------------------------------------------------- | ------------------------------------------ | | `using-superpowers` | `using-praxis` (triage inline) | | `brainstorming` | `design` | | `writing-plans` | `plan` | | `executing-plans` | `tdd` | | `test-driven-development` | `tdd` | | `systematic-debugging` | `debug` | | `requesting-code-review` / `receiving-code-review` | `review` | | `using-git-worktrees` | `worktree` | | `dispatching-parallel-agents` / `subagent-driven-development` | `subagents` | | `finishing-a-development-branch` | `ship` | | `verification-before-completion` | gate markers in `tdd` / `ship` | | `writing-skills` | — (not needed; skills are plain Markdown) | | — | `onboard` (no Superpowers equivalent) | | — | `archive` (no Superpowers equivalent) | | — | `release` (no Superpowers equivalent) | **Philosophy difference:** Superpowers gives agents detailed recipes—prose specs, step-by-step plans, narrative reasoning. Praxis gives agents *declarations of intent*—decisions, contracts, validation gates. This works because: - Agents get smarter; recipes become obsolete. Declarations stay relevant. - Leaner artifacts = faster iteration and long-term maintainability. - The agent brings domain knowledge; Praxis provides *what matters*, not *how to do it*. **Token savings:** The skill files are smaller (avg ~230 vs ~1,760 tokens), and artifacts are too. Praxis `design` outputs a spec (decisions, contracts, invariants) with no narrative; `plan` outputs milestone stubs with one-line goals. At `ship`, working notes are archived and the spec merges into living docs—context stays lean across sessions. **When to use Superpowers:** You want battle-tested, narrative-rich workflows and token cost isn't a constraint. **When to use Praxis:** You want agents to think, not follow recipes. You want specs and plans that survive across sessions and scale with AI capability. ## Philosophy - **Intent, not instruction.** Tell the agent what to achieve and what done looks like. Let it decide how to do it. - **Pay for discipline only when it pays back.** Triage decides. - **Skills are short.** If a rule needs 3,000 tokens to express, it's probably not a rule, it's a manual. - **Cross-harness via env detection,** not per-harness skill copies. - **No ceremony around the rules** — state each rule once, clearly. ## Layout ``` skills//SKILL.md # skills (using-praxis is the entrypoint; manual/fallback reads it directly) hooks/ hooks.json # hook registry run-hook.cmd # Windows hook runner session-start # session-start hook script .claude/ # Claude Code settings .claude-plugin/ # Claude Code plugin manifest .codex-plugin/ # Codex plugin manifest .copilot-plugin/ # Copilot CLI plugin manifest .qoder-plugin/ # Qoder CLI CN plugin manifest .opencode/ # OpenCode config + install doc gemini-extension.json # Gemini CLI extension manifest ``` ## License MIT.