a dotfile but it's really big
1{
2 config,
3 lib,
4 pkgs,
5 self',
6 ...
7}:
8let
9 opencodePkg = pkgs.symlinkJoin {
10 name = "opencode.wrapped";
11 paths = [ pkgs.opencode ];
12 buildInputs = [ pkgs.makeWrapper ];
13 postBuild = ''
14 wrapProgram $out/bin/opencode \
15 --set SHELL ${lib.getExe pkgs.bash}
16 '';
17 };
18
19 mergedSkills = pkgs.runCommand "strands-sops-skills-merged" { } ''
20 mkdir $out
21 cp -r ${self'.packages.strands-sops-skills}/* $out/
22 cp -r ${./skills}/* $out/
23 '';
24
25 cfg = config.dev.opencode;
26in
27lib.mkIf cfg.enable {
28 home.packages = [ self'.packages.strands-agents-sops ];
29
30 xdg.configFile."opencode/agents" = {
31 source = ./agents;
32 recursive = true;
33 };
34
35 xdg.configFile."opencode/skills" = {
36 source = mergedSkills;
37 recursive = true;
38 };
39
40 xdg.configFile."opencode/commands" = {
41 source = self'.packages.strands-sops-commands;
42 recursive = true;
43 };
44
45 xdg.configFile."opencode/AGENTS.md".source = ./AGENTS.md;
46
47 # Notifier config omitted — plugin uses all defaults.
48 # If customization is needed, add xdg.configFile."opencode/opencode-notifier.json".text = builtins.toJSON { ... };
49
50 programs.opencode = {
51 enable = true;
52 package = opencodePkg;
53 enableMcpIntegration = cfg.enableMcp;
54 settings = {
55 plugin = [ "@mohak34/opencode-notifier@latest" ];
56 inherit (cfg) theme;
57 default_agent = "orchestrator";
58 formatter = {
59 nixfmt = {
60 command = [
61 "nixfmt"
62 "-s"
63 "-w"
64 "120"
65 "$FILE"
66 ];
67 extensions = [ ".nix" ];
68 };
69 gofmt = {
70 disabled = true;
71 };
72 goimports = {
73 command = [
74 "goimports"
75 "-w"
76 "$FILE"
77 ];
78 extensions = [ ".go" ];
79 };
80 sql-formatter = {
81 command = [
82 "sql-formatter"
83 "-c"
84 (builtins.toJSON {
85 keywordCase = "upper";
86 functionCase = "upper";
87 dataTypeCase = "upper";
88 identifierCase = "lower";
89 language = "postgresql";
90 expressionWidth = 80;
91 tabWidth = 2;
92 })
93 "$FILE"
94 ];
95 extensions = [ ".sql" ];
96 };
97 topiary-nu = {
98 command = [
99 "${lib.getExe self'.packages.topiary-nu}"
100 "format"
101 "--language"
102 "nu"
103 "$FILE"
104 ];
105 extensions = [ ".nu" ];
106 };
107 };
108 permission = {
109 todoread = "deny";
110 todowrite = "deny";
111 external_directory = {
112 "~/*" = "allow"; # yolo.
113 "/tmp/*" = "allow";
114 };
115 };
116 mcp = lib.mkIf cfg.enableMcp {
117 gopls = {
118 type = "local";
119 enabled = true;
120 command = [
121 "gopls"
122 "mcp"
123 ];
124 };
125 github = {
126 type = "remote";
127 url = "https://api.githubcopilot.com/mcp/";
128 headers = {
129 Authorization = "Bearer {env:GITHUB_TOKEN}";
130 };
131 enabled = false;
132 };
133 };
134 };
135 };
136}