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