diff --git a/.agents/skills/committing-actual-changes b/.agents/skills/committing-actual-changes new file mode 120000 index 0000000000..ad9c1ea7d5 --- /dev/null +++ b/.agents/skills/committing-actual-changes @@ -0,0 +1 @@ +../../.claude/skills/committing-actual-changes \ No newline at end of file diff --git a/.agents/skills/review-actual-pr b/.agents/skills/review-actual-pr new file mode 120000 index 0000000000..a967fbc7ab --- /dev/null +++ b/.agents/skills/review-actual-pr @@ -0,0 +1 @@ +../../.claude/skills/review-actual-pr \ No newline at end of file diff --git a/.agents/skills/writing-actual-docs b/.agents/skills/writing-actual-docs new file mode 120000 index 0000000000..d7544c9123 --- /dev/null +++ b/.agents/skills/writing-actual-docs @@ -0,0 +1 @@ +../../.claude/skills/writing-actual-docs \ No newline at end of file diff --git a/.agents/skills/writing-release-notes b/.agents/skills/writing-release-notes new file mode 120000 index 0000000000..798a677021 --- /dev/null +++ b/.agents/skills/writing-release-notes @@ -0,0 +1 @@ +../../.claude/skills/writing-release-notes \ No newline at end of file diff --git a/.codex/config.toml b/.codex/config.toml index 890672ea71..468cb499ac 100644 --- a/.codex/config.toml +++ b/.codex/config.toml @@ -1,8 +1,10 @@ # Codex project hooks for actualbudget/actual. # # Codex discovers project config by walking up to the .git root, so this file -# applies to the whole repo. The hook scripts are shared with Claude Code and -# Cursor (see scripts/agent-hooks/). Codex's Bash hook is Claude-compatible +# applies to the whole repo — and to every Codex surface: the Codex CLI, the +# Codex IDE extension, and the ChatGPT desktop app all read the same config +# layers. The hook scripts are shared with Claude Code and Cursor (see +# scripts/agent-hooks/). Codex's Bash hook is Claude-compatible # (tool_input.command), so the git guard is reused directly; exit code 2 + stderr # blocks the call. # @@ -13,7 +15,21 @@ # Bash/git guard and the Stop check work regardless. The file hooks are fully # effective under Claude Code and Cursor. # -# Non-managed hooks must be trusted once via `/hooks` in the Codex CLI. +# For hooks to run (any surface, including the ChatGPT desktop app): +# 1. Lifecycle hooks must be enabled — done by the [features] flag below. +# 2. The project's .codex/ layer must be trusted. An untrusted project skips +# this whole file (hooks included), silently. +# 3. Each non-managed hook must be trusted once via `/hooks` (hash-pinned, so +# editing a hook re-requires trust). Trust is recorded in shared Codex +# state, so trusting via the CLI also covers the desktop app and IDE. +# +# Repo skills for Codex surfaces are mirrored in .agents/skills/ (symlinks to +# .claude/skills/) — Codex scans .agents/skills, not .claude/skills. + +# Lifecycle hooks are feature-flagged; enable them for this project so all +# surfaces run the [hooks] tables below once the layer is trusted. +[features] +lifecycle_hooks = true # Block unsafe git/workspace commands ([AI] prefix, --no-verify, force-push, # push-to-main, git config writes, yarn-from-a-workspace). diff --git a/AGENTS.md b/AGENTS.md index 53b72f04bc..2e6c0da0a3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -349,6 +349,10 @@ describe('ComponentName', () => { - `/.nano-staged.json` - pre-commit format/lint config (run via Husky) - `/.claude/settings.json`, `/.codex/config.toml`, `/.cursor/hooks.json` - agent hook wiring; shared scripts live in `/scripts/agent-hooks/` +- `/.agents/skills/` - symlink mirror of `/.claude/skills/` so Codex-based + harnesses (Codex CLI, IDE extension, ChatGPT desktop app) discover the same + skills; when adding a skill, create it in `/.claude/skills/` and add a + matching relative symlink here - `/tsconfig.json` - Root TypeScript configuration - `/.cursorignore`, `/.gitignore` - Ignored files - `/yarn.lock` - Dependency lockfile (Yarn 4) diff --git a/knip.json b/knip.json index aafdda2e2b..50b3b76e52 100644 --- a/knip.json +++ b/knip.json @@ -11,7 +11,7 @@ "workspaces": { ".": { "entry": ["bin/*.mts"], - "ignore": ["lage.config.js", ".claude/**"] + "ignore": ["lage.config.js", ".claude/**", ".agents/**"] }, "packages/api": { "entry": ["index.browser.ts", "browser-worker.ts", "e2e/**/*.{ts,mjs}"], diff --git a/upcoming-release-notes/chatgpt-desktop-agent-hooks.md b/upcoming-release-notes/chatgpt-desktop-agent-hooks.md new file mode 100644 index 0000000000..ba729a0b97 --- /dev/null +++ b/upcoming-release-notes/chatgpt-desktop-agent-hooks.md @@ -0,0 +1,6 @@ +--- +category: Maintenance +authors: [MatissJanis] +--- + +Make Codex-based agent harnesses (ChatGPT desktop app, Codex CLI/IDE) run the repo agent hooks and discover the shared skills