Codync
免費、開源的 1:1 替代方案,取代 Grok Bot 與 Muse。從 iPhone、Mac 或 Linux 桌面將 Claude Code、Codex、Cursor 與 40+ 程式碼代理人作為持續機器人傳訊。群組聊天、主題串…
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證AIES project
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗AIES is a personal AI engineering environment built on top of Pi.
pi binary.PI_CODING_AGENT_DIR, so it never reads or writes your normal Pi settings,
credentials, extensions, skills, prompts, themes, models, packages or sessions.The command is aies; underneath it is pi.
Phase status: isolated bootstrap (AIES-001), session metrics baseline (AIES-002), isolated child delegation (AIES-003 explore, AIES-004 worker and routing, AIES-005 independent verify), permission boundaries and OS sandbox (AIES-006), context governor (AIES-007), Linear ticket workflow (AIES-008), bounded task autonomy (AIES-009), and the Gentle-inspired presentation layer (AIES-010, see docs/UX.md). See Scope.
pi on PATH, any version providing PI_CODING_AGENT_DIR, verified against 0.85.1 and 0.87.0The optional right rail is a bounded enhancement, not a supported Pi surface. It mounts only on a fullscreen host whose layout tree AIES recognizes; otherwise the below-editor dock and narrow footer take over, with no workflow change.
npm install # dev dependency: pi's public API, used by tests
./bin/aies # start an isolated AIES session
./bin/aies --aies-info # show the resolved profile paths
npm run check:isolation # prove the isolation (no credentials needed)
To get the command on your PATH:
npm link # creates a global `aies` -> ./bin/aies
npm unlink -g aies # undo
Until then, use ./bin/aies.
The first AIES session has no model credentials on purpose (that is the
isolation working). Log in once inside the isolated profile with /login; the
credential is written to the AIES profile only.
Linear is read through the official Linear MCP server instead; that needs a one-time
/mcp-auth linear in an interactive session, described under "Linear over MCP".
~/.local/share/aies/agent <- PI_CODING_AGENT_DIR for every aies run
├── settings.json <- seeded from profile/settings.json once, then owned by pi
├── mcp.json <- MCP servers AIES loads; seeded from profile/mcp.json, then reconciled
├── auth.json <- written by /login inside AIES only
├── models.json, models-store.json
├── sessions/ <- AIES sessions only
├── npm/, git/ <- packages installed with `aies install`
├── trust.json
└── extensions -> <repo>/extensions (symlink, created by bootstrap)
Override the location with AIES_HOME=/somewhere/aies ./bin/aies. Tests always
do this, so they never touch the real profile.
Delete the whole profile with rm -rf ~/.local/share/aies; your repository and
your normal Pi installation are untouched.
Isolated by PI_CODING_AGENT_DIR (verified by the test suite):
settings, credentials, models and model cache, sessions, trust decisions, extensions, prompts, themes, tool binaries, and installed packages.
Not isolated, by design of Pi itself:
| Thing | Effect | How AIES handles it |
|---|---|---|
~/.agents/skills/ (cross-harness skills) | would load every global skill | aies always passes --no-skills; add AIES skills explicitly with --skill |
.pi/ in the current directory | project-local settings and resources | left to Pi's project trust prompt; pi --no-approve opts out per run |
AGENTS.md / CLAUDE.md | project context files | intentional: they describe the project you work in |
~/.config/mcp/mcp.json, ~/.agents/mcp.json (host-global MCP servers) | would add servers to every AIES session | aies exports PI_MCP_CONFIG_MODE=exclusive, so only the profile's own mcp.json is read |
.mcp.json / .pi/mcp.json in the current directory | would add project-local MCP servers | same: exclusive mode ignores them |
| MCP OAuth credentials (OS credential store) | live outside the profile, by design of the adapter | keyed by server name and bound to the MCP URL; never copied into the repository or into mcp.json |
aies is a launcher, not a CLI. Everything that is not an --aies-* flag is
passed to pi verbatim:
aies # interactive session
aies -p "explain this file" # non-interactive
aies --mode rpc # headless JSON-RPC
aies install npm:some-pkg # installs into the AIES profile
aies list # lists packages of the AIES profile
aies update --self # updates the official pi binary
aies --aies-info # AIES-only: print resolved paths and exit
Only these arguments are interpreted by AIES:
| Argument | Meaning |
|---|---|
--aies-info | print the resolved profile paths and exit |
--aies-* | reserved for AIES; unknown ones exit with code 2 |
Run aies from inside the git repository you are working on. The tracker comes
from the profile: tracker in aies.json, Linear when the key is absent. Plane is
selected with tracker: "plane" (D40). At startup, with a UI, AIES shows one line:
the tracker in use, and whether this repository is bound to a project.
A repository is bound explicitly, and the binding lives only in the profile:
npm run bind -- --list # tracker and bound repositories (paths only)
npm run bind -- AIES . --tracker plane # bind this repo to Plane project AIES, select Plane
npm run bind -- AIES /path/to/repo # or name the repository explicitly
npm run bind -- --unbind AIES # remove a binding
aies --aies-info # AIES_PROJECT_ROOT (git toplevel or none) and tracker
Rules of scripts/bind-project.mjs:
--force replaces the old binding.--tracker plane sets the key only when the profile has no tracker or already uses
Plane. Switching from an explicit linear needs --force.aies.json to aies.json.bak-<timestamp> in the profile.aies once before binding. Add --aies-home <dir> for
another profile.Unbound repositories still work: the guard compares the ticket's project name with the repository name (D30). When the names differ, the guard blocks the ticket's mutating actions until the repository is bound explicitly. A directory outside git starts with a warning that ticket work needs a git repository.
AIES has no Linear client of its own. Linear is reached through the official Linear MCP server, which the adapter loads in the AIES profile:
aies -> /mcp-auth linear -> OAuth -> mcp proxy tool -> https://mcp.linear.app/mcp
One-time setup, in an interactive session:
aies
/mcp # "linear" must be listed and configured
/mcp-auth linear # completes the OAuth flow in your browser
Then, in the same or a later session:
/aies-ticket EZE-422 # loads the ticket and shows its compact contract
/aies-run EZE-422 # loads it, starts the work and enables bounded autonomy
/mcp and /mcp-auth come from pi-mcp-adapter; AIES does not wrap them. AIES
does not read LINEAR_API_KEY, so no environment variable is needed. If you prefer
a bearer token over OAuth, edit the server in $AIES_HOME/agent/mcp.json
(auth: "bearer", bearerTokenEnv: "LINEAR_API_KEY"); that is a deliberate opt-out
of the OAuth path.
The Linear server exposes 66 tools. AIES keeps them behind the adapter's proxy
tools for that server (mcp, plus one mcp__linear namespace proxy once the
server's catalog is cached), so a session pays for two small definitions instead of
the catalog. lifecycle: "lazy" means no connection is made at startup, and
credentials are stored by the adapter in the OS credential store, never in this
repository.
extensions/aies-provider-commandcode/ registers the commandcode provider, so the
whole Command Code catalog is selectable from /model, /aies-models and
aies --list-models:
aies
/login commandcode # the ordinary path: the key lives in the AIES profile
/login commandcode is the ordinary, persistent path. Pi prompts for the key as
a secret, never echoes it, and writes it into $AIES_HOME/agent/auth.json as an
api_key entry with mode 0600, so it survives restarts with no shell setup.
COMMANDCODE_API_KEY remains supported for CI, headless runs and testing, where a
fresh profile has no auth.json; a stored credential always wins over it. AIES
never reads or forwards the key itself: the extension declares
apiKey: "$COMMANDCODE_API_KEY" and Pi resolves it per request.
The catalog loads either way. With no credential at all Pi still registers the
provider but reports zero available commandcode models — the models are simply
not selectable, which is expected and is now surfaced by /aies-models as a
no conectado provider instead of being invisible.
| Item | Value |
|---|---|
| Provider id | commandcode (models are commandcode/<id>) |
| Base URL | https://api.commandcode.ai/provider/v1 |
| Models | 76 registered: 68 on openai-completions, 8 Claude rows on anthropic-messages |
| Diagnostic | /aies-commandcode — catalog size per transport, base URL, the registry auth source and disponibles n/76 |
Pi can fetch a provider catalog at load time; AIES does not, because startup must
be deterministic and zero-network (scripts/check-isolation.sh proves it). The list
lives in the repository as extensions/aies-provider-commandcode/models.json:
# maintenance only — requires network, never run by tests, hooks or the launcher
node scripts/refresh-commandcode-models.mjs
node scripts/refresh-commandcode-models.mjs --models-json saved.json --docs-html saved.html # offline rerun
What the generator encodes, and what it cannot know:
GET /provider/v1/models, including the vendor
prefix (deepseek/deepseek-v4-flash) that open-weight families use and the bare
form the first-party families use. The one id the endpoint spells with a snapshot
date (claude-haiku-4-5-20251001) keeps the endpoint form, not the docs form.api is anthropic-messages only for models served on /messages, and
openai-completions for the rest. 60 of them also advertise /responses, which
AIES does not use.cost is the base list price per 1M tokens published on the GOAT plan page.
Time-limited deals are ignored on purpose: the catalog stores the list rate
(e.g. MiniMax M3 at 0.60/2.40, not the discounted 0.30/1.20). The two free
models publish no list rate, so they stay at 0 and cost tracking under-reports
them. Long-context price steps are collapsed into the standard tier.maxTokens is an assumption, not a vendor limit: neither the endpoint nor the
docs publish a maximum output length, so the generator writes
clamp(floor(contextWindow / 4), 8192, 64000). The assumption is backed by a
measured override map in the generator, because the clamp proved wrong for at
least one model: poolside/laguna-s-2.1-free advertises a 64000 clamp but the
API caps output at 32768, so the catalog stores the measured value. Without an
override the failure mode is a provider HTTP 400 that names the cap
(max_tokens (64000): Input should be less than or equal to 32768).input: ["text", "image"] only where the docs mark the model as vision.gpt-6-astra appears on the plan page but is not served by the provider API, so
it is not registered; a refresh prints those differences instead of guessing.| Path | Role |
|---|---|
bin/aies | the launcher: resolves the profile, bootstraps it, execs pi |
scripts/bootstrap-profile.sh | idempotent profile setup (symlinks, settings seed) |
scripts/bind-project.mjs | explicit repository <-> tracker project binding in the profile (npm run bind) |
profile/settings.json | seed for the profile's settings.json, copied once |
profile/aies.json | seed configuration for AIES agents, copied once |
agents/explore.md | role prompt for the isolated explore child agent |
agents/worker.md | role prompt for the isolated worker child agent |
agents/verify.md | role prompt for the isolated read-only verify child agent |
extensions/ | AIES extensions, linked into the isolated profile |
extensions/aies-identity.ts | profile visibility: startup notice and /aies-info |
extensions/aies-runtime/ | session metrics: footer line, /aies-status, no behavior changes |
extensions/aies-agents/ | agent delegation: the aies_delegate tool, the three child runners, routing and the verification record |
extensions/aies-provider-commandcode/ | the commandcode provider and its committed static model catalog |
extensions/aies-providers/ | provider credential health: a turn_end observer that records a rejected credential, no command |
scripts/refresh-commandcode-models.mjs | regenerates that catalog; manual, the only Command Code script that needs network |
tests/isolation.test.mjs | deterministic isolation checks (no credentials) |
tests/observability.test.mjs | metric rules and rendering, driven through a fake ExtensionAPI |
tests/observability-runtime.test.mjs |
Versioned state is only what lives in this repository. Everything under
AIES_HOME is generated runtime state and is never committed.
npm run check:isolation
Then, by hand:
aies # one footer line: AIES · ctx 34k/peak 41k · tools 8 · files 4 · 02:14
aies # while verifying: AIES · VERIFY · ctx 44k · V:? · 02:11
aies # after a verdict: AIES · ctx 46k · V:PASS · 02:28
/aies-info # prints the extension path, agent dir, project config dir, cwd, mode
/aies-status # the same metrics unfolded: context, tools, exploration, delegations, verification, runtime
pi # your normal Pi must still start exactly as before
The metrics line and /aies-status come from
extensions/aies-runtime/. They measure and never govern: no counter, ratio or
threshold changes what Pi does with a tool call, a delegation or a compaction.
V: is the verification segment: ? in flight, PASS, STALE (a PASS the
artifact outgrew), FAIL, BLOCKED.
aies_delegate has a third role. Worker changes the repository; Verify proves
whether the change actually works, from the repository itself:
aies_delegate({
role: "verify",
task: "Bring the request timeout to 2000ms",
criteria: ["TIMEOUT_MS in config.js is 2000", "npm test passes"],
changedPaths: ["config.js"],
baseRef: "HEAD~1",
})
edit/write, and its bash refuses to mutate
the workspace (mutating git, deletion, movement, in-place editing, installs,
file redirection, command substitution);pass | fail | blocked with per-criterion evidence, checks and
defects, never a transcript, and a PASS without evidence is treated as blocked;context is rejected for this role, so the implementer's summary and
reasoning cannot reach the verifier;V:STALE), a documentation-only
edit does not;Suggested checks run through the guarded shell; a check that cannot run is
blocked, which is not the same as a defect.
Phase 1 shipped: repository structure, profile isolation, the aies command,
minimal configuration, one identity extension, and the isolation checks.
Phase 2 shipped the observability baseline: one footer line and one diagnostic command, measuring context, parent tool activity, exploration, tool output volume, session runtime and tool surface.
Phase 3 shipped the isolated explore delegation primitive. Phase 4 shipped the isolated Worker and the parent routing policy (Inline Direct, Explore, Worker) with soft signals and hard guardrails. Phase 5 closed the verification loop with an independent, isolated Verify role. Phase 6 shipped permission boundaries and OS-level sandboxing with Darwin Seatbelt. Phase 7 established the Context Governor with operational budgets, proactive single-flight compaction, and tool-output hygiene.
Phase 8 established the Linear Ticket Workflow:
Phase 9 establishes Bounded Task Autonomy & Continuation Controller:
ContinuationController) evaluating at agent_settled;/aies-run [ticketId | stop | status]);onComplete before continuation;ask), verification stop, or blockers;enabled = false).Phase 10 (current) establishes the presentation layer (see docs/UX.md):
IDLE, EXPLORE, WORK, VERIFY, REPAIR, WAIT, BLOCKED, DONE) plus independent indicators;AIES · EZE-417 · WORK · ctx 42k · AUTO) that degrades by priority on narrow terminals;/aies-status view with the full telemetry dump moved behind /aies-status detalle;Explicitly out of scope: infinite multi-ticket backlog runners, unmonitored git push/PR, and background auto-polling.
| the observer inside a real Pi process, over RPC |
tests/explore.test.mjs | child exploration isolation, tool surface, handoff & execution |
tests/worker.test.mjs | worker isolation, mutation, command guard, routing handoff |
tests/routing.test.mjs | the deterministic routing policy and its guardrails |
tests/verify.test.mjs | verify read-only policy, independence, verdicts, invalidation, repair budget |
tests/smoke-verify.test.mjs | Parent -> Worker defect -> Verify FAIL -> repair -> Verify PASS |
scripts/check-isolation.sh | one-command entry point for the checks |
docs/ARCHITECTURE.md | how the launcher and the profile actually work |
docs/DECISIONS.md | decisions taken, with their rationale |
odd/tasks/ | task tracking for the current phase |