@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
@@ -6,8 +6,8 @@
6
6
  set -euo pipefail
7
7
 
8
8
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
- # shellcheck source=../lib/utils.sh
10
- source "$SCRIPT_DIR/../lib/utils.sh"
9
+ # shellcheck source=../../../lib/dot/utils.sh
10
+ source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
11
11
 
12
12
  PATTERN_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/ai/patterns"
13
13
  mkdir -p "$PATTERN_DIR"
@@ -0,0 +1,263 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2015-2026 Dotfiles. All rights reserved.
3
+ # shellcheck shell=bash
4
+ #
5
+ # scripts/dot/commands/registry.sh
6
+ #
7
+ # `dot registry` — initial scaffold for the dot module registry.
8
+ #
9
+ # §3 audit roadmap: ship a registry of reusable dotfile modules
10
+ # ("rust-dev-setup", "k8s-operator-laptop") to seed network effects.
11
+ # Hosted as a GitHub-Pages-indexed JSON file to keep ops cost near
12
+ # zero.
13
+ #
14
+ # Current state: SCAFFOLD ONLY. This file ships the CLI surface and
15
+ # the JSON contract (see _registry_default_url). The registry itself
16
+ # is empty; populating it is its own roadmap item.
17
+ #
18
+ # Subcommands:
19
+ # list Show modules in the configured registry
20
+ # search <q> Filter modules by keyword (name, description, tags)
21
+ # info <name> Print full metadata for a module
22
+ # install <name> Apply a module to the current workstation (stub —
23
+ # prints what would be installed; full implementation
24
+ # needs a sandboxed apply pipeline)
25
+ # url Show the active registry URL
26
+ # set-url <u> Override the registry URL (writes to user config)
27
+ #
28
+ # Registry JSON shape:
29
+ # {
30
+ # "version": 1,
31
+ # "updated": "2026-05-15T16:00:00Z",
32
+ # "modules": [
33
+ # { "name": "rust-dev-setup",
34
+ # "description": "Rust toolchain + cargo plugins + IDE config",
35
+ # "repo": "https://github.com/example/rust-dev-setup",
36
+ # "tags": ["rust", "dev", "language"],
37
+ # "maintainer": "alice@example.com",
38
+ # "version": "1.2.0",
39
+ # "sha256": "abc123..." }
40
+ # ]
41
+ # }
42
+
43
+ set -euo pipefail
44
+
45
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
46
+ # shellcheck source=../../../lib/dot/ui.sh disable=SC1091
47
+ source "$SCRIPT_DIR/../../../lib/dot/ui.sh"
48
+ # shellcheck source=../../../lib/dot/utils.sh disable=SC1091
49
+ source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
50
+
51
+ _registry_default_url() {
52
+ printf '%s\n' "https://sebastienrousseau.github.io/dotfiles/registry.json"
53
+ }
54
+
55
+ _registry_config_file() {
56
+ printf '%s/dotfiles/registry.toml\n' "${XDG_CONFIG_HOME:-$HOME/.config}"
57
+ }
58
+
59
+ _registry_url() {
60
+ if [[ -n "${DOTFILES_REGISTRY_URL:-}" ]]; then
61
+ printf '%s\n' "$DOTFILES_REGISTRY_URL"
62
+ return
63
+ fi
64
+ local cfg
65
+ cfg="$(_registry_config_file)"
66
+ if [[ -f "$cfg" ]]; then
67
+ local u
68
+ u="$(awk -F'[ \t]*=[ \t]*' '/^url[ \t]*=/{gsub(/"/,"",$2); print $2; exit}' "$cfg")"
69
+ [[ -n "$u" ]] && {
70
+ printf '%s\n' "$u"
71
+ return
72
+ }
73
+ fi
74
+ _registry_default_url
75
+ }
76
+
77
+ _registry_cache_dir() {
78
+ printf '%s/dotfiles/registry\n' "${XDG_CACHE_HOME:-$HOME/.cache}"
79
+ }
80
+
81
+ _registry_fetch() {
82
+ local url cache_dir cache_file
83
+ url="$(_registry_url)"
84
+ cache_dir="$(_registry_cache_dir)"
85
+ cache_file="$cache_dir/index.json"
86
+ mkdir -p "$cache_dir"
87
+ # Refresh if older than 6h or missing.
88
+ local now mtime
89
+ now="$(date +%s)"
90
+ if [[ -s "$cache_file" ]]; then
91
+ if mtime="$(stat -f %m "$cache_file" 2>/dev/null || stat -c %Y "$cache_file" 2>/dev/null)"; then
92
+ if ((now - mtime < 21600)); then
93
+ printf '%s\n' "$cache_file"
94
+ return 0
95
+ fi
96
+ fi
97
+ fi
98
+ if ! command -v curl >/dev/null 2>&1; then
99
+ ui_err "registry" "curl not installed"
100
+ return 127
101
+ fi
102
+ local tmp
103
+ tmp="$(mktemp "${cache_file}.XXXXXX")"
104
+ if ! curl -fsSL --max-time 15 -o "$tmp" "$url"; then
105
+ rm -f "$tmp"
106
+ if [[ -s "$cache_file" ]]; then
107
+ ui_warn "registry" "fetch failed; using stale cache at $cache_file"
108
+ printf '%s\n' "$cache_file"
109
+ return 0
110
+ fi
111
+ ui_err "registry" "could not fetch $url"
112
+ return 1
113
+ fi
114
+ mv "$tmp" "$cache_file"
115
+ printf '%s\n' "$cache_file"
116
+ }
117
+
118
+ _registry_require_jq() {
119
+ command -v jq >/dev/null 2>&1 || {
120
+ ui_err "registry" "jq is required"
121
+ return 127
122
+ }
123
+ }
124
+
125
+ cmd_registry() {
126
+ local subcommand="${1:-list}"
127
+ shift || true
128
+
129
+ case "$subcommand" in
130
+ url)
131
+ printf '%s\n' "$(_registry_url)"
132
+ ;;
133
+ set-url)
134
+ local new_url="${1:-}"
135
+ [[ -n "$new_url" ]] || {
136
+ ui_err "set-url" "missing URL"
137
+ return 1
138
+ }
139
+ # Refuse non-HTTPS schemes. The registry index is unsigned today,
140
+ # so HTTPS is the only transport that gives us cert-pinned
141
+ # integrity. The `file://` exemption is for local testing only
142
+ # (the bench-script and unit tests use it).
143
+ if [[ ! "$new_url" =~ ^(https://|file://) ]]; then
144
+ ui_err "set-url" "registry URL must use https:// (or file:// for local testing) — got: $new_url"
145
+ return 1
146
+ fi
147
+ local cfg
148
+ cfg="$(_registry_config_file)"
149
+ mkdir -p "$(dirname "$cfg")"
150
+ # Atomic write so a concurrent invocation can't read a half-
151
+ # written file. Explicit if/else (avoid SC2015 A && B || C).
152
+ local _tmp
153
+ _tmp="$(mktemp "${cfg}.XXXXXX")"
154
+ if printf 'url = "%s"\n' "$new_url" >"$_tmp"; then
155
+ if ! mv "$_tmp" "$cfg"; then
156
+ rm -f "$_tmp"
157
+ ui_err "set-url" "failed to commit $cfg"
158
+ return 1
159
+ fi
160
+ else
161
+ rm -f "$_tmp"
162
+ ui_err "set-url" "failed to write $cfg"
163
+ return 1
164
+ fi
165
+ ui_ok "registry" "set to $new_url ($cfg)"
166
+ ;;
167
+ list)
168
+ _registry_require_jq || return $?
169
+ local index
170
+ index="$(_registry_fetch)" || return $?
171
+ ui_header "Registry modules"
172
+ ui_info "Source" "$(_registry_url)"
173
+ echo ""
174
+ if ! jq -e '.modules | length > 0' "$index" >/dev/null 2>&1; then
175
+ ui_warn "registry" "no modules published yet — see docs/operations/REGISTRY.md to contribute one"
176
+ return 0
177
+ fi
178
+ ui_table_begin "Module" "Version" "Description"
179
+ while IFS=$'\t' read -r name ver desc; do
180
+ ui_table_add "$name" "v$ver" "$desc"
181
+ done < <(jq -r '.modules[] | "\(.name)\t\(.version // "-")\t\(.description // "")"' "$index")
182
+ ui_table_end
183
+ ;;
184
+ search)
185
+ _registry_require_jq || return $?
186
+ local q="${1:-}"
187
+ [[ -n "$q" ]] || {
188
+ ui_err "search" "missing query"
189
+ return 1
190
+ }
191
+ local index
192
+ index="$(_registry_fetch)" || return $?
193
+ ui_header "Registry search: $q"
194
+ echo ""
195
+ ui_table_begin "Module" "Version" "Description"
196
+ while IFS=$'\t' read -r name ver desc; do
197
+ ui_table_add "$name" "v$ver" "$desc"
198
+ done < <(jq -r --arg q "$q" '
199
+ .modules[]
200
+ | select(
201
+ (.name // "" | ascii_downcase | contains($q | ascii_downcase)) or
202
+ (.description // "" | ascii_downcase | contains($q | ascii_downcase)) or
203
+ ((.tags // []) | map(ascii_downcase) | index($q | ascii_downcase))
204
+ )
205
+ | "\(.name)\t\(.version // "-")\t\(.description // "")"
206
+ ' "$index")
207
+ ui_table_end
208
+ ;;
209
+ info)
210
+ _registry_require_jq || return $?
211
+ local name="${1:-}"
212
+ [[ -n "$name" ]] || {
213
+ ui_err "info" "missing module name"
214
+ return 1
215
+ }
216
+ local index
217
+ index="$(_registry_fetch)" || return $?
218
+ local found
219
+ found="$(jq -r --arg n "$name" '.modules[] | select(.name == $n) | "OK"' "$index" 2>/dev/null)"
220
+ if [[ "$found" != "OK" ]]; then
221
+ ui_err "info" "module not found: $name"
222
+ return 1
223
+ fi
224
+ jq -r --arg n "$name" '.modules[] | select(.name == $n) | to_entries[] | "\(.key)\t\(.value | if type == "array" then join(", ") else tostring end)"' "$index" |
225
+ while IFS=$'\t' read -r key value; do
226
+ ui_ok "$key" "$value"
227
+ done
228
+ ;;
229
+ install)
230
+ local name="${1:-}"
231
+ [[ -n "$name" ]] || {
232
+ ui_err "install" "missing module name"
233
+ return 1
234
+ }
235
+ ui_warn "install" "scaffold only — full module installer is a roadmap item"
236
+ ui_info "install" "would fetch module $name from registry and apply it as a chezmoi sub-source"
237
+ return 0
238
+ ;;
239
+ --help | -h | help)
240
+ cat <<EOF
241
+ Usage: dot registry <subcommand>
242
+
243
+ Subcommands:
244
+ list List modules in the configured registry
245
+ search <q> Filter modules by keyword (name, description, tags)
246
+ info <name> Print metadata for a single module
247
+ install <name> Install a module (scaffold — see docs/operations/REGISTRY.md)
248
+ url Show the active registry URL
249
+ set-url <url> Override the registry URL (persists to user config)
250
+
251
+ Env overrides:
252
+ DOTFILES_REGISTRY_URL One-shot override of the registry URL.
253
+
254
+ Default registry: $(_registry_default_url)
255
+ EOF
256
+ ;;
257
+ *)
258
+ ui_err "Unknown subcommand" "$subcommand"
259
+ echo "Run 'dot registry --help' for usage." >&2
260
+ return 1
261
+ ;;
262
+ esac
263
+ }
@@ -6,10 +6,10 @@
6
6
  set -euo pipefail
7
7
 
8
8
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
- # shellcheck source=../lib/utils.sh
10
- source "$SCRIPT_DIR/../lib/utils.sh"
11
- # shellcheck source=../lib/log.sh
12
- source "$SCRIPT_DIR/../lib/log.sh"
9
+ # shellcheck source=../../../lib/dot/utils.sh
10
+ source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
11
+ # shellcheck source=../../../lib/dot/log.sh
12
+ source "$SCRIPT_DIR/../../../lib/dot/log.sh"
13
13
 
14
14
  DOTFILES_DIR="${DOTFILES_DIR:-$HOME/.dotfiles}"
15
15
  BACKUP_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dotfiles/backups"
@@ -6,8 +6,8 @@
6
6
  set -euo pipefail
7
7
 
8
8
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
- # shellcheck source=../lib/utils.sh
10
- source "$SCRIPT_DIR/../lib/utils.sh"
9
+ # shellcheck source=../../../lib/dot/utils.sh
10
+ source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
11
11
  # shellcheck source=../../lib/secrets_provider.sh
12
12
  source "$SCRIPT_DIR/../../lib/secrets_provider.sh"
13
13
 
@@ -15,7 +15,8 @@ dot_ui_command_banner "Secrets" "${1:-}"
15
15
 
16
16
  dot_data_file() {
17
17
  local src_dir
18
- src_dir="$(require_source_dir)"
18
+ src_dir="$(resolve_chezmoi_source_dir)"
19
+ [[ -z "$src_dir" ]] && src_dir="$(require_source_dir)"
19
20
  printf "%s\n" "$src_dir/.chezmoidata.toml"
20
21
  }
21
22
 
@@ -6,8 +6,8 @@
6
6
  set -euo pipefail
7
7
 
8
8
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
- # shellcheck source=../lib/utils.sh
10
- source "$SCRIPT_DIR/../lib/utils.sh"
9
+ # shellcheck source=../../../lib/dot/utils.sh
10
+ source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
11
11
 
12
12
  dot_ui_command_banner "Security" "${1:-}"
13
13
 
@@ -6,8 +6,8 @@
6
6
  set -euo pipefail
7
7
 
8
8
  _TOOLS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
- # shellcheck source=../lib/utils.sh
10
- source "$_TOOLS_DIR/../lib/utils.sh"
9
+ # shellcheck source=../../../lib/dot/utils.sh
10
+ source "$_TOOLS_DIR/../../../lib/dot/utils.sh"
11
11
  # shellcheck source=aliases.sh
12
12
  source "$_TOOLS_DIR/aliases.sh"
13
13
 
@@ -348,12 +348,70 @@ cmd_log_rotate() {
348
348
  }
349
349
 
350
350
  cmd_env_mise() {
351
+ # `dot env emit` is a separate sub-handler — it doesn't need mise
352
+ # at command-time, only when actually invoked (the script checks).
353
+ if [[ "${1:-}" == "emit" ]]; then
354
+ shift
355
+ # shellcheck source=./env-emit.sh
356
+ source "$(require_source_dir)/scripts/dot/commands/env-emit.sh"
357
+ dot_env_emit "$@"
358
+ return $?
359
+ fi
360
+
351
361
  if ! has_command mise; then
352
362
  ui_err "mise not installed (required for dot env)"
353
363
  exit 1
354
364
  fi
355
365
  case "${1:-list}" in
356
- list | ls) mise ls ;;
366
+ list | ls)
367
+ if has_command jq; then
368
+ ui_table_begin "Tool" "Version" "Source" "Requested"
369
+ while IFS=$'\t' read -r tool ver source req; do
370
+ ui_table_add "$tool" "$ver" "${source/$HOME/\~}" "$req"
371
+ done < <(mise ls --json 2>/dev/null | jq -r '
372
+ to_entries[] as $t
373
+ | $t.value[]
374
+ | [
375
+ $t.key,
376
+ (.version // "-"),
377
+ (.source.path // ""),
378
+ (.requested_version // "")
379
+ ]
380
+ | @tsv
381
+ ')
382
+ ui_table_end
383
+ else
384
+ mise ls
385
+ fi
386
+ # Surface orphan installs (tool versions on disk that no active config
387
+ # claims). `--dry-run-code` exits 1 iff there is something to prune;
388
+ # the call is fast (no I/O beyond reading the tracked-configs index).
389
+ if mise prune --dry-run-code --quiet >/dev/null 2>&1; then
390
+ :
391
+ else
392
+ echo ""
393
+ ui_warn "orphan installs" "tool versions on disk are not requested by any config"
394
+ ui_info "to clean" "run 'dot env prune' (dry-run) or 'dot env prune --yes' to commit"
395
+ fi
396
+ ;;
397
+ prune)
398
+ shift
399
+ local commit=0
400
+ for arg in "$@"; do
401
+ case "$arg" in
402
+ --yes | -y) commit=1 ;;
403
+ esac
404
+ done
405
+ if ((commit)); then
406
+ mise prune
407
+ else
408
+ ui_info "dry-run" "showing what 'mise prune' would remove (pass --yes to commit)"
409
+ echo ""
410
+ mise prune --dry-run
411
+ echo ""
412
+ ui_info "next" "re-run with 'dot env prune --yes' to actually uninstall"
413
+ fi
414
+ ;;
357
415
  install)
358
416
  shift
359
417
  # Validate tool names to prevent injection
@@ -377,7 +435,7 @@ cmd_env_mise() {
377
435
 
378
436
  cmd_profile() {
379
437
  local data_file
380
- data_file="$(resolve_source_dir)/.chezmoidata.toml"
438
+ data_file="$(resolve_chezmoi_source_dir)/.chezmoidata.toml"
381
439
  if [[ ! -f "$data_file" ]]; then
382
440
  die ".chezmoidata.toml not found"
383
441
  fi
@@ -0,0 +1,199 @@
1
+ # Dot — native PowerShell module for the dotfiles framework.
2
+ #
3
+ # This module provides native PowerShell cmdlets for the subset of
4
+ # `dot` subcommands that don't require bash. Closes Stub rows in
5
+ # docs/reference/POWERSHELL_PARITY.md.
6
+ #
7
+ # Loaded by bin/dot.ps1 dispatcher; cmdlets are also callable
8
+ # directly:
9
+ # Import-Module ./scripts/dot/powershell/Dot.psm1
10
+ # Get-DotVersion
11
+ # Invoke-DotHelp
12
+ # Test-DotAgentsSync -Verbose
13
+ #
14
+ # Tested via scripts/ci/windows-smoke-test.ps1.
15
+
16
+ #requires -Version 7.0
17
+
18
+ Set-StrictMode -Version Latest
19
+ $ErrorActionPreference = 'Stop'
20
+
21
+ # Module-level constants -------------------------------------------------------
22
+
23
+ $script:RepoRoot = if ($env:DOT_REPO_ROOT) {
24
+ $env:DOT_REPO_ROOT
25
+ }
26
+ else {
27
+ # When called from bin/dot.ps1 the dispatcher sets DOT_REPO_ROOT.
28
+ # When imported directly, infer it from this file's path:
29
+ # scripts/dot/powershell/Dot.psm1 → ../../..
30
+ (Resolve-Path (Join-Path $PSScriptRoot '..\..\..')).Path
31
+ }
32
+
33
+ # Post-Phase-4b (v0.2.503) .chezmoidata.toml ships under defaults/.
34
+ # Probe defaults/ first; fall back to legacy root location for older
35
+ # deployments that pre-date the .chezmoiroot activation.
36
+ $script:DataFile = Join-Path $script:RepoRoot 'defaults/.chezmoidata.toml'
37
+ if (-not (Test-Path $script:DataFile)) {
38
+ $script:DataFile = Join-Path $script:RepoRoot '.chezmoidata.toml'
39
+ }
40
+
41
+ # Helpers ---------------------------------------------------------------------
42
+
43
+ function script:Get-DotfilesVersionFromData {
44
+ if (-not (Test-Path $script:DataFile)) {
45
+ throw "Cannot read $script:DataFile (set DOT_REPO_ROOT to override)"
46
+ }
47
+ $line = Get-Content $script:DataFile |
48
+ Where-Object { $_ -match '^dotfiles_version\s*=\s*"([^"]+)"' } |
49
+ Select-Object -First 1
50
+ if (-not $line) {
51
+ throw "dotfiles_version not found in $script:DataFile"
52
+ }
53
+ if ($line -notmatch '"([^"]+)"') {
54
+ throw "Could not parse dotfiles_version from line: $line"
55
+ }
56
+ return $Matches[1]
57
+ }
58
+
59
+ function script:Write-DotBanner {
60
+ param([string]$Section)
61
+ if ($env:NO_COLOR) {
62
+ Write-Host "Dot · $Section"
63
+ return
64
+ }
65
+ $esc = [char]27
66
+ Write-Host "$esc[1;38;5;212mDot · $Section$esc[0m"
67
+ }
68
+
69
+ # Public cmdlets --------------------------------------------------------------
70
+
71
+ <#
72
+ .SYNOPSIS
73
+ Print the dotfiles framework version.
74
+
75
+ .DESCRIPTION
76
+ Native PowerShell implementation of `dot version`. Reads the
77
+ canonical version from .chezmoidata.toml (the single source of
78
+ truth) — does NOT shell out to bash.
79
+
80
+ .EXAMPLE
81
+ Get-DotVersion
82
+ 0.2.503
83
+
84
+ .EXAMPLE
85
+ Get-DotVersion -AsObject | ConvertTo-Json
86
+ {
87
+ "Version": "0.2.503",
88
+ "Source": "...\\.chezmoidata.toml",
89
+ "Native": true
90
+ }
91
+ #>
92
+ function Get-DotVersion {
93
+ [CmdletBinding()]
94
+ param(
95
+ [switch]$AsObject
96
+ )
97
+ $version = Get-DotfilesVersionFromData
98
+ if ($AsObject) {
99
+ return [pscustomobject]@{
100
+ Version = $version
101
+ Source = $script:DataFile
102
+ Native = $true
103
+ }
104
+ }
105
+ return $version
106
+ }
107
+
108
+ <#
109
+ .SYNOPSIS
110
+ Print the dot CLI help overview.
111
+
112
+ .DESCRIPTION
113
+ Native PowerShell implementation of `dot help`. Reads command
114
+ metadata from CLAUDE.md / the dispatcher's help table; does
115
+ NOT shell out to bash.
116
+
117
+ The full Linux-style help (every subcommand grouped by category)
118
+ requires the bash dispatcher; this cmdlet shows the Windows-
119
+ native subset.
120
+ #>
121
+ function Invoke-DotHelp {
122
+ [CmdletBinding()]
123
+ param()
124
+ $version = Get-DotfilesVersionFromData
125
+ Write-DotBanner -Section 'Help'
126
+ Write-Host ''
127
+ Write-Host " Version v$version"
128
+ Write-Host " Repo https://github.com/sebastienrousseau/dotfiles"
129
+ Write-Host " Docs https://github.com/sebastienrousseau/dotfiles/blob/master/docs/manual/"
130
+ Write-Host ''
131
+ Write-Host 'Native PowerShell commands (no bash required):'
132
+ Write-Host ''
133
+ Write-Host ' Get-DotVersion Print framework version'
134
+ Write-Host ' Invoke-DotHelp This screen'
135
+ Write-Host ' Test-DotAgentsSync Check AGENTS.md ↔ CLAUDE.md sync'
136
+ Write-Host ''
137
+ Write-Host 'Bash-bridged subcommands (require bash on PATH):'
138
+ Write-Host ''
139
+ Write-Host ' dot doctor Deep environment audit'
140
+ Write-Host ' dot env list List installed mise tools'
141
+ Write-Host ' dot env emit Emit v1 environment manifest'
142
+ Write-Host ' dot agents render Re-render every AGENTS.md harness'
143
+ Write-Host ' dot fleet status Single-node fleet status (Full on PowerShell)'
144
+ Write-Host ''
145
+ Write-Host 'See: dot help all (via bash) — full command index'
146
+ }
147
+
148
+ <#
149
+ .SYNOPSIS
150
+ Verify that AGENTS.md is in sync with CLAUDE.md.
151
+
152
+ .DESCRIPTION
153
+ Native PowerShell implementation of `dot agents check`. Both
154
+ files share a "Project Overview" paragraph that is the canonical
155
+ sync surface. If they diverge, AGENTS.md needs re-rendering
156
+ (run `dot agents render` via bash; native PowerShell render is
157
+ a separate ticket).
158
+
159
+ .OUTPUTS
160
+ [bool] — $true when in sync, $false otherwise.
161
+
162
+ .EXAMPLE
163
+ if (-not (Test-DotAgentsSync)) {
164
+ Write-Warning 'AGENTS.md is stale; run: bash dot_local/bin/executable_dot agents render'
165
+ }
166
+ #>
167
+ function Test-DotAgentsSync {
168
+ [CmdletBinding()]
169
+ [OutputType([bool])]
170
+ param()
171
+ $claude = Join-Path $script:RepoRoot 'CLAUDE.md'
172
+ $agents = Join-Path $script:RepoRoot 'AGENTS.md'
173
+ foreach ($f in @($claude, $agents)) {
174
+ if (-not (Test-Path $f)) {
175
+ Write-Error "missing: $f"
176
+ return $false
177
+ }
178
+ }
179
+ # Both files declare: "Chezmoi-managed dotfiles for macOS, Linux,
180
+ # WSL, and PowerShell 7.5+. Version `0.2.503`."
181
+ # That single line is the canonical sync surface — its content
182
+ # is generated from the same template by `dot agents render`.
183
+ $claudeLine = (Select-String -Path $claude -Pattern '^Chezmoi-managed dotfiles' -SimpleMatch:$false |
184
+ Select-Object -First 1).Line
185
+ $agentsLine = (Select-String -Path $agents -Pattern '^Chezmoi-managed dotfiles' -SimpleMatch:$false |
186
+ Select-Object -First 1).Line
187
+ if (-not $claudeLine -or -not $agentsLine) {
188
+ Write-Verbose "sync surface line not found — claude:[$claudeLine] agents:[$agentsLine]"
189
+ return $false
190
+ }
191
+ if ($claudeLine -ne $agentsLine) {
192
+ Write-Verbose "drift detected:`n CLAUDE.md: $claudeLine`n AGENTS.md: $agentsLine"
193
+ return $false
194
+ }
195
+ Write-Verbose 'AGENTS.md sync surface matches CLAUDE.md'
196
+ return $true
197
+ }
198
+
199
+ Export-ModuleMember -Function Get-DotVersion, Invoke-DotHelp, Test-DotAgentsSync
@@ -3,9 +3,9 @@
3
3
  set -euo pipefail
4
4
 
5
5
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
- # shellcheck source=../dot/lib/ui.sh
6
+ # shellcheck source=../../lib/dot/ui.sh
7
7
  # shellcheck disable=SC1091
8
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
8
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
9
9
 
10
10
  ui_init
11
11
  ui_header "Nerd Fonts"
@@ -33,7 +33,7 @@ echo -n " 🔍 Scanning for secrets... "
33
33
  # Exclude assignments to values containing common placeholder strings or within template expressions
34
34
  SENSITIVE_PATTERNS="(GITHUB_TOKEN|API_KEY|SECRET|password|private_key|AKIA[0-9A-Z]{16})[[:space:]]*[:=]"
35
35
  # Exclusions list for legitimate variable checks or documentation
36
- SECRET_EXCLUDES="test_|assertions.sh|.pre-commit|README|CHANGELOG|FEATURES.md|CONFIG_STRATEGY.md|docs/|install/lib/|.chezmoitemplates/|mcp-doctor.sh|\.github/workflows/"
36
+ SECRET_EXCLUDES="test_|assertions.sh|.pre-commit|README|CHANGELOG|FEATURES.md|docs/|install/lib/|.chezmoitemplates/|mcp-doctor.sh|\.github/workflows/"
37
37
  # Also exclude .tmpl files from secret scanning as they contain many false positive markers
38
38
  if echo "$STAGED_FILES" | grep -v "\.tmpl" | xargs grep -EiE "$SENSITIVE_PATTERNS" /dev/null | grep -vE "$SECRET_EXCLUDES" | grep -viE "dummy|placeholder|example|test|sk-placeholder|\\{\\{" >/dev/null 2>&1; then
39
39
  printf '%b\\n' "${RED}FAILED${NC}"
@@ -140,6 +140,6 @@ if [[ $FAILED -eq 1 ]]; then
140
140
  printf '%b\\n' " (Use --no-verify to bypass if absolutely necessary)"
141
141
  exit 1
142
142
  else
143
- printf '%b\n' "${GREEN}${BOLD}✅ Audit passed.${NC} v0.2.501 standards maintained."
143
+ printf '%b\n' "${GREEN}${BOLD}✅ Audit passed.${NC} v0.2.503 standards maintained."
144
144
  exit 0
145
145
  fi
@@ -90,3 +90,16 @@ if [ "${DOTFILES_ALLOW_UNSKIPPED_PUSH:-}" = "1" ]; then
90
90
  fi
91
91
 
92
92
  bash "$repo_root/scripts/qa/reliability-audit.sh" --quick
93
+
94
+ # Step 4 — version-string consistency. Catches the case where the
95
+ # canonical version in .chezmoidata.toml advanced but a human-visible
96
+ # surface (CLI banner, man page, README badge) wasn't bumped. The
97
+ # script is cheap (~8 grep calls); failure tells the user exactly
98
+ # which file drifted and offers --fix.
99
+ bash "$repo_root/scripts/qa/check-version-consistency.sh" --quiet || {
100
+ echo "" >&2
101
+ echo "Pre-push blocked: version-string drift detected." >&2
102
+ echo "Run: scripts/qa/check-version-consistency.sh" >&2
103
+ echo "Then: scripts/qa/check-version-consistency.sh --fix (optional auto-fix)" >&2
104
+ exit 1
105
+ }