From e50ca8089dcf31d9516fded438299e93954c8d2b Mon Sep 17 00:00:00 2001 From: Matthew Bessette Date: Mon, 20 Jul 2026 11:07:44 -0400 Subject: [PATCH] Claude --- agent.claude.build.md | 21 +++++++++++ agent.claude.plan.md | 21 +++++++++++ cleo.darwin.nix | 18 ++++++++- cleo.home.nix | 9 ++++- config.claude.json | 5 +++ config.opencode.jsonc | 50 ++++++++++++++----------- flake.lock | 87 +++++++++++++++++++++---------------------- flake.nix | 2 +- 8 files changed, 144 insertions(+), 69 deletions(-) create mode 100644 agent.claude.build.md create mode 100644 agent.claude.plan.md create mode 100644 config.claude.json diff --git a/agent.claude.build.md b/agent.claude.build.md new file mode 100644 index 0000000..f83dd6a --- /dev/null +++ b/agent.claude.build.md @@ -0,0 +1,21 @@ +--- +name: build +description: Build agent. Executes an implementation plan with full tooling. Parallelizes independent tasks and writes to the project it lives in. +model: sonnet +tools: Read, Write, Edit, Grep, Glob, Bash, Task, WebFetch, WebSearch +--- + +You are the Build agent and the primary orchestrator (Sonnet). + +Execution model: +1. Take the task list and identify independent tasks. +2. Dispatch independent tasks in parallel using the Task tool. +3. Route low-complexity, mechanical, or high-volume subtasks (boilerplate, + simple edits, file scans, test scaffolding) to Haiku subagents for + efficiency. Handle complex, cross-cutting orchestration yourself. +4. Serialize only where there is a real dependency. + +Scope: +- Full read/write access, limited to the project this agent lives in. +- Do not modify files outside the project root. +- Verify your work (build/lint/tests) before reporting done. diff --git a/agent.claude.plan.md b/agent.claude.plan.md new file mode 100644 index 0000000..f511caa --- /dev/null +++ b/agent.claude.plan.md @@ -0,0 +1,21 @@ +--- +name: plan +description: Planning agent. Explores the codebase and produces an implementation plan without writing code. Use PROACTIVELY for any non-trivial task before building. +model: opusplan +tools: Read, Grep, Glob, Task, WebFetch, WebSearch +--- + +You are the Plan agent. Your job is to understand the task and produce a +clear, ordered implementation plan. You DO NOT modify files. + +Workflow: +1. Delegate cheap, high-volume exploration (file discovery, reading, + grepping, summarizing) to Haiku subagents via the Task tool. +2. Reserve your own reasoning for synthesis and plan design (opusplan). +3. Output a concrete, ordered task list with explicit file paths, the + change required in each, and where work can run in parallel. + +Constraints: +- Never edit, create, or delete files. +- Never run mutating shell commands. +- End every response with a numbered task list ready to hand to the Build agent. diff --git a/cleo.darwin.nix b/cleo.darwin.nix index 8455eac..1c07d8d 100644 --- a/cleo.darwin.nix +++ b/cleo.darwin.nix @@ -1,8 +1,21 @@ { pkgs, inputs, ... }: { nixpkgs.config.allowUnfree = true; - nixpkgs.overlays = [ inputs.nix-vscode-extensions.overlays.default ]; + nixpkgs.overlays = [ + inputs.nix-vscode-extensions.overlays.default + # ==== Temp workaround for VSCODE + ## https://github.com/nixos/nixpkgs/issues/543690 as of 2026-07-20 + (final: prev: { + vscode = prev.vscode.overrideAttrs (oldAttrs: { + postPatch = builtins.replaceStrings + [ "Contents/Resources/app/node_modules/@vscode/ripgrep-universal" ] + [ "Contents/Resources/app/node_modules.asar.unpacked/@vscode/ripgrep-universal" ] + (oldAttrs.postPatch or ""); + }); + }) + ]; ids.gids.nixbld = 350; security.pam.services.sudo_local.touchIdAuth = true; + # 1Password SSH Socket environment.variables.SSH_AUTH_SOCK = "~/Library/Group Containers/2BU8OCWD5C.com.1password/t/agent.sock"; @@ -63,7 +76,10 @@ "1password-cli" "bruno" + "claude" + "claude-code" "docker-desktop" + "super-productivity" "kopiaui" "libreoffice" "obsidian" diff --git a/cleo.home.nix b/cleo.home.nix index d90a1f6..7806cfa 100644 --- a/cleo.home.nix +++ b/cleo.home.nix @@ -38,6 +38,7 @@ in ## Tooling fd granted + ttyd ] ++ [ oldPkgs.nodejs_22 oldPkgs.yarn @@ -59,9 +60,8 @@ in bbenoist.nix eamodio.gitlens graphql.vscode-graphql-syntax + graphql.vscode-graphql hashicorp.terraform - mechatroner.rainbow-csv - mermaidchart.vscode-mermaid-chart ms-python.debugpy ms-python.python ms-python.vscode-pylance @@ -96,6 +96,7 @@ in ]; initContent = '' + export JIRA_API_TOKEN=$(security find-generic-password -a "$USER" -s "jira-token" -w 2>/dev/null) export SSH_AUTH_SOCK=~/Library/Group\ Containers/2BUA8C4S2C.com.1password/t/agent.sock # Auto-allow direnv for directories with flake.nix @@ -126,6 +127,7 @@ in }; home.sessionVariables = { + CLAUDE_CONFIG_DIR = "${config.home.homeDirectory}/.config/claude"; # Points to the Homebrew location mentioned in your caveat JAVA_HOME = "/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home"; NPM_CONFIG_PREFIX = "${config.home.homeDirectory}/.npm-global"; @@ -149,6 +151,9 @@ in home.file."android-sdk/platform-tools/adb".source = config.lib.file.mkOutOfStoreSymlink "/opt/homebrew/bin/adb"; home.file."android-sdk/cmdline-tools/latest/bin/sdkmanager".source = config.lib.file.mkOutOfStoreSymlink "/opt/homebrew/bin/sdkmanager"; xdg.configFile."opencode/opencode.jsonc".source = config.lib.file.mkOutOfStoreSymlink "/Users/matthew.bessette/nixos/config.opencode.jsonc"; + xdg.configFile."claude/settings.json".source = config.lib.file.mkOutOfStoreSymlink "/Users/matthew.bessette/nixos/config.claude.json"; + xdg.configFile."claude/agents/plan.md".source = config.lib.file.mkOutOfStoreSymlink "/Users/matthew.bessette/nixos/claude.agents.plan.md"; + xdg.configFile."claude/agents/build.md".source = config.lib.file.mkOutOfStoreSymlink "/Users/matthew.bessette/nixos/claude.agents.build.md"; programs.tmux.enable = true; diff --git a/config.claude.json b/config.claude.json new file mode 100644 index 0000000..2d01ee7 --- /dev/null +++ b/config.claude.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://json.schemastore.org/claude-code-settings.json", + "theme": "dark", + "agent": "plan" +} \ No newline at end of file diff --git a/config.opencode.jsonc b/config.opencode.jsonc index 007919c..38cbb2e 100644 --- a/config.opencode.jsonc +++ b/config.opencode.jsonc @@ -2,38 +2,42 @@ "$schema": "https://opencode.ai/config.json", "model": "github-copilot/claude-sonnet-4.6", "instructions": [], + "plugin": ["opencode-copilot-1m"], "provider": {}, "lsp": true, + "permission": { + "external_directory": { + "~/Projects/**": "allow", + "/tmp": "allow" + } + }, "agent": { "plan": { "mode": "primary", - "model": "github-copilot/claude-sonnet-4.6", - "prompt": "You are OpenCode's architect. When given a problem, analyze the codebase and write out a strict step-by-step master plan. Once approved, use the 'todo' tool to track tasks and delegate implementation details to the general subagents using @general.", - "permission": { - "edit": "deny", - "bash": "deny", - "subagent": "allow" - } + "model": "github-copilot/claude-opus-4.8-1m", + "prompt": "Architect agent. Analyzes codebase and outputs a hyper-specific, step-by-step technical blueprint into .opencode_blueprint.md. Does NOT write feature code.", + "permission": { "edit": "allow", "bash": "allow" } + }, + "execute": { + "model": "github-copilot/claude-sonnet-4.6-1m", + "temperature": 0.2, + "prompt": "Orchestrator agent. Reads .opencode_blueprint.md, breaks tasks into micro-steps, and delegates individual file edits/terminal tasks to subagents. Your primary job is delegation and verification.", + "permission": { "edit": "allow", "bash": "allow" } }, "build": { - "mode": "primary", - "model": "github-copilot/claude-sonnet-4.6", - "permission": { - "edit": "allow", - "bash": "allow" - } - }, - "explore": { - "model": "github-copilot/claude-haiku-4.5" + "model": "github-copilot/claude-sonnet-4.6-1m", + "temperature": 0.2, + "permission": { "edit": "allow", "bash": "allow" } }, "general": { "mode": "subagent", "model": "github-copilot/claude-haiku-4.5", - "description": "A fresh-context, general-purpose agent for executing individual units of multi-step tasks.", - "permission": { - "edit": "allow", - "bash": "allow" - } + "temperature": 0.1, + "prompt": "Execution subagent. Takes a single, isolated task and explicit file paths provided by the Build orchestrator. Do not blind-search; rely strictly on paths given.", + "permission": { "edit": "allow", "bash": "allow" } + }, + "explore": { + "model": "github-copilot/claude-haiku-4.5" } }, "autoupdate": false, @@ -44,6 +48,10 @@ "figma": { "type": "remote", "url": "http://127.0.0.1:3845/mcp" + }, + "ios-simulator": { + "type": "local", + "command": ["npx", "-y", "ios-simulator-mcp"] } } } diff --git a/flake.lock b/flake.lock index dd92d76..de46706 100644 --- a/flake.lock +++ b/flake.lock @@ -8,11 +8,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1766810506, - "narHash": "sha256-I4BxozsEu205tA7jazufztI8ZQ5p7hcCnjqrSKPz9nI=", + "lastModified": 1782994178, + "narHash": "sha256-VGc3/2fe6hnOmNSLlOygEAbeS69v7A7rjKDKRzAgE2Q=", "owner": "hraban", "repo": "cl-nix-lite", - "rev": "038e341cede255a83a8f04af114dc95717461d32", + "rev": "eb584721e5e799bafe0c6210a8a1a398f90e8ac0", "type": "github" }, "original": { @@ -28,11 +28,11 @@ ] }, "locked": { - "lastModified": 1779036909, - "narHash": "sha256-zXcwYQGCT6pzinK+1dBB2ekTVtfxGZAapb3Evdcu4fY=", + "lastModified": 1784500460, + "narHash": "sha256-UvORnAxTRHax7RG74W8Z2t4GvIkX6AjJ5kk0QlwZomo=", "owner": "lnl7", "repo": "nix-darwin", - "rev": "56c666e108467d87d13508936aade6d567f2a501", + "rev": "57a3171f94705599a2499248ca5758d5eb47c0e0", "type": "github" }, "original": { @@ -45,11 +45,11 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1730663653, - "narHash": "sha256-kFCUWettiFHDIqxCWWQ9qY8pVh+Lj+XL0Giyy/kdomg=", + "lastModified": 1766808011, + "narHash": "sha256-s83BS0abtIj7vzUf8JE0209KphfHA6qRw/92D9k/F+0=", "owner": "hraban", "repo": "flake-compat", - "rev": "e5b16676185cb7548581c852f51ce7f3a49bba5e", + "rev": "6e0aafdc4c4c2043c66f756d5045374b42184fc5", "type": "github" }, "original": { @@ -120,16 +120,15 @@ ] }, "locked": { - "lastModified": 1781981105, - "narHash": "sha256-/1nNBbA7PrSQpTc9Qazkhl4kIPg+TNl0CjxS3UQJKlw=", + "lastModified": 1784546264, + "narHash": "sha256-jxVr5EHMYAOkFvS2k0abIvt6NqyshyWmiHHzV17sT2g=", "owner": "nix-community", "repo": "home-manager", - "rev": "7bfff44b465909f69a442701293bc0badcf476dc", + "rev": "e3dea8e4792b09a6c0eb5836b0284ad05b1acba0", "type": "github" }, "original": { "owner": "nix-community", - "ref": "release-26.05", "repo": "home-manager", "type": "github" } @@ -144,11 +143,11 @@ "treefmt-nix": "treefmt-nix_2" }, "locked": { - "lastModified": 1766810876, - "narHash": "sha256-VPElWFQIiP31lXQXEom+L4sl85alZpZn33O4hewsP9k=", + "lastModified": 1783182903, + "narHash": "sha256-7IteXipJZfFepi5zakxe0jQ5i3vRBQguk0+Gtte1Fu4=", "owner": "hraban", "repo": "mac-app-util", - "rev": "4747968574ea58512c5385466400b2364c85d2d0", + "rev": "039f33deef21782d4db97087f426504951239887", "type": "github" }, "original": { @@ -180,11 +179,11 @@ ] }, "locked": { - "lastModified": 1780289349, - "narHash": "sha256-WtFLQ7R2bErvItKRgkYXqsm0s/cvDnx9fF4XniD3QxQ=", + "lastModified": 1784518658, + "narHash": "sha256-XzsY3mSStyY1OEEQvYg7Mj8YTAaxz7FFbVRa5xlm40g=", "owner": "nix-community", "repo": "nix-vscode-extensions", - "rev": "f4e7a3b814e1df64804cc211f657e65a1e618695", + "rev": "e6d84a0cde8a08f33e962d1a347d2aa8688b2e99", "type": "github" }, "original": { @@ -198,11 +197,11 @@ "nixpkgs": "nixpkgs_5" }, "locked": { - "lastModified": 1780310866, - "narHash": "sha256-fPBRVf6A5xlACYcOI59shGrjURuvwu0lRsDoSCEXt/I=", + "lastModified": 1784310968, + "narHash": "sha256-rkSPTePrKqs4dg+i7ZFCq93+HrClac6oSwXX927SVjA=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "4ed851c979641e28597a05086332d75cdc9e395f", + "rev": "779c32a00155994c86cde8213a8dd4df139d4355", "type": "github" }, "original": { @@ -218,11 +217,11 @@ "nixpkgs": "nixpkgs_6" }, "locked": { - "lastModified": 1780169171, - "narHash": "sha256-3HBYDfBgZ+ph52HS6Ks/bMMwuh2uONIT72sZ1CtLE/s=", + "lastModified": 1784058842, + "narHash": "sha256-3u3tvbCIAid3Mv7RrJx13jusIEQC/HeKYhO/SUSxR3A=", "owner": "nix-community", "repo": "NixOS-WSL", - "rev": "998b2821c30b2938637230916904ceb8757c79e8", + "rev": "24c8dc8e0f2170e1a377be24dfadc7d9d21dc1ad", "type": "github" }, "original": { @@ -234,11 +233,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1766736597, - "narHash": "sha256-BASnpCLodmgiVn0M1MU2Pqyoz0aHwar/0qLkp7CjvSQ=", + "lastModified": 1779796641, + "narHash": "sha256-ZsIrKmhp4vbBXoXXmR/tBXA/UCsAQiJL9vsgZEduhVY=", "owner": "nixos", "repo": "nixpkgs", - "rev": "f560ccec6b1116b22e6ed15f4c510997d99d5852", + "rev": "25f538306313eae3927264466c70d7001dcea1df", "type": "github" }, "original": { @@ -297,27 +296,27 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1732617236, - "narHash": "sha256-PYkz6U0bSEaEB1al7O1XsqVNeSNS+s3NVclJw7YC43w=", + "lastModified": 1782999065, + "narHash": "sha256-5Dgj5+pIQYZKrXUGaLCk7CKfN3MmpwIhO94++WVxvng=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "af51545ec9a44eadf3fe3547610a5cdd882bc34e", + "rev": "80d591ed473cfc46329932c2aadac9b435342c7c", "type": "github" }, "original": { "owner": "NixOS", + "ref": "nixos-26.05", "repo": "nixpkgs", - "rev": "af51545ec9a44eadf3fe3547610a5cdd882bc34e", "type": "github" } }, "nixpkgs_4": { "locked": { - "lastModified": 1761236834, - "narHash": "sha256-+pthv6hrL5VLW2UqPdISGuLiUZ6SnAXdd2DdUE+fV2Q=", + "lastModified": 1770107345, + "narHash": "sha256-tbS0Ebx2PiA1FRW8mt8oejR0qMXmziJmPaU1d4kYY9g=", "owner": "nixos", "repo": "nixpkgs", - "rev": "d5faa84122bc0a1fd5d378492efce4e289f8eac1", + "rev": "4533d9293756b63904b7238acb84ac8fe4c8c2c4", "type": "github" }, "original": { @@ -342,11 +341,11 @@ }, "nixpkgs_6": { "locked": { - "lastModified": 1779560665, - "narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=", + "lastModified": 1783776592, + "narHash": "sha256-UgCQzxeWI75XM8G+hPrPh+MKzEPjG3SpAj7dtqSbksA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786", + "rev": "e7a3ca8092b61ff85b6a45bf863ea2b2d6a661b3", "type": "github" }, "original": { @@ -358,11 +357,11 @@ }, "nixpkgs_7": { "locked": { - "lastModified": 1779560665, - "narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=", + "lastModified": 1784497964, + "narHash": "sha256-vlHUuqAcbcH2RKmHbPiuQzbv1pnzzavXnI62RD0bqCU=", "owner": "nixos", "repo": "nixpkgs", - "rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786", + "rev": "241313f4e8e508cb9b13278c2b0fa25b9ca27163", "type": "github" }, "original": { @@ -438,11 +437,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1766000401, - "narHash": "sha256-+cqN4PJz9y0JQXfAK5J1drd0U05D5fcAGhzhfVrDlsI=", + "lastModified": 1780220602, + "narHash": "sha256-eynAfOmbmxJnkp7YewvCEbShNnnYJ9gLLqkzsYtBPeM=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "42d96e75aa56a3f70cab7e7dc4a32868db28e8fd", + "rev": "db947814a175b7ca6ded66e21383d938df01c227", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 89241d2..48061e1 100644 --- a/flake.nix +++ b/flake.nix @@ -11,7 +11,7 @@ darwin.inputs.nixpkgs.follows = "nixpkgs"; home-manager = { - url = "github:nix-community/home-manager/release-26.05"; + url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; };