Command Palette

Search for a command to run...

UnylyUnyly
Browse all

Req Engine

FreeNot checked

Zero-LLM verb-based requirements store — Rust + SQLite state machine, MCP discuss/build seats, Windows WebView2 board. The engine never calls a model.

GitHubEmbed

About

Zero-LLM verb-based requirements store — Rust + SQLite state machine, MCP discuss/build seats, Windows WebView2 board. The engine never calls a model.

README

English · 简体中文

req-engine: Zero-LLM local verb store. Status comes from verbs, not set_status. Discuss (disc_) and build (build_) MCP seats bind agents; a human completes review. The engine never calls a model. Board panel is a schematic.

A Zero-LLM verb-based requirements store. Rust + SQLite enforce the lifecycle. A Windows WebView2 board is the human seat. MCP disc_ / build_ pair codes bind coding agents to one project and one role. The engine never calls a model.

Rust License: MIT

Who it is for. People who run local coding-agent hosts (Cursor, Claude Desktop, Codex, Grok, …) and want a board those agents cannot rewrite. Humans who decide done.

What it is not. Not an agent runtime, worker pool, or IDLE scheduler. Not a cloud SaaS. Not a model wrapper — Zero LLM inside the engine is the contract. Not a free-form Kanban you can PATCH into consistency. demo/*.html files are static mocks, not the runtime UI. MCP --role + token is a debug back door; do not ship it.

Start here

Windows is the official path. You need Rust and the WebView2 Runtime (already on most Win10/11).

  1. Double-click 启动需求引擎.bat (or 启动需求引擎.vbs once a binary exists). First run builds target/release/req-engine.exe if needed, then starts a hidden-console desktop on --home req-engine/data --port 7420.
  2. Or from a terminal:
cd req-engine
cargo run -- desktop --home ./data

That opens a native WebView2 window (not a browser tab), auto-inits an empty SQLite home, and injects the admin token. Close hides to the tray; quit only from the tray menu.

  1. Create a project on the board. Copy discuss or Copy build. Paste the pack into the agent host MCP config — the board is not an MCP client.
{
  "mcpServers": {
    "req-engine-discuss": {
      "command": "C:\\path\\to\\req-engine.exe",
      "args": ["mcp", "--pair", "disc_…", "--home", "C:\\path\\to\\req-engine\\data"]
    }
  }
}

Host and desktop must share --home. Templates: req-engine/examples/. Matrix: req-engine/docs/MCP.md.

Double-click launchers pin req-engine/data. Without --home / REQ_ENGINE_HOME, the CLI default is %USERPROFILE%\.req-engine (Unix: ~/.req-engine).

Optional: seed data, API-only, tests
cd req-engine
cargo test
cargo build --release

# Optional demo projects on the desktop
cargo run -- desktop --home ./data --seed-if-missing
# or: cargo run -- seed --home ./data

# API only (no native window)
cargo run -- init --home ./data --seed
cargo run -- serve --home ./data --host 127.0.0.1 --port 7420

Live HTTP smoke: req-engine/scripts/smoke.ps1. Browser-connect notes: WEB.md (optional).


Why this exists

Writing a requirement and implementing it are different jobs. Discussion agents should create and refine todos. Implementer agents should claim work and submit it. A human should decide done. Most “AI boards” collapse those jobs into a chatbot that can also PATCH status to whatever it likes.

req-engine is the opposite: a local state machine with seats. Intelligence stays in the agent host. The engine only stores facts, rejects illegal verbs, and shows who is seated.

Why verbs beat set_status

A free-form status API is an invitation to invent workflow. Two agents can mark the same card done without claiming it. A planner can skip review. A confused model can write "in-review" instead of "review". You then debug the prompt, not the product.

Here status is not a field you write. It is the result of a verb:

Schematic verb path: create to todo on the discuss seat, claim to in_progress on the build seat, submit to review, complete_review by admin to done or back to todo. set_status is rejected.

Verb From To Who (HTTP)
create todo admin, planner
claim todo in_progress foreman, admin — atomic, one winner
report_progress in_progress / review unchanged claimant or admin
submit_for_review in_progress review claimant or admin
complete_review pass / fail review done / todo admin only (desktop / HTTP)
release in_progress todo claimant or admin
cancel role-scoped cancelled planner: todo · admin: any non-terminal

There is no set_status / update_status on HTTP or MCP. done and cancelled are terminal. Soft-cancel only — no hard delete. Claim uses BEGIN IMMEDIATE plus WHERE status = 'todo' AND claimed_by IS NULL, so two MCP processes cannot both win.

The machine lives in req-engine/src/domain/state.rs. Services apply it; HTTP and MCP never bypass it.

Why Zero-LLM is a feature

If the store can think, you cannot audit it. A model inside the engine would invent transitions, hide failures in prose, and couple your board to an API key.

This process does not call OpenAI, Anthropic, or any other model. MCP is a server the host connects to. Tokens and pair codes are ACL, not “AI keys”. Seat faces are a display map from self-reported clientInfo.name (known host or identicon) — not authentication.

You can unit-test every illegal transition without a GPU, a network, or a prompt.


Architecture

 Human ── WebView2 board ── HTTP /v1 (admin Bearer) ─┐
                                                     │
 Discuss agent ── MCP stdio --pair disc_…  ──────────┼──►  req-engine
 Build agent   ── MCP stdio --pair build_… ──────────┘         │
                                                               ▼
                                              SQLite  (requirements, events,
                                              token hashes, pair hashes,
                                              seat_presence heartbeats)
Surface Job
Domain Pure transitions by role. No I/O.
Services Verbs + events. Claim is transactional.
HTTP Local board + admin review. Bearer → SHA-256 → admin / planner / foreman.
MCP Product path: --pair binds one project + one seat. Debug --role + token exists; do not ship it.
Desktop Starts the API, serves req-engine/web/index.html, opens a native window (not a browser tab). Close hides to the tray; 退出 quits.

Seats, pair codes, occupancy

Each project has two seats:

Seat Pair prefix MCP surface May Must not
Discuss disc_ planner list / get / create / update todo / cancel todo claim, submit, implement, complete_review
Build build_ foreman list_ready_tasks, claim, progress, submit, release create cards, complete_review

Desktop Copy discuss / Copy build puts a pair code plus an onboarding prompt on the clipboard.

  • SQLite stores SHA-256 of the code (discuss_pair_hash / build_pair_hash).
  • Plaintext lives in {home}/pair-codes.json (gitignored). Rotate invalidates the old code immediately.
  • A seated MCP process heartbeats every 4s. The UI treats a seat as occupied while last_seen is within 15s. Clearing the process (or a different pid) drops the face.

list_ready_tasks returns todo cards whose dependency ids are all done.


HTTP (local)

Auth: Authorization: Bearer <token>. CORS allows common localhost static origins. Health is open; everything else is authed.

Method Path Role
GET /v1/health none
GET / POST /v1/projects any / admin
PATCH /v1/projects/:id admin
POST /v1/projects/:id/archive · unarchive admin
GET / POST /v1/projects/:id/pair-codes · …/:seat/rotate admin
POST /v1/projects/:id/requirements admin, planner
POST /v1/requirements/:id/claim · progress · submit-review · release foreman, admin
POST /v1/requirements/:id/complete-review admin
POST /v1/requirements/:id/cancel planner, admin

Port 7420. Desktop injects the admin token into the WebView; you do not paste it for the normal path.


Data home

Inside {home}:

File What
req-engine.sqlite Projects, requirements, event log, token hashes, pair hashes, seat_presence
tokens.txt Bootstrap plaintext admin/planner/foreman (local only)
pair-codes.json Per-project disc_ / build_ plaintext

Treat those two plaintext files as secrets. Root .gitignore already excludes data/, data-*/, *.sqlite, tokens.txt, and pair-codes.json.


Layout

Path Role
req-engine/ Crate: init / serve / mcp / desktop
req-engine/web/index.html Runtime board (API-backed)
req-engine/src/domain/state.rs Verb machine
req-engine/src/mcp/ Planner / foreman stdio (rmcp)
req-engine/src/services/presence.rs Occupancy TTL
demo/ HTML mocks — not shipped as the UI
WEB.md Browser-connect notes (optional)

Crate-level developer notes: req-engine/README.md.


What this is not

  • Not an agent runtime, worker pool, or IDLE scheduler
  • Not a cloud multi-tenant SaaS
  • Not a model wrapper — Zero LLM inside the engine is the contract
  • Not a free-form Kanban you can PATCH into consistency

MIT. github.com/Player-YN/req-engine.

from github.com/Player-YN/req-engine

Installing Req Engine

This server has no published package — it is built from source. Open the repository and follow its README.

▸ github.com/Player-YN/req-engine

FAQ

Is Req Engine MCP free?

Yes, Req Engine MCP is free — one-click install via Unyly at no cost.

Does Req Engine need an API key?

No, Req Engine runs without API keys or environment variables.

Is Req Engine hosted or self-hosted?

Self-hosted: the server runs locally on your machine via the install command above.

How do I install Req Engine in Claude Desktop, Claude Code or Cursor?

Open Req Engine on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.

Related MCPs

Compare Req Engine with

Not sure what to pick?

Find your stack in 60 seconds

Author?

Embed badge for your README

Browse similar

All data MCPs