@sebastienrousseau/dotfiles 0.2.481 → 0.2.500

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 (546) hide show
  1. package/CHANGELOG.md +122 -32
  2. package/LICENSE +1 -1
  3. package/README.md +211 -242
  4. package/docs/.vitepress/reports/localization-readability-audit.md +69 -0
  5. package/docs/AI.md +102 -0
  6. package/docs/COPYRIGHT +2 -2
  7. package/docs/NAMING_CONVENTIONS.md +95 -0
  8. package/docs/README.md +58 -249
  9. package/docs/adr/ADR-004-cli-architecture.md +2 -2
  10. package/docs/adr/ADR-006-shell-selection.md +2 -2
  11. package/docs/adr/ADR-007-multi-shell-parity.md +53 -0
  12. package/docs/adr/ADR-008-alias-system-architecture.md +85 -0
  13. package/docs/adr/README.md +2 -3
  14. package/docs/architecture/ARCHITECTURE.md +113 -0
  15. package/docs/architecture/INTEROP.md +36 -0
  16. package/docs/architecture/REPO_LAYOUT.md +237 -0
  17. package/docs/architecture/WALKTHROUGH.md +82 -0
  18. package/docs/architecture/fleet-deployment.md +73 -0
  19. package/docs/archive/EUXIS_2026_REVIEW.md +119 -0
  20. package/docs/archive/MILESTONE_v0.2.493.md +43 -0
  21. package/docs/{PLAN.md → archive/PLAN.md} +1 -1
  22. package/docs/guides/INSTALL.md +140 -0
  23. package/docs/{NEOVIM_IDE_GUIDE.md → guides/NEOVIM_IDE_GUIDE.md} +12 -12
  24. package/docs/guides/THEMING.md +222 -0
  25. package/docs/{TROUBLESHOOTING.md → guides/TROUBLESHOOTING.md} +36 -0
  26. package/docs/{WSL2_NIX_TROUBLESHOOTING.md → guides/WSL2_NIX_TROUBLESHOOTING.md} +8 -8
  27. package/docs/index.md +39 -0
  28. package/docs/interop/A2A.md +32 -0
  29. package/docs/manual/00-introduction.md +85 -0
  30. package/docs/manual/01-concepts/01-architecture.md +134 -0
  31. package/docs/manual/01-concepts/02-trust-model.md +178 -0
  32. package/docs/manual/01-concepts/03-theme-engine.md +182 -0
  33. package/docs/manual/01-concepts/04-fleet.md +142 -0
  34. package/docs/manual/01-concepts/05-self-healing.md +197 -0
  35. package/docs/manual/02-tutorials/01-first-install.md +192 -0
  36. package/docs/manual/02-tutorials/02-add-wallpaper.md +211 -0
  37. package/docs/manual/02-tutorials/03-create-profile.md +238 -0
  38. package/docs/manual/02-tutorials/04-encrypt-secret.md +275 -0
  39. package/docs/manual/02-tutorials/05-deploy-fleet.md +279 -0
  40. package/docs/manual/03-reference/01-dot-cli.md +413 -0
  41. package/docs/manual/03-reference/02-config-files.md +259 -0
  42. package/docs/manual/03-reference/03-environment.md +120 -0
  43. package/docs/manual/03-reference/04-templates.md +184 -0
  44. package/docs/manual/03-reference/05-feature-flags.md +118 -0
  45. package/docs/manual/04-cookbook/01-recipes.md +281 -0
  46. package/docs/manual/04-cookbook/02-troubleshooting.md +319 -0
  47. package/docs/manual/04-cookbook/03-faq.md +167 -0
  48. package/docs/manual/05-appendices/A-platform-matrix.md +97 -0
  49. package/docs/manual/05-appendices/B-security-checklist.md +78 -0
  50. package/docs/manual/05-appendices/C-glossary.md +36 -0
  51. package/docs/manual/05-appendices/D-bibliography.md +54 -0
  52. package/docs/manual/05-appendices/E-license.md +34 -0
  53. package/docs/manual/_toc.yml +58 -0
  54. package/docs/manual/command-index.md +58 -0
  55. package/docs/manual/concept-index.md +164 -0
  56. package/docs/operations/ATTESTATION.md +39 -0
  57. package/docs/operations/MAINTENANCE.md +59 -0
  58. package/docs/operations/MIGRATION.md +101 -0
  59. package/docs/operations/OPERATIONS.md +164 -0
  60. package/docs/operations/RELIABILITY.md +116 -0
  61. package/docs/{ROADMAP.md → operations/ROADMAP.md} +11 -11
  62. package/docs/operations/TESTING.md +195 -0
  63. package/docs/operations/TRACEABILITY.md +31 -0
  64. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +61 -0
  65. package/docs/operations/VERSION_SYNC.md +344 -0
  66. package/docs/{ALIASES.md → reference/ALIASES.md} +2 -6
  67. package/docs/reference/ALIASES_CHEATSHEET.md +28 -0
  68. package/docs/reference/ALIASES_DEPRECATIONS.md +9 -0
  69. package/docs/reference/FEATURES.md +62 -0
  70. package/docs/reference/FONTS.md +108 -0
  71. package/docs/reference/PROFILES.md +65 -0
  72. package/docs/{SCREENSHOTS.md → reference/SCREENSHOTS.md} +26 -25
  73. package/docs/reference/SCRIPTS.md +67 -0
  74. package/docs/reference/SUPPORT_MATRIX.md +74 -0
  75. package/docs/reference/THEMES.md +113 -0
  76. package/docs/reference/TOOLS.md +105 -0
  77. package/docs/reference/UTILS.md +151 -0
  78. package/docs/security/AI_ACT_COMPLIANCE.md +90 -0
  79. package/docs/security/AUTOMATION_SECRETS.md +22 -0
  80. package/docs/security/COMPLIANCE.md +453 -0
  81. package/docs/security/ENCRYPTION.md +52 -0
  82. package/docs/security/FMEA.md +155 -0
  83. package/docs/security/INCIDENT_RESPONSE.md +575 -0
  84. package/docs/security/KEYS.md +45 -0
  85. package/docs/security/MCP_POLICY.md +69 -0
  86. package/docs/security/POLICY_RELEASES.md +33 -0
  87. package/docs/security/README.md +24 -0
  88. package/docs/security/SECRETS.md +146 -0
  89. package/docs/security/SECURITY.md +41 -0
  90. package/docs/security/SECURITY_CHECKLIST.md +44 -0
  91. package/docs/security/SOUP_REGISTER.md +32 -0
  92. package/docs/security/THREAT_MODEL.md +120 -0
  93. package/docs/security/VERIFICATION_VALIDATION.md +224 -0
  94. package/docs/themes/README.md +3 -17
  95. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +26 -0
  96. package/docs/themes/hero-shot.svg +78 -0
  97. package/dot_config/.module-manifest.json +69 -0
  98. package/dot_config/ai/identity.md +20 -0
  99. package/dot_config/ai/patterns/architect.md +14 -0
  100. package/dot_config/ai/patterns/hardener.md +13 -0
  101. package/dot_config/ai/patterns/refactor.md +13 -0
  102. package/dot_config/aider/aider.conf.yml +1 -1
  103. package/dot_config/alacritty/alacritty.toml.tmpl +41 -469
  104. package/dot_config/atuin/config.toml +18 -1
  105. package/dot_config/bat/config +16 -1
  106. package/dot_config/claude/mcp_servers.json +3 -32
  107. package/dot_config/dotfiles/agent-card.json +29 -0
  108. package/dot_config/dotfiles/agent-profiles.json +92 -0
  109. package/dot_config/dotfiles/boot/README.md +1 -1
  110. package/dot_config/dotfiles/grub/README.md +1 -1
  111. package/dot_config/dotfiles/lock/README.md +1 -1
  112. package/dot_config/dotfiles/mcp-lock.json +33 -0
  113. package/dot_config/dotfiles/mcp-policy.json +52 -0
  114. package/dot_config/dotfiles/mcp-registry.json +47 -0
  115. package/dot_config/dotfiles/model-registry.json +20 -0
  116. package/dot_config/dotfiles/policy-bundles.json +38 -0
  117. package/dot_config/dotfiles/prompt-registry.json +16 -0
  118. package/dot_config/dotfiles/versions.env +18 -0
  119. package/dot_config/environment.d/50-ssh-agent.conf +2 -0
  120. package/dot_config/environment.d/90-wayland.conf +19 -0
  121. package/dot_config/firefox/user.js.tmpl +58 -0
  122. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +9 -0
  123. package/dot_config/fish/completions/dot.fish.tmpl +115 -0
  124. package/dot_config/fish/conf.d/000-perf-cache.fish +56 -0
  125. package/dot_config/fish/conf.d/aliases.fish.tmpl +77 -0
  126. package/dot_config/fish/conf.d/env.fish.tmpl +48 -0
  127. package/dot_config/fish/conf.d/functions.fish.tmpl +22 -0
  128. package/dot_config/fish/conf.d/init.fish.tmpl +151 -0
  129. package/dot_config/fish/config.fish.tmpl +44 -0
  130. package/dot_config/fish/fish_plugins +1 -0
  131. package/dot_config/fish/functions/_.fish +3 -0
  132. package/dot_config/fish/functions/_cached_eval.fish +58 -0
  133. package/dot_config/fish/functions/als.fish +46 -0
  134. package/dot_config/fish/functions/bg-upgrade.fish +7 -0
  135. package/dot_config/fish/functions/c.fish +3 -0
  136. package/dot_config/fish/functions/cat.fish +9 -0
  137. package/dot_config/fish/functions/d.fish +7 -0
  138. package/dot_config/fish/functions/dot.fish +34 -0
  139. package/dot_config/fish/functions/h.fish +3 -0
  140. package/dot_config/fish/functions/l.fish +7 -0
  141. package/dot_config/fish/functions/la.fish +7 -0
  142. package/dot_config/fish/functions/ll.fish +7 -0
  143. package/dot_config/fish/functions/log_error.fish +13 -0
  144. package/dot_config/fish/functions/log_info.fish +13 -0
  145. package/dot_config/fish/functions/lr.fish +7 -0
  146. package/dot_config/fish/functions/lra.fish +7 -0
  147. package/dot_config/fish/functions/ls.fish +7 -0
  148. package/dot_config/fish/functions/lt.fish +7 -0
  149. package/dot_config/fish/functions/lta.fish +7 -0
  150. package/dot_config/fish/functions/notify-run.fish +11 -0
  151. package/dot_config/fish/functions/q.fish +3 -0
  152. package/dot_config/fish/functions/silent-run.fish +7 -0
  153. package/dot_config/fish/functions/yy.fish +8 -0
  154. package/dot_config/fontconfig/fonts.conf.tmpl +13 -0
  155. package/dot_config/foot/foot.ini.tmpl +33 -0
  156. package/dot_config/fuzzel/fuzzel.ini.tmpl +18 -0
  157. package/dot_config/fzf/fzf.zsh +48 -0
  158. package/dot_config/ghostty/config.tmpl +69 -565
  159. package/dot_config/git/allowed_signers.tmpl +18 -0
  160. package/dot_config/git/commit-template +10 -0
  161. package/dot_config/gnupg/{gpg-agent.conf.tmpl → gpg-agent.conf} +3 -3
  162. package/dot_config/goose/config.yaml +2 -2
  163. package/dot_config/gtk-3.0/gtk.css.tmpl +59 -180
  164. package/dot_config/gtk-3.0/settings.ini.tmpl +5 -44
  165. package/dot_config/gtk-4.0/gtk.css.tmpl +79 -136
  166. package/dot_config/gtk-4.0/settings.ini.tmpl +5 -8
  167. package/dot_config/ipython/profile_default/ipython_config.py +19 -0
  168. package/dot_config/just/justfile +18 -0
  169. package/dot_config/kanshi/config.tmpl +22 -0
  170. package/dot_config/kitty/kitty.conf.tmpl +44 -508
  171. package/dot_config/lazygit/config.yml +18 -6
  172. package/dot_config/mako/config +47 -0
  173. package/dot_config/micro/settings.json +3 -0
  174. package/dot_config/mimeapps.list +77 -0
  175. package/dot_config/mise/config.toml +63 -5
  176. package/dot_config/mongosh/mongoshrc.js +1 -0
  177. package/dot_config/mpv/input.conf +47 -0
  178. package/dot_config/mpv/mpv.conf +47 -0
  179. package/dot_config/niri/config.kdl.tmpl +327 -0
  180. package/dot_config/nushell/aliases.nu +18 -0
  181. package/dot_config/nushell/completions.nu.tmpl +52 -0
  182. package/dot_config/nushell/config.nu.tmpl +86 -0
  183. package/dot_config/nushell/env.nu.tmpl +94 -0
  184. package/dot_config/nushell/functions.nu.tmpl +17 -0
  185. package/dot_config/nvim/init.lua +14 -0
  186. package/dot_config/nvim/lazy-lock.json +45 -14
  187. package/dot_config/nvim/lua/config/autocmds.lua +45 -1
  188. package/dot_config/nvim/lua/config/keymaps.lua +13 -8
  189. package/dot_config/nvim/lua/config/lazy.lua +22 -12
  190. package/dot_config/nvim/lua/config/options.lua +1 -0
  191. package/dot_config/nvim/lua/plugins/ai.lua +75 -0
  192. package/dot_config/nvim/lua/plugins/coding.lua +11 -29
  193. package/dot_config/nvim/lua/plugins/completion.lua +60 -0
  194. package/dot_config/nvim/lua/plugins/dap.lua +215 -4
  195. package/dot_config/nvim/lua/plugins/editor.lua +6 -10
  196. package/dot_config/nvim/lua/plugins/git.lua +1 -0
  197. package/dot_config/nvim/lua/plugins/lsp.lua +16 -81
  198. package/dot_config/nvim/lua/plugins/markdown.lua +1 -0
  199. package/dot_config/nvim/lua/plugins/rust.lua +1 -0
  200. package/dot_config/nvim/lua/plugins/sessions.lua +1 -0
  201. package/dot_config/nvim/lua/plugins/ui.lua +23 -51
  202. package/dot_config/paru/paru.conf +10 -0
  203. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +81 -0
  204. package/dot_config/pueue/pueue.yml +34 -0
  205. package/dot_config/raycast/README.md +1 -1
  206. package/dot_config/ripgrep/ripgreprc +21 -0
  207. package/dot_config/shell/00-core-paths.sh.tmpl +62 -24
  208. package/dot_config/shell/05-core-safety.sh +47 -0
  209. package/dot_config/shell/10-secrets.sh +40 -0
  210. package/dot_config/shell/40-fzf-defaults.sh.tmpl +16 -0
  211. package/dot_config/shell/40-ls-colors.sh +48 -0
  212. package/dot_config/shell/50-logic-functions-core.sh.tmpl +10 -0
  213. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +64 -0
  214. package/dot_config/shell/90-ux-aliases.sh.tmpl +90 -5
  215. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +33 -2
  216. package/dot_config/shell/Brewfile.cli +8 -0
  217. package/dot_config/shell/README.md +9 -9
  218. package/dot_config/shell/als_data.txt.tmpl +65 -0
  219. package/dot_config/shell/custom/auto_ls.zsh +20 -0
  220. package/dot_config/shell/custom/context_suggest.zsh +50 -50
  221. package/dot_config/shell/custom/error_analysis.zsh +29 -29
  222. package/dot_config/starship.toml.tmpl +85 -7
  223. package/dot_config/swaylock/config +43 -0
  224. package/dot_config/systemd/user/dotfiles-maintenance.service +8 -0
  225. package/dot_config/systemd/user/dotfiles-maintenance.timer +11 -0
  226. package/dot_config/systemd/user/pueued.service +12 -0
  227. package/dot_config/systemd/user/ssh-agent.service +12 -0
  228. package/dot_config/tmux/tmux.conf.tmpl +80 -38
  229. package/dot_config/topgrade.toml.tmpl +54 -0
  230. package/dot_config/user-dirs.dirs +9 -0
  231. package/dot_config/vscode/settings.json.tmpl +9 -50
  232. package/dot_config/waybar/config.jsonc.tmpl +90 -0
  233. package/dot_config/waybar/style.css.tmpl +211 -0
  234. package/dot_config/wezterm/wezterm.lua.tmpl +31 -203
  235. package/dot_config/xdg-desktop-portal/niri-portals.conf +5 -0
  236. package/dot_config/yazi/keymap.toml +67 -0
  237. package/dot_config/yazi/theme.toml +102 -0
  238. package/dot_config/zathura/zathurarc +52 -0
  239. package/dot_config/zellij/{config.kdl → config.kdl.tmpl} +1 -1
  240. package/dot_config/zsh/dot_zprofile +1 -7
  241. package/dot_config/zsh/dot_zshenv +2 -3
  242. package/dot_config/zsh/dot_zshrc.tmpl +368 -69
  243. package/dot_config/zsh/rc.d/00-alias-shims.zsh +77 -0
  244. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +17 -4
  245. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +4 -4
  246. package/dot_config/zsh/rc.d/20-zinit.zsh +65 -0
  247. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +101 -30
  248. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +32 -0
  249. package/dot_local/bin/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -0
  250. package/dot_local/bin/executable_ai-update +195 -0
  251. package/dot_local/bin/executable_ai_core +113 -91
  252. package/dot_local/bin/executable_antigravity +11 -0
  253. package/dot_local/bin/executable_b64 +61 -36
  254. package/dot_local/bin/executable_bm +77 -0
  255. package/dot_local/bin/executable_cb +39 -0
  256. package/dot_local/bin/executable_dot +543 -132
  257. package/dot_local/bin/executable_dot-ai +36 -0
  258. package/dot_local/bin/executable_dot-bootstrap +77 -0
  259. package/dot_local/bin/executable_dot-launch-or-focus +52 -0
  260. package/dot_local/bin/executable_dot-load-benchmark +31 -0
  261. package/dot_local/bin/executable_dot-load-benchmark-pty +77 -0
  262. package/dot_local/bin/executable_dot-theme-sync +952 -0
  263. package/dot_local/bin/executable_dot_completion +2 -0
  264. package/dot_local/bin/executable_dtags +28 -0
  265. package/dot_local/bin/executable_epoch +43 -38
  266. package/dot_local/bin/executable_extract +32 -99
  267. package/dot_local/bin/executable_gbd +52 -0
  268. package/dot_local/bin/executable_gd +42 -0
  269. package/dot_local/bin/executable_git-ai-commit +35 -20
  270. package/dot_local/bin/executable_git-ai-diff +33 -18
  271. package/dot_local/bin/executable_gl +101 -0
  272. package/dot_local/bin/executable_hash +56 -18
  273. package/dot_local/bin/executable_hashsum +160 -0
  274. package/dot_local/bin/executable_hex +44 -8
  275. package/dot_local/bin/executable_jsonv +34 -10
  276. package/dot_local/bin/executable_jwt +22 -6
  277. package/dot_local/bin/executable_kill-port +18 -2
  278. package/dot_local/bin/executable_lorem +21 -6
  279. package/dot_local/bin/executable_mkscript +35 -0
  280. package/dot_local/bin/executable_monitor +56 -0
  281. package/dot_local/bin/{executable_ip → executable_myip} +16 -2
  282. package/dot_local/bin/executable_notify +22 -0
  283. package/dot_local/bin/executable_open +36 -0
  284. package/dot_local/bin/executable_pw +27 -0
  285. package/dot_local/bin/executable_rec-start +46 -0
  286. package/dot_local/bin/executable_rec-stop +35 -0
  287. package/dot_local/bin/executable_regex +49 -13
  288. package/dot_local/bin/executable_start-niri +8 -0
  289. package/dot_local/bin/executable_tmux-sessionizer +276 -149
  290. package/dot_local/bin/executable_tour +112 -74
  291. package/dot_local/bin/executable_up +21 -0
  292. package/dot_local/bin/executable_update +45 -11
  293. package/dot_local/bin/executable_uuid +37 -7
  294. package/dot_local/bin/executable_win +32 -0
  295. package/dot_local/bin/executable_yamlv +25 -7
  296. package/dot_local/share/bash-completion/completions/dot +62 -44
  297. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  298. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  299. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  300. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  301. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  302. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  303. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  304. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  305. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  306. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  307. package/dot_local/share/man/man1/dot.1 +149 -0
  308. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +64 -0
  309. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +18 -0
  310. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +13 -0
  311. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +6 -0
  312. package/dot_local/share/zsh/completions/_dot +283 -0
  313. package/install.sh +297 -210
  314. package/package.json +17 -5
  315. package/scripts/ci/check-copyright-headers.sh +96 -0
  316. package/scripts/ci/guard-gitleaks-checkout.sh +57 -0
  317. package/scripts/ci/install-chezmoi-verified.sh +64 -0
  318. package/scripts/ci/validate-ci-config.sh +41 -39
  319. package/scripts/demo/record.sh +3 -2
  320. package/scripts/diagnostics/a2a-conformance.sh +162 -0
  321. package/scripts/diagnostics/alias-governance.sh +137 -0
  322. package/scripts/diagnostics/aliases-cheatsheet.sh +73 -0
  323. package/scripts/diagnostics/aliases-manifest.sh +31 -0
  324. package/scripts/diagnostics/benchmark.sh +209 -29
  325. package/scripts/diagnostics/conflicts.sh +72 -0
  326. package/scripts/diagnostics/doctor-unified.sh +38 -0
  327. package/scripts/diagnostics/doctor.sh +491 -65
  328. package/scripts/diagnostics/drift-dashboard.sh +17 -6
  329. package/scripts/diagnostics/health.sh +351 -110
  330. package/scripts/diagnostics/history-analysis.sh +12 -4
  331. package/scripts/diagnostics/mcp-doctor.sh +575 -0
  332. package/scripts/diagnostics/perf.sh +225 -0
  333. package/scripts/diagnostics/scorecard.sh +118 -0
  334. package/scripts/diagnostics/secret-governance.sh +58 -0
  335. package/scripts/diagnostics/security-score.sh +139 -93
  336. package/scripts/diagnostics/smoke-test.sh +87 -0
  337. package/scripts/diagnostics/snapshot.sh +89 -0
  338. package/scripts/diagnostics/verify.sh +107 -0
  339. package/scripts/diagnostics/verify_state.sh +2 -2
  340. package/scripts/diagnostics/version-locks.sh +79 -0
  341. package/scripts/diagnostics/workstation-attestation.sh +181 -0
  342. package/scripts/docs/build-manual.sh +883 -0
  343. package/scripts/docs/check-manual.sh +213 -0
  344. package/scripts/dot/commands/agent.sh +465 -0
  345. package/scripts/dot/commands/ai.sh +416 -0
  346. package/scripts/dot/commands/aliases.sh +250 -0
  347. package/scripts/dot/commands/appearance.sh +21 -4
  348. package/scripts/dot/commands/core.sh +59 -4
  349. package/scripts/dot/commands/diagnostics.sh +132 -3
  350. package/scripts/dot/commands/fleet.sh +399 -0
  351. package/scripts/dot/commands/lint.sh +177 -0
  352. package/scripts/dot/commands/manual.sh +168 -0
  353. package/scripts/dot/commands/meta.sh +148 -17
  354. package/scripts/dot/commands/patterns.sh +54 -0
  355. package/scripts/dot/commands/restore.sh +57 -35
  356. package/scripts/dot/commands/secrets.sh +151 -9
  357. package/scripts/dot/commands/security.sh +3 -0
  358. package/scripts/dot/commands/tools.sh +268 -27
  359. package/scripts/dot/data/alias-deprecations.tsv +2 -0
  360. package/scripts/dot/lib/bento.sh +49 -0
  361. package/scripts/dot/lib/log.sh +194 -0
  362. package/scripts/dot/lib/platform.sh +98 -0
  363. package/scripts/dot/lib/ui.sh +507 -0
  364. package/scripts/dot/lib/utils.sh +318 -18
  365. package/scripts/fonts/install-nerd-fonts.sh +19 -10
  366. package/scripts/fonts/patch-fonts.sh +1 -0
  367. package/scripts/git-hooks/install.sh +11 -0
  368. package/scripts/git-hooks/pre-commit +12 -0
  369. package/scripts/git-hooks/pre-commit-audit.sh +145 -0
  370. package/scripts/git-hooks/pre-push +29 -0
  371. package/scripts/git-hooks/prepare-commit-msg +29 -0
  372. package/scripts/lib/secrets_provider.sh +158 -0
  373. package/scripts/maintenance/check-updates.sh +131 -0
  374. package/scripts/ops/ai-setup.sh +55 -0
  375. package/scripts/ops/bundle.sh +77 -0
  376. package/scripts/ops/chaos.sh +49 -0
  377. package/scripts/ops/chezmoi-apply.sh +245 -17
  378. package/scripts/ops/chezmoi-diff.sh +1 -0
  379. package/scripts/ops/chezmoi-remove.sh +2 -0
  380. package/scripts/ops/chezmoi-update.sh +34 -2
  381. package/scripts/ops/heal-chezmoi.sh +51 -0
  382. package/scripts/ops/heal-system.sh +128 -0
  383. package/scripts/ops/heal-tools.sh +340 -0
  384. package/scripts/ops/heal.sh +98 -342
  385. package/scripts/ops/post-apply-repair.sh +106 -0
  386. package/scripts/ops/prewarm.sh +127 -0
  387. package/scripts/ops/release.sh +252 -0
  388. package/scripts/ops/rollback.sh +86 -28
  389. package/scripts/ops/setup.sh +137 -0
  390. package/scripts/ops/teleport.sh +2 -1
  391. package/scripts/qa/coverage-baseline.sh +60 -0
  392. package/scripts/qa/docs-coverage.sh +111 -0
  393. package/scripts/qa/reliability-audit.sh +138 -0
  394. package/scripts/qa/traceability-coverage.sh +116 -0
  395. package/scripts/qa/validate-examples.sh +26 -0
  396. package/scripts/qa/wsl-contract.sh +11 -0
  397. package/scripts/release/package-policy-bundles.sh +125 -0
  398. package/scripts/secrets/age-init.sh +1 -0
  399. package/scripts/secrets/create-secrets-file.sh +1 -0
  400. package/scripts/secrets/encrypt-ssh-key.sh +1 -0
  401. package/scripts/security/backup.sh +44 -4
  402. package/scripts/security/dns-doh.sh +36 -14
  403. package/scripts/security/encryption-check.sh +27 -12
  404. package/scripts/security/enforce-policies.sh +11 -16
  405. package/scripts/security/firewall.sh +76 -20
  406. package/scripts/security/lock-configs.sh +2 -2
  407. package/scripts/security/lock-screen.sh +40 -18
  408. package/scripts/security/manage-secrets.sh +42 -29
  409. package/scripts/security/ssh-cert.sh +203 -0
  410. package/scripts/security/telemetry-kill.sh +40 -18
  411. package/scripts/security/usb-safety.sh +37 -15
  412. package/scripts/theme/apply-gnome-theme.sh +87 -56
  413. package/scripts/theme/extract-theme.py +677 -0
  414. package/scripts/theme/install-boot-logo.sh +1 -0
  415. package/scripts/theme/install-catppuccin-themes.sh +57 -33
  416. package/scripts/theme/install-cursors.sh +1 -0
  417. package/scripts/theme/install-file-icons.sh +1 -0
  418. package/scripts/theme/install-grub-theme.sh +11 -1
  419. package/scripts/theme/install-lock-icon.sh +1 -0
  420. package/scripts/theme/merge-wallpaper.sh +141 -0
  421. package/scripts/theme/rebuild-themes.sh +309 -0
  422. package/scripts/theme/switch.sh +308 -137
  423. package/scripts/theme/wallpaper-rotate.sh +66 -12
  424. package/scripts/theme/wallpaper-sync.sh +386 -31
  425. package/scripts/tools/cmatrix.sh +1 -0
  426. package/scripts/tools/detect-collisions.py +1 -1
  427. package/scripts/tools/emoji-picker.sh +4 -1
  428. package/scripts/tools/figlet-banner.sh +1 -0
  429. package/scripts/tools/log-rotate.sh +2 -1
  430. package/scripts/tools/lolcat-wrap.sh +1 -0
  431. package/scripts/tools/pipes.sh +1 -0
  432. package/scripts/tuning/linux.sh +23 -13
  433. package/scripts/tuning/macos.sh +13 -4
  434. package/scripts/uninstall.sh +85 -0
  435. package/scripts/version-sync.sh +487 -0
  436. package/templates/chezmoi-data/geekom-a9.toml.example +21 -0
  437. package/templates/chezmoi-data/mac-m1.toml.example +16 -0
  438. package/templates/chezmoi-data/mac-t2-linux.toml.example +21 -0
  439. package/templates/chezmoi-data/surface-pro-7p.toml.example +21 -0
  440. package/templates/projects/go/.github/workflows/ci.yml +31 -0
  441. package/templates/projects/go/README.md +1 -1
  442. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +1 -0
  443. package/templates/projects/go/go.sum +0 -0
  444. package/templates/projects/molecule/README.md +1 -1
  445. package/templates/projects/node/.github/workflows/ci.yml +30 -0
  446. package/templates/projects/node/README.md +1 -1
  447. package/templates/projects/node/package-lock.json +12 -0
  448. package/templates/projects/node/src/index.js +1 -0
  449. package/templates/projects/packer/README.md +1 -1
  450. package/templates/projects/python/.github/workflows/ci.yml +34 -0
  451. package/templates/projects/python/README.md +1 -1
  452. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +1 -0
  453. package/templates/projects/python/tests/test_basic.py +1 -0
  454. package/docs/ARCHITECTURE.md +0 -229
  455. package/docs/COMPLIANCE.md +0 -47
  456. package/docs/FEATURES.md +0 -166
  457. package/docs/FONTS.md +0 -147
  458. package/docs/INSTALL.md +0 -119
  459. package/docs/KEYS.md +0 -40
  460. package/docs/OPERATIONS.md +0 -130
  461. package/docs/PR_DESCRIPTION.md +0 -149
  462. package/docs/SECRETS.md +0 -76
  463. package/docs/SECURITY.md +0 -30
  464. package/docs/SECURITY_CHECKLIST.md +0 -25
  465. package/docs/TASK.md +0 -99
  466. package/docs/TESTING.md +0 -190
  467. package/docs/TOOLS.md +0 -146
  468. package/docs/UTILS.md +0 -105
  469. package/docs/WALKTHROUGH.md +0 -165
  470. package/dot_config/clippy.toml +0 -55
  471. package/dot_config/dotfiles/versions.env.tmpl +0 -19
  472. package/dot_config/firefox/user.js +0 -8
  473. package/dot_config/git/config.tmpl +0 -77
  474. package/dot_config/go/aliases.sh +0 -61
  475. package/dot_config/go/env.sh +0 -24
  476. package/dot_config/ice/README.md +0 -13
  477. package/dot_config/ipython/profile_default/ipython_config.py.tmpl +0 -5
  478. package/dot_config/lsd/config.yaml +0 -19
  479. package/dot_config/nvim/snippets/all.lua +0 -9
  480. package/dot_config/nvim/snippets/python.lua +0 -16
  481. package/dot_config/shell/00-container-detect.sh +0 -53
  482. package/dot_config/shell/05-core-safety.sh.tmpl +0 -13
  483. package/dot_config/shell/40-ls-colors.sh.tmpl +0 -31
  484. package/dot_config/shell/90-theme-switch.sh +0 -70
  485. package/dot_config/topgrade/topgrade.toml.tmpl +0 -42
  486. package/dot_config/waybar/style.css +0 -8
  487. package/dot_config/zsh/rc.d/20-zinit.zsh.tmpl +0 -22
  488. package/dot_local/bin/executable_zig-install +0 -89
  489. package/dot_local/bin/voice_ops +0 -7
  490. package/scripts/ops/health-check.sh +0 -380
  491. package/scripts/tests/README.md +0 -241
  492. package/scripts/tests/benchmark.sh +0 -91
  493. package/scripts/tests/framework/assertions.sh +0 -283
  494. package/scripts/tests/framework/mocks.sh +0 -201
  495. package/scripts/tests/framework/test_runner.sh +0 -189
  496. package/scripts/tests/integration/test_install.sh +0 -237
  497. package/scripts/tests/performance/benchmark_runner.sh +0 -156
  498. package/scripts/tests/performance/regression_check.sh +0 -73
  499. package/scripts/tests/performance/stress_test.sh +0 -65
  500. package/scripts/tests/test-aliases.sh +0 -25
  501. package/scripts/tests/test-docker.sh +0 -48
  502. package/scripts/tests/unit/test_ai_aliases.sh +0 -158
  503. package/scripts/tests/unit/test_ai_cli_checks.sh +0 -47
  504. package/scripts/tests/unit/test_backup.sh +0 -227
  505. package/scripts/tests/unit/test_case_functions.sh +0 -238
  506. package/scripts/tests/unit/test_cd_aliases.sh +0 -367
  507. package/scripts/tests/unit/test_dot_cli.sh +0 -217
  508. package/scripts/tests/unit/test_encode64.sh +0 -67
  509. package/scripts/tests/unit/test_environment.sh +0 -78
  510. package/scripts/tests/unit/test_extract.sh +0 -163
  511. package/scripts/tests/unit/test_framework_edge_cases.sh +0 -113
  512. package/scripts/tests/unit/test_genpass.sh +0 -298
  513. package/scripts/tests/unit/test_install_edge_cases.sh +0 -167
  514. package/scripts/tests/unit/test_installers.sh +0 -172
  515. package/scripts/tests/unit/test_keygen.sh +0 -68
  516. package/scripts/tests/unit/test_logging.sh +0 -96
  517. package/scripts/tests/unit/test_os_detection_comprehensive.sh +0 -388
  518. package/scripts/tests/unit/test_package_managers_comprehensive.sh +0 -321
  519. package/scripts/tests/unit/test_prependpath.sh +0 -66
  520. package/scripts/tests/unit/test_prependpath_refactored.sh +0 -89
  521. package/scripts/tests/unit/test_rd.sh +0 -230
  522. package/scripts/tests/unit/test_security_fixes.sh +0 -130
  523. package/scripts/tests/unit/test_security_scripts.sh +0 -87
  524. package/scripts/tests/unit/test_template_validation.sh +0 -238
  525. package/scripts/tests/unit/test_utility_functions.sh +0 -144
  526. package/scripts/tests/unit/test_wave1_alias_split.sh +0 -132
  527. package/scripts/tests/unit/test_wave1_ci_pinning.sh +0 -61
  528. package/scripts/tests/unit/test_wave1_gitleaks_config.sh +0 -52
  529. package/scripts/tests/unit/test_wave1_heal_fixes.sh +0 -97
  530. package/scripts/tests/unit/test_wave1_install_gpg.sh +0 -35
  531. package/scripts/tests/unit/test_wave1_zshenv_path.sh +0 -89
  532. package/scripts/tests/unit/test_wave1_zshrc_lazy_hook.sh +0 -115
  533. package/scripts/tests/unit/test_wave2_dot_new_guard.sh +0 -75
  534. package/scripts/tests/unit/test_zipf.sh +0 -76
  535. /package/docs/{LEGACY_ROADMAP.md → archive/LEGACY_ROADMAP.md} +0 -0
  536. /package/docs/{REPO_AUDIT.md → archive/REPO_AUDIT.md} +0 -0
  537. /package/docs/{KEY_ROTATION.md → security/KEY_ROTATION.md} +0 -0
  538. /package/dot_config/ansible/{ansible.cfg.tmpl → ansible.cfg} +0 -0
  539. /package/dot_config/docker/{config.json.tmpl → config.json} +0 -0
  540. /package/dot_config/k9s/{config.yaml.tmpl → config.yaml} +0 -0
  541. /package/dot_config/pypoetry/{config.toml.tmpl → config.toml} +0 -0
  542. /package/dot_config/{pyrightconfig.json.tmpl → pyrightconfig.json} +0 -0
  543. /package/dot_config/tflint/{tflint.hcl.tmpl → tflint.hcl} +0 -0
  544. /package/dot_config/yarn/{yarnrc.yml.tmpl → yarnrc.yml} +0 -0
  545. /package/dot_config/zsh/rc.d/{40-bell.zsh.tmpl → 40-bell.zsh} +0 -0
  546. /package/dot_config/zsh/rc.d/{50-login-fortune.zsh.tmpl → 50-login-fortune.zsh} +0 -0
@@ -0,0 +1,213 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # check-manual.sh — Quality gates for docs/manual/
4
+ #
5
+ # Runs:
6
+ # - Markdown lint (markdownlint-cli2 if available)
7
+ # - Internal link check (custom — validates all [text](path.md) refs)
8
+ # - Spell check (codespell if available)
9
+ # - Coverage: every `dot <command>` referenced must be documented
10
+ #
11
+ # Usage:
12
+ # bash scripts/docs/check-manual.sh
13
+ # bash scripts/docs/check-manual.sh --strict # fail on warnings
14
+
15
+ set -euo pipefail
16
+
17
+ REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
18
+ MANUAL_DIR="$REPO_ROOT/docs/manual"
19
+ STRICT=false
20
+ FAILS=0
21
+
22
+ for arg in "$@"; do
23
+ case "$arg" in
24
+ --strict) STRICT=true ;;
25
+ esac
26
+ done
27
+
28
+ log() { printf '[check] %s\n' "$*"; }
29
+ warn() {
30
+ printf '[check] WARN: %s\n' "$*" >&2
31
+ if $STRICT; then
32
+ FAILS=$((FAILS + 1))
33
+ fi
34
+ }
35
+ fail() {
36
+ printf '[check] FAIL: %s\n' "$*" >&2
37
+ FAILS=$((FAILS + 1))
38
+ }
39
+
40
+ # -----------------------------------------------------------------------------
41
+ # Internal link check
42
+ # -----------------------------------------------------------------------------
43
+
44
+ check_links() {
45
+ log "checking internal links"
46
+ local broken=0
47
+ local mdfile path abs_path link
48
+ while IFS= read -r mdfile; do
49
+ while IFS= read -r link; do
50
+ [[ -z "$link" ]] && continue
51
+ path="${link#*(}"
52
+ path="${path%)*}"
53
+ path="${path%%#*}"
54
+ [[ -z "$path" ]] && continue
55
+ if [[ "$path" =~ ^/ ]]; then
56
+ abs_path="$REPO_ROOT$path"
57
+ else
58
+ abs_path="$(dirname "$mdfile")/$path"
59
+ fi
60
+ if [[ ! -f "$abs_path" ]]; then
61
+ # Try resolving
62
+ local resolved
63
+ resolved="$(cd "$(dirname "$mdfile")" 2>/dev/null && cd "$(dirname "$path")" 2>/dev/null && pwd)/$(basename "$path")"
64
+ [[ -f "$resolved" ]] && continue
65
+ fail "broken link in $(basename "$mdfile"): $link"
66
+ broken=$((broken + 1))
67
+ fi
68
+ done < <(grep -oE '\[[^]]+\]\([^)]+\.md[^)]*\)' "$mdfile" 2>/dev/null)
69
+ done < <(find "$MANUAL_DIR" -name '*.md' -type f)
70
+ [[ $broken -eq 0 ]] && log " ✓ all internal links resolve"
71
+ }
72
+
73
+ # -----------------------------------------------------------------------------
74
+ # Markdown lint
75
+ # -----------------------------------------------------------------------------
76
+
77
+ check_markdown_lint() {
78
+ if ! command -v markdownlint-cli2 &>/dev/null && ! command -v markdownlint &>/dev/null; then
79
+ warn "skipping markdown lint (markdownlint not installed)"
80
+ return
81
+ fi
82
+ log "running markdownlint"
83
+ local linter
84
+ linter="$(command -v markdownlint-cli2 || command -v markdownlint)"
85
+ if ! "$linter" "$MANUAL_DIR/**/*.md" 2>&1 | head -20; then
86
+ warn "markdown lint reported issues"
87
+ else
88
+ log " ✓ markdown clean"
89
+ fi
90
+ }
91
+
92
+ # -----------------------------------------------------------------------------
93
+ # Spell check
94
+ # -----------------------------------------------------------------------------
95
+
96
+ check_spelling() {
97
+ if ! command -v codespell &>/dev/null; then
98
+ warn "skipping spell check (codespell not installed)"
99
+ return
100
+ fi
101
+ log "running codespell"
102
+ if codespell --skip='*.toml,*.json' "$MANUAL_DIR/" 2>&1 | head -10; then
103
+ log " ✓ no typos detected"
104
+ else
105
+ warn "codespell found possible typos"
106
+ fi
107
+ }
108
+
109
+ # -----------------------------------------------------------------------------
110
+ # Command coverage — every `dot <cmd>` in the repo must be in CLI reference
111
+ # -----------------------------------------------------------------------------
112
+
113
+ check_command_coverage() {
114
+ log "checking command coverage"
115
+ local cli_ref="$MANUAL_DIR/03-reference/01-dot-cli.md"
116
+ if [[ ! -f "$cli_ref" ]]; then
117
+ warn "CLI reference missing"
118
+ return
119
+ fi
120
+
121
+ # Extract commands referenced in manual (single quotes intentional for grep pattern)
122
+ local referenced
123
+ # shellcheck disable=SC2016
124
+ referenced="$(grep -rhoE '`dot [a-z][a-z-]+`' "$MANUAL_DIR"/*.md "$MANUAL_DIR"/**/*.md 2>/dev/null |
125
+ sort -u |
126
+ sed -E 's/`dot ([a-z-]+)`/\1/')"
127
+
128
+ # Extract commands documented in CLI reference (single quotes intentional for grep pattern)
129
+ local documented
130
+ # shellcheck disable=SC2016
131
+ documented="$(grep -oE '^### `dot [a-z][a-z-]+`' "$cli_ref" 2>/dev/null |
132
+ sed -E 's/### `dot ([a-z-]+)`/\1/' |
133
+ sort -u)"
134
+
135
+ # Diff
136
+ local missing
137
+ missing="$(comm -23 <(echo "$referenced") <(echo "$documented") 2>/dev/null)"
138
+
139
+ if [[ -n "$missing" ]]; then
140
+ warn "commands referenced but not documented in CLI reference:"
141
+ echo "$missing" | while read -r cmd; do
142
+ [[ -z "$cmd" ]] && continue
143
+ echo " - dot $cmd"
144
+ done
145
+ else
146
+ log " ✓ all referenced commands documented"
147
+ fi
148
+ }
149
+
150
+ # -----------------------------------------------------------------------------
151
+ # File structure check
152
+ # -----------------------------------------------------------------------------
153
+
154
+ check_structure() {
155
+ log "checking directory structure"
156
+ local required=(
157
+ "00-introduction.md"
158
+ "01-concepts/01-architecture.md"
159
+ "01-concepts/02-trust-model.md"
160
+ "01-concepts/03-theme-engine.md"
161
+ "01-concepts/04-fleet.md"
162
+ "01-concepts/05-self-healing.md"
163
+ "02-tutorials/01-first-install.md"
164
+ "02-tutorials/02-add-wallpaper.md"
165
+ "02-tutorials/03-create-profile.md"
166
+ "02-tutorials/04-encrypt-secret.md"
167
+ "02-tutorials/05-deploy-fleet.md"
168
+ "03-reference/01-dot-cli.md"
169
+ "03-reference/02-config-files.md"
170
+ "03-reference/03-environment.md"
171
+ "03-reference/04-templates.md"
172
+ "03-reference/05-feature-flags.md"
173
+ "04-cookbook/01-recipes.md"
174
+ "04-cookbook/02-troubleshooting.md"
175
+ "04-cookbook/03-faq.md"
176
+ "05-appendices/A-platform-matrix.md"
177
+ "05-appendices/B-security-checklist.md"
178
+ "05-appendices/C-glossary.md"
179
+ "05-appendices/D-bibliography.md"
180
+ "05-appendices/E-license.md"
181
+ )
182
+ local missing=0
183
+ for f in "${required[@]}"; do
184
+ if [[ ! -f "$MANUAL_DIR/$f" ]]; then
185
+ fail "missing required file: $f"
186
+ missing=$((missing + 1))
187
+ fi
188
+ done
189
+ [[ $missing -eq 0 ]] && log " ✓ all required files present"
190
+ }
191
+
192
+ # -----------------------------------------------------------------------------
193
+ # Main
194
+ # -----------------------------------------------------------------------------
195
+
196
+ main() {
197
+ log "validating $MANUAL_DIR"
198
+ check_structure
199
+ check_links
200
+ check_command_coverage
201
+ check_markdown_lint
202
+ check_spelling
203
+
204
+ echo ""
205
+ if [[ $FAILS -gt 0 ]]; then
206
+ printf '[check] FAILED: %d issue(s)\n' "$FAILS" >&2
207
+ exit 1
208
+ else
209
+ log "all checks passed"
210
+ fi
211
+ }
212
+
213
+ main
@@ -0,0 +1,465 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # Dotfiles CLI - Agent Mode Commands (extracted from meta.sh)
4
+ # mode list|current|show|set|run|doctor|card|log|checkpoint|conformance
5
+
6
+ set -euo pipefail
7
+
8
+ # Guard: only define functions, do not execute on source.
9
+ # These functions are sourced by meta.sh for dispatch.
10
+
11
+ _agent_repo_root() {
12
+ require_source_dir
13
+ }
14
+
15
+ _agent_profiles_file() {
16
+ local repo_root
17
+ repo_root="$(_agent_repo_root)"
18
+ echo "${AGENT_PROFILE_CONFIG:-$repo_root/dot_config/dotfiles/agent-profiles.json}"
19
+ }
20
+
21
+ _agent_state_file() {
22
+ echo "${AGENT_STATE_FILE:-$HOME/.config/dotfiles/agent-mode.env}"
23
+ }
24
+
25
+ _agent_default_profile() {
26
+ local file
27
+ file="$(_agent_profiles_file)"
28
+ jq -r '.defaultProfile' "$file"
29
+ }
30
+
31
+ _agent_current_profile() {
32
+ local state_file current
33
+ state_file="$(_agent_state_file)"
34
+ if [[ -f "$state_file" ]]; then
35
+ current="$(sed -n 's/^DOT_AGENT_PROFILE=//p' "$state_file" | tail -n 1)"
36
+ if [[ -n "$current" ]]; then
37
+ echo "$current"
38
+ return 0
39
+ fi
40
+ fi
41
+ _agent_default_profile
42
+ }
43
+
44
+ _agent_profile_exists() {
45
+ local name="$1"
46
+ jq -e --arg name "$name" '.profiles[$name]' "$(_agent_profiles_file)" >/dev/null 2>&1
47
+ }
48
+
49
+ _agent_profile_field() {
50
+ local name="$1" field="$2"
51
+ jq -r --arg name "$name" --arg field "$field" '.profiles[$name][$field]' "$(_agent_profiles_file)"
52
+ }
53
+
54
+ _agent_assert_dependencies() {
55
+ local file
56
+ file="$(_agent_profiles_file)"
57
+ if [[ ! -f "$file" ]]; then
58
+ die "Agent profile config not found: $file"
59
+ fi
60
+ if ! command -v jq >/dev/null 2>&1; then
61
+ die "jq is required for dot mode"
62
+ fi
63
+ }
64
+
65
+ _agent_card_file() {
66
+ local repo_root
67
+ repo_root="$(_agent_repo_root)"
68
+ echo "${AGENT_CARD_CONFIG:-$repo_root/dot_config/dotfiles/agent-card.json}"
69
+ }
70
+
71
+ _agent_checkpoint_file() {
72
+ local checkpoint_id="$1"
73
+ echo "$(dot_agent_checkpoint_dir)/${checkpoint_id}.json"
74
+ }
75
+
76
+ _agent_apply_profile_env() {
77
+ local name="$1"
78
+ export DOT_AGENT_PROFILE="$name"
79
+ export DOT_AGENT_APPROVAL="$(_agent_profile_field "$name" "approval")"
80
+ export DOT_AGENT_FILESYSTEM="$(_agent_profile_field "$name" "filesystem")"
81
+ export DOT_AGENT_NETWORK="$(_agent_profile_field "$name" "network")"
82
+ export DOT_AGENT_MCP_PROFILE="$(_agent_profile_field "$name" "mcpProfile")"
83
+ export DOT_AGENT_MAX_STEPS="$(_agent_profile_field "$name" "maxSteps")"
84
+ }
85
+
86
+ _agent_rbac_enforcement() {
87
+ local file
88
+ file="$(_agent_profiles_file)"
89
+ jq -r '.rbac.enforcement // "advisory"' "$file"
90
+ }
91
+
92
+ _agent_current_role() {
93
+ local state_file role
94
+ state_file="$(_agent_state_file)"
95
+ if [[ -f "$state_file" ]]; then
96
+ role="$(sed -n 's/^DOT_AGENT_ROLE=//p' "$state_file" | tail -n 1)"
97
+ if [[ -n "$role" ]]; then
98
+ echo "$role"
99
+ return 0
100
+ fi
101
+ fi
102
+ jq -r '.rbac.defaultRole // "developer"' "$(_agent_profiles_file)"
103
+ }
104
+
105
+ _agent_role_allows_profile() {
106
+ local role="$1" profile="$2"
107
+ local file
108
+ file="$(_agent_profiles_file)"
109
+ jq -e --arg role "$role" --arg profile "$profile" '
110
+ .rbac.roles[$role].allowedProfiles // [] | index($profile)
111
+ ' "$file" >/dev/null 2>&1
112
+ }
113
+
114
+ _agent_enforce_rbac() {
115
+ local target_profile="$1"
116
+ local enforcement role
117
+ enforcement="$(_agent_rbac_enforcement)"
118
+ role="$(_agent_current_role)"
119
+ if _agent_role_allows_profile "$role" "$target_profile"; then
120
+ return 0
121
+ fi
122
+ if [[ "$enforcement" == "strict" ]]; then
123
+ die "RBAC: role '$role' is not allowed to use profile '$target_profile' (enforcement: strict)"
124
+ else
125
+ ui_warn "RBAC" "role '$role' is not recommended for profile '$target_profile' (enforcement: advisory)"
126
+ fi
127
+ }
128
+
129
+ cmd_mode() {
130
+ _agent_assert_dependencies
131
+
132
+ local subcommand="${1:-current}"
133
+ if [[ -z "${1:-}" ]] || [[ "${1:-}" == --* ]]; then
134
+ subcommand="current"
135
+ else
136
+ shift || true
137
+ fi
138
+
139
+ case "$subcommand" in
140
+ list)
141
+ local current
142
+ current="$(_agent_current_profile)"
143
+ dot_agent_session_log "list" "$current" "ok"
144
+ ui_header "Agent Modes"
145
+ jq -r '.profiles | to_entries[] | "\(.key)\t\(.value.description)"' "$(_agent_profiles_file)" |
146
+ while IFS=$'\t' read -r name description; do
147
+ if [[ "$name" == "$current" ]]; then
148
+ ui_ok "$name" "$description [current]"
149
+ else
150
+ ui_info "$name" "$description"
151
+ fi
152
+ done
153
+ ;;
154
+ current)
155
+ local current
156
+ current="$(_agent_current_profile)"
157
+ dot_agent_session_log "current" "$current" "ok"
158
+ ui_header "Agent Mode"
159
+ ui_ok "Profile" "$current"
160
+ ui_ok "Approval" "$(_agent_profile_field "$current" "approval")"
161
+ ui_ok "Filesystem" "$(_agent_profile_field "$current" "filesystem")"
162
+ ui_ok "Network" "$(_agent_profile_field "$current" "network")"
163
+ ui_ok "MCP" "$(_agent_profile_field "$current" "mcpProfile")"
164
+ ;;
165
+ show)
166
+ local name="${1:-}"
167
+ [[ -n "$name" ]] || die "Usage: dot mode show <profile>"
168
+ _agent_profile_exists "$name" || die "Unknown agent profile: $name"
169
+ dot_agent_session_log "show" "$name" "ok"
170
+ ui_header "Agent Mode"
171
+ ui_ok "Profile" "$name"
172
+ ui_ok "Description" "$(_agent_profile_field "$name" "description")"
173
+ ui_ok "Approval" "$(_agent_profile_field "$name" "approval")"
174
+ ui_ok "Filesystem" "$(_agent_profile_field "$name" "filesystem")"
175
+ ui_ok "Network" "$(_agent_profile_field "$name" "network")"
176
+ ui_ok "Max steps" "$(_agent_profile_field "$name" "maxSteps")"
177
+ ui_ok "MCP" "$(_agent_profile_field "$name" "mcpProfile")"
178
+ ;;
179
+ set)
180
+ local name="${1:-}" state_file
181
+ [[ -n "$name" ]] || die "Usage: dot mode set <profile>"
182
+ _agent_profile_exists "$name" || die "Unknown agent profile: $name"
183
+ _agent_enforce_rbac "$name"
184
+ state_file="$(_agent_state_file)"
185
+ mkdir -p "$(dirname "$state_file")"
186
+ cat >"$state_file" <<EOF
187
+ DOT_AGENT_PROFILE=$name
188
+ DOT_AGENT_APPROVAL=$(_agent_profile_field "$name" "approval")
189
+ DOT_AGENT_FILESYSTEM=$(_agent_profile_field "$name" "filesystem")
190
+ DOT_AGENT_NETWORK=$(_agent_profile_field "$name" "network")
191
+ DOT_AGENT_MCP_PROFILE=$(_agent_profile_field "$name" "mcpProfile")
192
+ DOT_AGENT_MAX_STEPS=$(_agent_profile_field "$name" "maxSteps")
193
+ EOF
194
+ dot_agent_session_log "set" "$name" "ok" "state_file=$state_file"
195
+ ui_ok "Agent mode" "$name"
196
+ ui_info "State file" "$state_file"
197
+ ;;
198
+ run)
199
+ local name="${1:-}" current
200
+ if [[ -n "$name" ]] && _agent_profile_exists "$name"; then
201
+ shift || true
202
+ else
203
+ name="$(_agent_current_profile)"
204
+ fi
205
+ [[ $# -gt 0 ]] || die "Usage: dot mode run [profile] <command> [args...]"
206
+ _agent_apply_profile_env "$name"
207
+ local checkpoint_file checkpoint_id
208
+ checkpoint_file="$(dot_agent_checkpoint_create "$name" "ready" "$@")"
209
+ checkpoint_id="$(basename "$checkpoint_file" .json)"
210
+ ui_info "Agent mode" "$name"
211
+ dot_agent_session_log "run_start" "$name" "running" "argv=$*" "checkpoint_id=$checkpoint_id"
212
+ set +e
213
+ "$@"
214
+ local exit_code=$?
215
+ set -e
216
+ if [[ "$exit_code" -eq 0 ]]; then
217
+ dot_agent_session_log "run_finish" "$name" "ok" "exit_code=$exit_code" "checkpoint_id=$checkpoint_id"
218
+ else
219
+ dot_agent_session_log "run_finish" "$name" "failed" "exit_code=$exit_code" "checkpoint_id=$checkpoint_id"
220
+ fi
221
+ return "$exit_code"
222
+ ;;
223
+ doctor)
224
+ local file
225
+ file="$(_agent_profiles_file)"
226
+ dot_agent_session_log "doctor" "$(_agent_current_profile)" "ok"
227
+ ui_header "Agent Mode Doctor"
228
+ if jq empty "$file" >/dev/null 2>&1; then
229
+ ui_ok "Profile config" "$file"
230
+ else
231
+ die "Invalid JSON: $file"
232
+ fi
233
+ jq -e '.profiles[.defaultProfile]' "$file" >/dev/null 2>&1 || die "Default profile missing"
234
+ ui_ok "Default profile" "$(_agent_default_profile)"
235
+ ;;
236
+ card)
237
+ local card_file json_mode=0
238
+ card_file="$(_agent_card_file)"
239
+ [[ -f "$card_file" ]] || die "Agent card not found: $card_file"
240
+ if [[ "${1:-}" == "--json" ]]; then
241
+ json_mode=1
242
+ fi
243
+ dot_agent_session_log "card" "$(_agent_current_profile)" "ok"
244
+ if [[ "$json_mode" -eq 1 ]] || ! command -v jq >/dev/null 2>&1; then
245
+ exec cat "$card_file"
246
+ fi
247
+ ui_header "Agent Card"
248
+ jq -r '
249
+ "Name\t\(.name)",
250
+ "Version\t\(.version)",
251
+ "Protocols\t\(.protocols | join(", "))",
252
+ "Default mode\t\(.defaultProfile)",
253
+ "Support\t\(.platforms | join(", "))"
254
+ ' "$card_file" | while IFS=$'\t' read -r key value; do
255
+ ui_ok "$key" "$value"
256
+ done
257
+ ;;
258
+ log)
259
+ dot_agent_session_log "log" "$(_agent_current_profile)" "ok"
260
+ dot_agent_session_tail "${1:-20}"
261
+ ;;
262
+ checkpoint)
263
+ local action="${1:-list}"
264
+ shift || true
265
+ case "$action" in
266
+ save)
267
+ local name="${1:-}" checkpoint_file checkpoint_id
268
+ if [[ -n "$name" ]] && _agent_profile_exists "$name"; then
269
+ shift || true
270
+ else
271
+ name="$(_agent_current_profile)"
272
+ fi
273
+ [[ $# -gt 0 ]] || die "Usage: dot agent checkpoint save [profile] <command> [args...]"
274
+ _agent_apply_profile_env "$name"
275
+ checkpoint_file="$(dot_agent_checkpoint_create "$name" "saved" "$@")"
276
+ checkpoint_id="$(basename "$checkpoint_file" .json)"
277
+ dot_agent_session_log "checkpoint_save" "$name" "ok" "checkpoint_id=$checkpoint_id"
278
+ ui_header "Agent Checkpoint"
279
+ ui_ok "ID" "$checkpoint_id"
280
+ ui_ok "Profile" "$name"
281
+ ui_ok "Command" "$*"
282
+ ui_ok "File" "$checkpoint_file"
283
+ ;;
284
+ list)
285
+ local count="${1:-20}"
286
+ dot_agent_session_log "checkpoint_list" "$(_agent_current_profile)" "ok"
287
+ if ! command -v jq >/dev/null 2>&1; then
288
+ dot_agent_checkpoint_tail "$count"
289
+ return 0
290
+ fi
291
+ ui_header "Agent Checkpoints"
292
+ dot_agent_checkpoint_tail "$count" | jq -r '"\(.id)\t\(.profile)\t\(.status)\t\(.created_at)\t\(.argv | join(" "))"' | while IFS=$'\t' read -r id profile status created_at argv; do
293
+ ui_ok "$id" "$profile / $status / $created_at / $argv"
294
+ done
295
+ ;;
296
+ show)
297
+ local checkpoint_id="${1:-}" checkpoint_file json_mode=0
298
+ [[ -n "$checkpoint_id" ]] || die "Usage: dot agent checkpoint show <id> [--json]"
299
+ shift || true
300
+ [[ "${1:-}" == "--json" || "${1:-}" == "-j" ]] && json_mode=1
301
+ checkpoint_file="$(_agent_checkpoint_file "$checkpoint_id")"
302
+ [[ -f "$checkpoint_file" ]] || die "Checkpoint not found: $checkpoint_id"
303
+ dot_agent_session_log "checkpoint_show" "$(_agent_current_profile)" "ok" "checkpoint_id=$checkpoint_id"
304
+ if [[ "$json_mode" -eq 1 ]] || ! command -v jq >/dev/null 2>&1; then
305
+ exec cat "$checkpoint_file"
306
+ fi
307
+ ui_header "Agent Checkpoint"
308
+ jq -r '"ID\t\(.id)",
309
+ "Profile\t\(.profile)",
310
+ "Status\t\(.status)",
311
+ "Created\t\(.created_at)",
312
+ "Command\t\(.argv | join(" "))"' "$checkpoint_file" | while IFS=$'\t' read -r key value; do
313
+ ui_ok "$key" "$value"
314
+ done
315
+ ;;
316
+ replay)
317
+ local checkpoint_id="${1:-}" checkpoint_file replay_profile
318
+ local -a replay_argv=()
319
+ [[ -n "$checkpoint_id" ]] || die "Usage: dot agent checkpoint replay <id>"
320
+ checkpoint_file="$(_agent_checkpoint_file "$checkpoint_id")"
321
+ [[ -f "$checkpoint_file" ]] || die "Checkpoint not found: $checkpoint_id"
322
+ replay_profile="$(jq -r '.profile' "$checkpoint_file")"
323
+ while IFS= read -r item; do
324
+ replay_argv+=("$item")
325
+ done < <(jq -r '.argv[]' "$checkpoint_file")
326
+ [[ "${#replay_argv[@]}" -gt 0 ]] || die "Checkpoint has no replayable command: $checkpoint_id"
327
+ _agent_apply_profile_env "$replay_profile"
328
+ dot_agent_session_log "checkpoint_replay" "$replay_profile" "running" "checkpoint_id=$checkpoint_id"
329
+ set +e
330
+ "${replay_argv[@]}"
331
+ local exit_code=$?
332
+ set -e
333
+ if [[ "$exit_code" -eq 0 ]]; then
334
+ dot_agent_session_log "checkpoint_replay_finish" "$replay_profile" "ok" "checkpoint_id=$checkpoint_id" "exit_code=$exit_code"
335
+ else
336
+ dot_agent_session_log "checkpoint_replay_finish" "$replay_profile" "failed" "checkpoint_id=$checkpoint_id" "exit_code=$exit_code"
337
+ fi
338
+ return "$exit_code"
339
+ ;;
340
+ *)
341
+ echo "Usage: dot agent checkpoint [save|list|show|replay]" >&2
342
+ exit 1
343
+ ;;
344
+ esac
345
+ ;;
346
+ delegate)
347
+ local delegate_name="${1:-}"
348
+ [[ -n "$delegate_name" ]] || die "Usage: dot agent delegate <name> <command> [args...]"
349
+ shift || true
350
+ [[ $# -gt 0 ]] || die "Usage: dot agent delegate <name> <command> [args...]"
351
+ local profiles_file current_profile
352
+ profiles_file="$(_agent_profiles_file)"
353
+ current_profile="$(_agent_current_profile)"
354
+ # Check delegation is enabled
355
+ local delegation_enabled
356
+ delegation_enabled="$(jq -r '.delegation.enabled // false' "$profiles_file")"
357
+ [[ "$delegation_enabled" == "true" ]] || die "Delegation is not enabled in agent-profiles.json"
358
+ # Check current profile can delegate
359
+ local can_delegate
360
+ can_delegate="$(jq -r --arg p "$current_profile" '.profiles[$p].canDelegate // false' "$profiles_file")"
361
+ [[ "$can_delegate" == "true" ]] || die "Profile '$current_profile' cannot delegate"
362
+ # Check delegate name exists
363
+ jq -e --arg d "$delegate_name" '.delegation.allowedDelegates[$d]' "$profiles_file" >/dev/null 2>&1 || die "Unknown delegate: $delegate_name"
364
+ # Read delegate config
365
+ local delegate_profile delegate_timeout delegate_max_steps
366
+ delegate_profile="$(jq -r --arg d "$delegate_name" '.delegation.allowedDelegates[$d].profile' "$profiles_file")"
367
+ delegate_timeout="$(jq -r --arg d "$delegate_name" '.delegation.allowedDelegates[$d].timeout // 300' "$profiles_file")"
368
+ delegate_max_steps="$(jq -r --arg d "$delegate_name" '.delegation.allowedDelegates[$d].maxSteps // 4' "$profiles_file")"
369
+ # Apply delegate profile env
370
+ _agent_apply_profile_env "$delegate_profile"
371
+ export DOT_AGENT_MAX_STEPS="$delegate_max_steps"
372
+ export DOT_AGENT_DELEGATE="$delegate_name"
373
+ export DOT_AGENT_PARENT_PROFILE="$current_profile"
374
+ dot_agent_session_log "delegate_start" "$delegate_profile" "running" "delegate=$delegate_name" "parent=$current_profile" "timeout=$delegate_timeout"
375
+ ui_info "Delegating" "$delegate_name (profile: $delegate_profile, timeout: ${delegate_timeout}s)"
376
+ set +e
377
+ timeout "$delegate_timeout" "$@"
378
+ local exit_code=$?
379
+ set -e
380
+ if [[ "$exit_code" -eq 0 ]]; then
381
+ dot_agent_session_log "delegate_finish" "$delegate_profile" "ok" "delegate=$delegate_name" "exit_code=$exit_code"
382
+ ui_ok "Delegate" "$delegate_name completed"
383
+ else
384
+ dot_agent_session_log "delegate_finish" "$delegate_profile" "failed" "delegate=$delegate_name" "exit_code=$exit_code"
385
+ ui_err "Delegate" "$delegate_name failed (exit $exit_code)"
386
+ fi
387
+ return "$exit_code"
388
+ ;;
389
+ a2a-card)
390
+ local a2a_card_file json_mode=0 validate_mode=0 strict_mode=0
391
+ local repo_root
392
+ repo_root="$(_agent_repo_root)"
393
+ a2a_card_file="$repo_root/.well-known/agent-card.json"
394
+ while [[ $# -gt 0 ]]; do
395
+ case "$1" in
396
+ --json | -j)
397
+ json_mode=1
398
+ shift
399
+ ;;
400
+ --validate | --strict | -s)
401
+ validate_mode=1
402
+ strict_mode=1
403
+ shift
404
+ ;;
405
+ *) shift ;;
406
+ esac
407
+ done
408
+ [[ -f "$a2a_card_file" ]] || die "A2A v0.3 card not found: $a2a_card_file"
409
+ dot_agent_session_log "a2a-card" "$(_agent_current_profile)" "ok"
410
+ if [[ "$json_mode" -eq 1 ]]; then
411
+ exec cat "$a2a_card_file"
412
+ fi
413
+ if [[ "$validate_mode" -eq 1 ]]; then
414
+ local v_issues=0
415
+ jq empty "$a2a_card_file" >/dev/null 2>&1 || {
416
+ ui_err "JSON" "invalid"
417
+ exit 1
418
+ }
419
+ ui_header "A2A v0.3 Card Validation"
420
+ local sv
421
+ sv="$(jq -r '.specVersion // empty' "$a2a_card_file")"
422
+ if [[ "$sv" == "0.3" ]]; then ui_ok "specVersion" "$sv"; else
423
+ ui_err "specVersion" "expected 0.3, got $sv"
424
+ v_issues=$((v_issues + 1))
425
+ fi
426
+ if jq -e '.skills | type == "array" and length > 0' "$a2a_card_file" >/dev/null 2>&1; then
427
+ ui_ok "skills" "$(jq '.skills | length' "$a2a_card_file") skills"
428
+ else
429
+ ui_err "skills" "missing or empty"
430
+ v_issues=$((v_issues + 1))
431
+ fi
432
+ if jq -e '.authentication' "$a2a_card_file" >/dev/null 2>&1; then ui_ok "authentication" "present"; else
433
+ ui_err "authentication" "missing"
434
+ v_issues=$((v_issues + 1))
435
+ fi
436
+ if jq -e '.signing.method' "$a2a_card_file" >/dev/null 2>&1; then ui_ok "signing" "$(jq -r '.signing.method' "$a2a_card_file")"; else
437
+ ui_err "signing" "missing method"
438
+ v_issues=$((v_issues + 1))
439
+ fi
440
+ if [[ "$v_issues" -gt 0 && "$strict_mode" -eq 1 ]]; then exit 1; fi
441
+ return 0
442
+ fi
443
+ ui_header "A2A v0.3 Agent Card"
444
+ jq -r '
445
+ "Name\t\(.name)",
446
+ "Version\t\(.version)",
447
+ "Spec\t\(.specVersion)",
448
+ "Protocols\t\(.protocols | join(", "))",
449
+ "Skills\t\(.skills | length) defined",
450
+ "Auth\t\(.authentication.schemes | join(", "))",
451
+ "Signing\t\(.signing.method)"
452
+ ' "$a2a_card_file" | while IFS=$'\t' read -r key value; do
453
+ ui_ok "$key" "$value"
454
+ done
455
+ ;;
456
+ conformance)
457
+ dot_agent_session_log "conformance" "$(_agent_current_profile)" "ok"
458
+ run_script "scripts/diagnostics/a2a-conformance.sh" "A2A conformance script" "$@"
459
+ ;;
460
+ *)
461
+ echo "Usage: dot mode [list|current|show|set|run|doctor|card|log|checkpoint|conformance|a2a-card]" >&2
462
+ exit 1
463
+ ;;
464
+ esac
465
+ }