@sebastienrousseau/dotfiles 0.2.502 → 0.2.504

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 (412) hide show
  1. package/CHANGELOG.md +109 -9
  2. package/LICENSE +21 -1283
  3. package/README.md +6 -4
  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/02-config-files.md +2 -2
  20. package/docs/manual/_toc.yml +1 -1
  21. package/docs/manual/command-index.md +72 -59
  22. package/docs/operations/CI_COMPOSITES.md +2 -2
  23. package/docs/operations/COMPLETIONS.md +2 -2
  24. package/docs/operations/COVERAGE.md +5 -5
  25. package/docs/operations/HARD_AUDIT_2026.md +11 -11
  26. package/docs/operations/MAINTENANCE.md +3 -3
  27. package/docs/operations/MANIFEST.md +127 -0
  28. package/docs/operations/RELEASE_PIPELINE.md +130 -0
  29. package/docs/operations/RFC_v0_2_503_reorganization.md +280 -0
  30. package/docs/operations/ROADMAP_2026.md +6 -6
  31. package/docs/operations/ROADMAP_V0_2_503.md +134 -0
  32. package/docs/operations/TESTING.md +17 -0
  33. package/docs/operations/TRACEABILITY.md +6 -3
  34. package/docs/operations/VERSION_SYNC.md +4 -4
  35. package/docs/reference/POWERSHELL_PARITY.md +8 -7
  36. package/docs/schema/dot-env-v1.json +110 -0
  37. package/docs/security/CI_EGRESS_ALLOWLIST.md +1 -1
  38. package/docs/security/CI_PINNING.md +17 -9
  39. package/docs/security/DEPS_DEV_EXCEPTIONS.md +2 -2
  40. package/docs/security/FUZZING.md +114 -0
  41. package/docs/security/INSTALL_VERIFICATION.md +2 -2
  42. package/docs/security/POLICY_RELEASES.md +2 -2
  43. package/docs/security/SCORECARD.md +58 -3
  44. package/docs/security/SHELL_EXEMPTIONS.md +4 -4
  45. package/docs/security/VERIFY_RELEASE.md +201 -0
  46. package/install.sh +118 -5
  47. package/package.json +1 -1
  48. package/scripts/README.md +123 -0
  49. package/scripts/ci/check-copyright-headers.sh +4 -93
  50. package/scripts/ci/check-shell-preamble.sh +4 -103
  51. package/scripts/ci/guard-gitleaks-checkout.sh +4 -54
  52. package/scripts/diagnostics/a2a-conformance.sh +4 -4
  53. package/scripts/diagnostics/alias-governance.sh +1 -1
  54. package/scripts/diagnostics/aliases-cheatsheet.sh +2 -2
  55. package/scripts/diagnostics/benchmark.sh +5 -5
  56. package/scripts/diagnostics/conflicts.sh +2 -2
  57. package/scripts/diagnostics/doctor-unified.sh +3 -3
  58. package/scripts/diagnostics/doctor.sh +10 -10
  59. package/scripts/diagnostics/drift-dashboard.sh +2 -2
  60. package/scripts/diagnostics/health.sh +4 -4
  61. package/scripts/diagnostics/history-analysis.sh +2 -2
  62. package/scripts/diagnostics/mcp-doctor.sh +10 -7
  63. package/scripts/diagnostics/perf.sh +5 -5
  64. package/scripts/diagnostics/scorecard.sh +4 -4
  65. package/scripts/diagnostics/security-score.sh +25 -6
  66. package/scripts/diagnostics/smoke-test.sh +2 -2
  67. package/scripts/diagnostics/snapshot.sh +2 -2
  68. package/scripts/diagnostics/verify.sh +4 -4
  69. package/scripts/diagnostics/version-locks.sh +13 -3
  70. package/scripts/diagnostics/workstation-attestation.sh +14 -14
  71. package/scripts/dot/commands/agent.sh +8 -0
  72. package/scripts/dot/commands/agents.sh +14 -4
  73. package/scripts/dot/commands/ai.sh +156 -37
  74. package/scripts/dot/commands/appearance.sh +2 -2
  75. package/scripts/dot/commands/core.sh +2 -2
  76. package/scripts/dot/commands/diagnostics.sh +5 -5
  77. package/scripts/dot/commands/env-emit.sh +202 -0
  78. package/scripts/dot/commands/fleet.sh +22 -16
  79. package/scripts/dot/commands/init.sh +4 -4
  80. package/scripts/dot/commands/lint.sh +9 -4
  81. package/scripts/dot/commands/manual.sh +3 -3
  82. package/scripts/dot/commands/meta.sh +12 -6
  83. package/scripts/dot/commands/patterns.sh +2 -2
  84. package/scripts/dot/commands/registry.sh +4 -4
  85. package/scripts/dot/commands/restore.sh +4 -4
  86. package/scripts/dot/commands/secrets.sh +4 -3
  87. package/scripts/dot/commands/security.sh +2 -2
  88. package/scripts/dot/commands/tools.sh +13 -3
  89. package/scripts/dot/powershell/Dot.psm1 +199 -0
  90. package/scripts/fonts/install-nerd-fonts.sh +2 -2
  91. package/scripts/git-hooks/pre-commit-audit.sh +3 -3
  92. package/scripts/git-hooks/pre-push +13 -0
  93. package/scripts/ops/ai-setup.sh +1 -1
  94. package/scripts/ops/bundle.sh +3 -3
  95. package/scripts/ops/chaos.sh +2 -2
  96. package/scripts/ops/chezmoi-apply.sh +12 -6
  97. package/scripts/ops/heal.sh +4 -4
  98. package/scripts/ops/post-apply-repair.sh +2 -2
  99. package/scripts/ops/prewarm.sh +2 -2
  100. package/scripts/ops/release.sh +4 -4
  101. package/scripts/ops/rollback.sh +4 -4
  102. package/scripts/ops/setup.sh +2 -2
  103. package/scripts/qa/check-version-consistency.sh +123 -0
  104. package/scripts/qa/coverage-baseline.sh +1 -1
  105. package/scripts/qa/docs-coverage.sh +2 -2
  106. package/scripts/qa/powershell-contract.ps1 +1 -1
  107. package/scripts/qa/scorecard-snapshot.sh +127 -0
  108. package/scripts/security/backup.sh +2 -2
  109. package/scripts/security/dns-doh.sh +4 -4
  110. package/scripts/security/encryption-check.sh +4 -4
  111. package/scripts/security/enforce-policies.sh +2 -2
  112. package/scripts/security/firewall.sh +4 -4
  113. package/scripts/security/lock-screen.sh +4 -4
  114. package/scripts/security/manage-secrets.sh +2 -2
  115. package/scripts/security/ssh-cert.sh +2 -2
  116. package/scripts/security/telemetry-kill.sh +4 -4
  117. package/scripts/security/usb-safety.sh +4 -4
  118. package/scripts/theme/extract-heic-frames.sh +114 -0
  119. package/scripts/theme/rebuild-themes.sh +31 -2
  120. package/scripts/theme/switch.sh +13 -6
  121. package/scripts/theme/wallpaper-sync.sh +297 -93
  122. package/scripts/tuning/linux.sh +2 -2
  123. package/scripts/tuning/macos.sh +2 -2
  124. package/scripts/version-sync.sh +74 -10
  125. package/dot_config/.module-manifest.json +0 -69
  126. package/dot_config/ai/identity.md +0 -23
  127. package/dot_config/ai/patterns/architect.md +0 -16
  128. package/dot_config/ai/patterns/hardener.md +0 -15
  129. package/dot_config/ai/patterns/refactor.md +0 -15
  130. package/dot_config/aider/aider.conf.yml +0 -32
  131. package/dot_config/alacritty/alacritty.toml.tmpl +0 -55
  132. package/dot_config/ansible/ansible.cfg +0 -11
  133. package/dot_config/atuin/config.toml.tmpl +0 -47
  134. package/dot_config/bat/config +0 -23
  135. package/dot_config/brave-flags.conf.tmpl +0 -7
  136. package/dot_config/btop/btop.conf +0 -16
  137. package/dot_config/btop/themes/tokyonight.theme +0 -34
  138. package/dot_config/bun/bunfig.toml.tmpl +0 -33
  139. package/dot_config/claude/mcp_servers.json +0 -20
  140. package/dot_config/containers/containers.conf +0 -14
  141. package/dot_config/curl/dot_curlrc +0 -18
  142. package/dot_config/dlv/config.yml +0 -39
  143. package/dot_config/docker/config.json +0 -15
  144. package/dot_config/dotfiles/agent-card.json +0 -29
  145. package/dot_config/dotfiles/agent-profiles.json +0 -92
  146. package/dot_config/dotfiles/boot/README.md +0 -13
  147. package/dot_config/dotfiles/grub/README.md +0 -13
  148. package/dot_config/dotfiles/lock/README.md +0 -13
  149. package/dot_config/dotfiles/mcp-lock.json +0 -33
  150. package/dot_config/dotfiles/mcp-policy.json +0 -52
  151. package/dot_config/dotfiles/mcp-registry.json +0 -47
  152. package/dot_config/dotfiles/model-registry.json +0 -20
  153. package/dot_config/dotfiles/policy-bundles.json +0 -38
  154. package/dot_config/dotfiles/prompt-registry.json +0 -16
  155. package/dot_config/dotfiles/versions.env +0 -18
  156. package/dot_config/duf/duf.conf +0 -6
  157. package/dot_config/duti/defaults.duti +0 -5
  158. package/dot_config/emoji/emoji.txt +0 -34
  159. package/dot_config/environment.d/50-ssh-agent.conf +0 -2
  160. package/dot_config/environment.d/90-wayland.conf +0 -19
  161. package/dot_config/fastfetch/config.jsonc +0 -28
  162. package/dot_config/firefox/user.js.tmpl +0 -58
  163. package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +0 -9
  164. package/dot_config/fish/completions/dot.fish.tmpl +0 -115
  165. package/dot_config/fish/conf.d/000-perf-cache.fish +0 -56
  166. package/dot_config/fish/conf.d/aliases.fish.tmpl +0 -77
  167. package/dot_config/fish/conf.d/direnv.fish +0 -4
  168. package/dot_config/fish/conf.d/env.fish.tmpl +0 -48
  169. package/dot_config/fish/conf.d/functions.fish.tmpl +0 -22
  170. package/dot_config/fish/conf.d/init.fish.tmpl +0 -172
  171. package/dot_config/fish/conf.d/mise-activate.fish +0 -5
  172. package/dot_config/fish/config.fish.tmpl +0 -44
  173. package/dot_config/fish/fish_plugins +0 -1
  174. package/dot_config/fish/functions/_.fish +0 -3
  175. package/dot_config/fish/functions/_cached_eval.fish +0 -131
  176. package/dot_config/fish/functions/_cached_eval_clear.fish +0 -17
  177. package/dot_config/fish/functions/als.fish +0 -46
  178. package/dot_config/fish/functions/bg-upgrade.fish +0 -7
  179. package/dot_config/fish/functions/c.fish +0 -3
  180. package/dot_config/fish/functions/cat.fish +0 -9
  181. package/dot_config/fish/functions/d.fish +0 -7
  182. package/dot_config/fish/functions/dot.fish +0 -34
  183. package/dot_config/fish/functions/h.fish +0 -3
  184. package/dot_config/fish/functions/l.fish +0 -7
  185. package/dot_config/fish/functions/la.fish +0 -7
  186. package/dot_config/fish/functions/ll.fish +0 -7
  187. package/dot_config/fish/functions/log_error.fish +0 -13
  188. package/dot_config/fish/functions/log_info.fish +0 -13
  189. package/dot_config/fish/functions/lr.fish +0 -7
  190. package/dot_config/fish/functions/lra.fish +0 -7
  191. package/dot_config/fish/functions/ls.fish +0 -7
  192. package/dot_config/fish/functions/lt.fish +0 -7
  193. package/dot_config/fish/functions/lta.fish +0 -7
  194. package/dot_config/fish/functions/notify-run.fish +0 -11
  195. package/dot_config/fish/functions/q.fish +0 -3
  196. package/dot_config/fish/functions/silent-run.fish +0 -7
  197. package/dot_config/fish/functions/yy.fish +0 -8
  198. package/dot_config/flatpak/flatpak.list +0 -4
  199. package/dot_config/fontconfig/fonts.conf.tmpl +0 -57
  200. package/dot_config/foot/foot.ini.tmpl +0 -33
  201. package/dot_config/fuzzel/fuzzel.ini.tmpl +0 -18
  202. package/dot_config/fzf/fzf.zsh +0 -48
  203. package/dot_config/gem/gemrc +0 -9
  204. package/dot_config/gh/config.yml +0 -12
  205. package/dot_config/ghostty/config.tmpl +0 -165
  206. package/dot_config/git/allowed_signers.tmpl +0 -18
  207. package/dot_config/git/attributes +0 -12
  208. package/dot_config/git/commit-template +0 -10
  209. package/dot_config/git/hooks/executable_commit-msg +0 -146
  210. package/dot_config/git/ignore +0 -27
  211. package/dot_config/gnupg/gpg-agent.conf +0 -11
  212. package/dot_config/go/golangci.yml +0 -118
  213. package/dot_config/go/gopls.json +0 -30
  214. package/dot_config/goose/config.yaml +0 -29
  215. package/dot_config/gtk-3.0/gtk.css.tmpl +0 -184
  216. package/dot_config/gtk-3.0/settings.ini.tmpl +0 -27
  217. package/dot_config/gtk-4.0/gtk.css.tmpl +0 -252
  218. package/dot_config/gtk-4.0/settings.ini.tmpl +0 -18
  219. package/dot_config/htop/htoprc +0 -20
  220. package/dot_config/inputrc +0 -2
  221. package/dot_config/ipython/profile_default/ipython_config.py +0 -19
  222. package/dot_config/just/justfile +0 -122
  223. package/dot_config/k9s/config.yaml +0 -65
  224. package/dot_config/k9s/skins/catppuccin-mocha.yaml +0 -116
  225. package/dot_config/kanshi/config.tmpl +0 -22
  226. package/dot_config/karabiner/karabiner.json +0 -14
  227. package/dot_config/kitty/kitty.conf.tmpl +0 -53
  228. package/dot_config/lazydocker/config.yml +0 -186
  229. package/dot_config/lazygit/config.yml +0 -35
  230. package/dot_config/mako/config +0 -47
  231. package/dot_config/mas/masapps.txt +0 -5
  232. package/dot_config/micro/settings.json +0 -3
  233. package/dot_config/mimeapps.list +0 -77
  234. package/dot_config/minikube/config.json +0 -13
  235. package/dot_config/mise/config.toml +0 -99
  236. package/dot_config/mongosh/mongoshrc.js +0 -68
  237. package/dot_config/mpv/input.conf +0 -47
  238. package/dot_config/mpv/mpv.conf +0 -47
  239. package/dot_config/mycli/myclirc +0 -67
  240. package/dot_config/nano/nanorc +0 -28
  241. package/dot_config/ncdu/config +0 -12
  242. package/dot_config/niri/config.kdl.tmpl +0 -327
  243. package/dot_config/nushell/aliases.nu +0 -18
  244. package/dot_config/nushell/cached_eval.nu +0 -80
  245. package/dot_config/nushell/completions.nu.tmpl +0 -52
  246. package/dot_config/nushell/config.nu.tmpl +0 -86
  247. package/dot_config/nushell/env.nu.tmpl +0 -102
  248. package/dot_config/nushell/functions.nu.tmpl +0 -17
  249. package/dot_config/nvim/init.lua +0 -18
  250. package/dot_config/nvim/lazy-lock.json +0 -58
  251. package/dot_config/nvim/lua/config/autocmds.lua +0 -107
  252. package/dot_config/nvim/lua/config/keymaps.lua +0 -92
  253. package/dot_config/nvim/lua/config/lazy.lua +0 -44
  254. package/dot_config/nvim/lua/config/options.lua +0 -49
  255. package/dot_config/nvim/lua/plugins/ai.lua +0 -75
  256. package/dot_config/nvim/lua/plugins/coding.lua +0 -216
  257. package/dot_config/nvim/lua/plugins/completion.lua +0 -60
  258. package/dot_config/nvim/lua/plugins/dap.lua +0 -412
  259. package/dot_config/nvim/lua/plugins/editor.lua +0 -55
  260. package/dot_config/nvim/lua/plugins/git.lua +0 -10
  261. package/dot_config/nvim/lua/plugins/lsp.lua +0 -156
  262. package/dot_config/nvim/lua/plugins/markdown.lua +0 -18
  263. package/dot_config/nvim/lua/plugins/rust.lua +0 -34
  264. package/dot_config/nvim/lua/plugins/sessions.lua +0 -33
  265. package/dot_config/nvim/lua/plugins/ui.lua +0 -509
  266. package/dot_config/paru/paru.conf +0 -10
  267. package/dot_config/pip/pip.conf.tmpl +0 -32
  268. package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +0 -81
  269. package/dot_config/pueue/pueue.yml +0 -34
  270. package/dot_config/pypoetry/config.toml +0 -6
  271. package/dot_config/pyrightconfig.json +0 -5
  272. package/dot_config/raycast/README.md +0 -13
  273. package/dot_config/redis/redisclirc +0 -41
  274. package/dot_config/ripgrep/ripgreprc +0 -21
  275. package/dot_config/shell/00-core-paths.sh.tmpl +0 -141
  276. package/dot_config/shell/05-core-safety.sh +0 -48
  277. package/dot_config/shell/10-secrets.sh +0 -41
  278. package/dot_config/shell/40-fzf-defaults.sh.tmpl +0 -17
  279. package/dot_config/shell/40-ls-colors.sh +0 -49
  280. package/dot_config/shell/50-logic-functions-core.sh.tmpl +0 -11
  281. package/dot_config/shell/50-logic-functions.sh.tmpl +0 -11
  282. package/dot_config/shell/51-logic-functions-extra.sh.tmpl +0 -65
  283. package/dot_config/shell/90-ux-aliases.sh.tmpl +0 -121
  284. package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +0 -55
  285. package/dot_config/shell/Brewfile +0 -207
  286. package/dot_config/shell/Brewfile.cask +0 -92
  287. package/dot_config/shell/Brewfile.cli +0 -127
  288. package/dot_config/shell/README.md +0 -284
  289. package/dot_config/shell/als_data.txt.tmpl +0 -65
  290. package/dot_config/shell/custom/auto_ls.zsh +0 -20
  291. package/dot_config/shell/custom/context_suggest.zsh +0 -68
  292. package/dot_config/shell/custom/error_analysis.zsh +0 -45
  293. package/dot_config/sops/dot_sops.yaml +0 -23
  294. package/dot_config/starship.toml.tmpl +0 -202
  295. package/dot_config/swaylock/config +0 -43
  296. package/dot_config/systemd/user/dotfiles-maintenance.service +0 -8
  297. package/dot_config/systemd/user/dotfiles-maintenance.timer +0 -11
  298. package/dot_config/systemd/user/pueued.service +0 -12
  299. package/dot_config/systemd/user/ssh-agent.service +0 -12
  300. package/dot_config/task/Taskfile.yml +0 -86
  301. package/dot_config/tflint/tflint.hcl +0 -9
  302. package/dot_config/tmux/tmux.conf.tmpl +0 -223
  303. package/dot_config/topgrade.toml.tmpl +0 -54
  304. package/dot_config/user-dirs.dirs +0 -10
  305. package/dot_config/vscode/extensions.txt +0 -11
  306. package/dot_config/vscode/settings.json.tmpl +0 -82
  307. package/dot_config/waybar/config.jsonc.tmpl +0 -90
  308. package/dot_config/waybar/style.css.tmpl +0 -211
  309. package/dot_config/wezterm/wezterm.lua.tmpl +0 -64
  310. package/dot_config/wget/wgetrc +0 -12
  311. package/dot_config/xdg-desktop-portal/niri-portals.conf +0 -5
  312. package/dot_config/yarn/yarnrc.yml +0 -36
  313. package/dot_config/yazi/keymap.toml +0 -67
  314. package/dot_config/yazi/theme.toml +0 -102
  315. package/dot_config/yazi/yazi.toml +0 -40
  316. package/dot_config/zathura/zathurarc +0 -52
  317. package/dot_config/zellij/config.kdl.tmpl +0 -79
  318. package/dot_config/zsh/dot_zprofile +0 -7
  319. package/dot_config/zsh/dot_zshenv +0 -5
  320. package/dot_config/zsh/dot_zshrc.tmpl +0 -688
  321. package/dot_config/zsh/rc.d/00-alias-shims.zsh +0 -99
  322. package/dot_config/zsh/rc.d/05-ssh-agent.zsh +0 -18
  323. package/dot_config/zsh/rc.d/10-env.zsh.tmpl +0 -28
  324. package/dot_config/zsh/rc.d/20-zinit.zsh +0 -65
  325. package/dot_config/zsh/rc.d/30-options.zsh.tmpl +0 -214
  326. package/dot_config/zsh/rc.d/40-bell.zsh +0 -20
  327. package/dot_config/zsh/rc.d/50-login-fortune.zsh +0 -9
  328. package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +0 -32
  329. package/dot_local/bin/executable_ai-update +0 -195
  330. package/dot_local/bin/executable_ai_core +0 -152
  331. package/dot_local/bin/executable_antigravity +0 -11
  332. package/dot_local/bin/executable_b64 +0 -84
  333. package/dot_local/bin/executable_bm +0 -79
  334. package/dot_local/bin/executable_cb +0 -39
  335. package/dot_local/bin/executable_dot +0 -636
  336. package/dot_local/bin/executable_dot-ai +0 -36
  337. package/dot_local/bin/executable_dot-bootstrap +0 -76
  338. package/dot_local/bin/executable_dot-launch-or-focus +0 -52
  339. package/dot_local/bin/executable_dot-load-benchmark +0 -31
  340. package/dot_local/bin/executable_dot-load-benchmark-pty +0 -77
  341. package/dot_local/bin/executable_dot-theme-sync +0 -952
  342. package/dot_local/bin/executable_dot_completion +0 -57
  343. package/dot_local/bin/executable_dtags +0 -28
  344. package/dot_local/bin/executable_epoch +0 -67
  345. package/dot_local/bin/executable_extract +0 -41
  346. package/dot_local/bin/executable_gbd +0 -52
  347. package/dot_local/bin/executable_gd +0 -42
  348. package/dot_local/bin/executable_git-ai-commit +0 -175
  349. package/dot_local/bin/executable_git-ai-diff +0 -169
  350. package/dot_local/bin/executable_gl +0 -101
  351. package/dot_local/bin/executable_hash +0 -161
  352. package/dot_local/bin/executable_hashsum +0 -160
  353. package/dot_local/bin/executable_hex +0 -115
  354. package/dot_local/bin/executable_jsonv +0 -78
  355. package/dot_local/bin/executable_jwt +0 -94
  356. package/dot_local/bin/executable_kill-port +0 -75
  357. package/dot_local/bin/executable_lorem +0 -118
  358. package/dot_local/bin/executable_mkscript +0 -35
  359. package/dot_local/bin/executable_monitor +0 -56
  360. package/dot_local/bin/executable_myip +0 -51
  361. package/dot_local/bin/executable_notify +0 -24
  362. package/dot_local/bin/executable_open +0 -38
  363. package/dot_local/bin/executable_pw +0 -27
  364. package/dot_local/bin/executable_rec-start +0 -46
  365. package/dot_local/bin/executable_rec-stop +0 -35
  366. package/dot_local/bin/executable_regex +0 -132
  367. package/dot_local/bin/executable_start-niri +0 -8
  368. package/dot_local/bin/executable_tmux-sessionizer +0 -314
  369. package/dot_local/bin/executable_tour +0 -177
  370. package/dot_local/bin/executable_up +0 -23
  371. package/dot_local/bin/executable_update +0 -142
  372. package/dot_local/bin/executable_uuid +0 -87
  373. package/dot_local/bin/executable_win +0 -32
  374. package/dot_local/bin/executable_yamlv +0 -57
  375. package/dot_local/share/bash-completion/completions/dot +0 -72
  376. package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
  377. package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
  378. package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
  379. package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
  380. package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
  381. package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
  382. package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
  383. package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
  384. package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
  385. package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
  386. package/dot_local/share/man/man1/dot.1 +0 -149
  387. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +0 -64
  388. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +0 -18
  389. package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +0 -13
  390. package/dot_local/share/wayland-sessions/niri.desktop.tmpl +0 -6
  391. package/dot_local/share/zsh/completions/.keep +0 -0
  392. package/dot_local/share/zsh/completions/_dot +0 -287
  393. package/scripts/ci/check-dangerous-chmod.sh +0 -19
  394. package/scripts/ci/check-deps-dev.sh +0 -236
  395. package/scripts/ci/check-insecure-tls.sh +0 -61
  396. package/scripts/ci/check-regression-traceability.sh +0 -67
  397. package/scripts/ci/dot-cli-startup-bench.sh +0 -126
  398. package/scripts/ci/install-chezmoi-verified.sh +0 -67
  399. package/scripts/ci/lint-reusable-pins.sh +0 -78
  400. package/scripts/ci/run-coverage.sh +0 -451
  401. package/scripts/ci/validate-chezmoidata.sh +0 -25
  402. package/scripts/ci/validate-ci-config.sh +0 -224
  403. package/scripts/ci/windows-smoke-test.ps1 +0 -136
  404. package/scripts/docs/build-manual.sh +0 -883
  405. package/scripts/docs/check-manual.sh +0 -213
  406. package/scripts/dot/lib/bento.sh +0 -50
  407. package/scripts/dot/lib/log.sh +0 -200
  408. package/scripts/dot/lib/platform.sh +0 -112
  409. package/scripts/dot/lib/ui.sh +0 -650
  410. package/scripts/dot/lib/utils.sh +0 -377
  411. package/scripts/maintenance/check-updates.sh +0 -131
  412. package/scripts/release/package-policy-bundles.sh +0 -125
@@ -30,9 +30,9 @@ set -euo pipefail
30
30
  set +o xtrace 2>/dev/null || true
31
31
 
32
32
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
33
- # shellcheck source=../dot/lib/ui.sh
33
+ # shellcheck source=../../lib/dot/ui.sh
34
34
  # shellcheck disable=SC1091
35
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
35
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
36
36
 
37
37
  # Parse arguments
38
38
  VERBOSE=true
@@ -64,7 +64,25 @@ YELLOW="${YELLOW:-}"
64
64
  # Scoring
65
65
  TOTAL_POINTS=0
66
66
  MAX_POINTS=0
67
- declare -A CATEGORY_SCORES
67
+ # Parallel indexed arrays instead of `declare -A` (bash 4+; macOS ships
68
+ # bash 3.2). CAT_NAMES[i] holds a category name, CAT_SCORES[i] its running
69
+ # total. Category names can contain spaces, so an emulation via dynamic
70
+ # variable names wouldn't work — a linear scan over the handful of
71
+ # categories is fine.
72
+ CAT_NAMES=()
73
+ CAT_SCORES=()
74
+
75
+ _cat_add() {
76
+ local name="$1" pts="$2" i
77
+ for ((i = 0; i < ${#CAT_NAMES[@]}; i++)); do
78
+ if [[ "${CAT_NAMES[$i]}" == "$name" ]]; then
79
+ CAT_SCORES[i]=$((CAT_SCORES[i] + pts))
80
+ return 0
81
+ fi
82
+ done
83
+ CAT_NAMES+=("$name")
84
+ CAT_SCORES+=("$pts")
85
+ }
68
86
 
69
87
  add_points() {
70
88
  local category="$1"
@@ -74,7 +92,7 @@ add_points() {
74
92
 
75
93
  TOTAL_POINTS=$((TOTAL_POINTS + points))
76
94
  MAX_POINTS=$((MAX_POINTS + max))
77
- CATEGORY_SCORES["$category"]=$((${CATEGORY_SCORES[$category]:-0} + points))
95
+ _cat_add "$category" "$points"
78
96
 
79
97
  if ! $JSON_OUTPUT && $VERBOSE; then
80
98
  local icon
@@ -339,10 +357,11 @@ print_summary() {
339
357
  echo " \"grade\": \"$(get_grade $score)\","
340
358
  echo " \"categories\": {"
341
359
  local first=true
342
- for cat in "${!CATEGORY_SCORES[@]}"; do
360
+ local _ci
361
+ for ((_ci = 0; _ci < ${#CAT_NAMES[@]}; _ci++)); do
343
362
  $first || echo ","
344
363
  first=false
345
- printf " \"%s\": %d" "$cat" "${CATEGORY_SCORES[$cat]}"
364
+ printf " \"%s\": %d" "${CAT_NAMES[$_ci]}" "${CAT_SCORES[$_ci]}"
346
365
  done
347
366
  echo ""
348
367
  echo " }"
@@ -5,9 +5,9 @@
5
5
  set -euo pipefail
6
6
 
7
7
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
- # shellcheck source=../dot/lib/ui.sh
8
+ # shellcheck source=../../lib/dot/ui.sh
9
9
  # shellcheck disable=SC1091
10
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
10
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
11
11
  ui_init
12
12
 
13
13
  ui_header "Dotfiles Smoke Tests"
@@ -6,9 +6,9 @@
6
6
  set -euo pipefail
7
7
 
8
8
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
- # shellcheck source=../dot/lib/ui.sh
9
+ # shellcheck source=../../lib/dot/ui.sh
10
10
  # shellcheck disable=SC1091
11
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
11
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
12
12
 
13
13
  ui_init
14
14
 
@@ -6,9 +6,9 @@
6
6
  set -euo pipefail
7
7
 
8
8
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
- # shellcheck source=../dot/lib/ui.sh
9
+ # shellcheck source=../../lib/dot/ui.sh
10
10
  # shellcheck disable=SC1091
11
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
11
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
12
12
 
13
13
  ui_init
14
14
  ui_dot_banner "Diagnostics"
@@ -43,8 +43,8 @@ resolve_dot_bin() {
43
43
  elif [[ -d "$HOME/.local/share/chezmoi" ]]; then
44
44
  src_dir="$HOME/.local/share/chezmoi"
45
45
  fi
46
- if [[ -n "$src_dir" && -x "$src_dir/dot_local/bin/executable_dot" ]]; then
47
- printf "%s\n" "$src_dir/dot_local/bin/executable_dot"
46
+ if [[ -n "$src_dir" && -x "$src_dir/bin/dot" ]]; then
47
+ printf "%s\n" "$src_dir/bin/dot"
48
48
  return
49
49
  fi
50
50
  return 1
@@ -6,9 +6,9 @@
6
6
  set -euo pipefail
7
7
 
8
8
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
- # shellcheck source=../dot/lib/ui.sh
9
+ # shellcheck source=../../lib/dot/ui.sh
10
10
  # shellcheck disable=SC1091
11
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
11
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
12
12
 
13
13
  ui_init
14
14
 
@@ -30,10 +30,20 @@ resolve_source_dir() {
30
30
 
31
31
  src_dir=$(resolve_source_dir)
32
32
 
33
+ # resolve_source_dir returns the repo root, but since the defaults/ reorg the
34
+ # deployable tree lives under the .chezmoiroot subdir (defaults/). Descend
35
+ # into it so paths like dot_config/... resolve. (Without this the mise lookup
36
+ # below silently reported "config not found" on every run.)
37
+ cm_src="$src_dir"
38
+ if [[ -f "$src_dir/.chezmoiroot" ]]; then
39
+ _cm_root="$(tr -d '[:space:]' <"$src_dir/.chezmoiroot")"
40
+ [[ -n "$_cm_root" && -d "$src_dir/$_cm_root" ]] && cm_src="$src_dir/$_cm_root"
41
+ fi
42
+
33
43
  ui_header "Version Locks"
34
44
 
35
45
  ui_section "mise toolchain"
36
- mise_config="$src_dir/dot_config/mise/config.toml"
46
+ mise_config="$cm_src/dot_config/mise/conf.d/00-dotfiles.toml"
37
47
  if [[ -f "$mise_config" ]]; then
38
48
  awk -F= '
39
49
  /^\[tools\]/ {in_tools=1; next}
@@ -13,12 +13,12 @@ REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
13
13
  # without the env-prefix dance that confuses shellcheck (SC2097/SC2098).
14
14
  export REPO_ROOT
15
15
 
16
- # shellcheck source=../dot/lib/ui.sh
17
- source "$SCRIPT_DIR/../dot/lib/ui.sh"
18
- # shellcheck source=../dot/lib/platform.sh
19
- source "$SCRIPT_DIR/../dot/lib/platform.sh"
20
- # shellcheck source=../dot/lib/utils.sh
21
- source "$SCRIPT_DIR/../dot/lib/utils.sh"
16
+ # shellcheck source=../../lib/dot/ui.sh
17
+ source "$SCRIPT_DIR/../../lib/dot/ui.sh"
18
+ # shellcheck source=../../lib/dot/platform.sh
19
+ source "$SCRIPT_DIR/../../lib/dot/platform.sh"
20
+ # shellcheck source=../../lib/dot/utils.sh
21
+ source "$SCRIPT_DIR/../../lib/dot/utils.sh"
22
22
 
23
23
  JSON_MODE=0
24
24
  WRITE_PATH=""
@@ -72,14 +72,14 @@ platform_id="$(dot_platform_id)"
72
72
  host_os="$(dot_host_os)"
73
73
  arch="$(uname -m)"
74
74
  hostname_value="$(hostname 2>/dev/null || true)"
75
- agent_profile_file="$REPO_ROOT/dot_config/dotfiles/agent-profiles.json"
76
- agent_card_file="$REPO_ROOT/dot_config/dotfiles/agent-card.json"
75
+ agent_profile_file="$REPO_ROOT/defaults/dot_config/dotfiles/agent-profiles.json"
76
+ agent_card_file="$REPO_ROOT/defaults/dot_config/dotfiles/agent-card.json"
77
77
  agent_state_file="${AGENT_STATE_FILE:-$HOME/.config/dotfiles/agent-mode.env}"
78
- policy_bundles_file="$REPO_ROOT/dot_config/dotfiles/policy-bundles.json"
79
- model_registry_file="$REPO_ROOT/dot_config/dotfiles/model-registry.json"
80
- prompt_registry_file="$REPO_ROOT/dot_config/dotfiles/prompt-registry.json"
81
- mcp_policy_file="$REPO_ROOT/dot_config/dotfiles/mcp-policy.json"
82
- mcp_registry_file="$REPO_ROOT/dot_config/dotfiles/mcp-registry.json"
78
+ policy_bundles_file="$REPO_ROOT/defaults/dot_config/dotfiles/policy-bundles.json"
79
+ model_registry_file="$REPO_ROOT/defaults/dot_config/dotfiles/model-registry.json"
80
+ prompt_registry_file="$REPO_ROOT/defaults/dot_config/dotfiles/prompt-registry.json"
81
+ mcp_policy_file="$REPO_ROOT/defaults/dot_config/dotfiles/mcp-policy.json"
82
+ mcp_registry_file="$REPO_ROOT/defaults/dot_config/dotfiles/mcp-registry.json"
83
83
  signing_format="$(git config --global gpg.format 2>/dev/null || echo ssh)"
84
84
  signing_key="$(git config --global user.signingkey 2>/dev/null || true)"
85
85
  allowed_signers="$(git config --global gpg.ssh.allowedSignersFile 2>/dev/null || echo "$HOME/.config/git/allowed_signers")"
@@ -94,7 +94,7 @@ if [[ -z "$current_profile" ]] && [[ -f "$agent_profile_file" ]]; then
94
94
  current_profile="$(jq -r '.defaultProfile // "ask"' "$agent_profile_file")"
95
95
  fi
96
96
 
97
- MCP_CONFIG="$REPO_ROOT/dot_config/claude/mcp_servers.json"
97
+ MCP_CONFIG="$REPO_ROOT/defaults/dot_config/claude/mcp_servers.json"
98
98
  export MCP_CONFIG
99
99
  mcp_summary="$(bash "$REPO_ROOT/scripts/diagnostics/mcp-doctor.sh" --strict --json)"
100
100
 
@@ -9,6 +9,14 @@ set -euo pipefail
9
9
  # These functions are sourced by meta.sh for dispatch.
10
10
 
11
11
  _agent_repo_root() {
12
+ # Post-Phase-4b: agent profile/card JSON ships under defaults/dot_config/.
13
+ # Prefer the chezmoi source dir so callers can append dot_config/... directly.
14
+ local dir
15
+ dir="$(resolve_chezmoi_source_dir)"
16
+ [[ -n "$dir" ]] && {
17
+ printf '%s\n' "$dir"
18
+ return
19
+ }
12
20
  require_source_dir
13
21
  }
14
22
 
@@ -25,8 +25,8 @@ set -euo pipefail
25
25
 
26
26
  # shellcheck disable=SC1091
27
27
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
28
- source "$SCRIPT_DIR/../lib/ui.sh"
29
- source "$SCRIPT_DIR/../lib/utils.sh"
28
+ source "$SCRIPT_DIR/../../../lib/dot/ui.sh"
29
+ source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
30
30
 
31
31
  _agents_repo_root() {
32
32
  # Resolve the chezmoi source dir (where CLAUDE.md/AGENTS.md live).
@@ -40,16 +40,26 @@ _agents_repo_root() {
40
40
  # we treat that as "not a match" and fall through to git, rather
41
41
  # than accepting the wrong candidate.
42
42
  local candidate=""
43
+ # Sanity probe: post-Phase-4b the data file lives at
44
+ # defaults/.chezmoidata.toml; older deployments kept it at the root.
45
+ _has_chezmoidata() {
46
+ [[ -f "$1/.chezmoidata.toml" || -f "$1/defaults/.chezmoidata.toml" ]]
47
+ }
43
48
  if command -v chezmoi >/dev/null 2>&1; then
44
49
  candidate="$(chezmoi source-path 2>/dev/null || true)"
45
- if [[ -n "$candidate" && ! -f "$candidate/.chezmoidata.toml" ]]; then
50
+ # chezmoi source-path returns defaults/ when .chezmoiroot is set;
51
+ # peel back one level so callers receive the actual repo root.
52
+ if [[ -n "$candidate" && -f "$candidate/.chezmoidata.toml" && "$(basename "$candidate")" == "defaults" ]]; then
53
+ candidate="$(dirname "$candidate")"
54
+ fi
55
+ if [[ -n "$candidate" ]] && ! _has_chezmoidata "$candidate"; then
46
56
  candidate=""
47
57
  fi
48
58
  fi
49
59
  if [[ -z "$candidate" ]]; then
50
60
  candidate="$(git -C "$PWD" rev-parse --show-toplevel 2>/dev/null || true)"
51
61
  fi
52
- if [[ -z "$candidate" ]] || [[ ! -f "$candidate/.chezmoidata.toml" ]]; then
62
+ if [[ -z "$candidate" ]] || ! _has_chezmoidata "$candidate"; then
53
63
  return 1
54
64
  fi
55
65
  printf '%s\n' "$candidate"
@@ -4,13 +4,13 @@
4
4
  ##
5
5
  ## Provides AI CLI status, setup, RAG query, and bridge commands.
6
6
  ## Wraps AI CLI tools with contextual patterns and system metadata.
7
- ## Usage: dot ai|ai-setup|ai-query|cl|copilot|gemini|kiro|sgpt|ollama|opencode|aider|autohand|vibe|qwen|zai
7
+ ## Usage: dot ai [delegate|cost|status]|ai-setup|ai-query|cl|copilot|gemini|kiro|sgpt|ollama|opencode|aider|autohand|vibe|qwen|zai
8
8
 
9
9
  set -euo pipefail
10
10
 
11
11
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
- # shellcheck source=../lib/utils.sh
13
- source "$SCRIPT_DIR/../lib/utils.sh"
12
+ # shellcheck source=../../../lib/dot/utils.sh
13
+ source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
14
14
 
15
15
  dot_ui_command_banner "AI and Agents" "${1:-}"
16
16
 
@@ -53,7 +53,8 @@ _ai_extract_version() {
53
53
  }
54
54
 
55
55
  _ai_refresh_status_cache() {
56
- local -n ai_entries=$1
56
+ # Entries passed by value (not a `local -n` nameref — bash 4.3+; macOS bash is 3.2).
57
+ local ai_entries=("$@")
57
58
  local tmp_file
58
59
  tmp_file="$(mktemp)"
59
60
  mkdir -p "$AI_CACHE_DIR"
@@ -82,16 +83,18 @@ _ai_refresh_status_cache() {
82
83
  indexed+=("$i|$entry")
83
84
  i=$((i + 1))
84
85
  done
86
+ # Probe is non-interactive: </dev/null is a clean EOF for tools that
87
+ # prompt for an API key on first run; `timeout 3` caps the wait.
85
88
  # shellcheck disable=SC2016
89
+ local _TO=""
90
+ command -v timeout >/dev/null 2>&1 && _TO="timeout 3 "
86
91
  local probe_script='
87
- payload="$1"
88
- out_dir="$2"
89
- i="${payload%%|*}"
90
- entry="${payload#*|}"
92
+ payload="$1"; out_dir="$2"; to="$3"
93
+ i="${payload%%|*}"; entry="${payload#*|}"
91
94
  IFS="|" read -r category role name bin desc <<<"$entry"
92
95
  if command -v "$bin" >/dev/null 2>&1; then
93
- output=$("$bin" --version 2>/dev/null | head -1) || true
94
- version=$(printf "%s" "$output" | sed "s/^[^0-9]*//" | sed "s/[[:space:]]*$//" | sed "s/\.$//")
96
+ output=$($to "$bin" --version </dev/null 2>/dev/null | head -1) || true
97
+ version=$(printf "%s" "$output" | sed "s/^[^0-9]*//;s/[[:space:]]*$//;s/\.$//")
95
98
  printf "%s\t1\t%s\n" "$bin" "$version" >"$out_dir/$i"
96
99
  else
97
100
  printf "%s\t0\t\n" "$bin" >"$out_dir/$i"
@@ -107,7 +110,7 @@ _ai_refresh_status_cache() {
107
110
  # agent") don't trigger xargs's "unterminated quote" parser.
108
111
  printf '%s\0' "${indexed[@]}" |
109
112
  xargs -0 -I{} -P"$jobs" \
110
- bash -c "$probe_script" _ {} "$probe_dir" \
113
+ bash -c "$probe_script" _ {} "$probe_dir" "$_TO" \
111
114
  2>/dev/null || true
112
115
 
113
116
  # Re-assemble in original entry order.
@@ -132,6 +135,12 @@ _ai_get_cached_status() {
132
135
  cat "$AI_STATUS_CACHE_FILE"
133
136
  }
134
137
 
138
+ # Look up field $2 (2=present 0/1, 3=version) for binary $1 from the
139
+ # cached TSV. Replaces a bash-4 associative array for macOS bash 3.2.
140
+ _ai_status_field() {
141
+ awk -F'\t' -v b="$1" -v f="$2" '$1==b{print $f;exit}' "$AI_STATUS_CACHE_FILE" 2>/dev/null
142
+ }
143
+
135
144
  # binary -> mise package mapping
136
145
  _ai_mise_pkg() {
137
146
  case "$1" in
@@ -175,17 +184,9 @@ cmd_ai_status() {
175
184
  )
176
185
 
177
186
  if ! _ai_cache_fresh "$AI_STATUS_CACHE_FILE"; then
178
- _ai_refresh_status_cache ai_clis
187
+ _ai_refresh_status_cache "${ai_clis[@]}"
179
188
  fi
180
189
 
181
- declare -A ai_present=()
182
- declare -A ai_version=()
183
- local cached_bin cached_present cached_version
184
- while IFS=$'\t' read -r cached_bin cached_present cached_version; do
185
- ai_present["$cached_bin"]="$cached_present"
186
- ai_version["$cached_bin"]="$cached_version"
187
- done < <(_ai_get_cached_status)
188
-
189
190
  local -a installed=()
190
191
  local -a missing=()
191
192
  local current_category=""
@@ -197,8 +198,9 @@ cmd_ai_status() {
197
198
  ui_section "$category"
198
199
  current_category="$category"
199
200
  fi
200
- if [[ "${ai_present[$bin]:-0}" == "1" ]]; then
201
- ver="${ai_version[$bin]:-installed}"
201
+ if [[ "$(_ai_status_field "$bin" 2)" == "1" ]]; then
202
+ ver="$(_ai_status_field "$bin" 3)"
203
+ [[ -z "$ver" ]] && ver="installed"
202
204
  [[ "$bin" == "claude" ]] && ver="${ver%% *}"
203
205
  ui_ok "$name" "$ver — $desc"
204
206
  installed+=("$name|$bin|$role")
@@ -312,6 +314,94 @@ cmd_ai_query() {
312
314
  run_script "dot_local/bin/executable_dot-ai" "AI RAG script" "$@"
313
315
  }
314
316
 
317
+ # Locate the vibe-delegate / delegate-report tools deployed by the
318
+ # /vibe Claude Code skill. Path stays in sync with
319
+ # defaults/dot_claude/skills/vibe/tools/.
320
+ _ai_delegate_tool() {
321
+ local tool="$1" # vibe-delegate | delegate-report
322
+ local path="${HOME}/.claude/skills/vibe/tools/${tool}"
323
+ if [[ ! -x "$path" ]]; then
324
+ # Errors to stderr so callers capturing stdout via $() get just the path.
325
+ ui_err "$tool" "not found at $path" >&2
326
+ ui_info "Hint" "Run 'chezmoi apply' to deploy the /vibe skill" >&2
327
+ return 1
328
+ fi
329
+ printf '%s\n' "$path"
330
+ }
331
+
332
+ cmd_ai_delegate() {
333
+ # Front-door to the same delegator the /vibe slash command uses.
334
+ # Usage: dot ai delegate "<prompt>" [max-turns] [agent] [timeout]
335
+ if [[ $# -lt 1 ]]; then
336
+ ui_err "Usage" "dot ai delegate \"<prompt>\" [max-turns] [agent] [timeout-secs]"
337
+ ui_info "Example" "dot ai delegate \"add a CHANGELOG entry for v0.2.504\""
338
+ return 1
339
+ fi
340
+ local prompt="$1"
341
+ shift
342
+ local max_turns="${1:-10}"
343
+ local agent="${2:-}"
344
+ local timeout="${3:-180}"
345
+ local tool
346
+ tool="$(_ai_delegate_tool vibe-delegate)" || return 1
347
+ if ! has_command vibe; then
348
+ ui_warn "vibe" "not installed"
349
+ ui_info "Install" "mise use -g pipx:mistral-vibe"
350
+ return 1
351
+ fi
352
+ "$tool" "$(pwd)" "$prompt" "$max_turns" "$agent" "$timeout"
353
+ }
354
+
355
+ cmd_ai_cost() {
356
+ # Unified AI spend report. Wraps delegate-report (vibe runs) and is
357
+ # the documented interface for users: path may move later.
358
+ local tool
359
+ tool="$(_ai_delegate_tool delegate-report)" || return 1
360
+ "$tool" "$@"
361
+ }
362
+
363
+ # Append a best-effort run entry to the unified AI log read by
364
+ # delegate-report. Token/cost fields are left blank when the provider
365
+ # CLI does not surface them — the report tolerates missing fields and
366
+ # groups by `model`. This gives users one place to see invocations
367
+ # across Claude, Gemini, Aider, Vibe, etc., not just Vibe.
368
+ _ai_log_run() {
369
+ local provider="$1" exit_code="$2" duration_secs="$3" prompt_words="$4"
370
+ local log_file="${HOME}/.local/share/delegate-runs.jsonl"
371
+ mkdir -p "$(dirname "$log_file")"
372
+ local project ts
373
+ project="$(basename "$PWD")"
374
+ ts="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
375
+ # python3 keeps the encoding boring; jq would also work but isn't
376
+ # guaranteed present everywhere this script runs.
377
+ python3 - "$log_file" "$provider" "$project" "$exit_code" "$duration_secs" "$prompt_words" "$ts" <<'PY'
378
+ import json, sys
379
+ log, provider, project, ec, dur, pw, ts = sys.argv[1:8]
380
+ entry = {
381
+ "ts": ts,
382
+ "delegate": provider,
383
+ "model": provider,
384
+ "project": project,
385
+ "exit_code": int(ec),
386
+ "duration_secs": float(dur),
387
+ "prompt_words": int(pw),
388
+ "tool_calls": 0,
389
+ "files_changed": 0,
390
+ "wrote_nothing": False,
391
+ "warn_count": 0,
392
+ "search_replace_fails": 0,
393
+ "syntax_errors": 0,
394
+ "tokens_in": 0,
395
+ "tokens_out": 0,
396
+ "tokens_total": 0,
397
+ "cost_usd": 0,
398
+ "cost_claude_eq": 0,
399
+ }
400
+ with open(log, "a") as fh:
401
+ fh.write(json.dumps(entry) + "\n")
402
+ PY
403
+ }
404
+
315
405
  run_ai_with_context() {
316
406
  local tool="$1"
317
407
  shift
@@ -405,61 +495,90 @@ ${prompt}"
405
495
 
406
496
  ui_info "Executing $tool with pattern: ${pattern_name:-none}"
407
497
 
498
+ # Wrap the provider invocation so we can log it to the unified AI run
499
+ # log. Each entry feeds `dot ai cost` so users see spend across every
500
+ # provider, not just vibe. Token-level fields are zero for providers
501
+ # that don't surface them — the report tolerates missing data.
502
+ local _ai_start_ts _ai_exit _ai_end_ts _ai_dur _ai_prompt_words
503
+ _ai_start_ts=$(date +%s)
504
+ _ai_prompt_words=$(printf '%s' "$prompt" | wc -w | tr -d ' ')
505
+ _ai_exit=0
408
506
  case "$tool" in
409
507
  cl | claude)
410
- printf "%s" "$full_prompt" | claude
508
+ printf "%s" "$full_prompt" | claude || _ai_exit=$?
411
509
  ;;
412
510
  codex)
413
- printf "%s" "$full_prompt" | codex
511
+ printf "%s" "$full_prompt" | codex || _ai_exit=$?
414
512
  ;;
415
513
  copilot)
416
- copilot -sp "$full_prompt"
514
+ copilot -sp "$full_prompt" || _ai_exit=$?
417
515
  ;;
418
516
  gemini)
419
- printf "%s" "$full_prompt" | gemini chat
517
+ printf "%s" "$full_prompt" | gemini chat || _ai_exit=$?
420
518
  ;;
421
519
  goose)
422
- printf "%s" "$full_prompt" | goose session start
520
+ printf "%s" "$full_prompt" | goose session start || _ai_exit=$?
423
521
  ;;
424
522
  kiro | kiro-cli)
425
- printf "%s" "$full_prompt" | kiro-cli chat
523
+ printf "%s" "$full_prompt" | kiro-cli chat || _ai_exit=$?
426
524
  ;;
427
525
  sgpt)
428
- printf "%s" "$full_prompt" | sgpt --chat shell-gpt
526
+ printf "%s" "$full_prompt" | sgpt --chat shell-gpt || _ai_exit=$?
429
527
  ;;
430
528
  ollama)
431
- printf "%s" "$full_prompt" | ollama run llama3.2
529
+ printf "%s" "$full_prompt" | ollama run llama3.2 || _ai_exit=$?
432
530
  ;;
433
531
  opencode)
434
- printf "%s" "$full_prompt" | opencode query
532
+ printf "%s" "$full_prompt" | opencode query || _ai_exit=$?
435
533
  ;;
436
534
  aider)
437
- printf "%s" "$full_prompt" | aider --msg "-"
535
+ printf "%s" "$full_prompt" | aider --msg "-" || _ai_exit=$?
438
536
  ;;
439
537
  autohand)
440
- printf "%s" "$full_prompt" | autohand chat
538
+ printf "%s" "$full_prompt" | autohand chat || _ai_exit=$?
441
539
  ;;
442
540
  vibe)
443
- printf "%s" "$full_prompt" | vibe chat
541
+ printf "%s" "$full_prompt" | vibe chat || _ai_exit=$?
444
542
  ;;
445
543
  qwen)
446
- printf "%s" "$full_prompt" | qwen chat
544
+ printf "%s" "$full_prompt" | qwen chat || _ai_exit=$?
447
545
  ;;
448
546
  zai)
449
- printf "%s" "$full_prompt" | zai chat
547
+ printf "%s" "$full_prompt" | zai chat || _ai_exit=$?
450
548
  ;;
451
549
  *)
452
550
  ui_err "Unsupported tool" "$tool"
453
551
  exit 1
454
552
  ;;
455
553
  esac
554
+ _ai_end_ts=$(date +%s)
555
+ _ai_dur=$((_ai_end_ts - _ai_start_ts))
556
+ _ai_log_run "$tool_bin" "$_ai_exit" "$_ai_dur" "$_ai_prompt_words" 2>/dev/null || true
557
+ return "$_ai_exit"
456
558
  }
457
559
 
458
560
  # Dispatch
459
561
  case "${1:-}" in
460
562
  ai)
461
563
  shift
462
- cmd_ai_status "$@"
564
+ # Subcommands first: `dot ai delegate`, `dot ai cost`. Fall through
565
+ # to status if no subcommand or unknown one.
566
+ case "${1:-}" in
567
+ delegate)
568
+ shift
569
+ cmd_ai_delegate "$@"
570
+ ;;
571
+ cost)
572
+ shift
573
+ cmd_ai_cost "$@"
574
+ ;;
575
+ "" | status)
576
+ cmd_ai_status "$@"
577
+ ;;
578
+ *)
579
+ cmd_ai_status "$@"
580
+ ;;
581
+ esac
463
582
  ;;
464
583
  ai-setup)
465
584
  shift
@@ -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 "Appearance" "${1:-}"
13
13
 
@@ -26,8 +26,8 @@
26
26
  set -euo pipefail
27
27
 
28
28
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
29
- # shellcheck source=../lib/utils.sh
30
- source "$SCRIPT_DIR/../lib/utils.sh"
29
+ # shellcheck source=../../../lib/dot/utils.sh
30
+ source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
31
31
 
32
32
  if [[ "${1:-}" != "cd" ]]; then
33
33
  dot_ui_command_banner "Core" "${1:-}"
@@ -7,8 +7,8 @@
7
7
  set -euo pipefail
8
8
 
9
9
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
- # shellcheck source=../lib/utils.sh
11
- source "$SCRIPT_DIR/../lib/utils.sh"
10
+ # shellcheck source=../../../lib/dot/utils.sh
11
+ source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
12
12
 
13
13
  dot_ui_command_banner "Diagnostics" "${1:-}" "$@"
14
14
 
@@ -29,7 +29,7 @@ cmd_smoke_test() {
29
29
  }
30
30
 
31
31
  cmd_intelligence() {
32
- run_script "scripts/dot/lib/bento.sh" "Intelligence Surface" "$@"
32
+ run_script "lib/dot/bento.sh" "Intelligence Surface" "$@"
33
33
  }
34
34
 
35
35
  cmd_heal() {
@@ -120,9 +120,9 @@ cmd_metrics() {
120
120
  echo "Dotfiles source not found." >&2
121
121
  exit 1
122
122
  fi
123
- # shellcheck source=../lib/log.sh
123
+ # shellcheck source=../../../lib/dot/log.sh
124
124
  # shellcheck disable=SC1091
125
- source "$src_dir/scripts/dot/lib/log.sh"
125
+ source "$src_dir/lib/dot/log.sh"
126
126
  ui_header "Recent Metrics"
127
127
  echo ""
128
128
  dot_metrics_summary "${1:-20}"