@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,96 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # Copyright header validator (zero-tolerance policy).
4
+ #
5
+ # Scans source files for a copyright header in the first 10 lines. Patterns
6
+ # are deliberately narrow to avoid false positives on C-style `(c)` comments
7
+ # or the word "token" appearing in running text.
8
+ #
9
+ # Usage:
10
+ # check-copyright-headers.sh [--extensions=sh,lua,nix,...] [--excludes=REGEX]
11
+ #
12
+ # Exit codes:
13
+ # 0 all files have a valid header
14
+ # 1 one or more files are missing a header
15
+ # 2 invalid invocation
16
+
17
+ set -euo pipefail
18
+
19
+ EXTENSIONS_DEFAULT="sh,lua,nix,py,js,ts,go,rs,java,cpp,c,h,hpp"
20
+ EXCLUDES_DEFAULT='(^|/)(node_modules|\.git|vendor|target|build)/|\.tmpl$|(^|/)\.chezmoitemplates/'
21
+
22
+ EXTENSIONS="$EXTENSIONS_DEFAULT"
23
+ EXCLUDES="$EXCLUDES_DEFAULT"
24
+
25
+ for arg in "$@"; do
26
+ case "$arg" in
27
+ --extensions=*) EXTENSIONS="${arg#*=}" ;;
28
+ --excludes=*) EXCLUDES="${arg#*=}" ;;
29
+ -h | --help)
30
+ sed -n '2,14p' "$0" | sed 's/^# \{0,1\}//'
31
+ exit 0
32
+ ;;
33
+ *)
34
+ echo "Unknown argument: $arg" >&2
35
+ exit 2
36
+ ;;
37
+ esac
38
+ done
39
+
40
+ # Narrow patterns — each must be specific enough that running prose cannot match.
41
+ # Deliberately DROPPED: bare "(c) " (false-positives in C comments),
42
+ # bare "All rights reserved" (often appears in vendored prose).
43
+ # Matched by `grep -F`, so these are literal strings.
44
+ PATTERNS=(
45
+ "Copyright (c)"
46
+ "Copyright ©"
47
+ "SPDX-License-Identifier:"
48
+ "© "
49
+ )
50
+
51
+ # Build a ripgrep glob like `{*.sh,*.lua,*.nix}` from the comma list.
52
+ IFS=',' read -r -a exts <<<"$EXTENSIONS"
53
+ glob="{"
54
+ for i in "${!exts[@]}"; do
55
+ [[ $i -gt 0 ]] && glob+=","
56
+ glob+="*.${exts[$i]}"
57
+ done
58
+ glob+="}"
59
+
60
+ mapfile -t all_files < <(rg --files -g "$glob" 2>/dev/null || true)
61
+
62
+ if [[ "${#all_files[@]}" -eq 0 ]]; then
63
+ echo "::notice::No files matched extensions: $EXTENSIONS"
64
+ exit 0
65
+ fi
66
+
67
+ missing=()
68
+ for file in "${all_files[@]}"; do
69
+ if [[ "$file" =~ $EXCLUDES ]]; then
70
+ continue
71
+ fi
72
+
73
+ found=false
74
+ # Read the first 10 lines once; search each pattern against that buffer.
75
+ head_buf="$(head -n 10 "$file" 2>/dev/null || true)"
76
+ for pattern in "${PATTERNS[@]}"; do
77
+ if grep -qF -- "$pattern" <<<"$head_buf"; then
78
+ found=true
79
+ break
80
+ fi
81
+ done
82
+
83
+ $found || missing+=("$file")
84
+ done
85
+
86
+ if [[ "${#missing[@]}" -gt 0 ]]; then
87
+ echo "::error::Copyright header validation failed — ${#missing[@]} file(s) missing header"
88
+ echo "Files missing a recognised copyright header:"
89
+ printf ' - %s\n' "${missing[@]}"
90
+ echo
91
+ echo "Add ONE of the following to the first 10 lines:"
92
+ printf ' - %s\n' "${PATTERNS[@]}"
93
+ exit 1
94
+ fi
95
+
96
+ echo "::notice::All ${#all_files[@]} file(s) have a valid copyright header"
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # Guard against full-history gitleaks scans on manual runs.
4
+ # This ensures workflow checkout remains shallow near gitleaks steps.
5
+
6
+ set -euo pipefail
7
+
8
+ check_workflow() {
9
+ local workflow="$1"
10
+ local failed=0
11
+ local line_no
12
+
13
+ while IFS=: read -r line_no _; do
14
+ local start end context
15
+ start=$((line_no - 16))
16
+ end=$((line_no + 2))
17
+ if [[ "$start" -lt 1 ]]; then
18
+ start=1
19
+ fi
20
+
21
+ context="$(sed -n "${start},${end}p" "$workflow")"
22
+
23
+ if [[ "$context" != *"actions/checkout"* ]]; then
24
+ echo "ERROR: $workflow:$line_no missing nearby checkout for gitleaks step."
25
+ failed=1
26
+ continue
27
+ fi
28
+
29
+ if [[ "$context" != *"fetch-depth: 1"* ]]; then
30
+ echo "ERROR: $workflow:$line_no gitleaks step must use checkout fetch-depth: 1."
31
+ failed=1
32
+ fi
33
+
34
+ if [[ "$context" == *"fetch-depth: 0"* ]]; then
35
+ echo "ERROR: $workflow:$line_no gitleaks step contains forbidden fetch-depth: 0."
36
+ failed=1
37
+ fi
38
+ done < <(grep -n "gitleaks/gitleaks-action" "$workflow" || true)
39
+
40
+ return "$failed"
41
+ }
42
+
43
+ main() {
44
+ local failed=0
45
+
46
+ check_workflow ".github/workflows/ci.yml" || failed=1
47
+ check_workflow ".github/workflows/security-enhanced.yml" || failed=1
48
+
49
+ if [[ "$failed" -ne 0 ]]; then
50
+ echo "Gitleaks checkout guard failed."
51
+ exit 1
52
+ fi
53
+
54
+ echo "Gitleaks checkout guard passed."
55
+ }
56
+
57
+ main "$@"
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # Install a pinned Chezmoi release with checksum verification.
4
+ set -euo pipefail
5
+
6
+ VERSION="${1:-}"
7
+ BIN_DIR="${2:-$HOME/.local/bin}"
8
+
9
+ if [[ -z "$VERSION" ]]; then
10
+ echo "Usage: $0 <chezmoi-version> [bin-dir]" >&2
11
+ exit 1
12
+ fi
13
+
14
+ OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
15
+ ARCH="$(uname -m)"
16
+
17
+ case "$OS" in
18
+ linux | darwin) ;;
19
+ *)
20
+ echo "Unsupported OS: $OS" >&2
21
+ exit 1
22
+ ;;
23
+ esac
24
+
25
+ case "$ARCH" in
26
+ x86_64 | amd64) ARCH="amd64" ;;
27
+ arm64 | aarch64) ARCH="arm64" ;;
28
+ *)
29
+ echo "Unsupported architecture: $ARCH" >&2
30
+ exit 1
31
+ ;;
32
+ esac
33
+
34
+ ASSET="chezmoi_${VERSION}_${OS}_${ARCH}.tar.gz"
35
+ CHECKSUMS_ASSET="chezmoi_${VERSION}_checksums.txt"
36
+ BASE_URL="https://github.com/twpayne/chezmoi/releases/download/v${VERSION}"
37
+
38
+ TMP_DIR="$(umask 077 && mktemp -d)"
39
+ trap 'rm -rf "$TMP_DIR"' EXIT
40
+
41
+ # Support both old and new checksum filenames.
42
+ if ! curl -fsSL -o "$TMP_DIR/checksums.txt" "$BASE_URL/$CHECKSUMS_ASSET"; then
43
+ curl -fsSL -o "$TMP_DIR/checksums.txt" "$BASE_URL/checksums.txt"
44
+ fi
45
+ curl -fsSL -o "$TMP_DIR/$ASSET" "$BASE_URL/$ASSET"
46
+
47
+ CHECKSUM_LINE="$(grep -E "[[:space:]]${ASSET}$" "$TMP_DIR/checksums.txt" | head -n1 || true)"
48
+ if [[ -z "$CHECKSUM_LINE" ]]; then
49
+ echo "Checksum entry not found for $ASSET" >&2
50
+ exit 1
51
+ fi
52
+
53
+ (
54
+ cd "$TMP_DIR"
55
+ if command -v sha256sum >/dev/null 2>&1; then
56
+ echo "$CHECKSUM_LINE" | sha256sum -c -
57
+ else
58
+ echo "$CHECKSUM_LINE" | shasum -a 256 -c -
59
+ fi
60
+ )
61
+
62
+ tar -xzf "$TMP_DIR/$ASSET" -C "$TMP_DIR" chezmoi
63
+ mkdir -p "$BIN_DIR"
64
+ install -m 755 "$TMP_DIR/chezmoi" "$BIN_DIR/chezmoi"
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
2
3
  # CI Configuration Validation Script
3
4
  # Verifies that all zero-warning policy components are properly configured
4
5
 
@@ -7,16 +8,17 @@ set -euo pipefail
7
8
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
9
  REPO_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
9
10
 
10
- # Colors for output
11
- RED='\033[0;31m'
12
- GREEN='\033[0;32m'
13
- YELLOW='\033[0;33m'
14
- BLUE='\033[0;34m'
15
- NC='\033[0m'
11
+ # Colors for output (respect NO_COLOR: https://no-color.org)
12
+ if [[ -z "${NO_COLOR:-}" ]] && [[ -t 1 ]]; then
13
+ RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m'
14
+ BLUE='\033[0;34m' NC='\033[0m'
15
+ else
16
+ RED='' GREEN='' YELLOW='' BLUE='' NC=''
17
+ fi
16
18
 
17
- echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
18
- echo -e "${BLUE} CI CONFIGURATION VALIDATOR ${NC}"
19
- echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
19
+ printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
20
+ printf '%b\n' "${BLUE} CI CONFIGURATION VALIDATOR ${NC}"
21
+ printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
20
22
  echo ""
21
23
 
22
24
  ERRORS=0
@@ -28,10 +30,10 @@ check_file_exists() {
28
30
  local description="$2"
29
31
 
30
32
  if [[ -f "$file" ]]; then
31
- echo -e " ${GREEN}✓${NC} $description"
33
+ printf '%b\n' " ${GREEN}✓${NC} $description"
32
34
  return 0
33
35
  else
34
- echo -e " ${RED}✗${NC} $description"
36
+ printf '%b\n' " ${RED}✗${NC} $description"
35
37
  ((ERRORS++))
36
38
  return 1
37
39
  fi
@@ -43,10 +45,10 @@ check_pattern_in_file() {
43
45
  local description="$3"
44
46
 
45
47
  if [[ -f "$file" ]] && grep -q "$pattern" "$file"; then
46
- echo -e " ${GREEN}✓${NC} $description"
48
+ printf '%b\n' " ${GREEN}✓${NC} $description"
47
49
  return 0
48
50
  else
49
- echo -e " ${RED}✗${NC} $description"
51
+ printf '%b\n' " ${RED}✗${NC} $description"
50
52
  ((ERRORS++))
51
53
  return 1
52
54
  fi
@@ -58,17 +60,17 @@ warn_if_pattern() {
58
60
  local description="$3"
59
61
 
60
62
  if [[ -f "$file" ]] && grep -q "$pattern" "$file"; then
61
- echo -e " ${YELLOW}⚠${NC} $description"
63
+ printf '%b\n' " ${YELLOW}⚠${NC} $description"
62
64
  ((WARNINGS++))
63
65
  return 1
64
66
  else
65
- echo -e " ${GREEN}✓${NC} $description"
67
+ printf '%b\n' " ${GREEN}✓${NC} $description"
66
68
  return 0
67
69
  fi
68
70
  }
69
71
 
70
72
  # Check 1: Core CI files exist
71
- echo -e "${BLUE}1. Core CI Files${NC}"
73
+ printf '%b\n' "${BLUE}1. Core CI Files${NC}"
72
74
  check_file_exists "$REPO_ROOT/.github/workflows/ci.yml" "Main CI workflow exists"
73
75
  check_file_exists "$REPO_ROOT/.github/workflows/nightly.yml" "Nightly workflow exists"
74
76
  check_file_exists "$REPO_ROOT/.github/workflows/security-enhanced.yml" "Security workflow exists"
@@ -76,7 +78,7 @@ check_file_exists "$REPO_ROOT/config/pre-commit-config.yaml" "Pre-commit configu
76
78
  echo ""
77
79
 
78
80
  # Check 2: Zero-warning enforcement
79
- echo -e "${BLUE}2. Zero-Warning Policy Enforcement${NC}"
81
+ printf '%b\n' "${BLUE}2. Zero-Warning Policy Enforcement${NC}"
80
82
  check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "zero-warning" "Zero-warning policy documented"
81
83
  check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "fail on unformatted code" "Formatter failure enforced"
82
84
  check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "warnings-as-errors" "Warnings treated as errors"
@@ -87,20 +89,20 @@ warn_if_pattern "$REPO_ROOT/.github/workflows/ci.yml" "shellcheck.*||.*true" "Sh
87
89
  echo ""
88
90
 
89
91
  # Check 3: Test coverage requirements
90
- echo -e "${BLUE}3. Test Coverage Requirements${NC}"
92
+ printf '%b\n' "${BLUE}3. Test Coverage Requirements${NC}"
91
93
  check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "100%" "100% coverage requirement"
92
94
  check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "fail-under" "Coverage threshold enforcement"
93
95
 
94
- if [[ -f "$REPO_ROOT/scripts/tests/framework/test_runner.sh" ]]; then
95
- echo -e " ${GREEN}✓${NC} Test framework exists"
96
+ if [[ -f "$REPO_ROOT/tests/framework/test_runner.sh" ]]; then
97
+ printf '%b\n' " ${GREEN}✓${NC} Test framework exists"
96
98
  else
97
- echo -e " ${RED}✗${NC} Test framework missing"
99
+ printf '%b\n' " ${RED}✗${NC} Test framework missing"
98
100
  ((ERRORS++))
99
101
  fi
100
102
  echo ""
101
103
 
102
104
  # Check 4: Security scanning
103
- echo -e "${BLUE}4. Security Scanning Configuration${NC}"
105
+ printf '%b\n' "${BLUE}4. Security Scanning Configuration${NC}"
104
106
  check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "security-secrets" "Secret scanning enabled"
105
107
  check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "security-dependencies" "Dependency audit enabled"
106
108
  check_pattern_in_file "$REPO_ROOT/config/pre-commit-config.yaml" "gitleaks" "Pre-commit secret scanning"
@@ -112,32 +114,32 @@ warn_if_pattern "$REPO_ROOT/.github/workflows/ci.yml" "wget.*|.*bash" "Dangerous
112
114
  echo ""
113
115
 
114
116
  # Check 5: Performance monitoring
115
- echo -e "${BLUE}5. Performance Monitoring${NC}"
117
+ printf '%b\n' "${BLUE}5. Performance Monitoring${NC}"
116
118
  check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "benchmark" "Performance benchmarking enabled"
117
119
  check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "500ms" "Shell startup threshold defined"
118
120
  check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "performance-tracking" "Nightly performance tracking"
119
121
  echo ""
120
122
 
121
123
  # Check 6: Multi-OS support
122
- echo -e "${BLUE}6. Multi-OS Testing${NC}"
124
+ printf '%b\n' "${BLUE}6. Multi-OS Testing${NC}"
123
125
  check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "ubuntu-latest" "Linux testing enabled"
124
126
  check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "macos-latest" "macOS testing enabled"
125
127
  check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "matrix:" "OS matrix testing configured"
126
128
  echo ""
127
129
 
128
130
  # Check 7: Timeouts and efficiency
129
- echo -e "${BLUE}7. Timeout and Efficiency Settings${NC}"
131
+ printf '%b\n' "${BLUE}7. Timeout and Efficiency Settings${NC}"
130
132
  if grep -q "timeout-minutes: [0-9]" "$REPO_ROOT/.github/workflows/ci.yml"; then
131
133
  MAX_TIMEOUT=$(grep "timeout-minutes:" "$REPO_ROOT/.github/workflows/ci.yml" |
132
134
  awk '{print $2}' | sort -n | tail -1)
133
135
  if [[ $MAX_TIMEOUT -le 15 ]]; then
134
- echo -e " ${GREEN}✓${NC} Job timeouts properly configured (max: ${MAX_TIMEOUT}min)"
136
+ printf '%b\n' " ${GREEN}✓${NC} Job timeouts properly configured (max: ${MAX_TIMEOUT}min)"
135
137
  else
136
- echo -e " ${YELLOW}⚠${NC} Some jobs have long timeouts (max: ${MAX_TIMEOUT}min)"
138
+ printf '%b\n' " ${YELLOW}⚠${NC} Some jobs have long timeouts (max: ${MAX_TIMEOUT}min)"
137
139
  ((WARNINGS++))
138
140
  fi
139
141
  else
140
- echo -e " ${RED}✗${NC} No timeout configuration found"
142
+ printf '%b\n' " ${RED}✗${NC} No timeout configuration found"
141
143
  ((ERRORS++))
142
144
  fi
143
145
 
@@ -145,7 +147,7 @@ check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "cache" "Dependency
145
147
  echo ""
146
148
 
147
149
  # Check 8: Branch protection readiness
148
- echo -e "${BLUE}8. Branch Protection Readiness${NC}"
150
+ printf '%b\n' "${BLUE}8. Branch Protection Readiness${NC}"
149
151
  check_file_exists "$REPO_ROOT/.github/BRANCH_PROTECTION.md" "Branch protection documentation"
150
152
  check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "quality-gate" "Quality gate job defined"
151
153
 
@@ -160,44 +162,44 @@ REQUIRED_CHECKS=(
160
162
 
161
163
  for check in "${REQUIRED_CHECKS[@]}"; do
162
164
  if grep -q "name:.*$check" "$REPO_ROOT/.github/workflows/ci.yml"; then
163
- echo -e " ${GREEN}✓${NC} Required check '$check' defined"
165
+ printf '%b\n' " ${GREEN}✓${NC} Required check '$check' defined"
164
166
  else
165
- echo -e " ${RED}✗${NC} Required check '$check' missing"
167
+ printf '%b\n' " ${RED}✗${NC} Required check '$check' missing"
166
168
  ((ERRORS++))
167
169
  fi
168
170
  done
169
171
  echo ""
170
172
 
171
173
  # Check 9: Nightly extended testing
172
- echo -e "${BLUE}9. Nightly Extended Testing${NC}"
174
+ printf '%b\n' "${BLUE}9. Nightly Extended Testing${NC}"
173
175
  if [[ -f "$REPO_ROOT/.github/workflows/nightly.yml" ]]; then
174
176
  check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "dependency-updates" "Dependency monitoring"
175
177
  check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "beta-tools-test" "Beta tool testing"
176
178
  check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "security-extended" "Extended security scanning"
177
179
  check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "cron:" "Scheduled execution"
178
180
  else
179
- echo -e " ${RED}✗${NC} Nightly workflow missing"
181
+ printf '%b\n' " ${RED}✗${NC} Nightly workflow missing"
180
182
  ((ERRORS++))
181
183
  fi
182
184
  echo ""
183
185
 
184
186
  # Final summary
185
- echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
186
- echo -e "${BLUE} VALIDATION SUMMARY ${NC}"
187
- echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
187
+ printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
188
+ printf '%b\n' "${BLUE} VALIDATION SUMMARY ${NC}"
189
+ printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
188
190
 
189
191
  if [[ $ERRORS -eq 0 ]] && [[ $WARNINGS -eq 0 ]]; then
190
- echo -e "${GREEN}✅ PERFECT: CI configuration fully compliant${NC}"
192
+ printf '%b\n' "${GREEN}✅ PERFECT: CI configuration fully compliant${NC}"
191
193
  echo " - Zero-warning policy properly enforced"
192
194
  echo " - All security gates configured"
193
195
  echo " - Performance monitoring active"
194
196
  echo " - Ready for branch protection"
195
197
  elif [[ $ERRORS -eq 0 ]]; then
196
- echo -e "${YELLOW}⚠️ GOOD: CI mostly compliant with $WARNINGS warning(s)${NC}"
198
+ printf '%b\n' "${YELLOW}⚠️ GOOD: CI mostly compliant with $WARNINGS warning(s)${NC}"
197
199
  echo " - Core functionality working"
198
200
  echo " - Minor improvements recommended"
199
201
  else
200
- echo -e "${RED}❌ ISSUES: CI configuration has $ERRORS error(s) and $WARNINGS warning(s)${NC}"
202
+ printf '%b\n' "${RED}❌ ISSUES: CI configuration has $ERRORS error(s) and $WARNINGS warning(s)${NC}"
201
203
  echo " - Critical fixes required before deployment"
202
204
  fi
203
205
 
@@ -1,5 +1,6 @@
1
- #!/bin/sh
2
- set -e
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ set -euo pipefail
3
4
 
4
5
  OUT="${1:-$HOME/.dotfiles/docs/demo/demo.gif}"
5
6
  DURATION="${DURATION:-30}"
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ ## A2A v0.3 and agent card conformance validation.
4
+
5
+ set -euo pipefail
6
+
7
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
+ REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
9
+
10
+ # shellcheck source=../dot/lib/ui.sh
11
+ source "$SCRIPT_DIR/../dot/lib/ui.sh"
12
+
13
+ JSON_MODE=0
14
+ STRICT_MODE=0
15
+ while [[ $# -gt 0 ]]; do
16
+ case "$1" in
17
+ --json | -j)
18
+ JSON_MODE=1
19
+ shift
20
+ ;;
21
+ --strict | -s)
22
+ STRICT_MODE=1
23
+ shift
24
+ ;;
25
+ *)
26
+ shift
27
+ ;;
28
+ esac
29
+ done
30
+
31
+ command -v jq >/dev/null 2>&1 || {
32
+ echo "jq is required for A2A conformance checks." >&2
33
+ exit 1
34
+ }
35
+
36
+ a2a_card="$REPO_ROOT/.well-known/agent-card.json"
37
+ legacy_doc="$REPO_ROOT/.well-known/agent.json"
38
+ internal_card="$REPO_ROOT/dot_config/dotfiles/agent-card.json"
39
+ agent_profiles="$REPO_ROOT/dot_config/dotfiles/agent-profiles.json"
40
+ status="healthy"
41
+ issues=()
42
+
43
+ # Check primary A2A v0.3 card
44
+ if [[ ! -f "$a2a_card" ]]; then
45
+ issues+=("missing:.well-known/agent-card.json")
46
+ fi
47
+
48
+ # Check legacy agent.json
49
+ if [[ ! -f "$legacy_doc" ]]; then
50
+ issues+=("missing:.well-known/agent.json")
51
+ fi
52
+
53
+ # Check internal card
54
+ if [[ ! -f "$internal_card" ]]; then
55
+ issues+=("missing:agent-card.json")
56
+ fi
57
+
58
+ # Check agent profiles
59
+ if [[ ! -f "$agent_profiles" ]]; then
60
+ issues+=("missing:agent-profiles.json")
61
+ fi
62
+
63
+ if [[ "${#issues[@]}" -eq 0 ]]; then
64
+ # Validate A2A v0.3 card
65
+ spec_version="$(jq -r '.specVersion // empty' "$a2a_card")"
66
+ [[ "$spec_version" == "0.3" ]] || issues+=("specVersion:expected 0.3, got $spec_version")
67
+
68
+ # Skills array
69
+ jq -e '.skills | type == "array"' "$a2a_card" >/dev/null 2>&1 || issues+=("skills:missing or not array")
70
+ skills_count="$(jq '.skills | length' "$a2a_card" 2>/dev/null || echo 0)"
71
+ [[ "$skills_count" -gt 0 ]] || issues+=("skills:empty array")
72
+
73
+ # Authentication block
74
+ jq -e '.authentication' "$a2a_card" >/dev/null 2>&1 || issues+=("authentication:missing")
75
+
76
+ # Signing metadata
77
+ signing_method="$(jq -r '.signing.method // empty' "$a2a_card")"
78
+ [[ -n "$signing_method" ]] || issues+=("signing:missing method")
79
+
80
+ # Capabilities
81
+ jq -e '.capabilities' "$a2a_card" >/dev/null 2>&1 || issues+=("capabilities:missing")
82
+
83
+ # Protocol must be "a2a" not "a2a-ready"
84
+ if jq -e '.protocols | index("a2a-ready")' "$a2a_card" >/dev/null 2>&1; then
85
+ issues+=("protocols:should use 'a2a' not 'a2a-ready'")
86
+ fi
87
+ jq -e '.protocols | index("a2a")' "$a2a_card" >/dev/null 2>&1 || issues+=("protocols:missing 'a2a'")
88
+
89
+ # Validate internal card also uses v0.3 and "a2a"
90
+ internal_spec="$(jq -r '.specVersion // empty' "$internal_card")"
91
+ [[ "$internal_spec" == "0.3" ]] || issues+=("internal-card:specVersion expected 0.3")
92
+ if jq -e '.protocols | index("a2a-ready")' "$internal_card" >/dev/null 2>&1; then
93
+ issues+=("internal-card:should use 'a2a' not 'a2a-ready'")
94
+ fi
95
+
96
+ # Validate legacy doc points to new card
97
+ jq -e '.a2aCard' "$legacy_doc" >/dev/null 2>&1 || issues+=("legacy:missing a2aCard pointer")
98
+ if jq -e '.protocols | index("a2a-ready")' "$legacy_doc" >/dev/null 2>&1; then
99
+ issues+=("legacy:should use 'a2a' not 'a2a-ready'")
100
+ fi
101
+
102
+ # Name consistency
103
+ a2a_name="$(jq -r '.name // empty' "$a2a_card")"
104
+ internal_name="$(jq -r '.name // empty' "$internal_card")"
105
+ legacy_name="$(jq -r '.name // empty' "$legacy_doc")"
106
+ [[ "$a2a_name" == "$internal_name" ]] || issues+=("name:mismatch between a2a-card and internal card")
107
+ [[ "$a2a_name" == "$legacy_name" ]] || issues+=("name:mismatch between a2a-card and legacy doc")
108
+
109
+ # Default profile validation
110
+ default_profile="$(jq -r '.defaultProfile // empty' "$internal_card")"
111
+ if [[ -n "$default_profile" ]]; then
112
+ jq -e --arg profile "$default_profile" '.profiles[$profile]' "$agent_profiles" >/dev/null 2>&1 || issues+=("default-profile:missing in agent-profiles.json")
113
+ fi
114
+
115
+ # Card signing in internal card
116
+ jq -e '.security.cardSigning' "$internal_card" >/dev/null 2>&1 || issues+=("internal-card:missing cardSigning in security")
117
+ fi
118
+
119
+ if [[ "${#issues[@]}" -gt 0 ]]; then
120
+ status="issues"
121
+ fi
122
+
123
+ # Build issues JSON safely
124
+ if [[ "${#issues[@]}" -gt 0 ]]; then
125
+ issues_json="$(printf '%s\n' "${issues[@]}" | jq -R . | jq -s .)"
126
+ else
127
+ issues_json="[]"
128
+ fi
129
+
130
+ payload="$(jq -n \
131
+ --arg status "$status" \
132
+ --arg a2a_card "$a2a_card" \
133
+ --arg legacy_doc "$legacy_doc" \
134
+ --arg internal_card "$internal_card" \
135
+ --arg agent_profiles "$agent_profiles" \
136
+ --argjson strict "$([[ "$STRICT_MODE" -eq 1 ]] && echo true || echo false)" \
137
+ --argjson issues "$issues_json" \
138
+ '{status: $status, strict: $strict, specVersion: "0.3", files: {a2a_card: $a2a_card, legacy_doc: $legacy_doc, internal_card: $internal_card, agent_profiles: $agent_profiles}, issues: $issues}')"
139
+
140
+ if [[ "$JSON_MODE" -eq 1 ]]; then
141
+ printf '%s\n' "$payload"
142
+ else
143
+ ui_dot_banner "AI and Agents"
144
+ ui_header "A2A v0.3 Conformance"
145
+ if [[ "$status" == "healthy" ]]; then
146
+ ui_ok "Status" "healthy"
147
+ ui_ok "Spec version" "0.3"
148
+ ui_ok "A2A card" "$a2a_card"
149
+ ui_ok "Legacy doc" "$legacy_doc"
150
+ ui_ok "Internal card" "$internal_card"
151
+ else
152
+ ui_warn "Status" "issues"
153
+ while IFS= read -r issue; do
154
+ [[ -n "$issue" ]] || continue
155
+ ui_warn "Issue" "$issue"
156
+ done < <(printf '%s' "$payload" | jq -r '.issues[]')
157
+ fi
158
+ fi
159
+
160
+ if [[ "$STRICT_MODE" -eq 1 && "$status" != "healthy" ]]; then
161
+ exit 1
162
+ fi