This commit is contained in:
Matthew Bessette
2026-07-20 11:07:44 -04:00
parent e54f392c4a
commit e50ca8089d
8 changed files with 144 additions and 69 deletions
+21
View File
@@ -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.
+21
View File
@@ -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.
+17 -1
View File
@@ -1,8 +1,21 @@
{ pkgs, inputs, ... }: { { pkgs, inputs, ... }: {
nixpkgs.config.allowUnfree = true; 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; ids.gids.nixbld = 350;
security.pam.services.sudo_local.touchIdAuth = true; security.pam.services.sudo_local.touchIdAuth = true;
# 1Password SSH Socket # 1Password SSH Socket
environment.variables.SSH_AUTH_SOCK = "~/Library/Group Containers/2BU8OCWD5C.com.1password/t/agent.sock"; environment.variables.SSH_AUTH_SOCK = "~/Library/Group Containers/2BU8OCWD5C.com.1password/t/agent.sock";
@@ -63,7 +76,10 @@
"1password-cli" "1password-cli"
"bruno" "bruno"
"claude"
"claude-code"
"docker-desktop" "docker-desktop"
"super-productivity"
"kopiaui" "kopiaui"
"libreoffice" "libreoffice"
"obsidian" "obsidian"
+7 -2
View File
@@ -38,6 +38,7 @@ in
## Tooling ## Tooling
fd fd
granted granted
ttyd
] ++ [ ] ++ [
oldPkgs.nodejs_22 oldPkgs.nodejs_22
oldPkgs.yarn oldPkgs.yarn
@@ -59,9 +60,8 @@ in
bbenoist.nix bbenoist.nix
eamodio.gitlens eamodio.gitlens
graphql.vscode-graphql-syntax graphql.vscode-graphql-syntax
graphql.vscode-graphql
hashicorp.terraform hashicorp.terraform
mechatroner.rainbow-csv
mermaidchart.vscode-mermaid-chart
ms-python.debugpy ms-python.debugpy
ms-python.python ms-python.python
ms-python.vscode-pylance ms-python.vscode-pylance
@@ -96,6 +96,7 @@ in
]; ];
initContent = '' 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 export SSH_AUTH_SOCK=~/Library/Group\ Containers/2BUA8C4S2C.com.1password/t/agent.sock
# Auto-allow direnv for directories with flake.nix # Auto-allow direnv for directories with flake.nix
@@ -126,6 +127,7 @@ in
}; };
home.sessionVariables = { home.sessionVariables = {
CLAUDE_CONFIG_DIR = "${config.home.homeDirectory}/.config/claude";
# Points to the Homebrew location mentioned in your caveat # Points to the Homebrew location mentioned in your caveat
JAVA_HOME = "/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home"; JAVA_HOME = "/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home";
NPM_CONFIG_PREFIX = "${config.home.homeDirectory}/.npm-global"; 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/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"; 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."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; programs.tmux.enable = true;
+5
View File
@@ -0,0 +1,5 @@
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"theme": "dark",
"agent": "plan"
}
+29 -21
View File
@@ -2,38 +2,42 @@
"$schema": "https://opencode.ai/config.json", "$schema": "https://opencode.ai/config.json",
"model": "github-copilot/claude-sonnet-4.6", "model": "github-copilot/claude-sonnet-4.6",
"instructions": [], "instructions": [],
"plugin": ["opencode-copilot-1m"],
"provider": {}, "provider": {},
"lsp": true, "lsp": true,
"permission": {
"external_directory": {
"~/Projects/**": "allow",
"/tmp": "allow"
}
},
"agent": { "agent": {
"plan": { "plan": {
"mode": "primary", "mode": "primary",
"model": "github-copilot/claude-sonnet-4.6", "model": "github-copilot/claude-opus-4.8-1m",
"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.", "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": { "permission": { "edit": "allow", "bash": "allow" }
"edit": "deny", },
"bash": "deny", "execute": {
"subagent": "allow" "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": { "build": {
"mode": "primary", "model": "github-copilot/claude-sonnet-4.6-1m",
"model": "github-copilot/claude-sonnet-4.6", "temperature": 0.2,
"permission": { "permission": { "edit": "allow", "bash": "allow" }
"edit": "allow",
"bash": "allow"
}
},
"explore": {
"model": "github-copilot/claude-haiku-4.5"
}, },
"general": { "general": {
"mode": "subagent", "mode": "subagent",
"model": "github-copilot/claude-haiku-4.5", "model": "github-copilot/claude-haiku-4.5",
"description": "A fresh-context, general-purpose agent for executing individual units of multi-step tasks.", "temperature": 0.1,
"permission": { "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.",
"edit": "allow", "permission": { "edit": "allow", "bash": "allow" }
"bash": "allow" },
} "explore": {
"model": "github-copilot/claude-haiku-4.5"
} }
}, },
"autoupdate": false, "autoupdate": false,
@@ -44,6 +48,10 @@
"figma": { "figma": {
"type": "remote", "type": "remote",
"url": "http://127.0.0.1:3845/mcp" "url": "http://127.0.0.1:3845/mcp"
},
"ios-simulator": {
"type": "local",
"command": ["npx", "-y", "ios-simulator-mcp"]
} }
} }
} }
Generated
+43 -44
View File
@@ -8,11 +8,11 @@
"treefmt-nix": "treefmt-nix" "treefmt-nix": "treefmt-nix"
}, },
"locked": { "locked": {
"lastModified": 1766810506, "lastModified": 1782994178,
"narHash": "sha256-I4BxozsEu205tA7jazufztI8ZQ5p7hcCnjqrSKPz9nI=", "narHash": "sha256-VGc3/2fe6hnOmNSLlOygEAbeS69v7A7rjKDKRzAgE2Q=",
"owner": "hraban", "owner": "hraban",
"repo": "cl-nix-lite", "repo": "cl-nix-lite",
"rev": "038e341cede255a83a8f04af114dc95717461d32", "rev": "eb584721e5e799bafe0c6210a8a1a398f90e8ac0",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -28,11 +28,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1779036909, "lastModified": 1784500460,
"narHash": "sha256-zXcwYQGCT6pzinK+1dBB2ekTVtfxGZAapb3Evdcu4fY=", "narHash": "sha256-UvORnAxTRHax7RG74W8Z2t4GvIkX6AjJ5kk0QlwZomo=",
"owner": "lnl7", "owner": "lnl7",
"repo": "nix-darwin", "repo": "nix-darwin",
"rev": "56c666e108467d87d13508936aade6d567f2a501", "rev": "57a3171f94705599a2499248ca5758d5eb47c0e0",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -45,11 +45,11 @@
"flake-compat": { "flake-compat": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1730663653, "lastModified": 1766808011,
"narHash": "sha256-kFCUWettiFHDIqxCWWQ9qY8pVh+Lj+XL0Giyy/kdomg=", "narHash": "sha256-s83BS0abtIj7vzUf8JE0209KphfHA6qRw/92D9k/F+0=",
"owner": "hraban", "owner": "hraban",
"repo": "flake-compat", "repo": "flake-compat",
"rev": "e5b16676185cb7548581c852f51ce7f3a49bba5e", "rev": "6e0aafdc4c4c2043c66f756d5045374b42184fc5",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -120,16 +120,15 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1781981105, "lastModified": 1784546264,
"narHash": "sha256-/1nNBbA7PrSQpTc9Qazkhl4kIPg+TNl0CjxS3UQJKlw=", "narHash": "sha256-jxVr5EHMYAOkFvS2k0abIvt6NqyshyWmiHHzV17sT2g=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "7bfff44b465909f69a442701293bc0badcf476dc", "rev": "e3dea8e4792b09a6c0eb5836b0284ad05b1acba0",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nix-community", "owner": "nix-community",
"ref": "release-26.05",
"repo": "home-manager", "repo": "home-manager",
"type": "github" "type": "github"
} }
@@ -144,11 +143,11 @@
"treefmt-nix": "treefmt-nix_2" "treefmt-nix": "treefmt-nix_2"
}, },
"locked": { "locked": {
"lastModified": 1766810876, "lastModified": 1783182903,
"narHash": "sha256-VPElWFQIiP31lXQXEom+L4sl85alZpZn33O4hewsP9k=", "narHash": "sha256-7IteXipJZfFepi5zakxe0jQ5i3vRBQguk0+Gtte1Fu4=",
"owner": "hraban", "owner": "hraban",
"repo": "mac-app-util", "repo": "mac-app-util",
"rev": "4747968574ea58512c5385466400b2364c85d2d0", "rev": "039f33deef21782d4db97087f426504951239887",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -180,11 +179,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1780289349, "lastModified": 1784518658,
"narHash": "sha256-WtFLQ7R2bErvItKRgkYXqsm0s/cvDnx9fF4XniD3QxQ=", "narHash": "sha256-XzsY3mSStyY1OEEQvYg7Mj8YTAaxz7FFbVRa5xlm40g=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nix-vscode-extensions", "repo": "nix-vscode-extensions",
"rev": "f4e7a3b814e1df64804cc211f657e65a1e618695", "rev": "e6d84a0cde8a08f33e962d1a347d2aa8688b2e99",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -198,11 +197,11 @@
"nixpkgs": "nixpkgs_5" "nixpkgs": "nixpkgs_5"
}, },
"locked": { "locked": {
"lastModified": 1780310866, "lastModified": 1784310968,
"narHash": "sha256-fPBRVf6A5xlACYcOI59shGrjURuvwu0lRsDoSCEXt/I=", "narHash": "sha256-rkSPTePrKqs4dg+i7ZFCq93+HrClac6oSwXX927SVjA=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixos-hardware", "repo": "nixos-hardware",
"rev": "4ed851c979641e28597a05086332d75cdc9e395f", "rev": "779c32a00155994c86cde8213a8dd4df139d4355",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -218,11 +217,11 @@
"nixpkgs": "nixpkgs_6" "nixpkgs": "nixpkgs_6"
}, },
"locked": { "locked": {
"lastModified": 1780169171, "lastModified": 1784058842,
"narHash": "sha256-3HBYDfBgZ+ph52HS6Ks/bMMwuh2uONIT72sZ1CtLE/s=", "narHash": "sha256-3u3tvbCIAid3Mv7RrJx13jusIEQC/HeKYhO/SUSxR3A=",
"owner": "nix-community", "owner": "nix-community",
"repo": "NixOS-WSL", "repo": "NixOS-WSL",
"rev": "998b2821c30b2938637230916904ceb8757c79e8", "rev": "24c8dc8e0f2170e1a377be24dfadc7d9d21dc1ad",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -234,11 +233,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1766736597, "lastModified": 1779796641,
"narHash": "sha256-BASnpCLodmgiVn0M1MU2Pqyoz0aHwar/0qLkp7CjvSQ=", "narHash": "sha256-ZsIrKmhp4vbBXoXXmR/tBXA/UCsAQiJL9vsgZEduhVY=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "f560ccec6b1116b22e6ed15f4c510997d99d5852", "rev": "25f538306313eae3927264466c70d7001dcea1df",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -297,27 +296,27 @@
}, },
"nixpkgs_3": { "nixpkgs_3": {
"locked": { "locked": {
"lastModified": 1732617236, "lastModified": 1782999065,
"narHash": "sha256-PYkz6U0bSEaEB1al7O1XsqVNeSNS+s3NVclJw7YC43w=", "narHash": "sha256-5Dgj5+pIQYZKrXUGaLCk7CKfN3MmpwIhO94++WVxvng=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "af51545ec9a44eadf3fe3547610a5cdd882bc34e", "rev": "80d591ed473cfc46329932c2aadac9b435342c7c",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "NixOS", "owner": "NixOS",
"ref": "nixos-26.05",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "af51545ec9a44eadf3fe3547610a5cdd882bc34e",
"type": "github" "type": "github"
} }
}, },
"nixpkgs_4": { "nixpkgs_4": {
"locked": { "locked": {
"lastModified": 1761236834, "lastModified": 1770107345,
"narHash": "sha256-+pthv6hrL5VLW2UqPdISGuLiUZ6SnAXdd2DdUE+fV2Q=", "narHash": "sha256-tbS0Ebx2PiA1FRW8mt8oejR0qMXmziJmPaU1d4kYY9g=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "d5faa84122bc0a1fd5d378492efce4e289f8eac1", "rev": "4533d9293756b63904b7238acb84ac8fe4c8c2c4",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -342,11 +341,11 @@
}, },
"nixpkgs_6": { "nixpkgs_6": {
"locked": { "locked": {
"lastModified": 1779560665, "lastModified": 1783776592,
"narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=", "narHash": "sha256-UgCQzxeWI75XM8G+hPrPh+MKzEPjG3SpAj7dtqSbksA=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786", "rev": "e7a3ca8092b61ff85b6a45bf863ea2b2d6a661b3",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -358,11 +357,11 @@
}, },
"nixpkgs_7": { "nixpkgs_7": {
"locked": { "locked": {
"lastModified": 1779560665, "lastModified": 1784497964,
"narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=", "narHash": "sha256-vlHUuqAcbcH2RKmHbPiuQzbv1pnzzavXnI62RD0bqCU=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786", "rev": "241313f4e8e508cb9b13278c2b0fa25b9ca27163",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -438,11 +437,11 @@
"nixpkgs": "nixpkgs_4" "nixpkgs": "nixpkgs_4"
}, },
"locked": { "locked": {
"lastModified": 1766000401, "lastModified": 1780220602,
"narHash": "sha256-+cqN4PJz9y0JQXfAK5J1drd0U05D5fcAGhzhfVrDlsI=", "narHash": "sha256-eynAfOmbmxJnkp7YewvCEbShNnnYJ9gLLqkzsYtBPeM=",
"owner": "numtide", "owner": "numtide",
"repo": "treefmt-nix", "repo": "treefmt-nix",
"rev": "42d96e75aa56a3f70cab7e7dc4a32868db28e8fd", "rev": "db947814a175b7ca6ded66e21383d938df01c227",
"type": "github" "type": "github"
}, },
"original": { "original": {
+1 -1
View File
@@ -11,7 +11,7 @@
darwin.inputs.nixpkgs.follows = "nixpkgs"; darwin.inputs.nixpkgs.follows = "nixpkgs";
home-manager = { home-manager = {
url = "github:nix-community/home-manager/release-26.05"; url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };