@sebastienrousseau/dotfiles 0.2.499 → 0.2.501
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 +452 -0
- package/LICENSE +1283 -0
- package/README.md +322 -0
- package/docs/.vitepress/reports/localization-readability-audit.md +73 -0
- package/docs/AI.md +108 -0
- package/docs/CNAME +1 -0
- package/docs/COPYRIGHT +4 -3
- package/docs/NAMING_CONVENTIONS.md +102 -0
- package/docs/README.md +82 -0
- package/docs/_config.yml +59 -0
- package/docs/adr/ADR-001-ci-cd-pipeline.md +118 -0
- package/docs/adr/ADR-002-shell-performance.md +130 -0
- package/docs/adr/ADR-003-security-first.md +158 -0
- package/docs/adr/ADR-004-cli-architecture.md +171 -0
- package/docs/adr/ADR-005-chezmoi-choice.md +99 -0
- package/docs/adr/ADR-006-shell-selection.md +124 -0
- package/docs/adr/ADR-007-multi-shell-parity.md +62 -0
- package/docs/adr/ADR-008-alias-system-architecture.md +95 -0
- package/docs/adr/ADR-009-wallpaper-driven-theming.md +131 -0
- package/docs/adr/ADR-010-starship-transient-prompt.md +144 -0
- package/docs/adr/ADR-011-nushell-tier3-keep.md +144 -0
- package/docs/adr/README.md +39 -0
- package/docs/architecture/ARCHITECTURE.md +117 -0
- package/docs/architecture/INTEROP.md +44 -0
- package/docs/architecture/REPO_LAYOUT.md +241 -0
- package/docs/architecture/WALKTHROUGH.md +86 -0
- package/docs/architecture/fleet-deployment.md +77 -0
- package/docs/archive/EUXIS_2026_REVIEW.md +127 -0
- package/docs/archive/LEGACY_ROADMAP.md +160 -0
- package/docs/archive/MILESTONE_v0.2.493.md +47 -0
- package/docs/{PLAN.md → archive/PLAN.md} +50 -12
- package/docs/archive/REPO_AUDIT.md +31 -0
- package/docs/guides/INSTALL.md +144 -0
- package/docs/guides/NEOVIM_IDE_GUIDE.md +61 -0
- package/docs/guides/THEMING.md +230 -0
- package/docs/guides/TROUBLESHOOTING.md +176 -0
- package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +792 -0
- package/docs/index.md +43 -0
- package/docs/interop/A2A.md +39 -0
- package/docs/interop/POWERSHELL.md +102 -0
- package/docs/manual/00-introduction.md +89 -0
- package/docs/manual/01-concepts/01-architecture.md +138 -0
- package/docs/manual/01-concepts/02-trust-model.md +182 -0
- package/docs/manual/01-concepts/03-theme-engine.md +186 -0
- package/docs/manual/01-concepts/04-fleet.md +148 -0
- package/docs/manual/01-concepts/05-self-healing.md +204 -0
- package/docs/manual/02-tutorials/01-first-install.md +197 -0
- package/docs/manual/02-tutorials/02-add-wallpaper.md +216 -0
- package/docs/manual/02-tutorials/03-create-profile.md +244 -0
- package/docs/manual/02-tutorials/04-encrypt-secret.md +281 -0
- package/docs/manual/02-tutorials/05-deploy-fleet.md +283 -0
- package/docs/manual/03-reference/01-dot-cli.md +417 -0
- package/docs/manual/03-reference/02-config-files.md +265 -0
- package/docs/manual/03-reference/03-environment.md +124 -0
- package/docs/manual/03-reference/04-templates.md +190 -0
- package/docs/manual/03-reference/05-feature-flags.md +128 -0
- package/docs/manual/04-cookbook/01-recipes.md +285 -0
- package/docs/manual/04-cookbook/02-troubleshooting.md +351 -0
- package/docs/manual/04-cookbook/03-faq.md +175 -0
- package/docs/manual/05-appendices/A-platform-matrix.md +101 -0
- package/docs/manual/05-appendices/B-security-checklist.md +84 -0
- package/docs/manual/05-appendices/C-glossary.md +40 -0
- package/docs/manual/05-appendices/D-bibliography.md +58 -0
- package/docs/manual/05-appendices/E-license.md +38 -0
- package/docs/manual/_toc.yml +58 -0
- package/docs/manual/command-index.md +62 -0
- package/docs/manual/concept-index.md +168 -0
- package/docs/operations/ATTESTATION.md +44 -0
- package/docs/operations/CI_CADENCE.md +107 -0
- package/docs/operations/CI_COMPOSITES.md +156 -0
- package/docs/operations/COMPLETIONS.md +123 -0
- package/docs/operations/COVERAGE.md +148 -0
- package/docs/operations/DRIFT.md +107 -0
- package/docs/operations/MAINTENANCE.md +63 -0
- package/docs/operations/MIGRATION.md +109 -0
- package/docs/operations/OPERATIONS.md +188 -0
- package/docs/operations/PERFORMANCE.md +133 -0
- package/docs/operations/RELIABILITY.md +122 -0
- package/docs/{ROADMAP.md → operations/ROADMAP.md} +57 -39
- package/docs/operations/TESTING.md +199 -0
- package/docs/operations/TRACEABILITY.md +35 -0
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +65 -0
- package/docs/operations/VERSION_SYNC.md +393 -0
- package/docs/reference/ALIASES.md +131 -0
- package/docs/reference/ALIASES_CHEATSHEET.md +32 -0
- package/docs/reference/ALIASES_DEPRECATIONS.md +13 -0
- package/docs/reference/FEATURES.md +66 -0
- package/docs/reference/FONTS.md +112 -0
- package/docs/reference/PROFILES.md +69 -0
- package/docs/reference/SCREENSHOTS.md +121 -0
- package/docs/reference/SCRIPTS.md +71 -0
- package/docs/reference/SUPPORT_MATRIX.md +80 -0
- package/docs/reference/THEMES.md +117 -0
- package/docs/reference/TOOLS.md +109 -0
- package/docs/reference/UTILS.md +155 -0
- package/docs/security/AI_ACT_COMPLIANCE.md +94 -0
- package/docs/security/AUDIT_BYPASS.md +103 -0
- package/docs/security/AUTOMATION_SECRETS.md +26 -0
- package/docs/security/CI_EGRESS_ALLOWLIST.md +127 -0
- package/docs/security/COMPLIANCE.md +458 -0
- package/docs/security/DEPS_DEV_EXCEPTIONS.md +86 -0
- package/docs/security/ENCRYPTION.md +57 -0
- package/docs/security/FMEA.md +159 -0
- package/docs/security/HISTORY_FILTERING.md +132 -0
- package/docs/security/INCIDENT_RESPONSE.md +579 -0
- package/docs/security/INSTALL_VERIFICATION.md +122 -0
- package/docs/security/KEYS.md +49 -0
- package/docs/security/KEY_ROTATION.md +223 -0
- package/docs/security/MCP_POLICY.md +78 -0
- package/docs/security/POLICY_RELEASES.md +37 -0
- package/docs/security/README.md +28 -0
- package/docs/security/SCORECARD.md +80 -0
- package/docs/security/SECRETS.md +158 -0
- package/docs/security/SECURITY.md +45 -0
- package/docs/security/SECURITY_CHECKLIST.md +55 -0
- package/docs/security/SHELL_EXEMPTIONS.md +145 -0
- package/docs/security/SOUP_REGISTER.md +36 -0
- package/docs/security/THREAT_MODEL.md +130 -0
- package/docs/security/VERIFICATION_VALIDATION.md +228 -0
- package/docs/themes/README.md +10 -0
- package/docs/themes/VISUAL_INTEGRITY_REPORT.md +30 -0
- package/docs/themes/hero-shot.svg +78 -0
- package/dot_config/.module-manifest.json +69 -0
- package/dot_config/ai/identity.md +23 -0
- package/dot_config/ai/patterns/architect.md +16 -0
- package/dot_config/ai/patterns/hardener.md +15 -0
- package/dot_config/ai/patterns/refactor.md +15 -0
- package/dot_config/aider/aider.conf.yml +32 -0
- package/dot_config/alacritty/alacritty.toml.tmpl +55 -0
- package/dot_config/ansible/ansible.cfg +11 -0
- package/dot_config/atuin/config.toml.tmpl +47 -0
- package/dot_config/bat/config +23 -0
- package/dot_config/brave-flags.conf.tmpl +7 -0
- package/dot_config/btop/btop.conf +16 -0
- package/dot_config/btop/themes/tokyonight.theme +34 -0
- package/dot_config/bun/bunfig.toml.tmpl +33 -0
- package/dot_config/claude/mcp_servers.json +20 -0
- package/dot_config/containers/containers.conf +14 -0
- package/dot_config/curl/dot_curlrc +18 -0
- package/dot_config/dlv/config.yml +39 -0
- package/dot_config/docker/config.json +15 -0
- package/dot_config/dotfiles/agent-card.json +29 -0
- package/dot_config/dotfiles/agent-profiles.json +92 -0
- package/dot_config/dotfiles/boot/README.md +13 -0
- package/dot_config/dotfiles/grub/README.md +13 -0
- package/dot_config/dotfiles/lock/README.md +13 -0
- package/dot_config/dotfiles/mcp-lock.json +33 -0
- package/dot_config/dotfiles/mcp-policy.json +52 -0
- package/dot_config/dotfiles/mcp-registry.json +47 -0
- package/dot_config/dotfiles/model-registry.json +20 -0
- package/dot_config/dotfiles/policy-bundles.json +38 -0
- package/dot_config/dotfiles/prompt-registry.json +16 -0
- package/dot_config/dotfiles/versions.env +18 -0
- package/dot_config/duf/duf.conf +6 -0
- package/dot_config/duti/defaults.duti +5 -0
- package/dot_config/emoji/emoji.txt +34 -0
- package/dot_config/environment.d/50-ssh-agent.conf +2 -0
- package/dot_config/environment.d/90-wayland.conf +19 -0
- package/dot_config/fastfetch/config.jsonc +28 -0
- package/dot_config/firefox/user.js.tmpl +58 -0
- package/dot_config/fish/completions/dot-theme-sync.fish.tmpl +9 -0
- package/dot_config/fish/completions/dot.fish.tmpl +115 -0
- package/dot_config/fish/conf.d/000-perf-cache.fish +56 -0
- package/dot_config/fish/conf.d/aliases.fish.tmpl +77 -0
- package/dot_config/fish/conf.d/env.fish.tmpl +48 -0
- package/dot_config/fish/conf.d/functions.fish.tmpl +22 -0
- package/dot_config/fish/conf.d/init.fish.tmpl +172 -0
- package/dot_config/fish/config.fish.tmpl +44 -0
- package/dot_config/fish/fish_plugins +1 -0
- package/dot_config/fish/functions/_.fish +3 -0
- package/dot_config/fish/functions/_cached_eval.fish +131 -0
- package/dot_config/fish/functions/_cached_eval_clear.fish +17 -0
- package/dot_config/fish/functions/als.fish +46 -0
- package/dot_config/fish/functions/bg-upgrade.fish +7 -0
- package/dot_config/fish/functions/c.fish +3 -0
- package/dot_config/fish/functions/cat.fish +9 -0
- package/dot_config/fish/functions/d.fish +7 -0
- package/dot_config/fish/functions/dot.fish +34 -0
- package/dot_config/fish/functions/h.fish +3 -0
- package/dot_config/fish/functions/l.fish +7 -0
- package/dot_config/fish/functions/la.fish +7 -0
- package/dot_config/fish/functions/ll.fish +7 -0
- package/dot_config/fish/functions/log_error.fish +13 -0
- package/dot_config/fish/functions/log_info.fish +13 -0
- package/dot_config/fish/functions/lr.fish +7 -0
- package/dot_config/fish/functions/lra.fish +7 -0
- package/dot_config/fish/functions/ls.fish +7 -0
- package/dot_config/fish/functions/lt.fish +7 -0
- package/dot_config/fish/functions/lta.fish +7 -0
- package/dot_config/fish/functions/notify-run.fish +11 -0
- package/dot_config/fish/functions/q.fish +3 -0
- package/dot_config/fish/functions/silent-run.fish +7 -0
- package/dot_config/fish/functions/yy.fish +8 -0
- package/dot_config/flatpak/flatpak.list +4 -0
- package/dot_config/fontconfig/fonts.conf.tmpl +57 -0
- package/dot_config/foot/foot.ini.tmpl +33 -0
- package/dot_config/fuzzel/fuzzel.ini.tmpl +18 -0
- package/dot_config/fzf/fzf.zsh +48 -0
- package/dot_config/gem/gemrc +9 -0
- package/dot_config/gh/config.yml +12 -0
- package/dot_config/ghostty/config.tmpl +165 -0
- package/dot_config/git/allowed_signers.tmpl +18 -0
- package/dot_config/git/attributes +12 -0
- package/dot_config/git/commit-template +10 -0
- package/dot_config/git/hooks/executable_commit-msg +146 -0
- package/dot_config/git/ignore +27 -0
- package/dot_config/gnupg/gpg-agent.conf +11 -0
- package/dot_config/go/golangci.yml +118 -0
- package/dot_config/go/gopls.json +30 -0
- package/dot_config/goose/config.yaml +29 -0
- package/dot_config/gtk-3.0/gtk.css.tmpl +184 -0
- package/dot_config/gtk-3.0/settings.ini.tmpl +27 -0
- package/dot_config/gtk-4.0/gtk.css.tmpl +252 -0
- package/dot_config/gtk-4.0/settings.ini.tmpl +18 -0
- package/dot_config/htop/htoprc +20 -0
- package/dot_config/inputrc +2 -0
- package/dot_config/ipython/profile_default/ipython_config.py +19 -0
- package/dot_config/just/justfile +122 -0
- package/dot_config/k9s/config.yaml +65 -0
- package/dot_config/k9s/skins/catppuccin-mocha.yaml +116 -0
- package/dot_config/kanshi/config.tmpl +22 -0
- package/dot_config/karabiner/karabiner.json +14 -0
- package/dot_config/kitty/kitty.conf.tmpl +53 -0
- package/dot_config/lazydocker/config.yml +186 -0
- package/dot_config/lazygit/config.yml +35 -0
- package/dot_config/mako/config +47 -0
- package/dot_config/mas/masapps.txt +5 -0
- package/dot_config/micro/settings.json +3 -0
- package/dot_config/mimeapps.list +77 -0
- package/dot_config/minikube/config.json +13 -0
- package/dot_config/mise/config.toml +99 -0
- package/dot_config/mongosh/mongoshrc.js +68 -0
- package/dot_config/mpv/input.conf +47 -0
- package/dot_config/mpv/mpv.conf +47 -0
- package/dot_config/mycli/myclirc +67 -0
- package/dot_config/nano/nanorc +28 -0
- package/dot_config/ncdu/config +12 -0
- package/dot_config/niri/config.kdl.tmpl +327 -0
- package/dot_config/nushell/aliases.nu +18 -0
- package/dot_config/nushell/cached_eval.nu +80 -0
- package/dot_config/nushell/completions.nu.tmpl +52 -0
- package/dot_config/nushell/config.nu.tmpl +86 -0
- package/dot_config/nushell/env.nu.tmpl +102 -0
- package/dot_config/nushell/functions.nu.tmpl +17 -0
- package/dot_config/nvim/init.lua +18 -0
- package/dot_config/nvim/lazy-lock.json +58 -0
- package/dot_config/nvim/lua/config/autocmds.lua +107 -0
- package/dot_config/nvim/lua/config/keymaps.lua +92 -0
- package/dot_config/nvim/lua/config/lazy.lua +44 -0
- package/dot_config/nvim/lua/config/options.lua +49 -0
- package/dot_config/nvim/lua/plugins/ai.lua +75 -0
- package/dot_config/nvim/lua/plugins/coding.lua +216 -0
- package/dot_config/nvim/lua/plugins/completion.lua +60 -0
- package/dot_config/nvim/lua/plugins/dap.lua +412 -0
- package/dot_config/nvim/lua/plugins/editor.lua +55 -0
- package/dot_config/nvim/lua/plugins/git.lua +10 -0
- package/dot_config/nvim/lua/plugins/lsp.lua +156 -0
- package/dot_config/nvim/lua/plugins/markdown.lua +18 -0
- package/dot_config/nvim/lua/plugins/rust.lua +34 -0
- package/dot_config/nvim/lua/plugins/sessions.lua +33 -0
- package/dot_config/nvim/lua/plugins/ui.lua +509 -0
- package/dot_config/paru/paru.conf +10 -0
- package/dot_config/pip/pip.conf.tmpl +32 -0
- package/dot_config/powershell/Microsoft.PowerShell_profile.ps1.tmpl +81 -0
- package/dot_config/pueue/pueue.yml +34 -0
- package/dot_config/pypoetry/config.toml +6 -0
- package/dot_config/pyrightconfig.json +5 -0
- package/dot_config/raycast/README.md +13 -0
- package/dot_config/redis/redisclirc +41 -0
- package/dot_config/ripgrep/ripgreprc +21 -0
- package/dot_config/shell/00-core-paths.sh.tmpl +134 -0
- package/dot_config/shell/05-core-safety.sh +48 -0
- package/dot_config/shell/10-secrets.sh +41 -0
- package/dot_config/shell/40-fzf-defaults.sh.tmpl +17 -0
- package/dot_config/shell/40-ls-colors.sh +49 -0
- package/dot_config/shell/50-logic-functions-core.sh.tmpl +11 -0
- package/dot_config/shell/50-logic-functions.sh.tmpl +11 -0
- package/dot_config/shell/51-logic-functions-extra.sh.tmpl +65 -0
- package/dot_config/shell/90-ux-aliases.sh.tmpl +121 -0
- package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +55 -0
- package/dot_config/shell/Brewfile +207 -0
- package/dot_config/shell/Brewfile.cask +92 -0
- package/dot_config/shell/Brewfile.cli +127 -0
- package/dot_config/shell/README.md +284 -0
- package/dot_config/shell/als_data.txt.tmpl +65 -0
- package/dot_config/shell/custom/auto_ls.zsh +20 -0
- package/dot_config/shell/custom/context_suggest.zsh +68 -0
- package/dot_config/shell/custom/error_analysis.zsh +45 -0
- package/dot_config/sops/dot_sops.yaml +23 -0
- package/dot_config/starship.toml.tmpl +202 -0
- package/dot_config/swaylock/config +43 -0
- package/dot_config/systemd/user/dotfiles-maintenance.service +8 -0
- package/dot_config/systemd/user/dotfiles-maintenance.timer +11 -0
- package/dot_config/systemd/user/pueued.service +12 -0
- package/dot_config/systemd/user/ssh-agent.service +12 -0
- package/dot_config/task/Taskfile.yml +86 -0
- package/dot_config/tflint/tflint.hcl +9 -0
- package/dot_config/tmux/tmux.conf.tmpl +223 -0
- package/dot_config/topgrade.toml.tmpl +54 -0
- package/dot_config/user-dirs.dirs +10 -0
- package/dot_config/vscode/extensions.txt +11 -0
- package/dot_config/vscode/settings.json.tmpl +82 -0
- package/dot_config/waybar/config.jsonc.tmpl +90 -0
- package/dot_config/waybar/style.css.tmpl +211 -0
- package/dot_config/wezterm/wezterm.lua.tmpl +64 -0
- package/dot_config/wget/wgetrc +12 -0
- package/dot_config/xdg-desktop-portal/niri-portals.conf +5 -0
- package/dot_config/yarn/yarnrc.yml +36 -0
- package/dot_config/yazi/keymap.toml +67 -0
- package/dot_config/yazi/theme.toml +102 -0
- package/dot_config/yazi/yazi.toml +40 -0
- package/dot_config/zathura/zathurarc +52 -0
- package/dot_config/zellij/config.kdl.tmpl +79 -0
- package/dot_config/zsh/dot_zprofile +7 -0
- package/dot_config/zsh/dot_zshenv +5 -0
- package/dot_config/zsh/dot_zshrc.tmpl +635 -0
- package/dot_config/zsh/rc.d/00-alias-shims.zsh +99 -0
- package/dot_config/zsh/rc.d/05-ssh-agent.zsh +18 -0
- package/dot_config/zsh/rc.d/10-env.zsh.tmpl +28 -0
- package/dot_config/zsh/rc.d/20-zinit.zsh +65 -0
- package/dot_config/zsh/rc.d/30-options.zsh.tmpl +214 -0
- package/dot_config/zsh/rc.d/40-bell.zsh +20 -0
- package/dot_config/zsh/rc.d/50-login-fortune.zsh +9 -0
- package/dot_config/zsh/rc.d/99-alias-wrapper.zsh +32 -0
- package/dot_local/bin/executable_ai-update +195 -0
- package/dot_local/bin/executable_ai_core +152 -0
- package/dot_local/bin/executable_antigravity +11 -0
- package/dot_local/bin/executable_b64 +84 -0
- package/dot_local/bin/executable_bm +79 -0
- package/dot_local/bin/executable_cb +39 -0
- package/dot_local/bin/executable_dot +596 -0
- package/dot_local/bin/executable_dot-ai +36 -0
- package/dot_local/bin/executable_dot-bootstrap +77 -0
- package/dot_local/bin/executable_dot-launch-or-focus +52 -0
- package/dot_local/bin/executable_dot-load-benchmark +31 -0
- package/dot_local/bin/executable_dot-load-benchmark-pty +77 -0
- package/dot_local/bin/executable_dot-theme-sync +952 -0
- package/dot_local/bin/executable_dot_completion +57 -0
- package/dot_local/bin/executable_dtags +28 -0
- package/dot_local/bin/executable_epoch +67 -0
- package/dot_local/bin/executable_extract +41 -0
- package/dot_local/bin/executable_gbd +52 -0
- package/dot_local/bin/executable_gd +42 -0
- package/dot_local/bin/executable_git-ai-commit +175 -0
- package/dot_local/bin/executable_git-ai-diff +169 -0
- package/dot_local/bin/executable_gl +101 -0
- package/dot_local/bin/executable_hash +161 -0
- package/dot_local/bin/executable_hashsum +160 -0
- package/dot_local/bin/executable_hex +115 -0
- package/dot_local/bin/executable_jsonv +78 -0
- package/dot_local/bin/executable_jwt +94 -0
- package/dot_local/bin/executable_kill-port +75 -0
- package/dot_local/bin/executable_lorem +118 -0
- package/dot_local/bin/executable_mkscript +35 -0
- package/dot_local/bin/executable_monitor +56 -0
- package/dot_local/bin/executable_myip +51 -0
- package/dot_local/bin/executable_notify +24 -0
- package/dot_local/bin/executable_open +38 -0
- package/dot_local/bin/executable_pw +27 -0
- package/dot_local/bin/executable_rec-start +46 -0
- package/dot_local/bin/executable_rec-stop +35 -0
- package/dot_local/bin/executable_regex +132 -0
- package/dot_local/bin/executable_start-niri +8 -0
- package/dot_local/bin/executable_tmux-sessionizer +314 -0
- package/dot_local/bin/executable_tour +177 -0
- package/dot_local/bin/executable_up +23 -0
- package/dot_local/bin/executable_update +142 -0
- package/dot_local/bin/executable_uuid +87 -0
- package/dot_local/bin/executable_win +32 -0
- package/dot_local/bin/executable_yamlv +57 -0
- package/dot_local/share/bash-completion/completions/dot +72 -0
- package/dot_local/share/icons/hicolor/128x128/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/16x16/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/24x24/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/256x256/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/32x32/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/48x48/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/512x512/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/64x64/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/96x96/apps/rousseau.png +0 -0
- package/dot_local/share/icons/hicolor/scalable/apps/rousseau.png +0 -0
- package/dot_local/share/man/man1/dot.1 +149 -0
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_download +64 -0
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_install +18 -0
- package/dot_local/share/mise/plugins/kiro-cli/bin/executable_list-all +13 -0
- package/dot_local/share/wayland-sessions/niri.desktop.tmpl +6 -0
- package/dot_local/share/zsh/completions/.keep +0 -0
- package/dot_local/share/zsh/completions/_dot +283 -0
- package/install.sh +350 -0
- package/package.json +1 -1
- package/scripts/ci/check-copyright-headers.sh +96 -0
- package/scripts/ci/check-dangerous-chmod.sh +19 -0
- package/scripts/ci/check-deps-dev.sh +236 -0
- package/scripts/ci/check-insecure-tls.sh +61 -0
- package/scripts/ci/check-regression-traceability.sh +67 -0
- package/scripts/ci/check-shell-preamble.sh +106 -0
- package/scripts/ci/guard-gitleaks-checkout.sh +57 -0
- package/scripts/ci/install-chezmoi-verified.sh +64 -0
- package/scripts/ci/run-coverage.sh +362 -0
- package/scripts/ci/validate-chezmoidata.sh +25 -0
- package/scripts/ci/validate-ci-config.sh +224 -0
- package/scripts/demo/record.sh +42 -0
- package/scripts/diagnostics/a2a-conformance.sh +162 -0
- package/scripts/diagnostics/alias-governance.sh +137 -0
- package/scripts/diagnostics/aliases-cheatsheet.sh +73 -0
- package/scripts/diagnostics/aliases-manifest.sh +31 -0
- package/scripts/diagnostics/benchmark.sh +381 -0
- package/scripts/diagnostics/conflicts.sh +72 -0
- package/scripts/diagnostics/doctor-unified.sh +38 -0
- package/scripts/diagnostics/doctor.sh +709 -0
- package/scripts/diagnostics/drift-dashboard.sh +201 -0
- package/scripts/diagnostics/health.sh +614 -0
- package/scripts/diagnostics/history-analysis.sh +85 -0
- package/scripts/diagnostics/mcp-doctor.sh +575 -0
- package/scripts/diagnostics/perf.sh +452 -0
- package/scripts/diagnostics/scorecard.sh +118 -0
- package/scripts/diagnostics/secret-governance.sh +58 -0
- package/scripts/diagnostics/security-score.sh +438 -0
- package/scripts/diagnostics/smoke-test.sh +87 -0
- package/scripts/diagnostics/snapshot.sh +89 -0
- package/scripts/diagnostics/verify.sh +107 -0
- package/scripts/{verify_state.sh → diagnostics/verify_state.sh} +22 -22
- package/scripts/diagnostics/version-locks.sh +79 -0
- package/scripts/diagnostics/workstation-attestation.sh +186 -0
- package/scripts/docs/build-manual.sh +883 -0
- package/scripts/docs/check-manual.sh +213 -0
- package/scripts/dot/commands/agent.sh +474 -0
- package/scripts/dot/commands/ai.sh +481 -0
- package/scripts/dot/commands/aliases.sh +250 -0
- package/scripts/dot/commands/appearance.sh +80 -0
- package/scripts/dot/commands/core.sh +185 -0
- package/scripts/dot/commands/diagnostics.sh +229 -0
- package/scripts/dot/commands/fleet.sh +399 -0
- package/scripts/dot/commands/lint.sh +177 -0
- package/scripts/dot/commands/manual.sh +168 -0
- package/scripts/dot/commands/meta.sh +248 -0
- package/scripts/dot/commands/patterns.sh +54 -0
- package/scripts/dot/commands/restore.sh +231 -0
- package/scripts/dot/commands/secrets.sh +223 -0
- package/scripts/dot/commands/security.sh +76 -0
- package/scripts/dot/commands/tools.sh +469 -0
- package/scripts/dot/data/alias-deprecations.tsv +2 -0
- package/scripts/dot/lib/bento.sh +50 -0
- package/scripts/dot/lib/log.sh +200 -0
- package/scripts/dot/lib/platform.sh +99 -0
- package/scripts/dot/lib/ui.sh +518 -0
- package/scripts/dot/lib/utils.sh +377 -0
- package/scripts/fonts/install-nerd-fonts.sh +68 -0
- package/scripts/fonts/patch-fonts.sh +35 -0
- package/scripts/git-hooks/install.sh +11 -0
- package/scripts/git-hooks/pre-commit +12 -0
- package/scripts/git-hooks/pre-commit-audit.sh +145 -0
- package/scripts/git-hooks/pre-push +92 -0
- package/scripts/git-hooks/prepare-commit-msg +29 -0
- package/scripts/lib/secrets_provider.sh +158 -0
- package/scripts/maintenance/check-updates.sh +131 -0
- package/scripts/ops/ai-setup.sh +55 -0
- package/scripts/ops/bundle.sh +77 -0
- package/scripts/ops/chaos.sh +49 -0
- package/scripts/ops/chezmoi-apply.sh +270 -0
- package/scripts/ops/chezmoi-diff.sh +15 -0
- package/scripts/ops/chezmoi-remove.sh +45 -0
- package/scripts/ops/chezmoi-update.sh +48 -0
- package/scripts/ops/heal-chezmoi.sh +86 -0
- package/scripts/ops/heal-system.sh +128 -0
- package/scripts/ops/heal-tools.sh +340 -0
- package/scripts/ops/heal.sh +222 -0
- package/scripts/ops/post-apply-repair.sh +106 -0
- package/scripts/ops/prewarm.sh +127 -0
- package/scripts/ops/release.sh +252 -0
- package/scripts/ops/rollback.sh +589 -0
- package/scripts/ops/setup.sh +137 -0
- package/scripts/ops/teleport.sh +33 -0
- package/scripts/qa/coverage-baseline.sh +60 -0
- package/scripts/qa/docs-coverage.sh +111 -0
- package/scripts/qa/powershell-contract.ps1 +95 -0
- package/scripts/qa/reliability-audit.sh +138 -0
- package/scripts/qa/traceability-coverage.sh +116 -0
- package/scripts/qa/validate-examples.sh +26 -0
- package/scripts/qa/wsl-contract.sh +11 -0
- package/scripts/release/package-policy-bundles.sh +125 -0
- package/scripts/secrets/age-init.sh +70 -0
- package/scripts/secrets/create-secrets-file.sh +45 -0
- package/scripts/secrets/encrypt-ssh-key.sh +43 -0
- package/scripts/security/backup.sh +57 -0
- package/scripts/security/dns-doh.sh +51 -0
- package/scripts/security/encryption-check.sh +54 -0
- package/scripts/security/enforce-policies.sh +334 -0
- package/scripts/security/firewall.sh +90 -0
- package/scripts/security/lock-configs.sh +57 -0
- package/scripts/security/lock-screen.sh +55 -0
- package/scripts/security/manage-secrets.sh +428 -0
- package/scripts/security/ssh-cert.sh +203 -0
- package/scripts/security/telemetry-kill.sh +50 -0
- package/scripts/security/usb-safety.sh +51 -0
- package/scripts/theme/apply-gnome-theme.sh +328 -0
- package/scripts/theme/extract-theme.py +677 -0
- package/scripts/theme/install-boot-logo.sh +62 -0
- package/scripts/theme/install-catppuccin-themes.sh +370 -0
- package/scripts/theme/install-cursors.sh +25 -0
- package/scripts/theme/install-file-icons.sh +26 -0
- package/scripts/theme/install-grub-theme.sh +61 -0
- package/scripts/theme/install-lock-icon.sh +30 -0
- package/scripts/theme/merge-wallpaper.sh +145 -0
- package/scripts/theme/rebuild-themes.sh +309 -0
- package/scripts/theme/switch.sh +431 -0
- package/scripts/theme/wallpaper-rotate.sh +136 -0
- package/scripts/theme/wallpaper-sync.sh +397 -0
- package/scripts/tools/cmatrix.sh +21 -0
- package/scripts/{detect-collisions.py → tools/detect-collisions.py} +2 -2
- package/scripts/tools/emoji-picker.sh +48 -0
- package/scripts/tools/figlet-banner.sh +18 -0
- package/scripts/tools/log-rotate.sh +30 -0
- package/scripts/tools/lolcat-wrap.sh +19 -0
- package/scripts/tools/pipes.sh +48 -0
- package/scripts/tuning/linux.sh +185 -0
- package/scripts/tuning/macos.sh +55 -0
- package/scripts/uninstall.sh +85 -0
- package/scripts/version-sync.sh +487 -0
- package/templates/chezmoi-data/geekom-a9.toml.example +21 -0
- package/templates/chezmoi-data/mac-m1.toml.example +16 -0
- package/templates/chezmoi-data/mac-t2-linux.toml.example +21 -0
- package/templates/chezmoi-data/surface-pro-7p.toml.example +21 -0
- package/templates/projects/go/.github/workflows/ci.yml +31 -0
- package/templates/projects/go/README.md +4 -0
- package/templates/projects/go/cmd/__PROJECT_NAME__/main.go +1 -0
- package/templates/projects/go/go.sum +0 -0
- package/templates/projects/molecule/README.md +7 -0
- package/templates/projects/molecule/converge.yml +7 -0
- package/templates/projects/molecule/molecule.yml +16 -0
- package/templates/projects/node/.github/workflows/ci.yml +30 -0
- package/templates/projects/node/README.md +4 -0
- package/templates/projects/node/package-lock.json +12 -0
- package/templates/projects/node/src/index.js +1 -0
- package/templates/projects/packer/README.md +15 -0
- package/templates/projects/packer/main.pkr.hcl +15 -0
- package/templates/projects/python/.github/workflows/ci.yml +34 -0
- package/templates/projects/python/README.md +4 -0
- package/templates/projects/python/pyproject.toml +15 -0
- package/templates/projects/python/src/__PROJECT_NAME__/__init__.py +1 -0
- package/templates/projects/python/tests/test_basic.py +1 -0
- package/docs/ARCHITECTURE.md +0 -62
- package/docs/COMPLIANCE.md +0 -47
- package/docs/OPERATIONS.md +0 -103
- package/docs/PR_DESCRIPTION.md +0 -150
- package/docs/ROADMAP_legacy.md +0 -556
- package/docs/SECURITY_CHECKLIST.md +0 -25
- package/docs/TASK.md +0 -99
- package/docs/WALKTHROUGH.md +0 -46
- package/scripts/backup.sh +0 -142
- package/scripts/banner.sh +0 -20
- package/scripts/benchmark.sh +0 -20
- package/scripts/build.sh +0 -41
- package/scripts/clean.sh +0 -31
- package/scripts/compile.sh +0 -54
- package/scripts/copy.sh +0 -108
- package/scripts/doctor.sh +0 -79
- package/scripts/dotfiles.sh +0 -63
- package/scripts/download.sh +0 -35
- package/scripts/help.sh +0 -57
- package/scripts/lock-configs.sh +0 -57
- package/scripts/package.sh +0 -46
- package/scripts/ssh.sh +0 -55
- package/scripts/teleport.sh +0 -23
- package/scripts/test-aliases.sh +0 -25
- package/scripts/test_smoke.sh +0 -88
- package/scripts/unpack.sh +0 -28
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
# Copyright header validator (zero-tolerance policy).
|
|
4
|
+
#
|
|
5
|
+
# Scans source files for a copyright header in the first 10 lines. Patterns
|
|
6
|
+
# are deliberately narrow to avoid false positives on C-style `(c)` comments
|
|
7
|
+
# or the word "token" appearing in running text.
|
|
8
|
+
#
|
|
9
|
+
# Usage:
|
|
10
|
+
# check-copyright-headers.sh [--extensions=sh,lua,nix,...] [--excludes=REGEX]
|
|
11
|
+
#
|
|
12
|
+
# Exit codes:
|
|
13
|
+
# 0 all files have a valid header
|
|
14
|
+
# 1 one or more files are missing a header
|
|
15
|
+
# 2 invalid invocation
|
|
16
|
+
|
|
17
|
+
set -euo pipefail
|
|
18
|
+
|
|
19
|
+
EXTENSIONS_DEFAULT="sh,lua,nix,py,js,ts,go,rs,java,cpp,c,h,hpp"
|
|
20
|
+
EXCLUDES_DEFAULT='(^|/)(node_modules|\.git|vendor|target|build)/|\.tmpl$|(^|/)\.chezmoitemplates/'
|
|
21
|
+
|
|
22
|
+
EXTENSIONS="$EXTENSIONS_DEFAULT"
|
|
23
|
+
EXCLUDES="$EXCLUDES_DEFAULT"
|
|
24
|
+
|
|
25
|
+
for arg in "$@"; do
|
|
26
|
+
case "$arg" in
|
|
27
|
+
--extensions=*) EXTENSIONS="${arg#*=}" ;;
|
|
28
|
+
--excludes=*) EXCLUDES="${arg#*=}" ;;
|
|
29
|
+
-h | --help)
|
|
30
|
+
sed -n '2,14p' "$0" | sed 's/^# \{0,1\}//'
|
|
31
|
+
exit 0
|
|
32
|
+
;;
|
|
33
|
+
*)
|
|
34
|
+
echo "Unknown argument: $arg" >&2
|
|
35
|
+
exit 2
|
|
36
|
+
;;
|
|
37
|
+
esac
|
|
38
|
+
done
|
|
39
|
+
|
|
40
|
+
# Narrow patterns — each must be specific enough that running prose cannot match.
|
|
41
|
+
# Deliberately DROPPED: bare "(c) " (false-positives in C comments),
|
|
42
|
+
# bare "All rights reserved" (often appears in vendored prose).
|
|
43
|
+
# Matched by `grep -F`, so these are literal strings.
|
|
44
|
+
PATTERNS=(
|
|
45
|
+
"Copyright (c)"
|
|
46
|
+
"Copyright ©"
|
|
47
|
+
"SPDX-License-Identifier:"
|
|
48
|
+
"© "
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
# Build a ripgrep glob like `{*.sh,*.lua,*.nix}` from the comma list.
|
|
52
|
+
IFS=',' read -r -a exts <<<"$EXTENSIONS"
|
|
53
|
+
glob="{"
|
|
54
|
+
for i in "${!exts[@]}"; do
|
|
55
|
+
[[ $i -gt 0 ]] && glob+=","
|
|
56
|
+
glob+="*.${exts[$i]}"
|
|
57
|
+
done
|
|
58
|
+
glob+="}"
|
|
59
|
+
|
|
60
|
+
mapfile -t all_files < <(rg --files -g "$glob" 2>/dev/null || true)
|
|
61
|
+
|
|
62
|
+
if [[ "${#all_files[@]}" -eq 0 ]]; then
|
|
63
|
+
echo "::notice::No files matched extensions: $EXTENSIONS"
|
|
64
|
+
exit 0
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
missing=()
|
|
68
|
+
for file in "${all_files[@]}"; do
|
|
69
|
+
if [[ "$file" =~ $EXCLUDES ]]; then
|
|
70
|
+
continue
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
found=false
|
|
74
|
+
# Read the first 10 lines once; search each pattern against that buffer.
|
|
75
|
+
head_buf="$(head -n 10 "$file" 2>/dev/null || true)"
|
|
76
|
+
for pattern in "${PATTERNS[@]}"; do
|
|
77
|
+
if grep -qF -- "$pattern" <<<"$head_buf"; then
|
|
78
|
+
found=true
|
|
79
|
+
break
|
|
80
|
+
fi
|
|
81
|
+
done
|
|
82
|
+
|
|
83
|
+
$found || missing+=("$file")
|
|
84
|
+
done
|
|
85
|
+
|
|
86
|
+
if [[ "${#missing[@]}" -gt 0 ]]; then
|
|
87
|
+
echo "::error::Copyright header validation failed — ${#missing[@]} file(s) missing header"
|
|
88
|
+
echo "Files missing a recognised copyright header:"
|
|
89
|
+
printf ' - %s\n' "${missing[@]}"
|
|
90
|
+
echo
|
|
91
|
+
echo "Add ONE of the following to the first 10 lines:"
|
|
92
|
+
printf ' - %s\n' "${PATTERNS[@]}"
|
|
93
|
+
exit 1
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
echo "::notice::All ${#all_files[@]} file(s) have a valid copyright header"
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# check-dangerous-chmod.sh — block `chmod 777` / `chmod 666` patterns
|
|
5
|
+
# from landing in shell scripts.
|
|
6
|
+
#
|
|
7
|
+
# Invoked as a pre-commit local hook (no filename args; scans the repo).
|
|
8
|
+
# Extracted from `config/pre-commit-config.yaml` under #866.
|
|
9
|
+
# =============================================================================
|
|
10
|
+
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
PATTERN='^[[:space:]]*chmod[[:space:]]+(-R[[:space:]]+)?(777|666)'
|
|
14
|
+
|
|
15
|
+
if grep -rn --include='*.sh' -E "$PATTERN" . 2>/dev/null | grep -v '^Binary'; then
|
|
16
|
+
echo "ERROR: Dangerous chmod patterns found (777 or 666)." >&2
|
|
17
|
+
echo "Use the minimum permissions actually required; document any exception." >&2
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# check-deps-dev.sh — Validate direct dependencies against the deps.dev
|
|
5
|
+
# Insights API. Catches supply-chain risk a Grype-only scan misses:
|
|
6
|
+
# stale-but-CVE-free packages, unattested artifacts, and packages with
|
|
7
|
+
# advisories that haven't yet been mapped to a CVE.
|
|
8
|
+
#
|
|
9
|
+
# Scans:
|
|
10
|
+
# * `package.json` — direct `dependencies` + `devDependencies` (npm).
|
|
11
|
+
# * `pyproject.toml` — direct `[project.dependencies]` (Python).
|
|
12
|
+
# * `.github/workflows/*.yml` — `uses:` action references (GitHub Actions).
|
|
13
|
+
#
|
|
14
|
+
# Skips ecosystems with no matching manifest.
|
|
15
|
+
#
|
|
16
|
+
# Exit codes:
|
|
17
|
+
# 0 no advisories found (or all under threshold).
|
|
18
|
+
# 1 one or more direct deps have advisories at or above the threshold.
|
|
19
|
+
# 2 prerequisites missing (jq / curl / python3).
|
|
20
|
+
#
|
|
21
|
+
# Closes part of #877.
|
|
22
|
+
# =============================================================================
|
|
23
|
+
|
|
24
|
+
set -uo pipefail
|
|
25
|
+
|
|
26
|
+
REPO_ROOT="${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"
|
|
27
|
+
THRESHOLD="${DEPS_DEV_SEVERITY_THRESHOLD:-HIGH}" # LOW | MEDIUM | HIGH | CRITICAL
|
|
28
|
+
DEPS_DEV_BASE="${DEPS_DEV_BASE:-https://api.deps.dev/v3}"
|
|
29
|
+
EXCEPTIONS_FILE="$REPO_ROOT/docs/security/DEPS_DEV_EXCEPTIONS.md"
|
|
30
|
+
SARIF_OUT="${DEPS_DEV_SARIF_OUT:-}"
|
|
31
|
+
|
|
32
|
+
# Strict mode: bail on prerequisites.
|
|
33
|
+
for cmd in jq curl python3; do
|
|
34
|
+
if ! command -v "$cmd" >/dev/null 2>&1; then
|
|
35
|
+
echo "::warning::check-deps-dev: $cmd not available — skipping." >&2
|
|
36
|
+
exit 0
|
|
37
|
+
fi
|
|
38
|
+
done
|
|
39
|
+
|
|
40
|
+
# -----------------------------------------------------------------------------
|
|
41
|
+
# Helpers
|
|
42
|
+
# -----------------------------------------------------------------------------
|
|
43
|
+
|
|
44
|
+
# severity_rank — map deps.dev severity strings to integers so we can
|
|
45
|
+
# compare against THRESHOLD numerically.
|
|
46
|
+
severity_rank() {
|
|
47
|
+
case "${1:-}" in
|
|
48
|
+
CRITICAL) echo 4 ;;
|
|
49
|
+
HIGH) echo 3 ;;
|
|
50
|
+
MEDIUM | MODERATE) echo 2 ;;
|
|
51
|
+
LOW) echo 1 ;;
|
|
52
|
+
*) echo 0 ;;
|
|
53
|
+
esac
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
THRESHOLD_RANK=$(severity_rank "$THRESHOLD")
|
|
57
|
+
|
|
58
|
+
# is_excepted — check if a (system, name) pair has an active exception
|
|
59
|
+
# entry in DEPS_DEV_EXCEPTIONS.md. Exceptions look like:
|
|
60
|
+
# `npm:lodash` (expires 2026-12-31): <reason>
|
|
61
|
+
is_excepted() {
|
|
62
|
+
local system="$1" name="$2"
|
|
63
|
+
[[ -f "$EXCEPTIONS_FILE" ]] || return 1
|
|
64
|
+
grep -Eq "^\s*\`${system}:${name}\`" "$EXCEPTIONS_FILE"
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
# fetch_advisories — query deps.dev for advisories on a (system, name,
|
|
68
|
+
# version) triple. Prints one advisory-key per line; empty if none.
|
|
69
|
+
fetch_advisories() {
|
|
70
|
+
local system="$1" name="$2" version="$3"
|
|
71
|
+
local encoded_name
|
|
72
|
+
encoded_name=$(python3 -c 'import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1], safe=""))' "$name")
|
|
73
|
+
local url="$DEPS_DEV_BASE/systems/$system/packages/$encoded_name/versions/$version"
|
|
74
|
+
curl -fsSL --max-time 15 "$url" 2>/dev/null |
|
|
75
|
+
jq -r '.advisoryKeys[]?.id // empty' 2>/dev/null ||
|
|
76
|
+
true
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
# fetch_advisory_severity — given an advisory ID, return its highest
|
|
80
|
+
# severity rating. Returns empty string when the API doesn't expose
|
|
81
|
+
# severity (older advisories sometimes lack it).
|
|
82
|
+
fetch_advisory_severity() {
|
|
83
|
+
local advisory_id="$1"
|
|
84
|
+
local encoded
|
|
85
|
+
encoded=$(python3 -c 'import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1], safe=""))' "$advisory_id")
|
|
86
|
+
curl -fsSL --max-time 15 "$DEPS_DEV_BASE/advisories/$encoded" 2>/dev/null |
|
|
87
|
+
jq -r '.severity[]?.type // empty' 2>/dev/null |
|
|
88
|
+
head -1 ||
|
|
89
|
+
true
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
# -----------------------------------------------------------------------------
|
|
93
|
+
# Manifest readers
|
|
94
|
+
# -----------------------------------------------------------------------------
|
|
95
|
+
|
|
96
|
+
# Each reader prints one "system\tname\tversion" line per direct dep.
|
|
97
|
+
|
|
98
|
+
read_npm() {
|
|
99
|
+
local pkg="$REPO_ROOT/package.json"
|
|
100
|
+
[[ -f "$pkg" ]] || return 0
|
|
101
|
+
jq -r '
|
|
102
|
+
[.dependencies // {}, .devDependencies // {}]
|
|
103
|
+
| add // {}
|
|
104
|
+
| to_entries[]
|
|
105
|
+
| "NPM\t\(.key)\t\(.value | sub("^[~^>=<]+"; ""))"
|
|
106
|
+
' "$pkg"
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
read_pypi() {
|
|
110
|
+
local pyproj="$REPO_ROOT/pyproject.toml"
|
|
111
|
+
[[ -f "$pyproj" ]] || return 0
|
|
112
|
+
python3 - "$pyproj" <<'PY'
|
|
113
|
+
import sys
|
|
114
|
+
try:
|
|
115
|
+
import tomllib
|
|
116
|
+
except ImportError:
|
|
117
|
+
try:
|
|
118
|
+
import tomli as tomllib # type: ignore
|
|
119
|
+
except ImportError:
|
|
120
|
+
sys.exit(0)
|
|
121
|
+
data = tomllib.load(open(sys.argv[1], "rb"))
|
|
122
|
+
deps = data.get("project", {}).get("dependencies", [])
|
|
123
|
+
for spec in deps:
|
|
124
|
+
# spec is like "requests>=2.28.0"; pull name + version.
|
|
125
|
+
name = spec.split("[")[0].split(">")[0].split("<")[0].split("=")[0].strip()
|
|
126
|
+
version = ""
|
|
127
|
+
for op in (">=", "<=", "==", ">", "<"):
|
|
128
|
+
if op in spec:
|
|
129
|
+
version = spec.split(op, 1)[1].strip().split(",")[0]
|
|
130
|
+
break
|
|
131
|
+
print(f"PYPI\t{name}\t{version}")
|
|
132
|
+
PY
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
read_actions() {
|
|
136
|
+
local f
|
|
137
|
+
for f in "$REPO_ROOT"/.github/workflows/*.yml; do
|
|
138
|
+
[[ -f "$f" ]] || continue
|
|
139
|
+
# Match `uses: owner/repo@<40-hex-sha> # vX.Y.Z`
|
|
140
|
+
grep -Eo 'uses:[[:space:]]+[a-zA-Z0-9._-]+/[a-zA-Z0-9._/-]+@[a-f0-9]{40}[[:space:]]*#[[:space:]]*v[0-9.]+' "$f" |
|
|
141
|
+
sed -E 's/uses:[[:space:]]+([^@]+)@[a-f0-9]{40}[[:space:]]+#[[:space:]]+v([0-9.]+).*/GITHUB_ACTIONS\t\1\t\2/' ||
|
|
142
|
+
true
|
|
143
|
+
done | sort -u
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
# -----------------------------------------------------------------------------
|
|
147
|
+
# Main scan
|
|
148
|
+
# -----------------------------------------------------------------------------
|
|
149
|
+
|
|
150
|
+
findings=()
|
|
151
|
+
total_scanned=0
|
|
152
|
+
|
|
153
|
+
scan_one() {
|
|
154
|
+
local system="$1" name="$2" version="$3"
|
|
155
|
+
[[ -z "$name" || -z "$version" ]] && return 0
|
|
156
|
+
total_scanned=$((total_scanned + 1))
|
|
157
|
+
|
|
158
|
+
if is_excepted "$system" "$name"; then
|
|
159
|
+
echo " - skip $system:$name@$version (excepted)" >&2
|
|
160
|
+
return 0
|
|
161
|
+
fi
|
|
162
|
+
|
|
163
|
+
local advs
|
|
164
|
+
advs=$(fetch_advisories "$system" "$name" "$version")
|
|
165
|
+
[[ -z "$advs" ]] && return 0
|
|
166
|
+
|
|
167
|
+
while IFS= read -r adv; do
|
|
168
|
+
[[ -z "$adv" ]] && continue
|
|
169
|
+
local sev
|
|
170
|
+
sev=$(fetch_advisory_severity "$adv")
|
|
171
|
+
local rank
|
|
172
|
+
rank=$(severity_rank "$sev")
|
|
173
|
+
if ((rank >= THRESHOLD_RANK)); then
|
|
174
|
+
findings+=("$system:$name@$version :: $adv ($sev)")
|
|
175
|
+
echo "::warning::deps.dev advisory $sev: $system $name $version → $adv" >&2
|
|
176
|
+
fi
|
|
177
|
+
done <<<"$advs"
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
echo "Scanning manifests under $REPO_ROOT ..." >&2
|
|
181
|
+
|
|
182
|
+
# 1. npm
|
|
183
|
+
while IFS=$'\t' read -r system name version; do
|
|
184
|
+
scan_one "$system" "$name" "$version"
|
|
185
|
+
done < <(read_npm)
|
|
186
|
+
|
|
187
|
+
# 2. pypi
|
|
188
|
+
while IFS=$'\t' read -r system name version; do
|
|
189
|
+
scan_one "$system" "$name" "$version"
|
|
190
|
+
done < <(read_pypi)
|
|
191
|
+
|
|
192
|
+
# 3. GitHub Actions (best-effort — deps.dev coverage is partial)
|
|
193
|
+
while IFS=$'\t' read -r system name version; do
|
|
194
|
+
scan_one "$system" "$name" "$version"
|
|
195
|
+
done < <(read_actions)
|
|
196
|
+
|
|
197
|
+
echo "Scanned $total_scanned direct dependencies." >&2
|
|
198
|
+
|
|
199
|
+
# Optional SARIF emission for Code Scanning upload.
|
|
200
|
+
if [[ -n "$SARIF_OUT" ]]; then
|
|
201
|
+
python3 - "$SARIF_OUT" "${findings[@]+"${findings[@]}"}" <<'PY'
|
|
202
|
+
import json, sys
|
|
203
|
+
out = sys.argv[1]
|
|
204
|
+
findings = sys.argv[2:]
|
|
205
|
+
runs = [{
|
|
206
|
+
"tool": {"driver": {
|
|
207
|
+
"name": "check-deps-dev",
|
|
208
|
+
"version": "1.0.0",
|
|
209
|
+
"informationUri": "https://deps.dev",
|
|
210
|
+
}},
|
|
211
|
+
"results": [
|
|
212
|
+
{
|
|
213
|
+
"ruleId": "deps-dev-advisory",
|
|
214
|
+
"level": "error",
|
|
215
|
+
"message": {"text": f},
|
|
216
|
+
}
|
|
217
|
+
for f in findings
|
|
218
|
+
],
|
|
219
|
+
}]
|
|
220
|
+
with open(out, "w") as fp:
|
|
221
|
+
json.dump({"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": runs}, fp)
|
|
222
|
+
print(f"SARIF written: {out}")
|
|
223
|
+
PY
|
|
224
|
+
fi
|
|
225
|
+
|
|
226
|
+
if [[ "${#findings[@]}" -gt 0 ]]; then
|
|
227
|
+
echo "" >&2
|
|
228
|
+
echo "::error::${#findings[@]} dep(s) flagged at or above ${THRESHOLD}." >&2
|
|
229
|
+
printf ' %s\n' "${findings[@]}" >&2
|
|
230
|
+
echo "" >&2
|
|
231
|
+
echo "Document exceptions at docs/security/DEPS_DEV_EXCEPTIONS.md with expiry dates." >&2
|
|
232
|
+
exit 1
|
|
233
|
+
fi
|
|
234
|
+
|
|
235
|
+
echo "deps.dev validation: clean." >&2
|
|
236
|
+
exit 0
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# check-insecure-tls.sh — block `curl -k` / `curl --insecure` /
|
|
5
|
+
# `wget --no-check-certificate` patterns from landing.
|
|
6
|
+
#
|
|
7
|
+
# Invoked as a pre-commit local hook (no filename args; scans the repo).
|
|
8
|
+
# Extracted from `config/pre-commit-config.yaml` under #866 so the line
|
|
9
|
+
# is yamllint-clean and the matcher can be tested in isolation.
|
|
10
|
+
#
|
|
11
|
+
# Matcher uses awk for proper tokenization (the previous inline grep
|
|
12
|
+
# regex false-positive'd `-k` inside package names like `-keyring`).
|
|
13
|
+
# =============================================================================
|
|
14
|
+
|
|
15
|
+
set -euo pipefail
|
|
16
|
+
|
|
17
|
+
ROOT="${1:-.}"
|
|
18
|
+
|
|
19
|
+
# Awk body intentionally lives in a variable. The $i / $NF / FILENAME /
|
|
20
|
+
# NR references inside are awk's own field/record variables — NOT shell
|
|
21
|
+
# variables — so the whole body must stay literal (single-quoted). The
|
|
22
|
+
# SC2016 suppression is the canonical signal to readers + linters that
|
|
23
|
+
# this is intentional.
|
|
24
|
+
# shellcheck disable=SC2016
|
|
25
|
+
AWK_BODY='
|
|
26
|
+
# Each input line tokenized on whitespace. Flag if the line uses
|
|
27
|
+
# curl/wget and a known insecure flag appears as a standalone token.
|
|
28
|
+
{
|
|
29
|
+
has_curl = 0; has_wget = 0
|
|
30
|
+
bad = ""
|
|
31
|
+
for (i = 1; i <= NF; i++) {
|
|
32
|
+
tok = $i
|
|
33
|
+
if (tok == "curl") has_curl = 1
|
|
34
|
+
if (tok == "wget") has_wget = 1
|
|
35
|
+
if (has_curl && (tok == "-k" || tok == "--insecure" || tok ~ /^--insecure=/)) {
|
|
36
|
+
bad = tok
|
|
37
|
+
}
|
|
38
|
+
if (has_wget && (tok == "--no-check-certificate" || tok ~ /^--no-check-certificate=/)) {
|
|
39
|
+
bad = tok
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (bad != "") printf "%s:%d:%s\n", FILENAME, NR, bad
|
|
43
|
+
}
|
|
44
|
+
'
|
|
45
|
+
|
|
46
|
+
matches=$(
|
|
47
|
+
grep -rln \
|
|
48
|
+
--include='*.sh' --include='*.bash' --include='*.zsh' --include='*.tmpl' \
|
|
49
|
+
--exclude-dir='.git' \
|
|
50
|
+
--exclude='check-insecure-tls.sh' \
|
|
51
|
+
-E '\b(curl|wget)\b' \
|
|
52
|
+
"$ROOT" 2>/dev/null |
|
|
53
|
+
xargs -I{} awk "$AWK_BODY" {} 2>/dev/null
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
if [[ -n "$matches" ]]; then
|
|
57
|
+
echo "ERROR: Insecure TLS patterns found." >&2
|
|
58
|
+
echo "$matches" >&2
|
|
59
|
+
echo "Remove the flag or, if absolutely required, pin the cert and document the why." >&2
|
|
60
|
+
exit 1
|
|
61
|
+
fi
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# check-regression-traceability.sh — enforce a `# Regression for:` header on
|
|
5
|
+
# every file under `tests/regression/`, with one of three accepted forms:
|
|
6
|
+
#
|
|
7
|
+
# # Regression for: GH-1234
|
|
8
|
+
# # Regression for: <7-or-more-char-sha-prefix>
|
|
9
|
+
# # Regression for: pre-history
|
|
10
|
+
#
|
|
11
|
+
# The first two are required for any test introduced as part of fixing a
|
|
12
|
+
# known issue or shipping a known commit. The third is an explicit "we
|
|
13
|
+
# couldn't trace it" marker — still trackable, just not auto-resolvable.
|
|
14
|
+
#
|
|
15
|
+
# Invocation:
|
|
16
|
+
# * pre-commit local hook (files passed as args)
|
|
17
|
+
# * standalone: ./scripts/ci/check-regression-traceability.sh
|
|
18
|
+
# =============================================================================
|
|
19
|
+
|
|
20
|
+
set -euo pipefail
|
|
21
|
+
|
|
22
|
+
PATTERN='^# *Regression for: *(GH-[0-9]+|[0-9a-f]{7,40}|pre-history)\b'
|
|
23
|
+
|
|
24
|
+
check_one() {
|
|
25
|
+
local f="$1"
|
|
26
|
+
[[ -f "$f" ]] || return 0
|
|
27
|
+
|
|
28
|
+
# Only check files under tests/regression/
|
|
29
|
+
case "$f" in
|
|
30
|
+
tests/regression/*) ;;
|
|
31
|
+
*/tests/regression/*) ;;
|
|
32
|
+
*) return 0 ;;
|
|
33
|
+
esac
|
|
34
|
+
|
|
35
|
+
if ! head -15 "$f" | grep -Eq "$PATTERN"; then
|
|
36
|
+
echo "MISSING trace header: $f"
|
|
37
|
+
return 1
|
|
38
|
+
fi
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
fail=0
|
|
42
|
+
if [[ $# -gt 0 ]]; then
|
|
43
|
+
for f in "$@"; do
|
|
44
|
+
check_one "$f" || fail=1
|
|
45
|
+
done
|
|
46
|
+
else
|
|
47
|
+
while IFS= read -r f; do
|
|
48
|
+
check_one "$f" || fail=1
|
|
49
|
+
done < <(git ls-files "tests/regression/*.sh")
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
if [[ $fail -ne 0 ]]; then
|
|
53
|
+
cat >&2 <<'MSG'
|
|
54
|
+
|
|
55
|
+
Every file under tests/regression/ must include a trace header within
|
|
56
|
+
the first 15 lines, in one of these forms:
|
|
57
|
+
|
|
58
|
+
# Regression for: GH-1234 (preferred — link to GitHub issue)
|
|
59
|
+
# Regression for: <sha-prefix> (link to introducing commit)
|
|
60
|
+
# Regression for: pre-history (no traceable origin)
|
|
61
|
+
|
|
62
|
+
Why: regressions pinned years ago without context are forensic dead-ends
|
|
63
|
+
when they fire. See docs/operations/TESTING.md and #868.
|
|
64
|
+
|
|
65
|
+
MSG
|
|
66
|
+
exit 1
|
|
67
|
+
fi
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# check-shell-preamble.sh — Enforce `set -euo pipefail` (bash) / `set -eu` (sh)
|
|
5
|
+
# on every executable shell script in the repo.
|
|
6
|
+
#
|
|
7
|
+
# Skip-rules:
|
|
8
|
+
# * Sourced libraries that declare themselves as such via a "Sourced by ..."
|
|
9
|
+
# header comment in the first 15 lines.
|
|
10
|
+
# * Explicit opt-out via `# preamble:skip` marker in the first 15 lines
|
|
11
|
+
# (used by completion files, init fragments, and other library code that
|
|
12
|
+
# is loaded into the caller's shell context).
|
|
13
|
+
# * Files under tests/ (the test runner sets shell options for its children).
|
|
14
|
+
#
|
|
15
|
+
# Invocation:
|
|
16
|
+
# * pre-commit local hook (files passed as args)
|
|
17
|
+
# * standalone: ./scripts/ci/check-shell-preamble.sh # full repo
|
|
18
|
+
# ./scripts/ci/check-shell-preamble.sh file.sh # explicit
|
|
19
|
+
# =============================================================================
|
|
20
|
+
|
|
21
|
+
set -euo pipefail
|
|
22
|
+
|
|
23
|
+
check_one() {
|
|
24
|
+
local f="$1"
|
|
25
|
+
|
|
26
|
+
[[ -f "$f" ]] || return 0
|
|
27
|
+
|
|
28
|
+
local shebang
|
|
29
|
+
shebang="$(head -1 "$f" 2>/dev/null || true)"
|
|
30
|
+
|
|
31
|
+
# Only check files with a bash or sh shebang.
|
|
32
|
+
case "$shebang" in
|
|
33
|
+
*bash*) ;;
|
|
34
|
+
*sh) ;;
|
|
35
|
+
*) return 0 ;;
|
|
36
|
+
esac
|
|
37
|
+
|
|
38
|
+
# Skip files declaring themselves as sourced libraries or opting out.
|
|
39
|
+
if head -15 "$f" | grep -Eq '^# *(Sourced by |preamble:skip|shellcheck source-only)'; then
|
|
40
|
+
return 0
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
# Skip the test suite — tests are sourced by tests/framework/test_runner.sh
|
|
44
|
+
# which manages shell options for its children.
|
|
45
|
+
case "$f" in
|
|
46
|
+
tests/*) return 0 ;;
|
|
47
|
+
# Bulk-sourced fragments. These directories contain hundreds of
|
|
48
|
+
# alias / function / PATH snippets that are sourced into the
|
|
49
|
+
# caller's shell context — adding `set -e` locally would corrupt
|
|
50
|
+
# the caller. Path-skipped en masse rather than annotated per-file
|
|
51
|
+
# (would be 300+ marker comments).
|
|
52
|
+
.chezmoitemplates/aliases/*) return 0 ;;
|
|
53
|
+
.chezmoitemplates/functions/*) return 0 ;;
|
|
54
|
+
.chezmoitemplates/paths/*) return 0 ;;
|
|
55
|
+
# dot_config/shell/* and scripts/dot/lib/* are also sourced but
|
|
56
|
+
# have explicit `# Sourced by` headers as of #854 (defense in
|
|
57
|
+
# depth — the lint also accepts them on header alone).
|
|
58
|
+
dot_local/bin/executable_dot_completion) return 0 ;; # zsh completion, sourced into shell
|
|
59
|
+
esac
|
|
60
|
+
|
|
61
|
+
# Required preamble lives within the first 50 lines (after optional docstring).
|
|
62
|
+
local preamble_re
|
|
63
|
+
case "$shebang" in
|
|
64
|
+
*bash*)
|
|
65
|
+
preamble_re='^[[:space:]]*set[[:space:]]+-([eu]+o[[:space:]]+pipefail|euo[[:space:]]+pipefail|eu[[:space:]]*$)'
|
|
66
|
+
;;
|
|
67
|
+
*sh)
|
|
68
|
+
preamble_re='^[[:space:]]*set[[:space:]]+-eu[o]?'
|
|
69
|
+
;;
|
|
70
|
+
esac
|
|
71
|
+
|
|
72
|
+
if ! head -50 "$f" | grep -Eq "$preamble_re"; then
|
|
73
|
+
echo "MISSING preamble: $f"
|
|
74
|
+
return 1
|
|
75
|
+
fi
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
fail=0
|
|
79
|
+
if [[ $# -gt 0 ]]; then
|
|
80
|
+
for f in "$@"; do
|
|
81
|
+
check_one "$f" || fail=1
|
|
82
|
+
done
|
|
83
|
+
else
|
|
84
|
+
# Full-repo scan
|
|
85
|
+
while IFS= read -r f; do
|
|
86
|
+
check_one "$f" || fail=1
|
|
87
|
+
done < <(git ls-files | grep -E '\.sh$|^dot_local/bin/executable_|^scripts/.+\.sh$')
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
if [[ $fail -ne 0 ]]; then
|
|
91
|
+
cat >&2 <<'MSG'
|
|
92
|
+
|
|
93
|
+
Some shell scripts are missing the safety preamble.
|
|
94
|
+
* bash → `set -euo pipefail`
|
|
95
|
+
* sh → `set -eu`
|
|
96
|
+
|
|
97
|
+
If the file is a sourced library, add this header to its first 15 lines:
|
|
98
|
+
# Sourced by <parent>.sh; inherits set -euo pipefail
|
|
99
|
+
|
|
100
|
+
If the file is a shell init fragment / completion that must NOT enforce its own
|
|
101
|
+
options on the caller, add this marker instead:
|
|
102
|
+
# preamble:skip
|
|
103
|
+
|
|
104
|
+
MSG
|
|
105
|
+
exit 1
|
|
106
|
+
fi
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
# Guard against full-history gitleaks scans on manual runs.
|
|
4
|
+
# This ensures workflow checkout remains shallow near gitleaks steps.
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
check_workflow() {
|
|
9
|
+
local workflow="$1"
|
|
10
|
+
local failed=0
|
|
11
|
+
local line_no
|
|
12
|
+
|
|
13
|
+
while IFS=: read -r line_no _; do
|
|
14
|
+
local start end context
|
|
15
|
+
start=$((line_no - 16))
|
|
16
|
+
end=$((line_no + 2))
|
|
17
|
+
if [[ "$start" -lt 1 ]]; then
|
|
18
|
+
start=1
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
context="$(sed -n "${start},${end}p" "$workflow")"
|
|
22
|
+
|
|
23
|
+
if [[ "$context" != *"actions/checkout"* ]]; then
|
|
24
|
+
echo "ERROR: $workflow:$line_no missing nearby checkout for gitleaks step."
|
|
25
|
+
failed=1
|
|
26
|
+
continue
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
if [[ "$context" != *"fetch-depth: 1"* ]]; then
|
|
30
|
+
echo "ERROR: $workflow:$line_no gitleaks step must use checkout fetch-depth: 1."
|
|
31
|
+
failed=1
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
if [[ "$context" == *"fetch-depth: 0"* ]]; then
|
|
35
|
+
echo "ERROR: $workflow:$line_no gitleaks step contains forbidden fetch-depth: 0."
|
|
36
|
+
failed=1
|
|
37
|
+
fi
|
|
38
|
+
done < <(grep -n "gitleaks/gitleaks-action" "$workflow" || true)
|
|
39
|
+
|
|
40
|
+
return "$failed"
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
main() {
|
|
44
|
+
local failed=0
|
|
45
|
+
|
|
46
|
+
check_workflow ".github/workflows/ci.yml" || failed=1
|
|
47
|
+
check_workflow ".github/workflows/security-enhanced.yml" || failed=1
|
|
48
|
+
|
|
49
|
+
if [[ "$failed" -ne 0 ]]; then
|
|
50
|
+
echo "Gitleaks checkout guard failed."
|
|
51
|
+
exit 1
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
echo "Gitleaks checkout guard passed."
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
main "$@"
|