@sebastienrousseau/dotfiles 0.2.519 → 0.2.521

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/CHANGELOG.md +200 -0
  2. package/LICENSE-APACHE +190 -0
  3. package/{LICENSE → LICENSE-MIT} +1 -1
  4. package/README.md +1172 -166
  5. package/install.sh +77 -11
  6. package/package.json +8 -8
  7. package/tools/README.md +49 -0
  8. package/tools/ci/install-chezmoi-verified.sh +68 -0
  9. package/docs/.vitepress/reports/localization-readability-audit.md +0 -73
  10. package/docs/AI.md +0 -179
  11. package/docs/CNAME +0 -1
  12. package/docs/CONFIG_STRATEGY.md +0 -124
  13. package/docs/COPYRIGHT +0 -7
  14. package/docs/GOVERNANCE.md +0 -98
  15. package/docs/MAINTAINERS.md +0 -41
  16. package/docs/NAMING_CONVENTIONS.md +0 -102
  17. package/docs/OPENCODE.md +0 -127
  18. package/docs/README.md +0 -84
  19. package/docs/STRUCTURE.md +0 -102
  20. package/docs/adr/ADR-001-ci-cd-pipeline.md +0 -118
  21. package/docs/adr/ADR-002-shell-performance.md +0 -130
  22. package/docs/adr/ADR-003-security-first.md +0 -158
  23. package/docs/adr/ADR-004-cli-architecture.md +0 -171
  24. package/docs/adr/ADR-005-chezmoi-choice.md +0 -99
  25. package/docs/adr/ADR-006-shell-selection.md +0 -124
  26. package/docs/adr/ADR-007-multi-shell-parity.md +0 -62
  27. package/docs/adr/ADR-008-alias-system-architecture.md +0 -95
  28. package/docs/adr/ADR-009-wallpaper-driven-theming.md +0 -131
  29. package/docs/adr/ADR-010-starship-transient-prompt.md +0 -144
  30. package/docs/adr/ADR-011-nushell-tier3-keep.md +0 -144
  31. package/docs/adr/ADR-012-ai-fleet-local-proxy.md +0 -79
  32. package/docs/adr/README.md +0 -40
  33. package/docs/architecture/AI_COST_OPTIMIZATION.md +0 -144
  34. package/docs/architecture/ARCHITECTURE.md +0 -117
  35. package/docs/architecture/INTEROP.md +0 -44
  36. package/docs/architecture/REPO_LAYOUT.md +0 -241
  37. package/docs/architecture/WALKTHROUGH.md +0 -86
  38. package/docs/architecture/fleet-deployment.md +0 -77
  39. package/docs/archive/EUXIS_2026_REVIEW.md +0 -127
  40. package/docs/archive/LEGACY_ROADMAP.md +0 -6
  41. package/docs/archive/MILESTONE_v0.2.493.md +0 -47
  42. package/docs/archive/PLAN.md +0 -199
  43. package/docs/archive/REPO_AUDIT.md +0 -31
  44. package/docs/articles/.pages +0 -6
  45. package/docs/articles/2026-07-05-custom-mkdocs-material-dark-theme.md +0 -216
  46. package/docs/articles/2026-07-05-fish-startup-abbr.md +0 -153
  47. package/docs/articles/2026-07-05-master-to-main-rename-runbook.md +0 -128
  48. package/docs/articles/index.md +0 -36
  49. package/docs/guides/INSTALL.md +0 -144
  50. package/docs/guides/NEOVIM_IDE_GUIDE.md +0 -61
  51. package/docs/guides/THEMING.md +0 -230
  52. package/docs/guides/TROUBLESHOOTING.md +0 -176
  53. package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +0 -792
  54. package/docs/index.md +0 -132
  55. package/docs/interop/A2A.md +0 -39
  56. package/docs/interop/POWERSHELL.md +0 -102
  57. package/docs/manual/00-introduction.md +0 -89
  58. package/docs/manual/01-concepts/01-architecture.md +0 -138
  59. package/docs/manual/01-concepts/02-trust-model.md +0 -183
  60. package/docs/manual/01-concepts/03-theme-engine.md +0 -186
  61. package/docs/manual/01-concepts/04-fleet.md +0 -148
  62. package/docs/manual/01-concepts/05-self-healing.md +0 -204
  63. package/docs/manual/02-tutorials/01-first-install.md +0 -197
  64. package/docs/manual/02-tutorials/02-add-wallpaper.md +0 -216
  65. package/docs/manual/02-tutorials/03-create-profile.md +0 -244
  66. package/docs/manual/02-tutorials/04-encrypt-secret.md +0 -281
  67. package/docs/manual/02-tutorials/05-deploy-fleet.md +0 -283
  68. package/docs/manual/03-reference/01-dot-cli.md +0 -450
  69. package/docs/manual/03-reference/02-config-files.md +0 -265
  70. package/docs/manual/03-reference/03-environment.md +0 -124
  71. package/docs/manual/03-reference/04-templates.md +0 -190
  72. package/docs/manual/03-reference/05-feature-flags.md +0 -187
  73. package/docs/manual/04-cookbook/01-recipes.md +0 -285
  74. package/docs/manual/04-cookbook/02-troubleshooting.md +0 -351
  75. package/docs/manual/04-cookbook/03-faq.md +0 -175
  76. package/docs/manual/05-appendices/A-platform-matrix.md +0 -101
  77. package/docs/manual/05-appendices/B-security-checklist.md +0 -85
  78. package/docs/manual/05-appendices/C-glossary.md +0 -40
  79. package/docs/manual/05-appendices/D-bibliography.md +0 -58
  80. package/docs/manual/05-appendices/E-license.md +0 -38
  81. package/docs/manual/_toc.yml +0 -58
  82. package/docs/manual/command-index.md +0 -155
  83. package/docs/manual/concept-index.md +0 -168
  84. package/docs/manual/index.md +0 -66
  85. package/docs/operations/ARCHITECTURE_ROADMAP.md +0 -7
  86. package/docs/operations/ATTESTATION.md +0 -44
  87. package/docs/operations/CI_CADENCE.md +0 -107
  88. package/docs/operations/CI_COMPOSITES.md +0 -156
  89. package/docs/operations/COMPLETIONS.md +0 -123
  90. package/docs/operations/COVERAGE.md +0 -204
  91. package/docs/operations/DRIFT.md +0 -107
  92. package/docs/operations/HARD_AUDIT_2026.md +0 -631
  93. package/docs/operations/MAINTENANCE.md +0 -63
  94. package/docs/operations/MANIFEST.md +0 -127
  95. package/docs/operations/MIGRATION.md +0 -109
  96. package/docs/operations/OPERATIONS.md +0 -188
  97. package/docs/operations/PERFORMANCE.md +0 -133
  98. package/docs/operations/REGISTRY.md +0 -90
  99. package/docs/operations/RELEASE_PIPELINE.md +0 -128
  100. package/docs/operations/RELIABILITY.md +0 -122
  101. package/docs/operations/RFC_v0_2_503_reorganization.md +0 -280
  102. package/docs/operations/ROADMAP.md +0 -10
  103. package/docs/operations/ROADMAP_2026.md +0 -7
  104. package/docs/operations/ROADMAP_V0_2_503.md +0 -10
  105. package/docs/operations/TESTING.md +0 -216
  106. package/docs/operations/TRACEABILITY.md +0 -43
  107. package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +0 -65
  108. package/docs/operations/VERSION_SYNC.md +0 -393
  109. package/docs/reference/ALIASES.md +0 -131
  110. package/docs/reference/ALIASES_CHEATSHEET.md +0 -32
  111. package/docs/reference/ALIASES_DEPRECATIONS.md +0 -13
  112. package/docs/reference/FEATURES.md +0 -66
  113. package/docs/reference/FONTS.md +0 -112
  114. package/docs/reference/POWERSHELL_PARITY.md +0 -82
  115. package/docs/reference/PROFILES.md +0 -69
  116. package/docs/reference/SCREENSHOTS.md +0 -121
  117. package/docs/reference/SCRIPTS.md +0 -71
  118. package/docs/reference/SUPPORT_MATRIX.md +0 -80
  119. package/docs/reference/THEMES.md +0 -117
  120. package/docs/reference/TOOLS.md +0 -110
  121. package/docs/reference/UTILS.md +0 -242
  122. package/docs/registry.json +0 -6
  123. package/docs/schema/dot-env-v1.json +0 -110
  124. package/docs/schema/dot-registry-v1.json +0 -33
  125. package/docs/security/AI_ACT_COMPLIANCE.md +0 -94
  126. package/docs/security/AUDIT_BYPASS.md +0 -103
  127. package/docs/security/AUTOMATION_SECRETS.md +0 -26
  128. package/docs/security/CI_EGRESS_ALLOWLIST.md +0 -127
  129. package/docs/security/CI_PINNING.md +0 -129
  130. package/docs/security/COMMIT_SIGNING.md +0 -138
  131. package/docs/security/COMPLIANCE.md +0 -458
  132. package/docs/security/DEPS_DEV_EXCEPTIONS.md +0 -86
  133. package/docs/security/DISCLOSURE.md +0 -130
  134. package/docs/security/ENCRYPTION.md +0 -57
  135. package/docs/security/FMEA.md +0 -159
  136. package/docs/security/FUZZING.md +0 -114
  137. package/docs/security/HISTORY_FILTERING.md +0 -132
  138. package/docs/security/INCIDENT_RESPONSE.md +0 -579
  139. package/docs/security/INSTALL_VERIFICATION.md +0 -122
  140. package/docs/security/KEYS.md +0 -49
  141. package/docs/security/KEY_ROTATION.md +0 -303
  142. package/docs/security/MCP_POLICY.md +0 -78
  143. package/docs/security/POLICY_RELEASES.md +0 -37
  144. package/docs/security/README.md +0 -28
  145. package/docs/security/SCORECARD.md +0 -195
  146. package/docs/security/SECRETS.md +0 -158
  147. package/docs/security/SECURITY.md +0 -45
  148. package/docs/security/SECURITY_CHECKLIST.md +0 -55
  149. package/docs/security/SHELL_EXEMPTIONS.md +0 -145
  150. package/docs/security/SOUP_REGISTER.md +0 -36
  151. package/docs/security/THREAT_MODEL.md +0 -130
  152. package/docs/security/VERIFICATION_VALIDATION.md +0 -228
  153. package/docs/security/VERIFY_RELEASE.md +0 -201
  154. package/docs/security/security-pubkey.asc +0 -15
  155. package/docs/stylesheets/extra.css +0 -444
  156. package/docs/themes/README.md +0 -10
  157. package/docs/themes/VISUAL_INTEGRITY_REPORT.md +0 -30
  158. package/docs/themes/hero-shot.svg +0 -78
  159. package/scripts/README.md +0 -123
  160. package/scripts/ci/check-copyright-headers.sh +0 -8
  161. package/scripts/ci/check-shell-preamble.sh +0 -8
  162. package/scripts/ci/guard-gitleaks-checkout.sh +0 -8
  163. package/scripts/demo/record.sh +0 -43
  164. package/scripts/diagnostics/a2a-conformance.sh +0 -163
  165. package/scripts/diagnostics/alias-governance.sh +0 -138
  166. package/scripts/diagnostics/aliases-cheatsheet.sh +0 -74
  167. package/scripts/diagnostics/aliases-manifest.sh +0 -77
  168. package/scripts/diagnostics/benchmark.sh +0 -408
  169. package/scripts/diagnostics/conflicts.sh +0 -73
  170. package/scripts/diagnostics/doctor-unified.sh +0 -39
  171. package/scripts/diagnostics/doctor.sh +0 -751
  172. package/scripts/diagnostics/drift-dashboard.sh +0 -202
  173. package/scripts/diagnostics/health.sh +0 -623
  174. package/scripts/diagnostics/history-analysis.sh +0 -86
  175. package/scripts/diagnostics/mcp-doctor.sh +0 -582
  176. package/scripts/diagnostics/perf.sh +0 -453
  177. package/scripts/diagnostics/scorecard.sh +0 -119
  178. package/scripts/diagnostics/secret-governance.sh +0 -65
  179. package/scripts/diagnostics/security-score.sh +0 -467
  180. package/scripts/diagnostics/smoke-test.sh +0 -88
  181. package/scripts/diagnostics/snapshot.sh +0 -90
  182. package/scripts/diagnostics/verify.sh +0 -108
  183. package/scripts/diagnostics/verify_state.sh +0 -73
  184. package/scripts/diagnostics/version-locks.sh +0 -94
  185. package/scripts/diagnostics/workstation-attestation.sh +0 -187
  186. package/scripts/dot/commands/agent.sh +0 -485
  187. package/scripts/dot/commands/agents.sh +0 -336
  188. package/scripts/dot/commands/ai.sh +0 -587
  189. package/scripts/dot/commands/aliases.sh +0 -277
  190. package/scripts/dot/commands/appearance.sh +0 -110
  191. package/scripts/dot/commands/completion.sh +0 -134
  192. package/scripts/dot/commands/core.sh +0 -217
  193. package/scripts/dot/commands/diagnostics.sh +0 -265
  194. package/scripts/dot/commands/env-emit.sh +0 -203
  195. package/scripts/dot/commands/fleet.sh +0 -688
  196. package/scripts/dot/commands/init.sh +0 -185
  197. package/scripts/dot/commands/lint.sh +0 -208
  198. package/scripts/dot/commands/manual.sh +0 -169
  199. package/scripts/dot/commands/meta.sh +0 -333
  200. package/scripts/dot/commands/patterns.sh +0 -55
  201. package/scripts/dot/commands/registry.sh +0 -419
  202. package/scripts/dot/commands/restore.sh +0 -232
  203. package/scripts/dot/commands/secrets.sh +0 -296
  204. package/scripts/dot/commands/security.sh +0 -102
  205. package/scripts/dot/commands/tools.sh +0 -556
  206. package/scripts/dot/data/alias-deprecations.tsv +0 -2
  207. package/scripts/dot/powershell/Dot.psm1 +0 -319
  208. package/scripts/fonts/install-nerd-fonts.sh +0 -75
  209. package/scripts/fonts/patch-fonts.sh +0 -36
  210. package/scripts/git-hooks/install.sh +0 -12
  211. package/scripts/git-hooks/pre-commit +0 -12
  212. package/scripts/git-hooks/pre-commit-audit.sh +0 -146
  213. package/scripts/git-hooks/pre-push +0 -105
  214. package/scripts/git-hooks/prepare-commit-msg +0 -29
  215. package/scripts/lib/secrets_provider.sh +0 -185
  216. package/scripts/ops/ai-setup.sh +0 -71
  217. package/scripts/ops/bundle.sh +0 -104
  218. package/scripts/ops/chaos.sh +0 -50
  219. package/scripts/ops/chezmoi-apply.sh +0 -333
  220. package/scripts/ops/chezmoi-diff.sh +0 -16
  221. package/scripts/ops/chezmoi-remove.sh +0 -46
  222. package/scripts/ops/chezmoi-update.sh +0 -63
  223. package/scripts/ops/heal-chezmoi.sh +0 -87
  224. package/scripts/ops/heal-system.sh +0 -129
  225. package/scripts/ops/heal-tools.sh +0 -297
  226. package/scripts/ops/heal.sh +0 -223
  227. package/scripts/ops/post-apply-repair.sh +0 -107
  228. package/scripts/ops/prewarm.sh +0 -128
  229. package/scripts/ops/release.sh +0 -262
  230. package/scripts/ops/rollback.sh +0 -604
  231. package/scripts/ops/setup.sh +0 -138
  232. package/scripts/ops/teleport.sh +0 -34
  233. package/scripts/qa/check-version-consistency.sh +0 -124
  234. package/scripts/qa/coverage-baseline.sh +0 -61
  235. package/scripts/qa/docs-coverage.sh +0 -112
  236. package/scripts/qa/examples-coverage.sh +0 -94
  237. package/scripts/qa/powershell-contract.ps1 +0 -95
  238. package/scripts/qa/reliability-audit.sh +0 -139
  239. package/scripts/qa/scorecard-snapshot.sh +0 -128
  240. package/scripts/qa/traceability-coverage.sh +0 -117
  241. package/scripts/qa/validate-examples.sh +0 -27
  242. package/scripts/qa/wsl-contract.sh +0 -12
  243. package/scripts/secrets/age-init.sh +0 -82
  244. package/scripts/secrets/create-secrets-file.sh +0 -46
  245. package/scripts/secrets/encrypt-ssh-key.sh +0 -44
  246. package/scripts/security/backup.sh +0 -58
  247. package/scripts/security/check-disclosure-key-expiry.sh +0 -111
  248. package/scripts/security/dns-doh.sh +0 -52
  249. package/scripts/security/encryption-check.sh +0 -55
  250. package/scripts/security/enforce-policies.sh +0 -335
  251. package/scripts/security/firewall.sh +0 -91
  252. package/scripts/security/lock-configs.sh +0 -67
  253. package/scripts/security/lock-screen.sh +0 -56
  254. package/scripts/security/manage-secrets.sh +0 -429
  255. package/scripts/security/ssh-cert.sh +0 -204
  256. package/scripts/security/telemetry-kill.sh +0 -51
  257. package/scripts/security/usb-safety.sh +0 -52
  258. package/scripts/theme/apply-gnome-theme.sh +0 -333
  259. package/scripts/theme/extract-heic-frames.sh +0 -115
  260. package/scripts/theme/extract-theme.py +0 -742
  261. package/scripts/theme/install-boot-logo.sh +0 -63
  262. package/scripts/theme/install-catppuccin-themes.sh +0 -371
  263. package/scripts/theme/install-cursors.sh +0 -26
  264. package/scripts/theme/install-file-icons.sh +0 -27
  265. package/scripts/theme/install-grub-theme.sh +0 -62
  266. package/scripts/theme/install-lock-icon.sh +0 -31
  267. package/scripts/theme/merge-wallpaper.sh +0 -146
  268. package/scripts/theme/rebuild-themes.sh +0 -544
  269. package/scripts/theme/switch.sh +0 -449
  270. package/scripts/theme/wallpaper-rotate.sh +0 -137
  271. package/scripts/theme/wallpaper-sync.sh +0 -690
  272. package/scripts/tools/cmatrix.sh +0 -22
  273. package/scripts/tools/detect-collisions.py +0 -103
  274. package/scripts/tools/emoji-picker.sh +0 -49
  275. package/scripts/tools/figlet-banner.sh +0 -19
  276. package/scripts/tools/log-rotate.sh +0 -31
  277. package/scripts/tools/lolcat-wrap.sh +0 -20
  278. package/scripts/tools/pipes.sh +0 -49
  279. package/scripts/tuning/linux.sh +0 -186
  280. package/scripts/tuning/macos.sh +0 -56
  281. package/scripts/uninstall.sh +0 -86
  282. package/scripts/version-sync.sh +0 -654
  283. package/templates/chezmoi-data/geekom-a9.toml.example +0 -21
  284. package/templates/chezmoi-data/mac-m1.toml.example +0 -16
  285. package/templates/chezmoi-data/mac-t2-linux.toml.example +0 -21
  286. package/templates/chezmoi-data/surface-pro-7p.toml.example +0 -21
  287. package/templates/projects/go/.github/workflows/ci.yml +0 -31
  288. package/templates/projects/go/README.md +0 -7
  289. package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +0 -8
  290. package/templates/projects/go/go.mod +0 -3
  291. package/templates/projects/go/go.sum +0 -0
  292. package/templates/projects/molecule/README.md +0 -7
  293. package/templates/projects/molecule/converge.yml +0 -7
  294. package/templates/projects/molecule/molecule.yml +0 -16
  295. package/templates/projects/node/.github/workflows/ci.yml +0 -30
  296. package/templates/projects/node/README.md +0 -7
  297. package/templates/projects/node/package-lock.json +0 -12
  298. package/templates/projects/node/package.json +0 -10
  299. package/templates/projects/node/src/index.js +0 -3
  300. package/templates/projects/packer/README.md +0 -15
  301. package/templates/projects/packer/main.pkr.hcl +0 -15
  302. package/templates/projects/python/.github/workflows/ci.yml +0 -34
  303. package/templates/projects/python/README.md +0 -7
  304. package/templates/projects/python/pyproject.toml +0 -25
  305. package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +0 -2
  306. package/templates/projects/python/tests/test_basic.py +0 -3
@@ -1,587 +0,0 @@
1
- #!/usr/bin/env bash
2
- # SPDX-License-Identifier: MIT
3
- # Copyright (c) 2015-2026 Sebastien Rousseau
4
- ## Dotfiles AI Commands.
5
- ##
6
- ## Provides AI CLI status, setup, RAG query, and bridge commands.
7
- ## Wraps AI CLI tools with contextual patterns and system metadata.
8
- ## Usage: dot ai [delegate|cost|dashboard|proxy|local|status]|ai-setup|ai-query|cl|copilot|kimi|agy|kiro|sgpt|ollama|opencode|aider|autohand|vibe|qwen|zai
9
-
10
- set -euo pipefail
11
-
12
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
- # shellcheck source=../../../lib/dot/utils.sh
14
- source "$SCRIPT_DIR/../../../lib/dot/utils.sh"
15
- # shellcheck source=../../../lib/dot/ai-commands.sh
16
- source "$SCRIPT_DIR/../../../lib/dot/ai-commands.sh"
17
-
18
- [[ -n "${DOT_AI_RAW:-}" ]] || dot_ui_command_banner "AI and Agents" "${1:-}" # raw mode: no banner
19
-
20
- PATTERN_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/ai/patterns"
21
- AI_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/dotfiles/ai"
22
- AI_STATUS_TTL="${DOTFILES_AI_STATUS_TTL:-300}"
23
- AI_STATUS_CACHE_FILE="${AI_CACHE_DIR}/status.tsv"
24
-
25
- # Fallback to source tree if patterns don't exist in config (common in CI)
26
- if [[ ! -d "$PATTERN_DIR" ]]; then
27
- _AI_SRC="$(cd "$SCRIPT_DIR/../../.." && pwd)"
28
- if [[ -d "$_AI_SRC/dot_config/ai/patterns" ]]; then
29
- PATTERN_DIR="$_AI_SRC/dot_config/ai/patterns"
30
- fi
31
- fi
32
-
33
- _show_ai_bridge_usage() {
34
- echo "Usage: dot ai \"<prompt>\" # one-shot on Claude"
35
- echo " dot ai <tool> \"<prompt>\" # one-shot on a tool"
36
- echo " dot ai <tool> --style <name> \"<prompt>\""
37
- echo " dot ai chat [tool] # interactive session"
38
- echo ""
39
- echo "Tools: cl codex copilot goose crush amp cursor-agent grok kimi agy kiro sgpt ollama opencode aider autohand vibe qwen zai"
40
- echo ""
41
- echo "Available styles:"
42
- # shellcheck disable=SC2012
43
- ls -1 "$PATTERN_DIR" 2>/dev/null | sed 's/\.md$//' | sed 's/^/ - /' || echo " (none)"
44
- }
45
-
46
- _ai_cache_fresh() {
47
- local file="$1"
48
- [[ -f "$file" ]] || return 1
49
- local now mtime
50
- now=$(date +%s)
51
- mtime=$(stat -c %Y "$file" 2>/dev/null || stat -f %m "$file" 2>/dev/null || echo 0)
52
- ((now - mtime < AI_STATUS_TTL))
53
- }
54
-
55
- _ai_extract_version() {
56
- local bin="$1"
57
- local output version
58
- output=$("$bin" --version 2>/dev/null | head -1) || true
59
- version=$(printf '%s' "$output" | sed 's/^[^0-9]*//' | sed 's/[[:space:]]*$//' | sed 's/\.$//')
60
- [[ -n "$version" ]] && printf '%s\n' "$version" || printf 'installed\n'
61
- }
62
-
63
- _ai_refresh_status_cache() {
64
- # Entries passed by value (not a `local -n` nameref — bash 4.3+; macOS bash is 3.2).
65
- local ai_entries=("$@")
66
- local tmp_file
67
- tmp_file="$(mktemp)"
68
- mkdir -p "$AI_CACHE_DIR"
69
-
70
- local total=${#ai_entries[@]}
71
-
72
- # Cold-cache refresh can take 15-30s across node-based tools; show progress.
73
- ui_spinner_start "Probing $total AI tools (cached for ${AI_STATUS_TTL}s)"
74
-
75
- local jobs="${DOTFILES_AI_PROBE_JOBS:-$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)}"
76
- local probe_dir
77
- probe_dir="$(mktemp -d)"
78
-
79
- local i=0
80
- local entry
81
- local indexed=()
82
- for entry in "${ai_entries[@]}"; do
83
- indexed+=("$i|$entry")
84
- i=$((i + 1))
85
- done
86
- # Probe is non-interactive: </dev/null is a clean EOF for tools that
87
- # prompt for an API key on first run; `timeout 8` caps the wait.
88
- # Node-based tools (codex, copilot, opencode) need 5-8s on cold start;
89
- # 3s caused false "not installed" results in the status cache.
90
- # shellcheck disable=SC2016
91
- local _TO=""
92
- command -v timeout >/dev/null 2>&1 && _TO="timeout 8 "
93
- # Variables expand inside the child Bash probe.
94
- # shellcheck disable=SC2016
95
- local probe_script='
96
- payload="$1"; out_dir="$2"; to="$3"
97
- i="${payload%%|*}"; entry="${payload#*|}"
98
- IFS="|" read -r category role name bin desc <<<"$entry"
99
- if command -v "$bin" >/dev/null 2>&1; then
100
- output=$($to "$bin" --version </dev/null 2>/dev/null | head -1) || true
101
- version=$(printf "%s" "$output" | sed "s/^[^0-9]*//;s/[[:space:]]*$//;s/\.$//")
102
- printf "%s\t1\t%s\n" "$bin" "$version" >"$out_dir/$i"
103
- else
104
- printf "%s\t0\t\n" "$bin" >"$out_dir/$i"
105
- fi
106
- '
107
- # Use only `-I{}` and null records for BSD xargs and quote-safe descriptions.
108
- printf '%s\0' "${indexed[@]}" |
109
- xargs -0 -I{} -P"$jobs" \
110
- bash -c "$probe_script" _ {} "$probe_dir" "$_TO" \
111
- 2>/dev/null || true
112
-
113
- # Re-assemble in original entry order.
114
- local n
115
- for ((n = 0; n < i; n++)); do
116
- [[ -f "$probe_dir/$n" ]] && cat "$probe_dir/$n" >>"$tmp_file"
117
- done
118
- rm -rf "$probe_dir"
119
-
120
- # Guard against older ui_spinner_stop implementations returning 1 on a TTY.
121
- ui_spinner_stop || true
122
-
123
- mv "$tmp_file" "$AI_STATUS_CACHE_FILE"
124
- }
125
-
126
- _ai_get_cached_status() {
127
- cat "$AI_STATUS_CACHE_FILE"
128
- }
129
-
130
- # _ai_mise_pkg (binary -> mise package map) is defined in lib/dot/ai-install.sh.
131
-
132
- cmd_ai_status() {
133
- ui_header "AI CLI Status"
134
-
135
- # category|role|name|binary|description
136
- local -a ai_clis=(
137
- "Agents (autonomous)|agent|Claude Code|claude|Anthropic's flagship agentic coder"
138
- "Agents (autonomous)|agent|Codex CLI|codex|OpenAI's autonomous coding agent"
139
- "Agents (autonomous)|agent|Copilot CLI|copilot|GitHub Copilot in the terminal"
140
- "Agents (autonomous)|agent|Goose|goose|Block's open-source coding agent"
141
- "Agents (autonomous)|agent|Crush|crush|Charm's glamorous TUI coding agent"
142
- "Agents (autonomous)|agent|Amp|amp|Sourcegraph's agentic coder"
143
- "Agents (autonomous)|agent|Cursor CLI|cursor-agent|Cursor's terminal agent"
144
- "Agents (autonomous)|agent|Grok Build|grok|xAI's terminal coding agent"
145
- "Agents (autonomous)|agent|Kimi CLI|kimi|Moonshot AI's terminal coding agent"
146
- "Coding (interactive)|coding|Aider|aider|Git-aware AI pair programmer"
147
- "Coding (interactive)|coding|OpenCode|opencode|Open-source terminal coding agent"
148
- "Coding (interactive)|coding|Autohand Code|autohand|Autonomous multi-file coding agent"
149
- "Coding (interactive)|coding|Mistral Vibe|vibe|Mistral's coding agent"
150
- "Coding (interactive)|coding|Qwen Code|qwen|Alibaba Qwen coding assistant"
151
- "Coding (interactive)|coding|ZAI|zai|Zhipu GLM coding agent"
152
- "General (prompt-based)|general|Shell-GPT|sgpt|ChatGPT for the shell"
153
- "General (prompt-based)|general|Antigravity CLI|agy|Google's Antigravity agent"
154
- "Runtime (local)|local|Ollama|ollama|Run local & cloud open models"
155
- "Cloud (platform)|cloud|Kiro CLI|kiro-cli|AWS's agentic dev assistant"
156
- )
157
-
158
- if ! _ai_cache_fresh "$AI_STATUS_CACHE_FILE"; then
159
- _ai_refresh_status_cache "${ai_clis[@]}"
160
- fi
161
-
162
- local -a installed=()
163
- local -a missing=()
164
- local current_category=""
165
- local category role name bin desc ver
166
- for entry in "${ai_clis[@]}"; do
167
- IFS='|' read -r category role name bin desc <<<"$entry"
168
- if [[ "$category" != "$current_category" ]]; then
169
- echo ""
170
- ui_section "$category"
171
- current_category="$category"
172
- fi
173
- # One awk over the cache line for this tool (was two: field 2 and field 3).
174
- local _st_installed _st_ver
175
- IFS=$'\t' read -r _st_installed _st_ver < <(
176
- awk -F'\t' -v b="$bin" '$1==b{print $2"\t"$3;exit}' "$AI_STATUS_CACHE_FILE" 2>/dev/null
177
- )
178
- if [[ "$_st_installed" == "1" ]]; then
179
- ver="$_st_ver"
180
- [[ -z "$ver" ]] && ver="installed"
181
- [[ "$bin" == "claude" ]] && ver="${ver%% *}"
182
- ui_ok "$name" "$ver — $desc"
183
- installed+=("$name|$bin|$role")
184
- else
185
- ui_info "$name" "— $desc (not installed)"
186
- missing+=("$name|$bin")
187
- fi
188
- done
189
-
190
- # Offer to install missing providers via mise
191
- if [[ ${#missing[@]} -gt 0 ]] && has_command mise; then
192
- echo ""
193
- local _ai_install_action=""
194
- if has_command gum; then
195
- _ai_install_action=$(printf '%s\n' "Install all" "Choose which to install" "Skip" |
196
- gum choose --header "Missing AI providers — install via mise?") || _ai_install_action=""
197
- else
198
- ui_info "Tip" "Install missing providers: mise install"
199
- ui_info "Tip" "Or individually: mise use -g <package>@latest"
200
- fi
201
-
202
- local -a _ai_to_install=()
203
- case "$_ai_install_action" in
204
- "Install all")
205
- _ai_to_install=("${missing[@]}")
206
- ;;
207
- "Choose which to install")
208
- local -a _ai_pick_choices=()
209
- for entry in "${missing[@]}"; do
210
- IFS='|' read -r name bin <<<"$entry"
211
- _ai_pick_choices+=("$name")
212
- done
213
- local _ai_picked
214
- _ai_picked=$(printf '%s\n' "${_ai_pick_choices[@]}" |
215
- gum choose --no-limit --header "Select providers to install (Space to toggle, Enter to confirm)") || _ai_picked=""
216
- if [[ -n "$_ai_picked" ]]; then
217
- while IFS= read -r selected; do
218
- [[ -z "$selected" ]] && continue
219
- for entry in "${missing[@]}"; do
220
- IFS='|' read -r name bin <<<"$entry"
221
- if [[ "$name" == "$selected" ]]; then
222
- _ai_to_install+=("$entry")
223
- fi
224
- done
225
- done <<<"$_ai_picked"
226
- fi
227
- ;;
228
- esac
229
-
230
- if [[ ${#_ai_to_install[@]} -gt 0 ]]; then
231
- echo ""
232
- for entry in "${_ai_to_install[@]}"; do
233
- IFS='|' read -r name bin <<<"$entry"
234
- # Tools without a mise package use their vendor's native installer.
235
- case "$bin" in
236
- claude)
237
- install_claude_native "$name"
238
- continue
239
- ;;
240
- goose)
241
- install_goose_native "$name"
242
- continue
243
- ;;
244
- agy)
245
- install_agy_native "$name"
246
- continue
247
- ;;
248
- amp)
249
- install_amp_native "$name"
250
- continue
251
- ;;
252
- cursor-agent)
253
- install_cursor_native "$name"
254
- continue
255
- ;;
256
- grok)
257
- install_grok_native "$name"
258
- continue
259
- ;;
260
- kimi)
261
- install_kimi_native "$name"
262
- continue
263
- ;;
264
- esac
265
- local pkg
266
- pkg=$(_ai_mise_pkg "$bin")
267
- if [[ -n "$pkg" ]]; then
268
- if has_command gum; then
269
- if gum spin --spinner dot --title "Installing $name ($pkg)" -- \
270
- mise use -g "$pkg@latest" 2>&1; then
271
- ui_ok "$name" "installed"
272
- else
273
- ui_warn "$name" "install failed (continuing)"
274
- fi
275
- else
276
- ui_info "Installing" "$name via mise ($pkg)"
277
- mise use -g "$pkg@latest" 2>&1 || ui_warn "$name" "install failed (continuing)"
278
- fi
279
- fi
280
- done
281
- # Invalidate cache after installs
282
- rm -f "$AI_STATUS_CACHE_FILE"
283
- echo ""
284
- ui_ok "Done" "Run 'dot ai' again to see updated status"
285
- fi
286
- fi
287
-
288
- echo ""
289
- if [ ${#installed[@]} -eq 0 ]; then
290
- ui_warn "No AI CLIs installed"
291
- elif has_command gum; then
292
- ui_info "Launch" "Select an AI CLI to start"
293
- local -a choices=()
294
- for entry in "${installed[@]}"; do
295
- IFS='|' read -r name bin role <<<"$entry"
296
- choices+=("$(printf '%-16s — %s' "$name" "$role")")
297
- done
298
- local pick
299
- pick=$(printf '%s\n' "${choices[@]}" | gum choose --header "Select an AI CLI") || true
300
- if [ -n "$pick" ]; then
301
- pick="${pick%% — *}"
302
- pick="${pick%"${pick##*[![:space:]]}"}"
303
- for entry in "${installed[@]}"; do
304
- IFS='|' read -r name bin role <<<"$entry"
305
- if [ "$name" = "$pick" ]; then
306
- echo ""
307
- ui_info "Starting" "$name ($bin)"
308
- exec "$bin"
309
- fi
310
- done
311
- fi
312
- else
313
- ui_info "Tip" "Install gum for interactive launcher: mise use -g gum"
314
- fi
315
- }
316
-
317
- # cmd_ai_setup / cmd_ai_query / cmd_ai_install live in lib/dot/ai-commands.sh.
318
-
319
- _ai_log_run() {
320
- local provider="$1" exit_code="$2" duration_secs="$3" prompt_words="$4"
321
- local project ts log_bin
322
- project="$(basename "$PWD")"
323
- ts="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
324
- log_bin="${HOME}/.local/bin/dot-ai-log"
325
- [[ -x "$log_bin" ]] || return 0
326
- "$log_bin" "$provider" "$project" "$exit_code" "$duration_secs" "$prompt_words" "$ts" || true
327
- }
328
-
329
- run_ai_with_context() {
330
- local tool="$1"
331
- shift
332
- local pattern_name=""
333
- local prompt=""
334
-
335
- while [[ $# -gt 0 ]]; do
336
- case "$1" in
337
- --help | -h)
338
- _show_ai_bridge_usage
339
- exit 0
340
- ;;
341
- --style | --pattern | -p)
342
- pattern_name="$2"
343
- shift 2
344
- ;;
345
- *)
346
- prompt="$1"
347
- shift
348
- ;;
349
- esac
350
- done
351
-
352
- if [[ -z "$prompt" ]]; then
353
- _show_ai_bridge_usage
354
- exit 1
355
- fi
356
-
357
- local system_context=""
358
- if [[ -n "$pattern_name" ]]; then
359
- local pattern_file="$PATTERN_DIR/${pattern_name}.md"
360
- if [[ -f "$pattern_file" ]]; then
361
- system_context=$(cat "$pattern_file")
362
- else
363
- ui_err "Pattern not found" "$pattern_name"
364
- exit 1
365
- fi
366
- fi
367
-
368
- # Build the prompt. Raw mode (DOT_AI_RAW) skips the system-metadata banner
369
- # so callers like the cockpit get clean, streamable output.
370
- local full_prompt
371
- if [[ -n "${DOT_AI_RAW:-}" ]]; then
372
- full_prompt="${system_context:+${system_context}
373
-
374
- }${prompt}"
375
- else
376
- local metadata
377
- metadata="## System Metadata
378
- - OS: $(uname -s) $(uname -r)
379
- - Arch: $(uname -m)
380
- - Date: $(date -u)"
381
- full_prompt="${system_context}
382
-
383
- ${metadata}
384
-
385
- ## User Request
386
- ${prompt}"
387
- fi
388
-
389
- # Resolve the binary name for the tool
390
- local tool_bin="$tool"
391
- case "$tool" in
392
- cl) tool_bin="claude" ;;
393
- kiro) tool_bin="kiro-cli" ;;
394
- esac
395
-
396
- # Check if the tool is installed; offer mise install if not
397
- if ! has_command "$tool_bin"; then
398
- local mise_pkg
399
- mise_pkg=$(_ai_mise_pkg "$tool_bin")
400
- if [[ -n "$mise_pkg" ]] && has_command mise; then
401
- ui_warn "$tool" "not installed"
402
- local do_install=""
403
- if has_command gum; then
404
- do_install=$(gum confirm "Install $tool via mise ($mise_pkg)?" && echo "yes" || echo "no")
405
- else
406
- printf "Install %s via mise (%s)? [y/N] " "$tool" "$mise_pkg"
407
- read -r do_install
408
- case "$do_install" in y | Y | yes) do_install="yes" ;; *) do_install="no" ;; esac
409
- fi
410
- if [[ "$do_install" == "yes" ]]; then
411
- ui_info "Installing" "$tool via mise ($mise_pkg)"
412
- mise use -g "$mise_pkg@latest" 2>&1 || {
413
- ui_err "$tool" "installation failed"
414
- exit 1
415
- }
416
- rm -f "$AI_STATUS_CACHE_FILE"
417
- else
418
- ui_err "$tool" "not installed — install with: mise use -g $mise_pkg@latest"
419
- exit 1
420
- fi
421
- elif [[ "$tool_bin" == "agy" ]]; then
422
- ui_warn "$tool" "not installed"
423
- ui_info "Install" "dot ai install agy (checksum verified)"
424
- exit 1
425
- elif [[ "$tool_bin" == "kimi" ]]; then
426
- ui_warn "$tool" "not installed"
427
- ui_info "Install" "dot ai install kimi"
428
- ui_info "PATH" "Kimi Code installs to ~/.kimi-code/bin; restart your shell after install"
429
- exit 1
430
- else
431
- ui_err "$tool" "not installed and mise not available"
432
- exit 1
433
- fi
434
- fi
435
-
436
- [[ -n "${DOT_AI_RAW:-}" ]] || ui_info "Executing $tool with pattern: ${pattern_name:-none}"
437
-
438
- # Route non-Claude tools through the local gateway when one is running.
439
- # The primary Claude ALWAYS uses its native session — never route it,
440
- # and never set ANTHROPIC_API_KEY where Claude Code can see it (that
441
- # disables claude.ai connectors). Routing is scoped to this run's
442
- # subprocess; the interactive shell is never touched.
443
- case "$tool" in
444
- cl | claude) : ;;
445
- *)
446
- local _ai_local_env="${XDG_CONFIG_HOME:-$HOME/.config}/dotfiles/ai-local.env"
447
- # shellcheck disable=SC1090
448
- [[ -r "$_ai_local_env" ]] && source "$_ai_local_env"
449
- ;;
450
- esac
451
-
452
- # Wrap the provider invocation so we can log it to the unified AI run
453
- # log. Each entry feeds `dot ai cost` so users see spend across every
454
- # provider, not just vibe. Token-level fields are zero for providers
455
- # that don't surface them — the report tolerates missing data.
456
- local _ai_start_ts _ai_exit _ai_end_ts _ai_dur _ai_prompt_words
457
- _ai_start_ts=$(date +%s)
458
- _ai_prompt_words=$(printf '%s' "$prompt" | wc -w | tr -d ' ')
459
- _ai_exit=0
460
- _ai_invoke_provider "$tool" "$full_prompt" || _ai_exit=$?
461
- _ai_end_ts=$(date +%s)
462
- _ai_dur=$((_ai_end_ts - _ai_start_ts))
463
- _ai_log_run "$tool_bin" "$_ai_exit" "$_ai_dur" "$_ai_prompt_words" 2>/dev/null || true
464
- return "$_ai_exit"
465
- }
466
-
467
- # Dispatch — flat, verb-first surface (see docs/AI.md).
468
- case "${1:-}" in
469
- --help | -h | help)
470
- cat <<'EOF'
471
- Usage: ai.sh <command> [args...]
472
-
473
- Commands:
474
- ai, ai-setup, ai-query, cl, claude, codex, copilot, goose, crush, amp,
475
- cursor-agent, grok, kimi, agy, kiro, sgpt, ollama, opencode, aider, autohand,
476
- vibe, qwen, zai
477
- EOF
478
- ;;
479
- "")
480
- cat <<'EOF'
481
- Usage: ai.sh <command> [args...]
482
-
483
- Commands:
484
- ai, ai-setup, ai-query, cl, claude, codex, copilot, goose, crush, amp,
485
- cursor-agent, grok, kimi, agy, kiro, sgpt, ollama, opencode, aider, autohand,
486
- vibe, qwen, zai
487
- EOF
488
- exit 1
489
- ;;
490
- ai)
491
- shift
492
- case "${1:-}" in
493
- "")
494
- # Bare `dot ai` → the Bubble Tea cockpit (or the launcher fallback).
495
- _ai_cockpit cmd_ai_status
496
- ;;
497
- chat)
498
- shift
499
- cmd_ai_chat "$@"
500
- ;;
501
- tools)
502
- shift
503
- if [[ "${1:-}" == install ]]; then
504
- shift
505
- cmd_ai_install "$@"
506
- else
507
- cmd_ai_status "$@"
508
- fi
509
- ;;
510
- install)
511
- shift
512
- cmd_ai_install "$@"
513
- ;;
514
- serve)
515
- shift
516
- _ai_serve "$@"
517
- ;;
518
- cost)
519
- shift
520
- cmd_ai_cost "$@"
521
- ;;
522
- login)
523
- shift
524
- cmd_ai_setup "$@"
525
- ;;
526
- doctor)
527
- shift
528
- cmd_ai_doctor "$@"
529
- ;;
530
- ask)
531
- shift
532
- cmd_ai_query "$@"
533
- ;;
534
- run)
535
- shift
536
- _ai_oneshot "$@"
537
- ;;
538
- delegate)
539
- shift
540
- cmd_ai_delegate "$@"
541
- ;;
542
- # Deprecated verbs — still work, with a one-line hint to the new name.
543
- status)
544
- _ai_deprecated "dot ai tools"
545
- cmd_ai_status "$@"
546
- ;;
547
- dashboard | dash)
548
- _ai_deprecated "dot ai (cockpit)"
549
- _ai_cockpit cmd_ai_status
550
- ;;
551
- proxy)
552
- shift
553
- _ai_deprecated "dot ai serve"
554
- has_command dot-ai-proxy && exec dot-ai-proxy "$@" || exit 1
555
- ;;
556
- local)
557
- _ai_deprecated "dot ai serve"
558
- has_command dot-ai-proxy && exec dot-ai-proxy "$@" || exit 1
559
- ;;
560
- *)
561
- # Bare prompt (`dot ai "fix this"`) or `dot ai <tool> "…"` → one-shot.
562
- _ai_oneshot "$@"
563
- ;;
564
- esac
565
- ;;
566
- # Deprecated top-level forms — kept for muscle memory.
567
- ai-setup)
568
- _ai_deprecated "dot ai login"
569
- shift
570
- cmd_ai_setup "$@"
571
- ;;
572
- ai-query)
573
- _ai_deprecated "dot ai ask"
574
- shift
575
- cmd_ai_query "$@"
576
- ;;
577
- cl | claude | codex | copilot | goose | crush | amp | cursor-agent | grok | kimi | agy | kiro | sgpt | ollama | opencode | aider | autohand | vibe | qwen | zai)
578
- _ai_deprecated "dot ai $1"
579
- tool="$1"
580
- shift
581
- run_ai_with_context "$tool" "$@"
582
- ;;
583
- *)
584
- echo "Unknown ai command: ${1:-}" >&2
585
- exit 1
586
- ;;
587
- esac