Skip to content

[failproofai-506] Release stable 0.0.13#506

Merged
NiveditJain merged 1 commit into
mainfrom
luv-cut-0.0.13
Jul 14, 2026
Merged

[failproofai-506] Release stable 0.0.13#506
NiveditJain merged 1 commit into
mainfrom
luv-cut-0.0.13

Conversation

@NiveditJain

@NiveditJain NiveditJain commented Jul 14, 2026

Copy link
Copy Markdown
Member

Summary

  • promote package version from 0.0.13-beta.3 to stable 0.0.13
  • carry the complete 0.0.12-beta.0 through 0.0.13-beta.3 changelog into the stable release
  • retain the detailed per-beta sections as the full release history

Validation

  • bun run build
  • bun run test:run — 1,948 passed
  • bun run lint — 0 errors (5 existing warnings)
  • bunx tsc --noEmit
  • bun run test:e2e — 292 passed, 6 skipped

Docker smoke testing was unavailable because Docker Desktop integration is not enabled in this WSL environment.

Summary by CodeRabbit

  • Release
    • Promoted version 0.0.13 from beta to stable.
    • Preserved historical release notes from the beta cycle.
    • Updated the package version to 0.0.13.

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 157959ff-0b17-4ff9-bf20-962b90fdc799

📥 Commits

Reviewing files that changed from the base of the PR and between dfc5149 and 04efdaf.

📒 Files selected for processing (2)
  • CHANGELOG.md
  • package.json

📝 Walkthrough

Walkthrough

The release metadata now promotes version 0.0.13 from beta to stable, with a matching changelog entry dated 2026-07-14.

Changes

Stable release promotion

Layer / File(s) Summary
Release metadata update
package.json, CHANGELOG.md
The package version changes to 0.0.13, and the changelog records the stable release and preserved beta history.

Estimated code review effort: 1 (Trivial) | ~2 minutes

Possibly related PRs

Suggested reviewers: chhhee10, github-actions[bot]

Poem

A rabbit hops through version rows,
From beta trails to stable toes.
The changelog blooms, the release is bright,
0.0.13 takes flight!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: promoting the release to stable 0.0.13.
Description check ✅ Passed The description covers the release summary and validation, though it does not follow the template headings exactly.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint install failed. For unrecoverable errors, disable the tool in CodeRabbit configuration.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@hermes-exosphere

Copy link
Copy Markdown
Contributor

🔍 Automated code review started — analyzing [{"additions":5,"deletions":0,"path":"CHANGELOG.md"},{"additions":1,"deletions":1,"path":"package.json"}] files, +6/-1...

⏱️ This may take a few minutes. Results will be posted here when complete.

@hermes-exosphere

Copy link
Copy Markdown
Contributor

Build & verification complete.

Gate Result Evidence
Live CI (exact head 04efdaf) ✅ all green build, docs, quality (lint+tsc+version-consistency), test ×3 matrix, test-e2e, OSV-Scanner, Socket — all pass
bun install --frozen-lockfile (local) ✅ exit 0 558 packages, no "lockfile out of date" — proves the version bump doesn't desync bun.lock
version-consistency (local repro) ✅ pass jq -r .version package.json0.0.13; no packages/*/package.json exist → loop no-ops, MISMATCH=0
Stale-version scan ✅ clean no 0.0.13-beta.3 anywhere outside the intentional CHANGELOG history; no hardcoded version in src/, bin/, __tests__/

Full local build/test suites were not re-run because CI already executed them green on this exact commit in a clean, frozen-lockfile environment (stronger evidence than a local run for a 6-line version-string change). Docker smoke was likewise unnecessary — no runtime code changed.

@hermes-exosphere

Copy link
Copy Markdown
Contributor

🔍 Automated Code Review

📋 Executive Summary

This PR promotes the package from 0.0.13-beta.3 to stable 0.0.13 — a pure release cut. It touches exactly two files: package.json (version string) and CHANGELOG.md (a new dated section that references the preserved per-beta history). No runtime code changes, no breaking changes, and every CI job is green on the exact head commit. Clean and correct.


📊 Change Architecture

graph TD
    A["0.0.13-beta.3 (last beta)"] -->|"version bump"| B["package.json: 0.0.13"]
    A -->|"new dated section"| C["CHANGELOG.md: ## 0.0.13 — 2026-07-14"]
    B --> D{"CI gates"}
    C --> D
    D -->|"quality: version-consistency + lint + tsc"| E["✅ pass"]
    D -->|"bun install --frozen-lockfile"| F["✅ lockfile in sync"]
    D -->|"test ×3 + test-e2e + build + docs"| G["✅ pass"]
    E --> H["Stable 0.0.13 ready to publish"]
    F --> H
    G --> H
    style B fill:#FFD700
    style C fill:#90EE90
    style H fill:#87CEEB
Loading

Legend: 🟢 New (CHANGELOG section) | 🟡 Modified (version bump) | 🔵 Outcome


🔴 Breaking Changes

No breaking changes detected. Only the version string and a changelog entry change. 0.0.13 > 0.0.13-beta.3 in semver, so the stable release correctly supersedes its pre-releases on publish. No API, schema, config, serialization, or dependency changes.


⚠️ Issues Found

None. No correctness, logic, or bug issues. No inline comments filed.

The version-bump risk checklist all clears:

  • 🔵 Lockfilebun.lock's root workspace ("") entry has no version field, so a version-only bump can't invalidate --frozen-lockfile. Verified locally (bun install --frozen-lockfile → exit 0).
  • 🔵 version-consistency CI check — reads root package.json (0.0.13) and compares against packages/*/package.json, which don't exist → trivially passes (matches CLAUDE.md).
  • 🔵 Stale references — no 0.0.13-beta.3 outside the intentional CHANGELOG history; the version strings in __tests__/scripts/install-diagnosis.test.ts (0.0.9, 0.0.10-beta.0, …) are mock fixtures for install-diagnosis logic, not assertions on the current package version.

🔬 Logical / Bug Analysis

  • Version monotonicity:0.0.13 correctly follows 0.0.13-beta.3.
  • CHANGELOG correctness: ✅ New heading ## 0.0.13 — 2026-07-14 sits at the top above ## 0.0.13-beta.3, version matches package.json, date matches today (2026-07-14), and it uses the same U+2014 em-dash as every other entry.
  • Release semantics: ✅ Promoting the last beta to stable with no functional diff is exactly right — the code shipping as 0.0.13 is byte-identical to 0.0.13-beta.3 plus the version string.
  • No resource/async/null concerns — there is no logic in this diff.

🧪 Evidence — Build & Test Results

Live CI status (head commit 04efdaf)
build                       pass   1m7s
docs                        pass   1m18s
quality                     pass   1m11s   (lint + tsc + version-consistency)
test (default)              pass   54s
test (hook-log-file, 1)     pass   1m14s
test (log-debug, debug)     pass   53s
test-e2e                    pass   53s
OSV-Scanner                 pass   21s
Socket Security (x2)        pass
Mintlify Deployment         skipping
CodeRabbit                  pending (non-blocking review)

Per PR body: bun run test:run — 1,948 passed · bun run test:e2e — 292 passed, 6 skipped · lint 0 errors · tsc --noEmit clean.

Local: bun install --frozen-lockfile
558 packages installed [70.07s]
EXIT_CODE=0

No "lockfile out of date" error → the version bump keeps bun.lock in sync.

Local: version-consistency reproduction
package.json version: 0.0.13
packages/* dirs: none — loop body never executes, MISMATCH stays 0, check PASSES

🔗 Issue Linkage

⚠️ No issue linked (closingIssuesReferences unavailable / none). This is a routine release cut, so that's expected — traceability comes from the CHANGELOG referencing the 0.0.12-beta.00.0.13-beta.3 cycle and its PR numbers (#485#491, etc.).


👥 Human Review Feedback

No human review feedback on this PR. No inline comments and no review threads exist; the only pre-existing PR comments are automated (CodeRabbit summary + this bot's "review started" marker). Nothing to resolve.


💡 Suggestions

  • (Trivial, optional) The new CHANGELOG entry uses a ### Release subsection, which isn't one of the four documented in CLAUDE.md (Features / Fixes / Docs / Dependencies). It's a sensible, clear choice for a stable-promotion entry, so this is purely a heads-up — no change required.

🏆 Verdict

APPROVED — No issues found. Version bump is consistent (package.json = CHANGELOG = 0.0.13), the lockfile stays in sync, the version-consistency gate passes, no stale references remain, and all CI jobs are green on the head commit. Ready to merge.


Automated code review · 2026-07-14 · reviewed head 04efdaf

@hermes-exosphere hermes-exosphere left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Automated review: APPROVED. Clean release cut (0.0.13-beta.3 → stable 0.0.13). Version bump is consistent across package.json + CHANGELOG, bun install --frozen-lockfile stays in sync (verified locally, exit 0), the version-consistency gate passes, no stale version references remain, and all CI jobs are green on the head commit. No issues found.

@NiveditJain
NiveditJain merged commit 94900f6 into main Jul 14, 2026
12 checks passed
NiveditJain pushed a commit that referenced this pull request Jul 15, 2026
…gravity (12 CLIs), remove Gemini (#508)

* feat: OpenClaw (openclaw gateway) integration — real-time enforcement + audit

Adds OpenClaw as the 9th CLI/agent integration, dual-pillar like Hermes:

Pillar 1 (live enforcement) — OpenClaw's in-process plugin hooks (its
file-based "internal hooks" are observation-only and cannot block):
  - openclaw-plugin/ shipped package (manifest + plain-ESM index.js) that
    async-spawns the failproofai binary and maps a flat {permission,reason}
    verdict to each hook's native return shape (before_tool_call →
    {block:true,blockReason}; before_agent_run → {outcome:"block"};
    before_agent_finalize → {action:"revise"}).
  - OPENCLAW_EVENT_MAP / TOOL_MAP / TOOL_INPUT_MAP in types.ts; handler +
    tool-name-canonicalize + policy-evaluator branches; the openclaw
    Integration (install/uninstall manages plugins.load.paths +
    plugins.entries.failproofai in ~/.openclaw/openclaw.json); bin plumbing.

Pillar 2 (audit + dashboard) — reads the real JSONL transcripts at
~/.openclaw/agents/<agentId>/sessions/<uuid>.jsonl:
  - lib/openclaw-sessions.ts (pure type-discriminated parser, UUID-safe
    discovery) + lib/openclaw-projects.ts (sessions.json index, agentId
    grouping) + src/audit/cli-adapters/openclaw.ts.
  - Dashboard wiring: cli-registry, projects, download-session, app routes.

Verified live against openclaw v2026.7.1 (tool block confirmed end-to-end;
hook payloads, tool ids, and transcript schema captured from a real gateway).
Tests mirror the Hermes matrix. All maps are validated, not provisional.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs: document OpenClaw integration (CHANGELOG + CLAUDE.md)

- CHANGELOG 0.0.13-beta.3 entry (Features + Docs).
- CLAUDE.md "OpenClaw hooks" section: plugin-not-shell-hook enforcement
  surface, async-spawn design, per-hook verdict mapping, the real Stop gate,
  audit layout, and the auth-profile / bundledDiscovery setup gotchas.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(openclaw): organize dashboard by channel with readable session names

Live testing surfaced two UX issues: OpenClaw routes gateway sessions through
the agent's default key (agent:<id>:main) and records the channel in metadata
(lastChannel / chatType / origin.{label,provider,from}), NOT in the session key.
So the prior key-parsing grouped everything under "openclaw-main" (which the
dashboard's decodeFolderName rendered as the confusing "openclaw/main") and
named sessions with the raw "agent:main:main" key.

Now group projects by channel (telegram/slack/…/local, like Hermes groups by
source) and name sessions from the human-readable origin.label — so it reads
as "openclaw / telegram" → "Chetan (@chhhee10) id:8674922496" with the chat
id/type in the gateway-metadata columns. Verified live against openclaw v2026.7.1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat: remove Gemini CLI integration entirely

Google retired Gemini CLI (consumer accounts stopped 2026-06-18) in favor of
the closed-source Antigravity CLI (agy), which failproofai is migrating to.

Removes the `gemini` id from INTEGRATION_TYPES, the INTEGRATIONS/ADAPTERS
registries, KNOWN_CLI_IDS, all GEMINI_* event/tool maps, the gemini audit
adapter + lib/gemini-{projects,sessions}.ts, the --cli gemini install/audit
paths (bin + docs), and the dashboard's Gemini session provider. Deletes the
gemini logo assets and the .gemini dogfood config.

Keeps the ~/.gemini/ config-file protections in the block-* builtins and
re-points them at Antigravity (which reuses that directory). Fixes a latent
bug where OpenClaw sessions without a cwd were mislabeled "Gemini CLI" in the
session viewer. Docs + all 14 locale mirrors swept; tsc/build/tests green
(111 files, 1916 tests).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat: add Factory droid (droid) CLI integration

9th CLI integration. Factory droid is a Claude-shaped external-shell-hook CLI,
but with two contract quirks that were live-verified against droid v0.171.0
(and differ from Factory's published docs):

- hooks.json uses event names at the TOP LEVEL (no `{"hooks":{...}}` wrapper —
  droid rejects the wrapper as unknown keys). Tool events carry matcher:"*".
- deny is driven by EXIT CODE 2 + stderr, not a JSON decision (droid ignores
  the JSON decision field). Stop uses `{decision:"block"}` for require-*-before-stop.

Payload is Claude snake_case (no normalization); FACTORY_TOOL_MAP maps
Execute→Bash, Create→Write, etc. Config at ~/.factory/hooks.json (user) /
.factory/hooks.json (project); binary probe `droid`. Audit reads the JSONL
transcripts at ~/.factory/sessions/<enc-cwd>/<id>.jsonl (Claude-style adapter).

Wires all surfaces: types union + maps, Integration + registry, canonicalize,
policy-evaluator deny/instruct branches, audit adapter + lib providers,
cli-registry, projects/download-session, app pages, bin VALID_CLIS + help.
Adds unit + e2e + canonicalize tests, CLAUDE.md section, CHANGELOG, docs.
tsc/lint clean; 1932 unit + 289 e2e tests pass; build green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat: add Devin CLI (devin) integration

10th CLI integration. Devin CLI is a pure Claude-clone for hooks — same
snake_case payloads (hook_event_name, tool_name, tool_input, tool_use_id),
so the Integration is modeled verbatim on claudeCode with a "hooks" key in
~/.config/devin/config.json (user) / .devin/config.json (project). Verified
live against devin v3000.1.27: deny via {"decision":"block","reason"} on stdout
blocks the tool (and overrides --permission-mode dangerous). DEVIN_TOOL_MAP
maps exec→Bash (tool_input.command already canonical); no payload/event maps.

Audit reads the SQLite store at ~/.local/share/devin/cli/sessions.db
(sessions.working_directory → per-project grouping, message_nodes.chat_message
JSON). Devin's tool_calls use a flat {id,name,arguments-as-object} shape (not
the OpenAI wire form), so lib/devin-sessions.ts uses a Devin-specific
normalizer; created_at prefers the higher-precision metadata ISO string.

All 16 surfaces wired; unit + e2e + SQLite-parser tests added; CLAUDE.md
section, CHANGELOG, docs. tsc/lint clean; 1956 unit + 297 e2e pass; build green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat: add Antigravity CLI (agy) integration — Gemini's successor

11th CLI integration. Antigravity CLI (`agy`, Google's closed-source Go
replacement for the retired Gemini CLI) has its OWN hook contract — NOT a
Claude clone. Live-verified against agy v1.1.2.

- Named-hook schema: hooks.json = {"failproofai": {"PreToolUse":[{matcher,hooks}],
  "PreInvocation":[{...}], "Stop":[{...}]}} at ~/.gemini/config/hooks.json (user)
  / .agents/hooks.json (project). Tool events use a {matcher,hooks} wrapper;
  PreInvocation/Stop are flat handler arrays.
- camelCase protojson payload → the handler normalizes toolCall.name→tool_name,
  toolCall.args→tool_input, conversationId→session_id, workspacePaths[0]→cwd,
  transcriptPath→transcript_path before the usual canonicalization.
- Own response shapes: PreToolUse deny → {decision:"deny",reason}; Stop →
  {decision:"continue",reason} (re-enters the loop, so require-*-before-stop
  enforce); instruct → PreInvocation {injectSteps:[{ephemeralMessage}]}.
- ANTIGRAVITY_TOOL_MAP (run_command→Bash, view_file→Read, ...) +
  ANTIGRAVITY_TOOL_INPUT_MAP (Bash: CommandLine→command, Cwd→cwd).
- Audit reads plain JSONL transcript_full.jsonl under
  ~/.gemini/antigravity-cli/brain/<id>/.system_generated/logs/, indexed by
  conversation_summaries.db (falls back to brain/ dir scan when the index is empty).

Keeps the ~/.gemini/ path guards (relabeled for Antigravity in the Gemini
removal). All 16 surfaces wired; unit + e2e + parser tests; CLAUDE.md section,
CHANGELOG, docs. tsc/lint clean; 1976 unit + 306 e2e pass; build green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs: backfill OpenClaw into user-facing docs + document VS Code coverage

Two documentation gaps closed:

1. OpenClaw was shipped as a fully-wired integration but was never added to the
   user-facing supported-CLI lists. Backfills it into README + docs
   (configuration / getting-started / introduction): a dual-pillar bullet after
   Hermes, the --cli lists, install examples, and the detection list.

2. Documents that VS Code's Copilot Chat agent mode (Preview) needs no dedicated
   integration — its agent hooks load from .github/hooks/*.json,
   ~/.copilot/hooks/*.json, and ~/.claude/settings.json (the exact paths the
   copilot/claude integrations already write), verified live against VS Code
   1.127 / github.copilot-chat 0.55.0. So `--cli copilot` (or --cli claude)
   already enforces in VS Code agent-mode sessions. Adds a CLAUDE.md section +
   a docs note.

No code change. tsc/build/tests green (115 files, 1976 tests).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* refactor: make resolve-transcript-path enumerate openclaw explicitly

Add an explicit `case "openclaw"` (functionally a no-op that returns undefined,
same as the default) documenting that OpenClaw's transcript_path comes from its
plugin shim's stdin and its audit reads sessions directly via
lib/openclaw-sessions.ts. Makes the switch cover all 11 CLIs explicitly so the
wiring is unambiguous for future integrations. No behavior change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* chore: drop brittle line-number cross-refs from policy-evaluator comments

Replace stale `(line ~N)` / `at line ~N` comment cross-references (which went
out of date when the Gemini branches were removed and shift on every edit) with
descriptive references to the mirrored per-CLI branches. Comment-only; no
behavior change. Avoids automated-review flags on outdated line numbers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat: add Goose (codename goose, Block) as the 12th CLI integration

Dual-pillar like Hermes/OpenClaw/Factory/Devin/Antigravity — real-time policy
enforcement + offline audit. Enforcement uses Goose's "hooks" system (the
cross-agent Open Plugins spec): the installer drops an auto-discovered plugin
dir at ~/.agents/plugins/failproofai/hooks/hooks.json (user/project). Deny is
{"decision":"block"} JSON on PreToolUse only (goose >= v1.37.0); goose has no
Stop event, so require-*-before-stop is inapplicable (like Hermes). Audit reads
the SQLite sessions.db (cwd-grouped like Devin; Claude-style content_json).
Verified live end-to-end against goose v1.43.0 (real sudo blocked; real
sessions.db read). Follows the Factory (enforcement) + Devin (SQLite audit)
templates.

Also backfills the README supported-CLI logo grid (openclaw/factory/devin/
antigravity/goose were missing) with dark/light variants, and documents Goose
across CLAUDE.md + docs/{getting-started,configuration}.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: link each supported-CLI logo to its official site

Point the 9 logos the maintainer supplied URLs for at their official pages
(codex→learn.chatgpt.com, copilot→github.com/features/copilot/cli, cursor,
opencode, pi, hermes, openclaw, factory, goose→goose-docs.ai); claude/devin/
antigravity keep their existing links.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(hooks): correct Antigravity file-tool map + quiet channel-less allow-notes

Two issues surfaced while testing every CLI:

1. Antigravity file writes weren't gated. ANTIGRAVITY_TOOL_MAP had guessed tool
   names (`write_file`/`list_directory`/`find_filepath`) — the real ones (from
   the agy binary + live transcripts) are `write_to_file`/`list_dir`/
   `find_by_name`, and there was no input-key map for file tools, so the path
   (delivered as `TargetFile`) never became `file_path`. Result: block-env-files
   / block-secrets-write silently allowed `.env` writes on Antigravity. Corrected
   the tool names and added Write/Edit/Read input maps (TargetFile→file_path,
   CodeContent→content). Verified live: agy now denies a `.env` write.

2. Noisy Stop-hook output. Informational allow-notes were emitted as stdout
   `{reason}` on events with no agent-facing context channel (Stop, SubagentStop,
   Session*, …), so a passing Stop rendered as a "…skipping commit check…skipping
   PR check…" wall (visible e.g. in droid). Those notes now go to stderr + the
   activity store only; stdout stays clean on channel-less events.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(readme): arrange the 12 CLI logos as 2 rows of 6

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(audit): reconstruct Devin's active conversation path (de-dup the forest)

Devin stores a session's messages as a FOREST (node_id/parent_node_id) and
replays earlier context under fresh roots on later turns, so message_nodes holds
many branches that repeat the same messages — verified live: 26-31 raw nodes for
8-10 real messages. The parser read every node in node_id order, so the dashboard
rendered each message 2-4× (a wall of duplicated "Create a file named .env…").

Reconstruct the real conversation instead: walk parent_node_id from the newest
leaf (max node_id) to its root and reverse. Devin sessions now render the true
8-10 message conversation. Adds devinActiveConversationPath + unit tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore(release): finalize CHANGELOG + dogfood the 4 newest CLIs

- CHANGELOG: add the missing Fixes section (Antigravity file-tool map, quiet
  channel-less allow-notes, Devin forest de-dup) and a Docs entry for the README
  logo grid.
- Dogfood: ship project-scope configs for Factory (.factory/hooks.json), Devin
  (.devin/config.json), Antigravity (.agents/hooks.json), and Goose
  (.agents/plugins/failproofai/hooks/hooks.json) using the dev
  `bun bin/failproofai.mjs` command — generated from each integration's own
  writeHookEntries so they track the live schema. Documented in CLAUDE.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore(release): bump to 0.0.14-beta.1

main shipped 0.0.13 stable (#506) without this CLI-expansion work, so it releases
as 0.0.14-beta.1. Moves the branch's CHANGELOG entries into a fresh 0.0.14-beta.1
section above the released 0.0.13.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(changelog): reference PR #508

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: complete the dashboard + config CLI lists for all 12 agents

The dashboard project-list description, session-viewer/activity badge lists, the
?cli= filter, and the auto-detect list only covered the original 7 CLIs. Add the
five newer ones (OpenClaw, Factory Droid, Devin, Antigravity, Goose) with their
session-store paths and badge colors. Caught by the PR #508 automated review.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
NiveditJain added a commit that referenced this pull request Jul 15, 2026
* fix(docs): restore AgentEye language navigation

* fix(ci): make docs translation atomic

* feat: agent CLI expansion — Goose + OpenClaw + Factory + Devin + Antigravity (12 CLIs), remove Gemini (#508)

* feat: OpenClaw (openclaw gateway) integration — real-time enforcement + audit

Adds OpenClaw as the 9th CLI/agent integration, dual-pillar like Hermes:

Pillar 1 (live enforcement) — OpenClaw's in-process plugin hooks (its
file-based "internal hooks" are observation-only and cannot block):
  - openclaw-plugin/ shipped package (manifest + plain-ESM index.js) that
    async-spawns the failproofai binary and maps a flat {permission,reason}
    verdict to each hook's native return shape (before_tool_call →
    {block:true,blockReason}; before_agent_run → {outcome:"block"};
    before_agent_finalize → {action:"revise"}).
  - OPENCLAW_EVENT_MAP / TOOL_MAP / TOOL_INPUT_MAP in types.ts; handler +
    tool-name-canonicalize + policy-evaluator branches; the openclaw
    Integration (install/uninstall manages plugins.load.paths +
    plugins.entries.failproofai in ~/.openclaw/openclaw.json); bin plumbing.

Pillar 2 (audit + dashboard) — reads the real JSONL transcripts at
~/.openclaw/agents/<agentId>/sessions/<uuid>.jsonl:
  - lib/openclaw-sessions.ts (pure type-discriminated parser, UUID-safe
    discovery) + lib/openclaw-projects.ts (sessions.json index, agentId
    grouping) + src/audit/cli-adapters/openclaw.ts.
  - Dashboard wiring: cli-registry, projects, download-session, app routes.

Verified live against openclaw v2026.7.1 (tool block confirmed end-to-end;
hook payloads, tool ids, and transcript schema captured from a real gateway).
Tests mirror the Hermes matrix. All maps are validated, not provisional.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs: document OpenClaw integration (CHANGELOG + CLAUDE.md)

- CHANGELOG 0.0.13-beta.3 entry (Features + Docs).
- CLAUDE.md "OpenClaw hooks" section: plugin-not-shell-hook enforcement
  surface, async-spawn design, per-hook verdict mapping, the real Stop gate,
  audit layout, and the auth-profile / bundledDiscovery setup gotchas.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(openclaw): organize dashboard by channel with readable session names

Live testing surfaced two UX issues: OpenClaw routes gateway sessions through
the agent's default key (agent:<id>:main) and records the channel in metadata
(lastChannel / chatType / origin.{label,provider,from}), NOT in the session key.
So the prior key-parsing grouped everything under "openclaw-main" (which the
dashboard's decodeFolderName rendered as the confusing "openclaw/main") and
named sessions with the raw "agent:main:main" key.

Now group projects by channel (telegram/slack/…/local, like Hermes groups by
source) and name sessions from the human-readable origin.label — so it reads
as "openclaw / telegram" → "Chetan (@chhhee10) id:8674922496" with the chat
id/type in the gateway-metadata columns. Verified live against openclaw v2026.7.1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat: remove Gemini CLI integration entirely

Google retired Gemini CLI (consumer accounts stopped 2026-06-18) in favor of
the closed-source Antigravity CLI (agy), which failproofai is migrating to.

Removes the `gemini` id from INTEGRATION_TYPES, the INTEGRATIONS/ADAPTERS
registries, KNOWN_CLI_IDS, all GEMINI_* event/tool maps, the gemini audit
adapter + lib/gemini-{projects,sessions}.ts, the --cli gemini install/audit
paths (bin + docs), and the dashboard's Gemini session provider. Deletes the
gemini logo assets and the .gemini dogfood config.

Keeps the ~/.gemini/ config-file protections in the block-* builtins and
re-points them at Antigravity (which reuses that directory). Fixes a latent
bug where OpenClaw sessions without a cwd were mislabeled "Gemini CLI" in the
session viewer. Docs + all 14 locale mirrors swept; tsc/build/tests green
(111 files, 1916 tests).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat: add Factory droid (droid) CLI integration

9th CLI integration. Factory droid is a Claude-shaped external-shell-hook CLI,
but with two contract quirks that were live-verified against droid v0.171.0
(and differ from Factory's published docs):

- hooks.json uses event names at the TOP LEVEL (no `{"hooks":{...}}` wrapper —
  droid rejects the wrapper as unknown keys). Tool events carry matcher:"*".
- deny is driven by EXIT CODE 2 + stderr, not a JSON decision (droid ignores
  the JSON decision field). Stop uses `{decision:"block"}` for require-*-before-stop.

Payload is Claude snake_case (no normalization); FACTORY_TOOL_MAP maps
Execute→Bash, Create→Write, etc. Config at ~/.factory/hooks.json (user) /
.factory/hooks.json (project); binary probe `droid`. Audit reads the JSONL
transcripts at ~/.factory/sessions/<enc-cwd>/<id>.jsonl (Claude-style adapter).

Wires all surfaces: types union + maps, Integration + registry, canonicalize,
policy-evaluator deny/instruct branches, audit adapter + lib providers,
cli-registry, projects/download-session, app pages, bin VALID_CLIS + help.
Adds unit + e2e + canonicalize tests, CLAUDE.md section, CHANGELOG, docs.
tsc/lint clean; 1932 unit + 289 e2e tests pass; build green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat: add Devin CLI (devin) integration

10th CLI integration. Devin CLI is a pure Claude-clone for hooks — same
snake_case payloads (hook_event_name, tool_name, tool_input, tool_use_id),
so the Integration is modeled verbatim on claudeCode with a "hooks" key in
~/.config/devin/config.json (user) / .devin/config.json (project). Verified
live against devin v3000.1.27: deny via {"decision":"block","reason"} on stdout
blocks the tool (and overrides --permission-mode dangerous). DEVIN_TOOL_MAP
maps exec→Bash (tool_input.command already canonical); no payload/event maps.

Audit reads the SQLite store at ~/.local/share/devin/cli/sessions.db
(sessions.working_directory → per-project grouping, message_nodes.chat_message
JSON). Devin's tool_calls use a flat {id,name,arguments-as-object} shape (not
the OpenAI wire form), so lib/devin-sessions.ts uses a Devin-specific
normalizer; created_at prefers the higher-precision metadata ISO string.

All 16 surfaces wired; unit + e2e + SQLite-parser tests added; CLAUDE.md
section, CHANGELOG, docs. tsc/lint clean; 1956 unit + 297 e2e pass; build green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat: add Antigravity CLI (agy) integration — Gemini's successor

11th CLI integration. Antigravity CLI (`agy`, Google's closed-source Go
replacement for the retired Gemini CLI) has its OWN hook contract — NOT a
Claude clone. Live-verified against agy v1.1.2.

- Named-hook schema: hooks.json = {"failproofai": {"PreToolUse":[{matcher,hooks}],
  "PreInvocation":[{...}], "Stop":[{...}]}} at ~/.gemini/config/hooks.json (user)
  / .agents/hooks.json (project). Tool events use a {matcher,hooks} wrapper;
  PreInvocation/Stop are flat handler arrays.
- camelCase protojson payload → the handler normalizes toolCall.name→tool_name,
  toolCall.args→tool_input, conversationId→session_id, workspacePaths[0]→cwd,
  transcriptPath→transcript_path before the usual canonicalization.
- Own response shapes: PreToolUse deny → {decision:"deny",reason}; Stop →
  {decision:"continue",reason} (re-enters the loop, so require-*-before-stop
  enforce); instruct → PreInvocation {injectSteps:[{ephemeralMessage}]}.
- ANTIGRAVITY_TOOL_MAP (run_command→Bash, view_file→Read, ...) +
  ANTIGRAVITY_TOOL_INPUT_MAP (Bash: CommandLine→command, Cwd→cwd).
- Audit reads plain JSONL transcript_full.jsonl under
  ~/.gemini/antigravity-cli/brain/<id>/.system_generated/logs/, indexed by
  conversation_summaries.db (falls back to brain/ dir scan when the index is empty).

Keeps the ~/.gemini/ path guards (relabeled for Antigravity in the Gemini
removal). All 16 surfaces wired; unit + e2e + parser tests; CLAUDE.md section,
CHANGELOG, docs. tsc/lint clean; 1976 unit + 306 e2e pass; build green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs: backfill OpenClaw into user-facing docs + document VS Code coverage

Two documentation gaps closed:

1. OpenClaw was shipped as a fully-wired integration but was never added to the
   user-facing supported-CLI lists. Backfills it into README + docs
   (configuration / getting-started / introduction): a dual-pillar bullet after
   Hermes, the --cli lists, install examples, and the detection list.

2. Documents that VS Code's Copilot Chat agent mode (Preview) needs no dedicated
   integration — its agent hooks load from .github/hooks/*.json,
   ~/.copilot/hooks/*.json, and ~/.claude/settings.json (the exact paths the
   copilot/claude integrations already write), verified live against VS Code
   1.127 / github.copilot-chat 0.55.0. So `--cli copilot` (or --cli claude)
   already enforces in VS Code agent-mode sessions. Adds a CLAUDE.md section +
   a docs note.

No code change. tsc/build/tests green (115 files, 1976 tests).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* refactor: make resolve-transcript-path enumerate openclaw explicitly

Add an explicit `case "openclaw"` (functionally a no-op that returns undefined,
same as the default) documenting that OpenClaw's transcript_path comes from its
plugin shim's stdin and its audit reads sessions directly via
lib/openclaw-sessions.ts. Makes the switch cover all 11 CLIs explicitly so the
wiring is unambiguous for future integrations. No behavior change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* chore: drop brittle line-number cross-refs from policy-evaluator comments

Replace stale `(line ~N)` / `at line ~N` comment cross-references (which went
out of date when the Gemini branches were removed and shift on every edit) with
descriptive references to the mirrored per-CLI branches. Comment-only; no
behavior change. Avoids automated-review flags on outdated line numbers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat: add Goose (codename goose, Block) as the 12th CLI integration

Dual-pillar like Hermes/OpenClaw/Factory/Devin/Antigravity — real-time policy
enforcement + offline audit. Enforcement uses Goose's "hooks" system (the
cross-agent Open Plugins spec): the installer drops an auto-discovered plugin
dir at ~/.agents/plugins/failproofai/hooks/hooks.json (user/project). Deny is
{"decision":"block"} JSON on PreToolUse only (goose >= v1.37.0); goose has no
Stop event, so require-*-before-stop is inapplicable (like Hermes). Audit reads
the SQLite sessions.db (cwd-grouped like Devin; Claude-style content_json).
Verified live end-to-end against goose v1.43.0 (real sudo blocked; real
sessions.db read). Follows the Factory (enforcement) + Devin (SQLite audit)
templates.

Also backfills the README supported-CLI logo grid (openclaw/factory/devin/
antigravity/goose were missing) with dark/light variants, and documents Goose
across CLAUDE.md + docs/{getting-started,configuration}.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: link each supported-CLI logo to its official site

Point the 9 logos the maintainer supplied URLs for at their official pages
(codex→learn.chatgpt.com, copilot→github.com/features/copilot/cli, cursor,
opencode, pi, hermes, openclaw, factory, goose→goose-docs.ai); claude/devin/
antigravity keep their existing links.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(hooks): correct Antigravity file-tool map + quiet channel-less allow-notes

Two issues surfaced while testing every CLI:

1. Antigravity file writes weren't gated. ANTIGRAVITY_TOOL_MAP had guessed tool
   names (`write_file`/`list_directory`/`find_filepath`) — the real ones (from
   the agy binary + live transcripts) are `write_to_file`/`list_dir`/
   `find_by_name`, and there was no input-key map for file tools, so the path
   (delivered as `TargetFile`) never became `file_path`. Result: block-env-files
   / block-secrets-write silently allowed `.env` writes on Antigravity. Corrected
   the tool names and added Write/Edit/Read input maps (TargetFile→file_path,
   CodeContent→content). Verified live: agy now denies a `.env` write.

2. Noisy Stop-hook output. Informational allow-notes were emitted as stdout
   `{reason}` on events with no agent-facing context channel (Stop, SubagentStop,
   Session*, …), so a passing Stop rendered as a "…skipping commit check…skipping
   PR check…" wall (visible e.g. in droid). Those notes now go to stderr + the
   activity store only; stdout stays clean on channel-less events.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(readme): arrange the 12 CLI logos as 2 rows of 6

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(audit): reconstruct Devin's active conversation path (de-dup the forest)

Devin stores a session's messages as a FOREST (node_id/parent_node_id) and
replays earlier context under fresh roots on later turns, so message_nodes holds
many branches that repeat the same messages — verified live: 26-31 raw nodes for
8-10 real messages. The parser read every node in node_id order, so the dashboard
rendered each message 2-4× (a wall of duplicated "Create a file named .env…").

Reconstruct the real conversation instead: walk parent_node_id from the newest
leaf (max node_id) to its root and reverse. Devin sessions now render the true
8-10 message conversation. Adds devinActiveConversationPath + unit tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore(release): finalize CHANGELOG + dogfood the 4 newest CLIs

- CHANGELOG: add the missing Fixes section (Antigravity file-tool map, quiet
  channel-less allow-notes, Devin forest de-dup) and a Docs entry for the README
  logo grid.
- Dogfood: ship project-scope configs for Factory (.factory/hooks.json), Devin
  (.devin/config.json), Antigravity (.agents/hooks.json), and Goose
  (.agents/plugins/failproofai/hooks/hooks.json) using the dev
  `bun bin/failproofai.mjs` command — generated from each integration's own
  writeHookEntries so they track the live schema. Documented in CLAUDE.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore(release): bump to 0.0.14-beta.1

main shipped 0.0.13 stable (#506) without this CLI-expansion work, so it releases
as 0.0.14-beta.1. Moves the branch's CHANGELOG entries into a fresh 0.0.14-beta.1
section above the released 0.0.13.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(changelog): reference PR #508

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: complete the dashboard + config CLI lists for all 12 agents

The dashboard project-list description, session-viewer/activity badge lists, the
?cli= filter, and the auto-detect list only covered the original 7 CLIs. Add the
five newer ones (OpenClaw, Factory Droid, Devin, Antigravity, Goose) with their
session-store paths and badge colors. Caught by the PR #508 automated review.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* docs: update translations for changed English sources (#513)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* docs: update translations for changed English sources

* fix(docs): restore AgentEye language navigation

* fix(ci): make docs translation atomic

* fix(docs): address translation review findings

---------

Co-authored-by: Codex <codex@openai.com>
Co-authored-by: Chetan Raghuvanshi <145042127+chhhee10@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants