@sebastienrousseau/dotfiles 0.2.520 → 0.2.521

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 (323) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/LICENSE-APACHE +190 -0
  3. package/LICENSE-MIT +21 -0
  4. package/README.md +43 -37
  5. package/install.sh +76 -10
  6. package/package.json +7 -7
  7. package/tools/README.md +49 -0
  8. package/tools/ci/install-chezmoi-verified.sh +68 -0
  9. package/docs/.vitepress/reports/localization-readability-audit.md +0 -73
  10. package/docs/AI.md +0 -179
  11. package/docs/ARCHITECTURE.md +0 -117
  12. package/docs/CNAME +0 -1
  13. package/docs/CONFIG_STRATEGY.md +0 -124
  14. package/docs/COPYRIGHT +0 -7
  15. package/docs/ECOSYSTEM.md +0 -220
  16. package/docs/GOLD-STANDARD-AUDIT.md +0 -352
  17. package/docs/GOVERNANCE.md +0 -98
  18. package/docs/MAINTAINERS.md +0 -41
  19. package/docs/MINIMUM-TOOLCHAIN.md +0 -100
  20. package/docs/NAMING_CONVENTIONS.md +0 -102
  21. package/docs/OPENCODE.md +0 -127
  22. package/docs/README.md +0 -84
  23. package/docs/STRUCTURE.md +0 -102
  24. package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -118
  25. package/docs/adr/ADR-002-shell-performance.md +0 -130
  26. package/docs/adr/ADR-003-security-first.md +0 -158
  27. package/docs/adr/ADR-004-cli-architecture.md +0 -171
  28. package/docs/adr/ADR-005-chezmoi-choice.md +0 -99
  29. package/docs/adr/ADR-006-shell-selection.md +0 -124
  30. package/docs/adr/ADR-007-multi-shell-parity.md +0 -62
  31. package/docs/adr/ADR-008-alias-system-architecture.md +0 -95
  32. package/docs/adr/ADR-009-wallpaper-driven-theming.md +0 -131
  33. package/docs/adr/ADR-010-starship-transient-prompt.md +0 -144
  34. package/docs/adr/ADR-011-nushell-tier3-keep.md +0 -144
  35. package/docs/adr/ADR-012-ai-fleet-local-proxy.md +0 -79
  36. package/docs/adr/README.md +0 -40
  37. package/docs/architecture/AI_COST_OPTIMIZATION.md +0 -144
  38. package/docs/architecture/ARCHITECTURE.md +0 -20
  39. package/docs/architecture/INTEROP.md +0 -44
  40. package/docs/architecture/REPO_LAYOUT.md +0 -241
  41. package/docs/architecture/WALKTHROUGH.md +0 -86
  42. package/docs/architecture/fleet-deployment.md +0 -77
  43. package/docs/archive/EUXIS_2026_REVIEW.md +0 -127
  44. package/docs/archive/LEGACY_ROADMAP.md +0 -6
  45. package/docs/archive/MILESTONE_v0.2.493.md +0 -47
  46. package/docs/archive/PLAN.md +0 -199
  47. package/docs/archive/REPO_AUDIT.md +0 -31
  48. package/docs/articles/.pages +0 -6
  49. package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +0 -216
  50. package/docs/articles/2026-07-05-fish-startup-abbr.md +0 -153
  51. package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +0 -128
  52. package/docs/articles/index.md +0 -36
  53. package/docs/guides/INSTALL.md +0 -144
  54. package/docs/guides/MACOS_ICLOUD_SYMLINKS.md +0 -121
  55. package/docs/guides/NEOVIM_IDE_GUIDE.md +0 -61
  56. package/docs/guides/THEMING.md +0 -230
  57. package/docs/guides/TROUBLESHOOTING.md +0 -176
  58. package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +0 -792
  59. package/docs/index.md +0 -132
  60. package/docs/interop/A2A.md +0 -39
  61. package/docs/interop/POWERSHELL.md +0 -102
  62. package/docs/manual/00-introduction.md +0 -89
  63. package/docs/manual/01-concepts/01-architecture.md +0 -138
  64. package/docs/manual/01-concepts/02-trust-model.md +0 -183
  65. package/docs/manual/01-concepts/03-theme-engine.md +0 -186
  66. package/docs/manual/01-concepts/04-fleet.md +0 -148
  67. package/docs/manual/01-concepts/05-self-healing.md +0 -204
  68. package/docs/manual/02-tutorials/01-first-install.md +0 -197
  69. package/docs/manual/02-tutorials/02-add-wallpaper.md +0 -216
  70. package/docs/manual/02-tutorials/03-create-profile.md +0 -244
  71. package/docs/manual/02-tutorials/04-encrypt-secret.md +0 -281
  72. package/docs/manual/02-tutorials/05-deploy-fleet.md +0 -283
  73. package/docs/manual/03-reference/01-dot-cli.md +0 -475
  74. package/docs/manual/03-reference/02-config-files.md +0 -265
  75. package/docs/manual/03-reference/03-environment.md +0 -124
  76. package/docs/manual/03-reference/04-templates.md +0 -190
  77. package/docs/manual/03-reference/05-feature-flags.md +0 -187
  78. package/docs/manual/04-cookbook/01-recipes.md +0 -285
  79. package/docs/manual/04-cookbook/02-troubleshooting.md +0 -351
  80. package/docs/manual/04-cookbook/03-faq.md +0 -175
  81. package/docs/manual/05-appendices/A-platform-matrix.md +0 -101
  82. package/docs/manual/05-appendices/B-security-checklist.md +0 -85
  83. package/docs/manual/05-appendices/C-glossary.md +0 -40
  84. package/docs/manual/05-appendices/D-bibliography.md +0 -58
  85. package/docs/manual/05-appendices/E-license.md +0 -38
  86. package/docs/manual/_toc.yml +0 -58
  87. package/docs/manual/command-index.md +0 -175
  88. package/docs/manual/concept-index.md +0 -170
  89. package/docs/manual/index.md +0 -66
  90. package/docs/migration/README.md +0 -81
  91. package/docs/migration/from-bare-git-repo.md +0 -156
  92. package/docs/migration/from-gnu-stow.md +0 -165
  93. package/docs/migration/from-plain-chezmoi.md +0 -148
  94. package/docs/migration/from-yadm.md +0 -187
  95. package/docs/operations/ARCHITECTURE_ROADMAP.md +0 -7
  96. package/docs/operations/ATTESTATION.md +0 -44
  97. package/docs/operations/CI_CADENCE.md +0 -107
  98. package/docs/operations/CI_COMPOSITES.md +0 -156
  99. package/docs/operations/COMPLETIONS.md +0 -123
  100. package/docs/operations/COVERAGE.md +0 -204
  101. package/docs/operations/DRIFT.md +0 -107
  102. package/docs/operations/HARD_AUDIT_2026.md +0 -631
  103. package/docs/operations/MAINTENANCE.md +0 -63
  104. package/docs/operations/MANIFEST.md +0 -127
  105. package/docs/operations/MIGRATION.md +0 -109
  106. package/docs/operations/OPERATIONS.md +0 -188
  107. package/docs/operations/PERFORMANCE.md +0 -133
  108. package/docs/operations/PERFORMANCE_BUDGETS.md +0 -196
  109. package/docs/operations/REGISTRY.md +0 -90
  110. package/docs/operations/RELEASE_PIPELINE.md +0 -128
  111. package/docs/operations/RELIABILITY.md +0 -122
  112. package/docs/operations/RFC_v0_2_503_reorganization.md +0 -280
  113. package/docs/operations/ROADMAP.md +0 -10
  114. package/docs/operations/ROADMAP_2026.md +0 -7
  115. package/docs/operations/ROADMAP_V0_2_503.md +0 -10
  116. package/docs/operations/TESTING.md +0 -216
  117. package/docs/operations/TRACEABILITY.md +0 -44
  118. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
  119. package/docs/operations/VERSION_SYNC.md +0 -393
  120. package/docs/packaging.md +0 -222
  121. package/docs/reference/ALIASES.md +0 -131
  122. package/docs/reference/ALIASES_CHEATSHEET.md +0 -32
  123. package/docs/reference/ALIASES_DEPRECATIONS.md +0 -13
  124. package/docs/reference/FEATURE-MATRIX.md +0 -646
  125. package/docs/reference/FEATURES.md +0 -66
  126. package/docs/reference/FONTS.md +0 -112
  127. package/docs/reference/POWERSHELL_PARITY.md +0 -82
  128. package/docs/reference/PROFILES.md +0 -69
  129. package/docs/reference/SCREENSHOTS.md +0 -121
  130. package/docs/reference/SCRIPTS.md +0 -71
  131. package/docs/reference/SUPPORT_MATRIX.md +0 -80
  132. package/docs/reference/THEMES.md +0 -117
  133. package/docs/reference/TOOLS.md +0 -110
  134. package/docs/reference/UTILS.md +0 -243
  135. package/docs/registry.json +0 -6
  136. package/docs/schema/dot-env-v1.json +0 -110
  137. package/docs/schema/dot-registry-v1.json +0 -33
  138. package/docs/security/AI_ACT_COMPLIANCE.md +0 -94
  139. package/docs/security/AUDIT_BYPASS.md +0 -103
  140. package/docs/security/AUTOMATION_SECRETS.md +0 -26
  141. package/docs/security/CI_EGRESS_ALLOWLIST.md +0 -127
  142. package/docs/security/CI_PINNING.md +0 -129
  143. package/docs/security/COMMIT_SIGNING.md +0 -138
  144. package/docs/security/COMPLIANCE.md +0 -458
  145. package/docs/security/DEPS_DEV_EXCEPTIONS.md +0 -86
  146. package/docs/security/DISCLOSURE.md +0 -130
  147. package/docs/security/ENCRYPTION.md +0 -57
  148. package/docs/security/FMEA.md +0 -159
  149. package/docs/security/FUZZING.md +0 -209
  150. package/docs/security/HISTORY_FILTERING.md +0 -132
  151. package/docs/security/INCIDENT_RESPONSE.md +0 -579
  152. package/docs/security/INSTALL_VERIFICATION.md +0 -122
  153. package/docs/security/KEYS.md +0 -49
  154. package/docs/security/KEY_ROTATION.md +0 -303
  155. package/docs/security/MCP_POLICY.md +0 -78
  156. package/docs/security/POLICY_RELEASES.md +0 -37
  157. package/docs/security/README.md +0 -28
  158. package/docs/security/SCORECARD.md +0 -195
  159. package/docs/security/SECRETS.md +0 -158
  160. package/docs/security/SECURITY.md +0 -45
  161. package/docs/security/SECURITY_CHECKLIST.md +0 -55
  162. package/docs/security/SHELL_EXEMPTIONS.md +0 -145
  163. package/docs/security/SOUP_REGISTER.md +0 -36
  164. package/docs/security/THREAT_MODEL.md +0 -130
  165. package/docs/security/VERIFICATION_VALIDATION.md +0 -228
  166. package/docs/security/VERIFY_RELEASE.md +0 -201
  167. package/docs/security/security-pubkey.asc +0 -15
  168. package/docs/stylesheets/extra.css +0 -444
  169. package/docs/themes/README.md +0 -10
  170. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +0 -30
  171. package/docs/themes/hero-shot.svg +0 -78
  172. package/scripts/README.md +0 -123
  173. package/scripts/ci/check-copyright-headers.sh +0 -8
  174. package/scripts/ci/check-shell-preamble.sh +0 -8
  175. package/scripts/ci/guard-gitleaks-checkout.sh +0 -8
  176. package/scripts/demo/record.sh +0 -43
  177. package/scripts/diagnostics/a2a-conformance.sh +0 -163
  178. package/scripts/diagnostics/alias-governance.sh +0 -165
  179. package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
  180. package/scripts/diagnostics/aliases-manifest.sh +0 -77
  181. package/scripts/diagnostics/attest-verify.sh +0 -147
  182. package/scripts/diagnostics/benchmark.sh +0 -408
  183. package/scripts/diagnostics/conflicts.sh +0 -73
  184. package/scripts/diagnostics/doctor-unified.sh +0 -43
  185. package/scripts/diagnostics/doctor.sh +0 -797
  186. package/scripts/diagnostics/drift-dashboard.sh +0 -203
  187. package/scripts/diagnostics/health.sh +0 -656
  188. package/scripts/diagnostics/history-analysis.sh +0 -86
  189. package/scripts/diagnostics/mcp-doctor.sh +0 -582
  190. package/scripts/diagnostics/perf.sh +0 -453
  191. package/scripts/diagnostics/scorecard.sh +0 -120
  192. package/scripts/diagnostics/secret-governance.sh +0 -65
  193. package/scripts/diagnostics/security-score.sh +0 -467
  194. package/scripts/diagnostics/smoke-test.sh +0 -88
  195. package/scripts/diagnostics/snapshot.sh +0 -90
  196. package/scripts/diagnostics/verify.sh +0 -108
  197. package/scripts/diagnostics/verify_state.sh +0 -73
  198. package/scripts/diagnostics/version-locks.sh +0 -94
  199. package/scripts/diagnostics/workstation-attestation.sh +0 -212
  200. package/scripts/dot/commands/agent.sh +0 -535
  201. package/scripts/dot/commands/agents.sh +0 -352
  202. package/scripts/dot/commands/ai.sh +0 -600
  203. package/scripts/dot/commands/aliases.sh +0 -277
  204. package/scripts/dot/commands/appearance.sh +0 -110
  205. package/scripts/dot/commands/completion.sh +0 -171
  206. package/scripts/dot/commands/core.sh +0 -217
  207. package/scripts/dot/commands/diagnostics.sh +0 -265
  208. package/scripts/dot/commands/env-emit.sh +0 -203
  209. package/scripts/dot/commands/fleet.sh +0 -711
  210. package/scripts/dot/commands/init.sh +0 -185
  211. package/scripts/dot/commands/lint.sh +0 -208
  212. package/scripts/dot/commands/manual.sh +0 -169
  213. package/scripts/dot/commands/meta.sh +0 -438
  214. package/scripts/dot/commands/patterns.sh +0 -55
  215. package/scripts/dot/commands/registry.sh +0 -455
  216. package/scripts/dot/commands/restore.sh +0 -232
  217. package/scripts/dot/commands/secrets.sh +0 -296
  218. package/scripts/dot/commands/security.sh +0 -102
  219. package/scripts/dot/commands/tools.sh +0 -570
  220. package/scripts/dot/data/alias-deprecations.tsv +0 -2
  221. package/scripts/dot/powershell/Dot.psm1 +0 -319
  222. package/scripts/fonts/install-nerd-fonts.sh +0 -75
  223. package/scripts/fonts/patch-fonts.sh +0 -36
  224. package/scripts/git-hooks/install.sh +0 -12
  225. package/scripts/git-hooks/pre-commit +0 -12
  226. package/scripts/git-hooks/pre-commit-audit.sh +0 -146
  227. package/scripts/git-hooks/pre-push +0 -105
  228. package/scripts/git-hooks/prepare-commit-msg +0 -29
  229. package/scripts/lib/secrets_provider.sh +0 -200
  230. package/scripts/nvim/headless-upgrade.lua +0 -81
  231. package/scripts/ops/ai-setup.sh +0 -71
  232. package/scripts/ops/bundle.sh +0 -104
  233. package/scripts/ops/chaos.sh +0 -50
  234. package/scripts/ops/chezmoi-apply.sh +0 -333
  235. package/scripts/ops/chezmoi-diff.sh +0 -16
  236. package/scripts/ops/chezmoi-remove.sh +0 -46
  237. package/scripts/ops/chezmoi-update.sh +0 -67
  238. package/scripts/ops/heal-chezmoi.sh +0 -87
  239. package/scripts/ops/heal-system.sh +0 -129
  240. package/scripts/ops/heal-tools.sh +0 -297
  241. package/scripts/ops/heal.sh +0 -223
  242. package/scripts/ops/post-apply-repair.sh +0 -107
  243. package/scripts/ops/prewarm.sh +0 -128
  244. package/scripts/ops/release.sh +0 -262
  245. package/scripts/ops/rollback.sh +0 -613
  246. package/scripts/ops/setup.sh +0 -138
  247. package/scripts/ops/teleport.sh +0 -34
  248. package/scripts/qa/check-feature-matrix.sh +0 -296
  249. package/scripts/qa/check-version-consistency.sh +0 -12
  250. package/scripts/qa/coverage-baseline.sh +0 -61
  251. package/scripts/qa/docs-coverage.sh +0 -118
  252. package/scripts/qa/examples-coverage.sh +0 -94
  253. package/scripts/qa/powershell-contract.ps1 +0 -95
  254. package/scripts/qa/reliability-audit.sh +0 -139
  255. package/scripts/qa/scorecard-snapshot.sh +0 -128
  256. package/scripts/qa/traceability-coverage.sh +0 -124
  257. package/scripts/qa/validate-examples.sh +0 -90
  258. package/scripts/qa/wsl-contract.sh +0 -12
  259. package/scripts/secrets/age-init.sh +0 -82
  260. package/scripts/secrets/create-secrets-file.sh +0 -46
  261. package/scripts/secrets/encrypt-ssh-key.sh +0 -44
  262. package/scripts/security/backup.sh +0 -58
  263. package/scripts/security/check-disclosure-key-expiry.sh +0 -111
  264. package/scripts/security/dns-doh.sh +0 -52
  265. package/scripts/security/encryption-check.sh +0 -55
  266. package/scripts/security/enforce-policies.sh +0 -552
  267. package/scripts/security/firewall.sh +0 -91
  268. package/scripts/security/lock-configs.sh +0 -67
  269. package/scripts/security/lock-screen.sh +0 -56
  270. package/scripts/security/manage-secrets.sh +0 -429
  271. package/scripts/security/ssh-cert.sh +0 -204
  272. package/scripts/security/telemetry-kill.sh +0 -51
  273. package/scripts/security/usb-safety.sh +0 -52
  274. package/scripts/theme/apply-gnome-theme.sh +0 -333
  275. package/scripts/theme/extract-heic-frames.sh +0 -115
  276. package/scripts/theme/extract-theme.py +0 -1020
  277. package/scripts/theme/install-boot-logo.sh +0 -63
  278. package/scripts/theme/install-catppuccin-themes.sh +0 -371
  279. package/scripts/theme/install-cursors.sh +0 -26
  280. package/scripts/theme/install-file-icons.sh +0 -27
  281. package/scripts/theme/install-grub-theme.sh +0 -62
  282. package/scripts/theme/install-lock-icon.sh +0 -31
  283. package/scripts/theme/merge-wallpaper.sh +0 -146
  284. package/scripts/theme/rebuild-themes.sh +0 -603
  285. package/scripts/theme/switch.sh +0 -476
  286. package/scripts/theme/wallpaper-rotate.sh +0 -137
  287. package/scripts/theme/wallpaper-sync.sh +0 -690
  288. package/scripts/tools/cmatrix.sh +0 -22
  289. package/scripts/tools/detect-collisions.py +0 -103
  290. package/scripts/tools/emoji-picker.sh +0 -49
  291. package/scripts/tools/figlet-banner.sh +0 -19
  292. package/scripts/tools/log-rotate.sh +0 -31
  293. package/scripts/tools/lolcat-wrap.sh +0 -20
  294. package/scripts/tools/pipes.sh +0 -49
  295. package/scripts/tuning/linux.sh +0 -186
  296. package/scripts/tuning/macos.sh +0 -56
  297. package/scripts/uninstall.sh +0 -86
  298. package/scripts/verify-release-versions +0 -156
  299. package/scripts/version-sync.sh +0 -714
  300. package/templates/chezmoi-data/geekom-a9.toml.example +0 -21
  301. package/templates/chezmoi-data/mac-m1.toml.example +0 -16
  302. package/templates/chezmoi-data/mac-t2-linux.toml.example +0 -21
  303. package/templates/chezmoi-data/surface-pro-7p.toml.example +0 -21
  304. package/templates/projects/go/.github/workflows/ci.yml +0 -31
  305. package/templates/projects/go/README.md +0 -7
  306. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +0 -8
  307. package/templates/projects/go/go.mod +0 -3
  308. package/templates/projects/go/go.sum +0 -0
  309. package/templates/projects/molecule/README.md +0 -7
  310. package/templates/projects/molecule/converge.yml +0 -7
  311. package/templates/projects/molecule/molecule.yml +0 -16
  312. package/templates/projects/node/.github/workflows/ci.yml +0 -30
  313. package/templates/projects/node/README.md +0 -7
  314. package/templates/projects/node/package-lock.json +0 -12
  315. package/templates/projects/node/package.json +0 -10
  316. package/templates/projects/node/src/index.js +0 -3
  317. package/templates/projects/packer/README.md +0 -15
  318. package/templates/projects/packer/main.pkr.hcl +0 -15
  319. package/templates/projects/python/.github/workflows/ci.yml +0 -34
  320. package/templates/projects/python/README.md +0 -7
  321. package/templates/projects/python/pyproject.toml +0 -25
  322. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +0 -2
  323. package/templates/projects/python/tests/test_basic.py +0 -3
@@ -1,438 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- # Dotfiles CLI - Meta Commands
5
- # upgrade, prewarm, docs, learn, keys, sandbox, mcp, mode, agent
6
-
7
- set -euo pipefail
8
-
9
- _META_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
- # shellcheck source=../../../lib/dot/utils.sh
11
- source "$_META_DIR/../../../lib/dot/utils.sh"
12
- # shellcheck source=../../../lib/dot/log.sh
13
- source "$_META_DIR/../../../lib/dot/log.sh"
14
- # shellcheck source=agent.sh
15
- source "$_META_DIR/agent.sh"
16
-
17
- meta_banner_section() {
18
- case "${1:-}" in
19
- mcp | mode | agent)
20
- printf '%s\n' "AI and Agents"
21
- ;;
22
- docs | keys | learn | search | help | version)
23
- printf '%s\n' "Reference"
24
- ;;
25
- *)
26
- printf '%s\n' "Meta"
27
- ;;
28
- esac
29
- }
30
-
31
- # `mcp serve` owns stdout from its first byte — it is a JSON-RPC frame stream,
32
- # not a terminal — so the banner is suppressed for it outright. (It already
33
- # self-suppresses off a TTY; this also covers a client that allocates a pty.)
34
- if [[ "${1:-}" != "mcp" || "${2:-}" != "serve" ]]; then
35
- dot_ui_command_banner "$(meta_banner_section "${1:-}")" "${1:-}" "$@"
36
- fi
37
-
38
- # Last meaningful line of a captured log, used as a step's `ok` detail.
39
- # Collapses carriage-return progress (git/nvim spam \r), strips ANSI,
40
- # takes the last non-empty line, and clips it so the rendered step stays
41
- # on one line.
42
- _upgrade_last_line() {
43
- tr '\r' '\n' <"$1" 2>/dev/null |
44
- sed -E 's/\x1b\[[0-9;?]*[a-zA-Z]//g' |
45
- awk 'NF{last=$0} END{print last}' |
46
- cut -c1-56
47
- }
48
-
49
- cmd_upgrade() {
50
- local src_dir
51
- src_dir="$(require_source_dir)"
52
-
53
- # Per-step logs. Each phase's stdout+stderr is captured here rather
54
- # than streamed to the terminal: the git/nvim/chezmoi output is noisy
55
- # (carriage-return progress bars, remote counters) and, in rich mode,
56
- # writing it to the terminal corrupts the dot-ui renderer that owns
57
- # the screen. Failing steps get their tail dumped after the run.
58
- local log_dir
59
- log_dir="$(mktemp -d "${TMPDIR:-/tmp}/dot-upgrade.XXXXXX")"
60
- local fail_labels=() fail_logs=()
61
-
62
- # _upgrade_step <id> <label> <running-detail> -- cmd [args...]
63
- # Renders one tracked step: spinner while it runs, then ok (with the
64
- # log's last line) or fail. Never aborts the run — a failed phase is
65
- # recorded and surfaced at the end, matching the previous `|| true`
66
- # behaviour but without the raw flood.
67
- _upgrade_step() {
68
- local id="$1" label="$2" running="$3"
69
- shift 3
70
- [[ "${1:-}" == "--" ]] && shift
71
- local log="$log_dir/$id.log" rc=0
72
- ui_step "$id" "$label" run "$running"
73
- # stdin is closed on purpose. Output is captured to a log, so a phase
74
- # that prompts (chezmoi's "X has changed since chezmoi last wrote it?",
75
- # a git credential helper, nvim waiting on a keypress) would otherwise
76
- # block on the terminal with its question invisible — the 2026-09-12
77
- # "chezmoi update seems very slow" report. With no stdin the prompt
78
- # fails fast, the step is marked failed, and the tail below says why.
79
- "$@" >"$log" 2>&1 </dev/null || rc=$?
80
- if [[ "$rc" -eq 0 ]]; then
81
- ui_step "$id" "" ok "$(_upgrade_last_line "$log")"
82
- else
83
- ui_step "$id" "" fail "exited $rc"
84
- fail_labels+=("$label")
85
- fail_logs+=("$log")
86
- fi
87
- return 0
88
- }
89
-
90
- ui_steps_begin "Upgrade" ""
91
-
92
- if [ -f "$src_dir/nix/flake.nix" ] && has_command nix; then
93
- _upgrade_step nix-flake "Nix flake" "updating…" -- \
94
- sh -c 'cd "$1" && nix flake update' _ "$src_dir"
95
- _upgrade_step nix-gc "Nix GC" "collecting…" -- nix-collect-garbage -d
96
- fi
97
-
98
- # --no-tty: chezmoi otherwise opens /dev/tty directly for its
99
- # overwrite prompt, bypassing the closed stdin above and hanging.
100
- _upgrade_step dotfiles "Dotfiles" "chezmoi update…" -- chezmoi update --no-tty
101
-
102
- if has_command nvim; then
103
- # scripts/nvim/headless-upgrade.lua runs Lazy sync AND waits for
104
- # Mason's async install queue to drain, so ensure_installed installs
105
- # (codelldb, debugpy, delve, etc.) aren't aborted by an early quitall.
106
- #
107
- # `nvim -l` does NOT load the user's init.lua, so without an explicit
108
- # -u the script found no lazy.nvim and logged "skipping plugin update"
109
- # on every run — the upgrade step was a silent no-op. Point -u at the
110
- # config nvim would load itself (honouring XDG_CONFIG_HOME and
111
- # NVIM_APPNAME) and skip visibly when there is none to load.
112
- local nvim_init="${XDG_CONFIG_HOME:-$HOME/.config}/${NVIM_APPNAME:-nvim}/init.lua"
113
- if [ -f "$nvim_init" ]; then
114
- _upgrade_step nvim "Neovim plugins" "Lazy sync + Mason drain…" -- \
115
- nvim --headless -u "$nvim_init" -l "$src_dir/scripts/nvim/headless-upgrade.lua"
116
- else
117
- ui_step nvim "Neovim plugins" skip "no init.lua at $nvim_init"
118
- fi
119
- fi
120
-
121
- if [ "${DOTFILES_FONTS:-}" = "1" ] &&
122
- [ -f "$src_dir/scripts/fonts/install-nerd-fonts.sh" ]; then
123
- _upgrade_step fonts "Nerd Fonts" "installing…" -- \
124
- sh "$src_dir/scripts/fonts/install-nerd-fonts.sh"
125
- fi
126
-
127
- local n=${#fail_labels[@]}
128
- if [[ "$n" -eq 0 ]]; then
129
- ui_steps_end "toolchains, plugins, and dotfiles up to date"
130
- rm -rf "$log_dir"
131
- else
132
- ui_steps_end "$n step(s) failed"
133
- # Surfaced after ui_steps_end so the rich renderer has torn down —
134
- # printing mid-render would garble the display.
135
- local i=0
136
- while ((i < n)); do
137
- ui_err "${fail_labels[$i]}" "log tail:"
138
- tail -n 15 "${fail_logs[$i]}" | sed 's/^/ /'
139
- if grep -q 'has changed since chezmoi last wrote it' "${fail_logs[$i]}"; then
140
- ui_info "Hint" "a managed file was edited locally — run 'chezmoi apply' to choose per file, or 'chezmoi update --force' to overwrite"
141
- fi
142
- ((i++)) || true
143
- done
144
- ui_info "Logs" "$log_dir"
145
- fi
146
- }
147
-
148
- cmd_prewarm() {
149
- local src_dir
150
- # Clear caches first
151
- ui_info "Cache" "Clearing shell initialization caches"
152
- local cache_dir="${XDG_CACHE_HOME:-$HOME/.cache}"
153
- # `find ... -delete` instead of `rm -rf $glob` so an unmatched literal
154
- # pattern can't accidentally remove a real same-named directory, and
155
- # so we don't pass `-r` on what should always be files.
156
- [[ -d "$cache_dir/zsh" ]] && find "$cache_dir/zsh" -maxdepth 1 -type f \( -name '*-init.zsh' -o -name '*.zwc' \) -delete 2>/dev/null
157
- [[ -d "$cache_dir/bash" ]] && find "$cache_dir/bash" -maxdepth 1 -type f -name '*-init.bash' -delete 2>/dev/null
158
- [[ -d "$cache_dir/fish" ]] && find "$cache_dir/fish" -maxdepth 1 -type f -name '*-init.fish' -delete 2>/dev/null
159
- [[ -d "$cache_dir/nushell" ]] && find "$cache_dir/nushell" -maxdepth 1 -type f -name '*.nu' -delete 2>/dev/null
160
- ui_info "Cache" "Cleared. Regenerating..."
161
- src_dir="$(resolve_source_dir)"
162
- if [ -n "$src_dir" ] && [ -f "$src_dir/scripts/ops/prewarm.sh" ]; then
163
- bash "$src_dir/scripts/ops/prewarm.sh"
164
- fi
165
- }
166
-
167
- cmd_docs() {
168
- local src_dir
169
- src_dir="$(resolve_source_dir)"
170
-
171
- if [ -n "$src_dir" ] && [ -f "$src_dir/README.md" ]; then
172
- if has_command glow; then
173
- glow "$src_dir/README.md"
174
- else
175
- exec cat "$src_dir/README.md"
176
- fi
177
- else
178
- die "README not found."
179
- fi
180
- }
181
-
182
- cmd_learn() {
183
- local dot_bin
184
- # Post-Phase-4b: dot_local/ lives under defaults/. Legacy layout
185
- # (older deployments before .chezmoiroot activation) kept it at
186
- # repo root — probe both.
187
- dot_bin="$(dirname "${BASH_SOURCE[0]}")/../../../defaults/dot_local/bin"
188
- [[ -f "$dot_bin/executable_tour" ]] ||
189
- dot_bin="$(dirname "${BASH_SOURCE[0]}")/../../../dot_local/bin"
190
- if [ -f "$dot_bin/executable_tour" ]; then
191
- exec bash "$dot_bin/executable_tour" "$@"
192
- fi
193
- # Fallback to ops script
194
- run_script "scripts/ops/tour.sh" "Tour script" "$@"
195
- }
196
-
197
- cmd_keys() {
198
- local src_dir
199
- src_dir="$(resolve_source_dir)"
200
-
201
- if [[ "${1:-}" == "sign-check" ]]; then
202
- ui_header "Git Signing Status"
203
- local signing_key="" format="" key_file=""
204
- signing_key="$(git config --global user.signingkey 2>/dev/null || true)"
205
- format="$(git config --global gpg.format 2>/dev/null || true)"
206
- if [[ -z "$signing_key" ]]; then
207
- ui_warn "No signing key configured (git config --global user.signingkey)"
208
- else
209
- ui_info "Key" "$signing_key"
210
- ui_info "Format" "${format:-gpg}"
211
- if [[ "$format" == "ssh" ]]; then
212
- key_file="${signing_key/#\~/$HOME}"
213
- if [[ -f "$key_file" ]]; then
214
- ui_info "Status" "SSH key file exists: $key_file"
215
- else
216
- ui_warn "SSH key file not found: $key_file"
217
- fi
218
- else
219
- if has_command gpg && gpg --list-keys "$signing_key" >/dev/null 2>&1; then
220
- ui_info "Status" "GPG key found in keyring"
221
- else
222
- ui_warn "GPG key not found in keyring: $signing_key"
223
- fi
224
- fi
225
- fi
226
- return 0
227
- fi
228
-
229
- # The keybindings document lives at docs/security/KEYS.md. Probing only
230
- # docs/KEYS.md meant every `dot keys` fell through to
231
- # scripts/diagnostics/keys.sh, which is not in the tree either, so the
232
- # command could only ever report "Keys script not found". The legacy path
233
- # stays in the list for trees that predate the move.
234
- local keys_doc=""
235
- if [ -n "$src_dir" ]; then
236
- local candidate
237
- for candidate in docs/security/KEYS.md docs/KEYS.md; do
238
- if [ -f "$src_dir/$candidate" ]; then
239
- keys_doc="$src_dir/$candidate"
240
- break
241
- fi
242
- done
243
- fi
244
-
245
- if [ -n "$keys_doc" ]; then
246
- if [ -n "${1:-}" ]; then
247
- # ripgrep is not installed everywhere (the CI runners have none), and
248
- # a bare `rg` there printed nothing at all while exiting 0.
249
- if has_command rg; then
250
- rg -i --fixed-strings --context 1 "${1:-}" "$keys_doc" || true
251
- else
252
- grep -i -F -C 1 -- "${1:-}" "$keys_doc" || true
253
- fi
254
- else
255
- exec cat "$keys_doc"
256
- fi
257
- else
258
- run_script "scripts/diagnostics/keys.sh" "Keys script" "$@"
259
- fi
260
- }
261
-
262
- cmd_sandbox() {
263
- local src_dir
264
- src_dir="$(require_source_dir)"
265
-
266
- if has_command docker; then
267
- ui_info "Launching sandbox via Docker"
268
- docker build -f "$src_dir/tests/Dockerfile.sandbox" -t dotfiles-sandbox "$src_dir"
269
- exec docker run --rm -it dotfiles-sandbox
270
- elif has_command podman; then
271
- ui_info "Launching sandbox via Podman"
272
- podman build -f "$src_dir/tests/Dockerfile.sandbox" -t dotfiles-sandbox "$src_dir"
273
- exec podman run --rm -it dotfiles-sandbox
274
- else
275
- die "Docker or Podman is required for sandbox."
276
- fi
277
- }
278
-
279
- cmd_mcp() {
280
- local subcommand="${1:-doctor}"
281
- if [[ "${1:-}" == --* ]] || [[ "${1:-}" == -* ]] || [[ -z "${1:-}" ]]; then
282
- subcommand="doctor"
283
- else
284
- shift || true
285
- fi
286
- case "$subcommand" in
287
- doctor)
288
- if [[ "${1:-}" == "doctor" ]]; then
289
- shift || true
290
- fi
291
- run_script "scripts/diagnostics/mcp-doctor.sh" "MCP doctor script" "$@"
292
- ;;
293
- registry)
294
- local repo_root registry_file json_mode=0
295
- repo_root="$(resolve_chezmoi_source_dir)"
296
- [[ -z "$repo_root" ]] && repo_root="$(require_source_dir)"
297
- registry_file="${MCP_REGISTRY_CONFIG:-$repo_root/dot_config/dotfiles/mcp-registry.json}"
298
- if [[ "${1:-}" == "registry" ]]; then
299
- shift || true
300
- fi
301
- if [[ "${1:-}" == "--json" || "${1:-}" == "-j" ]]; then
302
- json_mode=1
303
- fi
304
- if [[ ! -f "$registry_file" ]]; then
305
- die "MCP registry not found: $registry_file"
306
- fi
307
- if [[ "$json_mode" -eq 1 ]]; then
308
- exec cat "$registry_file"
309
- fi
310
- if command -v jq >/dev/null 2>&1; then
311
- ui_header "MCP Registry"
312
- jq -r '
313
- .servers
314
- | to_entries[]
315
- | "\(.key)\t\(.value.transport)\t\(.value.launcher)\t\(.value.package // .value.url // "local")"
316
- ' "$registry_file" | while IFS=$'\t' read -r name transport launcher target; do
317
- ui_ok "$name" "$transport via $launcher -> $target"
318
- done
319
- else
320
- exec cat "$registry_file"
321
- fi
322
- ;;
323
- serve)
324
- cmd_mcp_serve "$@"
325
- ;;
326
- *)
327
- echo "Usage: dot mcp [doctor|registry|serve]" >&2
328
- exit 1
329
- ;;
330
- esac
331
- }
332
-
333
- # cmd_mcp_serve — exec the stdio MCP server (dot-mcp).
334
- #
335
- # This is the transport `.well-known/mcp/server-card.json` advertises:
336
- # JSON-RPC 2.0 over newline-delimited frames on stdin/stdout. Nothing this
337
- # function prints may reach stdout, because stdout is the protocol stream from
338
- # the moment the client launches us — every message below goes to stderr, and
339
- # the server is exec'd so it owns the descriptors outright.
340
- #
341
- # The binary is deployed by run_onchange_26-build-dot-mcp.sh. When it is not
342
- # built yet and a Go toolchain is available, it is built on demand into the
343
- # user cache rather than failing: a client that trusted the card must get a
344
- # server, not an error.
345
- cmd_mcp_serve() {
346
- local repo_root="" source_dir bin src cache
347
- # resolve_chezmoi_source_dir points at the chezmoi source (the `defaults/`
348
- # directory); the server wants the repository above it. Fall back to the
349
- # checkout root when chezmoi is not configured.
350
- source_dir="$(resolve_chezmoi_source_dir 2>/dev/null || true)"
351
- if [[ -n "$source_dir" && -d "$source_dir" ]]; then
352
- repo_root="$(cd "$source_dir/.." && pwd)"
353
- fi
354
- [[ -n "$repo_root" ]] || repo_root="$(require_source_dir)"
355
-
356
- # Tell the server which tree it is serving, and which CLI to shell out to,
357
- # so it never has to guess either.
358
- export DOT_MCP_REPO_ROOT="$repo_root"
359
- export DOT_MCP_DOT_BIN="${DOT_MCP_DOT_BIN:-$(command -v dot || echo dot)}"
360
-
361
- if bin="$(command -v dot-mcp 2>/dev/null)"; then
362
- exec "$bin" serve "$@"
363
- fi
364
- if [[ -x "$HOME/.local/bin/dot-mcp" ]]; then
365
- exec "$HOME/.local/bin/dot-mcp" serve "$@"
366
- fi
367
-
368
- src="$repo_root/defaults/dot_local/share/dot-mcp"
369
- [[ -d "$src" ]] || src="$HOME/.local/share/dot-mcp"
370
- if [[ -f "$src/main.go" ]] && has_command go; then
371
- cache="${XDG_CACHE_HOME:-$HOME/.cache}/dotfiles"
372
- mkdir -p "$cache"
373
- echo "dot mcp serve: building dot-mcp (first run)…" >&2
374
- if (cd "$src" && go build -o "$cache/dot-mcp" .) >&2; then
375
- exec "$cache/dot-mcp" serve "$@"
376
- fi
377
- fi
378
-
379
- echo "dot mcp serve: dot-mcp is not built. Run 'chezmoi apply' (or 'go build' in $src) to install it." >&2
380
- exit 1
381
- }
382
-
383
- # Dispatch — cmd_mode is defined in agent.sh (sourced above)
384
- case "${1:-}" in
385
- upgrade)
386
- shift
387
- cmd_upgrade "$@"
388
- ;;
389
- cache-refresh | prewarm)
390
- shift
391
- cmd_prewarm "$@"
392
- ;;
393
- docs)
394
- shift
395
- cmd_docs "$@"
396
- ;;
397
- learn)
398
- shift
399
- cmd_learn "$@"
400
- ;;
401
- keys)
402
- shift
403
- cmd_keys "$@"
404
- ;;
405
- sandbox)
406
- shift
407
- cmd_sandbox "$@"
408
- ;;
409
- mcp)
410
- shift
411
- cmd_mcp "$@"
412
- ;;
413
- mode | agent)
414
- shift
415
- cmd_mode "$@"
416
- ;;
417
- --help | -h | help)
418
- cat <<'EOF'
419
- Usage: meta.sh <command> [args...]
420
-
421
- Commands:
422
- cache-refresh, prewarm, docs, learn, keys, sandbox, mcp, mode, agent
423
- EOF
424
- ;;
425
- "")
426
- cat <<'EOF'
427
- Usage: meta.sh <command> [args...]
428
-
429
- Commands:
430
- cache-refresh, prewarm, docs, learn, keys, sandbox, mcp, mode, agent
431
- EOF
432
- exit 1
433
- ;;
434
- *)
435
- echo "Unknown meta command: ${1:-}" >&2
436
- exit 1
437
- ;;
438
- esac
@@ -1,55 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- # AI Steering Patterns Management.
5
- # Usage: dot patterns [list|view|edit] [name]
6
-
7
- set -euo pipefail
8
-
9
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
- # shellcheck source=../../../lib/dot/utils.sh
11
- source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
12
-
13
- PATTERN_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/ai/patterns"
14
- mkdir -p "$PATTERN_DIR"
15
-
16
- command="${1:-list}"
17
- name="${2:-}"
18
-
19
- case "$command" in
20
- list)
21
- ui_header "AI Steering Patterns"
22
- ls -1 "$PATTERN_DIR" | sed 's/\.md$//' | while read -r p; do
23
- ui_bullet "$p"
24
- done
25
- ;;
26
- view)
27
- if [[ -z "$name" ]]; then
28
- ui_err "Missing pattern name" "Usage: dot patterns view <name>"
29
- exit 1
30
- fi
31
- pattern_file="$PATTERN_DIR/${name}.md"
32
- if [[ -f "$pattern_file" ]]; then
33
- ui_header "Pattern: $name"
34
- if has_command glow; then
35
- glow "$pattern_file"
36
- else
37
- cat "$pattern_file"
38
- fi
39
- else
40
- ui_err "Pattern not found" "$name"
41
- fi
42
- ;;
43
- edit)
44
- if [[ -z "$name" ]]; then
45
- ui_err "Missing pattern name" "Usage: dot patterns edit <name>"
46
- exit 1
47
- fi
48
- pattern_file="$PATTERN_DIR/${name}.md"
49
- ${EDITOR:-nvim} "$pattern_file"
50
- ;;
51
- *)
52
- echo "Usage: dot patterns [list|view|edit] [name]"
53
- exit 1
54
- ;;
55
- esac