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