Skip to content

Releases

v0.6.5 — No lost writes on Windows

Choose a tag to compare

@chadixearth chadixearth released this 02 Nov 02:14

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
    EPERM until 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 real state.json was moved to state.json.corrupt-* and the
    next init, or the MCP server's auto-init, started a fresh state with no
    memories. A failed stat read 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.json and secrets.json retry 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/checkout and actions/setup-node v5 (Node 24 runtime), so
    the Node 20 deprecation warning is gone from every job.
  • npm version now stamps the version into CITATION.cff, both llms.txt
    files, the bug report template and the landing page (softwareVersion and
    footer), and CI's build-integrations --check fails 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

Choose a tag to compare

@chadixearth chadixearth released this 29 Oct 06:49

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

Choose a tag to compare

@chadixearth chadixearth released this 29 Oct 06:37

Fixed

  • update installed 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 --harness it 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

Choose a tag to compare

@chadixearth chadixearth released this 29 Oct 06:20

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_feature over-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 a package.json exists ("build a booking app"); a
    single non-sensitive layer without deploy returns shape: "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_feature includeDeploy and env_sync force were dropped when the
    MCP server ran tools through a pinned CLI (GRAPHYLOOP_CLI): the flag map was
    an array, so --deploy and --force were never passed.
  • task_record counted any status other than completed as a failure, so an
    agent writing "done" left the task pending forever and blocked the waves
    after it. It now accepts only completed or failed, and stores the
    error text of a failed task.
  • memory_store rejects unknown memory types (search already did), and the CLI
    no longer stores metadata: "" when --metadata is omitted.
  • The MCP server and the OpenCode plugin recover when state.json is shut down
    or cleaned from outside mid-session, instead of answering every later call
    with not initialized. The plugin also honours GRAPHYLOOP_HOME.
  • OpenCode tools failed at random with spawn failed: … ETIMEDOUT on
    Windows, 2 of 10 calls in a live squad run. OpenCode 1.18 ships Bun 1.3.14,
    where spawnSync's timeout fires 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 async spawn and 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 reads AGENTS.md only as project
    instructions; user-scope instructions come from ~/.claude/CLAUDE.md and
    ~/.claude/rules/*.md. The workflow now installs as
    ~/.claude/rules/graphyloop-workflow.md, which loads in every project and
    leaves your own CLAUDE.md alone. An untouched old ~/.claude/AGENTS.md is
    removed on upgrade; one you edited is kept.
  • Cursor never loaded ~/.cursor/rules/AGENTS.md. Cursor ignores plain
    .md files in rules/ and keeps User Rules in Customize → Rules, so
    graphyloop no longer writes that file (an untouched old copy is removed). The
    workflow loads from the graphyloop-workflow skill in ~/.agents/skills, and
    a project's own AGENTS.md is read from its root.
  • DeepSeek Harness ignored the graphyloop-squad skill: 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-chadi among 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/skills and ~/.agents/skills, and Gemini reads both. Skills now
    live once in ~/.agents/skills whatever order you install in.
  • Uninstall left graphyloop leftovers: OpenCode's server-guard plugin, an
    empty plugin list, default_agent: agent-chadi pointing at a deleted agent,
    and an orphaned comment in Codex's config.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

Choose a tag to compare

@chadixearth chadixearth released this 29 Oct 05:22

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 to NPM_TOKEN and
    reported only E404 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 (only npm stage publish is
    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

Choose a tag to compare

@chadixearth chadixearth released this 29 Oct 05:14

Install

npx graphyloop                 # all 7 harnesses it detects

Claude 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.
  • plan_feature reports inlineThreshold: 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 dsh graphyloop-squad skill and swarm-memory follow 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 or npx graphyloop --harness claude, not both.
  • MCP Registry. The server is listed as io.github.chadixearth/graphyloop:
    mcpName in package.json plus a root server.json. publish.yml
    publishes it with GitHub OIDC after the npm release and skips a version that
    is already listed.
  • Agent Skills standard. --harness codex and --harness cursor now
    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 version regenerates the plugin and server.json, so their versions
    never drift from package.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). The E404 PUT failure 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

Choose a tag to compare

@chadixearth chadixearth released this 16 Aug 02:45

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-guard and start-server.ps1 now 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 into opencode.json.
  • The workflow rules had recommended the broken pattern, calling Start-Process with 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-guard whitelisted the leak. isSafelyDetached() treated any Start-Process with both redirects as already-safe and let it through un-rewritten. It is now blocked with the measured explanation (-Wait stays allowed — a foreground run is meant to be waited on).
  • -Stop orphaned servers. npm run dev reaches the listener through intermediate cmd.exe shims 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 resolved LISTENER_PID recorded.
  • The installer copies every plugin/<name>/ directory instead of only plugin/graphyloop, and refreshes a legacy <config>/scripts/start-server.ps1 when 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-Process in 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

Choose a tag to compare

@chadixearth chadixearth released this 15 Aug 17:51

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 value
  • secrets_set — stores keys in chmod 600, git-ignored store
  • env_sync — writes to the env file the framework reads, public aliases for public keys only
  • preflight — 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-core exports CORE_LIB_FILES so 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

Choose a tag to compare

@chadixearth chadixearth released this 14 Aug 09:07

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

Choose a tag to compare

@chadixearth chadixearth released this 14 Aug 09:07

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).