@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,185 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- # shellcheck shell=bash
5
- #
6
- # scripts/dot/commands/init.sh
7
- #
8
- # `dot init <github-user>` — bootstrap a foreign dotfiles repo through
9
- # this framework's harness. The §3 audit roadmap calls for an analogue
10
- # to `chezmoi init <user>` that turns this tool from "one person's
11
- # config" into a runtime for any dotfiles user.
12
- #
13
- # Behavior:
14
- # dot init alice # clones github.com/alice/dotfiles via chezmoi,
15
- # # applies through the dot harness
16
- # dot init https://... # explicit URL
17
- # dot init alice --dry-run # preview without writing
18
- # dot init alice --no-apply # clone only; don't run chezmoi apply
19
- #
20
- # Safety:
21
- # - Refuses to clobber an existing chezmoi source dir without --force.
22
- # - Disclaims that the target's scripts will run with the user's
23
- # privileges and prints the source URL for inspection.
24
- # - Verifies the source URL is HTTPS (no plain git://) so MITM is harder.
25
-
26
- set -euo pipefail
27
-
28
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
29
- # shellcheck source=../../../lib/dot/ui.sh disable=SC1091
30
- source "$SCRIPT_DIR/../../../lib/dot/ui.sh"
31
- # shellcheck source=../../../lib/dot/utils.sh disable=SC1091
32
- source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
33
-
34
- _init_resolve_url() {
35
- local arg="$1"
36
- case "$arg" in
37
- http://*)
38
- printf "dot init: refusing plain HTTP (use HTTPS or git+ssh)\n" >&2
39
- return 2
40
- ;;
41
- https://* | git@*:*)
42
- # Trust full URLs as-is — these are the user's explicit intent.
43
- printf "%s\n" "$arg"
44
- ;;
45
- */*)
46
- # owner/repo shorthand: validate before constructing the URL so
47
- # a crafted argument can't smuggle shell metacharacters into
48
- # downstream tooling (chezmoi init, git clone).
49
- if [[ ! "$arg" =~ ^[A-Za-z0-9._-]+/[A-Za-z0-9._-]+$ ]]; then
50
- printf "dot init: invalid owner/repo (only [A-Za-z0-9._-]+/[A-Za-z0-9._-]+ allowed): %s\n" "$arg" >&2
51
- return 2
52
- fi
53
- printf "https://github.com/%s.git\n" "$arg"
54
- ;;
55
- *)
56
- # Bare user shorthand: same character whitelist as the path
57
- # segment of a GitHub URL.
58
- if [[ ! "$arg" =~ ^[A-Za-z0-9._-]+$ ]]; then
59
- printf "dot init: invalid user (only [A-Za-z0-9._-] allowed): %s\n" "$arg" >&2
60
- return 2
61
- fi
62
- printf "https://github.com/%s/dotfiles.git\n" "$arg"
63
- ;;
64
- esac
65
- }
66
-
67
- cmd_init() {
68
- local user_arg="" dry_run=0 apply=1 force=0
69
- while [[ $# -gt 0 ]]; do
70
- case "$1" in
71
- --dry-run | -n)
72
- dry_run=1
73
- shift
74
- ;;
75
- --no-apply)
76
- apply=0
77
- shift
78
- ;;
79
- --force | -f)
80
- force=1
81
- shift
82
- ;;
83
- --help | -h)
84
- cat <<EOF
85
- Usage: dot init <github-user|owner/repo|url> [--dry-run] [--no-apply] [--force]
86
-
87
- Bootstrap a foreign dotfiles repo through chezmoi + the dot harness.
88
-
89
- Examples:
90
- dot init alice # github.com/alice/dotfiles
91
- dot init alice/configs # github.com/alice/configs
92
- dot init https://example.com/repo.git
93
- dot init alice --dry-run # preview only
94
- dot init alice --no-apply # clone but don't apply
95
-
96
- Flags:
97
- --dry-run, -n Show resolved URL + target dir without cloning.
98
- --no-apply Clone the source but skip 'chezmoi apply'.
99
- --force, -f Overwrite an existing chezmoi source dir.
100
- EOF
101
- return 0
102
- ;;
103
- --)
104
- shift
105
- break
106
- ;;
107
- -*)
108
- ui_err "Unknown flag" "$1"
109
- return 1
110
- ;;
111
- *)
112
- if [[ -n "$user_arg" ]]; then
113
- ui_err "Too many arguments" "$1"
114
- return 1
115
- fi
116
- user_arg="$1"
117
- shift
118
- ;;
119
- esac
120
- done
121
-
122
- [[ -n "$user_arg" ]] || {
123
- ui_err "init" "missing <user|repo|url>"
124
- return 1
125
- }
126
-
127
- local url
128
- url="$(_init_resolve_url "$user_arg")" || return $?
129
-
130
- if ! command -v chezmoi >/dev/null 2>&1; then
131
- ui_err "chezmoi" "not installed — run install.sh first"
132
- return 127
133
- fi
134
-
135
- local source_dir
136
- source_dir="${CHEZMOI_SOURCE_DIR:-$(chezmoi source-path 2>/dev/null || echo "$HOME/.local/share/chezmoi")}"
137
-
138
- ui_header "Bootstrap dotfiles from $user_arg"
139
- ui_info "Source URL" "$url"
140
- ui_info "Target dir" "$source_dir"
141
- local _apply_label="no"
142
- [[ "$apply" -eq 1 ]] && _apply_label="yes"
143
- ui_info "Apply after?" "$_apply_label"
144
-
145
- if [[ "$dry_run" -eq 1 ]]; then
146
- ui_ok "Dry-run" "no changes made"
147
- return 0
148
- fi
149
-
150
- if [[ -e "$source_dir" ]] && [[ "$force" -ne 1 ]]; then
151
- ui_err "Refusing" "$source_dir already exists; pass --force to overwrite"
152
- return 1
153
- fi
154
-
155
- ui_warn "Trust" "The target repo's scripts will run with your user privileges."
156
- ui_warn "Trust" "Inspect $url before proceeding if you don't know the author."
157
- if [[ -t 0 ]] && [[ "${DOTFILES_NONINTERACTIVE:-0}" != "1" ]]; then
158
- read -r -p " Continue? [y/N] " resp
159
- case "$resp" in
160
- [yY] | [yY][eE][sS]) ;;
161
- *)
162
- ui_info "Init" "aborted by user"
163
- return 1
164
- ;;
165
- esac
166
- fi
167
-
168
- local chezmoi_args=(init --source "$source_dir")
169
- [[ "$apply" -eq 1 ]] && chezmoi_args+=(--apply)
170
- chezmoi_args+=("$url")
171
-
172
- ui_info "chezmoi" "${chezmoi_args[*]}"
173
- if chezmoi "${chezmoi_args[@]}"; then
174
- ui_ok "Init" "complete"
175
- if [[ "$apply" -eq 1 ]]; then
176
- ui_info "Hint" "run 'dot doctor' to validate the new environment"
177
- else
178
- ui_info "Hint" "run 'chezmoi diff' then 'chezmoi apply' when ready"
179
- fi
180
- else
181
- local rc=$?
182
- ui_err "Init" "chezmoi exited $rc"
183
- return "$rc"
184
- fi
185
- }
@@ -1,208 +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 - Lint Command
5
- # Wraps shellcheck and shfmt with project-specific flags
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
- dot_ui_command_banner "Lint" "${1:-}"
14
-
15
- # ── Configuration ────────────────────────────────────────────────────────────
16
- # Flags from CLAUDE.md conventions:
17
- # SC flags: --severity=error -e SC1091 -e SC2030 -e SC2031
18
- # shfmt: -i 2 -ci
19
- SHELLCHECK_ARGS=(--severity=error -e SC1091 -e SC2030 -e SC2031)
20
- SHFMT_ARGS=(-i 2 -ci)
21
-
22
- # True only if the file's shebang names a shell that both shellcheck and shfmt
23
- # can process. The old `grep -qiE 'shell|bash|sh'` matched loosely — "sh" hit
24
- # "fish", and `file` output pulled in python3 scripts — so non-shell files
25
- # landed in the lint set and produced spurious SC1071 / shfmt parse "errors".
26
- _lint_is_shell() {
27
- local first interp
28
- first="$(head -1 "$1" 2>/dev/null)"
29
- case "$first" in '#!'*) ;; *) return 1 ;; esac
30
- interp="${first#\#!}"
31
- interp="${interp#"${interp%%[![:space:]]*}"}" # ltrim
32
- case "$interp" in
33
- */env[[:space:]]*)
34
- interp="${interp#*/env}"
35
- interp="${interp#"${interp%%[![:space:]]*}"}"
36
- interp="${interp%%[[:space:]]*}"
37
- ;;
38
- *)
39
- interp="${interp%%[[:space:]]*}"
40
- interp="${interp##*/}"
41
- ;;
42
- esac
43
- case "$interp" in
44
- sh | bash | dash | ksh | mksh | ash) return 0 ;;
45
- *) return 1 ;;
46
- esac
47
- }
48
-
49
- cmd_lint() {
50
- local mode="${1:-all}"
51
- local src_dir
52
- src_dir="$(require_source_dir)"
53
-
54
- # Collect target files
55
- local -a files=()
56
- while IFS= read -r -d '' f; do
57
- files+=("$f")
58
- done < <(find "$src_dir/scripts" -name '*.sh' -type f -print0 2>/dev/null)
59
-
60
- # install.sh
61
- if [[ -f "$src_dir/install.sh" ]]; then
62
- files+=("$src_dir/install.sh")
63
- fi
64
-
65
- # Post-Phase-4b chezmoi-tracked content lives under defaults/.
66
- local chezmoi_src
67
- chezmoi_src="$(resolve_chezmoi_source_dir)"
68
- [[ -z "$chezmoi_src" ]] && chezmoi_src="$src_dir"
69
-
70
- # dot_local/bin/executable_* scripts — shell scripts only (skip python/zsh/etc
71
- # by inspecting the shebang, so shellcheck/shfmt never see files they can't parse).
72
- while IFS= read -r -d '' f; do
73
- if _lint_is_shell "$f"; then
74
- files+=("$f")
75
- fi
76
- done < <(find "$chezmoi_src/dot_local/bin" -name 'executable_*' -type f -print0 2>/dev/null)
77
-
78
- # .chezmoitemplates/*.sh (non-.tmpl shell scripts)
79
- while IFS= read -r -d '' f; do
80
- files+=("$f")
81
- done < <(find "$chezmoi_src/.chezmoitemplates" -name '*.sh' -type f -print0 2>/dev/null)
82
-
83
- local total=${#files[@]}
84
- if [[ "$total" -eq 0 ]]; then
85
- ui_warn "No files" "No shell scripts found to lint"
86
- return 0
87
- fi
88
-
89
- local sc_errors=0
90
- local fmt_errors=0
91
-
92
- case "$mode" in
93
- all | check)
94
- # ── ShellCheck ──────────────────────────────────────────────────────
95
- if has_command shellcheck; then
96
- ui_section "ShellCheck"
97
- echo ""
98
- # One shellcheck invocation over all files (was one fork per file).
99
- # gcc format is one line per issue, so failing files = unique paths.
100
- local sc_out
101
- sc_out="$(shellcheck -f gcc "${SHELLCHECK_ARGS[@]}" "${files[@]}" 2>/dev/null || true)"
102
- if [[ -z "$sc_out" ]]; then
103
- ui_ok "shellcheck" "$total files clean"
104
- else
105
- printf '%s\n' "$sc_out"
106
- sc_errors=$(printf '%s\n' "$sc_out" | cut -d: -f1 | sort -u | grep -c .)
107
- ui_err "shellcheck" "$sc_errors file(s) with errors"
108
- fi
109
- echo ""
110
- else
111
- ui_warn "shellcheck" "not installed, skipping"
112
- echo ""
113
- fi
114
-
115
- # ── shfmt ───────────────────────────────────────────────────────────
116
- if has_command shfmt; then
117
- ui_section "shfmt"
118
- echo ""
119
- # `shfmt -l` lists files needing formatting in one invocation
120
- # (was `shfmt -d` per file).
121
- local fmt_list
122
- fmt_list="$(shfmt "${SHFMT_ARGS[@]}" -l "${files[@]}" 2>/dev/null || true)"
123
- if [[ -z "$fmt_list" ]]; then
124
- ui_ok "shfmt" "$total files formatted correctly"
125
- else
126
- fmt_errors=$(printf '%s\n' "$fmt_list" | grep -c .)
127
- ui_err "shfmt" "$fmt_errors file(s) need formatting"
128
- fi
129
- echo ""
130
- else
131
- ui_warn "shfmt" "not installed, skipping"
132
- echo ""
133
- fi
134
- ;;
135
-
136
- fix)
137
- # ── Auto-fix with shfmt ─────────────────────────────────────────────
138
- if ! has_command shfmt; then
139
- ui_err "shfmt" "not installed — cannot auto-fix"
140
- exit 1
141
- fi
142
- ui_section "Auto-fixing with shfmt"
143
- echo ""
144
- # Find files needing formatting in one `shfmt -l` pass, then only
145
- # rewrite that (usually small) set — was `shfmt -d` per file.
146
- local fmt_list fixed=0
147
- fmt_list="$(shfmt "${SHFMT_ARGS[@]}" -l "${files[@]}" 2>/dev/null || true)"
148
- if [[ -z "$fmt_list" ]]; then
149
- ui_ok "shfmt" "All files already formatted"
150
- else
151
- while IFS= read -r f; do
152
- [[ -n "$f" ]] || continue
153
- shfmt "${SHFMT_ARGS[@]}" -w "$f"
154
- ui_ok "fixed" "${f#"$src_dir/"}"
155
- fixed=$((fixed + 1))
156
- done <<<"$fmt_list"
157
- ui_ok "shfmt" "$fixed file(s) reformatted"
158
- fi
159
- echo ""
160
- ;;
161
-
162
- *)
163
- ui_err "Unknown lint mode: $mode"
164
- echo "Usage: dot lint [--fix|-f | --check|-c]"
165
- exit 1
166
- ;;
167
- esac
168
-
169
- # ── Summary ───────────────────────────────────────────────────────────────
170
- ui_section "Summary"
171
- echo ""
172
- ui_info "Files scanned" "$total"
173
- if [[ "$sc_errors" -gt 0 ]]; then
174
- ui_err "ShellCheck errors" "$sc_errors"
175
- fi
176
- if [[ "$fmt_errors" -gt 0 ]]; then
177
- ui_err "Formatting issues" "$fmt_errors"
178
- fi
179
- if [[ "$sc_errors" -eq 0 ]] && [[ "$fmt_errors" -eq 0 ]]; then
180
- ui_ok "Result" "All checks passed"
181
- fi
182
- echo ""
183
-
184
- # Exit 1 in check mode if any errors
185
- if [[ "$mode" == "check" ]] && [[ $((sc_errors + fmt_errors)) -gt 0 ]]; then
186
- exit 1
187
- fi
188
- }
189
-
190
- # ── Dispatch ─────────────────────────────────────────────────────────────────
191
- case "${1:-}" in
192
- lint)
193
- shift
194
- case "${1:---}" in
195
- --fix | -f) cmd_lint "fix" ;;
196
- --check | -c) cmd_lint "check" ;;
197
- *) cmd_lint "all" ;;
198
- esac
199
- ;;
200
- *)
201
- # Direct invocation (dot lint)
202
- case "${1:---}" in
203
- --fix | -f) cmd_lint "fix" ;;
204
- --check | -c) cmd_lint "check" ;;
205
- *) cmd_lint "all" ;;
206
- esac
207
- ;;
208
- esac
@@ -1,169 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: Apache-2.0 OR MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- # dot manual — open or download the dotfiles manual in multiple formats.
5
- #
6
- # Usage:
7
- # dot manual # open HTML manual in browser
8
- # dot manual html # alias of no-arg
9
- # dot manual pdf # download + open PDF
10
- # dot manual epub # download + open EPUB
11
- # dot manual text # pipe ASCII text to pager
12
- # dot manual markdown # pipe Markdown source to pager
13
- # dot manual download <fmt> # save to current directory
14
- # dot manual --offline # use bundled offline copy
15
- # dot manual --local # use locally-built _build/manual/
16
-
17
- set -euo pipefail
18
-
19
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
20
- # shellcheck source=../../../lib/dot/utils.sh
21
- source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
22
-
23
- MANUAL_URL="${DOTFILES_MANUAL_URL:-https://sebastienrousseau.github.io/dotfiles/manual}"
24
- CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/dotfiles/manual"
25
- OFFLINE_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/dotfiles/manual"
26
-
27
- MODE="open"
28
- FORMAT="html"
29
- USE_LOCAL=false
30
- USE_OFFLINE=false
31
-
32
- for arg in "$@"; do
33
- case "$arg" in
34
- html | html-multi | pdf | epub | text | markdown) FORMAT="$arg" ;;
35
- download) MODE="download" ;;
36
- --offline) USE_OFFLINE=true ;;
37
- --local) USE_LOCAL=true ;;
38
- --url=*) MANUAL_URL="${arg#*=}" ;;
39
- --help | -h)
40
- sed -n 's/^# //p;s/^#$//p' "$0" | head -20
41
- exit 0
42
- ;;
43
- esac
44
- done
45
-
46
- format_file() {
47
- case "$1" in
48
- html) echo "dotfiles.html" ;;
49
- html-multi) echo "html/index.html" ;;
50
- pdf) echo "dotfiles.pdf" ;;
51
- epub) echo "dotfiles.epub" ;;
52
- text) echo "dotfiles.txt" ;;
53
- markdown) echo "dotfiles-md.tar.gz" ;;
54
- *) return 1 ;;
55
- esac
56
- }
57
-
58
- resolve_source() {
59
- local fmt="$1"
60
- local fname
61
- fname="$(format_file "$fmt")"
62
-
63
- if $USE_LOCAL; then
64
- local src_dir
65
- src_dir="$(require_source_dir)/_build/manual"
66
- if [[ -f "$src_dir/$fname" ]]; then
67
- echo "$src_dir/$fname"
68
- return 0
69
- fi
70
- ui_err "manual" "local build not found at $src_dir/$fname — run bash tools/docs/build-manual.sh" >&2
71
- return 1
72
- fi
73
-
74
- if $USE_OFFLINE; then
75
- if [[ -f "$OFFLINE_DIR/$fname" ]]; then
76
- echo "$OFFLINE_DIR/$fname"
77
- return 0
78
- fi
79
- ui_err "manual" "offline copy not found at $OFFLINE_DIR/$fname" >&2
80
- return 1
81
- fi
82
-
83
- local cache_path="$CACHE_DIR/$fname"
84
- if [[ ! -f "$cache_path" ]] || [[ $(find "$cache_path" -mtime +7 -print 2>/dev/null | wc -l) -gt 0 ]]; then
85
- mkdir -p "$(dirname "$cache_path")"
86
- local url="$MANUAL_URL/$fname"
87
- ui_info "manual" "fetching $url" >&2
88
- if ! curl -fsSL "$url" -o "$cache_path"; then
89
- ui_err "manual" "failed to download $url" >&2
90
- return 1
91
- fi
92
- fi
93
- echo "$cache_path"
94
- }
95
-
96
- open_file() {
97
- local path="$1"
98
- case "$(uname -s)" in
99
- Darwin)
100
- # Use the system open explicitly — ~/.local/bin/open is a wrapper
101
- # that would recurse on itself.
102
- /usr/bin/open "$path"
103
- ;;
104
- Linux)
105
- if command -v xdg-open &>/dev/null; then
106
- xdg-open "$path"
107
- elif command -v gio &>/dev/null; then
108
- gio open "$path"
109
- else
110
- ui_err "manual" "no opener found (xdg-open, gio); use file://$path"
111
- return 1
112
- fi
113
- ;;
114
- *)
115
- ui_info "manual" "saved to: $path"
116
- ;;
117
- esac
118
- }
119
-
120
- cmd_open() {
121
- local path
122
- path="$(resolve_source "$FORMAT")"
123
- [[ -z "$path" ]] && exit 1
124
-
125
- case "$FORMAT" in
126
- text)
127
- ${PAGER:-less} "$path"
128
- ;;
129
- markdown)
130
- local tmpdir
131
- tmpdir="$(mktemp -d)"
132
- tar -xzf "$path" -C "$tmpdir"
133
- ui_info "manual" "Markdown source extracted to: $tmpdir"
134
- open_file "$tmpdir" 2>/dev/null || true
135
- ;;
136
- html)
137
- if ! $USE_LOCAL && ! $USE_OFFLINE; then
138
- open_file "$MANUAL_URL/"
139
- else
140
- open_file "$path"
141
- fi
142
- ;;
143
- html-multi)
144
- if ! $USE_LOCAL && ! $USE_OFFLINE; then
145
- open_file "$MANUAL_URL/html/"
146
- else
147
- open_file "$path"
148
- fi
149
- ;;
150
- *)
151
- open_file "$path"
152
- ;;
153
- esac
154
- }
155
-
156
- cmd_download() {
157
- local path
158
- path="$(resolve_source "$FORMAT")"
159
- [[ -z "$path" ]] && exit 1
160
- local dest
161
- dest="./$(basename "$path")"
162
- cp "$path" "$dest"
163
- ui_ok "manual" "saved: $dest"
164
- }
165
-
166
- case "$MODE" in
167
- open) cmd_open ;;
168
- download) cmd_download ;;
169
- esac