@sebastienrousseau/dotfiles 0.2.501 → 0.2.503

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. package/CHANGELOG.md +155 -4
  2. package/LICENSE +21 -1283
  3. package/README.md +40 -8
  4. package/docs/CONFIG_STRATEGY.md +124 -0
  5. package/docs/COPYRIGHT +1 -1
  6. package/docs/GOVERNANCE.md +98 -0
  7. package/docs/MAINTAINERS.md +41 -0
  8. package/docs/OPENCODE.md +127 -0
  9. package/docs/README.md +2 -0
  10. package/docs/STRUCTURE.md +102 -0
  11. package/docs/adr/ADR-011-nushell-tier3-keep.md +2 -2
  12. package/docs/architecture/AI_COST_OPTIMIZATION.md +143 -0
  13. package/docs/architecture/REPO_LAYOUT.md +8 -8
  14. package/docs/archive/MILESTONE_v0.2.493.md +1 -1
  15. package/docs/index.md +2 -2
  16. package/docs/interop/POWERSHELL.md +1 -1
  17. package/docs/manual/00-introduction.md +1 -1
  18. package/docs/manual/01-concepts/02-trust-model.md +1 -1
  19. package/docs/manual/03-reference/01-dot-cli.md +63 -45
  20. package/docs/manual/03-reference/02-config-files.md +2 -2
  21. package/docs/manual/03-reference/05-feature-flags.md +62 -3
  22. package/docs/manual/_toc.yml +1 -1
  23. package/docs/manual/command-index.md +72 -55
  24. package/docs/manual/index.md +66 -0
  25. package/docs/operations/CI_COMPOSITES.md +2 -2
  26. package/docs/operations/COMPLETIONS.md +2 -2
  27. package/docs/operations/COVERAGE.md +40 -6
  28. package/docs/operations/HARD_AUDIT_2026.md +631 -0
  29. package/docs/operations/MAINTENANCE.md +3 -3
  30. package/docs/operations/MANIFEST.md +127 -0
  31. package/docs/operations/REGISTRY.md +89 -0
  32. package/docs/operations/RELEASE_PIPELINE.md +130 -0
  33. package/docs/operations/RFC_v0_2_503_reorganization.md +280 -0
  34. package/docs/operations/ROADMAP_2026.md +665 -0
  35. package/docs/operations/ROADMAP_V0_2_503.md +134 -0
  36. package/docs/operations/TESTING.md +17 -0
  37. package/docs/operations/TRACEABILITY.md +9 -3
  38. package/docs/operations/VERSION_SYNC.md +4 -4
  39. package/docs/reference/POWERSHELL_PARITY.md +81 -0
  40. package/docs/registry.json +6 -0
  41. package/docs/schema/dot-env-v1.json +110 -0
  42. package/docs/security/CI_EGRESS_ALLOWLIST.md +1 -1
  43. package/docs/security/CI_PINNING.md +121 -0
  44. package/docs/security/COMMIT_SIGNING.md +138 -0
  45. package/docs/security/DEPS_DEV_EXCEPTIONS.md +2 -2
  46. package/docs/security/DISCLOSURE.md +130 -0
  47. package/docs/security/FUZZING.md +114 -0
  48. package/docs/security/INSTALL_VERIFICATION.md +2 -2
  49. package/docs/security/KEY_ROTATION.md +81 -1
  50. package/docs/security/POLICY_RELEASES.md +2 -2
  51. package/docs/security/SCORECARD.md +130 -15
  52. package/docs/security/SHELL_EXEMPTIONS.md +4 -4
  53. package/docs/security/VERIFY_RELEASE.md +201 -0
  54. package/docs/security/security-pubkey.asc +15 -0
  55. package/install.sh +67 -38
  56. package/package.json +1 -1
  57. package/scripts/README.md +123 -0
  58. package/scripts/ci/check-copyright-headers.sh +4 -93
  59. package/scripts/ci/check-shell-preamble.sh +4 -103
  60. package/scripts/ci/guard-gitleaks-checkout.sh +4 -54
  61. package/scripts/diagnostics/a2a-conformance.sh +4 -4
  62. package/scripts/diagnostics/alias-governance.sh +1 -1
  63. package/scripts/diagnostics/aliases-cheatsheet.sh +2 -2
  64. package/scripts/diagnostics/benchmark.sh +4 -4
  65. package/scripts/diagnostics/conflicts.sh +2 -2
  66. package/scripts/diagnostics/doctor-unified.sh +2 -2
  67. package/scripts/diagnostics/doctor.sh +45 -15
  68. package/scripts/diagnostics/drift-dashboard.sh +2 -2
  69. package/scripts/diagnostics/health.sh +4 -4
  70. package/scripts/diagnostics/history-analysis.sh +2 -2
  71. package/scripts/diagnostics/mcp-doctor.sh +10 -7
  72. package/scripts/diagnostics/perf.sh +4 -4
  73. package/scripts/diagnostics/scorecard.sh +4 -4
  74. package/scripts/diagnostics/security-score.sh +2 -2
  75. package/scripts/diagnostics/smoke-test.sh +2 -2
  76. package/scripts/diagnostics/snapshot.sh +2 -2
  77. package/scripts/diagnostics/verify.sh +4 -4
  78. package/scripts/diagnostics/version-locks.sh +2 -2
  79. package/scripts/diagnostics/workstation-attestation.sh +14 -14
  80. package/scripts/dot/commands/agent.sh +27 -22
  81. package/scripts/dot/commands/agents.sh +335 -0
  82. package/scripts/dot/commands/ai.sh +144 -25
  83. package/scripts/dot/commands/aliases.sh +10 -8
  84. package/scripts/dot/commands/appearance.sh +2 -2
  85. package/scripts/dot/commands/core.sh +12 -6
  86. package/scripts/dot/commands/diagnostics.sh +5 -5
  87. package/scripts/dot/commands/env-emit.sh +202 -0
  88. package/scripts/dot/commands/fleet.sh +290 -14
  89. package/scripts/dot/commands/init.sh +184 -0
  90. package/scripts/dot/commands/lint.sh +9 -4
  91. package/scripts/dot/commands/manual.sh +3 -3
  92. package/scripts/dot/commands/meta.sh +19 -10
  93. package/scripts/dot/commands/patterns.sh +2 -2
  94. package/scripts/dot/commands/registry.sh +263 -0
  95. package/scripts/dot/commands/restore.sh +4 -4
  96. package/scripts/dot/commands/secrets.sh +4 -3
  97. package/scripts/dot/commands/security.sh +2 -2
  98. package/scripts/dot/commands/tools.sh +62 -4
  99. package/scripts/dot/powershell/Dot.psm1 +199 -0
  100. package/scripts/fonts/install-nerd-fonts.sh +2 -2
  101. package/scripts/git-hooks/pre-commit-audit.sh +2 -2
  102. package/scripts/git-hooks/pre-push +13 -0
  103. package/scripts/lib/secrets_provider.sh +32 -6
  104. package/scripts/ops/ai-setup.sh +1 -1
  105. package/scripts/ops/bundle.sh +2 -2
  106. package/scripts/ops/chaos.sh +2 -2
  107. package/scripts/ops/chezmoi-apply.sh +4 -4
  108. package/scripts/ops/heal.sh +4 -4
  109. package/scripts/ops/post-apply-repair.sh +2 -2
  110. package/scripts/ops/prewarm.sh +2 -2
  111. package/scripts/ops/release.sh +4 -4
  112. package/scripts/ops/rollback.sh +18 -4
  113. package/scripts/ops/setup.sh +2 -2
  114. package/scripts/qa/check-version-consistency.sh +123 -0
  115. package/scripts/qa/coverage-baseline.sh +1 -1
  116. package/scripts/qa/docs-coverage.sh +2 -2
  117. package/scripts/qa/powershell-contract.ps1 +1 -1
  118. package/scripts/qa/scorecard-snapshot.sh +127 -0
  119. package/scripts/security/backup.sh +2 -2
  120. package/scripts/security/check-disclosure-key-expiry.sh +110 -0
  121. package/scripts/security/dns-doh.sh +4 -4
  122. package/scripts/security/encryption-check.sh +4 -4
  123. package/scripts/security/enforce-policies.sh +2 -2
  124. package/scripts/security/firewall.sh +4 -4
  125. package/scripts/security/lock-configs.sh +11 -2
  126. package/scripts/security/lock-screen.sh +4 -4
  127. package/scripts/security/manage-secrets.sh +2 -2
  128. package/scripts/security/ssh-cert.sh +2 -2
  129. package/scripts/security/telemetry-kill.sh +4 -4
  130. package/scripts/security/usb-safety.sh +4 -4
  131. package/scripts/theme/extract-heic-frames.sh +114 -0
  132. package/scripts/theme/rebuild-themes.sh +8 -1
  133. package/scripts/theme/switch.sh +13 -6
  134. package/scripts/theme/wallpaper-sync.sh +297 -93
  135. package/scripts/tuning/linux.sh +2 -2
  136. package/scripts/tuning/macos.sh +2 -2
  137. package/scripts/version-sync.sh +58 -7
  138. package/dot_config/.module-manifest.json +0 -69
  139. package/dot_config/ai/identity.md +0 -23
  140. package/dot_config/ai/patterns/architect.md +0 -16
  141. package/dot_config/ai/patterns/hardener.md +0 -15
  142. package/dot_config/ai/patterns/refactor.md +0 -15
  143. package/dot_config/aider/aider.conf.yml +0 -32
  144. package/dot_config/alacritty/alacritty.toml.tmpl +0 -55
  145. package/dot_config/ansible/ansible.cfg +0 -11
  146. package/dot_config/atuin/config.toml.tmpl +0 -47
  147. package/dot_config/bat/config +0 -23
  148. package/dot_config/brave-flags.conf.tmpl +0 -7
  149. package/dot_config/btop/btop.conf +0 -16
  150. package/dot_config/btop/themes/tokyonight.theme +0 -34
  151. package/dot_config/bun/bunfig.toml.tmpl +0 -33
  152. package/dot_config/claude/mcp_servers.json +0 -20
  153. package/dot_config/containers/containers.conf +0 -14
  154. package/dot_config/curl/dot_curlrc +0 -18
  155. package/dot_config/dlv/config.yml +0 -39
  156. package/dot_config/docker/config.json +0 -15
  157. package/dot_config/dotfiles/agent-card.json +0 -29
  158. package/dot_config/dotfiles/agent-profiles.json +0 -92
  159. package/dot_config/dotfiles/boot/README.md +0 -13
  160. package/dot_config/dotfiles/grub/README.md +0 -13
  161. package/dot_config/dotfiles/lock/README.md +0 -13
  162. package/dot_config/dotfiles/mcp-lock.json +0 -33
  163. package/dot_config/dotfiles/mcp-policy.json +0 -52
  164. package/dot_config/dotfiles/mcp-registry.json +0 -47
  165. package/dot_config/dotfiles/model-registry.json +0 -20
  166. package/dot_config/dotfiles/policy-bundles.json +0 -38
  167. package/dot_config/dotfiles/prompt-registry.json +0 -16
  168. package/dot_config/dotfiles/versions.env +0 -18
  169. package/dot_config/duf/duf.conf +0 -6
  170. package/dot_config/duti/defaults.duti +0 -5
  171. package/dot_config/emoji/emoji.txt +0 -34
  172. package/dot_config/environment.d/50-ssh-agent.conf +0 -2
  173. package/dot_config/environment.d/90-wayland.conf +0 -19
  174. package/dot_config/fastfetch/config.jsonc +0 -28
  175. package/dot_config/firefox/user.js.tmpl +0 -58
  176. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +0 -9
  177. package/dot_config/fish/completions/dot.fish.tmpl +0 -115
  178. package/dot_config/fish/conf.d/000-perf-cache.fish +0 -56
  179. package/dot_config/fish/conf.d/aliases.fish.tmpl +0 -77
  180. package/dot_config/fish/conf.d/env.fish.tmpl +0 -48
  181. package/dot_config/fish/conf.d/functions.fish.tmpl +0 -22
  182. package/dot_config/fish/conf.d/init.fish.tmpl +0 -172
  183. package/dot_config/fish/config.fish.tmpl +0 -44
  184. package/dot_config/fish/fish_plugins +0 -1
  185. package/dot_config/fish/functions/_.fish +0 -3
  186. package/dot_config/fish/functions/_cached_eval.fish +0 -131
  187. package/dot_config/fish/functions/_cached_eval_clear.fish +0 -17
  188. package/dot_config/fish/functions/als.fish +0 -46
  189. package/dot_config/fish/functions/bg-upgrade.fish +0 -7
  190. package/dot_config/fish/functions/c.fish +0 -3
  191. package/dot_config/fish/functions/cat.fish +0 -9
  192. package/dot_config/fish/functions/d.fish +0 -7
  193. package/dot_config/fish/functions/dot.fish +0 -34
  194. package/dot_config/fish/functions/h.fish +0 -3
  195. package/dot_config/fish/functions/l.fish +0 -7
  196. package/dot_config/fish/functions/la.fish +0 -7
  197. package/dot_config/fish/functions/ll.fish +0 -7
  198. package/dot_config/fish/functions/log_error.fish +0 -13
  199. package/dot_config/fish/functions/log_info.fish +0 -13
  200. package/dot_config/fish/functions/lr.fish +0 -7
  201. package/dot_config/fish/functions/lra.fish +0 -7
  202. package/dot_config/fish/functions/ls.fish +0 -7
  203. package/dot_config/fish/functions/lt.fish +0 -7
  204. package/dot_config/fish/functions/lta.fish +0 -7
  205. package/dot_config/fish/functions/notify-run.fish +0 -11
  206. package/dot_config/fish/functions/q.fish +0 -3
  207. package/dot_config/fish/functions/silent-run.fish +0 -7
  208. package/dot_config/fish/functions/yy.fish +0 -8
  209. package/dot_config/flatpak/flatpak.list +0 -4
  210. package/dot_config/fontconfig/fonts.conf.tmpl +0 -57
  211. package/dot_config/foot/foot.ini.tmpl +0 -33
  212. package/dot_config/fuzzel/fuzzel.ini.tmpl +0 -18
  213. package/dot_config/fzf/fzf.zsh +0 -48
  214. package/dot_config/gem/gemrc +0 -9
  215. package/dot_config/gh/config.yml +0 -12
  216. package/dot_config/ghostty/config.tmpl +0 -165
  217. package/dot_config/git/allowed_signers.tmpl +0 -18
  218. package/dot_config/git/attributes +0 -12
  219. package/dot_config/git/commit-template +0 -10
  220. package/dot_config/git/hooks/executable_commit-msg +0 -146
  221. package/dot_config/git/ignore +0 -27
  222. package/dot_config/gnupg/gpg-agent.conf +0 -11
  223. package/dot_config/go/golangci.yml +0 -118
  224. package/dot_config/go/gopls.json +0 -30
  225. package/dot_config/goose/config.yaml +0 -29
  226. package/dot_config/gtk-3.0/gtk.css.tmpl +0 -184
  227. package/dot_config/gtk-3.0/settings.ini.tmpl +0 -27
  228. package/dot_config/gtk-4.0/gtk.css.tmpl +0 -252
  229. package/dot_config/gtk-4.0/settings.ini.tmpl +0 -18
  230. package/dot_config/htop/htoprc +0 -20
  231. package/dot_config/inputrc +0 -2
  232. package/dot_config/ipython/profile_default/ipython_config.py +0 -19
  233. package/dot_config/just/justfile +0 -122
  234. package/dot_config/k9s/config.yaml +0 -65
  235. package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
  236. package/dot_config/kanshi/config.tmpl +0 -22
  237. package/dot_config/karabiner/karabiner.json +0 -14
  238. package/dot_config/kitty/kitty.conf.tmpl +0 -53
  239. package/dot_config/lazydocker/config.yml +0 -186
  240. package/dot_config/lazygit/config.yml +0 -35
  241. package/dot_config/mako/config +0 -47
  242. package/dot_config/mas/masapps.txt +0 -5
  243. package/dot_config/micro/settings.json +0 -3
  244. package/dot_config/mimeapps.list +0 -77
  245. package/dot_config/minikube/config.json +0 -13
  246. package/dot_config/mise/config.toml +0 -99
  247. package/dot_config/mongosh/mongoshrc.js +0 -68
  248. package/dot_config/mpv/input.conf +0 -47
  249. package/dot_config/mpv/mpv.conf +0 -47
  250. package/dot_config/mycli/myclirc +0 -67
  251. package/dot_config/nano/nanorc +0 -28
  252. package/dot_config/ncdu/config +0 -12
  253. package/dot_config/niri/config.kdl.tmpl +0 -327
  254. package/dot_config/nushell/aliases.nu +0 -18
  255. package/dot_config/nushell/cached_eval.nu +0 -80
  256. package/dot_config/nushell/completions.nu.tmpl +0 -52
  257. package/dot_config/nushell/config.nu.tmpl +0 -86
  258. package/dot_config/nushell/env.nu.tmpl +0 -102
  259. package/dot_config/nushell/functions.nu.tmpl +0 -17
  260. package/dot_config/nvim/init.lua +0 -18
  261. package/dot_config/nvim/lazy-lock.json +0 -58
  262. package/dot_config/nvim/lua/config/autocmds.lua +0 -107
  263. package/dot_config/nvim/lua/config/keymaps.lua +0 -92
  264. package/dot_config/nvim/lua/config/lazy.lua +0 -44
  265. package/dot_config/nvim/lua/config/options.lua +0 -49
  266. package/dot_config/nvim/lua/plugins/ai.lua +0 -75
  267. package/dot_config/nvim/lua/plugins/coding.lua +0 -216
  268. package/dot_config/nvim/lua/plugins/completion.lua +0 -60
  269. package/dot_config/nvim/lua/plugins/dap.lua +0 -412
  270. package/dot_config/nvim/lua/plugins/editor.lua +0 -55
  271. package/dot_config/nvim/lua/plugins/git.lua +0 -10
  272. package/dot_config/nvim/lua/plugins/lsp.lua +0 -156
  273. package/dot_config/nvim/lua/plugins/markdown.lua +0 -18
  274. package/dot_config/nvim/lua/plugins/rust.lua +0 -34
  275. package/dot_config/nvim/lua/plugins/sessions.lua +0 -33
  276. package/dot_config/nvim/lua/plugins/ui.lua +0 -509
  277. package/dot_config/paru/paru.conf +0 -10
  278. package/dot_config/pip/pip.conf.tmpl +0 -32
  279. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +0 -81
  280. package/dot_config/pueue/pueue.yml +0 -34
  281. package/dot_config/pypoetry/config.toml +0 -6
  282. package/dot_config/pyrightconfig.json +0 -5
  283. package/dot_config/raycast/README.md +0 -13
  284. package/dot_config/redis/redisclirc +0 -41
  285. package/dot_config/ripgrep/ripgreprc +0 -21
  286. package/dot_config/shell/00-core-paths.sh.tmpl +0 -134
  287. package/dot_config/shell/05-core-safety.sh +0 -48
  288. package/dot_config/shell/10-secrets.sh +0 -41
  289. package/dot_config/shell/40-fzf-defaults.sh.tmpl +0 -17
  290. package/dot_config/shell/40-ls-colors.sh +0 -49
  291. package/dot_config/shell/50-logic-functions-core.sh.tmpl +0 -11
  292. package/dot_config/shell/50-logic-functions.sh.tmpl +0 -11
  293. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +0 -65
  294. package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -121
  295. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -55
  296. package/dot_config/shell/Brewfile +0 -207
  297. package/dot_config/shell/Brewfile.cask +0 -92
  298. package/dot_config/shell/Brewfile.cli +0 -127
  299. package/dot_config/shell/README.md +0 -284
  300. package/dot_config/shell/als_data.txt.tmpl +0 -65
  301. package/dot_config/shell/custom/auto_ls.zsh +0 -20
  302. package/dot_config/shell/custom/context_suggest.zsh +0 -68
  303. package/dot_config/shell/custom/error_analysis.zsh +0 -45
  304. package/dot_config/sops/dot_sops.yaml +0 -23
  305. package/dot_config/starship.toml.tmpl +0 -202
  306. package/dot_config/swaylock/config +0 -43
  307. package/dot_config/systemd/user/dotfiles-maintenance.service +0 -8
  308. package/dot_config/systemd/user/dotfiles-maintenance.timer +0 -11
  309. package/dot_config/systemd/user/pueued.service +0 -12
  310. package/dot_config/systemd/user/ssh-agent.service +0 -12
  311. package/dot_config/task/Taskfile.yml +0 -86
  312. package/dot_config/tflint/tflint.hcl +0 -9
  313. package/dot_config/tmux/tmux.conf.tmpl +0 -223
  314. package/dot_config/topgrade.toml.tmpl +0 -54
  315. package/dot_config/user-dirs.dirs +0 -10
  316. package/dot_config/vscode/extensions.txt +0 -11
  317. package/dot_config/vscode/settings.json.tmpl +0 -82
  318. package/dot_config/waybar/config.jsonc.tmpl +0 -90
  319. package/dot_config/waybar/style.css.tmpl +0 -211
  320. package/dot_config/wezterm/wezterm.lua.tmpl +0 -64
  321. package/dot_config/wget/wgetrc +0 -12
  322. package/dot_config/xdg-desktop-portal/niri-portals.conf +0 -5
  323. package/dot_config/yarn/yarnrc.yml +0 -36
  324. package/dot_config/yazi/keymap.toml +0 -67
  325. package/dot_config/yazi/theme.toml +0 -102
  326. package/dot_config/yazi/yazi.toml +0 -40
  327. package/dot_config/zathura/zathurarc +0 -52
  328. package/dot_config/zellij/config.kdl.tmpl +0 -79
  329. package/dot_config/zsh/dot_zprofile +0 -7
  330. package/dot_config/zsh/dot_zshenv +0 -5
  331. package/dot_config/zsh/dot_zshrc.tmpl +0 -635
  332. package/dot_config/zsh/rc.d/00-alias-shims.zsh +0 -99
  333. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -18
  334. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
  335. package/dot_config/zsh/rc.d/20-zinit.zsh +0 -65
  336. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -214
  337. package/dot_config/zsh/rc.d/40-bell.zsh +0 -20
  338. package/dot_config/zsh/rc.d/50-login-fortune.zsh +0 -9
  339. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +0 -32
  340. package/dot_local/bin/executable_ai-update +0 -195
  341. package/dot_local/bin/executable_ai_core +0 -152
  342. package/dot_local/bin/executable_antigravity +0 -11
  343. package/dot_local/bin/executable_b64 +0 -84
  344. package/dot_local/bin/executable_bm +0 -79
  345. package/dot_local/bin/executable_cb +0 -39
  346. package/dot_local/bin/executable_dot +0 -596
  347. package/dot_local/bin/executable_dot-ai +0 -36
  348. package/dot_local/bin/executable_dot-bootstrap +0 -77
  349. package/dot_local/bin/executable_dot-launch-or-focus +0 -52
  350. package/dot_local/bin/executable_dot-load-benchmark +0 -31
  351. package/dot_local/bin/executable_dot-load-benchmark-pty +0 -77
  352. package/dot_local/bin/executable_dot-theme-sync +0 -952
  353. package/dot_local/bin/executable_dot_completion +0 -57
  354. package/dot_local/bin/executable_dtags +0 -28
  355. package/dot_local/bin/executable_epoch +0 -67
  356. package/dot_local/bin/executable_extract +0 -41
  357. package/dot_local/bin/executable_gbd +0 -52
  358. package/dot_local/bin/executable_gd +0 -42
  359. package/dot_local/bin/executable_git-ai-commit +0 -175
  360. package/dot_local/bin/executable_git-ai-diff +0 -169
  361. package/dot_local/bin/executable_gl +0 -101
  362. package/dot_local/bin/executable_hash +0 -161
  363. package/dot_local/bin/executable_hashsum +0 -160
  364. package/dot_local/bin/executable_hex +0 -115
  365. package/dot_local/bin/executable_jsonv +0 -78
  366. package/dot_local/bin/executable_jwt +0 -94
  367. package/dot_local/bin/executable_kill-port +0 -75
  368. package/dot_local/bin/executable_lorem +0 -118
  369. package/dot_local/bin/executable_mkscript +0 -35
  370. package/dot_local/bin/executable_monitor +0 -56
  371. package/dot_local/bin/executable_myip +0 -51
  372. package/dot_local/bin/executable_notify +0 -24
  373. package/dot_local/bin/executable_open +0 -38
  374. package/dot_local/bin/executable_pw +0 -27
  375. package/dot_local/bin/executable_rec-start +0 -46
  376. package/dot_local/bin/executable_rec-stop +0 -35
  377. package/dot_local/bin/executable_regex +0 -132
  378. package/dot_local/bin/executable_start-niri +0 -8
  379. package/dot_local/bin/executable_tmux-sessionizer +0 -314
  380. package/dot_local/bin/executable_tour +0 -177
  381. package/dot_local/bin/executable_up +0 -23
  382. package/dot_local/bin/executable_update +0 -142
  383. package/dot_local/bin/executable_uuid +0 -87
  384. package/dot_local/bin/executable_win +0 -32
  385. package/dot_local/bin/executable_yamlv +0 -57
  386. package/dot_local/share/bash-completion/completions/dot +0 -72
  387. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  388. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  389. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  390. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  391. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  392. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  393. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  394. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  395. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  396. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  397. package/dot_local/share/man/man1/dot.1 +0 -149
  398. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +0 -64
  399. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +0 -18
  400. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +0 -13
  401. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +0 -6
  402. package/dot_local/share/zsh/completions/.keep +0 -0
  403. package/dot_local/share/zsh/completions/_dot +0 -283
  404. package/scripts/ci/check-dangerous-chmod.sh +0 -19
  405. package/scripts/ci/check-deps-dev.sh +0 -236
  406. package/scripts/ci/check-insecure-tls.sh +0 -61
  407. package/scripts/ci/check-regression-traceability.sh +0 -67
  408. package/scripts/ci/install-chezmoi-verified.sh +0 -64
  409. package/scripts/ci/run-coverage.sh +0 -362
  410. package/scripts/ci/validate-chezmoidata.sh +0 -25
  411. package/scripts/ci/validate-ci-config.sh +0 -224
  412. package/scripts/docs/build-manual.sh +0 -883
  413. package/scripts/docs/check-manual.sh +0 -213
  414. package/scripts/dot/lib/bento.sh +0 -50
  415. package/scripts/dot/lib/log.sh +0 -200
  416. package/scripts/dot/lib/platform.sh +0 -99
  417. package/scripts/dot/lib/ui.sh +0 -518
  418. package/scripts/dot/lib/utils.sh +0 -377
  419. package/scripts/maintenance/check-updates.sh +0 -131
  420. package/scripts/release/package-policy-bundles.sh +0 -125
@@ -1,64 +0,0 @@
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,362 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
- # =============================================================================
4
- # run-coverage.sh — Bash code-coverage runner using pure xtrace
5
- # instrumentation. Emits lcov.info at $COVERAGE_OUT.
6
- #
7
- # Why pure xtrace (not kcov):
8
- # kcov v43 on Ubuntu 24.04 + bash 5.2 won't emit bash-script
9
- # coverage in either mode: without bash-dbgsym it captures nothing,
10
- # and with bash-dbgsym it captures bash's *C-binary* internals
11
- # (ctype.h, stdio.h) instead of the .sh file lines we care about.
12
- # We bypass kcov entirely by using bash's own xtrace mechanism:
13
- #
14
- # PS4='+:${LINENO}:${BASH_SOURCE}:' # encode line + file in trace
15
- # BASH_ENV=/setup-that-runs-set-x # turn on xtrace in every
16
- # # non-interactive bash, so
17
- # # children inherit tracing
18
- # bash test.sh 2>traces/test.trace # capture lines per test
19
- #
20
- # Then we parse all traces with regex and write lcov.info. This is
21
- # the same mechanism bashcov uses, minus the Ruby runtime.
22
- #
23
- # Linux + macOS both work (macOS bash 3.2 supports BASH_XTRACEFD as
24
- # well — verified locally on bash 5.3 via Homebrew). The pre-commit
25
- # hook in this repo can invoke this on any platform.
26
- #
27
- # Closes the runner half of #856 / Slice 1 of #883.
28
- # =============================================================================
29
-
30
- set -uo pipefail
31
-
32
- REPO_ROOT="${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"
33
- TESTS_DIR="${TESTS_DIR:-$REPO_ROOT/tests}"
34
- COVERAGE_DIR="${COVERAGE_DIR:-$REPO_ROOT/coverage}"
35
- COVERAGE_OUT="${COVERAGE_OUT:-$COVERAGE_DIR/lcov.info}"
36
- MIN_COVERAGE_PCT="${MIN_COVERAGE_PCT:-0}" # initial floor; tighten per slice
37
- COV_INCLUDE_DIRS="${COV_INCLUDE_DIRS:-$REPO_ROOT/scripts:$REPO_ROOT/dot_local/bin:$REPO_ROOT/.chezmoitemplates/functions}"
38
- JOBS="${JOBS:-$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)}"
39
- COV_TEST_TIMEOUT="${COV_TEST_TIMEOUT:-60}"
40
-
41
- mkdir -p "$COVERAGE_DIR"
42
- trace_dir="$COVERAGE_DIR/traces"
43
- rm -rf "$trace_dir"
44
- mkdir -p "$trace_dir"
45
-
46
- # -----------------------------------------------------------------------------
47
- # BASH_ENV setup file: enables xtrace in every non-interactive bash that
48
- # inherits it. Child processes spawned via `bash $SCRIPT` get their own
49
- # tracing turned on automatically.
50
- # -----------------------------------------------------------------------------
51
- bash_env="$COVERAGE_DIR/_cov_bashenv.sh"
52
- cat >"$bash_env" <<'SETUP'
53
- # coverage runtime — enable xtrace, define PS4 with file+line markers.
54
- # `${BASH_SOURCE:-}` (not `${BASH_SOURCE}`) prevents PS4 evaluation
55
- # from failing under `set -u`: at the top level of a `bash -c`
56
- # script, BASH_SOURCE[0] is unbound; an unguarded expansion under
57
- # `set -u` aborts the shell, taking out any test that sources a
58
- # `set -euo pipefail` library file.
59
- set -x
60
- PS4='+@COV@:${LINENO}:${BASH_SOURCE:-}:@ '
61
- SETUP
62
-
63
- # Sanity-probe: run one trivial script through the pipeline so a
64
- # subsequent failure of the real sweep can be diagnosed quickly.
65
- probe_target="$COVERAGE_DIR/_probe_target.sh"
66
- cat >"$probe_target" <<'PROBE'
67
- #!/usr/bin/env bash
68
- set -uo pipefail
69
- echo "probe-line-a"
70
- x=1; y=2
71
- echo "probe-sum=$((x + y))"
72
- PROBE
73
- chmod +x "$probe_target"
74
-
75
- PS4='+@COV@:${LINENO}:${BASH_SOURCE}:@ ' \
76
- BASH_ENV="$bash_env" \
77
- bash "$probe_target" 2>"$trace_dir/_probe.trace" >/dev/null || true
78
- probe_lines=$(grep -cE "^\+@COV@:[0-9]+:.*${probe_target}:@" "$trace_dir/_probe.trace" 2>/dev/null || echo 0)
79
- echo "probe: ${probe_lines} traced lines from ${probe_target}" >&2
80
- if [[ "$probe_lines" -eq 0 ]]; then
81
- echo "::error::xtrace probe captured no lines — coverage mechanism broken" >&2
82
- exit 2
83
- fi
84
-
85
- # -----------------------------------------------------------------------------
86
- # Collect test files (mirror tests/framework/test_runner.sh discovery).
87
- # -----------------------------------------------------------------------------
88
- mapfile -t test_files < <(find "$TESTS_DIR/unit" -name 'test_*.sh' -type f | sort)
89
-
90
- if [[ "${#test_files[@]}" -eq 0 ]]; then
91
- echo "::error::no unit test files discovered under $TESTS_DIR/unit" >&2
92
- exit 1
93
- fi
94
-
95
- echo "Tracing ${#test_files[@]} test files (parallel × $JOBS, timeout ${COV_TEST_TIMEOUT}s/test)..." >&2
96
-
97
- # -----------------------------------------------------------------------------
98
- # Worker function — runs one test under xtrace, captures stderr.
99
- # -----------------------------------------------------------------------------
100
- # shellcheck disable=SC2329 # called indirectly via xargs subshell
101
- run_one() {
102
- local f="$1"
103
- local trace
104
- trace="$COV_TRACE_DIR/$(basename "$f" .sh).trace"
105
- PS4='+@COV@:${LINENO}:${BASH_SOURCE}:@ ' \
106
- BASH_ENV="$COV_BASH_ENV" \
107
- timeout --kill-after=5 "$COV_TEST_TIMEOUT" \
108
- bash "$f" 2>"$trace" >/dev/null || true
109
- }
110
-
111
- export COV_TRACE_DIR="$trace_dir"
112
- export COV_BASH_ENV="$bash_env"
113
- export COV_TEST_TIMEOUT
114
- export -f run_one
115
-
116
- start_ts=$(date +%s)
117
- printf '%s\n' "${test_files[@]}" |
118
- xargs -I{} -n1 -P"$JOBS" bash -c 'run_one "$@"' _ {} ||
119
- true
120
- elapsed=$(($(date +%s) - start_ts))
121
- echo "trace phase done in ${elapsed}s" >&2
122
-
123
- # -----------------------------------------------------------------------------
124
- # Aggregate trace files → lcov.info.
125
- # -----------------------------------------------------------------------------
126
- python3 - "$COVERAGE_OUT" "$trace_dir" "$REPO_ROOT" "$COV_INCLUDE_DIRS" <<'PY'
127
- """Aggregate bash xtrace output into lcov.info."""
128
- import os
129
- import re
130
- import sys
131
- from collections import defaultdict
132
- from pathlib import Path
133
-
134
- out_path, trace_dir, repo_root, include_dirs_spec = sys.argv[1:5]
135
- include_dirs = [Path(p).resolve() for p in include_dirs_spec.split(":") if p]
136
- trace_dir = Path(trace_dir)
137
- repo_root = Path(repo_root).resolve()
138
-
139
- # Pattern: +@COV@:<lineno>:<source>:@
140
- hit_re = re.compile(r"^\+@COV@:(\d+):([^:]+):@")
141
-
142
- # files[abs_path][line] = total hits
143
- files = defaultdict(lambda: defaultdict(int))
144
-
145
- def in_includes(path: Path) -> bool:
146
- try:
147
- rp = path.resolve()
148
- except (OSError, RuntimeError):
149
- return False
150
- for inc in include_dirs:
151
- try:
152
- rp.relative_to(inc)
153
- return True
154
- except ValueError:
155
- continue
156
- return False
157
-
158
- # Parse every trace file. Each trace can be MBs; iterate line by line.
159
- for trace_path in sorted(trace_dir.glob("*.trace")):
160
- try:
161
- with open(trace_path, "r", errors="replace") as f:
162
- for line in f:
163
- m = hit_re.match(line)
164
- if not m:
165
- continue
166
- lineno = int(m.group(1))
167
- src = m.group(2).strip()
168
- if not src or src == "main":
169
- continue
170
- src_path = Path(src)
171
- if not src_path.is_absolute():
172
- src_path = (repo_root / src_path)
173
- # Always resolve so `..`-style paths from inside
174
- # `commands/foo.sh` sourcing `../lib/log.sh` collapse
175
- # to the same canonical SF: key as a direct hit on
176
- # `lib/log.sh`. Without this we get three SF: blocks
177
- # for one file and the denominator inflates.
178
- try:
179
- src_path = src_path.resolve()
180
- except (OSError, RuntimeError):
181
- pass
182
- if not in_includes(src_path):
183
- continue
184
- files[str(src_path)][lineno] += 1
185
- except OSError as e:
186
- print(f"warn: read error {trace_path}: {e}", file=sys.stderr)
187
-
188
- # Sweep through include-dirs and add executable lines for files we never
189
- # touched, so lcov coverage % reflects total source surface, not just
190
- # touched files.
191
- ws_re = re.compile(r"^\s*$")
192
- comment_re = re.compile(r"^\s*#")
193
- shebang_re = re.compile(r"^\s*#!")
194
-
195
- def executable_lines(path: Path):
196
- """Lines that bash xtrace can plausibly emit.
197
-
198
- Excludes:
199
- - blanks / shebangs / comments (already)
200
- - structural-only keywords (`fi`, `done`, `else`, `esac`, `then`,
201
- `do`, `in`, bare `{`/`}` braces) — these are syntax, not
202
- commands; xtrace never traces them
203
- - heredoc body lines (between `<<EOF` and `EOF`) — content, not
204
- executed
205
- - `case` pattern labels (`foo)`) — the matched body executes,
206
- not the pattern itself
207
-
208
- This matches what `bash -x` actually produces a `+`-prefixed
209
- line for, so the denominator reflects measurable lines.
210
-
211
- Honor LCOV_EXCL_LINE / LCOV_EXCL_START / LCOV_EXCL_STOP markers
212
- so authors can exempt genuinely unreachable lines (platform-
213
- gated branches, root-only paths, dead-code stubs).
214
- """
215
- import re as _re
216
- structural = _re.compile(
217
- r"^\s*("
218
- r"fi|done|else|elif|esac|then|do|in|"
219
- r"\}|\{|"
220
- r"\)\s*;?;?\s*$|" # bare `)` (case pattern close)
221
- r";;\s*$" # `;;` case-clause terminator
222
- r")\s*(#.*)?$"
223
- )
224
- case_pattern = _re.compile(r"^\s*[a-zA-Z0-9_\*\?\[\|/\-\.+]+\)\s*(#.*)?$")
225
- heredoc_open = _re.compile(r"<<-?\s*[\"\']?([A-Za-z_][A-Za-z0-9_]*)[\"\']?")
226
- excl_line = _re.compile(r"#\s*LCOV_EXCL_LINE")
227
- excl_start = _re.compile(r"#\s*LCOV_EXCL_START")
228
- excl_stop = _re.compile(r"#\s*LCOV_EXCL_STOP")
229
- # Scripts that explicitly turn off xtrace can't be measured by
230
- # this mechanism — the bash runtime simply stops emitting trace
231
- # records. Treat everything after `set +x` / `set +o xtrace`
232
- # as excluded so it doesn't sink the denominator.
233
- xtrace_off = _re.compile(r"^\s*set\s+(\+x|\+o\s+xtrace)\b")
234
-
235
- try:
236
- with open(path, "r", errors="replace") as f:
237
- text = f.read().splitlines()
238
- except OSError:
239
- return []
240
-
241
- out = []
242
- in_heredoc = None # the terminator we're waiting for
243
- excluding = False
244
- xtrace_disabled = False
245
- for i, line in enumerate(text, 1):
246
- # LCOV_EXCL handling
247
- if excl_start.search(line):
248
- excluding = True
249
- continue
250
- if excl_stop.search(line):
251
- excluding = False
252
- continue
253
- if excluding:
254
- continue
255
- if excl_line.search(line):
256
- continue
257
-
258
- # Once a script disables xtrace, no further lines can be
259
- # measured by this mechanism — drop them from the denominator.
260
- if xtrace_disabled:
261
- continue
262
- if xtrace_off.match(line):
263
- xtrace_disabled = True
264
- continue
265
-
266
- # Heredoc body — track and skip
267
- if in_heredoc is not None:
268
- if line.strip() == in_heredoc:
269
- in_heredoc = None
270
- continue
271
- hd = heredoc_open.search(line)
272
- if hd and not comment_re.match(line):
273
- in_heredoc = hd.group(1)
274
-
275
- if not line or ws_re.match(line):
276
- continue
277
- if shebang_re.match(line):
278
- continue
279
- if comment_re.match(line):
280
- continue
281
- if structural.match(line):
282
- continue
283
- if case_pattern.match(line):
284
- continue
285
- out.append(i)
286
- return out
287
-
288
- for inc in include_dirs:
289
- if not inc.exists():
290
- continue
291
- for path in inc.rglob("*.sh"):
292
- ap = str(path.resolve())
293
- existing = files[ap] # creates the entry on touch
294
- for ln in executable_lines(path):
295
- if ln not in existing:
296
- existing[ln] = 0
297
- for path in inc.rglob("*"):
298
- # also include shebanged shell scripts without .sh
299
- if path.is_file() and not path.suffix and path.stat().st_size > 0:
300
- try:
301
- with open(path, "r", errors="replace") as f:
302
- first = f.readline()
303
- except OSError:
304
- continue
305
- if first.startswith("#!") and ("bash" in first or "sh" in first):
306
- ap = str(path.resolve())
307
- existing = files[ap]
308
- for ln in executable_lines(path):
309
- if ln not in existing:
310
- existing[ln] = 0
311
-
312
- # Emit lcov.info
313
- with open(out_path, "w") as out:
314
- for filename in sorted(files):
315
- out.write(f"SF:{filename}\n")
316
- for ln in sorted(files[filename]):
317
- out.write(f"DA:{ln},{files[filename][ln]}\n")
318
- out.write("end_of_record\n")
319
-
320
- # Summary
321
- total_files = len(files)
322
- total_lines = sum(len(lines) for lines in files.values())
323
- covered = sum(1 for lines in files.values() for h in lines.values() if h > 0)
324
- pct = (covered * 100.0 / total_lines) if total_lines else 0.0
325
- print(f"Aggregated: {total_files} files, {covered}/{total_lines} lines = {pct:.2f}%",
326
- file=sys.stderr)
327
- PY
328
-
329
- if [[ ! -s "$COVERAGE_OUT" ]]; then
330
- echo "::error::failed to produce lcov.info — aggregator wrote empty file." >&2
331
- exit 1
332
- fi
333
-
334
- # -----------------------------------------------------------------------------
335
- # Threshold check.
336
- # -----------------------------------------------------------------------------
337
- summary=$(
338
- python3 - "$COVERAGE_OUT" <<'PY'
339
- import sys
340
- total = covered = 0
341
- with open(sys.argv[1]) as f:
342
- for line in f:
343
- if line.startswith("DA:"):
344
- _, rest = line.split(":", 1)
345
- _, hits = rest.strip().split(",")
346
- total += 1
347
- if int(hits) > 0:
348
- covered += 1
349
- pct = (covered * 100.0 / total) if total else 0.0
350
- print(f"{covered} {total} {pct:.2f}")
351
- PY
352
- )
353
- read -r covered total pct <<<"$summary"
354
- echo "Coverage: ${covered}/${total} lines = ${pct}% (output: $COVERAGE_OUT)"
355
-
356
- below=$(awk -v p="$pct" -v t="$MIN_COVERAGE_PCT" 'BEGIN{print (p+0 < t+0) ? "1" : "0"}')
357
- if [[ "$below" == "1" ]]; then
358
- echo "::error::coverage ${pct}% is below the floor ${MIN_COVERAGE_PCT}%" >&2
359
- exit 1
360
- fi
361
-
362
- exit 0
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
- # Validate .chezmoidata.toml against config/chezmoidata.schema.json via taplo.
4
- #
5
- # Usage:
6
- # bash scripts/ci/validate-chezmoidata.sh
7
- #
8
- # In CI the workflow installs taplo before invoking this script. Locally,
9
- # install via: cargo install --locked taplo-cli (or `brew install taplo`).
10
-
11
- set -euo pipefail
12
-
13
- REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
14
- cd "$REPO_ROOT"
15
-
16
- if ! command -v taplo >/dev/null 2>&1; then
17
- echo "error: taplo not found in PATH" >&2
18
- echo " install: cargo install --locked taplo-cli" >&2
19
- echo " or: brew install taplo" >&2
20
- exit 127
21
- fi
22
-
23
- # `taplo check` reads .taplo.toml at the repo root, applies the schema
24
- # rule, and reports schema violations + TOML syntax errors.
25
- taplo check
@@ -1,224 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
- # CI Configuration Validation Script
4
- # Verifies that all zero-warning policy components are properly configured
5
-
6
- set -euo pipefail
7
-
8
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
- REPO_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
10
-
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
18
-
19
- printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
20
- printf '%b\n' "${BLUE} CI CONFIGURATION VALIDATOR ${NC}"
21
- printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
22
- echo ""
23
-
24
- ERRORS=0
25
- WARNINGS=0
26
-
27
- # Helper functions
28
- check_file_exists() {
29
- local file="$1"
30
- local description="$2"
31
-
32
- if [[ -f "$file" ]]; then
33
- printf '%b\n' " ${GREEN}✓${NC} $description"
34
- return 0
35
- else
36
- printf '%b\n' " ${RED}✗${NC} $description"
37
- ((ERRORS++))
38
- return 1
39
- fi
40
- }
41
-
42
- check_pattern_in_file() {
43
- local file="$1"
44
- local pattern="$2"
45
- local description="$3"
46
-
47
- if [[ -f "$file" ]] && grep -q "$pattern" "$file"; then
48
- printf '%b\n' " ${GREEN}✓${NC} $description"
49
- return 0
50
- else
51
- printf '%b\n' " ${RED}✗${NC} $description"
52
- ((ERRORS++))
53
- return 1
54
- fi
55
- }
56
-
57
- warn_if_pattern() {
58
- local file="$1"
59
- local pattern="$2"
60
- local description="$3"
61
-
62
- if [[ -f "$file" ]] && grep -q "$pattern" "$file"; then
63
- printf '%b\n' " ${YELLOW}⚠${NC} $description"
64
- ((WARNINGS++))
65
- return 1
66
- else
67
- printf '%b\n' " ${GREEN}✓${NC} $description"
68
- return 0
69
- fi
70
- }
71
-
72
- # Check 1: Core CI files exist
73
- printf '%b\n' "${BLUE}1. Core CI Files${NC}"
74
- check_file_exists "$REPO_ROOT/.github/workflows/ci.yml" "Main CI workflow exists"
75
- check_file_exists "$REPO_ROOT/.github/workflows/nightly.yml" "Nightly workflow exists"
76
- check_file_exists "$REPO_ROOT/.github/workflows/security-enhanced.yml" "Security workflow exists"
77
- check_file_exists "$REPO_ROOT/config/pre-commit-config.yaml" "Pre-commit configuration exists"
78
- echo ""
79
-
80
- # Check 2: Zero-warning enforcement
81
- printf '%b\n' "${BLUE}2. Zero-Warning Policy Enforcement${NC}"
82
- check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "zero-warning" "Zero-warning policy documented"
83
- check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "fail on unformatted code" "Formatter failure enforced"
84
- check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "warnings-as-errors" "Warnings treated as errors"
85
-
86
- # Verify no || true patterns in security steps
87
- warn_if_pattern "$REPO_ROOT/.github/workflows/ci.yml" "gitleaks.*||.*true" "Gitleaks bypass detected"
88
- warn_if_pattern "$REPO_ROOT/.github/workflows/ci.yml" "shellcheck.*||.*true" "Shellcheck bypass detected"
89
- echo ""
90
-
91
- # Check 3: Test coverage requirements
92
- printf '%b\n' "${BLUE}3. Test Coverage Requirements${NC}"
93
- check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "100%" "100% coverage requirement"
94
- check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "fail-under" "Coverage threshold enforcement"
95
-
96
- if [[ -f "$REPO_ROOT/tests/framework/test_runner.sh" ]]; then
97
- printf '%b\n' " ${GREEN}✓${NC} Test framework exists"
98
- else
99
- printf '%b\n' " ${RED}✗${NC} Test framework missing"
100
- ((ERRORS++))
101
- fi
102
- echo ""
103
-
104
- # Check 4: Security scanning
105
- printf '%b\n' "${BLUE}4. Security Scanning Configuration${NC}"
106
- check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "security-secrets" "Secret scanning enabled"
107
- check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "security-dependencies" "Dependency audit enabled"
108
- check_pattern_in_file "$REPO_ROOT/config/pre-commit-config.yaml" "gitleaks" "Pre-commit secret scanning"
109
- check_pattern_in_file "$REPO_ROOT/config/pre-commit-config.yaml" "detect-secrets" "Advanced secret detection"
110
-
111
- # Verify no piped execution patterns
112
- warn_if_pattern "$REPO_ROOT/.github/workflows/ci.yml" "curl.*|.*sh" "Dangerous piped execution"
113
- warn_if_pattern "$REPO_ROOT/.github/workflows/ci.yml" "wget.*|.*bash" "Dangerous piped execution"
114
- echo ""
115
-
116
- # Check 5: Performance monitoring
117
- printf '%b\n' "${BLUE}5. Performance Monitoring${NC}"
118
- check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "benchmark" "Performance benchmarking enabled"
119
- check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "500ms" "Shell startup threshold defined"
120
- check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "performance-tracking" "Nightly performance tracking"
121
- echo ""
122
-
123
- # Check 6: Multi-OS support
124
- printf '%b\n' "${BLUE}6. Multi-OS Testing${NC}"
125
- check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "ubuntu-latest" "Linux testing enabled"
126
- check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "macos-latest" "macOS testing enabled"
127
- check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "matrix:" "OS matrix testing configured"
128
- echo ""
129
-
130
- # Check 7: Timeouts and efficiency
131
- printf '%b\n' "${BLUE}7. Timeout and Efficiency Settings${NC}"
132
- if grep -q "timeout-minutes: [0-9]" "$REPO_ROOT/.github/workflows/ci.yml"; then
133
- MAX_TIMEOUT=$(grep "timeout-minutes:" "$REPO_ROOT/.github/workflows/ci.yml" |
134
- awk '{print $2}' | sort -n | tail -1)
135
- if [[ $MAX_TIMEOUT -le 15 ]]; then
136
- printf '%b\n' " ${GREEN}✓${NC} Job timeouts properly configured (max: ${MAX_TIMEOUT}min)"
137
- else
138
- printf '%b\n' " ${YELLOW}⚠${NC} Some jobs have long timeouts (max: ${MAX_TIMEOUT}min)"
139
- ((WARNINGS++))
140
- fi
141
- else
142
- printf '%b\n' " ${RED}✗${NC} No timeout configuration found"
143
- ((ERRORS++))
144
- fi
145
-
146
- check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "cache" "Dependency caching enabled"
147
- echo ""
148
-
149
- # Check 8: Branch protection readiness
150
- printf '%b\n' "${BLUE}8. Branch Protection Readiness${NC}"
151
- check_file_exists "$REPO_ROOT/.github/BRANCH_PROTECTION.md" "Branch protection documentation"
152
- check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "quality-gate" "Quality gate job defined"
153
-
154
- # Check for required status check names
155
- REQUIRED_CHECKS=(
156
- "lint-shell"
157
- "security-secrets"
158
- "security-dependencies"
159
- "test-unit"
160
- "quality-gate"
161
- )
162
-
163
- for check in "${REQUIRED_CHECKS[@]}"; do
164
- if grep -q "name:.*$check" "$REPO_ROOT/.github/workflows/ci.yml"; then
165
- printf '%b\n' " ${GREEN}✓${NC} Required check '$check' defined"
166
- else
167
- printf '%b\n' " ${RED}✗${NC} Required check '$check' missing"
168
- ((ERRORS++))
169
- fi
170
- done
171
- echo ""
172
-
173
- # Check 9: Nightly extended testing
174
- printf '%b\n' "${BLUE}9. Nightly Extended Testing${NC}"
175
- if [[ -f "$REPO_ROOT/.github/workflows/nightly.yml" ]]; then
176
- check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "dependency-updates" "Dependency monitoring"
177
- check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "beta-tools-test" "Beta tool testing"
178
- check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "security-extended" "Extended security scanning"
179
- check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "cron:" "Scheduled execution"
180
- else
181
- printf '%b\n' " ${RED}✗${NC} Nightly workflow missing"
182
- ((ERRORS++))
183
- fi
184
- echo ""
185
-
186
- # Final summary
187
- printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
188
- printf '%b\n' "${BLUE} VALIDATION SUMMARY ${NC}"
189
- printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
190
-
191
- if [[ $ERRORS -eq 0 ]] && [[ $WARNINGS -eq 0 ]]; then
192
- printf '%b\n' "${GREEN}✅ PERFECT: CI configuration fully compliant${NC}"
193
- echo " - Zero-warning policy properly enforced"
194
- echo " - All security gates configured"
195
- echo " - Performance monitoring active"
196
- echo " - Ready for branch protection"
197
- elif [[ $ERRORS -eq 0 ]]; then
198
- printf '%b\n' "${YELLOW}⚠️ GOOD: CI mostly compliant with $WARNINGS warning(s)${NC}"
199
- echo " - Core functionality working"
200
- echo " - Minor improvements recommended"
201
- else
202
- printf '%b\n' "${RED}❌ ISSUES: CI configuration has $ERRORS error(s) and $WARNINGS warning(s)${NC}"
203
- echo " - Critical fixes required before deployment"
204
- fi
205
-
206
- echo ""
207
- echo "Configuration Details:"
208
- echo " - Repository: $REPO_ROOT"
209
- echo " - Main CI: .github/workflows/ci.yml"
210
- echo " - Nightly: .github/workflows/nightly.yml"
211
- echo " - Pre-commit: config/pre-commit-config.yaml"
212
- echo ""
213
- echo "Next Steps:"
214
- if [[ $ERRORS -gt 0 ]]; then
215
- echo " 1. Fix critical errors listed above"
216
- echo " 2. Re-run validation: $0"
217
- fi
218
- if [[ $WARNINGS -gt 0 ]]; then
219
- echo " 3. Address warnings for optimal configuration"
220
- fi
221
- echo " 4. Configure branch protection rules per BRANCH_PROTECTION.md"
222
- echo " 5. Test CI pipeline with a small PR"
223
-
224
- exit $ERRORS