Compare commits

...

6 Commits

Author SHA1 Message Date
m3tam3re 6c6164043b +agents-lib 2026-05-31 14:38:02 +02:00
m3tam3re e02a0a29ea flake update 2026-05-31 14:12:26 +02:00
m3tam3re 831698b766 +babysitter 2026-05-29 18:34:46 +02:00
m3tam3re 336a174a17 +worktrunk +babysitter 2026-05-29 17:37:09 +02:00
m3tam3re 70562ceef2 chore: temp fix invalid Hyprland dispatchers 2026-05-18 20:15:25 +02:00
m3tm3re ef5b67c3e9 chore: +hyprland configType 2026-05-18 20:09:28 +02:00
11 changed files with 1468 additions and 49 deletions
File diff suppressed because it is too large Load Diff
Generated
+44 -26
View File
@@ -21,14 +21,31 @@
"type": "github" "type": "github"
} }
}, },
"agent-lib": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1780229583,
"narHash": "sha256-WxokKtyJ0fRiTNIaf+Tfd05GhZVsqoTP5Q0cXiNipsI=",
"path": "/home/m3tam3re/p/NIX/agent-lib",
"type": "path"
},
"original": {
"path": "/home/m3tam3re/p/NIX/agent-lib",
"type": "path"
}
},
"agents": { "agents": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1777399938, "lastModified": 1778518220,
"narHash": "sha256-xXPqUQezDdDtF8MbpZnwD1HkybOYwF92evx8rJ6OXCU=", "narHash": "sha256-6AQs9VZ0/DuD4njPbYHRE4v+SgJc6SBrGwemTWxikVc=",
"ref": "refs/heads/master", "ref": "refs/heads/master",
"rev": "9a91f1ee0cf011a7eaf1f16a9e17610b0457e055", "rev": "b6e1aaa6261c5056d024d8d4785659eaa4e675e6",
"revCount": 85, "revCount": 87,
"type": "git", "type": "git",
"url": "https://code.m3ta.dev/m3tam3re/AGENTS" "url": "https://code.m3ta.dev/m3tam3re/AGENTS"
}, },
@@ -146,11 +163,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1778503501, "lastModified": 1780099287,
"narHash": "sha256-08L/X4/do7nET4rzidJ76eV/1r+mB7DchVpdPypsghc=", "narHash": "sha256-efIPwVGtIWIjWcznhaop6XN6HxnOL8800hF6CBNvlqQ=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "85ba629c79449badf4338117c27f0ee92b4b9f1a", "rev": "7d8127d308c3fb9664f7e643eec944be74ebb37d",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -170,11 +187,11 @@
"openspec": "openspec" "openspec": "openspec"
}, },
"locked": { "locked": {
"lastModified": 1778508052, "lastModified": 1779944037,
"narHash": "sha256-kxzZvJv757TGfHReR21aX6N/jkGMWzGSy9GQEclYD4Y=", "narHash": "sha256-jO6zAJjgc9n3SeDJW1EbV6CEqOa9DK+2AhTgWc+ImHQ=",
"ref": "refs/heads/master", "ref": "refs/heads/master",
"rev": "8113723a48c4afa016881ccd5bc4be3fad2c7d5f", "rev": "ae1fb97c21b311dc03a46e8d50867048e5568c88",
"revCount": 294, "revCount": 323,
"type": "git", "type": "git",
"url": "ssh://gitea@code.m3ta.dev/m3tam3re/nixpkgs" "url": "ssh://gitea@code.m3ta.dev/m3tam3re/nixpkgs"
}, },
@@ -235,11 +252,11 @@
}, },
"nixpkgs-master": { "nixpkgs-master": {
"locked": { "locked": {
"lastModified": 1778507606, "lastModified": 1779457550,
"narHash": "sha256-6Yc2dIhijc8G+dbMNocyclxF19dUrjaT+EeXGrXmXlg=", "narHash": "sha256-yALoy2CrvwvNfwMtGZDRdc+jqVNHulyuM5iVK12lUAI=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "39a7b8d815fcc8b689d56fc4a3fa8de4ef93d169", "rev": "a9c18fd234dbe4fd8de4bac53760b785c47e94ff",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -251,11 +268,11 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1777954456, "lastModified": 1779560665,
"narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=", "narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", "rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -267,11 +284,11 @@
}, },
"nixpkgs_3": { "nixpkgs_3": {
"locked": { "locked": {
"lastModified": 1777954456, "lastModified": 1779560665,
"narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=", "narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", "rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -287,11 +304,11 @@
"nixpkgs": "nixpkgs_3" "nixpkgs": "nixpkgs_3"
}, },
"locked": { "locked": {
"lastModified": 1778506944, "lastModified": 1780228894,
"narHash": "sha256-lU0Bleh0reE+WU7j8Uiqsu6ekPav50L8sXsgOvEQS+0=", "narHash": "sha256-7u/krCQx3loaM+kNi5i4N5ZGprILDed8JOl6wFrDEqI=",
"owner": "nix-community", "owner": "nix-community",
"repo": "NUR", "repo": "NUR",
"rev": "0166493cfe4e0e9927435c1cfbf5505cfb0d10d1", "rev": "e9c97d6945177c6d9cea9e5b2f78bcbfdc3f56d2",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -308,11 +325,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1778120451, "lastModified": 1779302169,
"narHash": "sha256-MUSPD16+hoFBfQWYahtNLN2BIFEAlFFo2KNofrc947g=", "narHash": "sha256-OOSPtUXC4F2umtsZPkyWlPQxhXBsxF2vqBXLeI/lqIw=",
"owner": "Fission-AI", "owner": "Fission-AI",
"repo": "OpenSpec", "repo": "OpenSpec",
"rev": "053d8a59d587f3c027a06ad80503a6b43d4f2a92", "rev": "79303b521068c5f525ee61db06b915fc44b098f4",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -324,6 +341,7 @@
"root": { "root": {
"inputs": { "inputs": {
"agenix": "agenix", "agenix": "agenix",
"agent-lib": "agent-lib",
"home-manager": "home-manager_2", "home-manager": "home-manager_2",
"m3ta-nixpkgs": "m3ta-nixpkgs", "m3ta-nixpkgs": "m3ta-nixpkgs",
"nix-colors": "nix-colors", "nix-colors": "nix-colors",
+13 -2
View File
@@ -16,6 +16,11 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
agent-lib = {
url = "path:/home/m3tam3re/p/NIX/agent-lib";
inputs.nixpkgs.follows = "nixpkgs";
};
agenix.url = "github:ryantm/agenix"; agenix.url = "github:ryantm/agenix";
nur.url = "github:nix-community/NUR"; nur.url = "github:nix-community/NUR";
@@ -30,12 +35,18 @@
in { in {
# Home-Manager modules — import in nixos-config via: # Home-Manager modules — import in nixos-config via:
# imports = [ inputs.m3ta-home.homeManagerModules.default ]; # imports = [ inputs.m3ta-home.homeManagerModules.default ];
homeManagerModules = import ./modules { inherit inputs; selfPath = self.outPath; }; homeManagerModules = import ./modules {
inherit inputs;
selfPath = self.outPath;
};
# Library functions — use in nixos-config via: # Library functions — use in nixos-config via:
# m3ta-lib = inputs.m3ta-home.lib; # m3ta-lib = inputs.m3ta-home.lib;
# imports = [ (m3ta-lib.mkHome { ... }) ]; # imports = [ (m3ta-lib.mkHome { ... }) ];
lib = import ./lib {inherit inputs; selfPath = self.outPath;}; lib = import ./lib {
inherit inputs;
selfPath = self.outPath;
};
# Overlays (re-exports from m3ta-nixpkgs) # Overlays (re-exports from m3ta-nixpkgs)
overlays = inputs.m3ta-nixpkgs.overlays; overlays = inputs.m3ta-nixpkgs.overlays;
+3
View File
@@ -80,6 +80,9 @@ in {
in { in {
imports = imports =
[ [
# External Home Manager modules required by selectable profiles
inputs.agent-lib.homeManagerModules.default
# Paths module — must be first, provides m3taHome.paths.srcRoot # Paths module — must be first, provides m3taHome.paths.srcRoot
../modules/paths.nix ../modules/paths.nix
baseModule baseModule
+3
View File
@@ -13,6 +13,9 @@
in { in {
default = { default = {
imports = [ imports = [
# External modules
inputs.agent-lib.homeManagerModules.default
# Paths — must be first, provides "m3ta-home".paths.srcRoot # Paths — must be first, provides "m3ta-home".paths.srcRoot
./paths.nix ./paths.nix
+3 -2
View File
@@ -11,6 +11,7 @@ in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
wayland.windowManager.hyprland = { wayland.windowManager.hyprland = {
configType = "hyprlang";
settings = { settings = {
xwayland = { xwayland = {
force_zero_scaling = true; force_zero_scaling = true;
@@ -87,7 +88,7 @@ in {
}; };
dwindle = { dwindle = {
pseudotile = true; # pseudotile = true; # TODO
preserve_split = true; preserve_split = true;
}; };
@@ -179,7 +180,7 @@ in {
"$mainMod SHIFT, P, pseudo" "$mainMod SHIFT, P, pseudo"
"$mainMod, R, exec, stt-ptt start" "$mainMod, R, exec, stt-ptt start"
"$mainMod, S, exec, stt-ptt start" "$mainMod, S, exec, stt-ptt start"
"$mainMod, J, togglesplit" # "$mainMod, J, togglesplit" # TODO
"$mainMod, h, movefocus, l" "$mainMod, h, movefocus, l"
"$mainMod, l, movefocus, r" "$mainMod, l, movefocus, r"
"$mainMod, k, movefocus, u" "$mainMod, k, movefocus, u"
@@ -0,0 +1,36 @@
{config, ...}: {
programs.agent-lib = {
enable = true;
lockFile = config."m3ta-home".paths.srcRoot + "/agent-sources.lock.json";
targets.pi.enable = true;
targets.opencode.enable = true;
profiles.default = {
sources = {
m3ta-agents = {
agents = {
all = true;
};
skills = {
all = true;
exclude = ["brainstorming" "pdf" "systematic-debugging" "xlsx"];
};
};
anthropic.skills = {
all = true;
exclude = ["skill-creator"];
};
basecamp.skills.all = true;
kestra.skills.all = true;
mattpocock.skills = {
all = true;
};
superpowers.skills = {
all = true;
};
vercel.skills.all = true;
};
};
};
}
+4 -14
View File
@@ -19,24 +19,14 @@
}; };
imports = [ imports = [
# OpenCode and Pi agent configurations # OpenCode, Pi, and Babysitter agent configurations
./agents-lib.nix
./babysitter.nix
./opencode.nix ./opencode.nix
./pi.nix ./pi.nix
]; ];
coding.agents.skills = { coding.agents.babysitter.enable = true;
agentsInput = inputs.agents;
externalSkills = [
{
src = inputs.skills-anthropic;
selectSkills = ["pdf" "docx" "frontend-design"];
}
{src = inputs.skills-superpowers;}
{src = inputs.skills-vercel;}
{src = inputs.skills-basecamp;}
{src = inputs.skills-kestra;}
];
};
programs.mcp = { programs.mcp = {
enable = true; enable = true;
+142
View File
@@ -0,0 +1,142 @@
# Babysitter user profile for Pi/agent workflows.
{
config,
lib,
...
}: let
cfg = config.coding.agents.babysitter;
defaultTimestamp = "2026-05-29T00:00:00.000Z";
defaultUserProfile = {
name = config.home.username;
specialties = [
{
domain = "declarative-system-configuration";
subdomains = ["nix" "home-manager" "agents"];
}
];
expertiseLevels = {};
goals = [
{
id = "goal-agents-declarative-profile";
description = "Keep Babysitter user preferences declarative and reproducible across systems.";
category = "agents";
priority = "medium";
status = "active";
}
];
preferences = {
verbosity = "concise";
autonomyLevel = "semi-autonomous";
riskTolerance = "conservative";
};
toolPreferences = {
packageManagers = ["nix"];
languages = ["nix"];
operatingSystem = "nixos";
};
breakpointTolerance = {
global = "moderate";
skipBreakpointsForKnownPatterns = false;
alwaysBreakOn = ["destructive-operations" "secrets" "external-publication"];
};
communicationStyle = {
tone = "technical";
language = "en";
useEmojis = false;
explanationDepth = "brief";
preferredResponseFormat = "markdown";
};
experience = {};
installedPlugins = ["babysitter-pi"];
installedSkills = ["babysit" "call" "plan" "resume" "doctor" "yolo"];
installedAgents = [];
createdAt = defaultTimestamp;
updatedAt = defaultTimestamp;
version = 1;
};
effectiveProfile = lib.recursiveUpdate cfg.profile cfg.profileOverrides;
profileJsonTarget = "${cfg.profileDirectory}/user-profile.json";
profileMarkdownTarget = "${cfg.profileDirectory}/user-profile.md";
profilePreferences = effectiveProfile.preferences or {};
profileBreakpointTolerance = effectiveProfile.breakpointTolerance or {};
listMarkdown = values:
lib.concatMapStringsSep "\n" (value: "- ${toString value}") values;
specialtyDomains = map (specialty: specialty.domain or "unspecified") (effectiveProfile.specialties or []);
profileMarkdown = ''
# Babysitter User Profile
This file is generated by Home Manager from `coding.agents.babysitter`.
- Name: ${effectiveProfile.name or "unspecified"}
- Breakpoint tolerance: ${profileBreakpointTolerance.global or "unspecified"}
- Autonomy level: ${profilePreferences.autonomyLevel or "unspecified"}
- Risk tolerance: ${profilePreferences.riskTolerance or "unspecified"}
## Specialties
${listMarkdown specialtyDomains}
## Installed Babysitter Pi Skills
${listMarkdown (effectiveProfile.installedSkills or [])}
'';
in {
options.coding.agents.babysitter = {
enable = lib.mkEnableOption "Babysitter user profile for Pi/agent workflows";
profileDirectory = lib.mkOption {
type = lib.types.str;
default = ".a5c";
description = ''
Home-relative directory where Babysitter reads the user profile.
Babysitter Pi documents the user profile at ~/.a5c/user-profile.json.
'';
};
profile = lib.mkOption {
type = lib.types.attrsOf lib.types.anything;
default = defaultUserProfile;
description = "Complete non-secret Babysitter user profile JSON.";
};
profileOverrides = lib.mkOption {
type = lib.types.attrsOf lib.types.anything;
default = {};
description = ''
Recursive overrides merged into the default Babysitter user profile.
Keep this non-secret; the result is written into the Nix store.
'';
};
};
config = lib.mkIf cfg.enable {
assertions = [
{
assertion = cfg.profileDirectory != "" && !lib.hasPrefix "/" cfg.profileDirectory;
message = "coding.agents.babysitter.profileDirectory must be a non-empty home-relative path.";
}
{
assertion = effectiveProfile ? name && builtins.isString effectiveProfile.name;
message = "coding.agents.babysitter profile must include a string name.";
}
{
assertion = effectiveProfile ? specialties && builtins.isList effectiveProfile.specialties;
message = "coding.agents.babysitter profile must include a specialties list.";
}
{
assertion = effectiveProfile ? breakpointTolerance && effectiveProfile.breakpointTolerance ? global;
message = "coding.agents.babysitter profile must include breakpointTolerance.global.";
}
];
home.file = {
"${profileJsonTarget}".text = builtins.toJSON effectiveProfile + "\n";
"${profileMarkdownTarget}".text = profileMarkdown;
};
};
}
+6 -5
View File
@@ -4,8 +4,8 @@
agentsInput = inputs.agents; agentsInput = inputs.agents;
modelOverrides = { modelOverrides = {
chiron = "minimax/MiniMax-M2.7"; chiron = "openai-codex/gpt-5.5";
chiron-forge = "minimax/MiniMax-M2.7"; chiron-forge = "openai-codex/gpt-5.5";
}; };
# Coding rules for Pi agent # Coding rules for Pi agent
@@ -34,6 +34,7 @@
settings = { settings = {
packages = [ packages = [
"npm:@dreadedzombie/pi-init" "npm:@dreadedzombie/pi-init"
"git:github.com/a5c-ai/babysitter-pi"
"npm:@plannotator/pi-extension" "npm:@plannotator/pi-extension"
"npm:@thesethrose/pi-zai-provider" "npm:@thesethrose/pi-zai-provider"
"npm:pi-agent-browser-native" "npm:pi-agent-browser-native"
@@ -49,8 +50,8 @@
"git:github.com/hk-vk/pi-connect" "git:github.com/hk-vk/pi-connect"
]; ];
defaultProvider = "minimax"; defaultProvider = "openai-codex";
defaultModel = "MiniMax-M2.7"; defaultModel = "gpt-5.5";
defaultThinkingLevel = "high"; defaultThinkingLevel = "high";
}; };
@@ -59,7 +60,7 @@
# NOTE: Local project .pi/extensions/guardrails.json can override same rule IDs. # NOTE: Local project .pi/extensions/guardrails.json can override same rule IDs.
# For immutable global policies, consider a wrapper or upstream patch. # For immutable global policies, consider a wrapper or upstream patch.
guardrails = { guardrails = {
enable = true; enable = false;
config = { config = {
enabled = true; enabled = true;
applyBuiltinDefaults = true; applyBuiltinDefaults = true;
+1
View File
@@ -9,5 +9,6 @@
jq jq
ripgrep ripgrep
tree tree
worktrunk
]; ];
} }