Skip to main content

SpecSmither

Open-source, local-first, NO-LLM Control System for Agentic AI Implementation

PyPI CI Python versions License: Apache-2.0


SpecSmither drives a software scope through Specification → Epic → Ticket → DAG and two lifecycles — planning (authoring a spec under a scoring gate) and work (building each ticket under a completion gate) — entirely over a single SQLite file. The engine is fully deterministic and synchronous; all AI reasoning lives in the MCP client, never in the engine.

It imports two independent, pure gates side-by-side:

  • crucible (crucible-forge) — the planning gate (rubric scorer). A published dependency from day one.
  • assay (assayforge → assay) — the work-session completion gate (0.2.0, upcoming).

Status

0.1.0 — the planning release. The deterministic substrate + the full planning lifecycle (authoring a spec draft → ready through the real crucible gate) + the agent surface (MCP server, TOON) + the human surface (the Textual TUI Observatory). The work lifecycle (building tickets under the assay gate) lands in 0.2.0.

Install

uv tool install specsmither      # or: pipx install specsmither  /  pip install specsmither

This installs two commands:

Command Surface Notes
specsmither the TUI Observatory — the only human UI needs a real terminal
specsmither-mcp the MCP stdio server for the agent 21 tools, TOON wire

Quickstart

cd my-project
specsmither          # opens the Observatory; press `i` to init the workspace

init lazily creates the user-global DB, binds this workspace to a project (.specsmither/config.json), and scaffolds .claude/ (agent skills, subagents, opt-in read-only hooks + a statusline) so an agent can drive the same DB via specsmither-mcp in parallel. Then bootstrap a spec and drive planning:

Key Action Key Action
1–5 switch tabs (Browser / DAG / Planning / Work / Search) i init workspace
c / e / d create / edit / delete the selected node n advance the planning gate
a / j approve / reject the handover / search

The agent registers the server as specsmither (the init scaffold writes it into .claude/settings.local.json); every MCP response is TOON.

Architecture

src/specsmither/
  domain/      enums, status transitions, runtime records (SpecFull recompose)
  db/          SQLAlchemy 2.0 ORM: base, models, migrations, *StoreSqlite repos
  dag/         status calc, single-hop cascade, dependency tree, critical path
  rollups/     count derivation, planning aggregate, in-txn recompute worklist
  operations/  CRUD, queries, search, reports, workspace/init, project, errors
  lifecycle/   planning verbs (start/action/complete) + handover, gate, state machine
  dispatch/    the single MCP routing facade (envelopes, error guidance)
  adapters/    WritePlan executor, crucible validator, lifecycle ports, config
  toon/        the TOON wire encoder (the always-on MCP encoding)
  mcp/         the stdio MCP server  → `specsmither-mcp`
  tui/         the Textual Observatory → `specsmither`

Every mutation runs in one Session.begin() (BEGIN IMMEDIATE) → apply the WritePlan → recompute worklist (cascade → counts → tree, to fixpoint) → commit/rollback. Derived data (counts, cached dependency tree) is materialized in-transaction, recomputed from the authoritative child rows (no deltas, race-free).

Runtime & workspace

SpecSmither keeps everything in one user-global SQLite database — a single specsmither.db that holds every project. A workspace is any directory bound to one project via .specsmither/config.json; different workspaces serve different projects off the same DB file (WAL + BEGIN IMMEDIATE make concurrent workspaces/agents on one file safe).

~/.specsmither/specsmither.db          # the single DB — all projects live here
~/.specsmither/config.json             # global defaults
<workspace>/.specsmither/config.json   # { "projectId": "…", "specificationId"?, … }
Env var Purpose Default
SPECSMITHER_HOME SpecSmither home directory ~/.specsmither
SPECSMITHER_DB Explicit DB file (overrides HOME) $SPECSMITHER_HOME/specsmither.db
SPECSMITHER_PROJECT Force the active project id (overrides the workspace file) the workspace config.json
SPECSMITHER_MCP_FORMAT MCP wire encoding (toon / json) toon
SPECSMITHER_LANGUAGE Guidance language (en / pt-br; aliases pt, pt_BR) en

Resolution precedence is env > project (.specsmither/config.json) > global (~/.specsmither/config.json) > default.

Development

uv sync --locked --dev
uv run ruff check src tests
uv run mypy
uv run pytest

Requires Python 3.11+. Determinism golden fixtures live in fixtures/golden/ and Textual snapshot SVGs in tests/__snapshots__/; both are committed (regenerated via tools/ and pytest --snapshot-update), so CI runs no Node.

License

Apache-2.0.

Metadata

Release files for specsmither 0.4.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for specsmither 0.4.1
File Size Uploaded
specsmither-0.4.1.tar.gz 186.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for specsmither 0.4.1
File Interpreter ABI Platform
specsmither-0.4.1-py3-none-any.whl Python 3 none any Details

Total release size: 405.6 kB

Release files / specsmither-0.4.1.tar.gz

Download URL specsmither-0.4.1.tar.gz
Size 186.1 kB
Tags Source
SHA-256 checksum
How to use checksums
2168877899aae484092fa11fce8892411de4e91fb71a540bbd4a86cf91fa509a
BLAKE2b-256 checksum
How to use checksums
74e66126af9ad1c882f0a61411620b45f192fc98e75d1ac0f0519e01f1b6e3fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.

Transparency log

Release files / specsmither-0.4.1-py3-none-any.whl

Download URL specsmither-0.4.1-py3-none-any.whl
Size 219.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fdda3a528c5e171f06959b65414fb3da27f88e64a62de2ddc3fcb4e0c86ffb7b
BLAKE2b-256 checksum
How to use checksums
057defb13927ce4224fc81205be530c8ae14ac2b401cbedde37c6c5ab497ce12
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.

Transparency log

Release history Release notifications | RSS feed

0.4.3

2 release files

0.4.2

2 release files

This release

0.4.1 This release

2 release files

0.4.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page