From 275d15626d29b383a1cdad7ef6bf656bf66fc630 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Sat, 26 Sep 2026 21:52:14 +0200 Subject: [PATCH] Add example consumer flakes --- examples/basic/flake.nix | 74 ++++++++++++++++ examples/basic/skills/code-review/SKILL.md | 11 +++ examples/basic/skills/ripgrep-search/SKILL.md | 11 +++ examples/multi-account/flake.nix | 84 +++++++++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 examples/basic/flake.nix create mode 100644 examples/basic/skills/code-review/SKILL.md create mode 100644 examples/basic/skills/ripgrep-search/SKILL.md create mode 100644 examples/multi-account/flake.nix diff --git a/examples/basic/flake.nix b/examples/basic/flake.nix new file mode 100644 index 0000000000000000000000000000000000000000..0e0129c2c323afdf1a9cc10b3089f7667a3cc22f --- /dev/null +++ b/examples/basic/flake.nix @@ -0,0 +1,74 @@ +{ + description = "agent-environments example: one environment with instructions and skills"; + + inputs = { + # In your own flake: github:/agent-environments + agent-environments.url = "path:../.."; + nixpkgs.follows = "agent-environments/nixpkgs"; + }; + + outputs = + { agent-environments, nixpkgs, ... }: + let + forAllSystems = nixpkgs.lib.genAttrs [ + "x86_64-linux" + "aarch64-linux" + "x86_64-darwin" + "aarch64-darwin" + ]; + inherit (agent-environments.lib) mkEnvironment mkSkill mkSkillModule; + in + { + packages = forAllSystems ( + system: + let + pkgs = nixpkgs.legacyPackages.${system}; + + ripgrep-search = mkSkill { + inherit pkgs; + name = "ripgrep-search"; + src = ./skills/ripgrep-search; + runtimeInputs = [ pkgs.ripgrep ]; + }; + # Depends on ripgrep-search: enabling code-review links both skills. + code-review = mkSkill { + inherit pkgs; + name = "code-review"; + src = ./skills/code-review; + skills = [ ripgrep-search ]; + }; + + env = mkEnvironment { + inherit pkgs; + modules = [ + (mkSkillModule ripgrep-search) + (mkSkillModule code-review) + { + claude.enable = true; + codex.enable = true; + + modules.skills.code-review.enable = true; + + instructions.style.text = '' + # Style + - Prefer small, focused commits. + - Explain *why* in commit messages. + ''; + + claude.settings.includeCoAuthoredBy = false; + codex.settings.approval_policy = "on-request"; + + launchers = { + claude-basic.agent = "claude"; + codex-basic.agent = "codex"; + }; + } + ]; + }; + in + { + default = env.package; + } + ); + }; +} diff --git a/examples/basic/skills/code-review/SKILL.md b/examples/basic/skills/code-review/SKILL.md new file mode 100644 index 0000000000000000000000000000000000000000..897c1db7904f3bc219593a7a11f1706097ba7237 --- /dev/null +++ b/examples/basic/skills/code-review/SKILL.md @@ -0,0 +1,11 @@ +--- +name: code-review +description: Use when asked to review a change - a checklist for correctness-first reviews. +--- + +# Code review + +1. Read the diff, then find the callers of every changed function + (see the ripgrep-search skill). +2. Look for correctness bugs first, style issues last. +3. Report each finding with a file, a line and a concrete failure scenario. diff --git a/examples/basic/skills/ripgrep-search/SKILL.md b/examples/basic/skills/ripgrep-search/SKILL.md new file mode 100644 index 0000000000000000000000000000000000000000..0cd63a250b33d0b8b5c3ed702a3d21ff459837e6 --- /dev/null +++ b/examples/basic/skills/ripgrep-search/SKILL.md @@ -0,0 +1,11 @@ +--- +name: ripgrep-search +description: Use when searching a codebase for symbols, strings or files - covers fast ripgrep invocations. +--- + +# Searching with ripgrep + +- `rg -n 'pattern'` searches recursively and prints line numbers. +- `rg -l 'pattern'` lists only the matching files. +- `rg --files -g '*.nix'` lists files by glob without searching their contents. +- `rg -w name` matches whole words only. diff --git a/examples/multi-account/flake.nix b/examples/multi-account/flake.nix new file mode 100644 index 0000000000000000000000000000000000000000..0070f43e60b1db724c6663e248bc9046066774f7 --- /dev/null +++ b/examples/multi-account/flake.nix @@ -0,0 +1,84 @@ +{ + description = "agent-environments example: several logins and several environments"; + + inputs = { + # In your own flake: github:/agent-environments + agent-environments.url = "path:../.."; + nixpkgs.follows = "agent-environments/nixpkgs"; + }; + + outputs = + { agent-environments, nixpkgs, ... }: + let + forAllSystems = nixpkgs.lib.genAttrs [ + "x86_64-linux" + "aarch64-linux" + "x86_64-darwin" + "aarch64-darwin" + ]; + inherit (agent-environments.lib) mkEnvironment; + + # Shared by both environments. + common = { + claude.enable = true; + instructions.common.text = '' + Always run the test suite before claiming a task is done. + ''; + }; + in + { + packages = forAllSystems ( + system: + let + pkgs = nixpkgs.legacyPackages.${system}; + + # One environment, three launchers. Each launcher id gets its own state + # dir (~/.local/agent-environments/), so each one logs in separately. + main = mkEnvironment { + inherit pkgs; + modules = [ + common + { + codex.enable = true; + launchers = { + claude-work-acc.agent = "claude"; + claude-pers-acc.agent = "claude"; + codex-work-acc.agent = "codex"; + }; + } + ]; + }; + + # A different set of modules with its own launcher and login. + review = mkEnvironment { + inherit pkgs; + modules = [ + common + { + instructions.review = { + order = 2000; + text = "You only review code. Never edit files."; + }; + claude.settings.permissions.deny = [ + "Edit" + "Write" + ]; + launchers.claude-review.agent = "claude"; + } + ]; + }; + in + { + main = main.package; + review = review.package; + default = pkgs.symlinkJoin { + name = "agent-environments"; + paths = [ + main.package + review.package + ]; + }; + } + ); + }; +}