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