Spindle composes source skills into surface-specific blends.
It is a small Python toolchain for installing skill packages, grouping them into distributions, resolving the right subset for a repo or agent surface, rendering that subset for a harness/model profile, and materializing the result where the agent runtime can load it.
The public base ships with a minimal reference distribution under
examples/spindle-sample. Private organizations can publish their own packages,
distributions, project registries, task sinks, gate sinks, scout runners, and
marketplace providers without changing Spindle core.
uv sync --extra dev
spindle dist install examples/spindle-sample/distributions/spindle-sample
spindle dist activate spindle-sample
spindle doctrine show
spindle skill list
spindle bind /path/to/repo --harness claudespindle bind classifies the target repo, resolves the channels it subscribes to,
lints the blend for coherence, renders through the active harness/model profiles,
and materializes the selected skills into the surface's harness-native skills
directory.
| Term | Meaning |
|---|---|
| package | A pip-installable project that declares skills and capabilities in [tool.spindle.package]. |
| distribution | A pip-installable bundle that declares [tool.spindle.distribution] and depends on packages. |
| channel | A versioned (scope x harness) manifest listing the skills a surface should receive. |
| surface | A repo or agent that consumes a skill blend. |
| profile | A harness/model renderer such as identity, terse, or trim. |
| blend | The resolved skill subset for a surface. |
examples/spindle-sample/
packages/sample-planning/ # [tool.spindle.package]
distributions/spindle-sample/ # [tool.spindle.distribution]
channels/system/system/claude/ # sample channel
profiles/ # harness/model render profiles
doctrine/ # minimal doctrine used by lint/render
peers/ verdicts/ scout/ roster/ # optional learning/marketplace scaffolds
spindle package new my-tools --dest ./packages/my-tools \
--skill clarify --skill review --capabilities planning
spindle dist new my-dist --dest ./distributions/my-dist \
--source-dir ../../ \
--package my-tools==0.1.0Spindle discovers installed packages through [tool.spindle.package] metadata and
installed distributions through [tool.spindle.distribution].
The OSS base includes local reference implementations:
spindle ingestwrites a topo-ordered task queue toSPINDLE_TASK_QUEUEor$SPINDLE_HOME/tasks.jsonlunlessSPINDLE_TASK_URLis set.spindle gate filewrites decision gates toSPINDLE_GATE_QUEUEor$SPINDLE_HOME/gates.jsonl.spindle scoutmaterializes per-peer prompts and emits commands fromSPINDLE_SCOUT_COMMAND.
Private infrastructure should live in separate adapter packages that depend on Spindle rather than being imported by Spindle core.
uv run --extra dev pytestMIT licensed. Contributions welcome; see CONTRIBUTING.md. Release process and versioning: RELEASING.md.