Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Flag when a tracked commitment vanishes verbatim between two versions. A signal, not a judge.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"aperture": {
"command": "uvx",
"args": [
"aperture-mcp"
]
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add aperture -- uvx aperture-mcpวางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"aperture": {
"command": "uvx",
"args": [
"aperture-mcp"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"aperture": {
"type": "stdio",
"command": "uvx",
"args": [
"aperture-mcp"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 7 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub jaysinailabs ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.2.0) เข้า registry 4 เดือนที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Python (uv) ในเครื่องด้วย
ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, sync. labs
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Lipsync videos, dub them into other languages, make talking videos and open sync. Studio.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
Did an agent quietly drop a commitment from your spec — and no one noticed?
English · 简体中文
AI agents now rewrite the documents that govern your work — specs, plans, ADRs, charters, AGENTS.md files. Somewhere in the edit, a constraint you set earlier can quietly disappear.
**Aperture is a *commitment tripwire*. You name the commitments you care about; it flags — word for word** — when one of them vanishes between two versions of a decision document.
Catching *"a commitment silently vanished"* is a tripwire job: it should fire on an event, deterministically, without asking permission. So Aperture ships that check on the surface that fits it best first — a git pre-commit hook / CI check that runs with no LLM, offline — and also as a CLI and an MCP server for agents to call mid-task. MCP is one adapter, not the whole product.
A signal, not a judge. It trips; *you* investigate.
Opt-in · runs locally · never trains on your data.
Aperture compares two text states of the same decision — an earlier version and a later one — and surfaces a narrow, specific kind of decision drift: when a tracked commitment’s exact text disappeared. One engine, several surfaces:
What the engine does and doesn’t do:
degraded rather than false-flag); and it can still false-flag a commitment that was merely *reformatted* (the words moved, the meaning didn’t). It does not rank options, score quality, or tell you a change was *wrong*. That judgment stays with you. Moving to the deterministic git-hook makes the check *fire reliably* — it does not widen what it can see. Same narrow, verbatim signal.If you want one sentence: Aperture is `grep` for vanished commitments, wired to fire on commit — and honest enough to admit what it can’t see.
pip install aperture-mcp # installs the `aperture` CLI + the MCP server (wire the CLI as a git hook — see below)
The PyPI package is named `aperture-mcp` because the bare name
aperturewas already taken on
PyPI. The
-mcpsuffix is a historical package-name artifact — the product is Aperture, and
MCP is only one of its surfaces. One
pip installgives you all three below.
Create a .aperture.toml — a watchlist of the commitments that must not silently vanish, per file:
fail_on_drop = true
[[watch]] path = "CHARTER.md" commitments = ["never train on your data", "data stays on the device"]
aperture check compares two git states and flags any watched commitment that disappeared verbatim:
aperture check # HEAD vs working tree (default)
aperture check --staged # HEAD vs the staged index — for a pre-commit hook aperture check --ref-a origin/main --ref-b HEAD # any two refs — for CI on a PR
Exit code 1 blocks the commit when a watched commitment dropped (the default); --warn-only prints the finding but never blocks. It’s stdlib-only, makes no network calls, and runs no model.
Wire it as a pre-commit hook — either through the pre-commit framework (uses this repo’s .pre-commit-hooks.yaml):
# .pre-commit-config.yaml
repos:
…or as a standalone .git/hooks/pre-commit:
#!/bin/sh
exec aperture check --staged
…or run it in CI as a GitHub Action on every PR (needs fetch-depth: 0 so both sides are available — see examples/github-action/aperture-check.yml):
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
Kick the tires first with the bundled fixture (clone the repo): it trips on a dropped commitment
against checked-in before/after docs, no setup, fully offline —
python3 examples/git_decision_drift/git_decision_drift.py.
The same check, callable by an agent while it edits. (An MCP tool only fires if the agent *chooses* to call it — a weaker delivery for a tripwire than the git-hook, but handy mid-task.)
{
"mcpServers": { "aperture-mcp": { "command": "aperture-mcp" } } }
Prefer zero-install? Point the client at
uvxinstead:
{ "command": "uvx", "args": ["aperture-mcp"] }.
from aperture import compare, Anchor, AnchorKind
result = compare( state_a="We commit to: ci-gates-green before release; data-never-leaves-device.", state_b="We commit to: data-never-leaves-device.", anchors=[Anchor(kind=AnchorKind.COMMITMENT, id="ci-gates-green")], ) print(result.status) # DROPPED_SILENTLY print(result.anchor_violations) # the commitment that vanished
On a long task, your agent keeps rewriting the doc it works from — a plan, a spec — across sessions and edits. And every so often, a line that mattered just… vanishes.
*“Always ask before you delete anything.”* Gone. *“User data never leaves the device.”* Gone. *“The free tier stays free.”* Gone.
Nobody meant to drop them; nobody reads all 400 lines of the diff.
Aperture watches the exact lines you name. Put it on the commit — a hook that fires before the drop lands — and it won’t try to understand the doc or judge it; it just tells you which promise was there, word for word, and now isn’t. A tripwire, not a judge — and honest about the rest: soften a line, reword it, or change a number instead of deleting it, and it’ll slip past. Better you hear that now.
Aperture is a heuristic. We measured it on our own gold corpus and we publish the numbers instead of a single flattering score, because *knowing where it’s blind is the product* — recall 0.400, precision 0.667 on a 100-case corpus, labeled by an isolated LLM-judge panel (it catches 26 of 65 real drifts; ~1 flag in 3 is noise), full breakdown in docs/measured-limits.md:
| Kind of change | Does Aperture flag it? |
|---|---|
| A watched commitment deleted verbatim | ✅ Reliably — this is the one thing it’s good at (24 of 24 in the corpus) |
| A commitment reworded / softened (“must” → “should”) | ❌ Missed — the text still “matches” |
| A commitment paraphrased / restructured | ❌ Missed |
| A number / scope / negation quietly changed | ❌ Missed |
| A commitment translated to another language | ⚠️ Declines (abstains) for a *natural-language* anchor — it can’t compare verbatim across scripts, so it returns degraded rather than false-flag (a commitment dropped and translated is missed) |
The deterministic surface doesn’t widen the aperture. The git-hook fires reliably — but it still
only catches verbatim deletion. Every ❌ / ⚠️ row above is exactly as blind through the hook as
through MCP. What you gain is *when* it checks (on the commit, without anyone remembering to ask),
not *what* it can see.
Anchor style matters for that last row: the abstain applies to a natural-language anchor. A
code-identifier anchor (the
ci-gates-greenstyle the quickstart teaches) is treated as
*translation-stable* — Aperture keeps checking it across languages, so if that exact token disappears
it still flags
DROPPED_SILENTLY(usually what you want for a stable identifier).
Takeaway: treat every flag as *“look here,”* never as *“this is wrong”* — and never assume silence means nothing drifted. Aperture catches the verbatim disappearance case well and is honest that it catches little else. That narrow, reliable signal is useful precisely *because* it doesn’t pretend to be more.
Hit one of those misses on your own docs? That's the single most useful thing you can send us —
report it in ~30s (your wording is optional). Real misses guide what
we fix next.
Why not just
git diff/grep? You can reproduce the core check by hand. What Aperture adds is
that it’s wired to fire on the commit / PR event (as a hook or CI check) *and* callable
mid-task by an agent (over MCP); it returns a structured, directional result
(
ok/degraded/DROPPED_SILENTLY/ …); and it reports its own blind spots in the result
so a human can audit the gaps. It’s ergonomics + honesty around a simple, legible check — not a
smarter detector.
Long-running and multi-agent workflows drift. A constraint set in turn 3 / session 1 / by agent A gets quietly edited away forty turns later, in another session, by agent B — and nobody notices until it ships. Aperture is a preflight you can put on the documents agents maintain: name the commitments that must not silently vanish, and get a tripwire when one does — ideally on the commit itself, before the drop ever lands.
It is deliberately small and legible. It is not an AI that decides for you; it is a signal that helps *you* stay consistent with yourself.
Teams and builders who (a) let AI agents edit repo-resident decision documents — specs, plans, ADRs, charters, and AGENTS.md files — and (b) keep those documents under version control. If your agents touch text that encodes promises, Aperture gives you a cheap, honest tripwire — on the commit, in CI, or mid-task — on the ones you can’t afford to lose silently.
The repository ships a small hand-authored fixture ADR (a before/after pair under examples/git_decision_drift/fixtures/), where Aperture corre
ตัดมาแค่ช่วงต้น อ่านต่อใน repo