@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,570 +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 - Tools Commands
5
- # tools, new, packages, log-rotate, aliases, alias-check, env, profile
6
-
7
- set -euo pipefail
8
-
9
- _TOOLS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
- # shellcheck source=../../../lib/dot/utils.sh
11
- source "$_TOOLS_DIR/../../../lib/dot/utils.sh"
12
- # shellcheck source=aliases.sh
13
- source "$_TOOLS_DIR/aliases.sh"
14
-
15
- # Cross-platform sed in-place (BSD vs GNU)
16
- sed_in_place() {
17
- if sed --version >/dev/null 2>&1; then
18
- sed -i "$@" # GNU
19
- else
20
- sed -i '' "$@" # BSD (macOS)
21
- fi
22
- }
23
-
24
- dot_ui_command_banner "Tools" "${1:-}"
25
-
26
- ensure_line_in_file() {
27
- local file="$1"
28
- local line="$2"
29
- if ! grep -Fqx "$line" "$file" 2>/dev/null; then
30
- printf "%s\n" "$line" >>"$file"
31
- fi
32
- }
33
-
34
- apply_template_security_baseline() {
35
- local dest="$1"
36
- local template_lang="$2"
37
-
38
- # Baseline repo hygiene defaults
39
- if [[ ! -f "$dest/.editorconfig" ]]; then
40
- cat >"$dest/.editorconfig" <<'EOF'
41
- root = true
42
-
43
- [*]
44
- charset = utf-8
45
- end_of_line = lf
46
- insert_final_newline = true
47
- indent_style = space
48
- indent_size = 2
49
- trim_trailing_whitespace = true
50
- EOF
51
- fi
52
-
53
- if [[ ! -f "$dest/.gitattributes" ]]; then
54
- cat >"$dest/.gitattributes" <<'EOF'
55
- * text=auto eol=lf
56
- *.sh text eol=lf
57
- *.yml text eol=lf
58
- *.yaml text eol=lf
59
- EOF
60
- fi
61
-
62
- if [[ ! -f "$dest/.gitignore" ]]; then
63
- : >"$dest/.gitignore"
64
- fi
65
- ensure_line_in_file "$dest/.gitignore" ".env"
66
- ensure_line_in_file "$dest/.gitignore" ".env.*"
67
- ensure_line_in_file "$dest/.gitignore" "*.pem"
68
- ensure_line_in_file "$dest/.gitignore" "*.key"
69
- ensure_line_in_file "$dest/.gitignore" "*.p12"
70
- ensure_line_in_file "$dest/.gitignore" "*.agekey"
71
-
72
- if [[ ! -f "$dest/SECURITY.md" ]]; then
73
- cat >"$dest/SECURITY.md" <<'EOF'
74
- # Security Policy
75
-
76
- ## Reporting
77
-
78
- Do not disclose vulnerabilities publicly before a fix is available.
79
- Open a private security advisory or contact maintainers directly.
80
-
81
- ## Baseline Controls
82
-
83
- - No secrets in source control.
84
- - Use environment variables for API keys/tokens.
85
- - Keep dependencies and lockfiles up to date.
86
- - Enable secret scanning in CI.
87
- EOF
88
- fi
89
-
90
- mkdir -p "$dest/.github/workflows"
91
- if [[ ! -f "$dest/.github/workflows/security.yml" ]]; then
92
- cat >"$dest/.github/workflows/security.yml" <<'EOF'
93
- name: Security Baseline
94
-
95
- on:
96
- pull_request:
97
- push:
98
- branches: [main, master]
99
-
100
- permissions:
101
- contents: read
102
-
103
- jobs:
104
- secrets:
105
- runs-on: ubuntu-latest
106
- timeout-minutes: 10
107
- steps:
108
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
109
- - uses: gitleaks/gitleaks-action@ff98106e4c7b2bc287b24eaf42907196329070c7 # v2
110
- env:
111
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
112
- - uses: trufflesecurity/trufflehog@6961f2bace57ab32b23b3ba40f8f420f6bc7e004 # v3.93.3
113
- with:
114
- extra_args: --only-verified
115
- EOF
116
- fi
117
-
118
- # Best-effort lockfile generation to improve reproducibility.
119
- case "$template_lang" in
120
- node)
121
- if has_command npm && [[ -f "$dest/package.json" ]] && [[ ! -f "$dest/package-lock.json" ]]; then
122
- (cd "$dest" && npm install --package-lock-only --ignore-scripts --silent >/dev/null 2>&1) || true
123
- fi
124
- ;;
125
- python)
126
- if has_command uv && [[ -f "$dest/pyproject.toml" ]] && [[ ! -f "$dest/uv.lock" ]]; then
127
- (cd "$dest" && uv lock >/dev/null 2>&1) || true
128
- fi
129
- ;;
130
- go)
131
- if has_command go && [[ -f "$dest/go.mod" ]]; then
132
- (cd "$dest" && go mod tidy >/dev/null 2>&1) || true
133
- fi
134
- ;;
135
- esac
136
- }
137
-
138
- show_system_package_managers() {
139
- if has_command brew; then
140
- local brew_version brew_formulae brew_casks
141
- brew_version=$(brew --version | head -1)
142
- brew_formulae=$(brew list --formula 2>/dev/null | wc -l | tr -d ' ')
143
- brew_casks=$(brew list --cask 2>/dev/null | wc -l | tr -d ' ')
144
- echo " Homebrew: $brew_version"
145
- echo " Formulae: $brew_formulae"
146
- echo " Casks: $brew_casks"
147
- fi
148
- if has_command apt; then
149
- local apt_version apt_packages
150
- apt_version=$(apt --version 2>/dev/null | head -1 || echo 'installed')
151
- apt_packages=$(dpkg -l 2>/dev/null | grep -c '^ii' || echo 'N/A')
152
- echo " APT: $apt_version"
153
- echo " Packages: $apt_packages"
154
- fi
155
- if has_command dnf; then
156
- echo " DNF: $(dnf --version 2>/dev/null | head -1 || echo 'installed')"
157
- fi
158
- if has_command pacman; then
159
- local pacman_packages
160
- pacman_packages=$(pacman -Q 2>/dev/null | wc -l | tr -d ' ')
161
- echo " Pacman: $(pacman --version | head -1)"
162
- echo " Packages: $pacman_packages"
163
- fi
164
- if has_command nix; then
165
- echo " Nix: $(nix --version)"
166
- fi
167
- }
168
-
169
- show_language_package_managers() {
170
- if has_command npm; then
171
- local npm_globals
172
- npm_globals=$(npm list -g --depth=0 2>/dev/null | grep -c '├──\|└──' || echo 'N/A')
173
- echo " npm: $(npm --version)"
174
- echo " Global packages: $npm_globals"
175
- fi
176
- if has_command pnpm; then
177
- echo " pnpm: $(pnpm --version)"
178
- fi
179
- if has_command bun; then
180
- echo " Bun: $(bun --version)"
181
- fi
182
- if has_command cargo; then
183
- local cargo_installed
184
- cargo_installed=$(cargo install --list 2>/dev/null | grep -c ':$' || echo 'N/A')
185
- echo " Cargo: $(cargo --version | cut -d' ' -f2)"
186
- echo " Installed: $cargo_installed"
187
- fi
188
- if has_command pip3; then
189
- echo " pip: $(pip3 --version | cut -d' ' -f2)"
190
- fi
191
- if has_command pipx; then
192
- local pipx_installed pipx_list_out
193
- # `pipx list --short` returns non-zero when any installed package
194
- # has a broken interpreter (common). Under `set -euo pipefail` a
195
- # naive `local x=$(pipx …)` cascades and kills `dot packages`
196
- # mid-output. Capture the pipeline separately so we can fall back
197
- # cleanly without stray "N/A" lines from pipe-with-|| tricks.
198
- if pipx_list_out="$(pipx list --short 2>/dev/null)"; then
199
- # Command substitution strips the trailing newline, so counting
200
- # with `printf '%s' … | wc -l` reported one package fewer than
201
- # installed (and 0 when exactly one was installed). Re-add the
202
- # terminator, and treat "no output" as zero rather than one.
203
- if [[ -n "$pipx_list_out" ]]; then
204
- pipx_installed="$(printf '%s\n' "$pipx_list_out" | wc -l | tr -d ' ')"
205
- else
206
- pipx_installed=0
207
- fi
208
- else
209
- pipx_installed="N/A"
210
- fi
211
- echo " pipx: $(pipx --version)"
212
- echo " Installed: $pipx_installed"
213
- fi
214
- if has_command gem; then
215
- echo " RubyGems: $(gem --version)"
216
- fi
217
- if has_command go; then
218
- echo " Go: $(go version | cut -d' ' -f3)"
219
- fi
220
- }
221
-
222
- cmd_setup() {
223
- run_script "scripts/ops/setup.sh" "Setup script" "$@"
224
- }
225
-
226
- cmd_tools() {
227
- local src_dir subcommand
228
- src_dir="$(resolve_source_dir)"
229
- subcommand="${1:-}"
230
-
231
- if [ "$subcommand" = "install" ]; then
232
- if ! has_command nix; then
233
- ui_err "Nix" "not installed"
234
- echo ""
235
- ui_header "Install Nix"
236
- echo " Follow the verified installer instructions:"
237
- echo " https://nixos.org/download/"
238
- echo ""
239
- ui_info "Or" "use Homebrew/apt for individual tools"
240
- exit 1
241
- fi
242
- shift
243
- # Validate any tool name arguments
244
- for arg in "$@"; do
245
- [[ "$arg" == -* ]] && continue
246
- validate_name "$arg" "tool name"
247
- done
248
- if [ -n "$src_dir" ] && [ -f "$src_dir/nix/flake.nix" ]; then
249
- ui_info "Entering" "Nix development shell"
250
- exec nix develop "$src_dir/nix" "$@"
251
- else
252
- ui_err "Nix flake" "not found in source directory"
253
- exit 1
254
- fi
255
- elif [ "$subcommand" = "docs" ]; then
256
- # docs/reference/ first: both documents were moved there, and looking
257
- # only in docs/ meant `dot tools docs` answered "TOOLS.md not found" on a
258
- # complete checkout. The legacy paths stay in the list so a pre-reorg
259
- # tree still resolves.
260
- local doc
261
- for doc in docs/reference/TOOLS.md docs/reference/UTILS.md \
262
- docs/TOOLS.md docs/UTILS.md; do
263
- if [ -n "$src_dir" ] && [ -f "$src_dir/$doc" ]; then
264
- exec cat "$src_dir/$doc"
265
- fi
266
- done
267
- ui_err "Docs" "TOOLS.md not found"
268
- exit 1
269
- else
270
- ui_header "Dot Tools"
271
- echo ""
272
- ui_info "Usage" "dot tools [command]"
273
- echo ""
274
- ui_header "Commands"
275
- ui_ok "(none)" "Show tools documentation"
276
- ui_ok "install" "Enter Nix development shell with all tools"
277
- ui_ok "docs" "Show full tools markdown documentation"
278
- echo ""
279
- ui_header "Quick Reference"
280
- ui_ok "dot sync" "Apply dotfiles"
281
- ui_ok "dot update" "Pull latest changes and apply"
282
- ui_ok "dot doctor" "Run health checks"
283
- ui_ok "dot verify" "Run post-merge verification checks"
284
- ui_ok "dot keys" "Show keybindings catalog"
285
- ui_ok "dot learn" "Interactive tour"
286
- fi
287
- }
288
-
289
- cmd_new() {
290
- local template_lang="${1:-}"
291
- local project_name="${2:-}"
292
-
293
- if [ -z "$template_lang" ] || [ -z "$project_name" ]; then
294
- echo "Usage: dot new <lang> <name>"
295
- echo "Available templates: python, go, node, packer, molecule"
296
- exit 1
297
- fi
298
-
299
- # Validate inputs to prevent path traversal
300
- if [[ ! "$template_lang" =~ ^[a-zA-Z0-9_-]+$ ]]; then
301
- die "Invalid template name: $template_lang"
302
- fi
303
- if [[ ! "$project_name" =~ ^[a-zA-Z0-9_.-]+$ ]]; then
304
- die "Invalid project name: $project_name"
305
- fi
306
-
307
- local src_dir
308
- src_dir="$(require_source_dir)"
309
- local template_dir="$src_dir/templates/projects/$template_lang"
310
-
311
- if [ ! -d "$template_dir" ]; then
312
- echo "Unknown template: $template_lang"
313
- echo "Available templates: python, go, node, packer, molecule"
314
- exit 1
315
- fi
316
-
317
- # Pre-flight: verify Python is available before creating any files
318
- local python_cmd=""
319
- if has_command python3; then
320
- python_cmd="python3"
321
- elif has_command python; then
322
- python_cmd="python"
323
- else
324
- die "python3 is required to render templates."
325
- fi
326
-
327
- local dest="$PWD/$project_name"
328
- if [ -e "$dest" ]; then
329
- die "Destination exists: $dest"
330
- fi
331
-
332
- mkdir -p "$dest"
333
- cp -R "$template_dir/." "$dest"
334
-
335
- # Rename directories
336
- find "$dest" -depth -name "__PROJECT_NAME__" -print0 | while IFS= read -r -d '' path; do
337
- local parent
338
- parent="$(dirname "$path")"
339
- mv "$path" "$parent/$project_name"
340
- done
341
-
342
- # Render template placeholders
343
- find "$dest" -type f -print0 | while IFS= read -r -d '' file; do
344
- $python_cmd - "$file" "$project_name" <<'PY'
345
- import sys
346
- path = sys.argv[1]
347
- name = sys.argv[2]
348
- with open(path, "r", encoding="utf-8") as f:
349
- data = f.read()
350
- data = data.replace("__PROJECT_NAME__", name)
351
- with open(path, "w", encoding="utf-8") as f:
352
- f.write(data)
353
- PY
354
- done
355
-
356
- apply_template_security_baseline "$dest" "$template_lang"
357
-
358
- echo "Created $template_lang project at $dest"
359
- }
360
-
361
- cmd_packages() {
362
- ui_header "Package Managers"
363
- echo ""
364
- show_system_package_managers
365
- echo ""
366
- ui_header "Language Package Managers"
367
- show_language_package_managers
368
- }
369
-
370
- cmd_log_rotate() {
371
- run_script "scripts/tools/log-rotate.sh" "Log rotation script" "$@"
372
- }
373
-
374
- cmd_env_mise() {
375
- # `dot env emit` is a separate sub-handler — it doesn't need mise
376
- # at command-time, only when actually invoked (the script checks).
377
- if [[ "${1:-}" == "emit" ]]; then
378
- shift
379
- # shellcheck source=./env-emit.sh
380
- source "$(require_source_dir)/scripts/dot/commands/env-emit.sh"
381
- dot_env_emit "$@"
382
- return $?
383
- fi
384
-
385
- if ! has_command mise; then
386
- ui_err "mise not installed (required for dot env)"
387
- exit 1
388
- fi
389
- case "${1:-list}" in
390
- list | ls)
391
- if has_command jq; then
392
- ui_table_begin "Tool" "Version" "Source" "Requested"
393
- while IFS=$'\t' read -r tool ver source req; do
394
- ui_table_add "$tool" "$ver" "${source/$HOME/\~}" "$req"
395
- done < <(mise ls --json 2>/dev/null | jq -r '
396
- to_entries[] as $t
397
- | $t.value[]
398
- | [
399
- $t.key,
400
- (.version // "-"),
401
- (.source.path // ""),
402
- (.requested_version // "")
403
- ]
404
- | @tsv
405
- ')
406
- ui_table_end
407
- else
408
- mise ls
409
- fi
410
- # Surface orphan installs (tool versions on disk that no active config
411
- # claims). `--dry-run-code` exits 1 iff there is something to prune;
412
- # the call is fast (no I/O beyond reading the tracked-configs index).
413
- if mise prune --dry-run-code --quiet >/dev/null 2>&1; then
414
- :
415
- else
416
- echo ""
417
- ui_warn "orphan installs" "tool versions on disk are not requested by any config"
418
- ui_info "to clean" "run 'dot env prune' (dry-run) or 'dot env prune --yes' to commit"
419
- fi
420
- ;;
421
- prune)
422
- shift
423
- local commit=0
424
- for arg in "$@"; do
425
- case "$arg" in
426
- --yes | -y) commit=1 ;;
427
- esac
428
- done
429
- if ((commit)); then
430
- mise prune
431
- else
432
- ui_info "dry-run" "showing what 'mise prune' would remove (pass --yes to commit)"
433
- echo ""
434
- mise prune --dry-run
435
- echo ""
436
- ui_info "next" "re-run with 'dot env prune --yes' to actually uninstall"
437
- fi
438
- ;;
439
- install)
440
- shift
441
- # Validate tool names to prevent injection
442
- for arg in "$@"; do
443
- [[ "$arg" == -* ]] && continue
444
- validate_name "$arg" "tool name"
445
- done
446
- mise install "$@"
447
- ;;
448
- use)
449
- shift
450
- for arg in "$@"; do
451
- [[ "$arg" == -* ]] && continue
452
- validate_name "$arg" "tool name"
453
- done
454
- mise use "$@"
455
- ;;
456
- *) mise "$@" ;;
457
- esac
458
- }
459
-
460
- cmd_profile() {
461
- local data_file
462
- data_file="$(resolve_chezmoi_source_dir)/.chezmoidata.toml"
463
- if [[ ! -f "$data_file" ]]; then
464
- die ".chezmoidata.toml not found"
465
- fi
466
- case "${1:-show}" in
467
- show)
468
- ui_header "Dotfiles Profile"
469
- local profile_val
470
- profile_val="$(grep '^profile' "$data_file" | head -1 | sed 's/.*=\s*"\(.*\)"/\1/')"
471
- ui_info "Profile" "${profile_val:-default}"
472
- echo ""
473
- ui_section "Feature Flags"
474
- grep -A 100 '^\[features\]' "$data_file" | tail -n +2 | while IFS= read -r line; do
475
- [[ "$line" =~ ^\[ ]] && break
476
- [[ -z "$line" || "$line" =~ ^# ]] && continue
477
- local key val
478
- key="${line%%=*}"
479
- key="${key// /}"
480
- val="${line#*=}"
481
- val="${val// /}"
482
- val="${val//\"/}"
483
- ui_info "$key" "$val"
484
- done
485
- ;;
486
- set)
487
- shift
488
- local new_profile="${1:-}"
489
- if [[ -z "$new_profile" ]]; then
490
- die "Usage: dot profile set <name>"
491
- fi
492
- if grep -q '^profile' "$data_file"; then
493
- sed_in_place "s/^profile = \".*\"/profile = \"$new_profile\"/" "$data_file"
494
- else
495
- sed_in_place "1a profile = \"$new_profile\"" "$data_file"
496
- fi
497
- ui_info "Profile" "Set to '$new_profile'. Run 'dot sync' to apply."
498
- ;;
499
- *)
500
- die "Unknown profile subcommand: ${1:-}. Use 'show' or 'set'."
501
- ;;
502
- esac
503
- }
504
-
505
- # Dispatch — aliases and alias-check are defined in aliases.sh (sourced above)
506
- case "${1:-}" in
507
- --help | -h | help)
508
- cat <<'EOF'
509
- Usage: tools.sh <command> [args...]
510
-
511
- Commands:
512
- tools, alias-check, new, packages, log-rotate, setup, aliases, env,
513
- profile, lint
514
- EOF
515
- ;;
516
- "")
517
- cat <<'EOF'
518
- Usage: tools.sh <command> [args...]
519
-
520
- Commands:
521
- tools, alias-check, new, packages, log-rotate, setup, aliases, env,
522
- profile, lint
523
- EOF
524
- exit 1
525
- ;;
526
- tools)
527
- shift
528
- cmd_tools "$@"
529
- ;;
530
- alias-check)
531
- shift
532
- cmd_alias_check "$@"
533
- ;;
534
- new)
535
- shift
536
- cmd_new "$@"
537
- ;;
538
- packages)
539
- shift
540
- cmd_packages "$@"
541
- ;;
542
- log-rotate)
543
- shift
544
- cmd_log_rotate "$@"
545
- ;;
546
- setup)
547
- shift
548
- cmd_setup "$@"
549
- ;;
550
- aliases)
551
- shift
552
- cmd_aliases "$@"
553
- ;;
554
- env)
555
- shift
556
- cmd_env_mise "$@"
557
- ;;
558
- profile)
559
- shift
560
- cmd_profile "$@"
561
- ;;
562
- lint)
563
- shift
564
- exec bash "$(require_source_dir)/scripts/dot/commands/lint.sh" lint "$@"
565
- ;;
566
- *)
567
- echo "Unknown tools command: ${1:-}" >&2
568
- exit 1
569
- ;;
570
- esac
@@ -1,2 +0,0 @@
1
- # alias replacement remove_in note
2
- dlogsf dklf v0.2.487 Removed duplicate logs-follow alias