@sebastienrousseau/dotfiles 0.2.499 → 0.2.500
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 +375 -0
- package/LICENSE +1283 -0
- package/README.md +284 -0
- package/docs/.vitepress/reports/localization-readability-audit.md +69 -0
- package/docs/AI.md +102 -0
- package/docs/COPYRIGHT +4 -3
- package/docs/NAMING_CONVENTIONS.md +95 -0
- package/docs/README.md +78 -0
- package/docs/adr/ADR-001-ci-cd-pipeline.md +101 -0
- package/docs/adr/ADR-002-shell-performance.md +121 -0
- package/docs/adr/ADR-003-security-first.md +140 -0
- package/docs/adr/ADR-004-cli-architecture.md +157 -0
- package/docs/adr/ADR-005-chezmoi-choice.md +89 -0
- package/docs/adr/ADR-006-shell-selection.md +115 -0
- package/docs/adr/ADR-007-multi-shell-parity.md +53 -0
- package/docs/adr/ADR-008-alias-system-architecture.md +85 -0
- package/docs/adr/README.md +32 -0
- package/docs/architecture/ARCHITECTURE.md +113 -0
- package/docs/architecture/INTEROP.md +36 -0
- package/docs/architecture/REPO_LAYOUT.md +237 -0
- package/docs/architecture/WALKTHROUGH.md +82 -0
- package/docs/architecture/fleet-deployment.md +73 -0
- package/docs/archive/EUXIS_2026_REVIEW.md +119 -0
- package/docs/archive/LEGACY_ROADMAP.md +142 -0
- package/docs/archive/MILESTONE_v0.2.493.md +43 -0
- package/docs/{PLAN.md → archive/PLAN.md} +4 -4
- package/docs/archive/REPO_AUDIT.md +23 -0
- package/docs/guides/INSTALL.md +140 -0
- package/docs/guides/NEOVIM_IDE_GUIDE.md +52 -0
- package/docs/guides/THEMING.md +222 -0
- package/docs/guides/TROUBLESHOOTING.md +148 -0
- package/docs/guides/WSL2_NIX_TROUBLESHOOTING.md +723 -0
- package/docs/index.md +39 -0
- package/docs/interop/A2A.md +32 -0
- package/docs/manual/00-introduction.md +85 -0
- package/docs/manual/01-concepts/01-architecture.md +134 -0
- package/docs/manual/01-concepts/02-trust-model.md +178 -0
- package/docs/manual/01-concepts/03-theme-engine.md +182 -0
- package/docs/manual/01-concepts/04-fleet.md +142 -0
- package/docs/manual/01-concepts/05-self-healing.md +197 -0
- package/docs/manual/02-tutorials/01-first-install.md +192 -0
- package/docs/manual/02-tutorials/02-add-wallpaper.md +211 -0
- package/docs/manual/02-tutorials/03-create-profile.md +238 -0
- package/docs/manual/02-tutorials/04-encrypt-secret.md +275 -0
- package/docs/manual/02-tutorials/05-deploy-fleet.md +279 -0
- package/docs/manual/03-reference/01-dot-cli.md +413 -0
- package/docs/manual/03-reference/02-config-files.md +259 -0
- package/docs/manual/03-reference/03-environment.md +120 -0
- package/docs/manual/03-reference/04-templates.md +184 -0
- package/docs/manual/03-reference/05-feature-flags.md +118 -0
- package/docs/manual/04-cookbook/01-recipes.md +281 -0
- package/docs/manual/04-cookbook/02-troubleshooting.md +319 -0
- package/docs/manual/04-cookbook/03-faq.md +167 -0
- package/docs/manual/05-appendices/A-platform-matrix.md +97 -0
- package/docs/manual/05-appendices/B-security-checklist.md +78 -0
- package/docs/manual/05-appendices/C-glossary.md +36 -0
- package/docs/manual/05-appendices/D-bibliography.md +54 -0
- package/docs/manual/05-appendices/E-license.md +34 -0
- package/docs/manual/_toc.yml +58 -0
- package/docs/manual/command-index.md +58 -0
- package/docs/manual/concept-index.md +164 -0
- package/docs/operations/ATTESTATION.md +39 -0
- package/docs/operations/MAINTENANCE.md +59 -0
- package/docs/operations/MIGRATION.md +101 -0
- package/docs/operations/OPERATIONS.md +164 -0
- package/docs/operations/RELIABILITY.md +116 -0
- package/docs/{ROADMAP.md → operations/ROADMAP.md} +22 -22
- package/docs/operations/TESTING.md +195 -0
- package/docs/operations/TRACEABILITY.md +31 -0
- package/docs/operations/TRUSTED_AGENT_WORKSTATION.md +61 -0
- package/docs/operations/VERSION_SYNC.md +344 -0
- package/docs/reference/ALIASES.md +124 -0
- package/docs/reference/ALIASES_CHEATSHEET.md +28 -0
- package/docs/reference/ALIASES_DEPRECATIONS.md +9 -0
- package/docs/reference/FEATURES.md +62 -0
- package/docs/reference/FONTS.md +108 -0
- package/docs/reference/PROFILES.md +65 -0
- package/docs/reference/SCREENSHOTS.md +117 -0
- package/docs/reference/SCRIPTS.md +67 -0
- package/docs/reference/SUPPORT_MATRIX.md +74 -0
- package/docs/reference/THEMES.md +113 -0
- package/docs/reference/TOOLS.md +105 -0
- package/docs/reference/UTILS.md +151 -0
- package/docs/security/AI_ACT_COMPLIANCE.md +90 -0
- package/docs/security/AUTOMATION_SECRETS.md +22 -0
- package/docs/security/COMPLIANCE.md +453 -0
- package/docs/security/ENCRYPTION.md +52 -0
- package/docs/security/FMEA.md +155 -0
- package/docs/security/INCIDENT_RESPONSE.md +575 -0
- package/docs/security/KEYS.md +45 -0
- package/docs/security/KEY_ROTATION.md +219 -0
- package/docs/security/MCP_POLICY.md +69 -0
- package/docs/security/POLICY_RELEASES.md +33 -0
- package/docs/security/README.md +24 -0
- package/docs/security/SECRETS.md +146 -0
- package/docs/security/SECURITY.md +41 -0
- package/docs/security/SECURITY_CHECKLIST.md +44 -0
- package/docs/security/SOUP_REGISTER.md +32 -0
- package/docs/security/THREAT_MODEL.md +120 -0
- package/docs/security/VERIFICATION_VALIDATION.md +224 -0
- package/docs/themes/README.md +6 -0
- package/docs/themes/VISUAL_INTEGRITY_REPORT.md +26 -0
- package/docs/themes/hero-shot.svg +78 -0
- package/dot_config/.module-manifest.json +69 -0
- package/dot_config/ai/identity.md +20 -0
- package/dot_config/ai/patterns/architect.md +14 -0
- package/dot_config/ai/patterns/hardener.md +13 -0
- package/dot_config/ai/patterns/refactor.md +13 -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 +40 -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 +11 -0
- package/dot_config/dotfiles/grub/README.md +11 -0
- package/dot_config/dotfiles/lock/README.md +11 -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 +151 -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 +58 -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/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/completions.nu.tmpl +52 -0
- package/dot_config/nushell/config.nu.tmpl +86 -0
- package/dot_config/nushell/env.nu.tmpl +94 -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 +133 -0
- package/dot_config/shell/05-core-safety.sh +47 -0
- package/dot_config/shell/10-secrets.sh +40 -0
- package/dot_config/shell/40-fzf-defaults.sh.tmpl +16 -0
- package/dot_config/shell/40-ls-colors.sh +48 -0
- package/dot_config/shell/50-logic-functions-core.sh.tmpl +10 -0
- package/dot_config/shell/50-logic-functions.sh.tmpl +10 -0
- package/dot_config/shell/51-logic-functions-extra.sh.tmpl +64 -0
- package/dot_config/shell/90-ux-aliases.sh.tmpl +120 -0
- package/dot_config/shell/91-ux-aliases-lazy.sh.tmpl +54 -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 +267 -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 +9 -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 +498 -0
- package/dot_config/zsh/rc.d/00-alias-shims.zsh +77 -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 +194 -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/__pycache__/executable_dot-load-benchmark-ptycpython-312.pyc +0 -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 +77 -0
- package/dot_local/bin/executable_cb +39 -0
- package/dot_local/bin/executable_dot +589 -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 +22 -0
- package/dot_local/bin/executable_open +36 -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 +175 -0
- package/dot_local/bin/executable_up +21 -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 +342 -0
- package/package.json +1 -1
- package/scripts/ci/check-copyright-headers.sh +96 -0
- package/scripts/ci/guard-gitleaks-checkout.sh +57 -0
- package/scripts/ci/install-chezmoi-verified.sh +64 -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 +541 -0
- package/scripts/diagnostics/drift-dashboard.sh +37 -0
- package/scripts/diagnostics/health.sh +597 -0
- package/scripts/diagnostics/history-analysis.sh +85 -0
- package/scripts/diagnostics/mcp-doctor.sh +575 -0
- package/scripts/diagnostics/perf.sh +225 -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 +181 -0
- package/scripts/docs/build-manual.sh +883 -0
- package/scripts/docs/check-manual.sh +213 -0
- package/scripts/dot/commands/agent.sh +465 -0
- package/scripts/dot/commands/ai.sh +416 -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 +49 -0
- package/scripts/dot/lib/log.sh +194 -0
- package/scripts/dot/lib/platform.sh +98 -0
- package/scripts/dot/lib/ui.sh +507 -0
- package/scripts/dot/lib/utils.sh +372 -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 +29 -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 +51 -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/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 +141 -0
- package/scripts/theme/rebuild-themes.sh +309 -0
- package/scripts/theme/switch.sh +421 -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,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 "$@"
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
# Install a pinned Chezmoi release with checksum verification.
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
VERSION="${1:-}"
|
|
7
|
+
BIN_DIR="${2:-$HOME/.local/bin}"
|
|
8
|
+
|
|
9
|
+
if [[ -z "$VERSION" ]]; then
|
|
10
|
+
echo "Usage: $0 <chezmoi-version> [bin-dir]" >&2
|
|
11
|
+
exit 1
|
|
12
|
+
fi
|
|
13
|
+
|
|
14
|
+
OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
|
|
15
|
+
ARCH="$(uname -m)"
|
|
16
|
+
|
|
17
|
+
case "$OS" in
|
|
18
|
+
linux | darwin) ;;
|
|
19
|
+
*)
|
|
20
|
+
echo "Unsupported OS: $OS" >&2
|
|
21
|
+
exit 1
|
|
22
|
+
;;
|
|
23
|
+
esac
|
|
24
|
+
|
|
25
|
+
case "$ARCH" in
|
|
26
|
+
x86_64 | amd64) ARCH="amd64" ;;
|
|
27
|
+
arm64 | aarch64) ARCH="arm64" ;;
|
|
28
|
+
*)
|
|
29
|
+
echo "Unsupported architecture: $ARCH" >&2
|
|
30
|
+
exit 1
|
|
31
|
+
;;
|
|
32
|
+
esac
|
|
33
|
+
|
|
34
|
+
ASSET="chezmoi_${VERSION}_${OS}_${ARCH}.tar.gz"
|
|
35
|
+
CHECKSUMS_ASSET="chezmoi_${VERSION}_checksums.txt"
|
|
36
|
+
BASE_URL="https://github.com/twpayne/chezmoi/releases/download/v${VERSION}"
|
|
37
|
+
|
|
38
|
+
TMP_DIR="$(umask 077 && mktemp -d)"
|
|
39
|
+
trap 'rm -rf "$TMP_DIR"' EXIT
|
|
40
|
+
|
|
41
|
+
# Support both old and new checksum filenames.
|
|
42
|
+
if ! curl -fsSL -o "$TMP_DIR/checksums.txt" "$BASE_URL/$CHECKSUMS_ASSET"; then
|
|
43
|
+
curl -fsSL -o "$TMP_DIR/checksums.txt" "$BASE_URL/checksums.txt"
|
|
44
|
+
fi
|
|
45
|
+
curl -fsSL -o "$TMP_DIR/$ASSET" "$BASE_URL/$ASSET"
|
|
46
|
+
|
|
47
|
+
CHECKSUM_LINE="$(grep -E "[[:space:]]${ASSET}$" "$TMP_DIR/checksums.txt" | head -n1 || true)"
|
|
48
|
+
if [[ -z "$CHECKSUM_LINE" ]]; then
|
|
49
|
+
echo "Checksum entry not found for $ASSET" >&2
|
|
50
|
+
exit 1
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
(
|
|
54
|
+
cd "$TMP_DIR"
|
|
55
|
+
if command -v sha256sum >/dev/null 2>&1; then
|
|
56
|
+
echo "$CHECKSUM_LINE" | sha256sum -c -
|
|
57
|
+
else
|
|
58
|
+
echo "$CHECKSUM_LINE" | shasum -a 256 -c -
|
|
59
|
+
fi
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
tar -xzf "$TMP_DIR/$ASSET" -C "$TMP_DIR" chezmoi
|
|
63
|
+
mkdir -p "$BIN_DIR"
|
|
64
|
+
install -m 755 "$TMP_DIR/chezmoi" "$BIN_DIR/chezmoi"
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
# CI Configuration Validation Script
|
|
4
|
+
# Verifies that all zero-warning policy components are properly configured
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
+
REPO_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
|
|
10
|
+
|
|
11
|
+
# Colors for output (respect NO_COLOR: https://no-color.org)
|
|
12
|
+
if [[ -z "${NO_COLOR:-}" ]] && [[ -t 1 ]]; then
|
|
13
|
+
RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m'
|
|
14
|
+
BLUE='\033[0;34m' NC='\033[0m'
|
|
15
|
+
else
|
|
16
|
+
RED='' GREEN='' YELLOW='' BLUE='' NC=''
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
20
|
+
printf '%b\n' "${BLUE} CI CONFIGURATION VALIDATOR ${NC}"
|
|
21
|
+
printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
22
|
+
echo ""
|
|
23
|
+
|
|
24
|
+
ERRORS=0
|
|
25
|
+
WARNINGS=0
|
|
26
|
+
|
|
27
|
+
# Helper functions
|
|
28
|
+
check_file_exists() {
|
|
29
|
+
local file="$1"
|
|
30
|
+
local description="$2"
|
|
31
|
+
|
|
32
|
+
if [[ -f "$file" ]]; then
|
|
33
|
+
printf '%b\n' " ${GREEN}✓${NC} $description"
|
|
34
|
+
return 0
|
|
35
|
+
else
|
|
36
|
+
printf '%b\n' " ${RED}✗${NC} $description"
|
|
37
|
+
((ERRORS++))
|
|
38
|
+
return 1
|
|
39
|
+
fi
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
check_pattern_in_file() {
|
|
43
|
+
local file="$1"
|
|
44
|
+
local pattern="$2"
|
|
45
|
+
local description="$3"
|
|
46
|
+
|
|
47
|
+
if [[ -f "$file" ]] && grep -q "$pattern" "$file"; then
|
|
48
|
+
printf '%b\n' " ${GREEN}✓${NC} $description"
|
|
49
|
+
return 0
|
|
50
|
+
else
|
|
51
|
+
printf '%b\n' " ${RED}✗${NC} $description"
|
|
52
|
+
((ERRORS++))
|
|
53
|
+
return 1
|
|
54
|
+
fi
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
warn_if_pattern() {
|
|
58
|
+
local file="$1"
|
|
59
|
+
local pattern="$2"
|
|
60
|
+
local description="$3"
|
|
61
|
+
|
|
62
|
+
if [[ -f "$file" ]] && grep -q "$pattern" "$file"; then
|
|
63
|
+
printf '%b\n' " ${YELLOW}⚠${NC} $description"
|
|
64
|
+
((WARNINGS++))
|
|
65
|
+
return 1
|
|
66
|
+
else
|
|
67
|
+
printf '%b\n' " ${GREEN}✓${NC} $description"
|
|
68
|
+
return 0
|
|
69
|
+
fi
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
# Check 1: Core CI files exist
|
|
73
|
+
printf '%b\n' "${BLUE}1. Core CI Files${NC}"
|
|
74
|
+
check_file_exists "$REPO_ROOT/.github/workflows/ci.yml" "Main CI workflow exists"
|
|
75
|
+
check_file_exists "$REPO_ROOT/.github/workflows/nightly.yml" "Nightly workflow exists"
|
|
76
|
+
check_file_exists "$REPO_ROOT/.github/workflows/security-enhanced.yml" "Security workflow exists"
|
|
77
|
+
check_file_exists "$REPO_ROOT/config/pre-commit-config.yaml" "Pre-commit configuration exists"
|
|
78
|
+
echo ""
|
|
79
|
+
|
|
80
|
+
# Check 2: Zero-warning enforcement
|
|
81
|
+
printf '%b\n' "${BLUE}2. Zero-Warning Policy Enforcement${NC}"
|
|
82
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "zero-warning" "Zero-warning policy documented"
|
|
83
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "fail on unformatted code" "Formatter failure enforced"
|
|
84
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "warnings-as-errors" "Warnings treated as errors"
|
|
85
|
+
|
|
86
|
+
# Verify no || true patterns in security steps
|
|
87
|
+
warn_if_pattern "$REPO_ROOT/.github/workflows/ci.yml" "gitleaks.*||.*true" "Gitleaks bypass detected"
|
|
88
|
+
warn_if_pattern "$REPO_ROOT/.github/workflows/ci.yml" "shellcheck.*||.*true" "Shellcheck bypass detected"
|
|
89
|
+
echo ""
|
|
90
|
+
|
|
91
|
+
# Check 3: Test coverage requirements
|
|
92
|
+
printf '%b\n' "${BLUE}3. Test Coverage Requirements${NC}"
|
|
93
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "100%" "100% coverage requirement"
|
|
94
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "fail-under" "Coverage threshold enforcement"
|
|
95
|
+
|
|
96
|
+
if [[ -f "$REPO_ROOT/tests/framework/test_runner.sh" ]]; then
|
|
97
|
+
printf '%b\n' " ${GREEN}✓${NC} Test framework exists"
|
|
98
|
+
else
|
|
99
|
+
printf '%b\n' " ${RED}✗${NC} Test framework missing"
|
|
100
|
+
((ERRORS++))
|
|
101
|
+
fi
|
|
102
|
+
echo ""
|
|
103
|
+
|
|
104
|
+
# Check 4: Security scanning
|
|
105
|
+
printf '%b\n' "${BLUE}4. Security Scanning Configuration${NC}"
|
|
106
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "security-secrets" "Secret scanning enabled"
|
|
107
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "security-dependencies" "Dependency audit enabled"
|
|
108
|
+
check_pattern_in_file "$REPO_ROOT/config/pre-commit-config.yaml" "gitleaks" "Pre-commit secret scanning"
|
|
109
|
+
check_pattern_in_file "$REPO_ROOT/config/pre-commit-config.yaml" "detect-secrets" "Advanced secret detection"
|
|
110
|
+
|
|
111
|
+
# Verify no piped execution patterns
|
|
112
|
+
warn_if_pattern "$REPO_ROOT/.github/workflows/ci.yml" "curl.*|.*sh" "Dangerous piped execution"
|
|
113
|
+
warn_if_pattern "$REPO_ROOT/.github/workflows/ci.yml" "wget.*|.*bash" "Dangerous piped execution"
|
|
114
|
+
echo ""
|
|
115
|
+
|
|
116
|
+
# Check 5: Performance monitoring
|
|
117
|
+
printf '%b\n' "${BLUE}5. Performance Monitoring${NC}"
|
|
118
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "benchmark" "Performance benchmarking enabled"
|
|
119
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "500ms" "Shell startup threshold defined"
|
|
120
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "performance-tracking" "Nightly performance tracking"
|
|
121
|
+
echo ""
|
|
122
|
+
|
|
123
|
+
# Check 6: Multi-OS support
|
|
124
|
+
printf '%b\n' "${BLUE}6. Multi-OS Testing${NC}"
|
|
125
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "ubuntu-latest" "Linux testing enabled"
|
|
126
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "macos-latest" "macOS testing enabled"
|
|
127
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "matrix:" "OS matrix testing configured"
|
|
128
|
+
echo ""
|
|
129
|
+
|
|
130
|
+
# Check 7: Timeouts and efficiency
|
|
131
|
+
printf '%b\n' "${BLUE}7. Timeout and Efficiency Settings${NC}"
|
|
132
|
+
if grep -q "timeout-minutes: [0-9]" "$REPO_ROOT/.github/workflows/ci.yml"; then
|
|
133
|
+
MAX_TIMEOUT=$(grep "timeout-minutes:" "$REPO_ROOT/.github/workflows/ci.yml" |
|
|
134
|
+
awk '{print $2}' | sort -n | tail -1)
|
|
135
|
+
if [[ $MAX_TIMEOUT -le 15 ]]; then
|
|
136
|
+
printf '%b\n' " ${GREEN}✓${NC} Job timeouts properly configured (max: ${MAX_TIMEOUT}min)"
|
|
137
|
+
else
|
|
138
|
+
printf '%b\n' " ${YELLOW}⚠${NC} Some jobs have long timeouts (max: ${MAX_TIMEOUT}min)"
|
|
139
|
+
((WARNINGS++))
|
|
140
|
+
fi
|
|
141
|
+
else
|
|
142
|
+
printf '%b\n' " ${RED}✗${NC} No timeout configuration found"
|
|
143
|
+
((ERRORS++))
|
|
144
|
+
fi
|
|
145
|
+
|
|
146
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "cache" "Dependency caching enabled"
|
|
147
|
+
echo ""
|
|
148
|
+
|
|
149
|
+
# Check 8: Branch protection readiness
|
|
150
|
+
printf '%b\n' "${BLUE}8. Branch Protection Readiness${NC}"
|
|
151
|
+
check_file_exists "$REPO_ROOT/.github/BRANCH_PROTECTION.md" "Branch protection documentation"
|
|
152
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/ci.yml" "quality-gate" "Quality gate job defined"
|
|
153
|
+
|
|
154
|
+
# Check for required status check names
|
|
155
|
+
REQUIRED_CHECKS=(
|
|
156
|
+
"lint-shell"
|
|
157
|
+
"security-secrets"
|
|
158
|
+
"security-dependencies"
|
|
159
|
+
"test-unit"
|
|
160
|
+
"quality-gate"
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
for check in "${REQUIRED_CHECKS[@]}"; do
|
|
164
|
+
if grep -q "name:.*$check" "$REPO_ROOT/.github/workflows/ci.yml"; then
|
|
165
|
+
printf '%b\n' " ${GREEN}✓${NC} Required check '$check' defined"
|
|
166
|
+
else
|
|
167
|
+
printf '%b\n' " ${RED}✗${NC} Required check '$check' missing"
|
|
168
|
+
((ERRORS++))
|
|
169
|
+
fi
|
|
170
|
+
done
|
|
171
|
+
echo ""
|
|
172
|
+
|
|
173
|
+
# Check 9: Nightly extended testing
|
|
174
|
+
printf '%b\n' "${BLUE}9. Nightly Extended Testing${NC}"
|
|
175
|
+
if [[ -f "$REPO_ROOT/.github/workflows/nightly.yml" ]]; then
|
|
176
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "dependency-updates" "Dependency monitoring"
|
|
177
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "beta-tools-test" "Beta tool testing"
|
|
178
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "security-extended" "Extended security scanning"
|
|
179
|
+
check_pattern_in_file "$REPO_ROOT/.github/workflows/nightly.yml" "cron:" "Scheduled execution"
|
|
180
|
+
else
|
|
181
|
+
printf '%b\n' " ${RED}✗${NC} Nightly workflow missing"
|
|
182
|
+
((ERRORS++))
|
|
183
|
+
fi
|
|
184
|
+
echo ""
|
|
185
|
+
|
|
186
|
+
# Final summary
|
|
187
|
+
printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
188
|
+
printf '%b\n' "${BLUE} VALIDATION SUMMARY ${NC}"
|
|
189
|
+
printf '%b\n' "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
190
|
+
|
|
191
|
+
if [[ $ERRORS -eq 0 ]] && [[ $WARNINGS -eq 0 ]]; then
|
|
192
|
+
printf '%b\n' "${GREEN}✅ PERFECT: CI configuration fully compliant${NC}"
|
|
193
|
+
echo " - Zero-warning policy properly enforced"
|
|
194
|
+
echo " - All security gates configured"
|
|
195
|
+
echo " - Performance monitoring active"
|
|
196
|
+
echo " - Ready for branch protection"
|
|
197
|
+
elif [[ $ERRORS -eq 0 ]]; then
|
|
198
|
+
printf '%b\n' "${YELLOW}⚠️ GOOD: CI mostly compliant with $WARNINGS warning(s)${NC}"
|
|
199
|
+
echo " - Core functionality working"
|
|
200
|
+
echo " - Minor improvements recommended"
|
|
201
|
+
else
|
|
202
|
+
printf '%b\n' "${RED}❌ ISSUES: CI configuration has $ERRORS error(s) and $WARNINGS warning(s)${NC}"
|
|
203
|
+
echo " - Critical fixes required before deployment"
|
|
204
|
+
fi
|
|
205
|
+
|
|
206
|
+
echo ""
|
|
207
|
+
echo "Configuration Details:"
|
|
208
|
+
echo " - Repository: $REPO_ROOT"
|
|
209
|
+
echo " - Main CI: .github/workflows/ci.yml"
|
|
210
|
+
echo " - Nightly: .github/workflows/nightly.yml"
|
|
211
|
+
echo " - Pre-commit: config/pre-commit-config.yaml"
|
|
212
|
+
echo ""
|
|
213
|
+
echo "Next Steps:"
|
|
214
|
+
if [[ $ERRORS -gt 0 ]]; then
|
|
215
|
+
echo " 1. Fix critical errors listed above"
|
|
216
|
+
echo " 2. Re-run validation: $0"
|
|
217
|
+
fi
|
|
218
|
+
if [[ $WARNINGS -gt 0 ]]; then
|
|
219
|
+
echo " 3. Address warnings for optimal configuration"
|
|
220
|
+
fi
|
|
221
|
+
echo " 4. Configure branch protection rules per BRANCH_PROTECTION.md"
|
|
222
|
+
echo " 5. Test CI pipeline with a small PR"
|
|
223
|
+
|
|
224
|
+
exit $ERRORS
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
OUT="${1:-$HOME/.dotfiles/docs/demo/demo.gif}"
|
|
6
|
+
DURATION="${DURATION:-30}"
|
|
7
|
+
FPS="${FPS:-15}"
|
|
8
|
+
|
|
9
|
+
record_ffmpeg() {
|
|
10
|
+
if command -v ffmpeg >/dev/null; then
|
|
11
|
+
echo "Recording with ffmpeg for ${DURATION}s..."
|
|
12
|
+
if [ "$(uname -s)" = "Darwin" ]; then
|
|
13
|
+
# macOS (AVFoundation)
|
|
14
|
+
ffmpeg -y -t "$DURATION" -f avfoundation -i "1:none" -vf "fps=$FPS,scale=1024:-1:flags=lanczos" "$OUT"
|
|
15
|
+
else
|
|
16
|
+
# Linux (X11)
|
|
17
|
+
ffmpeg -y -t "$DURATION" -f x11grab -i :0.0 -vf "fps=$FPS,scale=1024:-1:flags=lanczos" "$OUT"
|
|
18
|
+
fi
|
|
19
|
+
else
|
|
20
|
+
echo "ffmpeg not found. Install it and retry."
|
|
21
|
+
exit 1
|
|
22
|
+
fi
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
record_wf_recorder() {
|
|
26
|
+
if command -v wf-recorder >/dev/null; then
|
|
27
|
+
echo "Recording with wf-recorder for ${DURATION}s..."
|
|
28
|
+
wf-recorder -f "$OUT" -t "$DURATION"
|
|
29
|
+
else
|
|
30
|
+
return 1
|
|
31
|
+
fi
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if [ "$(uname -s)" = "Linux" ]; then
|
|
35
|
+
if record_wf_recorder; then
|
|
36
|
+
exit 0
|
|
37
|
+
fi
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
record_ffmpeg
|
|
41
|
+
|
|
42
|
+
printf "Saved demo to %s\n" "$OUT"
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Copyright (c) 2015-2026 Dotfiles. All rights reserved.
|
|
3
|
+
## A2A v0.3 and agent card conformance validation.
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
REPO_ROOT="${REPO_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
|
|
9
|
+
|
|
10
|
+
# shellcheck source=../dot/lib/ui.sh
|
|
11
|
+
source "$SCRIPT_DIR/../dot/lib/ui.sh"
|
|
12
|
+
|
|
13
|
+
JSON_MODE=0
|
|
14
|
+
STRICT_MODE=0
|
|
15
|
+
while [[ $# -gt 0 ]]; do
|
|
16
|
+
case "$1" in
|
|
17
|
+
--json | -j)
|
|
18
|
+
JSON_MODE=1
|
|
19
|
+
shift
|
|
20
|
+
;;
|
|
21
|
+
--strict | -s)
|
|
22
|
+
STRICT_MODE=1
|
|
23
|
+
shift
|
|
24
|
+
;;
|
|
25
|
+
*)
|
|
26
|
+
shift
|
|
27
|
+
;;
|
|
28
|
+
esac
|
|
29
|
+
done
|
|
30
|
+
|
|
31
|
+
command -v jq >/dev/null 2>&1 || {
|
|
32
|
+
echo "jq is required for A2A conformance checks." >&2
|
|
33
|
+
exit 1
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
a2a_card="$REPO_ROOT/.well-known/agent-card.json"
|
|
37
|
+
legacy_doc="$REPO_ROOT/.well-known/agent.json"
|
|
38
|
+
internal_card="$REPO_ROOT/dot_config/dotfiles/agent-card.json"
|
|
39
|
+
agent_profiles="$REPO_ROOT/dot_config/dotfiles/agent-profiles.json"
|
|
40
|
+
status="healthy"
|
|
41
|
+
issues=()
|
|
42
|
+
|
|
43
|
+
# Check primary A2A v0.3 card
|
|
44
|
+
if [[ ! -f "$a2a_card" ]]; then
|
|
45
|
+
issues+=("missing:.well-known/agent-card.json")
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
# Check legacy agent.json
|
|
49
|
+
if [[ ! -f "$legacy_doc" ]]; then
|
|
50
|
+
issues+=("missing:.well-known/agent.json")
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
# Check internal card
|
|
54
|
+
if [[ ! -f "$internal_card" ]]; then
|
|
55
|
+
issues+=("missing:agent-card.json")
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
# Check agent profiles
|
|
59
|
+
if [[ ! -f "$agent_profiles" ]]; then
|
|
60
|
+
issues+=("missing:agent-profiles.json")
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
if [[ "${#issues[@]}" -eq 0 ]]; then
|
|
64
|
+
# Validate A2A v0.3 card
|
|
65
|
+
spec_version="$(jq -r '.specVersion // empty' "$a2a_card")"
|
|
66
|
+
[[ "$spec_version" == "0.3" ]] || issues+=("specVersion:expected 0.3, got $spec_version")
|
|
67
|
+
|
|
68
|
+
# Skills array
|
|
69
|
+
jq -e '.skills | type == "array"' "$a2a_card" >/dev/null 2>&1 || issues+=("skills:missing or not array")
|
|
70
|
+
skills_count="$(jq '.skills | length' "$a2a_card" 2>/dev/null || echo 0)"
|
|
71
|
+
[[ "$skills_count" -gt 0 ]] || issues+=("skills:empty array")
|
|
72
|
+
|
|
73
|
+
# Authentication block
|
|
74
|
+
jq -e '.authentication' "$a2a_card" >/dev/null 2>&1 || issues+=("authentication:missing")
|
|
75
|
+
|
|
76
|
+
# Signing metadata
|
|
77
|
+
signing_method="$(jq -r '.signing.method // empty' "$a2a_card")"
|
|
78
|
+
[[ -n "$signing_method" ]] || issues+=("signing:missing method")
|
|
79
|
+
|
|
80
|
+
# Capabilities
|
|
81
|
+
jq -e '.capabilities' "$a2a_card" >/dev/null 2>&1 || issues+=("capabilities:missing")
|
|
82
|
+
|
|
83
|
+
# Protocol must be "a2a" not "a2a-ready"
|
|
84
|
+
if jq -e '.protocols | index("a2a-ready")' "$a2a_card" >/dev/null 2>&1; then
|
|
85
|
+
issues+=("protocols:should use 'a2a' not 'a2a-ready'")
|
|
86
|
+
fi
|
|
87
|
+
jq -e '.protocols | index("a2a")' "$a2a_card" >/dev/null 2>&1 || issues+=("protocols:missing 'a2a'")
|
|
88
|
+
|
|
89
|
+
# Validate internal card also uses v0.3 and "a2a"
|
|
90
|
+
internal_spec="$(jq -r '.specVersion // empty' "$internal_card")"
|
|
91
|
+
[[ "$internal_spec" == "0.3" ]] || issues+=("internal-card:specVersion expected 0.3")
|
|
92
|
+
if jq -e '.protocols | index("a2a-ready")' "$internal_card" >/dev/null 2>&1; then
|
|
93
|
+
issues+=("internal-card:should use 'a2a' not 'a2a-ready'")
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
# Validate legacy doc points to new card
|
|
97
|
+
jq -e '.a2aCard' "$legacy_doc" >/dev/null 2>&1 || issues+=("legacy:missing a2aCard pointer")
|
|
98
|
+
if jq -e '.protocols | index("a2a-ready")' "$legacy_doc" >/dev/null 2>&1; then
|
|
99
|
+
issues+=("legacy:should use 'a2a' not 'a2a-ready'")
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
# Name consistency
|
|
103
|
+
a2a_name="$(jq -r '.name // empty' "$a2a_card")"
|
|
104
|
+
internal_name="$(jq -r '.name // empty' "$internal_card")"
|
|
105
|
+
legacy_name="$(jq -r '.name // empty' "$legacy_doc")"
|
|
106
|
+
[[ "$a2a_name" == "$internal_name" ]] || issues+=("name:mismatch between a2a-card and internal card")
|
|
107
|
+
[[ "$a2a_name" == "$legacy_name" ]] || issues+=("name:mismatch between a2a-card and legacy doc")
|
|
108
|
+
|
|
109
|
+
# Default profile validation
|
|
110
|
+
default_profile="$(jq -r '.defaultProfile // empty' "$internal_card")"
|
|
111
|
+
if [[ -n "$default_profile" ]]; then
|
|
112
|
+
jq -e --arg profile "$default_profile" '.profiles[$profile]' "$agent_profiles" >/dev/null 2>&1 || issues+=("default-profile:missing in agent-profiles.json")
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# Card signing in internal card
|
|
116
|
+
jq -e '.security.cardSigning' "$internal_card" >/dev/null 2>&1 || issues+=("internal-card:missing cardSigning in security")
|
|
117
|
+
fi
|
|
118
|
+
|
|
119
|
+
if [[ "${#issues[@]}" -gt 0 ]]; then
|
|
120
|
+
status="issues"
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
# Build issues JSON safely
|
|
124
|
+
if [[ "${#issues[@]}" -gt 0 ]]; then
|
|
125
|
+
issues_json="$(printf '%s\n' "${issues[@]}" | jq -R . | jq -s .)"
|
|
126
|
+
else
|
|
127
|
+
issues_json="[]"
|
|
128
|
+
fi
|
|
129
|
+
|
|
130
|
+
payload="$(jq -n \
|
|
131
|
+
--arg status "$status" \
|
|
132
|
+
--arg a2a_card "$a2a_card" \
|
|
133
|
+
--arg legacy_doc "$legacy_doc" \
|
|
134
|
+
--arg internal_card "$internal_card" \
|
|
135
|
+
--arg agent_profiles "$agent_profiles" \
|
|
136
|
+
--argjson strict "$([[ "$STRICT_MODE" -eq 1 ]] && echo true || echo false)" \
|
|
137
|
+
--argjson issues "$issues_json" \
|
|
138
|
+
'{status: $status, strict: $strict, specVersion: "0.3", files: {a2a_card: $a2a_card, legacy_doc: $legacy_doc, internal_card: $internal_card, agent_profiles: $agent_profiles}, issues: $issues}')"
|
|
139
|
+
|
|
140
|
+
if [[ "$JSON_MODE" -eq 1 ]]; then
|
|
141
|
+
printf '%s\n' "$payload"
|
|
142
|
+
else
|
|
143
|
+
ui_dot_banner "AI and Agents"
|
|
144
|
+
ui_header "A2A v0.3 Conformance"
|
|
145
|
+
if [[ "$status" == "healthy" ]]; then
|
|
146
|
+
ui_ok "Status" "healthy"
|
|
147
|
+
ui_ok "Spec version" "0.3"
|
|
148
|
+
ui_ok "A2A card" "$a2a_card"
|
|
149
|
+
ui_ok "Legacy doc" "$legacy_doc"
|
|
150
|
+
ui_ok "Internal card" "$internal_card"
|
|
151
|
+
else
|
|
152
|
+
ui_warn "Status" "issues"
|
|
153
|
+
while IFS= read -r issue; do
|
|
154
|
+
[[ -n "$issue" ]] || continue
|
|
155
|
+
ui_warn "Issue" "$issue"
|
|
156
|
+
done < <(printf '%s' "$payload" | jq -r '.issues[]')
|
|
157
|
+
fi
|
|
158
|
+
fi
|
|
159
|
+
|
|
160
|
+
if [[ "$STRICT_MODE" -eq 1 && "$status" != "healthy" ]]; then
|
|
161
|
+
exit 1
|
|
162
|
+
fi
|