chore: clean claude

This commit is contained in:
Bogdan Buduroiu 2026-08-10 14:17:53 +03:00
commit a886f57073
Signed by: bogdan
GPG key ID: F71EF75A4C09A095
8 changed files with 198 additions and 339 deletions

View file

@ -1,23 +0,0 @@
---
name: OpenSpec: Apply
description: Implement an approved OpenSpec change and keep tasks in sync.
category: OpenSpec
tags: [openspec, apply]
---
<!-- OPENSPEC:START -->
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory—run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
**Steps**
Track these steps as TODOs and complete them one by one.
1. Read `changes/<id>/proposal.md`, `design.md` (if present), and `tasks.md` to confirm scope and acceptance criteria.
2. Work through tasks sequentially, keeping edits minimal and focused on the requested change.
3. Confirm completion before updating statuses—make sure every item in `tasks.md` is finished.
4. Update the checklist after all work is done so each task is marked `- [x]` and reflects reality.
5. Reference `openspec list` or `openspec show <item>` when additional context is required.
**Reference**
- Use `openspec show <id> --json --deltas-only` if you need additional context from the proposal while implementing.
<!-- OPENSPEC:END -->

View file

@ -1,27 +0,0 @@
---
name: OpenSpec: Archive
description: Archive a deployed OpenSpec change and update specs.
category: OpenSpec
tags: [openspec, archive]
---
<!-- OPENSPEC:START -->
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory—run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
**Steps**
1. Determine the change ID to archive:
- If this prompt already includes a specific change ID (for example inside a `<ChangeId>` block populated by slash-command arguments), use that value after trimming whitespace.
- If the conversation references a change loosely (for example by title or summary), run `openspec list` to surface likely IDs, share the relevant candidates, and confirm which one the user intends.
- Otherwise, review the conversation, run `openspec list`, and ask the user which change to archive; wait for a confirmed change ID before proceeding.
- If you still cannot identify a single change ID, stop and tell the user you cannot archive anything yet.
2. Validate the change ID by running `openspec list` (or `openspec show <id>`) and stop if the change is missing, already archived, or otherwise not ready to archive.
3. Run `openspec archive <id> --yes` so the CLI moves the change and applies spec updates without prompts (use `--skip-specs` only for tooling-only work).
4. Review the command output to confirm the target specs were updated and the change landed in `changes/archive/`.
5. Validate with `openspec validate --strict` and inspect with `openspec show <id>` if anything looks off.
**Reference**
- Use `openspec list` to confirm change IDs before archiving.
- Inspect refreshed specs with `openspec list --specs` and address any validation issues before handing off.
<!-- OPENSPEC:END -->

View file

@ -1,27 +0,0 @@
---
name: OpenSpec: Proposal
description: Scaffold a new OpenSpec change and validate strictly.
category: OpenSpec
tags: [openspec, change]
---
<!-- OPENSPEC:START -->
**Guardrails**
- Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
- Keep changes tightly scoped to the requested outcome.
- Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory—run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
- Identify any vague or ambiguous details and ask the necessary follow-up questions before editing files.
**Steps**
1. Review `openspec/project.md`, run `openspec list` and `openspec list --specs`, and inspect related code or docs (e.g., via `rg`/`ls`) to ground the proposal in current behaviour; note any gaps that require clarification.
2. Choose a unique verb-led `change-id` and scaffold `proposal.md`, `tasks.md`, and `design.md` (when needed) under `openspec/changes/<id>/`.
3. Map the change into concrete capabilities or requirements, breaking multi-scope efforts into distinct spec deltas with clear relationships and sequencing.
4. Capture architectural reasoning in `design.md` when the solution spans multiple systems, introduces new patterns, or demands trade-off discussion before committing to specs.
5. Draft spec deltas in `changes/<id>/specs/<capability>/spec.md` (one folder per capability) using `## ADDED|MODIFIED|REMOVED Requirements` with at least one `#### Scenario:` per requirement and cross-reference related capabilities when relevant.
6. Draft `tasks.md` as an ordered list of small, verifiable work items that deliver user-visible progress, include validation (tests, tooling), and highlight dependencies or parallelizable work.
7. Validate with `openspec validate <id> --strict` and resolve every issue before sharing the proposal.
**Reference**
- Use `openspec show <id> --json --deltas-only` or `openspec show <spec> --type spec` to inspect details when validation fails.
- Search existing requirements with `rg -n "Requirement:|Scenario:" openspec/specs` before writing new ones.
- Explore the codebase with `rg <keyword>`, `ls`, or direct file reads so proposals align with current implementation realities.
<!-- OPENSPEC:END -->

View file

@ -1,8 +1,6 @@
{
"permissions": {
"allow": [
"Bash(openspec list:*)",
"Bash(openspec validate:*)",
"Bash(nmcli device:*)",
"Bash(nmcli connection show:*)",
"Bash(iw dev:*)",

501
flake.lock generated
View file

@ -20,11 +20,11 @@
]
},
"locked": {
"lastModified": 1784368054,
"narHash": "sha256-zF1iJkBQSDWmRO4/LEeHR1SpKY0lqZaxkoQJpPS9K9U=",
"lastModified": 1785877886,
"narHash": "sha256-H2CrAlJD9FsUbSEIhPVK3IyVjnK0vSxPruBef17GcBs=",
"owner": "hyprwm",
"repo": "aquamarine",
"rev": "9b5f14d9483445e766294eb8fbe0b8f370269ed0",
"rev": "1a10fe26a9f7d989c359e6a9ea61aa2e44d06c36",
"type": "github"
},
"original": {
@ -114,10 +114,7 @@
"devenv",
"git-hooks"
],
"nixpkgs": [
"devenv",
"nixpkgs"
]
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1777487137,
@ -167,11 +164,11 @@
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1784939196,
"narHash": "sha256-wY6Lll/lmIh2icBNoviibNwdrbhUQwdS7J92VIvdAxw=",
"lastModified": 1786318641,
"narHash": "sha256-XtGARxGaiWgeWDvg3D3gVmynCtVnoBsEh/hQm8oVLe0=",
"owner": "cachix",
"repo": "devenv",
"rev": "60b80be9e10ea07ff79c44a39741a75afd74f6a9",
"rev": "4158f6bffa1ac70104e390f8b5b5f59b3a23cbb0",
"type": "github"
},
"original": {
@ -202,7 +199,7 @@
},
"elephant": {
"inputs": {
"nixpkgs": "nixpkgs",
"nixpkgs": "nixpkgs_2",
"systems": "systems"
},
"locked": {
@ -244,11 +241,11 @@
"firefox-gnome-theme": {
"flake": false,
"locked": {
"lastModified": 1779670703,
"narHash": "sha256-UdfMivNMwCCqQsYDg5pSz8X2IOaOrIZLIIy+Bg3CO2o=",
"lastModified": 1783570805,
"narHash": "sha256-ptl5aRlCv9/uRSv2u8Hq8UFVFeZ6Q/bT049bpqNgc3w=",
"owner": "rafaelmardojai",
"repo": "firefox-gnome-theme",
"rev": "942159e73e40bf785816f7f1f5feed9ef3d7c8f9",
"rev": "5602ed62d638142c1ab31dccd01dfbfb28841225",
"type": "github"
},
"original": {
@ -333,11 +330,11 @@
]
},
"locked": {
"lastModified": 1782949081,
"narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=",
"lastModified": 1785627969,
"narHash": "sha256-4dtXQk/NMePegK/nWp5NSeuZKLATItOq61lpEvmXqGw=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e",
"rev": "427bf4bd9435fdf21321c8cc628c24efc14c0f7a",
"type": "github"
},
"original": {
@ -375,11 +372,11 @@
]
},
"locked": {
"lastModified": 1778716662,
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
"lastModified": 1782949081,
"narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
"rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e",
"type": "github"
},
"original": {
@ -392,24 +389,6 @@
"inputs": {
"systems": "systems_4"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_2": {
"inputs": {
"systems": "systems_5"
},
"locked": {
"lastModified": 1710146030,
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
@ -424,9 +403,9 @@
"type": "github"
}
},
"flake-utils_3": {
"flake-utils_2": {
"inputs": {
"systems": "systems_9"
"systems": "systems_8"
},
"locked": {
"lastModified": 1731533236,
@ -523,11 +502,11 @@
]
},
"locked": {
"lastModified": 1784350909,
"narHash": "sha256-ZWyzLbS1yKUTeFJLmdVuWNnHttL333/ldJbEE+KzCrM=",
"lastModified": 1785119570,
"narHash": "sha256-Rgs2xKnGLFWQscxUaXX07oyZeuMDOHEbqDOsgliLFGM=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "4ce190229c73d44536caa7072f6308fb2d8feeb3",
"rev": "d4fd24667c8cbef124bb70a20380cab75ec8474d",
"type": "github"
},
"original": {
@ -544,11 +523,11 @@
]
},
"locked": {
"lastModified": 1784913159,
"narHash": "sha256-JWq0BfjO4ktpH5USfQNQzdvHpIDT8fSKD5K7LvdMRFs=",
"lastModified": 1786286733,
"narHash": "sha256-7dN93WKkEERgutPtTjK7SY3ZarO2LAU33A1+vKu+7cc=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "079a3b5d1aa6a719920a51316253b7d6dd22738d",
"rev": "367f7ef80856d18438953d54dda235d42a46ba31",
"type": "github"
},
"original": {
@ -623,11 +602,11 @@
]
},
"locked": {
"lastModified": 1782566056,
"narHash": "sha256-haEZcHzYrePnjFOYSWTbxm/Nrla0aPslJfmvdCvqtVc=",
"lastModified": 1785855875,
"narHash": "sha256-dpW3UKG2NTboxxYGzOX4nZiH8YI++CpgosHmVaquOEI=",
"owner": "hyprwm",
"repo": "hyprgraphics",
"rev": "c6e7b9f673f4360bc813d3dc75028f75ee88d3f8",
"rev": "8699c38f0e4a1ca3bfc84f84ba020509ced1f133",
"type": "github"
},
"original": {
@ -658,11 +637,11 @@
]
},
"locked": {
"lastModified": 1784891518,
"narHash": "sha256-MbOcUbVyZ8bfhe5rKKzax2VVBgLXZOJJHlQnOXJKwhM=",
"lastModified": 1785077099,
"narHash": "sha256-Wi8kgoWStgYopfjEmHZWsAG7Gkghr9RGFjYLVmxSKpQ=",
"owner": "hyprwm",
"repo": "hypridle",
"rev": "6c119c280e19522b61d28e74626ef2134acd39d5",
"rev": "e5c01af0842bd66617f7004568df9406111d6e80",
"type": "github"
},
"original": {
@ -682,17 +661,17 @@
"hyprutils": "hyprutils",
"hyprwayland-scanner": "hyprwayland-scanner_2",
"hyprwire": "hyprwire",
"nixpkgs": "nixpkgs_2",
"nixpkgs": "nixpkgs_3",
"pre-commit-hooks": "pre-commit-hooks",
"systems": "systems_2",
"xdph": "xdph"
},
"locked": {
"lastModified": 1784897480,
"narHash": "sha256-m8Pl1y/VbL45ZzZtitjVEZWo20L3rQ7Egyzjn+b+hoA=",
"lastModified": 1786298417,
"narHash": "sha256-nJZCCA1YXQqnLQSNVrtY+IxK0pnVLV5qJSw79axtpCo=",
"owner": "hyprwm",
"repo": "hyprland",
"rev": "566ff8fa7208f7027cbc21b0b208d121ee80eb38",
"rev": "f7daeb7f79d48745a2894367e9e73229ac162abe",
"type": "github"
},
"original": {
@ -755,11 +734,11 @@
]
},
"locked": {
"lastModified": 1784196523,
"narHash": "sha256-ahtKMGXFJdlQNhatQm1+BBU/pGfGYnAqQt3vWvq4p8s=",
"lastModified": 1784533903,
"narHash": "sha256-Ee78BRFi+MrmgHmmW+2dZUEI1R3cssEzza0ar3fsNX8=",
"owner": "hyprwm",
"repo": "hyprland-guiutils",
"rev": "a6ccb6cb112ed5a244c0191fb972347ecfa893e0",
"rev": "a16ad89ed5fb4192c966018a80c652de8d96f748",
"type": "github"
},
"original": {
@ -872,11 +851,11 @@
]
},
"locked": {
"lastModified": 1784390127,
"narHash": "sha256-JNDoV4tUGL6mXfXMqOjBwUl3Cg1YNIBbAPbpTYY/BpI=",
"lastModified": 1786114356,
"narHash": "sha256-LmuZPFUQ4DA1TvCg4eqqqlOiElhAbcqUj0UuBz3QzHE=",
"owner": "hyprwm",
"repo": "hyprlock",
"rev": "b222d9b1f87e980cac379371df57913a53b99d7f",
"rev": "1f337a4713e981e75ad4912cbbb5c3dccb7b6717",
"type": "github"
},
"original": {
@ -1038,11 +1017,11 @@
]
},
"locked": {
"lastModified": 1784323413,
"narHash": "sha256-XnAVV+H4f8Xdv0yZcSwJ5kCjLyE8fHxPeLX6a3HSrAU=",
"lastModified": 1785843795,
"narHash": "sha256-DFc543bQN94Kt+RsD3Hiu7qCA1uKdqaFJKPMjzANKGU=",
"owner": "hyprwm",
"repo": "hyprutils",
"rev": "5f03477ab3a005ff27c527486f551883535aea2f",
"rev": "5a7b8cf221914ce4714407950e4ffbdddcd8b66f",
"type": "github"
},
"original": {
@ -1167,11 +1146,11 @@
]
},
"locked": {
"lastModified": 1778410714,
"narHash": "sha256-o6RzFj4nJXaPRY7EM01siuCQeT41RfwwmcmFQqwFJJg=",
"lastModified": 1784465130,
"narHash": "sha256-ak5fWEmWZyax8trkV4aphdvjrbUiSyl6qS+y5GwBS7Y=",
"owner": "hyprwm",
"repo": "hyprwire",
"rev": "85148a8e612808cf5ddb25d0b3c5840f3498a7dc",
"rev": "7d935bb54674aa0fbd327d2a6888bd0630079ed0",
"type": "github"
},
"original": {
@ -1212,7 +1191,7 @@
"impermanence": {
"inputs": {
"home-manager": "home-manager_2",
"nixpkgs": "nixpkgs_3"
"nixpkgs": "nixpkgs_4"
},
"locked": {
"lastModified": 1769548169,
@ -1231,14 +1210,14 @@
"jovian-nixos": {
"inputs": {
"nix-github-actions": "nix-github-actions",
"nixpkgs": "nixpkgs_4"
"nixpkgs": "nixpkgs_5"
},
"locked": {
"lastModified": 1784705208,
"narHash": "sha256-G1JLSGuSf8G2yZUxwLAKH6buVqoTWPbfpiVLzSNq6ak=",
"lastModified": 1786221710,
"narHash": "sha256-aanL3SfzU8+p2HeD3AaPVU23Kd2XpPibQVC7zFlu3hw=",
"owner": "Jovian-Experiments",
"repo": "Jovian-NixOS",
"rev": "cf9383788741bdabcb13f5c323a978fd63e681e8",
"rev": "57773e5c9efe27d298d732a2a061a380a5194090",
"type": "github"
},
"original": {
@ -1254,11 +1233,11 @@
]
},
"locked": {
"lastModified": 1784960882,
"narHash": "sha256-PZolNfxnM/JBhnxMYlL+YRSOrxlhj2PdGUbGpXTKnfs=",
"lastModified": 1786346262,
"narHash": "sha256-j55omm1pMpkDjFYAkc5aKgSAUtN/IGJOZO77q9bBO0A=",
"owner": "natsukium",
"repo": "mcp-servers-nix",
"rev": "6e8e9c7b75265426a7bf67065150933c5b59a71e",
"rev": "17c6dd73bb2b710de28f639510a14e4de87b392c",
"type": "github"
},
"original": {
@ -1293,11 +1272,11 @@
]
},
"locked": {
"lastModified": 1782407171,
"narHash": "sha256-xem+4ncdQCTFJsQ4PrVuyVmi3j4w/Yqg298hBUzVejA=",
"lastModified": 1786294306,
"narHash": "sha256-WcqKvA7f7TGrlDVd69T1UXUqVXJ+wfoRbO+mg5L7/Rc=",
"owner": "cachix",
"repo": "nix",
"rev": "782ac1b155679b065ec945ae50d0fa1d495883b7",
"rev": "59407321a92f7d34d4a53e38959294007c0bc37a",
"type": "github"
},
"original": {
@ -1338,11 +1317,11 @@
"systems": "systems_3"
},
"locked": {
"lastModified": 1784949919,
"narHash": "sha256-itGqjPYHqEUqabXbQb+eHguk1c6rBTRGZS4KImp45kM=",
"lastModified": 1786328466,
"narHash": "sha256-LrBZgQA3j50IGWGTH1GXvkv/kNuZA3k0vlBMvvzJvj4=",
"owner": "Infinidoge",
"repo": "nix-minecraft",
"rev": "a58c1fa23ec0273eb085be1e7874e964aa3cd34f",
"rev": "71e57519f7acdeadc062fa101dd704841a8072b4",
"type": "github"
},
"original": {
@ -1353,7 +1332,6 @@
},
"nix4nvchad": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": [
"nixpkgs"
],
@ -1362,11 +1340,11 @@
]
},
"locked": {
"lastModified": 1783219716,
"narHash": "sha256-zghUlZ2ktV+WM+KFypPpxM8dqNgQFhwQohyaei7nE4w=",
"lastModified": 1786241713,
"narHash": "sha256-+Ujhw7RDws25N6EYy/G4764k6T0hpGNqEup/bGTQrkc=",
"owner": "nix-community",
"repo": "nix4nvchad",
"rev": "4273259c390e4100d12d98fb8aafc421c5e50625",
"rev": "a6277b06ed0de32831ce8e49686fd3a06201a23b",
"type": "github"
},
"original": {
@ -1403,14 +1381,14 @@
},
"nixos-hardware": {
"inputs": {
"nixpkgs": "nixpkgs_5"
"nixpkgs": "nixpkgs_6"
},
"locked": {
"lastModified": 1784723954,
"narHash": "sha256-1CfD8ZUjCkTgjsneLZ/lxCHhgDfqxxE7/GX0MmsgiqA=",
"lastModified": 1785232496,
"narHash": "sha256-65EQYIRRpTdpH8lUiB6Mvo5uBkG60aBIzAJuALfx+O0=",
"owner": "NixOS",
"repo": "nixos-hardware",
"rev": "a017f5b72210026af5b3ac5949f08d94380a6fbd",
"rev": "2e790b0a6be8ec2b76174ac0931b8ff11919ec98",
"type": "github"
},
"original": {
@ -1422,11 +1400,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1764242076,
"narHash": "sha256-sKoIWfnijJ0+9e4wRvIgm/HgE27bzwQxcEmo2J/gNpI=",
"lastModified": 1772624091,
"narHash": "sha256-QKyJ0QGWBn6r0invrMAK8dmJoBYWoOWy7lN+UHzW1jc=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "2fad6eac6077f03fe109c4d4eb171cf96791faa4",
"rev": "80bdc1e5ce51f56b19791b52b2901187931f5353",
"type": "github"
},
"original": {
@ -1438,11 +1416,11 @@
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1784796856,
"narHash": "sha256-wWFrV5/Qbm+lyt5x20E/bSbfJiGKMo4RCxZV8cl/WZI=",
"lastModified": 1786106723,
"narHash": "sha256-zDSUbpoeo/9ZmD2+wXnzxoo1+uhL8vxc0b8yuYMKYq0=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "e2587caef70cea85dd97d7daab492899902dbf5d",
"rev": "f13ff45afd1bb73e640eaa08a7066dbed07e3238",
"type": "github"
},
"original": {
@ -1452,116 +1430,7 @@
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1784356753,
"narHash": "sha256-12KrbMiWLcf8m7pCvAtZh1ZrgF85ZXDXvfR/fWTKy84=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "61b7c44c4073f0b827768aff0049561b5110ea5a",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1768564909,
"narHash": "sha256-Kell/SpJYVkHWMvnhqJz/8DqQg2b6PguxVWOuadbHCc=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "e4bae1bd10c9c57b2cf517953ab70060a828ee6f",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_4": {
"locked": {
"lastModified": 1784497964,
"narHash": "sha256-vlHUuqAcbcH2RKmHbPiuQzbv1pnzzavXnI62RD0bqCU=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "241313f4e8e508cb9b13278c2b0fa25b9ca27163",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_5": {
"locked": {
"lastModified": 1767892417,
"narHash": "sha256-8bW3q88CEg2u4hSP66Vf4lpbLonHz7hqDNBMcCY7E9U=",
"rev": "3497aa5c9457a9d88d71fa93a4a8368816fbeeba",
"type": "tarball",
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre924538.3497aa5c9457/nixexprs.tar.xz"
},
"original": {
"type": "tarball",
"url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz"
}
},
"nixpkgs_6": {
"locked": {
"lastModified": 1784856561,
"narHash": "sha256-J+Bx1Z6Oeoj2FgnBhRMKyUhhtDoOpTgXYaVLZpDjW4A=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "597283ad8aa0b331c788e97c4c262d58877074ef",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-26.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_7": {
"locked": {
"lastModified": 1710272261,
"narHash": "sha256-g0bDwXFmTE7uGDOs9HcJsfLFhH7fOsASbAuOzDC+fhQ=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "0ad13a6833440b8e238947e47bea7f11071dc2b2",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_8": {
"locked": {
"lastModified": 1775710090,
"narHash": "sha256-ar3rofg+awPB8QXDaFJhJ2jJhu+KqN/PRCXeyuXR76E=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "4c1018dae018162ec878d42fec712642d214fdfa",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_9": {
"nixpkgs_10": {
"locked": {
"lastModified": 1783279667,
"narHash": "sha256-/NAkDSsve+GNM0Bt6tleJdCGfsTlK89nPjkVOzZMo0s=",
@ -1577,6 +1446,131 @@
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1764242076,
"narHash": "sha256-sKoIWfnijJ0+9e4wRvIgm/HgE27bzwQxcEmo2J/gNpI=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "2fad6eac6077f03fe109c4d4eb171cf96791faa4",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1786106723,
"narHash": "sha256-zDSUbpoeo/9ZmD2+wXnzxoo1+uhL8vxc0b8yuYMKYq0=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "f13ff45afd1bb73e640eaa08a7066dbed07e3238",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_4": {
"locked": {
"lastModified": 1768564909,
"narHash": "sha256-Kell/SpJYVkHWMvnhqJz/8DqQg2b6PguxVWOuadbHCc=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "e4bae1bd10c9c57b2cf517953ab70060a828ee6f",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_5": {
"locked": {
"lastModified": 1785828668,
"narHash": "sha256-8fsyqeO+mJqvIzeO4xIpgJe/f7MTbbVTEC6RT6WSXNs=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "e72e4f299401a3689d4b3d5fc6496b11db7064eb",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_6": {
"locked": {
"lastModified": 1767892417,
"narHash": "sha256-8bW3q88CEg2u4hSP66Vf4lpbLonHz7hqDNBMcCY7E9U=",
"rev": "3497aa5c9457a9d88d71fa93a4a8368816fbeeba",
"type": "tarball",
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre924538.3497aa5c9457/nixexprs.tar.xz"
},
"original": {
"type": "tarball",
"url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz"
}
},
"nixpkgs_7": {
"locked": {
"lastModified": 1786201459,
"narHash": "sha256-CiOTEjmwAmG2AWnaIno9YaCJJmpca2FXPhMAsnrolCg=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "8b8c811c7c2541c30382c5de7ed26be055569c60",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-26.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_8": {
"locked": {
"lastModified": 1710272261,
"narHash": "sha256-g0bDwXFmTE7uGDOs9HcJsfLFhH7fOsASbAuOzDC+fhQ=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "0ad13a6833440b8e238947e47bea7f11071dc2b2",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_9": {
"locked": {
"lastModified": 1775710090,
"narHash": "sha256-ar3rofg+awPB8QXDaFJhJ2jJhu+KqN/PRCXeyuXR76E=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "4c1018dae018162ec878d42fec712642d214fdfa",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nur": {
"inputs": {
"flake-parts": "flake-parts_3",
@ -1585,11 +1579,11 @@
]
},
"locked": {
"lastModified": 1784962228,
"narHash": "sha256-2PBl8oZ3cI7q9MpfghQmV8TD9s+s6aroAypN9E6x3OE=",
"lastModified": 1786348032,
"narHash": "sha256-6Y+c9wO1x1fT6t4ZnKopwSh2Hkx8ku7gi7jn/7DcFBY=",
"owner": "nix-community",
"repo": "NUR",
"rev": "e00a2fd1078ab5968ccf9552baa1e578f06ab291",
"rev": "e92146dbbce828e4d40c4208c5fb70707ee95bc2",
"type": "github"
},
"original": {
@ -1610,11 +1604,11 @@
]
},
"locked": {
"lastModified": 1779766384,
"narHash": "sha256-P7Ohnlq8b8b2fU+Sgkrej7LBTM60LBTkHleLuYzmLmU=",
"lastModified": 1785549842,
"narHash": "sha256-DCwBZmGsySF7oKGTRgEv2HvpxVXkHT+38VhTM76k0B4=",
"owner": "nix-community",
"repo": "NUR",
"rev": "57800b7ab648725ccd33551d01484ee14952ad3f",
"rev": "a9f987b57594e845e3e5cdd423b9a70846d70308",
"type": "github"
},
"original": {
@ -1638,9 +1632,9 @@
"openapi-tui": {
"inputs": {
"fenix": "fenix",
"flake-utils": "flake-utils_2",
"nixpkgs": "nixpkgs_7",
"systems": "systems_6"
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs_8",
"systems": "systems_5"
},
"locked": {
"lastModified": 1778749215,
@ -1697,7 +1691,7 @@
"nix-minecraft": "nix-minecraft",
"nix4nvchad": "nix4nvchad",
"nixos-hardware": "nixos-hardware",
"nixpkgs": "nixpkgs_6",
"nixpkgs": "nixpkgs_7",
"nixpkgs-unstable": "nixpkgs-unstable",
"nur": "nur",
"nvchad-config": "nvchad-config",
@ -1816,18 +1810,18 @@
"nixpkgs"
],
"nur": "nur_2",
"systems": "systems_7",
"systems": "systems_6",
"tinted-kitty": "tinted-kitty",
"tinted-schemes": "tinted-schemes",
"tinted-tmux": "tinted-tmux",
"tinted-zed": "tinted-zed"
},
"locked": {
"lastModified": 1784060273,
"narHash": "sha256-14rIy2kTs5CufmDpgJrwkR+7IzuCAXyLYDAx6ixfRFc=",
"lastModified": 1786131255,
"narHash": "sha256-TktYK5NhNlUB/1r3CciMbza0mWwBR8o3nu9nAPFWpyo=",
"owner": "nix-community",
"repo": "stylix",
"rev": "2245fa9e16034149b6501834b99863a486e94725",
"rev": "350298a8cfda10544952857f82323f7bf9c0e42d",
"type": "github"
},
"original": {
@ -1899,35 +1893,20 @@
},
"systems_5": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"lastModified": 1689347949,
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"repo": "default-linux",
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"repo": "default-linux",
"type": "github"
}
},
"systems_6": {
"locked": {
"lastModified": 1689347949,
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
"owner": "nix-systems",
"repo": "default-linux",
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default-linux",
"type": "github"
}
},
"systems_7": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
@ -1942,7 +1921,7 @@
"type": "github"
}
},
"systems_8": {
"systems_7": {
"locked": {
"lastModified": 1689347949,
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
@ -1957,7 +1936,7 @@
"type": "github"
}
},
"systems_9": {
"systems_8": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
@ -1991,11 +1970,11 @@
"tinted-schemes": {
"flake": false,
"locked": {
"lastModified": 1777806186,
"narHash": "sha256-PDF0/wObw4nIsSBeXVYLsloXOiphXCgIdsrNcVXguKs=",
"lastModified": 1785153830,
"narHash": "sha256-fNdfCTeCXU3tZG3TMincd+u68qBHQgCr2Ljr/M1mWP0=",
"owner": "tinted-theming",
"repo": "schemes",
"rev": "0c94645546f4f3ddac77a1a5fce54eb95bf50795",
"rev": "9bd28ed313560db3c5b605c63bc4e309e78e3fc8",
"type": "github"
},
"original": {
@ -2007,11 +1986,11 @@
"tinted-tmux": {
"flake": false,
"locked": {
"lastModified": 1778379944,
"narHash": "sha256-wPDFzMGSlARlw0Sfsn48Q2+jPSfk6N0Ng6BC/d+7Q24=",
"lastModified": 1785031658,
"narHash": "sha256-mZp9O2LjzdMzlqQF3l3fjqsuPBzXy+1qTfBEUGjTlpk=",
"owner": "tinted-theming",
"repo": "tinted-tmux",
"rev": "fe0203a198690e71a5ff11e08812a4673de3678d",
"rev": "5d2c67f61ea7af36f16865ab6d541cdba41dc257",
"type": "github"
},
"original": {
@ -2023,11 +2002,11 @@
"tinted-zed": {
"flake": false,
"locked": {
"lastModified": 1778378178,
"narHash": "sha256-OXPXRIQgGwV77HjYRryOHguh4ALX96jkg+tseLkGgHA=",
"lastModified": 1785030526,
"narHash": "sha256-klZf8UviewRkxuu74Bhbq6tqy7oxebQC7UVRWbbtQxU=",
"owner": "tinted-theming",
"repo": "base16-zed",
"rev": "9cd816033ff969415b190722cddf134e78a5665f",
"rev": "16f5a8adf4a6b1310d0a61ab172de963e8f76a02",
"type": "github"
},
"original": {
@ -2063,8 +2042,8 @@
"elephant": [
"elephant"
],
"nixpkgs": "nixpkgs_8",
"systems": "systems_8"
"nixpkgs": "nixpkgs_9",
"systems": "systems_7"
},
"locked": {
"lastModified": 1784217994,
@ -2108,11 +2087,11 @@
]
},
"locked": {
"lastModified": 1784371182,
"narHash": "sha256-S8A1lezEalltWcCp3gAic5lssS0xTSISK6fKODefhOk=",
"lastModified": 1786032767,
"narHash": "sha256-C5K27sF/jaQe1BgB1/575r01oTAvw6mrDWPS1qUl6X0=",
"owner": "hyprwm",
"repo": "xdg-desktop-portal-hyprland",
"rev": "08d99f727944dd15e4740090305e31c5fb92a50a",
"rev": "688feb3d88404598f12440a668136e74044391de",
"type": "github"
},
"original": {
@ -2123,16 +2102,16 @@
},
"yazi": {
"inputs": {
"flake-utils": "flake-utils_3",
"nixpkgs": "nixpkgs_9",
"flake-utils": "flake-utils_2",
"nixpkgs": "nixpkgs_10",
"rust-overlay": "rust-overlay_2"
},
"locked": {
"lastModified": 1784950759,
"narHash": "sha256-yW/qQsRbFXK3YvyNipoGuFJvjeLZ6YvAq5SjF3fNkXI=",
"lastModified": 1786167302,
"narHash": "sha256-z3TsqVoVlqa8QgxdA5Khh4RNZlykwj0cmUed/TNAlNo=",
"owner": "sxyazi",
"repo": "yazi",
"rev": "2c3f174eb5ed9536aa090f2056c6af1ef30323c5",
"rev": "9d5541d627bc65bbabae6f8b354db6af84b534f0",
"type": "github"
},
"original": {

View file

@ -6,39 +6,50 @@ let
# the settings.json registration graph that actually makes them fire.
claudeHooks = import ./hooks.nix { inherit pkgs; };
# Only available on hosts that declare the secret (e.g. framework13);
# `or null` keeps eval safe on phantom/iso where it isn't set.
deepseekKeyPath = config.sops.secrets.deepseek_api_key.path or null;
# Second Claude account on this machine. ~/.claude stays the personal
# profile; work gets its own config dir, selected via CLAUDE_CONFIG_DIR.
#
# On Linux that env var is complete isolation — credentials live at
# <config-dir>/.credentials.json (0600), alongside sessions/, projects/,
# history.jsonl and .claude.json. (On macOS it is not: OAuth tokens go to
# the Keychain, so only settings and history separate.)
workConfigDir = ".claude-work";
# `deepseek-code`: launch the same (LSP-wrapped) claude binary but pointed at
# DeepSeek's Anthropic-compatible endpoint, with the API key read from sops
# into ANTHROPIC_AUTH_TOKEN at runtime (never baked into the Nix store).
deepseek-code = pkgs.writeShellScriptBin "deepseek-code" (''
# `claude-work`: the same binary and the same config, a different account.
#
# Execs finalPackage, NOT pkgs.claude-code. finalPackage is the module's
# wrapper, which passes `--plugin-dir <generated>` — and that generated
# plugin dir is where `mcpServers` below actually lives. Bypassing the
# wrapper silently drops every MCP server.
claude-work = pkgs.writeShellScriptBin "claude-work" ''
set -eu
'' + (if deepseekKeyPath == null then ''
echo "deepseek-code: deepseek_api_key sops secret is not configured on this host" >&2
exit 1
'' else ''
if [ ! -r "${deepseekKeyPath}" ]; then
echo "deepseek-code: cannot read DeepSeek API key at ${deepseekKeyPath}" >&2
exit 1
fi
ANTHROPIC_AUTH_TOKEN="$(${pkgs.coreutils}/bin/cat ${deepseekKeyPath})"
export ANTHROPIC_AUTH_TOKEN
export ANTHROPIC_BASE_URL="https://api.deepseek.com/anthropic"
export ANTHROPIC_MODEL="deepseek-v4-pro[1m]"
export ANTHROPIC_DEFAULT_OPUS_MODEL="deepseek-v4-pro[1m]"
export ANTHROPIC_DEFAULT_SONNET_MODEL="deepseek-v4-pro[1m]"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="deepseek-v4-flash"
export CLAUDE_CODE_SUBAGENT_MODEL="deepseek-v4-flash"
export CLAUDE_CODE_EFFORT_LEVEL="max"
exec ${pkgs.claude-code}/bin/claude "$@"
''));
export CLAUDE_CONFIG_DIR="$HOME/${workConfigDir}"
exec ${config.programs.claude-code.finalPackage}/bin/claude "$@"
'';
in
{
home.packages = [ deepseek-code ];
home.packages = [ claude-work ];
# `programs.claude-code` materialises exactly one configDir, so a session
# launched under a different CLAUDE_CONFIG_DIR would start with *nothing*
# from this repo — no secret-read-guard hook, no deny list, no NixOS
# CLAUDE.md. Mirror the same store paths into the work profile; only the
# per-account state (credentials, sessions, projects, MCP OAuth tokens)
# differs, which is the entire point of the split.
#
# settings.json is taken from the module's own generated output rather than
# rebuilt here, so hooks/permissions/plugins cannot drift between accounts.
home.file = {
"${workConfigDir}/settings.json".source =
config.home.file."${config.programs.claude-code.configDir}/settings.json".source;
"${workConfigDir}/CLAUDE.md".source = ./CLAUDE.md;
# recursive: recreate the directory and symlink each file individually,
# so the directory itself stays writable — `/agents` can still add one at
# runtime. A bare `source = ./dir` would symlink the whole read-only dir.
"${workConfigDir}/agents" = { source = ./config/agents; recursive = true; };
"${workConfigDir}/rules" = { source = ./config/rules; recursive = true; };
"${workConfigDir}/skills" = { source = ./config/skills; recursive = true; };
};
programs.claude-code = {
enable = true;
@ -95,7 +106,6 @@ in
hooks = claudeHooks.settings;
enabledPlugins = {
"superpowers@superpowers-marketplace" = true;
"frontend-design@claude-plugins-official" = true;
"gopls-lsp@claude-plugins-official" = true;
"typescript-lsp@claude-plugins-official" = true;
@ -108,12 +118,6 @@ in
url = "https://github.com/anthropics/claude-plugins-official.git";
};
};
superpowers-marketplace = {
source = {
source = "github";
repo = "obra/superpowers-marketplace";
};
};
};
permissions = {
allow = [
@ -164,13 +168,6 @@ in
defaultMode = "default";
};
env = {
# ANTHROPIC_BASE_URL = "https://api.deepseek.com/anthropic";
# ANTHROPIC_MODEL = "deepseek-v4-pro[1m]";
# ANTHROPIC_DEFAULT_OPUS_MODEL = "deepseek-v4-pro[1m]";
# ANTHROPIC_DEFAULT_SONNET_MODEL = "deepseek-v4-pro[1m]";
# ANTHROPIC_DEFAULT_HAIKU_MODEL = "deepseek-v4-flash";
# CLAUDE_CODE_SUBAGENT_MODEL = "deepseek-v4-flash";
# CLAUDE_CODE_EFFORT_LEVEL = "max";
SHELL = "fish";
API_TIMEOUT_MS = "3000000";
NIX_ENVIRONMENT = "true";

View file

@ -1,38 +0,0 @@
{ pkgs, ... }:
let
openspec = pkgs.buildNpmPackage rec {
pname = "openspec";
version = "0.14.0";
src = pkgs.fetchFromGitHub {
owner = "Fission-AI";
repo = "OpenSpec";
rev = "v${version}";
hash = "sha256-jURQ/vr1CTzyS9I9/ksyH9JL6BRi/gSmJvYhOpR6jNg=";
};
pnpmDeps = pkgs.fetchPnpmDeps {
inherit pname version src;
fetcherVersion = 3;
hash = "sha256-mTXwN6bHvQCeokRCxhlEfZ7Xof7mdQvT6qaTh61wnbs=";
};
nativeBuildInputs = with pkgs; [ nodejs pnpm ]; # pnpmConfigHook needs pnpm on PATH
npmConfigHook = pkgs.pnpmConfigHook;
npmDeps = pnpmDeps;
dontNpmPrune = true; # hangs forever on both Linux/darwin
meta = with pkgs.lib; {
description = "Spec-driven development framework for AI coding assistants";
homepage = "https://github.com/Fission-AI/OpenSpec";
license = licenses.mit;
mainProgram = "openspec";
platforms = platforms.all;
};
};
in
{
home.packages = [ openspec ];
}

View file

@ -14,7 +14,7 @@
pyright,
}:
let
version = "2.1.220";
version = "2.1.226";
# Servers the typescript-lsp / gopls-lsp / pyright-lsp plugins expect on PATH.
# nodejs backs the JS-based servers; `typescript` provides tsserver; `go`
@ -32,7 +32,7 @@ let
platforms = {
"x86_64-linux" = {
platform = "linux-x64";
hash = "sha256-Z09h8g/zBvMQDPkgDkw2xLcCeLW+8ohFSYGblCqJyGM=";
hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
};
"aarch64-linux" = {
platform = "linux-arm64";