@sebastienrousseau/dotfiles 0.2.501 → 0.2.503

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. package/CHANGELOG.md +155 -4
  2. package/LICENSE +21 -1283
  3. package/README.md +40 -8
  4. package/docs/CONFIG_STRATEGY.md +124 -0
  5. package/docs/COPYRIGHT +1 -1
  6. package/docs/GOVERNANCE.md +98 -0
  7. package/docs/MAINTAINERS.md +41 -0
  8. package/docs/OPENCODE.md +127 -0
  9. package/docs/README.md +2 -0
  10. package/docs/STRUCTURE.md +102 -0
  11. package/docs/adr/ADR-011-nushell-tier3-keep.md +2 -2
  12. package/docs/architecture/AI_COST_OPTIMIZATION.md +143 -0
  13. package/docs/architecture/REPO_LAYOUT.md +8 -8
  14. package/docs/archive/MILESTONE_v0.2.493.md +1 -1
  15. package/docs/index.md +2 -2
  16. package/docs/interop/POWERSHELL.md +1 -1
  17. package/docs/manual/00-introduction.md +1 -1
  18. package/docs/manual/01-concepts/02-trust-model.md +1 -1
  19. package/docs/manual/03-reference/01-dot-cli.md +63 -45
  20. package/docs/manual/03-reference/02-config-files.md +2 -2
  21. package/docs/manual/03-reference/05-feature-flags.md +62 -3
  22. package/docs/manual/_toc.yml +1 -1
  23. package/docs/manual/command-index.md +72 -55
  24. package/docs/manual/index.md +66 -0
  25. package/docs/operations/CI_COMPOSITES.md +2 -2
  26. package/docs/operations/COMPLETIONS.md +2 -2
  27. package/docs/operations/COVERAGE.md +40 -6
  28. package/docs/operations/HARD_AUDIT_2026.md +631 -0
  29. package/docs/operations/MAINTENANCE.md +3 -3
  30. package/docs/operations/MANIFEST.md +127 -0
  31. package/docs/operations/REGISTRY.md +89 -0
  32. package/docs/operations/RELEASE_PIPELINE.md +130 -0
  33. package/docs/operations/RFC_v0_2_503_reorganization.md +280 -0
  34. package/docs/operations/ROADMAP_2026.md +665 -0
  35. package/docs/operations/ROADMAP_V0_2_503.md +134 -0
  36. package/docs/operations/TESTING.md +17 -0
  37. package/docs/operations/TRACEABILITY.md +9 -3
  38. package/docs/operations/VERSION_SYNC.md +4 -4
  39. package/docs/reference/POWERSHELL_PARITY.md +81 -0
  40. package/docs/registry.json +6 -0
  41. package/docs/schema/dot-env-v1.json +110 -0
  42. package/docs/security/CI_EGRESS_ALLOWLIST.md +1 -1
  43. package/docs/security/CI_PINNING.md +121 -0
  44. package/docs/security/COMMIT_SIGNING.md +138 -0
  45. package/docs/security/DEPS_DEV_EXCEPTIONS.md +2 -2
  46. package/docs/security/DISCLOSURE.md +130 -0
  47. package/docs/security/FUZZING.md +114 -0
  48. package/docs/security/INSTALL_VERIFICATION.md +2 -2
  49. package/docs/security/KEY_ROTATION.md +81 -1
  50. package/docs/security/POLICY_RELEASES.md +2 -2
  51. package/docs/security/SCORECARD.md +130 -15
  52. package/docs/security/SHELL_EXEMPTIONS.md +4 -4
  53. package/docs/security/VERIFY_RELEASE.md +201 -0
  54. package/docs/security/security-pubkey.asc +15 -0
  55. package/install.sh +67 -38
  56. package/package.json +1 -1
  57. package/scripts/README.md +123 -0
  58. package/scripts/ci/check-copyright-headers.sh +4 -93
  59. package/scripts/ci/check-shell-preamble.sh +4 -103
  60. package/scripts/ci/guard-gitleaks-checkout.sh +4 -54
  61. package/scripts/diagnostics/a2a-conformance.sh +4 -4
  62. package/scripts/diagnostics/alias-governance.sh +1 -1
  63. package/scripts/diagnostics/aliases-cheatsheet.sh +2 -2
  64. package/scripts/diagnostics/benchmark.sh +4 -4
  65. package/scripts/diagnostics/conflicts.sh +2 -2
  66. package/scripts/diagnostics/doctor-unified.sh +2 -2
  67. package/scripts/diagnostics/doctor.sh +45 -15
  68. package/scripts/diagnostics/drift-dashboard.sh +2 -2
  69. package/scripts/diagnostics/health.sh +4 -4
  70. package/scripts/diagnostics/history-analysis.sh +2 -2
  71. package/scripts/diagnostics/mcp-doctor.sh +10 -7
  72. package/scripts/diagnostics/perf.sh +4 -4
  73. package/scripts/diagnostics/scorecard.sh +4 -4
  74. package/scripts/diagnostics/security-score.sh +2 -2
  75. package/scripts/diagnostics/smoke-test.sh +2 -2
  76. package/scripts/diagnostics/snapshot.sh +2 -2
  77. package/scripts/diagnostics/verify.sh +4 -4
  78. package/scripts/diagnostics/version-locks.sh +2 -2
  79. package/scripts/diagnostics/workstation-attestation.sh +14 -14
  80. package/scripts/dot/commands/agent.sh +27 -22
  81. package/scripts/dot/commands/agents.sh +335 -0
  82. package/scripts/dot/commands/ai.sh +144 -25
  83. package/scripts/dot/commands/aliases.sh +10 -8
  84. package/scripts/dot/commands/appearance.sh +2 -2
  85. package/scripts/dot/commands/core.sh +12 -6
  86. package/scripts/dot/commands/diagnostics.sh +5 -5
  87. package/scripts/dot/commands/env-emit.sh +202 -0
  88. package/scripts/dot/commands/fleet.sh +290 -14
  89. package/scripts/dot/commands/init.sh +184 -0
  90. package/scripts/dot/commands/lint.sh +9 -4
  91. package/scripts/dot/commands/manual.sh +3 -3
  92. package/scripts/dot/commands/meta.sh +19 -10
  93. package/scripts/dot/commands/patterns.sh +2 -2
  94. package/scripts/dot/commands/registry.sh +263 -0
  95. package/scripts/dot/commands/restore.sh +4 -4
  96. package/scripts/dot/commands/secrets.sh +4 -3
  97. package/scripts/dot/commands/security.sh +2 -2
  98. package/scripts/dot/commands/tools.sh +62 -4
  99. package/scripts/dot/powershell/Dot.psm1 +199 -0
  100. package/scripts/fonts/install-nerd-fonts.sh +2 -2
  101. package/scripts/git-hooks/pre-commit-audit.sh +2 -2
  102. package/scripts/git-hooks/pre-push +13 -0
  103. package/scripts/lib/secrets_provider.sh +32 -6
  104. package/scripts/ops/ai-setup.sh +1 -1
  105. package/scripts/ops/bundle.sh +2 -2
  106. package/scripts/ops/chaos.sh +2 -2
  107. package/scripts/ops/chezmoi-apply.sh +4 -4
  108. package/scripts/ops/heal.sh +4 -4
  109. package/scripts/ops/post-apply-repair.sh +2 -2
  110. package/scripts/ops/prewarm.sh +2 -2
  111. package/scripts/ops/release.sh +4 -4
  112. package/scripts/ops/rollback.sh +18 -4
  113. package/scripts/ops/setup.sh +2 -2
  114. package/scripts/qa/check-version-consistency.sh +123 -0
  115. package/scripts/qa/coverage-baseline.sh +1 -1
  116. package/scripts/qa/docs-coverage.sh +2 -2
  117. package/scripts/qa/powershell-contract.ps1 +1 -1
  118. package/scripts/qa/scorecard-snapshot.sh +127 -0
  119. package/scripts/security/backup.sh +2 -2
  120. package/scripts/security/check-disclosure-key-expiry.sh +110 -0
  121. package/scripts/security/dns-doh.sh +4 -4
  122. package/scripts/security/encryption-check.sh +4 -4
  123. package/scripts/security/enforce-policies.sh +2 -2
  124. package/scripts/security/firewall.sh +4 -4
  125. package/scripts/security/lock-configs.sh +11 -2
  126. package/scripts/security/lock-screen.sh +4 -4
  127. package/scripts/security/manage-secrets.sh +2 -2
  128. package/scripts/security/ssh-cert.sh +2 -2
  129. package/scripts/security/telemetry-kill.sh +4 -4
  130. package/scripts/security/usb-safety.sh +4 -4
  131. package/scripts/theme/extract-heic-frames.sh +114 -0
  132. package/scripts/theme/rebuild-themes.sh +8 -1
  133. package/scripts/theme/switch.sh +13 -6
  134. package/scripts/theme/wallpaper-sync.sh +297 -93
  135. package/scripts/tuning/linux.sh +2 -2
  136. package/scripts/tuning/macos.sh +2 -2
  137. package/scripts/version-sync.sh +58 -7
  138. package/dot_config/.module-manifest.json +0 -69
  139. package/dot_config/ai/identity.md +0 -23
  140. package/dot_config/ai/patterns/architect.md +0 -16
  141. package/dot_config/ai/patterns/hardener.md +0 -15
  142. package/dot_config/ai/patterns/refactor.md +0 -15
  143. package/dot_config/aider/aider.conf.yml +0 -32
  144. package/dot_config/alacritty/alacritty.toml.tmpl +0 -55
  145. package/dot_config/ansible/ansible.cfg +0 -11
  146. package/dot_config/atuin/config.toml.tmpl +0 -47
  147. package/dot_config/bat/config +0 -23
  148. package/dot_config/brave-flags.conf.tmpl +0 -7
  149. package/dot_config/btop/btop.conf +0 -16
  150. package/dot_config/btop/themes/tokyonight.theme +0 -34
  151. package/dot_config/bun/bunfig.toml.tmpl +0 -33
  152. package/dot_config/claude/mcp_servers.json +0 -20
  153. package/dot_config/containers/containers.conf +0 -14
  154. package/dot_config/curl/dot_curlrc +0 -18
  155. package/dot_config/dlv/config.yml +0 -39
  156. package/dot_config/docker/config.json +0 -15
  157. package/dot_config/dotfiles/agent-card.json +0 -29
  158. package/dot_config/dotfiles/agent-profiles.json +0 -92
  159. package/dot_config/dotfiles/boot/README.md +0 -13
  160. package/dot_config/dotfiles/grub/README.md +0 -13
  161. package/dot_config/dotfiles/lock/README.md +0 -13
  162. package/dot_config/dotfiles/mcp-lock.json +0 -33
  163. package/dot_config/dotfiles/mcp-policy.json +0 -52
  164. package/dot_config/dotfiles/mcp-registry.json +0 -47
  165. package/dot_config/dotfiles/model-registry.json +0 -20
  166. package/dot_config/dotfiles/policy-bundles.json +0 -38
  167. package/dot_config/dotfiles/prompt-registry.json +0 -16
  168. package/dot_config/dotfiles/versions.env +0 -18
  169. package/dot_config/duf/duf.conf +0 -6
  170. package/dot_config/duti/defaults.duti +0 -5
  171. package/dot_config/emoji/emoji.txt +0 -34
  172. package/dot_config/environment.d/50-ssh-agent.conf +0 -2
  173. package/dot_config/environment.d/90-wayland.conf +0 -19
  174. package/dot_config/fastfetch/config.jsonc +0 -28
  175. package/dot_config/firefox/user.js.tmpl +0 -58
  176. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +0 -9
  177. package/dot_config/fish/completions/dot.fish.tmpl +0 -115
  178. package/dot_config/fish/conf.d/000-perf-cache.fish +0 -56
  179. package/dot_config/fish/conf.d/aliases.fish.tmpl +0 -77
  180. package/dot_config/fish/conf.d/env.fish.tmpl +0 -48
  181. package/dot_config/fish/conf.d/functions.fish.tmpl +0 -22
  182. package/dot_config/fish/conf.d/init.fish.tmpl +0 -172
  183. package/dot_config/fish/config.fish.tmpl +0 -44
  184. package/dot_config/fish/fish_plugins +0 -1
  185. package/dot_config/fish/functions/_.fish +0 -3
  186. package/dot_config/fish/functions/_cached_eval.fish +0 -131
  187. package/dot_config/fish/functions/_cached_eval_clear.fish +0 -17
  188. package/dot_config/fish/functions/als.fish +0 -46
  189. package/dot_config/fish/functions/bg-upgrade.fish +0 -7
  190. package/dot_config/fish/functions/c.fish +0 -3
  191. package/dot_config/fish/functions/cat.fish +0 -9
  192. package/dot_config/fish/functions/d.fish +0 -7
  193. package/dot_config/fish/functions/dot.fish +0 -34
  194. package/dot_config/fish/functions/h.fish +0 -3
  195. package/dot_config/fish/functions/l.fish +0 -7
  196. package/dot_config/fish/functions/la.fish +0 -7
  197. package/dot_config/fish/functions/ll.fish +0 -7
  198. package/dot_config/fish/functions/log_error.fish +0 -13
  199. package/dot_config/fish/functions/log_info.fish +0 -13
  200. package/dot_config/fish/functions/lr.fish +0 -7
  201. package/dot_config/fish/functions/lra.fish +0 -7
  202. package/dot_config/fish/functions/ls.fish +0 -7
  203. package/dot_config/fish/functions/lt.fish +0 -7
  204. package/dot_config/fish/functions/lta.fish +0 -7
  205. package/dot_config/fish/functions/notify-run.fish +0 -11
  206. package/dot_config/fish/functions/q.fish +0 -3
  207. package/dot_config/fish/functions/silent-run.fish +0 -7
  208. package/dot_config/fish/functions/yy.fish +0 -8
  209. package/dot_config/flatpak/flatpak.list +0 -4
  210. package/dot_config/fontconfig/fonts.conf.tmpl +0 -57
  211. package/dot_config/foot/foot.ini.tmpl +0 -33
  212. package/dot_config/fuzzel/fuzzel.ini.tmpl +0 -18
  213. package/dot_config/fzf/fzf.zsh +0 -48
  214. package/dot_config/gem/gemrc +0 -9
  215. package/dot_config/gh/config.yml +0 -12
  216. package/dot_config/ghostty/config.tmpl +0 -165
  217. package/dot_config/git/allowed_signers.tmpl +0 -18
  218. package/dot_config/git/attributes +0 -12
  219. package/dot_config/git/commit-template +0 -10
  220. package/dot_config/git/hooks/executable_commit-msg +0 -146
  221. package/dot_config/git/ignore +0 -27
  222. package/dot_config/gnupg/gpg-agent.conf +0 -11
  223. package/dot_config/go/golangci.yml +0 -118
  224. package/dot_config/go/gopls.json +0 -30
  225. package/dot_config/goose/config.yaml +0 -29
  226. package/dot_config/gtk-3.0/gtk.css.tmpl +0 -184
  227. package/dot_config/gtk-3.0/settings.ini.tmpl +0 -27
  228. package/dot_config/gtk-4.0/gtk.css.tmpl +0 -252
  229. package/dot_config/gtk-4.0/settings.ini.tmpl +0 -18
  230. package/dot_config/htop/htoprc +0 -20
  231. package/dot_config/inputrc +0 -2
  232. package/dot_config/ipython/profile_default/ipython_config.py +0 -19
  233. package/dot_config/just/justfile +0 -122
  234. package/dot_config/k9s/config.yaml +0 -65
  235. package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
  236. package/dot_config/kanshi/config.tmpl +0 -22
  237. package/dot_config/karabiner/karabiner.json +0 -14
  238. package/dot_config/kitty/kitty.conf.tmpl +0 -53
  239. package/dot_config/lazydocker/config.yml +0 -186
  240. package/dot_config/lazygit/config.yml +0 -35
  241. package/dot_config/mako/config +0 -47
  242. package/dot_config/mas/masapps.txt +0 -5
  243. package/dot_config/micro/settings.json +0 -3
  244. package/dot_config/mimeapps.list +0 -77
  245. package/dot_config/minikube/config.json +0 -13
  246. package/dot_config/mise/config.toml +0 -99
  247. package/dot_config/mongosh/mongoshrc.js +0 -68
  248. package/dot_config/mpv/input.conf +0 -47
  249. package/dot_config/mpv/mpv.conf +0 -47
  250. package/dot_config/mycli/myclirc +0 -67
  251. package/dot_config/nano/nanorc +0 -28
  252. package/dot_config/ncdu/config +0 -12
  253. package/dot_config/niri/config.kdl.tmpl +0 -327
  254. package/dot_config/nushell/aliases.nu +0 -18
  255. package/dot_config/nushell/cached_eval.nu +0 -80
  256. package/dot_config/nushell/completions.nu.tmpl +0 -52
  257. package/dot_config/nushell/config.nu.tmpl +0 -86
  258. package/dot_config/nushell/env.nu.tmpl +0 -102
  259. package/dot_config/nushell/functions.nu.tmpl +0 -17
  260. package/dot_config/nvim/init.lua +0 -18
  261. package/dot_config/nvim/lazy-lock.json +0 -58
  262. package/dot_config/nvim/lua/config/autocmds.lua +0 -107
  263. package/dot_config/nvim/lua/config/keymaps.lua +0 -92
  264. package/dot_config/nvim/lua/config/lazy.lua +0 -44
  265. package/dot_config/nvim/lua/config/options.lua +0 -49
  266. package/dot_config/nvim/lua/plugins/ai.lua +0 -75
  267. package/dot_config/nvim/lua/plugins/coding.lua +0 -216
  268. package/dot_config/nvim/lua/plugins/completion.lua +0 -60
  269. package/dot_config/nvim/lua/plugins/dap.lua +0 -412
  270. package/dot_config/nvim/lua/plugins/editor.lua +0 -55
  271. package/dot_config/nvim/lua/plugins/git.lua +0 -10
  272. package/dot_config/nvim/lua/plugins/lsp.lua +0 -156
  273. package/dot_config/nvim/lua/plugins/markdown.lua +0 -18
  274. package/dot_config/nvim/lua/plugins/rust.lua +0 -34
  275. package/dot_config/nvim/lua/plugins/sessions.lua +0 -33
  276. package/dot_config/nvim/lua/plugins/ui.lua +0 -509
  277. package/dot_config/paru/paru.conf +0 -10
  278. package/dot_config/pip/pip.conf.tmpl +0 -32
  279. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +0 -81
  280. package/dot_config/pueue/pueue.yml +0 -34
  281. package/dot_config/pypoetry/config.toml +0 -6
  282. package/dot_config/pyrightconfig.json +0 -5
  283. package/dot_config/raycast/README.md +0 -13
  284. package/dot_config/redis/redisclirc +0 -41
  285. package/dot_config/ripgrep/ripgreprc +0 -21
  286. package/dot_config/shell/00-core-paths.sh.tmpl +0 -134
  287. package/dot_config/shell/05-core-safety.sh +0 -48
  288. package/dot_config/shell/10-secrets.sh +0 -41
  289. package/dot_config/shell/40-fzf-defaults.sh.tmpl +0 -17
  290. package/dot_config/shell/40-ls-colors.sh +0 -49
  291. package/dot_config/shell/50-logic-functions-core.sh.tmpl +0 -11
  292. package/dot_config/shell/50-logic-functions.sh.tmpl +0 -11
  293. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +0 -65
  294. package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -121
  295. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -55
  296. package/dot_config/shell/Brewfile +0 -207
  297. package/dot_config/shell/Brewfile.cask +0 -92
  298. package/dot_config/shell/Brewfile.cli +0 -127
  299. package/dot_config/shell/README.md +0 -284
  300. package/dot_config/shell/als_data.txt.tmpl +0 -65
  301. package/dot_config/shell/custom/auto_ls.zsh +0 -20
  302. package/dot_config/shell/custom/context_suggest.zsh +0 -68
  303. package/dot_config/shell/custom/error_analysis.zsh +0 -45
  304. package/dot_config/sops/dot_sops.yaml +0 -23
  305. package/dot_config/starship.toml.tmpl +0 -202
  306. package/dot_config/swaylock/config +0 -43
  307. package/dot_config/systemd/user/dotfiles-maintenance.service +0 -8
  308. package/dot_config/systemd/user/dotfiles-maintenance.timer +0 -11
  309. package/dot_config/systemd/user/pueued.service +0 -12
  310. package/dot_config/systemd/user/ssh-agent.service +0 -12
  311. package/dot_config/task/Taskfile.yml +0 -86
  312. package/dot_config/tflint/tflint.hcl +0 -9
  313. package/dot_config/tmux/tmux.conf.tmpl +0 -223
  314. package/dot_config/topgrade.toml.tmpl +0 -54
  315. package/dot_config/user-dirs.dirs +0 -10
  316. package/dot_config/vscode/extensions.txt +0 -11
  317. package/dot_config/vscode/settings.json.tmpl +0 -82
  318. package/dot_config/waybar/config.jsonc.tmpl +0 -90
  319. package/dot_config/waybar/style.css.tmpl +0 -211
  320. package/dot_config/wezterm/wezterm.lua.tmpl +0 -64
  321. package/dot_config/wget/wgetrc +0 -12
  322. package/dot_config/xdg-desktop-portal/niri-portals.conf +0 -5
  323. package/dot_config/yarn/yarnrc.yml +0 -36
  324. package/dot_config/yazi/keymap.toml +0 -67
  325. package/dot_config/yazi/theme.toml +0 -102
  326. package/dot_config/yazi/yazi.toml +0 -40
  327. package/dot_config/zathura/zathurarc +0 -52
  328. package/dot_config/zellij/config.kdl.tmpl +0 -79
  329. package/dot_config/zsh/dot_zprofile +0 -7
  330. package/dot_config/zsh/dot_zshenv +0 -5
  331. package/dot_config/zsh/dot_zshrc.tmpl +0 -635
  332. package/dot_config/zsh/rc.d/00-alias-shims.zsh +0 -99
  333. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -18
  334. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
  335. package/dot_config/zsh/rc.d/20-zinit.zsh +0 -65
  336. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -214
  337. package/dot_config/zsh/rc.d/40-bell.zsh +0 -20
  338. package/dot_config/zsh/rc.d/50-login-fortune.zsh +0 -9
  339. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +0 -32
  340. package/dot_local/bin/executable_ai-update +0 -195
  341. package/dot_local/bin/executable_ai_core +0 -152
  342. package/dot_local/bin/executable_antigravity +0 -11
  343. package/dot_local/bin/executable_b64 +0 -84
  344. package/dot_local/bin/executable_bm +0 -79
  345. package/dot_local/bin/executable_cb +0 -39
  346. package/dot_local/bin/executable_dot +0 -596
  347. package/dot_local/bin/executable_dot-ai +0 -36
  348. package/dot_local/bin/executable_dot-bootstrap +0 -77
  349. package/dot_local/bin/executable_dot-launch-or-focus +0 -52
  350. package/dot_local/bin/executable_dot-load-benchmark +0 -31
  351. package/dot_local/bin/executable_dot-load-benchmark-pty +0 -77
  352. package/dot_local/bin/executable_dot-theme-sync +0 -952
  353. package/dot_local/bin/executable_dot_completion +0 -57
  354. package/dot_local/bin/executable_dtags +0 -28
  355. package/dot_local/bin/executable_epoch +0 -67
  356. package/dot_local/bin/executable_extract +0 -41
  357. package/dot_local/bin/executable_gbd +0 -52
  358. package/dot_local/bin/executable_gd +0 -42
  359. package/dot_local/bin/executable_git-ai-commit +0 -175
  360. package/dot_local/bin/executable_git-ai-diff +0 -169
  361. package/dot_local/bin/executable_gl +0 -101
  362. package/dot_local/bin/executable_hash +0 -161
  363. package/dot_local/bin/executable_hashsum +0 -160
  364. package/dot_local/bin/executable_hex +0 -115
  365. package/dot_local/bin/executable_jsonv +0 -78
  366. package/dot_local/bin/executable_jwt +0 -94
  367. package/dot_local/bin/executable_kill-port +0 -75
  368. package/dot_local/bin/executable_lorem +0 -118
  369. package/dot_local/bin/executable_mkscript +0 -35
  370. package/dot_local/bin/executable_monitor +0 -56
  371. package/dot_local/bin/executable_myip +0 -51
  372. package/dot_local/bin/executable_notify +0 -24
  373. package/dot_local/bin/executable_open +0 -38
  374. package/dot_local/bin/executable_pw +0 -27
  375. package/dot_local/bin/executable_rec-start +0 -46
  376. package/dot_local/bin/executable_rec-stop +0 -35
  377. package/dot_local/bin/executable_regex +0 -132
  378. package/dot_local/bin/executable_start-niri +0 -8
  379. package/dot_local/bin/executable_tmux-sessionizer +0 -314
  380. package/dot_local/bin/executable_tour +0 -177
  381. package/dot_local/bin/executable_up +0 -23
  382. package/dot_local/bin/executable_update +0 -142
  383. package/dot_local/bin/executable_uuid +0 -87
  384. package/dot_local/bin/executable_win +0 -32
  385. package/dot_local/bin/executable_yamlv +0 -57
  386. package/dot_local/share/bash-completion/completions/dot +0 -72
  387. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  388. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  389. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  390. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  391. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  392. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  393. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  394. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  395. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  396. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  397. package/dot_local/share/man/man1/dot.1 +0 -149
  398. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +0 -64
  399. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +0 -18
  400. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +0 -13
  401. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +0 -6
  402. package/dot_local/share/zsh/completions/.keep +0 -0
  403. package/dot_local/share/zsh/completions/_dot +0 -283
  404. package/scripts/ci/check-dangerous-chmod.sh +0 -19
  405. package/scripts/ci/check-deps-dev.sh +0 -236
  406. package/scripts/ci/check-insecure-tls.sh +0 -61
  407. package/scripts/ci/check-regression-traceability.sh +0 -67
  408. package/scripts/ci/install-chezmoi-verified.sh +0 -64
  409. package/scripts/ci/run-coverage.sh +0 -362
  410. package/scripts/ci/validate-chezmoidata.sh +0 -25
  411. package/scripts/ci/validate-ci-config.sh +0 -224
  412. package/scripts/docs/build-manual.sh +0 -883
  413. package/scripts/docs/check-manual.sh +0 -213
  414. package/scripts/dot/lib/bento.sh +0 -50
  415. package/scripts/dot/lib/log.sh +0 -200
  416. package/scripts/dot/lib/platform.sh +0 -99
  417. package/scripts/dot/lib/ui.sh +0 -518
  418. package/scripts/dot/lib/utils.sh +0 -377
  419. package/scripts/maintenance/check-updates.sh +0 -131
  420. package/scripts/release/package-policy-bundles.sh +0 -125
@@ -31,9 +31,9 @@
31
31
  set -euo pipefail
32
32
 
33
33
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
34
- # shellcheck source=../dot/lib/ui.sh
34
+ # shellcheck source=../../lib/dot/ui.sh
35
35
  # shellcheck disable=SC1091
36
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
36
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
37
37
 
38
38
  # Parse arguments
39
39
  STRICT_MODE=0
@@ -93,14 +93,17 @@ log_warn() {
93
93
  }
94
94
 
95
95
  MCP_CONFIG="${MCP_CONFIG:-$HOME/.config/claude/mcp_servers.json}"
96
- if [[ ! -f "$MCP_CONFIG" && -f "$HOME/.dotfiles/dot_config/claude/mcp_servers.json" ]]; then
97
- MCP_CONFIG="$HOME/.dotfiles/dot_config/claude/mcp_servers.json"
96
+ if [[ ! -f "$MCP_CONFIG" ]]; then
97
+ for cand in "$HOME/.dotfiles/defaults/dot_config/claude/mcp_servers.json" \
98
+ "$HOME/.dotfiles/dot_config/claude/mcp_servers.json"; do
99
+ [[ -f "$cand" ]] && MCP_CONFIG="$cand" && break
100
+ done
98
101
  fi
99
102
 
100
103
  REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
101
- MCP_POLICY_CONFIG="${MCP_POLICY_CONFIG:-$REPO_ROOT/dot_config/dotfiles/mcp-policy.json}"
102
- MCP_LOCK_CONFIG="${MCP_LOCK_CONFIG:-$REPO_ROOT/dot_config/dotfiles/mcp-lock.json}"
103
- MCP_REGISTRY_CONFIG="${MCP_REGISTRY_CONFIG:-$REPO_ROOT/dot_config/dotfiles/mcp-registry.json}"
104
+ MCP_POLICY_CONFIG="${MCP_POLICY_CONFIG:-$REPO_ROOT/defaults/dot_config/dotfiles/mcp-policy.json}"
105
+ MCP_LOCK_CONFIG="${MCP_LOCK_CONFIG:-$REPO_ROOT/defaults/dot_config/dotfiles/mcp-lock.json}"
106
+ MCP_REGISTRY_CONFIG="${MCP_REGISTRY_CONFIG:-$REPO_ROOT/defaults/dot_config/dotfiles/mcp-registry.json}"
104
107
 
105
108
  if [[ "$JSON_MODE" -ne 1 ]]; then
106
109
  ui_init
@@ -9,12 +9,12 @@ _cleanup_files=()
9
9
  trap 'rm -f "${_cleanup_files[@]}"' EXIT
10
10
 
11
11
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
- # shellcheck source=../dot/lib/ui.sh
12
+ # shellcheck source=../../lib/dot/ui.sh
13
13
  # shellcheck disable=SC1091
14
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
15
- # shellcheck source=../dot/lib/log.sh
14
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
15
+ # shellcheck source=../../lib/dot/log.sh
16
16
  # shellcheck disable=SC1091
17
- source "$SCRIPT_DIR/../dot/lib/log.sh"
17
+ source "$SCRIPT_DIR/../../lib/dot/log.sh"
18
18
  export DOT_COMMAND="perf"
19
19
 
20
20
  ui_init
@@ -6,12 +6,12 @@
6
6
  set -euo pipefail
7
7
 
8
8
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
- # shellcheck source=../dot/lib/ui.sh
9
+ # shellcheck source=../../lib/dot/ui.sh
10
10
  # shellcheck disable=SC1091
11
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
12
- # shellcheck source=../dot/lib/log.sh
11
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
12
+ # shellcheck source=../../lib/dot/log.sh
13
13
  # shellcheck disable=SC1091
14
- source "$SCRIPT_DIR/../dot/lib/log.sh"
14
+ source "$SCRIPT_DIR/../../lib/dot/log.sh"
15
15
  export DOT_COMMAND="scorecard"
16
16
 
17
17
  ui_init
@@ -30,9 +30,9 @@ set -euo pipefail
30
30
  set +o xtrace 2>/dev/null || true
31
31
 
32
32
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
33
- # shellcheck source=../dot/lib/ui.sh
33
+ # shellcheck source=../../lib/dot/ui.sh
34
34
  # shellcheck disable=SC1091
35
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
35
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
36
36
 
37
37
  # Parse arguments
38
38
  VERBOSE=true
@@ -5,9 +5,9 @@
5
5
  set -euo pipefail
6
6
 
7
7
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
- # shellcheck source=../dot/lib/ui.sh
8
+ # shellcheck source=../../lib/dot/ui.sh
9
9
  # shellcheck disable=SC1091
10
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
10
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
11
11
  ui_init
12
12
 
13
13
  ui_header "Dotfiles Smoke Tests"
@@ -6,9 +6,9 @@
6
6
  set -euo pipefail
7
7
 
8
8
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
- # shellcheck source=../dot/lib/ui.sh
9
+ # shellcheck source=../../lib/dot/ui.sh
10
10
  # shellcheck disable=SC1091
11
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
11
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
12
12
 
13
13
  ui_init
14
14
 
@@ -6,9 +6,9 @@
6
6
  set -euo pipefail
7
7
 
8
8
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
- # shellcheck source=../dot/lib/ui.sh
9
+ # shellcheck source=../../lib/dot/ui.sh
10
10
  # shellcheck disable=SC1091
11
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
11
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
12
12
 
13
13
  ui_init
14
14
  ui_dot_banner "Diagnostics"
@@ -43,8 +43,8 @@ resolve_dot_bin() {
43
43
  elif [[ -d "$HOME/.local/share/chezmoi" ]]; then
44
44
  src_dir="$HOME/.local/share/chezmoi"
45
45
  fi
46
- if [[ -n "$src_dir" && -x "$src_dir/dot_local/bin/executable_dot" ]]; then
47
- printf "%s\n" "$src_dir/dot_local/bin/executable_dot"
46
+ if [[ -n "$src_dir" && -x "$src_dir/bin/dot" ]]; then
47
+ printf "%s\n" "$src_dir/bin/dot"
48
48
  return
49
49
  fi
50
50
  return 1
@@ -6,9 +6,9 @@
6
6
  set -euo pipefail
7
7
 
8
8
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
- # shellcheck source=../dot/lib/ui.sh
9
+ # shellcheck source=../../lib/dot/ui.sh
10
10
  # shellcheck disable=SC1091
11
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
11
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
12
12
 
13
13
  ui_init
14
14
 
@@ -13,12 +13,12 @@ REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
13
13
  # without the env-prefix dance that confuses shellcheck (SC2097/SC2098).
14
14
  export REPO_ROOT
15
15
 
16
- # shellcheck source=../dot/lib/ui.sh
17
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
18
- # shellcheck source=../dot/lib/platform.sh
19
- source "$SCRIPT_DIR/../dot/lib/platform.sh"
20
- # shellcheck source=../dot/lib/utils.sh
21
- source "$SCRIPT_DIR/../dot/lib/utils.sh"
16
+ # shellcheck source=../../lib/dot/ui.sh
17
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
18
+ # shellcheck source=../../lib/dot/platform.sh
19
+ source "$SCRIPT_DIR/../../lib/dot/platform.sh"
20
+ # shellcheck source=../../lib/dot/utils.sh
21
+ source "$SCRIPT_DIR/../../lib/dot/utils.sh"
22
22
 
23
23
  JSON_MODE=0
24
24
  WRITE_PATH=""
@@ -72,14 +72,14 @@ platform_id="$(dot_platform_id)"
72
72
  host_os="$(dot_host_os)"
73
73
  arch="$(uname -m)"
74
74
  hostname_value="$(hostname 2>/dev/null || true)"
75
- agent_profile_file="$REPO_ROOT/dot_config/dotfiles/agent-profiles.json"
76
- agent_card_file="$REPO_ROOT/dot_config/dotfiles/agent-card.json"
75
+ agent_profile_file="$REPO_ROOT/defaults/dot_config/dotfiles/agent-profiles.json"
76
+ agent_card_file="$REPO_ROOT/defaults/dot_config/dotfiles/agent-card.json"
77
77
  agent_state_file="${AGENT_STATE_FILE:-$HOME/.config/dotfiles/agent-mode.env}"
78
- policy_bundles_file="$REPO_ROOT/dot_config/dotfiles/policy-bundles.json"
79
- model_registry_file="$REPO_ROOT/dot_config/dotfiles/model-registry.json"
80
- prompt_registry_file="$REPO_ROOT/dot_config/dotfiles/prompt-registry.json"
81
- mcp_policy_file="$REPO_ROOT/dot_config/dotfiles/mcp-policy.json"
82
- mcp_registry_file="$REPO_ROOT/dot_config/dotfiles/mcp-registry.json"
78
+ policy_bundles_file="$REPO_ROOT/defaults/dot_config/dotfiles/policy-bundles.json"
79
+ model_registry_file="$REPO_ROOT/defaults/dot_config/dotfiles/model-registry.json"
80
+ prompt_registry_file="$REPO_ROOT/defaults/dot_config/dotfiles/prompt-registry.json"
81
+ mcp_policy_file="$REPO_ROOT/defaults/dot_config/dotfiles/mcp-policy.json"
82
+ mcp_registry_file="$REPO_ROOT/defaults/dot_config/dotfiles/mcp-registry.json"
83
83
  signing_format="$(git config --global gpg.format 2>/dev/null || echo ssh)"
84
84
  signing_key="$(git config --global user.signingkey 2>/dev/null || true)"
85
85
  allowed_signers="$(git config --global gpg.ssh.allowedSignersFile 2>/dev/null || echo "$HOME/.config/git/allowed_signers")"
@@ -94,7 +94,7 @@ if [[ -z "$current_profile" ]] && [[ -f "$agent_profile_file" ]]; then
94
94
  current_profile="$(jq -r '.defaultProfile // "ask"' "$agent_profile_file")"
95
95
  fi
96
96
 
97
- MCP_CONFIG="$REPO_ROOT/dot_config/claude/mcp_servers.json"
97
+ MCP_CONFIG="$REPO_ROOT/defaults/dot_config/claude/mcp_servers.json"
98
98
  export MCP_CONFIG
99
99
  mcp_summary="$(bash "$REPO_ROOT/scripts/diagnostics/mcp-doctor.sh" --strict --json)"
100
100
 
@@ -9,6 +9,14 @@ set -euo pipefail
9
9
  # These functions are sourced by meta.sh for dispatch.
10
10
 
11
11
  _agent_repo_root() {
12
+ # Post-Phase-4b: agent profile/card JSON ships under defaults/dot_config/.
13
+ # Prefer the chezmoi source dir so callers can append dot_config/... directly.
14
+ local dir
15
+ dir="$(resolve_chezmoi_source_dir)"
16
+ [[ -n "$dir" ]] && {
17
+ printf '%s\n' "$dir"
18
+ return
19
+ }
12
20
  require_source_dir
13
21
  }
14
22
 
@@ -218,14 +226,15 @@ EOF
218
226
  checkpoint_id="$(basename "$checkpoint_file" .json)"
219
227
  ui_info "Agent mode" "$name"
220
228
  dot_agent_session_log "run_start" "$name" "running" "argv=$*" "checkpoint_id=$checkpoint_id"
221
- set +e
222
- "$@"
223
- local exit_code=$?
224
- set -e
225
- if [[ "$exit_code" -eq 0 ]]; then
226
- dot_agent_session_log "run_finish" "$name" "ok" "exit_code=$exit_code" "checkpoint_id=$checkpoint_id"
227
- else
229
+ # `if !` instead of `set +e / "$@" / set -e` — bash's errexit
230
+ # is automatically suspended inside a conditional, so we capture
231
+ # the exit code cleanly without toggling shell options.
232
+ local exit_code=0
233
+ if ! "$@"; then
234
+ exit_code=$?
228
235
  dot_agent_session_log "run_finish" "$name" "failed" "exit_code=$exit_code" "checkpoint_id=$checkpoint_id"
236
+ else
237
+ dot_agent_session_log "run_finish" "$name" "ok" "exit_code=$exit_code" "checkpoint_id=$checkpoint_id"
229
238
  fi
230
239
  return "$exit_code"
231
240
  ;;
@@ -335,14 +344,12 @@ EOF
335
344
  [[ "${#replay_argv[@]}" -gt 0 ]] || die "Checkpoint has no replayable command: $checkpoint_id"
336
345
  _agent_apply_profile_env "$replay_profile"
337
346
  dot_agent_session_log "checkpoint_replay" "$replay_profile" "running" "checkpoint_id=$checkpoint_id"
338
- set +e
339
- "${replay_argv[@]}"
340
- local exit_code=$?
341
- set -e
342
- if [[ "$exit_code" -eq 0 ]]; then
343
- dot_agent_session_log "checkpoint_replay_finish" "$replay_profile" "ok" "checkpoint_id=$checkpoint_id" "exit_code=$exit_code"
344
- else
347
+ local exit_code=0
348
+ if ! "${replay_argv[@]}"; then
349
+ exit_code=$?
345
350
  dot_agent_session_log "checkpoint_replay_finish" "$replay_profile" "failed" "checkpoint_id=$checkpoint_id" "exit_code=$exit_code"
351
+ else
352
+ dot_agent_session_log "checkpoint_replay_finish" "$replay_profile" "ok" "checkpoint_id=$checkpoint_id" "exit_code=$exit_code"
346
353
  fi
347
354
  return "$exit_code"
348
355
  ;;
@@ -382,16 +389,14 @@ EOF
382
389
  export DOT_AGENT_PARENT_PROFILE="$current_profile"
383
390
  dot_agent_session_log "delegate_start" "$delegate_profile" "running" "delegate=$delegate_name" "parent=$current_profile" "timeout=$delegate_timeout"
384
391
  ui_info "Delegating" "$delegate_name (profile: $delegate_profile, timeout: ${delegate_timeout}s)"
385
- set +e
386
- timeout "$delegate_timeout" "$@"
387
- local exit_code=$?
388
- set -e
389
- if [[ "$exit_code" -eq 0 ]]; then
390
- dot_agent_session_log "delegate_finish" "$delegate_profile" "ok" "delegate=$delegate_name" "exit_code=$exit_code"
391
- ui_ok "Delegate" "$delegate_name completed"
392
- else
392
+ local exit_code=0
393
+ if ! timeout "$delegate_timeout" "$@"; then
394
+ exit_code=$?
393
395
  dot_agent_session_log "delegate_finish" "$delegate_profile" "failed" "delegate=$delegate_name" "exit_code=$exit_code"
394
396
  ui_err "Delegate" "$delegate_name failed (exit $exit_code)"
397
+ else
398
+ dot_agent_session_log "delegate_finish" "$delegate_profile" "ok" "delegate=$delegate_name" "exit_code=$exit_code"
399
+ ui_ok "Delegate" "$delegate_name completed"
395
400
  fi
396
401
  return "$exit_code"
397
402
  ;;
@@ -0,0 +1,335 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # shellcheck shell=bash
4
+ #
5
+ # scripts/dot/commands/agents.sh
6
+ #
7
+ # `dot agents` — multi-harness AI agent configuration manager.
8
+ #
9
+ # Closes the #1 competitive gap identified in HARD_AUDIT_2026:
10
+ # every other dotfiles framework either targets one AI tool or
11
+ # requires hand-maintenance of N parallel config files. This command
12
+ # keeps CLAUDE.md (canonical) and AGENTS.md (cross-harness standard)
13
+ # in sync, plus stubs the Cursor/Codex tool-specific formats.
14
+ #
15
+ # Subcommands:
16
+ # render Regenerate AGENTS.md and tool-specific stubs from CLAUDE.md.
17
+ # check Verify AGENTS.md tracks CLAUDE.md (exit 0 in sync, 1 drifted).
18
+ # list Show which harnesses are recognised + their target paths.
19
+ #
20
+ # Reads: CLAUDE.md (repo root) — the canonical agent context.
21
+ # Writes: AGENTS.md, .cursor/rules/dotfiles.mdc, .codex/config.toml
22
+ # (only when invoked with `render`).
23
+
24
+ set -euo pipefail
25
+
26
+ # shellcheck disable=SC1091
27
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
28
+ source "$SCRIPT_DIR/../../../lib/dot/ui.sh"
29
+ source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
30
+
31
+ _agents_repo_root() {
32
+ # Resolve the chezmoi source dir (where CLAUDE.md/AGENTS.md live).
33
+ # We REQUIRE the resolved dir to contain `.chezmoidata.toml` so a
34
+ # user running `dot agents render` from inside some other git
35
+ # checkout doesn't accidentally write CLAUDE.md/AGENTS.md/.cursor/
36
+ # /.codex/ into that repo. Round-2 audit C-finding.
37
+ #
38
+ # On a CI runner `chezmoi source-path` may return a default path
39
+ # like `$HOME/.local/share/chezmoi` that doesn't exist on disk —
40
+ # we treat that as "not a match" and fall through to git, rather
41
+ # than accepting the wrong candidate.
42
+ local candidate=""
43
+ # Sanity probe: post-Phase-4b the data file lives at
44
+ # defaults/.chezmoidata.toml; older deployments kept it at the root.
45
+ _has_chezmoidata() {
46
+ [[ -f "$1/.chezmoidata.toml" || -f "$1/defaults/.chezmoidata.toml" ]]
47
+ }
48
+ if command -v chezmoi >/dev/null 2>&1; then
49
+ candidate="$(chezmoi source-path 2>/dev/null || true)"
50
+ # chezmoi source-path returns defaults/ when .chezmoiroot is set;
51
+ # peel back one level so callers receive the actual repo root.
52
+ if [[ -n "$candidate" && -f "$candidate/.chezmoidata.toml" && "$(basename "$candidate")" == "defaults" ]]; then
53
+ candidate="$(dirname "$candidate")"
54
+ fi
55
+ if [[ -n "$candidate" ]] && ! _has_chezmoidata "$candidate"; then
56
+ candidate=""
57
+ fi
58
+ fi
59
+ if [[ -z "$candidate" ]]; then
60
+ candidate="$(git -C "$PWD" rev-parse --show-toplevel 2>/dev/null || true)"
61
+ fi
62
+ if [[ -z "$candidate" ]] || ! _has_chezmoidata "$candidate"; then
63
+ return 1
64
+ fi
65
+ printf '%s\n' "$candidate"
66
+ }
67
+
68
+ _agents_canonical() {
69
+ printf "%s/CLAUDE.md" "$(_agents_repo_root)"
70
+ }
71
+
72
+ _agents_targets() {
73
+ # printed one-per-line: <harness>\t<path-relative-to-repo-root>
74
+ # Closes the round-2 audit gap #3 — harness parity with
75
+ # TonyCasey/ai-dotfiles-manager (who covers 9 surfaces; we now
76
+ # cover 12 to maintain a margin).
77
+ local root
78
+ root="$(_agents_repo_root)"
79
+ cat <<EOF
80
+ agents-md $root/AGENTS.md
81
+ cursor $root/.cursor/rules/dotfiles.mdc
82
+ codex $root/.codex/config.toml
83
+ windsurf $root/.windsurf/rules.md
84
+ zed $root/.zed/agent-config.toml
85
+ roo $root/.roo/rules.md
86
+ cline $root/.clinerules
87
+ aider $root/.aider.conf.yml
88
+ continue $root/.continuerc.json
89
+ jules $root/.jules/system.md
90
+ gemini $root/.gemini/GEMINI.md
91
+ EOF
92
+ }
93
+
94
+ # Strip the leading HTML comment header (everything up to the first blank
95
+ # line after the `-->`), the H1 title line (which differs by design
96
+ # between CLAUDE.md / AGENTS.md), and the trailing cross-reference
97
+ # block. Leaves the comparable content body.
98
+ _agents_body() {
99
+ local file="$1"
100
+ awk '
101
+ BEGIN { in_header = 0; saw_close = 0; emit = 0 }
102
+ /^<!--/ && NR <= 5 { in_header = 1; next }
103
+ in_header && /-->/ { in_header = 0; saw_close = 1; next }
104
+ in_header { next }
105
+ saw_close && /^$/ && !emit { emit = 1; next }
106
+ saw_close && emit { print }
107
+ !saw_close { emit = 1; print }
108
+ ' "$file" |
109
+ # Drop the H1 (`# CLAUDE.md ...` or `# AGENTS.md ...`) and the
110
+ # trailing "Need richer context?" footer if present.
111
+ awk '
112
+ /^# (CLAUDE|AGENTS)\.md/ { next }
113
+ /^---$/ { trailer = 1; next }
114
+ trailer && /^\*\*Need richer context\?\*\*/ { next }
115
+ trailer && NF == 0 { next }
116
+ { trailer = 0; print }
117
+ '
118
+ }
119
+
120
+ cmd_agents() {
121
+ local subcommand="${1:-list}"
122
+ shift || true
123
+
124
+ case "$subcommand" in
125
+ list)
126
+ ui_header "Agent harness targets"
127
+ echo ""
128
+ ui_table_begin "Harness" "Target Path" "Status"
129
+ while IFS=$'\t' read -r harness path; do
130
+ if [[ -f "$path" ]]; then
131
+ ui_table_add "$harness" "$path" "rendered"
132
+ else
133
+ ui_table_add "$harness" "$path" "not yet rendered"
134
+ fi
135
+ done < <(_agents_targets)
136
+ ui_table_end
137
+ ;;
138
+ check)
139
+ local claude_md agents_md
140
+ claude_md="$(_agents_canonical)"
141
+ agents_md="$(_agents_repo_root)/AGENTS.md"
142
+ if [[ ! -f "$claude_md" ]]; then
143
+ ui_err "CLAUDE.md" "not found at $claude_md"
144
+ return 2
145
+ fi
146
+ if [[ ! -f "$agents_md" ]]; then
147
+ ui_warn "AGENTS.md" "missing — run 'dot agents render'"
148
+ return 1
149
+ fi
150
+ # Diff the bodies (header comments differ by design).
151
+ # `--ignore-blank-lines` so the trailing newline from the footer
152
+ # block doesn't false-positive as drift.
153
+ if diff -q --ignore-blank-lines <(_agents_body "$claude_md") <(_agents_body "$agents_md") >/dev/null 2>&1; then
154
+ ui_ok "AGENTS.md" "in sync with CLAUDE.md"
155
+ return 0
156
+ fi
157
+ ui_warn "AGENTS.md" "drifted from CLAUDE.md — run 'dot agents render'"
158
+ return 1
159
+ ;;
160
+ render)
161
+ local claude_md root
162
+ claude_md="$(_agents_canonical)"
163
+ root="$(_agents_repo_root)"
164
+ [[ -f "$claude_md" ]] || {
165
+ ui_err "CLAUDE.md" "not found at $claude_md"
166
+ return 2
167
+ }
168
+
169
+ # 1. AGENTS.md — body of CLAUDE.md + AGENTS.md cross-reference header.
170
+ local agents_md="$root/AGENTS.md"
171
+ {
172
+ cat <<'HEADER'
173
+ <!--
174
+ AGENTS.md — Cross-harness AI agent guidelines for this repository.
175
+
176
+ This file follows the AGENTS.md standard (originated by OpenAI in
177
+ August 2025, stewarded since December 2025 by the Linux Foundation
178
+ Agentic AI Foundation). Native readers: Codex CLI, GitHub Copilot,
179
+ Cursor, Windsurf, Amp, Devin, and a growing list of other agents.
180
+
181
+ Canonical source: CLAUDE.md (Claude Code uses CLAUDE.md natively).
182
+ This file is kept in sync via `dot agents render`. Edit CLAUDE.md
183
+ first; do not hand-edit AGENTS.md.
184
+ -->
185
+
186
+ HEADER
187
+ # Replace the title line so the rendered file declares its
188
+ # purpose, but pass everything else through unchanged.
189
+ _agents_body "$claude_md" | sed '1s/^# CLAUDE\.md.*/# AGENTS.md — AI Assistant Guidelines/'
190
+ cat <<'FOOTER'
191
+
192
+ ---
193
+
194
+ **Need richer context?** This file is the cross-harness summary. Claude Code reads the full canonical version from [`CLAUDE.md`](./CLAUDE.md). Both files are kept in sync via `dot agents render`.
195
+ FOOTER
196
+ } >"$agents_md"
197
+ chmod 0644 "$agents_md" 2>/dev/null || true
198
+ ui_ok "AGENTS.md" "rendered → $agents_md"
199
+
200
+ # 2. Cursor rules — MDC format, points at CLAUDE.md/AGENTS.md.
201
+ local cursor_dir="$root/.cursor/rules"
202
+ mkdir -p "$cursor_dir"
203
+ cat >"$cursor_dir/dotfiles.mdc" <<'MDC'
204
+ ---
205
+ description: Repo conventions for the dotfiles project (sourced from CLAUDE.md/AGENTS.md)
206
+ globs:
207
+ - "**/*"
208
+ alwaysApply: true
209
+ ---
210
+
211
+ See `AGENTS.md` and `CLAUDE.md` in the repository root for the full
212
+ project conventions, repository layout, testing, and CI policy. This
213
+ Cursor rule file exists so Cursor's rule engine picks up the same
214
+ context; do not duplicate content here — keep CLAUDE.md canonical.
215
+ MDC
216
+ chmod 0644 "$cursor_dir/dotfiles.mdc" 2>/dev/null || true
217
+ ui_ok "Cursor" "rendered → $cursor_dir/dotfiles.mdc"
218
+
219
+ # 3. Codex CLI config stub — declares the AGENTS.md path.
220
+ local codex_dir="$root/.codex"
221
+ mkdir -p "$codex_dir"
222
+ cat >"$codex_dir/config.toml" <<'TOML'
223
+ # Codex CLI config — points at the AGENTS.md cross-harness context.
224
+ # Codex reads AGENTS.md natively; this file is a project-scoped pin so
225
+ # the CLI prefers the in-repo guidance over any global default.
226
+ project_context = "AGENTS.md"
227
+ TOML
228
+ chmod 0644 "$codex_dir/config.toml" 2>/dev/null || true
229
+ ui_ok "Codex" "rendered → $codex_dir/config.toml"
230
+
231
+ # 4-11. Per-harness rules files. All eight emitters reuse the
232
+ # same body extracted from CLAUDE.md so a single edit propagates
233
+ # consistently. The header differs per harness so each tool sees
234
+ # syntax it expects (front-matter style, comment block, etc.).
235
+ _agents_render_markdown_with_header() {
236
+ local _path="$1" _harness="$2" _header="$3"
237
+ mkdir -p "$(dirname "$_path")"
238
+ {
239
+ printf '%s\n\n' "$_header"
240
+ _agents_body "$claude_md"
241
+ # Heredoc instead of printf — Codacy/shellcheck flags
242
+ # printf-with-backticks-in-single-quotes (SC2016) as
243
+ # ambiguous even when the backticks are literal Markdown.
244
+ cat <<'FOOTER'
245
+
246
+ ---
247
+
248
+ **Canonical source:** [`CLAUDE.md`](./CLAUDE.md) — keep in sync via `dot agents render`.
249
+ FOOTER
250
+ } >"$_path"
251
+ chmod 0644 "$_path" 2>/dev/null || true
252
+ ui_ok "$_harness" "rendered → $_path"
253
+ }
254
+
255
+ # 4. Windsurf — looks for `.windsurf/rules.md`.
256
+ _agents_render_markdown_with_header "$root/.windsurf/rules.md" \
257
+ "Windsurf" "# Windsurf project rules
258
+
259
+ These rules govern Cascade and the Windsurf agent inside this repository."
260
+
261
+ # 5. Roo — looks for `.roo/rules.md`.
262
+ _agents_render_markdown_with_header "$root/.roo/rules.md" \
263
+ "Roo" "# Roo project rules"
264
+
265
+ # 6. Cline — looks for `.clinerules` (no extension).
266
+ _agents_render_markdown_with_header "$root/.clinerules" \
267
+ "Cline" "# Cline workspace rules"
268
+
269
+ # 7. Jules — looks for `.jules/system.md`.
270
+ _agents_render_markdown_with_header "$root/.jules/system.md" \
271
+ "Jules" "# Jules system prompt"
272
+
273
+ # 8. Gemini — looks for `.gemini/GEMINI.md`.
274
+ _agents_render_markdown_with_header "$root/.gemini/GEMINI.md" \
275
+ "Gemini" "# Gemini agent rules"
276
+
277
+ # 9. Zed — config pointer (TOML).
278
+ local zed_dir="$root/.zed"
279
+ mkdir -p "$zed_dir"
280
+ cat >"$zed_dir/agent-config.toml" <<'TOML'
281
+ # Zed agent config — points at AGENTS.md for the cross-harness body.
282
+ # Zed reads this file when its agent mode is enabled; the actual rule
283
+ # body lives in AGENTS.md (which `dot agents render` keeps current).
284
+ agent_context = "AGENTS.md"
285
+ TOML
286
+ chmod 0644 "$zed_dir/agent-config.toml" 2>/dev/null || true
287
+ ui_ok "Zed" "rendered → $zed_dir/agent-config.toml"
288
+
289
+ # 10. Aider — YAML pointer to AGENTS.md / CLAUDE.md.
290
+ cat >"$root/.aider.conf.yml" <<'YML'
291
+ # Aider config — surfaces the cross-harness context bundle.
292
+ # Aider's `--read` flag pulls in AGENTS.md / CLAUDE.md per session.
293
+ read:
294
+ - AGENTS.md
295
+ - CLAUDE.md
296
+ YML
297
+ chmod 0644 "$root/.aider.conf.yml" 2>/dev/null || true
298
+ ui_ok "Aider" "rendered → $root/.aider.conf.yml"
299
+
300
+ # 11. Continue — JSON pointer used by VS Code / JetBrains plugin.
301
+ cat >"$root/.continuerc.json" <<'JSON'
302
+ {
303
+ "_comment": "Continue config pointer — see AGENTS.md for the full body.",
304
+ "systemMessage": "Apply the rules in AGENTS.md (canonical source: CLAUDE.md). Run `dot agents render` if the two drift."
305
+ }
306
+ JSON
307
+ chmod 0644 "$root/.continuerc.json" 2>/dev/null || true
308
+ ui_ok "Continue" "rendered → $root/.continuerc.json"
309
+
310
+ ui_info "Hint" "commit AGENTS.md alongside CLAUDE.md changes (or add to your pre-commit hook)"
311
+ ;;
312
+ --help | -h | help)
313
+ cat <<EOF
314
+ Usage: dot agents <subcommand>
315
+
316
+ Subcommands:
317
+ list Show which agent harnesses are recognised and their target paths
318
+ check Verify AGENTS.md tracks CLAUDE.md (exit 0 in sync, 1 drifted)
319
+ render Regenerate AGENTS.md + 10 harness-specific files from CLAUDE.md
320
+
321
+ CLAUDE.md is the canonical source. AGENTS.md follows the cross-harness
322
+ standard read by Codex, Copilot, Cursor, Windsurf, Amp, and Devin.
323
+
324
+ Harnesses covered by 'render':
325
+ agents-md, cursor, codex, windsurf, zed, roo, cline,
326
+ aider, continue, jules, gemini.
327
+ EOF
328
+ ;;
329
+ *)
330
+ ui_err "Unknown subcommand" "$subcommand"
331
+ echo "Run 'dot agents --help' for usage." >&2
332
+ return 1
333
+ ;;
334
+ esac
335
+ }