@sebastienrousseau/dotfiles 0.2.519 → 0.2.520

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 (163) hide show
  1. package/CHANGELOG.md +182 -0
  2. package/README.md +1163 -163
  3. package/docs/ARCHITECTURE.md +117 -0
  4. package/docs/COPYRIGHT +1 -1
  5. package/docs/ECOSYSTEM.md +220 -0
  6. package/docs/GOLD-STANDARD-AUDIT.md +352 -0
  7. package/docs/GOVERNANCE.md +1 -1
  8. package/docs/MAINTAINERS.md +1 -1
  9. package/docs/MINIMUM-TOOLCHAIN.md +100 -0
  10. package/docs/README.md +1 -1
  11. package/docs/STRUCTURE.md +1 -1
  12. package/docs/architecture/ARCHITECTURE.md +11 -108
  13. package/docs/architecture/REPO_LAYOUT.md +3 -3
  14. package/docs/guides/MACOS_ICLOUD_SYMLINKS.md +121 -0
  15. package/docs/index.md +3 -3
  16. package/docs/manual/00-introduction.md +1 -1
  17. package/docs/manual/03-reference/01-dot-cli.md +28 -3
  18. package/docs/manual/command-index.md +24 -4
  19. package/docs/manual/concept-index.md +2 -0
  20. package/docs/migration/README.md +81 -0
  21. package/docs/migration/from-bare-git-repo.md +156 -0
  22. package/docs/migration/from-gnu-stow.md +165 -0
  23. package/docs/migration/from-plain-chezmoi.md +148 -0
  24. package/docs/migration/from-yadm.md +187 -0
  25. package/docs/operations/PERFORMANCE_BUDGETS.md +196 -0
  26. package/docs/operations/REGISTRY.md +1 -1
  27. package/docs/operations/RELEASE_PIPELINE.md +4 -4
  28. package/docs/operations/TESTING.md +3 -3
  29. package/docs/operations/TRACEABILITY.md +1 -0
  30. package/docs/packaging.md +222 -0
  31. package/docs/reference/FEATURE-MATRIX.md +646 -0
  32. package/docs/reference/TOOLS.md +1 -1
  33. package/docs/reference/UTILS.md +1 -0
  34. package/docs/security/COMPLIANCE.md +1 -1
  35. package/docs/security/DISCLOSURE.md +4 -4
  36. package/docs/security/FUZZING.md +113 -18
  37. package/docs/security/KEY_ROTATION.md +1 -1
  38. package/docs/security/SCORECARD.md +3 -3
  39. package/docs/security/VERIFY_RELEASE.md +2 -2
  40. package/install.sh +6 -6
  41. package/package.json +2 -2
  42. package/scripts/ci/check-copyright-headers.sh +1 -1
  43. package/scripts/ci/check-shell-preamble.sh +1 -1
  44. package/scripts/ci/guard-gitleaks-checkout.sh +1 -1
  45. package/scripts/demo/record.sh +1 -1
  46. package/scripts/diagnostics/a2a-conformance.sh +1 -1
  47. package/scripts/diagnostics/alias-governance.sh +30 -3
  48. package/scripts/diagnostics/aliases-cheatsheet.sh +1 -1
  49. package/scripts/diagnostics/aliases-manifest.sh +1 -1
  50. package/scripts/diagnostics/attest-verify.sh +147 -0
  51. package/scripts/diagnostics/benchmark.sh +1 -1
  52. package/scripts/diagnostics/conflicts.sh +1 -1
  53. package/scripts/diagnostics/doctor-unified.sh +6 -2
  54. package/scripts/diagnostics/doctor.sh +56 -10
  55. package/scripts/diagnostics/drift-dashboard.sh +3 -2
  56. package/scripts/diagnostics/health.sh +43 -10
  57. package/scripts/diagnostics/history-analysis.sh +1 -1
  58. package/scripts/diagnostics/mcp-doctor.sh +2 -2
  59. package/scripts/diagnostics/perf.sh +1 -1
  60. package/scripts/diagnostics/scorecard.sh +3 -2
  61. package/scripts/diagnostics/secret-governance.sh +1 -1
  62. package/scripts/diagnostics/security-score.sh +1 -1
  63. package/scripts/diagnostics/smoke-test.sh +1 -1
  64. package/scripts/diagnostics/snapshot.sh +1 -1
  65. package/scripts/diagnostics/verify.sh +1 -1
  66. package/scripts/diagnostics/verify_state.sh +1 -1
  67. package/scripts/diagnostics/version-locks.sh +1 -1
  68. package/scripts/diagnostics/workstation-attestation.sh +26 -1
  69. package/scripts/dot/commands/agent.sh +64 -14
  70. package/scripts/dot/commands/agents.sh +24 -8
  71. package/scripts/dot/commands/ai.sh +20 -7
  72. package/scripts/dot/commands/aliases.sh +1 -1
  73. package/scripts/dot/commands/appearance.sh +1 -1
  74. package/scripts/dot/commands/completion.sh +42 -5
  75. package/scripts/dot/commands/core.sh +1 -1
  76. package/scripts/dot/commands/diagnostics.sh +1 -1
  77. package/scripts/dot/commands/env-emit.sh +1 -1
  78. package/scripts/dot/commands/fleet.sh +41 -18
  79. package/scripts/dot/commands/init.sh +1 -1
  80. package/scripts/dot/commands/lint.sh +1 -1
  81. package/scripts/dot/commands/manual.sh +1 -1
  82. package/scripts/dot/commands/meta.sh +115 -10
  83. package/scripts/dot/commands/patterns.sh +1 -1
  84. package/scripts/dot/commands/registry.sh +43 -7
  85. package/scripts/dot/commands/restore.sh +1 -1
  86. package/scripts/dot/commands/secrets.sh +1 -1
  87. package/scripts/dot/commands/security.sh +1 -1
  88. package/scripts/dot/commands/tools.sh +21 -7
  89. package/scripts/fonts/install-nerd-fonts.sh +1 -1
  90. package/scripts/fonts/patch-fonts.sh +1 -1
  91. package/scripts/git-hooks/install.sh +1 -1
  92. package/scripts/git-hooks/pre-commit-audit.sh +2 -2
  93. package/scripts/lib/secrets_provider.sh +19 -4
  94. package/scripts/nvim/headless-upgrade.lua +81 -0
  95. package/scripts/ops/ai-setup.sh +1 -1
  96. package/scripts/ops/bundle.sh +1 -1
  97. package/scripts/ops/chaos.sh +1 -1
  98. package/scripts/ops/chezmoi-apply.sh +1 -1
  99. package/scripts/ops/chezmoi-diff.sh +1 -1
  100. package/scripts/ops/chezmoi-remove.sh +3 -3
  101. package/scripts/ops/chezmoi-update.sh +6 -2
  102. package/scripts/ops/heal-chezmoi.sh +1 -1
  103. package/scripts/ops/heal-system.sh +1 -1
  104. package/scripts/ops/heal-tools.sh +1 -1
  105. package/scripts/ops/heal.sh +1 -1
  106. package/scripts/ops/post-apply-repair.sh +1 -1
  107. package/scripts/ops/prewarm.sh +1 -1
  108. package/scripts/ops/release.sh +1 -1
  109. package/scripts/ops/rollback.sh +11 -2
  110. package/scripts/ops/setup.sh +1 -1
  111. package/scripts/ops/teleport.sh +1 -1
  112. package/scripts/qa/check-feature-matrix.sh +296 -0
  113. package/scripts/qa/check-version-consistency.sh +7 -119
  114. package/scripts/qa/coverage-baseline.sh +1 -1
  115. package/scripts/qa/docs-coverage.sh +9 -3
  116. package/scripts/qa/examples-coverage.sh +1 -1
  117. package/scripts/qa/reliability-audit.sh +1 -1
  118. package/scripts/qa/scorecard-snapshot.sh +1 -1
  119. package/scripts/qa/traceability-coverage.sh +9 -2
  120. package/scripts/qa/validate-examples.sh +66 -3
  121. package/scripts/qa/wsl-contract.sh +1 -1
  122. package/scripts/secrets/age-init.sh +1 -1
  123. package/scripts/secrets/create-secrets-file.sh +1 -1
  124. package/scripts/secrets/encrypt-ssh-key.sh +1 -1
  125. package/scripts/security/backup.sh +1 -1
  126. package/scripts/security/check-disclosure-key-expiry.sh +1 -1
  127. package/scripts/security/dns-doh.sh +1 -1
  128. package/scripts/security/encryption-check.sh +1 -1
  129. package/scripts/security/enforce-policies.sh +315 -98
  130. package/scripts/security/firewall.sh +1 -1
  131. package/scripts/security/lock-configs.sh +1 -1
  132. package/scripts/security/lock-screen.sh +1 -1
  133. package/scripts/security/manage-secrets.sh +1 -1
  134. package/scripts/security/ssh-cert.sh +1 -1
  135. package/scripts/security/telemetry-kill.sh +1 -1
  136. package/scripts/security/usb-safety.sh +1 -1
  137. package/scripts/theme/apply-gnome-theme.sh +1 -1
  138. package/scripts/theme/extract-heic-frames.sh +1 -1
  139. package/scripts/theme/extract-theme.py +284 -6
  140. package/scripts/theme/install-boot-logo.sh +1 -1
  141. package/scripts/theme/install-catppuccin-themes.sh +1 -1
  142. package/scripts/theme/install-cursors.sh +1 -1
  143. package/scripts/theme/install-file-icons.sh +1 -1
  144. package/scripts/theme/install-grub-theme.sh +1 -1
  145. package/scripts/theme/install-lock-icon.sh +1 -1
  146. package/scripts/theme/merge-wallpaper.sh +1 -1
  147. package/scripts/theme/rebuild-themes.sh +64 -5
  148. package/scripts/theme/switch.sh +46 -19
  149. package/scripts/theme/wallpaper-rotate.sh +1 -1
  150. package/scripts/theme/wallpaper-sync.sh +1 -1
  151. package/scripts/tools/cmatrix.sh +1 -1
  152. package/scripts/tools/detect-collisions.py +1 -1
  153. package/scripts/tools/emoji-picker.sh +1 -1
  154. package/scripts/tools/figlet-banner.sh +1 -1
  155. package/scripts/tools/log-rotate.sh +1 -1
  156. package/scripts/tools/lolcat-wrap.sh +1 -1
  157. package/scripts/tools/pipes.sh +1 -1
  158. package/scripts/tuning/linux.sh +1 -1
  159. package/scripts/tuning/macos.sh +1 -1
  160. package/scripts/uninstall.sh +1 -1
  161. package/scripts/verify-release-versions +156 -0
  162. package/scripts/version-sync.sh +63 -3
  163. package/LICENSE +0 -21
@@ -0,0 +1,646 @@
1
+ ---
2
+ render_with_liquid: false
3
+ ---
4
+
5
+ # Feature Matrix
6
+
7
+ Every user-facing feature of the `dot` CLI, with the regression test,
8
+ benchmark, example and manual section that cover it. One row per feature:
9
+ a command, or a distinct variant, flag, environment variable or config key
10
+ of one.
11
+
12
+ This file is a **contract, not a summary**. `scripts/qa/check-feature-matrix.sh`
13
+ parses it on every push and fails when:
14
+
15
+ - a subcommand exists in `scripts/dot/commands/` or in
16
+ `docs/manual/command-index.md` and has no row here;
17
+ - a row names a regression test function that no
18
+ `tests/regression/test_feature_matrix_*.sh` file defines;
19
+ - a row names a benchmark id that
20
+ `benches/dot_command_bench.sh --list-ids` does not produce;
21
+ - a row names an example file that does not exist.
22
+
23
+ So a new subcommand cannot merge without coverage, and coverage cannot be
24
+ deleted without the matrix going red.
25
+
26
+ ## Totals
27
+
28
+ | Measure | Count |
29
+ |---------|-------|
30
+ | Feature rows | 371 |
31
+ | Covered by a regression test | 318 (85%) |
32
+ | Unmeasurable, with a recorded reason + `--help` smoke test | 53 (14%) |
33
+ | Benchmarked | 371 (100%) |
34
+ | With a runnable example | 371 (100%) |
35
+ | Distinct commands covered | 103 |
36
+
37
+ Every row is covered: a row is either exercised end to end against the real
38
+ CLI in a sandboxed `HOME`, or — where the feature genuinely cannot be
39
+ measured without changing the developer's machine, spending money on a model,
40
+ or holding a terminal open — it is marked `smoke` with the reason recorded in
41
+ its Coverage cell, and still carries an integration smoke test asserting that
42
+ `dot <command> --help` exits 0 and renders help for the right command without
43
+ performing the command.
44
+
45
+ ## How to run the coverage this table names
46
+
47
+ ```bash
48
+ # The regression rows (all of them, ~700 assertions):
49
+ ./tests/framework/test_runner.sh --jobs auto
50
+
51
+ # One group:
52
+ bash tests/regression/test_feature_matrix_fleet_registry.sh
53
+
54
+ # The benchmarks (help cold-start for every command; --full adds the
55
+ # read-only invocations):
56
+ bash benches/dot_command_bench.sh --full --output bench.json
57
+
58
+ # The examples:
59
+ bash scripts/qa/validate-examples.sh
60
+
61
+ # This file's own drift gate:
62
+ bash scripts/qa/check-feature-matrix.sh
63
+ ```
64
+
65
+ ## Reading a row
66
+
67
+ | Column | Meaning |
68
+ |--------|---------|
69
+ | Command | The `dot` subcommand. |
70
+ | Variant | The specific flag, subcommand, environment variable or config key this row pins. |
71
+ | Regression test | A shell function in `tests/regression/test_feature_matrix_*.sh`. |
72
+ | Benchmark | An id from `benches/dot_command_bench.sh`. `help:<cmd>` is that command's cold-start; `run:<id>` is a real read-only invocation. |
73
+ | Example | A runnable script under `examples/`, executed by `scripts/qa/validate-examples.sh`. |
74
+ | Manual | Where the feature is documented. |
75
+ | Coverage | `regression`, or `smoke` plus the reason the feature is unmeasurable in CI. |
76
+
77
+
78
+ ## dispatcher: bin/dot
79
+
80
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
81
+ |---------|---------|-----------------|-----------|---------|--------|----------|
82
+ | `dot version` | (default) | `test_fm_version` | `run:version` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
83
+ | `dot version` | --version | `test_fm_version_long_flag` | `run:version-flag` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
84
+ | `dot version` | -v | `test_fm_version_short_flag` | `help:version` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
85
+ | `dot help` | (default overview) | `test_fm_help_overview` | `run:help` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
86
+ | `dot help` | dot (no arguments) | `test_fm_help_no_args` | `run:help-noargs` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
87
+ | `dot help` | --help | `test_fm_help_long_flag` | `run:help-flag` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
88
+ | `dot help` | -h | `test_fm_help_short_flag` | `help:help` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
89
+ | `dot help` | all | `test_fm_help_all` | `run:help-all` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
90
+ | `dot help` | <command> | `test_fm_help_topic` | `run:help-topic` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
91
+ | `dot help` | <unknown> (exit 1) | `test_fm_help_unknown_topic` | `run:help-unknown` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
92
+ | `dot help` | <cmd> --help / -h intercept (never dispatches) | `test_fm_help_universal_intercept` | `run:help-intercept` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
93
+ | `dot search` | <keyword> | `test_fm_search` | `run:search` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
94
+ | `dot search` | (no keyword, exit 1) | `test_fm_search_missing_keyword` | `run:search-usage` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
95
+ | `dot search` | <keyword> with no match | `test_fm_search_no_match` | `run:search-nomatch` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
96
+ | `dot help` | unknown command (exit 1) | `test_fm_unknown_command` | `run:unknown-command` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
97
+ | `dot help` | ~/.config/dotfiles/commands/<name>.sh user command | `test_fm_user_custom_command` | `run:user-command` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
98
+ | `dot help` | DOTFILES_SHOW_LOGO=0 suppresses the product banner | `test_fm_env_dotfiles_show_logo` | `run:version-nologo` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/03-environment.md` | regression |
99
+ | `dot help` | NO_COLOR=1 strips ANSI from non-TTY output | `test_fm_env_no_color` | `help:version` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/03-environment.md` | regression |
100
+
101
+ ## core.sh
102
+
103
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
104
+ |---------|---------|-----------------|-----------|---------|--------|----------|
105
+ | `dot sync` | (default, --check/--pull passthrough) | `test_fm_sync` | `run:sync-check` | `examples/example-dot-core.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
106
+ | `dot apply` | alias of sync | `test_fm_apply` | `run:apply-dry-run` | `examples/example-dot-core.sh` | `docs/manual/command-index.md` | regression |
107
+ | `dot update` | alias (chezmoi update) | `test_fm_update` | `run:update` | `examples/example-dot-core.sh` | `docs/manual/command-index.md` | regression |
108
+ | `dot add` | <file> | `test_fm_add` | `run:add` | `examples/example-dot-core.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
109
+ | `dot add` | (no file, exit 1) | `test_fm_add_usage` | `run:add-usage` | `examples/example-dot-core.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
110
+ | `dot diff` | (default) | `test_fm_diff` | `run:diff` | `examples/example-dot-core.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
111
+ | `dot status` | (clean tree) | `test_fm_status` | `run:status` | `examples/example-dot-core.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
112
+ | `dot status` | (drifted tree passthrough) | `test_fm_status_drift` | `help:status` | `examples/example-dot-core.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
113
+ | `dot cd` | (default) | `test_fm_cd` | `run:cd` | `examples/example-dot-core.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
114
+ | `dot edit` | (honours $EDITOR) | `test_fm_edit` | `run:edit` | `examples/example-dot-core.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
115
+ | `dot edit` | EDITOR env selects the editor | `test_fm_env_editor` | `help:edit` | `examples/example-dot-core.sh` | `docs/manual/03-reference/03-environment.md` | regression |
116
+ | `dot commit` | (no staged changes, exit 1) | `test_fm_commit` | `run:commit` | `examples/example-dot-core.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
117
+ | `dot uninstall` | (prompts unless --force) | `test_fm_smoke_uninstall` | `help:uninstall` | `examples/example-dot-core.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — destructive — removes the managed environment from $HOME; only --help is exercised |
118
+ | `dot uninstall` | --force | `test_fm_smoke_uninstall_force` | `help:uninstall` | `examples/example-dot-core.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — destructive — --force skips the confirmation and purges real files |
119
+
120
+ ## diagnostics.sh
121
+
122
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
123
+ |---------|---------|-----------------|-----------|---------|--------|----------|
124
+ | `dot doctor` | (default) | `test_fm_doctor` | `run:doctor` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
125
+ | `dot doctor` | --score / -s | `test_fm_doctor_score` | `run:doctor-score` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
126
+ | `dot doctor` | --smoke / -m | `test_fm_doctor_smoke` | `run:doctor-smoke` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
127
+ | `dot doctor` | --drift / -d | `test_fm_doctor_drift` | `run:doctor-drift` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
128
+ | `dot doctor` | --heal / -H | `test_fm_doctor_heal` | `help:doctor` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
129
+ | `dot doctor` | --audit / -a | `test_fm_doctor_audit` | `help:doctor` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
130
+ | `dot doctor` | --json / -j, --ai / -A passthrough | `test_fm_doctor_json` | `help:doctor` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
131
+ | `dot doctor` | --benchmark / -b | `test_fm_smoke_doctor_benchmark` | `help:doctor` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — runs tests/benchmark.sh (hyperfine over every shell, minutes) — covered by benches/bench.sh |
132
+ | `dot heal` | (default) | `test_fm_heal` | `run:heal` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
133
+ | `dot heal` | --dry-run / -n | `test_fm_heal_dry_run` | `run:heal-dry-run` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
134
+ | `dot health` | (default) | `test_fm_health` | `run:health` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
135
+ | `dot health` | --json / -j | `test_fm_health_json` | `run:health-json` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
136
+ | `dot health` | --verbose / -v | `test_fm_health_verbose` | `help:health` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
137
+ | `dot health-check` | alias of health | `test_fm_health_check_alias` | `help:health-check` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
138
+ | `dot health` | --fix / -f, --force / -F | `test_fm_smoke_health_fix` | `help:health` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | **smoke** — --fix re-applies chezmoi and rewrites shell configs in $HOME |
139
+ | `dot security-score` | (default) | `test_fm_security_score` | `run:security-score` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
140
+ | `dot security-score` | --json / -j | `test_fm_security_score_json` | `run:security-score-json` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
141
+ | `dot security-score` | --quiet / -q, --verbose / -v | `test_fm_security_score_quiet` | `help:security-score` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
142
+ | `dot score` | (default) | `test_fm_score` | `run:score` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
143
+ | `dot score` | --json / -j | `test_fm_score_json` | `run:score-json` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
144
+ | `dot scorecard` | alias of score | `test_fm_scorecard` | `help:scorecard` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
145
+ | `dot perf` | --json / -j, --runs / -r | `test_fm_perf_json` | `run:perf` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
146
+ | `dot perf` | --profile / -p, --target / -t, --shell / -s, --by-tool, --reset, --baseline, --no-baseline-check | `test_fm_perf_profile` | `help:perf` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
147
+ | `dot conflicts` | (default) | `test_fm_conflicts` | `run:conflicts` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
148
+ | `dot locks` | (default) | `test_fm_locks` | `run:locks` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
149
+ | `dot snapshot` | (default) | `test_fm_snapshot` | `run:snapshot` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
150
+ | `dot snapshot` | --baseline / -b, --force / -f | `test_fm_snapshot_baseline` | `help:snapshot` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
151
+ | `dot snapshot` | XDG_STATE_HOME controls where snapshots/attestations are written | `test_fm_env_xdg_state_home` | `help:snapshot` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/03-environment.md` | regression |
152
+ | `dot attest` | (default) | `test_fm_attest` | `run:attest` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
153
+ | `dot attest` | --json / -j | `test_fm_attest_json` | `run:attest-json` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
154
+ | `dot attest` | --write / -w | `test_fm_attest_write` | `help:attest` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
155
+ | `dot attest` | --fleet-store / -F <dir>, --fleet-id / -I <id> | `test_fm_attest_fleet_store` | `help:attest` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
156
+ | `dot attestation` | alias of attest | `test_fm_attestation` | `help:attestation` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
157
+ | `dot rollback` | status | `test_fm_rollback_status` | `run:rollback-status` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
158
+ | `dot rollback` | backup | `test_fm_rollback_backup` | `help:rollback` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
159
+ | `dot rollback` | clean | `test_fm_rollback_clean` | `help:rollback` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
160
+ | `dot rollback` | <unknown> (usage, exit 1) | `test_fm_rollback_unknown` | `help:rollback` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
161
+ | `dot rollback` | rollback / rollback-to N / git-reset / restore FILE (--force, --dry-run, --verbose) | `test_fm_smoke_rollback_restore` | `help:rollback` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — rewrites $HOME dotfiles from a backup and resets the git checkout |
162
+ | `dot drift` | (default) | `test_fm_drift` | `run:drift` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
163
+ | `dot drift` | --json / -j, --diff / -d | `test_fm_drift_json` | `run:drift-json` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
164
+ | `dot history` | (default, reads $HISTFILE) | `test_fm_history` | `run:history` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
165
+ | `dot history` | (no history file, exit 1) | `test_fm_history_missing` | `help:history` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
166
+ | `dot history` | HISTFILE selects the shell history analysed | `test_fm_env_histfile` | `help:history` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/03-environment.md` | regression |
167
+ | `dot benchmark` | (default, --detailed, --profile, --compare, --waterfall) | `test_fm_benchmark` | `run:benchmark` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
168
+ | `dot restore` | --list / -l | `test_fm_restore_list` | `run:restore-list` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
169
+ | `dot restore` | --git / -g <ref> with --dry-run / -n | `test_fm_restore_git_dry_run` | `help:restore` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
170
+ | `dot restore` | --diff / -d <ref> | `test_fm_restore_diff` | `help:restore` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
171
+ | `dot restore` | --latest / -L | `test_fm_restore_latest` | `help:restore` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
172
+ | `dot restore` | (no option prints usage), --help / -h, unknown option (exit 1) | `test_fm_restore_usage` | `run:restore-usage` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
173
+ | `dot restore` | DOTFILES_DIR selects the git checkout restore reads | `test_fm_env_dotfiles_dir` | `help:restore` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/03-environment.md` | regression |
174
+ | `dot load-bench` | (default, runs count) | `test_fm_load_bench` | `run:load-bench` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
175
+ | `dot load-bench-pty` | (default) | `test_fm_smoke_load_bench_pty` | `help:load-bench-pty` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | **smoke** — needs the chezmoi-rendered dot-load-benchmark-pty template and a pseudo-terminal |
176
+ | `dot chaos` | (refuses without --force) | `test_fm_chaos` | `run:chaos` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
177
+ | `dot chaos` | --force | `test_fm_smoke_chaos_force` | `help:chaos` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — deliberately deletes ~/.zshrc and terminal configs |
178
+ | `dot teleport` | user@host | `test_fm_smoke_teleport` | `help:teleport` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | **smoke** — opens an SSH session to a remote host (network) |
179
+ | `dot teleport` | (no host, exit 1) | `test_fm_teleport_usage` | `run:teleport-usage` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
180
+ | `dot bundle` | [output-dir] | `test_fm_smoke_bundle` | `help:bundle` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — archives ~/.dotfiles plus tool caches with zstd (hundreds of MB, minutes) |
181
+ | `dot secret-audit` | (default) | `test_fm_secret_audit` | `run:secret-audit` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
182
+ | `dot metrics` | [count] | `test_fm_metrics` | `run:metrics` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
183
+ | `dot metrics` | (no metrics recorded yet) | `test_fm_metrics_empty` | `help:metrics` | `examples/example-dot-diagnostics.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
184
+ | `dot smoke-test` | (default) | `test_fm_smoke_test` | `run:smoke-test` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
185
+ | `dot intelligence` | (default) | `test_fm_intelligence` | `run:intelligence` | `examples/example-dot-diagnostics.sh` | `docs/manual/command-index.md` | regression |
186
+
187
+ ## ai.sh
188
+
189
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
190
+ |---------|---------|-----------------|-----------|---------|--------|----------|
191
+ | `dot ai` | (default cockpit TUI) | `test_fm_smoke_ai_cockpit` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — launches the Bubble Tea cockpit / gum launcher (interactive TTY) |
192
+ | `dot ai tools` | (status table, cached probes) | `test_fm_ai_tools` | `run:ai-tools` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
193
+ | `dot ai tools` | install (alias of ai install) | `test_fm_smoke_ai_tools_install` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — installs AI CLIs through mise/native installers (network, mutates $HOME) |
194
+ | `dot ai` | status (deprecated alias of ai tools) | `test_fm_ai_status_deprecated` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
195
+ | `dot ai tools` | DOTFILES_AI_STATUS_TTL / DOTFILES_AI_PROBE_JOBS control the probe cache | `test_fm_env_dotfiles_ai_status_ttl` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/03-environment.md` | regression |
196
+ | `dot ai cost` | (default, --since N) | `test_fm_ai_cost` | `run:ai-cost` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
197
+ | `dot ai doctor` | (default) | `test_fm_ai_doctor` | `run:ai-doctor` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
198
+ | `dot ai run` | "<prompt>" (usage without prompt) | `test_fm_ai_run_usage` | `run:ai-run-usage` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
199
+ | `dot ai run` | "<prompt>" one-shot on Claude | `test_fm_smoke_ai_run_prompt` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — performs a paid LLM round-trip (network) |
200
+ | `dot ai` | "<prompt>" / <tool> "<prompt>" one-shot | `test_fm_smoke_ai_oneshot_bare` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — performs a paid LLM round-trip (network) |
201
+ | `dot ai delegate` | "<prompt>" (usage without prompt) | `test_fm_ai_delegate_usage` | `run:ai-delegate-usage` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
202
+ | `dot ai delegate` | "<prompt>" [max-turns] [agent] [timeout] | `test_fm_smoke_ai_delegate_prompt` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — delegates to a paid model under agent policy (network) |
203
+ | `dot ai ask` | "<question>" (usage without question) | `test_fm_ai_ask_usage` | `run:ai-ask-usage` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
204
+ | `dot ai ask` | "<question>" RAG query | `test_fm_smoke_ai_ask_query` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — embeds the repo and calls an LLM (network) |
205
+ | `dot ai chat` | [tool] | `test_fm_smoke_ai_chat` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — starts an interactive AI session (TTY) |
206
+ | `dot ai install` | [tool] | `test_fm_smoke_ai_install` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — installs AI CLIs (network, mutates $HOME) |
207
+ | `dot ai serve` | (default) | `test_fm_smoke_ai_serve` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — starts a long-running local gateway process bound to a port |
208
+ | `dot ai login` | (default) | `test_fm_smoke_ai_login` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — interactive OAuth / API-key prompts (TTY, network) |
209
+ | `dot ai` | dashboard / dash (deprecated cockpit alias) | `test_fm_smoke_ai_dashboard` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — launches the cockpit TUI (interactive TTY) |
210
+ | `dot ai` | proxy / local (deprecated alias of ai serve) | `test_fm_ai_proxy_deprecated` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
211
+ | `dot ai-setup` | deprecated alias of ai login | `test_fm_smoke_ai_setup` | `help:ai-setup` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — interactive tool authentication (TTY, network) |
212
+ | `dot ai-query` | deprecated alias of ai ask (usage without question) | `test_fm_ai_query_usage` | `run:ai-query-usage` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
213
+ | `dot cl` | (usage without prompt; deprecated bridge) | `test_fm_ai_bridge_cl` | `run:cl-usage` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
214
+ | `dot claude` | alias of cl | `test_fm_ai_bridge_claude` | `help:claude` | `examples/example-dot-ai.sh` | `docs/manual/command-index.md` | regression |
215
+ | `dot codex` | (usage without prompt) | `test_fm_ai_bridge_codex` | `help:codex` | `examples/example-dot-ai.sh` | `docs/manual/command-index.md` | regression |
216
+ | `dot copilot` | (usage without prompt) | `test_fm_ai_bridge_copilot` | `help:copilot` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
217
+ | `dot kimi` | (usage without prompt) | `test_fm_ai_bridge_kimi` | `help:kimi` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
218
+ | `dot agy` | (usage without prompt) | `test_fm_ai_bridge_agy` | `help:agy` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
219
+ | `dot goose` | (usage without prompt) | `test_fm_ai_bridge_goose` | `help:goose` | `examples/example-dot-ai.sh` | `docs/manual/command-index.md` | regression |
220
+ | `dot kiro` | (usage without prompt) | `test_fm_ai_bridge_kiro` | `help:kiro` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
221
+ | `dot sgpt` | (usage without prompt) | `test_fm_ai_bridge_sgpt` | `help:sgpt` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
222
+ | `dot ollama` | (usage without prompt) | `test_fm_ai_bridge_ollama` | `help:ollama` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
223
+ | `dot opencode` | (usage without prompt) | `test_fm_ai_bridge_opencode` | `help:opencode` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
224
+ | `dot aider` | (usage without prompt) | `test_fm_ai_bridge_aider` | `help:aider` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
225
+ | `dot autohand` | (usage without prompt) | `test_fm_ai_bridge_autohand` | `help:autohand` | `examples/example-dot-ai.sh` | `docs/manual/command-index.md` | regression |
226
+ | `dot vibe` | (usage without prompt) | `test_fm_ai_bridge_vibe` | `help:vibe` | `examples/example-dot-ai.sh` | `docs/manual/command-index.md` | regression |
227
+ | `dot qwen` | (usage without prompt) | `test_fm_ai_bridge_qwen` | `help:qwen` | `examples/example-dot-ai.sh` | `docs/manual/command-index.md` | regression |
228
+ | `dot zai` | (usage without prompt) | `test_fm_ai_bridge_zai` | `help:zai` | `examples/example-dot-ai.sh` | `docs/manual/command-index.md` | regression |
229
+ | `dot cl` | --style / --pattern / -p <name> (unknown pattern exits 1) | `test_fm_ai_bridge_style` | `help:cl` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
230
+ | `dot cl` | "<prompt>" with an installed tool | `test_fm_smoke_ai_bridge_prompt` | `help:cl` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — performs a paid LLM round-trip (network) |
231
+ | `dot cl` | DOT_AI_RAW=1 suppresses the banner and metadata preamble | `test_fm_env_dot_ai_raw` | `help:cl` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/03-environment.md` | regression |
232
+
233
+ ## tools.sh / aliases.sh
234
+
235
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
236
+ |---------|---------|-----------------|-----------|---------|--------|----------|
237
+ | `dot env` | list / ls (default; requires mise) | `test_fm_env_list` | `run:env-list` | `examples/example-dot-tools.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
238
+ | `dot env` | prune (dry-run; requires mise) | `test_fm_env_prune` | `help:env` | `examples/example-dot-tools.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
239
+ | `dot env` | prune --yes / -y | `test_fm_smoke_env_prune_yes` | `help:env` | `examples/example-dot-tools.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — uninstalls orphan tool versions from the real mise store |
240
+ | `dot env` | install [tool@version] | `test_fm_smoke_env_install` | `help:env` | `examples/example-dot-tools.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — downloads and installs toolchains through mise (network) |
241
+ | `dot env` | use <tool@version> | `test_fm_smoke_env_use` | `help:env` | `examples/example-dot-tools.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — rewrites the user's mise config and installs tools (network) |
242
+ | `dot env` | emit (default json, --pretty) | `test_fm_env_emit` | `run:env-emit` | `examples/example-dot-env-emit.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
243
+ | `dot env` | emit --compact | `test_fm_env_emit_compact` | `help:env` | `examples/example-dot-env-emit.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
244
+ | `dot env` | emit --format ndjson / --format=ndjson | `test_fm_env_emit_ndjson` | `help:env` | `examples/example-dot-env-emit.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
245
+ | `dot env` | emit --output / -o <file> (atomic write) | `test_fm_env_emit_output` | `help:env` | `examples/example-dot-env-emit.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
246
+ | `dot env` | emit --format <unsupported> (exit 1) | `test_fm_env_emit_bad_format` | `help:env` | `examples/example-dot-env-emit.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
247
+ | `dot env` | emit <unknown flag> (exit 1) | `test_fm_env_emit_bad_flag` | `help:env` | `examples/example-dot-env-emit.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
248
+ | `dot env` | emit --help / -h | `test_fm_env_emit_help` | `help:env` | `examples/example-dot-env-emit.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
249
+ | `dot profile` | show (default) | `test_fm_profile_show` | `run:profile-show` | `examples/example-dot-tools.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
250
+ | `dot profile` | set <name> (writes .chezmoidata.toml) | `test_fm_profile_set` | `help:profile` | `examples/example-dot-tools.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
251
+ | `dot profile` | set (no name, exit 1) | `test_fm_profile_set_usage` | `help:profile` | `examples/example-dot-tools.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
252
+ | `dot profile` | <unknown> (exit 1) | `test_fm_profile_unknown` | `help:profile` | `examples/example-dot-tools.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
253
+ | `dot profile` | .chezmoidata.toml `profile` + `[features]` keys | `test_fm_config_chezmoidata_profile` | `help:profile` | `examples/example-dot-tools.sh` | `docs/manual/03-reference/02-config-files.md` | regression |
254
+ | `dot tools` | (default overview) | `test_fm_tools` | `run:tools` | `examples/example-dot-tools.sh` | `docs/manual/command-index.md` | regression |
255
+ | `dot tools` | docs | `test_fm_tools_docs` | `run:tools-docs` | `examples/example-dot-tools.sh` | `docs/manual/command-index.md` | regression |
256
+ | `dot tools` | install (Nix develop shell) | `test_fm_smoke_tools_install` | `help:tools` | `examples/example-dot-tools.sh` | `docs/manual/command-index.md` | **smoke** — enters an interactive `nix develop` shell (TTY, network) |
257
+ | `dot new` | <lang> <name> | `test_fm_new` | `help:new` | `examples/example-dot-tools.sh` | `docs/manual/command-index.md` | regression |
258
+ | `dot new` | (no args, exit 1) / unknown template (exit 1) | `test_fm_new_usage` | `run:new-usage` | `examples/example-dot-tools.sh` | `docs/manual/command-index.md` | regression |
259
+ | `dot packages` | (default) | `test_fm_packages` | `run:packages` | `examples/example-dot-tools.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
260
+ | `dot aliases` | list (default) | `test_fm_aliases_list` | `run:aliases-list` | `examples/example-dot-aliases.sh` | `docs/manual/command-index.md` | regression |
261
+ | `dot aliases` | search <term> | `test_fm_aliases_search` | `run:aliases-search` | `examples/example-dot-aliases.sh` | `docs/manual/command-index.md` | regression |
262
+ | `dot aliases` | search <term> with no match (exit 1) / missing term (exit 1) | `test_fm_aliases_search_nomatch` | `help:aliases` | `examples/example-dot-aliases.sh` | `docs/manual/command-index.md` | regression |
263
+ | `dot aliases` | why <alias> | `test_fm_aliases_why` | `run:aliases-why` | `examples/example-dot-aliases.sh` | `docs/manual/command-index.md` | regression |
264
+ | `dot aliases` | why <unknown> (exit 1) | `test_fm_aliases_why_unknown` | `help:aliases` | `examples/example-dot-aliases.sh` | `docs/manual/command-index.md` | regression |
265
+ | `dot aliases` | stats (reads $HISTFILE) | `test_fm_aliases_stats` | `run:aliases-stats` | `examples/example-dot-aliases.sh` | `docs/manual/command-index.md` | regression |
266
+ | `dot aliases` | stats (no history file, exit 1) | `test_fm_aliases_stats_missing` | `help:aliases` | `examples/example-dot-aliases.sh` | `docs/manual/command-index.md` | regression |
267
+ | `dot aliases` | cheatsheet --output / -o <path> | `test_fm_aliases_cheatsheet` | `help:aliases` | `examples/example-dot-aliases.sh` | `docs/manual/command-index.md` | regression |
268
+ | `dot aliases` | cheatsheet --output - | `test_fm_aliases_cheatsheet_stdout` | `run:aliases-cheatsheet` | `examples/example-dot-aliases.sh` | `docs/manual/command-index.md` | regression |
269
+ | `dot aliases` | cheatsheet (writes docs/ALIASES_CHEATSHEET.md in the source tree) | `test_fm_aliases_cheatsheet_default` | `help:aliases` | `examples/example-dot-aliases.sh` | `docs/manual/command-index.md` | regression |
270
+ | `dot aliases` | tiers | `test_fm_aliases_tiers` | `run:aliases-tiers` | `examples/example-dot-aliases.sh` | `docs/manual/command-index.md` | regression |
271
+ | `dot aliases` | DOTFILES_ALIAS_PROFILE / DOTFILES_ALIAS_ECOSYSTEMS / DOTFILES_ALIAS_BUCKETS / DOTFILES_SECURITY_MODE / DOTFILES_ENABLE_DANGEROUS_ALIASES | `test_fm_env_dotfiles_alias_tiers` | `help:aliases` | `examples/example-dot-aliases.sh` | `docs/manual/03-reference/03-environment.md` | regression |
272
+ | `dot aliases` | <unknown> (exit 1) | `test_fm_aliases_unknown` | `help:aliases` | `examples/example-dot-aliases.sh` | `docs/manual/command-index.md` | regression |
273
+ | `dot alias-check` | (default) | `test_fm_alias_check` | `run:alias-check` | `examples/example-dot-aliases.sh` | `docs/manual/command-index.md` | regression |
274
+ | `dot setup` | (interactive gum wizard) | `test_fm_smoke_setup` | `help:setup` | `examples/example-dot-tools.sh` | `docs/manual/command-index.md` | **smoke** — interactive gum selection wizard (TTY) |
275
+ | `dot log-rotate` | (default) | `test_fm_log_rotate` | `run:log-rotate` | `examples/example-dot-tools.sh` | `docs/manual/command-index.md` | regression |
276
+
277
+ ## lint.sh
278
+
279
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
280
+ |---------|---------|-----------------|-----------|---------|--------|----------|
281
+ | `dot lint` | (default: shellcheck + shfmt report) | `test_fm_lint` | `help:lint` | `examples/example-dot-lint.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
282
+ | `dot lint` | --check / -c (exit 1 on findings) | `test_fm_lint_check` | `help:lint` | `examples/example-dot-lint.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
283
+ | `dot lint` | --fix / -f (rewrites files with shfmt) | `test_fm_lint_fix` | `help:lint` | `examples/example-dot-lint.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
284
+
285
+ ## appearance.sh
286
+
287
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
288
+ |---------|---------|-----------------|-----------|---------|--------|----------|
289
+ | `dot theme` | (default) | `test_fm_theme` | `run:theme` | `examples/example-dot-appearance.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
290
+ | `dot theme` | list | `test_fm_theme_list` | `run:theme-list` | `examples/example-dot-appearance.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
291
+ | `dot theme` | current | `test_fm_theme_current` | `run:theme-current` | `examples/example-dot-appearance.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
292
+ | `dot theme` | set with no name: reports a diagnostic and leaves the theme unchanged | `test_fm_theme_set_missing` | `help:theme` | `examples/example-dot-appearance.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
293
+ | `dot theme` | set <name> / light / dark | `test_fm_smoke_theme_set` | `help:theme` | `examples/example-dot-appearance.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — switches the OS appearance and rewrites terminal configs (osascript / gsettings) |
294
+ | `dot theme` | toggle | `test_fm_smoke_theme_toggle` | `help:theme` | `examples/example-dot-appearance.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — switches the OS appearance (system mutation) |
295
+ | `dot theme` | sync | `test_fm_smoke_theme_sync` | `help:theme` | `examples/example-dot-appearance.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — rewrites terminal configs to follow the OS appearance (system mutation) |
296
+ | `dot theme` | family | `test_fm_smoke_theme_family` | `help:theme` | `examples/example-dot-appearance.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — cycles the theme family and applies it (system mutation) |
297
+ | `dot theme` | rebuild | `test_fm_smoke_theme_rebuild` | `help:theme` | `examples/example-dot-appearance.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — regenerates every theme from wallpapers (minutes of image processing) |
298
+ | `dot wallpaper` | (default = sync) | `test_fm_smoke_wallpaper` | `help:wallpaper` | `examples/example-dot-appearance.sh` | `docs/manual/command-index.md` | **smoke** — sets the desktop wallpaper through osascript / feh (system mutation) |
299
+ | `dot wallpaper` | sync | `test_fm_smoke_wallpaper_sync` | `help:wallpaper` | `examples/example-dot-appearance.sh` | `docs/manual/command-index.md` | **smoke** — sets the desktop wallpaper (system mutation) |
300
+ | `dot wallpaper` | rotate (--interval, --once, --light, --dark) | `test_fm_smoke_wallpaper_rotate` | `help:wallpaper` | `examples/example-dot-appearance.sh` | `docs/manual/command-index.md` | **smoke** — sets the desktop wallpaper (system mutation) |
301
+ | `dot fonts` | (default = install) | `test_fm_smoke_fonts` | `help:fonts` | `examples/example-dot-appearance.sh` | `docs/manual/command-index.md` | **smoke** — downloads and installs Nerd Fonts into the user font directory (network) |
302
+ | `dot fonts` | install [font] | `test_fm_smoke_fonts_install` | `help:fonts` | `examples/example-dot-appearance.sh` | `docs/manual/command-index.md` | **smoke** — downloads and installs Nerd Fonts (network) |
303
+ | `dot fonts` | patch <font-file> [output-dir] | `test_fm_fonts_patch_usage` | `help:fonts` | `examples/example-dot-appearance.sh` | `docs/manual/command-index.md` | regression |
304
+ | `dot tune` | (default) | `test_fm_smoke_tune` | `help:tune` | `examples/example-dot-appearance.sh` | `docs/manual/command-index.md` | **smoke** — writes OS defaults / sysctl values (system mutation, sudo) |
305
+
306
+ ## secrets.sh
307
+
308
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
309
+ |---------|---------|-----------------|-----------|---------|--------|----------|
310
+ | `dot secrets-init` | (default; creates the age key) | `test_fm_secrets_init` | `help:secrets-init` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
311
+ | `dot secrets` | edit (default) | `test_fm_secrets_edit` | `help:secrets` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
312
+ | `dot secrets` | edit without an age key (exit 1) | `test_fm_secrets_edit_no_key` | `run:secrets-edit-nokey` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
313
+ | `dot secrets` | set <KEY> <VALUE> | `test_fm_secrets_set` | `help:secrets` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
314
+ | `dot secrets` | set (no key, exit 1) | `test_fm_secrets_set_usage` | `run:secrets-set-usage` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
315
+ | `dot secrets` | set <KEY> (prompts for the value) | `test_fm_smoke_secrets_set_prompt` | `help:secrets` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — reads the secret value from an interactive silent prompt (TTY) |
316
+ | `dot secrets` | get <KEY> (masked) | `test_fm_secrets_get` | `help:secrets` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
317
+ | `dot secrets` | get <KEY> --raw | `test_fm_secrets_get_raw` | `help:secrets` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
318
+ | `dot secrets` | get <unknown> (exit 1) / get without key (exit 1) | `test_fm_secrets_get_missing` | `run:secrets-get-missing` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
319
+ | `dot secrets` | list | `test_fm_secrets_list` | `run:secrets-list` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
320
+ | `dot secrets` | load [bucket] (posix export lines) | `test_fm_secrets_load` | `help:secrets` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
321
+ | `dot secrets` | load --shell fish | `test_fm_secrets_load_fish` | `help:secrets` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
322
+ | `dot secrets` | load --shell=nu / nushell | `test_fm_secrets_load_nu` | `help:secrets` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
323
+ | `dot secrets` | load <bucket> with nothing stored (exit 1) / unknown flag (exit 1) | `test_fm_secrets_load_empty` | `run:secrets-load-empty` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
324
+ | `dot secrets` | provider | `test_fm_secrets_provider` | `run:secrets-provider` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
325
+ | `dot secrets` | DOTFILES_SECRETS_PROVIDER / DOT_SECRETS_HOME select the backend and store | `test_fm_env_dotfiles_secrets_provider` | `help:secrets` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/03-environment.md` | regression |
326
+ | `dot secrets` | .chezmoidata.toml `[secrets.policy] provider` / `auto_load` defaults | `test_fm_config_secrets_policy` | `help:secrets` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/02-config-files.md` | regression |
327
+ | `dot secrets` | <unknown> (exit 1) | `test_fm_secrets_unknown` | `help:secrets` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
328
+ | `dot env` | load [bucket] (secrets.sh alias of secrets load) | `test_fm_secrets_env_load` | `help:env` | `examples/example-dot-secrets.sh` | `docs/manual/command-index.md` | regression |
329
+ | `dot secrets-create` | [name] (needs the age key) | `test_fm_secrets_create` | `help:secrets-create` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
330
+ | `dot secrets-create` | without an age key (exit 1) | `test_fm_secrets_create_no_key` | `run:secrets-create-nokey` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
331
+ | `dot ssh-key` | [key-path] (encrypts ~/.ssh/id_ed25519 with age) | `test_fm_ssh_key_missing` | `run:ssh-key-missing` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
332
+ | `dot ssh-cert` | (usage) / status / issue / revoke | `test_fm_ssh_cert_usage` | `run:ssh-cert-usage` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
333
+ | `dot ssh-cert` | status | `test_fm_ssh_cert_status` | `run:ssh-cert-status` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
334
+ | `dot ssh-cert` | issue [--ttl] [--principal] / revoke | `test_fm_smoke_ssh_cert_issue` | `help:ssh-cert` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — contacts a step-ca server and rewrites ~/.ssh certificates (network) |
335
+
336
+ ## security.sh
337
+
338
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
339
+ |---------|---------|-----------------|-----------|---------|--------|----------|
340
+ | `dot backup` | (default; DOTFILES_BACKUP_DIR / DOTFILES_BACKUP_SRC) | `test_fm_backup` | `help:backup` | `examples/example-dot-security.sh` | `docs/manual/command-index.md` | regression |
341
+ | `dot encrypt-check` | (default) | `test_fm_encrypt_check` | `run:encrypt-check` | `examples/example-dot-security.sh` | `docs/manual/command-index.md` | regression |
342
+ | `dot firewall` | (default) | `test_fm_smoke_firewall` | `help:firewall` | `examples/example-dot-security.sh` | `docs/manual/command-index.md` | **smoke** — enables the OS firewall with sudo (system mutation) |
343
+ | `dot telemetry` | (refuses unless DOTFILES_TELEMETRY=1) | `test_fm_telemetry` | `run:telemetry` | `examples/example-dot-security.sh` | `docs/manual/command-index.md` | regression |
344
+ | `dot telemetry` | DOTFILES_TELEMETRY=1 | `test_fm_smoke_telemetry_apply` | `help:telemetry` | `examples/example-dot-security.sh` | `docs/manual/command-index.md` | **smoke** — disables OS telemetry services with sudo (system mutation) |
345
+ | `dot dns-doh` | (default) | `test_fm_smoke_dns_doh` | `help:dns-doh` | `examples/example-dot-security.sh` | `docs/manual/command-index.md` | **smoke** — rewrites the system resolver configuration with sudo (system mutation) |
346
+ | `dot lock-screen` | (default) | `test_fm_smoke_lock_screen` | `help:lock-screen` | `examples/example-dot-security.sh` | `docs/manual/command-index.md` | **smoke** — writes screensaver / idle-lock OS settings (system mutation) |
347
+ | `dot usb-safety` | (default) | `test_fm_smoke_usb_safety` | `help:usb-safety` | `examples/example-dot-security.sh` | `docs/manual/command-index.md` | **smoke** — writes udev / automount policy with sudo (system mutation) |
348
+ | `dot policy` | (default; needs opa + gitleaks) | `test_fm_policy` | `run:policy` | `examples/example-dot-security.sh` | `docs/manual/command-index.md` | regression |
349
+
350
+ ## meta.sh / agent.sh
351
+
352
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
353
+ |---------|---------|-----------------|-----------|---------|--------|----------|
354
+ | `dot upgrade` | (default) | `test_fm_smoke_upgrade` | `help:upgrade` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — runs nix flake update, chezmoi update, and a headless Neovim plugin sync (network, mutates $HOME) |
355
+ | `dot upgrade` | DOTFILES_FONTS=1 adds the Nerd Font step to upgrade | `test_fm_smoke_env_dotfiles_fonts` | `help:upgrade` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/03-environment.md` | **smoke** — only observable inside the real upgrade run (network) |
356
+ | `dot cache-refresh` | (default) | `test_fm_cache_refresh` | `run:cache-refresh` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
357
+ | `dot prewarm` | alias of cache-refresh | `test_fm_prewarm` | `help:prewarm` | `examples/example-dot-meta.sh` | `docs/manual/command-index.md` | regression |
358
+ | `dot cache-refresh` | XDG_CACHE_HOME receives the regenerated shell caches | `test_fm_env_xdg_cache_home` | `help:cache-refresh` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/03-environment.md` | regression |
359
+ | `dot docs` | (default) | `test_fm_docs` | `run:docs` | `examples/example-dot-meta.sh` | `docs/manual/command-index.md` | regression |
360
+ | `dot learn` | (interactive tour) | `test_fm_learn` | `run:learn` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
361
+ | `dot keys` | (default catalog) | `test_fm_keys` | `run:keys` | `examples/example-dot-meta.sh` | `docs/manual/command-index.md` | regression |
362
+ | `dot keys` | sign-check | `test_fm_keys_sign_check` | `run:keys-sign-check` | `examples/example-dot-meta.sh` | `docs/manual/command-index.md` | regression |
363
+ | `dot keys` | sign-check with an ssh signing key configured | `test_fm_keys_sign_check_ssh` | `help:keys` | `examples/example-dot-meta.sh` | `docs/manual/command-index.md` | regression |
364
+ | `dot sandbox` | (default) | `test_fm_smoke_sandbox` | `help:sandbox` | `examples/example-dot-meta.sh` | `docs/manual/command-index.md` | **smoke** — builds and runs a Docker/Podman image interactively (network, TTY) |
365
+ | `dot mcp` | (default = doctor) | `test_fm_mcp` | `run:mcp` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
366
+ | `dot mcp doctor` | (default) | `test_fm_mcp_doctor` | `run:mcp-doctor` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
367
+ | `dot mcp doctor` | --json / -j, --strict / -s | `test_fm_mcp_doctor_json` | `run:mcp-doctor-json` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
368
+ | `dot mcp registry` | (default table) | `test_fm_mcp_registry` | `run:mcp-registry` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
369
+ | `dot mcp registry` | --json / -j | `test_fm_mcp_registry_json` | `run:mcp-registry-json` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
370
+ | `dot mcp registry` | MCP_REGISTRY_CONFIG overrides the registry file | `test_fm_env_mcp_registry_config` | `help:mcp` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/03-environment.md` | regression |
371
+ | `dot mcp registry` | dot_config/dotfiles/mcp-registry.json `servers` map | `test_fm_config_mcp_registry_json` | `help:mcp` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/02-config-files.md` | regression |
372
+ | `dot mcp serve` | stdio MCP server: JSON-RPC 2.0 on stdin/stdout, EOF shuts down | `test_fm_mcp_serve` | `help:mcp` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
373
+ | `dot mcp` | <unknown> (usage, exit 1) | `test_fm_mcp_unknown` | `help:mcp` | `examples/example-dot-meta.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
374
+ | `dot mode` | (default = current) | `test_fm_mode` | `run:mode` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
375
+ | `dot mode list` | (default) | `test_fm_mode_list` | `run:mode-list` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
376
+ | `dot mode current` | (default) | `test_fm_mode_current` | `run:mode-current` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
377
+ | `dot mode show` | <profile> | `test_fm_mode_show` | `run:mode-show` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
378
+ | `dot mode show` | <unknown> (exit 1) / missing name (exit 1) | `test_fm_mode_show_unknown` | `help:mode` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
379
+ | `dot mode set` | <profile> (writes agent-mode.env) | `test_fm_mode_set` | `help:mode` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
380
+ | `dot mode set` | <unknown> (exit 1) | `test_fm_mode_set_unknown` | `help:mode` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
381
+ | `dot mode set` | refused by strict RBAC enforcement (exit 1) | `test_fm_mode_set_rbac_strict` | `help:mode` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
382
+ | `dot mode run` | [profile] <command> (checkpointed) | `test_fm_mode_run` | `run:mode-run` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
383
+ | `dot mode run` | (no command, exit 1) | `test_fm_mode_run_usage` | `help:mode` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
384
+ | `dot mode run` | propagates the wrapped command's exit code | `test_fm_mode_run_exit_code` | `help:mode` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
385
+ | `dot mode doctor` | (default) | `test_fm_mode_doctor` | `run:mode-doctor` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
386
+ | `dot mode` | <unknown> (usage, exit 1) | `test_fm_mode_unknown` | `help:mode` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
387
+ | `dot mode` | AGENT_PROFILE_CONFIG / AGENT_STATE_FILE override the profiles file and state file | `test_fm_env_agent_profile_config` | `help:mode` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/03-environment.md` | regression |
388
+ | `dot mode` | dot_config/dotfiles/agent-profiles.json `defaultProfile` / `profiles` / `rbac` / `delegation` | `test_fm_config_agent_profiles_json` | `help:mode` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/02-config-files.md` | regression |
389
+ | `dot mode` | ~/.config/dotfiles/agent-mode.env state file (DOT_AGENT_PROFILE …) | `test_fm_config_agent_mode_env` | `help:mode` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/02-config-files.md` | regression |
390
+ | `dot agent` | (default = current profile) | `test_fm_agent` | `run:agent` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
391
+ | `dot agent card` | (default table) | `test_fm_agent_card` | `run:agent-card` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
392
+ | `dot agent card` | --json | `test_fm_agent_card_json` | `run:agent-card-json` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
393
+ | `dot agent card` | AGENT_CARD_CONFIG overrides the card file | `test_fm_env_agent_card_config` | `help:agent` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/03-environment.md` | regression |
394
+ | `dot agent card` | dot_config/dotfiles/agent-card.json `name` / `version` / `protocols` / `platforms` | `test_fm_config_agent_card_json` | `help:agent` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/02-config-files.md` | regression |
395
+ | `dot agent log` | [count] | `test_fm_agent_log` | `run:agent-log` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
396
+ | `dot agent checkpoint` | list (default) [count] | `test_fm_agent_checkpoint_list` | `run:agent-checkpoint-list` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
397
+ | `dot agent checkpoint` | save [profile] <command> | `test_fm_agent_checkpoint_save` | `help:agent` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
398
+ | `dot agent checkpoint` | save (no command, exit 1) | `test_fm_agent_checkpoint_save_usage` | `help:agent` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
399
+ | `dot agent checkpoint` | show <id> [--json / -j] | `test_fm_agent_checkpoint_show` | `help:agent` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
400
+ | `dot agent checkpoint` | show <unknown> (exit 1) / missing id (exit 1) | `test_fm_agent_checkpoint_show_unknown` | `help:agent` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
401
+ | `dot agent checkpoint` | replay <id> | `test_fm_agent_checkpoint_replay` | `help:agent` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
402
+ | `dot agent checkpoint` | replay (no id, exit 1) / <unknown action> (exit 1) | `test_fm_agent_checkpoint_replay_usage` | `help:agent` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
403
+ | `dot agent delegate` | <name> <command> (delegation enabled) | `test_fm_agent_delegate` | `help:agent` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
404
+ | `dot agent delegate` | refused when delegation is disabled (exit 1) / unknown delegate (exit 1) | `test_fm_agent_delegate_disabled` | `run:agent-delegate-usage` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
405
+ | `dot agent delegate` | (no name or command, exit 1) | `test_fm_agent_delegate_usage` | `help:agent` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
406
+ | `dot agent a2a-card` | (default) | `test_fm_agent_a2a_card` | `run:agent-a2a-card` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
407
+ | `dot agent a2a-card` | --json / -j | `test_fm_agent_a2a_card_json` | `run:agent-a2a-card-json` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
408
+ | `dot agent a2a-card` | --validate / --strict / -s | `test_fm_agent_a2a_card_validate` | `run:agent-a2a-card-validate` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
409
+ | `dot agent conformance` | (default) | `test_fm_agent_conformance` | `run:agent-conformance` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
410
+ | `dot agent conformance` | --json / -j, --strict / -s | `test_fm_agent_conformance_json` | `run:agent-conformance-json` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
411
+ | `dot agent` | <unknown> (usage, exit 1) | `test_fm_agent_unknown` | `help:agent` | `examples/example-dot-agent.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
412
+
413
+ ## agents.sh
414
+
415
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
416
+ |---------|---------|-----------------|-----------|---------|--------|----------|
417
+ | `dot agents list` | (default) | `test_fm_agents_list` | `run:agents-list` | `examples/example-dot-agents.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
418
+ | `dot agents check` | (in sync, exit 0) | `test_fm_agents_check` | `run:agents-check` | `examples/example-dot-agents.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
419
+ | `dot agents check` | (AGENTS.md missing or drifted, exit 1) | `test_fm_agents_check_drift` | `help:agents` | `examples/example-dot-agents.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
420
+ | `dot agents render` | (writes AGENTS.md + harness stubs) | `test_fm_agents_render` | `help:agents` | `examples/example-dot-agents.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
421
+ | `dot agents` | --help / -h / help | `test_fm_agents_help` | `help:agents` | `examples/example-dot-agents.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
422
+ | `dot agents` | <unknown> (exit 1) | `test_fm_agents_unknown` | `help:agents` | `examples/example-dot-agents.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
423
+
424
+ ## fleet.sh
425
+
426
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
427
+ |---------|---------|-----------------|-----------|---------|--------|----------|
428
+ | `dot fleet` | (default = status) | `test_fm_fleet` | `run:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
429
+ | `dot fleet` | --json / -j | `test_fm_fleet_json` | `run:fleet-json` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
430
+ | `dot fleet status` | (default) | `test_fm_fleet_status` | `run:fleet-status` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
431
+ | `dot fleet status` | --json / -j | `test_fm_fleet_status_json` | `run:fleet-status-json` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
432
+ | `dot fleet status` | .chezmoidata.toml `node_id` / `namespace` fleet keys | `test_fm_config_fleet_node_id` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/02-config-files.md` | regression |
433
+ | `dot fleet drift` | check (default) | `test_fm_fleet_drift` | `run:fleet-drift` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
434
+ | `dot fleet drift` | history [count] | `test_fm_fleet_drift_history` | `run:fleet-drift-history` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
435
+ | `dot fleet drift` | predict | `test_fm_fleet_drift_predict` | `run:fleet-drift-predict` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
436
+ | `dot fleet drift` | <unknown> (exit 1) | `test_fm_fleet_drift_unknown` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
437
+ | `dot fleet events` | [count] | `test_fm_fleet_events` | `run:fleet-events` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
438
+ | `dot fleet events` | (no events recorded yet) | `test_fm_fleet_events_empty` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
439
+ | `dot fleet namespace` | show (default) | `test_fm_fleet_namespace` | `run:fleet-namespace` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
440
+ | `dot fleet ns` | alias of fleet namespace | `test_fm_fleet_ns_alias` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
441
+ | `dot fleet namespace` | set <name> (writes .chezmoidata.toml) | `test_fm_fleet_namespace_set` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
442
+ | `dot fleet namespace` | set <invalid> (exit 1) / set (no name, exit 1) / <unknown> (exit 1) | `test_fm_fleet_namespace_set_invalid` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
443
+ | `dot fleet enforce` | status (default) | `test_fm_fleet_enforce` | `run:fleet-enforce` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
444
+ | `dot fleet enforce` | set advisory\|strict (writes agent-profiles.json) | `test_fm_fleet_enforce_set` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
445
+ | `dot fleet enforce` | set <invalid> (exit 1) / set (no mode, exit 1) / <unknown> (exit 1) | `test_fm_fleet_enforce_set_invalid` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
446
+ | `dot fleet apply` | --dry-run / -n | `test_fm_fleet_apply_dry_run` | `run:fleet-apply-dry-run` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
447
+ | `dot fleet apply` | --host <name>, --cmd <shell>, --jobs / -j <n> | `test_fm_fleet_apply_host_cmd` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
448
+ | `dot fleet apply` | --host <unknown> (exit 1) / unknown flag (exit 1) | `test_fm_fleet_apply_host_unknown` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
449
+ | `dot fleet apply` | --verify-hosts | `test_fm_fleet_apply_verify_hosts` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
450
+ | `dot fleet apply` | (no fleet.toml, exit 1) | `test_fm_fleet_apply_no_hosts` | `run:fleet-apply-nohosts` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
451
+ | `dot fleet apply` | --help / -h | `test_fm_fleet_apply_help` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
452
+ | `dot fleet apply` | (real SSH fan-out) | `test_fm_smoke_fleet_apply_ssh` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — opens SSH connections to every registered host (network) |
453
+ | `dot fleet push` | alias of fleet apply | `test_fm_fleet_push_alias` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
454
+ | `dot fleet apply` | DOTFILES_FLEET_HOSTS overrides the hosts file | `test_fm_env_dotfiles_fleet_hosts` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/03-environment.md` | regression |
455
+ | `dot fleet apply` | ~/.config/dotfiles/fleet.toml `[hosts.<name>]` ssh / profile | `test_fm_config_fleet_toml` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/02-config-files.md` | regression |
456
+ | `dot fleet` | <unknown> (prints command list) | `test_fm_fleet_unknown` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
457
+
458
+ ## registry.sh
459
+
460
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
461
+ |---------|---------|-----------------|-----------|---------|--------|----------|
462
+ | `dot registry list` | (default) | `test_fm_registry_list` | `run:registry-list` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
463
+ | `dot registry list` | (registry with no modules) | `test_fm_registry_list_empty` | `help:registry` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
464
+ | `dot registry search` | <q> | `test_fm_registry_search` | `run:registry-search` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
465
+ | `dot registry search` | (no query, exit 1) | `test_fm_registry_search_usage` | `help:registry` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
466
+ | `dot registry info` | <name> | `test_fm_registry_info` | `run:registry-info` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
467
+ | `dot registry info` | <unknown> (exit 1) / missing name (exit 1) | `test_fm_registry_info_unknown` | `help:registry` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
468
+ | `dot registry install` | <name> (preview) / --dry-run / -n | `test_fm_registry_install_dry_run` | `run:registry-install-dry-run` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
469
+ | `dot registry install` | <name> --yes / -y (verifies sha256, applies) | `test_fm_registry_install_yes` | `help:registry` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
470
+ | `dot registry install` | missing name (exit 1) / unknown module (exit 1) / unknown option (exit 2) | `test_fm_registry_install_errors` | `help:registry` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
471
+ | `dot registry install` | rejects an archive whose sha256 does not match (exit 1) | `test_fm_registry_install_sha_mismatch` | `help:registry` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
472
+ | `dot registry installed` | (default) | `test_fm_registry_installed` | `run:registry-installed` | `examples/example-dot-registry.sh` | `docs/manual/command-index.md` | regression |
473
+ | `dot registry url` | (default) | `test_fm_registry_url` | `run:registry-url` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
474
+ | `dot registry set-url` | <https-or-file url> (writes registry.toml) | `test_fm_registry_set_url` | `help:registry` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
475
+ | `dot registry set-url` | rejects non-https (exit 1) / missing url (exit 1) | `test_fm_registry_set_url_invalid` | `help:registry` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
476
+ | `dot registry url` | DOTFILES_REGISTRY_URL one-shot override | `test_fm_env_dotfiles_registry_url` | `help:registry` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/03-environment.md` | regression |
477
+ | `dot registry url` | ~/.config/dotfiles/registry.toml `url` key | `test_fm_config_registry_toml` | `help:registry` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/02-config-files.md` | regression |
478
+ | `dot registry` | --help / -h / help | `test_fm_registry_help` | `help:registry` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
479
+ | `dot registry` | <unknown> (exit 1) | `test_fm_registry_unknown` | `help:registry` | `examples/example-dot-registry.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
480
+
481
+ ## patterns.sh
482
+
483
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
484
+ |---------|---------|-----------------|-----------|---------|--------|----------|
485
+ | `dot patterns list` | (default) | `test_fm_patterns_list` | `run:patterns-list` | `examples/example-dot-patterns.sh` | `docs/manual/command-index.md` | regression |
486
+ | `dot patterns view` | <name> | `test_fm_patterns_view` | `run:patterns-view` | `examples/example-dot-patterns.sh` | `docs/manual/command-index.md` | regression |
487
+ | `dot patterns view` | (no name, exit 1) / unknown pattern | `test_fm_patterns_view_missing` | `help:patterns` | `examples/example-dot-patterns.sh` | `docs/manual/command-index.md` | regression |
488
+ | `dot patterns edit` | <name> (opens $EDITOR) | `test_fm_patterns_edit` | `help:patterns` | `examples/example-dot-patterns.sh` | `docs/manual/command-index.md` | regression |
489
+ | `dot patterns edit` | (no name, exit 1) | `test_fm_patterns_edit_missing` | `help:patterns` | `examples/example-dot-patterns.sh` | `docs/manual/command-index.md` | regression |
490
+ | `dot patterns` | <unknown> (usage, exit 1) | `test_fm_patterns_unknown` | `help:patterns` | `examples/example-dot-patterns.sh` | `docs/manual/command-index.md` | regression |
491
+ | `dot patterns list` | XDG_CONFIG_HOME/ai/patterns is the pattern directory | `test_fm_env_xdg_config_home` | `help:patterns` | `examples/example-dot-patterns.sh` | `docs/manual/03-reference/03-environment.md` | regression |
492
+
493
+ ## completion.sh
494
+
495
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
496
+ |---------|---------|-----------------|-----------|---------|--------|----------|
497
+ | `dot completion` | bash | `test_fm_completion_bash` | `run:completion-bash` | `examples/example-dot-completion.sh` | `docs/manual/command-index.md` | regression |
498
+ | `dot completion` | zsh | `test_fm_completion_zsh` | `run:completion-zsh` | `examples/example-dot-completion.sh` | `docs/manual/command-index.md` | regression |
499
+ | `dot completion` | fish | `test_fm_completion_fish` | `run:completion-fish` | `examples/example-dot-completion.sh` | `docs/manual/command-index.md` | regression |
500
+ | `dot completion` | nu / nushell | `test_fm_completion_nu` | `run:completion-nu` | `examples/example-dot-completion.sh` | `docs/manual/command-index.md` | regression |
501
+ | `dot completion` | (no shell prints usage) / --help | `test_fm_completion_usage` | `run:completion-usage` | `examples/example-dot-completion.sh` | `docs/manual/command-index.md` | regression |
502
+ | `dot completion` | <unknown shell> (exit 1) | `test_fm_completion_unknown` | `help:completion` | `examples/example-dot-completion.sh` | `docs/manual/command-index.md` | regression |
503
+
504
+ ## init.sh
505
+
506
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
507
+ |---------|---------|-----------------|-----------|---------|--------|----------|
508
+ | `dot init` | <user> --dry-run / -n | `test_fm_init_dry_run` | `run:init-dry-run` | `examples/example-dot-init.sh` | `docs/manual/command-index.md` | regression |
509
+ | `dot init` | <owner/repo> shorthand | `test_fm_init_owner_repo` | `help:init` | `examples/example-dot-init.sh` | `docs/manual/command-index.md` | regression |
510
+ | `dot init` | <https url> --no-apply | `test_fm_init_url_no_apply` | `help:init` | `examples/example-dot-init.sh` | `docs/manual/command-index.md` | regression |
511
+ | `dot init` | rejects plain http:// (exit 2) / invalid characters (exit 2) | `test_fm_init_reject_http` | `help:init` | `examples/example-dot-init.sh` | `docs/manual/command-index.md` | regression |
512
+ | `dot init` | missing target (exit 1) / unknown flag (exit 1) / too many args (exit 1) | `test_fm_init_usage` | `run:init-usage` | `examples/example-dot-init.sh` | `docs/manual/command-index.md` | regression |
513
+ | `dot init` | --help / -h | `test_fm_init_help` | `help:init` | `examples/example-dot-init.sh` | `docs/manual/command-index.md` | regression |
514
+ | `dot init` | <user> (clone + apply), --force / -f | `test_fm_smoke_init_apply` | `help:init` | `examples/example-dot-init.sh` | `docs/manual/command-index.md` | **smoke** — clones a remote repository and applies it over $HOME (network) |
515
+ | `dot init` | DOTFILES_NONINTERACTIVE=1 skips the trust confirmation | `test_fm_smoke_env_dotfiles_noninteractive` | `help:init` | `examples/example-dot-init.sh` | `docs/manual/03-reference/03-environment.md` | **smoke** — the prompt only fires on a TTY before a real clone (network) |
516
+
517
+ ## manual.sh
518
+
519
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
520
+ |---------|---------|-----------------|-----------|---------|--------|----------|
521
+ | `dot manual` | text --offline (pipes to $PAGER) | `test_fm_manual_text_offline` | `run:manual-text-offline` | `examples/example-dot-manual.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
522
+ | `dot manual` | download <fmt> --offline | `test_fm_manual_download_offline` | `help:manual` | `examples/example-dot-manual.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
523
+ | `dot manual` | --offline with no offline copy (exit 1) / --local with no build (exit 1) | `test_fm_manual_offline_missing` | `help:manual` | `examples/example-dot-manual.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
524
+ | `dot manual` | --help / -h | `test_fm_manual_help` | `run:manual-help` | `examples/example-dot-manual.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
525
+ | `dot manual` | html / html-multi / pdf / epub / markdown (default open) | `test_fm_smoke_manual_open` | `help:manual` | `examples/example-dot-manual.sh` | `docs/manual/03-reference/01-dot-cli.md` | **smoke** — downloads the manual and opens it in the desktop browser / viewer (network, GUI) |
526
+ | `dot manual` | DOTFILES_MANUAL_URL / --url= override the download base | `test_fm_smoke_env_dotfiles_manual_url` | `help:manual` | `examples/example-dot-manual.sh` | `docs/manual/03-reference/03-environment.md` | **smoke** — only exercised on the network download path |
527
+ | `dot manual` | XDG_DATA_HOME/dotfiles/manual holds the offline copy | `test_fm_env_xdg_data_home` | `help:manual` | `examples/example-dot-manual.sh` | `docs/manual/03-reference/03-environment.md` | regression |
528
+ | `dot manual` | PAGER receives the text manual | `test_fm_env_pager` | `help:manual` | `examples/example-dot-manual.sh` | `docs/manual/03-reference/03-environment.md` | regression |
529
+
530
+ ## cross-cutting invariants
531
+
532
+ | Command | Variant | Regression test | Benchmark | Example | Manual | Coverage |
533
+ |---------|---------|-----------------|-----------|---------|--------|----------|
534
+ | `dot ai` | every provider routed to ai.sh has a bridge row | `test_fm_ai_bridge_every_routed_provider_refuses` | `help:ai` | `examples/example-dot-ai.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
535
+ | `dot completion` | every dialect covers the command registry | `test_fm_completion_covers_the_registry` | `run:completion-bash` | `examples/example-dot-completion.sh` | `docs/manual/command-index.md` | regression |
536
+ | `dot fleet apply` | an injection-shaped ssh target aborts the fan-out | `test_fm_fleet_apply_rejects_injection_hostname` | `help:fleet` | `examples/example-dot-fleet.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
537
+ | `dot secrets` | no default-mode command prints a stored value | `test_fm_secrets_never_leak_by_default` | `help:secrets` | `examples/example-dot-secrets.sh` | `docs/manual/03-reference/01-dot-cli.md` | regression |
538
+ | `dot firewall` | no security --help invokes sudo | `test_fm_security_help_does_not_mutate` | `help:firewall` | `examples/example-dot-security.sh` | `docs/manual/command-index.md` | regression |
539
+
540
+ ## Rows recorded as unmeasurable
541
+
542
+ Each of these has a `--help` smoke test, so none is fully uncovered. They are
543
+ listed together here so the reasons can be audited in one place rather than
544
+ hunted through the table.
545
+
546
+ | Command | Variant | Why it cannot be measured in CI |
547
+ |---------|---------|----------------------------------|
548
+ | `dot uninstall` | (prompts unless --force) | destructive — removes the managed environment from $HOME; only --help is exercised |
549
+ | `dot uninstall` | --force | destructive — --force skips the confirmation and purges real files |
550
+ | `dot doctor` | --benchmark / -b | runs tests/benchmark.sh (hyperfine over every shell, minutes) — covered by benches/bench.sh |
551
+ | `dot health` | --fix / -f, --force / -F | --fix re-applies chezmoi and rewrites shell configs in $HOME |
552
+ | `dot rollback` | rollback / rollback-to N / git-reset / restore FILE (--force, --dry-run, --verbose) | rewrites $HOME dotfiles from a backup and resets the git checkout |
553
+ | `dot load-bench-pty` | (default) | needs the chezmoi-rendered dot-load-benchmark-pty template and a pseudo-terminal |
554
+ | `dot chaos` | --force | deliberately deletes ~/.zshrc and terminal configs |
555
+ | `dot teleport` | user@host | opens an SSH session to a remote host (network) |
556
+ | `dot bundle` | [output-dir] | archives ~/.dotfiles plus tool caches with zstd (hundreds of MB, minutes) |
557
+ | `dot ai` | (default cockpit TUI) | launches the Bubble Tea cockpit / gum launcher (interactive TTY) |
558
+ | `dot ai tools` | install (alias of ai install) | installs AI CLIs through mise/native installers (network, mutates $HOME) |
559
+ | `dot ai run` | "<prompt>" one-shot on Claude | performs a paid LLM round-trip (network) |
560
+ | `dot ai` | "<prompt>" / <tool> "<prompt>" one-shot | performs a paid LLM round-trip (network) |
561
+ | `dot ai delegate` | "<prompt>" [max-turns] [agent] [timeout] | delegates to a paid model under agent policy (network) |
562
+ | `dot ai ask` | "<question>" RAG query | embeds the repo and calls an LLM (network) |
563
+ | `dot ai chat` | [tool] | starts an interactive AI session (TTY) |
564
+ | `dot ai install` | [tool] | installs AI CLIs (network, mutates $HOME) |
565
+ | `dot ai serve` | (default) | starts a long-running local gateway process bound to a port |
566
+ | `dot ai login` | (default) | interactive OAuth / API-key prompts (TTY, network) |
567
+ | `dot ai` | dashboard / dash (deprecated cockpit alias) | launches the cockpit TUI (interactive TTY) |
568
+ | `dot ai-setup` | deprecated alias of ai login | interactive tool authentication (TTY, network) |
569
+ | `dot cl` | "<prompt>" with an installed tool | performs a paid LLM round-trip (network) |
570
+ | `dot env` | prune --yes / -y | uninstalls orphan tool versions from the real mise store |
571
+ | `dot env` | install [tool@version] | downloads and installs toolchains through mise (network) |
572
+ | `dot env` | use <tool@version> | rewrites the user's mise config and installs tools (network) |
573
+ | `dot tools` | install (Nix develop shell) | enters an interactive `nix develop` shell (TTY, network) |
574
+ | `dot setup` | (interactive gum wizard) | interactive gum selection wizard (TTY) |
575
+ | `dot theme` | set <name> / light / dark | switches the OS appearance and rewrites terminal configs (osascript / gsettings) |
576
+ | `dot theme` | toggle | switches the OS appearance (system mutation) |
577
+ | `dot theme` | sync | rewrites terminal configs to follow the OS appearance (system mutation) |
578
+ | `dot theme` | family | cycles the theme family and applies it (system mutation) |
579
+ | `dot theme` | rebuild | regenerates every theme from wallpapers (minutes of image processing) |
580
+ | `dot wallpaper` | (default = sync) | sets the desktop wallpaper through osascript / feh (system mutation) |
581
+ | `dot wallpaper` | sync | sets the desktop wallpaper (system mutation) |
582
+ | `dot wallpaper` | rotate (--interval, --once, --light, --dark) | sets the desktop wallpaper (system mutation) |
583
+ | `dot fonts` | (default = install) | downloads and installs Nerd Fonts into the user font directory (network) |
584
+ | `dot fonts` | install [font] | downloads and installs Nerd Fonts (network) |
585
+ | `dot tune` | (default) | writes OS defaults / sysctl values (system mutation, sudo) |
586
+ | `dot secrets` | set <KEY> (prompts for the value) | reads the secret value from an interactive silent prompt (TTY) |
587
+ | `dot ssh-cert` | issue [--ttl] [--principal] / revoke | contacts a step-ca server and rewrites ~/.ssh certificates (network) |
588
+ | `dot firewall` | (default) | enables the OS firewall with sudo (system mutation) |
589
+ | `dot telemetry` | DOTFILES_TELEMETRY=1 | disables OS telemetry services with sudo (system mutation) |
590
+ | `dot dns-doh` | (default) | rewrites the system resolver configuration with sudo (system mutation) |
591
+ | `dot lock-screen` | (default) | writes screensaver / idle-lock OS settings (system mutation) |
592
+ | `dot usb-safety` | (default) | writes udev / automount policy with sudo (system mutation) |
593
+ | `dot upgrade` | (default) | runs nix flake update, chezmoi update, and a headless Neovim plugin sync (network, mutates $HOME) |
594
+ | `dot upgrade` | DOTFILES_FONTS=1 adds the Nerd Font step to upgrade | only observable inside the real upgrade run (network) |
595
+ | `dot sandbox` | (default) | builds and runs a Docker/Podman image interactively (network, TTY) |
596
+ | `dot fleet apply` | (real SSH fan-out) | opens SSH connections to every registered host (network) |
597
+ | `dot init` | <user> (clone + apply), --force / -f | clones a remote repository and applies it over $HOME (network) |
598
+ | `dot init` | DOTFILES_NONINTERACTIVE=1 skips the trust confirmation | the prompt only fires on a TTY before a real clone (network) |
599
+ | `dot manual` | html / html-multi / pdf / epub / markdown (default open) | downloads the manual and opens it in the desktop browser / viewer (network, GUI) |
600
+ | `dot manual` | DOTFILES_MANUAL_URL / --url= override the download base | only exercised on the network download path |
601
+
602
+ ## Findings this matrix produced
603
+
604
+ Building the coverage turned up defects in the CLI. Each was exercised by the
605
+ row that found it, commented at that row, and reported rather than silently
606
+ accommodated. Every one of them has since been fixed and pinned by a
607
+ regression test; what remains below is the one entry that is working as
608
+ designed.
609
+
610
+ | Severity | Where | What |
611
+ |----------|-------|------|
612
+ | Note | `scripts/dot/commands/env-emit.sh` | The `-h\|--help` arm of `dot_env_emit` is unreachable through the CLI: the dispatcher's universal `--help` intercept fires first and renders `dot help env`. Working as designed, but the sub-handler's usage text can only be read in the source. |
613
+
614
+ ### Commands that write into the checkout
615
+
616
+ These commands resolve their write target through `lib/dot/utils.sh`'s
617
+ `resolve_source_dir`, which probes the location of the sourced library BEFORE
618
+ `$CHEZMOI_SOURCE_DIR` and `$HOME`. Running `./bin/dot` from a checkout
619
+ therefore writes into that checkout whatever `HOME` says, so a sandboxed
620
+ `HOME` does not protect a working tree from them. The regression rows for
621
+ these drive a throwaway copy of the repo instead, and then assert the checkout
622
+ is still clean:
623
+
624
+ - `dot profile set` → `defaults/.chezmoidata.toml`
625
+ - `dot fleet namespace set` → `defaults/.chezmoidata.toml`
626
+ - `dot fleet enforce set` → `defaults/dot_config/dotfiles/agent-profiles.json`
627
+ - `dot aliases cheatsheet` (no `--output`) → `docs/ALIASES_CHEATSHEET.md`
628
+
629
+ `dot theme set` is NOT one of them, contrary to an earlier note here.
630
+ scripts/theme/switch.sh and bin/dot-theme-sync resolve the data file from
631
+ `$CHEZMOI_SOURCE_DIR`, then `$HOME/.dotfiles`, then
632
+ `$HOME/.local/share/chezmoi`, and refuse with "Dotfiles source not found"
633
+ when none exists — measured by pointing `$HOME/.dotfiles` at a synthetic tree
634
+ while running the checkout's `bin/dot`: the synthetic tree was written and the
635
+ checkout was untouched. It writes the checkout under this harness only because
636
+ the harness points both `CHEZMOI_SOURCE_DIR` and `$HOME/.dotfiles` at it. It
637
+ also drives the real OS appearance, which is why it stays a smoke row.
638
+
639
+ ## See also
640
+
641
+ - `docs/manual/command-index.md` — generated index of every routable command
642
+ - `docs/manual/03-reference/01-dot-cli.md` — the CLI reference
643
+ - `docs/manual/03-reference/02-config-files.md` — config file schemas
644
+ - `docs/manual/03-reference/03-environment.md` — environment variables
645
+ - `CONTRIBUTING.md` — the "Regression tests" trace-header convention
646
+