AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
무료 오픈소스 데스크톱 앱
Free, open-source desktop app. Visualise your codebase, plan the work, and catch drift the moment an AI coding agent goes off course. Works with Claude Code, Cursor, Codex, aider — any MCP-capable age
개발 도구TypeScript · JavaScriptGitHub @lionroseway온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Desktop app that maps your codebase, plans the work, watches AI coding agents execute, and proves what actually landed. MCP-native, local-first, Apache 2.0.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Plan, watch, and keep AI coding agents on track — and yourself too, even when no agent is involved.
This is the source repo. It is Apache 2.0 and open — read it, fork it,
send a patch. Built installers and per-version release notes live on
codetrellis-releases,
which is where you should point someone who just wants the app.
That split is deliberate and stays that way: downloads do not depend on this
repo being reachable, so access here can change without taking the app's
distribution down with it. Please don't consolidate the two.README 전문 보기 ↗This is the source repo. It is Apache 2.0 and open — read it, fork it,
send a patch. Built installers and per-version release notes live on
codetrellis-releases,
which is where you should point someone who just wants the app.
That split is deliberate and stays that way: downloads do not depend on this repo being reachable, so access here can change without taking the app's distribution down with it. Please don't consolidate the two.
CodeTrellis is a desktop app for planning work, running AI coding agents against those plans, and catching drift early. It works with or without an agent — the planning and architecture surfaces are just as useful when you are the one writing the code.
The ethos is built on git: every diff, every drift signal, every "is this commit doing what the plan said it would" check goes through version control. Plans scale from a one-line "do this thing" to multi-phase migrations with spec docs, ADRs, UX journeys and success metrics.
When an agent is in the loop it connects over the local MCP server
(127.0.0.1:19432) — Claude Code, Codex, Cursor, aider, Claude Desktop,
anything MCP-capable. It reads plans, asks architecture questions, and
reports its tool calls back into the timeline. The AI compute lives in
your agent, not in CodeTrellis: no data leaves your machine, no second
subscription, no TOS problem.
Installers for macOS, Windows and Linux — plus the mobile companion — are published on the releases repo, which carries the current download table and first-launch notes for each platform. macOS builds are signed and notarized (Developer ID: AILAR Limited) as of v0.1.10.
To build from this source instead, see Develop below.
fetch() into a Python FastAPI
route renders as one dashed edgeThe graph is a rendering of the data, not the data — every signal it draws is attached to files and lines first. So there is a mode where the graph never mounts: your files, a CodeMirror 6 diff editor, and plan targets drawn onto the code. Click a changed line and it names the item that wanted it. On a large repository it is the same information for a fraction of the layout cost.
<project>/.codetrellis/templates/, and ~/.codetrellis/templates/Compare any two points in a project's history — a tag, a commit, the baseline scan, the working tree — and check the diff against the plan that claimed it. Every item gets a verdict (landed / partly landed / untouched), files that no item claimed are surfaced as the headline finding rather than a footnote, and the whole thing drafts the pull request description.
127.0.0.1:19432 — ~175 tools across 21 domains:
architecture, graph, plans, items, spec docs, review, drift, budgets,
intake, channels, terminals, governance, presence, peers, mobileAn Expo app that pairs with the desktop by QR over a peer-to-peer WebRTC
mesh — no central server, bring your own VPN for remote use. Watch agents,
browse plans, drive terminals and explore the graph from your phone.
Source lives in mobile/.
Seventeen topics on a rail across six groups, openable straight to the page you need. Every topic carries prompts you can paste into a connected agent.
git clone https://github.com/lionroseway/codetrellis.git
cd codetrellis
npm install
npm run dev
That starts the backend (Express on 127.0.0.1:3001 plus the MCP server on
127.0.0.1:19432) and the frontend (Vite on 127.0.0.1:5173). Open
http://localhost:5173, hit Open Project
(Cmd+O) and point it at any codebase.
npm run lint # ESLint — severity policy lives in the flat config
npm run typecheck # tsc --noEmit
npm run test:unit # unit suite — pure logic, ~2s
npm run test:harness # API-level E2E against a real backend, ~5 min
npm test # browser E2E (Playwright, drives the actual UI)
Run test:unit as well as the harness rather than instead of it. Two of
its tests are structural guards the harness cannot express: one fails when
a component has no exported name referenced anywhere, i.e. nothing renders
it, and one asserts that no request handler reads a project root straight
off the request. Both exist because what they check is invisible to a grep
and to a green suite.
The browser suite needs a backend running and authenticates with the per-launch capability token like any other client; the Playwright config attaches it. It is not in CI, which is how it managed to sit broken for a whole phase.
npm run demo # drives a running app through a real piece of work
npm run demo -- --list # what the catalogue contains
npm run demo -- --pace=slow
npm run demo opens a codebase, plans a change from a ticket, does the
work, traces it back to the item that wanted it, reviews what landed and
drafts the PR — narrating each scene inside the app window. It is a
verification aid rather than a test: a suite proves the code is consistent
with itself, this proves the product does what it says. Catalogue:
docs/DEMO-JOURNEYS.md.
npm run package:mac # macOS arm64 DMG
npm run package:mac-x64 # macOS Intel DMG
npm run package:mac-universal # both arches
npm run package:mac:signed # signed + notarized (needs a Developer ID)
npm run package:win # Windows NSIS installer + portable EXE
npm run package:linux # Linux AppImage / deb / rpm
Built with electron-builder + electron-vite. Windows EXEs build cleanly
from macOS, no Wine needed. npm run package:mac does not sign — use
package:mac:signed for anything you intend to ship.
npm run release # build every platform, publish to the releases repo
npm run release:dry-run # build only, skip upload
scripts/release.sh needs a clean tree and gh auth status logged in. It
builds and signs macOS locally — node-pty is a native module, so
Windows and Linux cannot cross-compile and are built on native CI runners
instead. Those runners upload to a transient staging release on this repo,
which the script downloads, publishes to
lionroseway/codetrellis-releases, and then deletes. Every artefact is
listed in a SHA256SUMS signed with a key that lives only on the release
machine, so the app can verify a download without trusting the server it
came from.
Two things about this that have each cost a release:
npm run package:mac does not sign. v0.1.13 shipped to the public
repo completely unsigned — spctl reported no usable signature — even
though the certificate and credentials were all in place, because that
target is the unsigned one. Only scripts/release.sh calls
package:mac:signed. Use package:mac for local testing and nothing else.
The mobile half is not automated, and it is easy to lose. Neither CI nor the release script builds the companion; CI runs a mobile typecheck and says so in its own comment rather than letting green imply more than it means. Both mobile artefacts are built on a machine with the toolchains:
cd mobile
npx eas-cli build --local --profile production-apk --platform android \
--output ../out/make/CodeTrellis-Companion-<version>.apk
npx eas-cli build --local --profile production --platform ios \
--output ../out/make/CodeTrellis-Companion-<version>.ipa
npx eas-cli submit --platform ios --path ../out/make/CodeTrellis-Companion-<version>.ipa
--local is preferred over EAS's hosted builders: identical config and
credential handling, no queue, no build quota. Build the APK before
running the release script and it rides the same signed manifest as
everything else. v0.1.12 and v0.1.13 shipped an APK; v0.1.14 was the first
release cut by the script, which knew nothing about the artefact, so it
silently stopped being published and nothing said a word. The script now
picks it up when present and warns loudly when it is not — but it still
cannot build one for you.
Android has no submit profile yet; the AAB goes to Play Console by hand. iOS submit is configured and goes to TestFlight.
The notes the script publishes are a download page, not release notes.
They carry the file list and the first-launch tips and no "what's new" at
all — v0.1.14 shipped the whole of the security hardening work under the
words "installer downloads", and nobody reading it could tell. Writing the
real ones is a deliberate second step; the shape and the rules are in
.claude/skills/codetrellis-release-notes,
and the script prints the reminder and the command when it finishes.
src/
backend/
services/
ast-parser.ts # tree-sitter WASM parsing
parsers/<lang>.ts # per-language symbol + import extraction
callsites/<lang>.ts # HTTP / SQL / subprocess / env extractors
resolvers/<lang>.ts # import specifier → real file
sql/ # SQL schema, refs, embedded-query tracking
database.ts # SQLite via better-sqlite3
project-scanner.ts # .gitignore-aware walk
file-watcher.ts # chokidar live re-parse
diff-engine.ts # snapshot-based architecture diffing
cross-system-service.ts
plan-*-service.ts # plans, phases, spec docs, changes, templates
snapshot-compare-service.ts # comparands + diff between two points
plan-review-service.ts # the diff judged against the plan that claimed it
pr-draft-service.ts # the PR description that falls out of it
capability-token.ts # per-launch local auth
confined-fs.ts # project-root confinement
mcp/tools/ # the MCP surface, grouped by domain
server.ts # Express + WebSocket on 127.0.0.1:3001
frontend/
components/ # graph, code, plan, inspector, guide, settings
stores/ # zustand
bridge/ # HTTP in web mode, IPC in Electron
electron/ # main + preload
shared/ # types + build info
mobile/ # Expo companion app
docs/ # architecture, design and phase docs
.gitignore, detect monorepo workspaces./foo, @shared/types, from app.routes import x resolve to real filesDeeper docs live in docs/claude/ — runtime topology, the
peer network, the mobile companion, and the MCP tool categories.
@xyflow/react) 12, Tailwind CSS 4,
Zustand 5, CodeMirror 6, Lucide@modelcontextprotocol/sdk over SSEIssues and pull requests are welcome. Before opening a PR:
main — no direct pushesnpm run lint and npm run typecheck passCLAUDE.md carries the conventions this codebase is written
to, including the security rules that are not optional. Read that first if
you are touching transports, MCP tools, or anything that takes a path.
CodeTrellis runs on developer workstations with network reach into the systems it maps, so the posture is written to match: every local transport authenticates with a per-launch capability token, loopback is not treated as an authorisation boundary, CORS is an exact allowlist, and path-taking surfaces are confined to opened project roots.
Please report vulnerabilities privately to [email protected] rather than in a public issue.
Apache License 2.0 — see LICENSE.