Repository navigation
Releases
v0.6.5 — No lost writes on Windows
Fixed
- Parallel writes on Windows could drop an update. The state lock is a
directory; on Windows, creating it right after its holder removed it answers
EPERMuntil the last handle on it closes, and the engine treated that as a
fatal error. The writer printed{"error":"EPERM: … state.json.lock"}and its
memory, task or record was lost (2 runs in 40 at 32 parallel writers; it also
failed CI on v0.6.4). OpenCode, which now runs tool calls in parallel, hit
this path. The engine now waits it out like any other contention, checks for
a stale lock 8x less often (the check itself kept the directory open), and
retries a refused unlock instead of leaving a lock that blocked writers for
30 s. 0 lost writes in 60 runs of 32 parallel writers. - A state file that could not be read was replaced by an empty one. Any
read error, such as a file held open by antivirus or OneDrive, counted as
corruption: the realstate.jsonwas moved tostate.json.corrupt-*and the
nextinit, or the MCP server's auto-init, started a fresh state with no
memories. A failedstatread as "no state yet" and did the same. Only an
unparsable file is quarantined now; a read error is reported and nothing is
moved or written. The secrets store had the same flaw and gets the same fix. - Saves to
state.jsonandsecrets.jsonretry the rename Windows refuses
while another program has the file open, for up to 2 s, and never leave a
.tmp-*file behind when a write fails.
Changed
- CI runs
actions/checkoutandactions/setup-nodev5 (Node 24 runtime), so
the Node 20 deprecation warning is gone from every job. npm versionnow stamps the version intoCITATION.cff, bothllms.txt
files, the bug report template and the landing page (softwareVersionand
footer), and CI'sbuild-integrations --checkfails when one of them drifts.
These were bumped by hand on every release.
Install / update: npx graphyloop@latest update
v0.6.4 — Partial uninstall keeps the shared core
Fixed
uninstall --harness <one tool>broke every other tool. It always deleted
the shared core in~/.graphyloop, which OpenCode, Claude Code, Codex,
DeepSeek Harness, Oh My Pi, Gemini CLI and Cursor all run their MCP server or
plugin from. The core is now removed only after the last tool with a
graphyloop entry is uninstalled; until then uninstall says which tools still
use it. Project memory in<project>/.graphyloop/was never affected.
v0.6.3 — update stays in its lane
Fixed
updateinstalled graphyloop into tools you never added it to. It ran a
full install, so every tool merely present on the machine got wired: MCP
entry, agents, skills and commands. Without--harnessit now refreshes only
the tools graphyloop is already in. A stale or broken entry still counts, so
repairs keep working. It lists the tools it leaves alone, and
--harness <name>adds one on purpose. A machine with no graphyloop anywhere
still gets a first install.
v0.6.2 — End-to-end audit fixes
Found by an end-to-end audit: every tool driven over MCP, through the adapter
CLI and through the OpenCode plugin, plus live model runs in OpenCode and Oh My
Pi where agent-chadi planned, dispatched two subagents and shipped a tested
endpoint.
Fixed
plan_featureover-planned small work. "Add a /health endpoint to this
Node app" came back as an 11-task full-stack plan that asked for three
Supabase keys, because the word app implied full stack. Now app implies
full stack only before apackage.jsonexists ("build a booking app"); a
single non-sensitive layer without deploy returnsshape: "no-fanout",
lane: "inline", as Workflow v3 says; and Supabase keys are listed only when
the stack or the goal involves Supabase, a database, auth or migrations.plan_featureincludeDeployandenv_syncforcewere dropped when the
MCP server ran tools through a pinned CLI (GRAPHYLOOP_CLI): the flag map was
an array, so--deployand--forcewere never passed.task_recordcounted any status other thancompletedas a failure, so an
agent writing"done"left the task pending forever and blocked the waves
after it. It now accepts onlycompletedorfailed, and stores the
errortext of a failed task.memory_storerejects unknown memory types (search already did), and the CLI
no longer storesmetadata: ""when--metadatais omitted.- The MCP server and the OpenCode plugin recover when
state.jsonis shut down
or cleaned from outside mid-session, instead of answering every later call
withnot initialized. The plugin also honoursGRAPHYLOOP_HOME. - OpenCode tools failed at random with
spawn failed: … ETIMEDOUTon
Windows, 2 of 10 calls in a live squad run. OpenCode 1.18 ships Bun 1.3.14,
wherespawnSync'stimeoutfires early once the process has been idle
longer than the timeout (oven-sh/bun#33932), so any graphyloop call made more
than 30 s after the previous one died within milliseconds. The plugin now runs
the CLI with asyncspawnand its own timer. That also stops it from
blocking OpenCode while the CLI runs, and lets parallel tool calls run in
parallel; the engine's state lock already serializes their writes. - Claude Code never loaded the workflow rules. Install wrote
~/.claude/AGENTS.md, but Claude Code readsAGENTS.mdonly as project
instructions; user-scope instructions come from~/.claude/CLAUDE.mdand
~/.claude/rules/*.md. The workflow now installs as
~/.claude/rules/graphyloop-workflow.md, which loads in every project and
leaves your ownCLAUDE.mdalone. An untouched old~/.claude/AGENTS.mdis
removed on upgrade; one you edited is kept. - Cursor never loaded
~/.cursor/rules/AGENTS.md. Cursor ignores plain
.mdfiles inrules/and keeps User Rules in Customize → Rules, so
graphyloop no longer writes that file (an untouched old copy is removed). The
workflow loads from thegraphyloop-workflowskill in~/.agents/skills, and
a project's ownAGENTS.mdis read from its root. - DeepSeek Harness ignored the
graphyloop-squadskill: its description
held an unquoted:, which is invalid YAML, so dsh dropped the file. Strict
YAML parsers also rejected 3 bundled skills, 2 agents, and 7 generated Claude
Code agent and command files,agent-chadiamong them. Every description
that needs it is now quoted, and a test keeps it that way. - Gemini CLI printed 70 "Skill conflict detected" warnings on every start
when Codex or Cursor was installed too, because the bundled skills sat in both
~/.gemini/skillsand~/.agents/skills, and Gemini reads both. Skills now
live once in~/.agents/skillswhatever order you install in. - Uninstall left graphyloop leftovers: OpenCode's
server-guardplugin, an
emptypluginlist,default_agent: agent-chadipointing at a deleted agent,
and an orphaned comment in Codex'sconfig.toml.
Docs
- Gemini CLI: since June 18, 2026 Google no longer serves personal Google
sign-ins in Gemini CLI. It still works with a Gemini API key, Vertex AI, or a
Code Assist Standard/Enterprise license. Google's successor for individuals,
Antigravity CLI, is not a graphyloop harness yet.
v0.6.1 — npm listing + publish pipeline fixes
Fixed
- The npm description now fits npm's 255-character limit. The 0.6.0 text was
381 characters, so npm search cut it off mid-word and dropped "Claude Code
plugin", "MCP Registry" and "zero dependencies". publish.yml: a Trusted publishing preflight step runs the OIDC exchange
and prints why npm rejects it. Before this, npm fell back toNPM_TOKENand
reported onlyE404 PUT. The MCP Registry step now waits until npm serves
the new version: npm processes a fresh release for a few minutes, and
registering before that fails with "version not found".- CONTRIBUTING: the npm trusted-publisher setup needs your 2FA security key,
and Allow npm publish must be ticked (onlynpm stage publishis
allowed by default).
Workflow v3, the Claude Code plugin and the MCP Registry listing shipped in v0.6.0.
Full changelog: v0.6.0...v0.6.1
v0.6.0 — Workflow v3, Claude Code plugin, MCP Registry
Install
npx graphyloop # all 7 harnesses it detectsClaude Code plugin:
/plugin marketplace add chadixearth/graphyloop
/plugin install graphyloop@graphyloop
MCP Registry: io.github.chadixearth/graphyloop (npx -y graphyloop mcp)
0.5.0 was tagged but never reached npm: npm trusted publishing was not set up
for the package, so the tag's publish run failed with E404 PUT. 0.6.0
contains everything from 0.5.0 (CHANGELOG).
Changed
- Workflow v3: 12 rules updated to October 2026 practice. The rules now
start from measured costs (a dispatch costs the driver about 12 minutes of
waiting; an inline edit costs seconds) and from what current field reports
find works:- Goal and proof up front: state the end state, the check that proves
it and the invariant it must not break; never meet a target by weakening
a test. - Inline first: up to 8 known files in any mix of layers (was 3).
Fan out only when the work splits into 2+ independent slices of about
5 minutes each. Use 1-3 lanes, and the driver keeps the largest or most
coupled slice and builds it while the lanes run. The driver writes the
context pack itself when one read pass maps the code. - Isolate what collides: a lane that runs servers, databases or
browsers gets its own worktree, port and database name. - No polling; schedule follow-ups: later checks go to the harness
scheduler (/loop,/schedule) instead of sleep loops. - Proof, not claims: failing-before/passing-after, a real-browser
screenshot, before/after numbers from the same machine, the live URL. The
rules also list what is NOT evidence ("tests pass" alone, a typecheck
alone, "should work", a mocked run). - Review by blast radius: review and security lanes run for migrations,
auth, payments, secrets, tenant boundaries, public APIs and the project's
named central files; everything else is covered by proof. - Keep the rules honest: short always-loaded rules with procedures in
on-demand skills, guidance checked with with/without runs, and anything
that must survive compaction written to files. - Memory entries record the why and the commit or PR it landed in.
- Goal and proof up front: state the end state, the check that proves
plan_featurereportsinlineThreshold: 8, and its notes say the driver
writes wave 0 itself when it can map the code and keeps one wave-1 lane.
The builder, contract and verifier footers are unchanged.agent-chadi,graphyloop-workflow,/chadi-fast,/chadi-go, the Codex
prompts, the dshgraphyloop-squadskill andswarm-memoryfollow Workflow
v3.
Added
- Claude Code plugin. Run
/plugin marketplace add chadixearth/graphyloop,
then/plugin install graphyloop@graphyloop. You get the 15
/graphyloop:chadi-*commands, 26 agents, the 3 core skills and the MCP
server (npx -y graphyloop@0.6.0 mcp). The plugin lives in
integrations/claude-code/and is generated from the canonical sources by
npm run build:integrations(CI runs--check). For Claude Code, use either
the plugin ornpx graphyloop --harness claude, not both. - MCP Registry. The server is listed as
io.github.chadixearth/graphyloop:
mcpNameinpackage.jsonplus a rootserver.json.publish.yml
publishes it with GitHub OIDC after the npm release and skips a version that
is already listed. - Agent Skills standard.
--harness codexand--harness cursornow
install the bundled skills into~/.agents/skills, the cross-tool user
skills directory that Codex and Cursor read (before this, neither harness
received any skills). The ownership rules match the other harnesses.
Uninstall removes untouched copies only after the last harness that uses the
directory is gone. npm versionregenerates the plugin andserver.json, so their versions
never drift frompackage.json.
Fixed
- Releases: the one-time trusted-publishing setup is now one command,
npm trust github graphyloop --file publish.yml --repository chadixearth/graphyloop
(see CONTRIBUTING). TheE404 PUTfailure mode is documented.
Full changelog: v0.5.0...v0.6.0
0.2.1 - Windows dev-server hang fix; server-guard ships with the kit
Fixed: npm run dev no longer hangs a Windows agent session forever
An agent shell tool reads a command's stdout until EOF, and EOF only arrives once every handle to the pipe's write end is closed — not when the direct child exits. Detaching a dev server with Start-Process -RedirectStandardOutput <out> -RedirectStandardError <err> makes PowerShell call CreateProcess with bInheritHandles=TRUE, which duplicates every inheritable handle of the launching shell into the child. The dev server inherited the tool's stdout pipe and held it open for its entire life.
The symptom: the turn printed PID and SERVER_UP, then never returned. The user had to cancel a task that had already finished.
Measured with a self-exiting fixture server:
| Launcher exits | Caller's stdout EOF | Lag | |
|---|---|---|---|
| Before | 2.3 s | 21.8 s (when the server died) | 19,498 ms |
| After | 2.5 s | 2.5 s | 8 ms |
With a real dev server, "21.8 s" is "never".
The launcher now writes the redirection into a generated per-port .cmd wrapper and starts it with no -Redirect* parameter, so PowerShell goes through ShellExecuteEx, which creates the process with bInheritHandles=FALSE. The server is still answering 200 after the call returns.
Also in this release
server-guardandstart-server.ps1now ship with the kit. The workflow rules told agents to use a launcher the kit never installed — flagged inline as "[OPTIONAL — community scripts; create or skip]".plugin/server-guard/installs to<config>/plugins/server-guard/with the launcher beside it, and the plugin entry is merged intoopencode.json.- The workflow rules had recommended the broken pattern, calling
Start-Processwith both redirects "the ONLY safe detach on Windows … zero pipe inheritance". The redirect parameters do give the child its own std handles, but they do not turn inheritance off. That section now explains the EOF/handle mechanism. server-guardwhitelisted the leak.isSafelyDetached()treated anyStart-Processwith both redirects as already-safe and let it through un-rewritten. It is now blocked with the measured explanation (-Waitstays allowed — a foreground run is meant to be waited on).-Stoporphaned servers.npm run devreaches the listener through intermediatecmd.exeshims that are not children of the launched process, so killing the saved PID left the server alive. Stop now kills process trees (taskkill /T) plus any listener on the port, and pid files are per-port with the resolvedLISTENER_PIDrecorded.- The installer copies every
plugin/<name>/directory instead of onlyplugin/graphyloop, and refreshes a legacy<config>/scripts/start-server.ps1when one exists (backup kept) so older setups stop hanging without a manual edit. It never creates that path — the plugin-local copy is canonical. - 28 new tests (143 total), including a regression that fails if
Start-Processin the launcher ever regains a stdio redirect.
Windows-only by design: the launcher is PowerShell and the handle-inheritance trap is a Win32 behaviour, so the plugin installs no hooks elsewhere.
Full changelog: v0.2.0...v0.2.1
0.2.0 — wave planner, bundled skills, credentials, chadi-integrator
Highlights
GraphyLoop 0.2.0 turns a one-line feature request into a full parallel build plan and ships the skills + credential layer needed to execute it end-to-end on a fresh machine.
Wave Planner (plan_feature)
"I want an inventory system" now decomposes into:
contract → database ∥ backend ∥ frontend ∥ tests → integration → test ∥ typecheck ∥ security ∥ performance ∥ review → gated deploy
Every task carries exclusive file ownership, acceptance checks and dependsOn. task_distribute enforces the plan: dispatchNow vs blocked (with waitingOn), and task_record reports what each result unblocked.
Bundled Skills
Five graphyloop-authored skills install automatically: graphyloop-waves, supabase-setup, vercel-deploy, secrets-hygiene, swarm-memory. A skill you already have is never overwritten. skills_status reports what is present and what the squad expects.
chadi-integrator
The wave-2 join now has a dedicated owner — swaps mocks for real calls, wires credentials, applies migrations, boots the happy path, and carries an explicit contract-drift policy.
Supabase + Vercel Credentials
secrets_status— masked readiness report; never returns a valuesecrets_set— stores keys in chmod 600, git-ignored storeenv_sync— writes to the env file the framework reads, public aliases for public keys onlypreflight— db/deploy blockers + gated command plan, executes nothing
graphyloop update [--check]
Refresh an existing install in place: overwrites graphyloop-owned files (backup first), repairs a core tree missing newer modules, preserves your config keys. doctor now prints the installed core version.
New Commands
/chadi-waves · /chadi-db · /chadi-deploy
Changed
- Test suites split per area with a filterable runner — 115 tests
install-coreexportsCORE_LIB_FILESso new modules cannot be left out of an installed tree
Fixed
- A failing MCP tool-count assertion in the installer suite hung the entire test run instead of reporting failure
- Planner lane detection matches whole words ("review the diff" no longer triggers the frontend lane via "view")
Full changelog: v0.1.4...v0.2.0
0.1.4 — registry parity republish
No functional changes — 0.1.3 was already live on the registry and cannot be overwritten, so the identical tree ships as 0.1.4 to make
pm publish succeed.
0.1.3 — memory_forget, in-process MCP tools, queue cap
Added: memory_forget (correction path for wrong lessons), memory_search type filter, npm metadata, CHANGELOG/CONTRIBUTING, issue+PR templates, pre-push test gate hook.
Changed: MCP tools run in-process (3.8 ms/call vs 73.7 ms spawn path), recency-ranked memory search, protocol version echo.
Fixed: unbounded task queue (capped at 500, pending work never dropped).