boost-skill-cli 1.0.415__tar.gz → 1.0.416__tar.gz
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.
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/Makefile +1 -1
- {boost_skill_cli-1.0.415/boost_skill_cli.egg-info → boost_skill_cli-1.0.416}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/scripts-under-the-lint-gate.md +4 -2
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap.html +32 -31
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/build_command_reference.py +5 -6
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/build_scale_corpus.py +11 -11
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/check_licenses.py +5 -5
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/check_required_checks.py +20 -21
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/eval_corpus.py +19 -19
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/eval_explain.py +11 -12
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/eval_gate.py +6 -7
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/eval_recommend.py +14 -14
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/eval_retrieval.py +51 -49
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/eval_stats_summary.py +3 -4
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/import_budget.py +9 -10
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/lock_toolchain.py +6 -6
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/mutation_shards.py +27 -27
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/page_budget.py +5 -5
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/release_guard.py +7 -7
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/serve_docs.py +1 -2
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.gitattributes +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.gitignore +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/.vale.ini +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/LICENSE +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/README.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/codecov.yml +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/chat.html +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/demo.html +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/index.html +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/langchain.html +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/README.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/examples/README.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/index.html +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/noxfile.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/setup.cfg +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/style/README.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/style/boost.css +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/style/boost.js +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/style/demo.html +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.415 → boost_skill_cli-1.0.416}/tests/visual/visual_check.mjs +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.416'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 416)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
<!-- ROADMAP:stats -->
|
|
126
126
|
<div class="stat"><b>16</b><span>Shipped</span></div>
|
|
127
127
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
128
|
-
<div class="stat"><b>
|
|
128
|
+
<div class="stat"><b>6</b><span>Planned</span></div>
|
|
129
129
|
<div class="stat"><b>221</b><span>Loop finds</span></div>
|
|
130
130
|
<!-- /ROADMAP:stats -->
|
|
131
131
|
</div>
|
|
@@ -680,36 +680,6 @@ published version works against PyPI as it stands today.</p>
|
|
|
680
680
|
<span class="m">the artifacts already build and pass twine check in CI — what is missing is a cadence and a Trusted Publisher</span>
|
|
681
681
|
</div>
|
|
682
682
|
</article>
|
|
683
|
-
|
|
684
|
-
<article class="cap rcard" id="scripts-under-the-lint-gate">
|
|
685
|
-
<div class="head"><span class="pill planned">Planned</span><span class="cat">Tech-debt</span></div>
|
|
686
|
-
<h3>bring <code>scripts/</code> under the ruff gate</h3>
|
|
687
|
-
<p><code>make lint</code> runs <code>ruff check boost_cli tests evals</code> — and <code>scripts/</code>,
|
|
688
|
-
the 28 build-and-gate tools that decide whether every PR merges, is not in the list. Nothing that
|
|
689
|
-
lints the product lints the gatekeepers.
|
|
690
|
-
|
|
691
|
-
<b>Why it bit, twice in one day.</b> The <code>zip(strict=)</code> audit enforced B905 across the
|
|
692
|
-
linted trees, and an adversarial review immediately found two more <code>zip()</code> sites in
|
|
693
|
-
<code>scripts/</code> that the rule cannot guard — one of them (<code>eval_explain.py</code> pairing
|
|
694
|
-
ragas scores with samples by position) exactly the silent-misattribution shape the audit existed to
|
|
695
|
-
kill. They were fixed by hand, but the next <code>zip()</code> added to <code>scripts/</code> gets
|
|
696
|
-
no intent check, and the same blindness applies to every rule the gate enforces.
|
|
697
|
-
|
|
698
|
-
<b>Measured, not guessed:</b> running the current rule set over <code>scripts/</code> today finds
|
|
699
|
-
<b>291</b> violations — ~277 are the mechanical UP typing sweep the rest of the repo just finished
|
|
700
|
-
(<code>List</code> → <code>list</code> and friends), plus a handful of real ones (a
|
|
701
|
-
<code>raise ... from</code> miss, collapsible ifs, stale <code>noqa</code>s). So the shape is: one
|
|
702
|
-
mechanical pass like the pep585 sweep, a short judgement pass over the rest, then add
|
|
703
|
-
<code>scripts</code> to the Makefile line and CI so it stays clean. Some rules may deserve
|
|
704
|
-
per-directory ignores (scripts legitimately print, exit, and parse argv) — decide those in the PR
|
|
705
|
-
rather than globally.</p>
|
|
706
|
-
<div class="meta">
|
|
707
|
-
<span class="m">Complexity <b>M</b></span>
|
|
708
|
-
<span class="m">Impact <b>Med</b></span>
|
|
709
|
-
<span class="m">Wow <b class="wow">★</b></span>
|
|
710
|
-
<span class="m">291 findings across 28 files, measured — most are the same UP sweep the package just finished</span>
|
|
711
|
-
</div>
|
|
712
|
-
</article>
|
|
713
683
|
<!-- /ROADMAP:cards -->
|
|
714
684
|
|
|
715
685
|
</div>
|
|
@@ -3444,6 +3414,37 @@ ownership check reverted.</p></details>
|
|
|
3444
3414
|
</div>
|
|
3445
3415
|
</article>
|
|
3446
3416
|
|
|
3417
|
+
<article class="cap rcard" id="scripts-under-the-lint-gate">
|
|
3418
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Tech-debt</span></div>
|
|
3419
|
+
<h3>bring <code>scripts/</code> under the ruff gate</h3>
|
|
3420
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
3421
|
+
<p><code>make lint</code> runs <code>ruff check boost_cli tests evals</code> — and <code>scripts/</code>,
|
|
3422
|
+
the 28 build-and-gate tools that decide whether every PR merges, is not in the list. Nothing that
|
|
3423
|
+
lints the product lints the gatekeepers.
|
|
3424
|
+
|
|
3425
|
+
<b>Why it bit, twice in one day.</b> The <code>zip(strict=)</code> audit enforced B905 across the
|
|
3426
|
+
linted trees, and an adversarial review immediately found two more <code>zip()</code> sites in
|
|
3427
|
+
<code>scripts/</code> that the rule cannot guard — one of them (<code>eval_explain.py</code> pairing
|
|
3428
|
+
ragas scores with samples by position) exactly the silent-misattribution shape the audit existed to
|
|
3429
|
+
kill. They were fixed by hand, but the next <code>zip()</code> added to <code>scripts/</code> gets
|
|
3430
|
+
no intent check, and the same blindness applies to every rule the gate enforces.
|
|
3431
|
+
|
|
3432
|
+
<b>Measured, not guessed:</b> running the current rule set over <code>scripts/</code> today finds
|
|
3433
|
+
<b>291</b> violations — ~277 are the mechanical UP typing sweep the rest of the repo just finished
|
|
3434
|
+
(<code>List</code> → <code>list</code> and friends), plus a handful of real ones (a
|
|
3435
|
+
<code>raise ... from</code> miss, collapsible ifs, stale <code>noqa</code>s). So the shape is: one
|
|
3436
|
+
mechanical pass like the pep585 sweep, a short judgement pass over the rest, then add
|
|
3437
|
+
<code>scripts</code> to the Makefile line and CI so it stays clean. Some rules may deserve
|
|
3438
|
+
per-directory ignores (scripts legitimately print, exit, and parse argv) — decide those in the PR
|
|
3439
|
+
rather than globally.</p></details>
|
|
3440
|
+
<div class="meta">
|
|
3441
|
+
<span class="m">Complexity <b>M</b></span>
|
|
3442
|
+
<span class="m">Impact <b>Med</b></span>
|
|
3443
|
+
<span class="m">Wow <b class="wow">★</b></span>
|
|
3444
|
+
<span class="m">291 findings across 28 files, measured — most are the same UP sweep the package just finished</span>
|
|
3445
|
+
</div>
|
|
3446
|
+
</article>
|
|
3447
|
+
|
|
3447
3448
|
<article class="cap rcard" id="dry-run-promised-a-link-nobody-makes">
|
|
3448
3449
|
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Correctness</span></div>
|
|
3449
3450
|
<h3>install --dry-run predicted an install that never happens</h3>
|
|
@@ -71,9 +71,9 @@ def _capture_parser(name: str, module: str):
|
|
|
71
71
|
cliparse.parser = spy
|
|
72
72
|
try:
|
|
73
73
|
buf = io.StringIO()
|
|
74
|
-
with contextlib.redirect_stdout(buf), contextlib.redirect_stderr(buf)
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
with contextlib.redirect_stdout(buf), contextlib.redirect_stderr(buf), \
|
|
75
|
+
contextlib.suppress(SystemExit):
|
|
76
|
+
getattr(mod, fn)(["--help"])
|
|
77
77
|
finally:
|
|
78
78
|
cliparse.parser = real
|
|
79
79
|
return created[0] if created else None # main parser is created first
|
|
@@ -121,8 +121,7 @@ def _extract(name: str, group: str, module: str, summary: str) -> dict:
|
|
|
121
121
|
for act in opt:
|
|
122
122
|
flag = act.option_strings[-1]
|
|
123
123
|
syn.append("[%s]" % (flag if act.nargs == 0 else "%s %s" % (flag, _metavar(act))))
|
|
124
|
-
for act in pos
|
|
125
|
-
syn.append(_positional_syn(act))
|
|
124
|
+
syn.extend(_positional_syn(act) for act in pos)
|
|
126
125
|
|
|
127
126
|
def rows(actions, is_opt):
|
|
128
127
|
out = []
|
|
@@ -178,7 +177,7 @@ def render() -> str:
|
|
|
178
177
|
for c in items:
|
|
179
178
|
search = html.escape(
|
|
180
179
|
(" ".join([c["name"], c["summary"], c["description"]]
|
|
181
|
-
+ [
|
|
180
|
+
+ [label for label, _h in c["options"] + c["positionals"]])).lower(),
|
|
182
181
|
quote=True)
|
|
183
182
|
nav.append(
|
|
184
183
|
' <a class="cmd-link" href="#cmd-%s" data-search="%s">%s</a>'
|
|
@@ -64,8 +64,8 @@ from __future__ import annotations
|
|
|
64
64
|
import argparse
|
|
65
65
|
import json
|
|
66
66
|
import sys
|
|
67
|
+
from collections.abc import Sequence
|
|
67
68
|
from pathlib import Path
|
|
68
|
-
from typing import Dict, List, Optional, Sequence, Tuple
|
|
69
69
|
|
|
70
70
|
ROOT = Path(__file__).resolve().parent.parent
|
|
71
71
|
REGISTRIES = ROOT / "boost_cli" / "data" / "registries.json"
|
|
@@ -86,7 +86,7 @@ DEFAULT_TARGET = 20_000
|
|
|
86
86
|
TYPE_ORDER = ("rule", "workflow", "skill")
|
|
87
87
|
|
|
88
88
|
|
|
89
|
-
def required_rows(text: str) ->
|
|
89
|
+
def required_rows(text: str) -> list[str]:
|
|
90
90
|
"""The required corpus's rows, verbatim, in file order."""
|
|
91
91
|
return [ln.rstrip() for ln in text.splitlines()
|
|
92
92
|
if ln.strip() and not ln.lstrip().startswith("#")]
|
|
@@ -97,14 +97,14 @@ def repo_of(row: str) -> str:
|
|
|
97
97
|
|
|
98
98
|
|
|
99
99
|
def candidates(registries: Sequence[dict], exclude: Sequence[str]
|
|
100
|
-
) ->
|
|
100
|
+
) -> dict[str, list[tuple[str, int]]]:
|
|
101
101
|
"""``type -> [(repo, est_items)]``, largest first, excluding what we have.
|
|
102
102
|
|
|
103
103
|
``list_only`` rows are awesome-list indexes rather than skill trees, so they
|
|
104
104
|
contribute nothing to scan and are dropped — the same distinction
|
|
105
105
|
`registries.json` already draws for its own item-count math.
|
|
106
106
|
"""
|
|
107
|
-
out:
|
|
107
|
+
out: dict[str, list[tuple[str, int]]] = {}
|
|
108
108
|
seen = set(exclude)
|
|
109
109
|
for row in registries:
|
|
110
110
|
name = str(row.get("name", ""))
|
|
@@ -117,8 +117,8 @@ def candidates(registries: Sequence[dict], exclude: Sequence[str]
|
|
|
117
117
|
return out
|
|
118
118
|
|
|
119
119
|
|
|
120
|
-
def select(pools:
|
|
121
|
-
) ->
|
|
120
|
+
def select(pools: dict[str, list[tuple[str, int]]], target: int
|
|
121
|
+
) -> list[tuple[str, int]]:
|
|
122
122
|
"""Round-robin across types, largest first within each, until ``target``.
|
|
123
123
|
|
|
124
124
|
Deterministic: the pools are already sorted, and the cycle order is fixed.
|
|
@@ -126,7 +126,7 @@ def select(pools: Dict[str, List[Tuple[str, int]]], target: int
|
|
|
126
126
|
``--check`` gate is meaningless.
|
|
127
127
|
"""
|
|
128
128
|
cursors = dict.fromkeys(pools, 0)
|
|
129
|
-
picked:
|
|
129
|
+
picked: list[tuple[str, int]] = []
|
|
130
130
|
total = 0
|
|
131
131
|
order = [k for k in TYPE_ORDER if k in pools] + \
|
|
132
132
|
[k for k in sorted(pools) if k not in TYPE_ORDER]
|
|
@@ -149,7 +149,7 @@ def select(pools: Dict[str, List[Tuple[str, int]]], target: int
|
|
|
149
149
|
return picked
|
|
150
150
|
|
|
151
151
|
|
|
152
|
-
def existing_pins(text: str) ->
|
|
152
|
+
def existing_pins(text: str) -> dict[str, str]:
|
|
153
153
|
"""``repo -> its committed row``, so a regeneration keeps what was measured.
|
|
154
154
|
|
|
155
155
|
Without this the generator and `eval_corpus.py --refresh` fight: the refresh
|
|
@@ -160,7 +160,7 @@ def existing_pins(text: str) -> Dict[str, str]:
|
|
|
160
160
|
So `--check` verifies the *selection* — which registries are in and in what
|
|
161
161
|
order — and leaves the pins to the job that actually measured them.
|
|
162
162
|
"""
|
|
163
|
-
out:
|
|
163
|
+
out: dict[str, str] = {}
|
|
164
164
|
for line in text.splitlines():
|
|
165
165
|
if not line.strip() or line.lstrip().startswith("#"):
|
|
166
166
|
continue
|
|
@@ -168,8 +168,8 @@ def existing_pins(text: str) -> Dict[str, str]:
|
|
|
168
168
|
return out
|
|
169
169
|
|
|
170
170
|
|
|
171
|
-
def render(required: Sequence[str], picked: Sequence[
|
|
172
|
-
target: int, pinned:
|
|
171
|
+
def render(required: Sequence[str], picked: Sequence[tuple[str, int]],
|
|
172
|
+
target: int, pinned: dict[str, str] | None = None) -> str:
|
|
173
173
|
"""The taps-scale.txt text, header included."""
|
|
174
174
|
pinned = pinned or {}
|
|
175
175
|
est = sum(e for _n, e in picked)
|
|
@@ -29,13 +29,13 @@ from __future__ import annotations
|
|
|
29
29
|
import json
|
|
30
30
|
import re
|
|
31
31
|
import sys
|
|
32
|
-
from
|
|
32
|
+
from pathlib import Path
|
|
33
33
|
|
|
34
34
|
# (pattern, why). Matched case-insensitively against the whole declared licence
|
|
35
35
|
# string. Deliberately short: the aim is high-confidence incompatibility, not a
|
|
36
36
|
# taxonomy. LGPL, MPL and EPL are all fine to *consume* from a GPL-3.0 project
|
|
37
37
|
# and are not listed.
|
|
38
|
-
DENIED:
|
|
38
|
+
DENIED: tuple[tuple[str, str], ...] = (
|
|
39
39
|
(r"affero|\bagpl\b",
|
|
40
40
|
"AGPL adds network-use copyleft that GPL-3.0 does not carry"),
|
|
41
41
|
# GPLv2-*only* cannot be combined with GPL-3.0. "v2 or later" / "GPLv2+"
|
|
@@ -63,7 +63,7 @@ def is_undeclared(licence: str) -> bool:
|
|
|
63
63
|
return bool(_UNDECLARED.match(licence or ""))
|
|
64
64
|
|
|
65
65
|
|
|
66
|
-
def violations(rows:
|
|
66
|
+
def violations(rows: list[dict]) -> list[str]:
|
|
67
67
|
"""Human-readable problems in a ``pip-licenses --format=json`` payload."""
|
|
68
68
|
problems = []
|
|
69
69
|
for row in rows:
|
|
@@ -83,8 +83,8 @@ def violations(rows: List[dict]) -> List[str]:
|
|
|
83
83
|
return problems
|
|
84
84
|
|
|
85
85
|
|
|
86
|
-
def main(argv:
|
|
87
|
-
raw = (
|
|
86
|
+
def main(argv: list[str]) -> int:
|
|
87
|
+
raw = (Path(argv[0]).read_text(encoding="utf-8") if argv
|
|
88
88
|
else sys.stdin.read())
|
|
89
89
|
try:
|
|
90
90
|
rows = json.loads(raw)
|
|
@@ -44,7 +44,6 @@ import json
|
|
|
44
44
|
import re
|
|
45
45
|
import sys
|
|
46
46
|
from pathlib import Path
|
|
47
|
-
from typing import Dict, List, Set, Tuple
|
|
48
47
|
|
|
49
48
|
ROOT = Path(__file__).resolve().parent.parent
|
|
50
49
|
WORKFLOWS = ROOT / ".github" / "workflows"
|
|
@@ -92,7 +91,7 @@ PR_ALWAYS = "always" # fires on every PR — safe to require
|
|
|
92
91
|
PR_FILTERED = "filtered" # fires only on some PRs — NEVER safe to require
|
|
93
92
|
|
|
94
93
|
|
|
95
|
-
def has_merge_group(header_lines:
|
|
94
|
+
def has_merge_group(header_lines: list[str]) -> bool:
|
|
96
95
|
"""Does this workflow declare a ``merge_group:`` trigger?
|
|
97
96
|
|
|
98
97
|
Same narrow, stdlib-only parsing as everything else here: a top-level
|
|
@@ -101,7 +100,7 @@ def has_merge_group(header_lines: List[str]) -> bool:
|
|
|
101
100
|
return any(_MG_TRIGGER.match(line) for line in header_lines)
|
|
102
101
|
|
|
103
102
|
|
|
104
|
-
def pull_request_state(header_lines:
|
|
103
|
+
def pull_request_state(header_lines: list[str]) -> str:
|
|
105
104
|
"""Classify the ``pull_request:`` trigger in a workflow header.
|
|
106
105
|
|
|
107
106
|
Returns one of :data:`PR_NONE`, :data:`PR_ALWAYS`, :data:`PR_FILTERED`.
|
|
@@ -143,7 +142,7 @@ def _strip_quotes(s: str) -> str:
|
|
|
143
142
|
return s
|
|
144
143
|
|
|
145
144
|
|
|
146
|
-
def parse_workflow(path: Path) ->
|
|
145
|
+
def parse_workflow(path: Path) -> tuple[str, bool, dict[str, str]]:
|
|
147
146
|
"""``(pull_request_state, has_merge_group, {job_id: display_name})``."""
|
|
148
147
|
lines = path.read_text(encoding="utf-8").splitlines()
|
|
149
148
|
try:
|
|
@@ -154,7 +153,7 @@ def parse_workflow(path: Path) -> Tuple[str, bool, Dict[str, str]]:
|
|
|
154
153
|
on_pr = pull_request_state(lines[:jobs_at])
|
|
155
154
|
on_mg = has_merge_group(lines[:jobs_at])
|
|
156
155
|
|
|
157
|
-
jobs:
|
|
156
|
+
jobs: dict[str, str] = {}
|
|
158
157
|
current = None
|
|
159
158
|
for line in lines[jobs_at + 1:]:
|
|
160
159
|
job = _JOB.match(line)
|
|
@@ -169,17 +168,17 @@ def parse_workflow(path: Path) -> Tuple[str, bool, Dict[str, str]]:
|
|
|
169
168
|
return on_pr, on_mg, jobs
|
|
170
169
|
|
|
171
170
|
|
|
172
|
-
def collect() ->
|
|
171
|
+
def collect() -> tuple[dict[str, list[str]], set[str], dict[str, str], set[str]]:
|
|
173
172
|
"""``({check_name: [workflow, ...]}, {on every PR}, {name: workflow}, {on merge_group})``.
|
|
174
173
|
|
|
175
174
|
The third value maps a *conditionally*-triggered check name to the workflow
|
|
176
175
|
that narrows it, so the error message can name the culprit. The fourth is
|
|
177
176
|
the set of names that would also report on a merge-queue ref.
|
|
178
177
|
"""
|
|
179
|
-
by_name:
|
|
180
|
-
on_pr:
|
|
181
|
-
filtered:
|
|
182
|
-
on_mg:
|
|
178
|
+
by_name: dict[str, list[str]] = {}
|
|
179
|
+
on_pr: set[str] = set()
|
|
180
|
+
filtered: dict[str, str] = {}
|
|
181
|
+
on_mg: set[str] = set()
|
|
183
182
|
files = sorted(WORKFLOWS.glob("*.yml")) + sorted(WORKFLOWS.glob("*.yaml"))
|
|
184
183
|
if not files:
|
|
185
184
|
raise SystemExit("required-checks: no workflow files found under %s" % WORKFLOWS)
|
|
@@ -204,7 +203,7 @@ def collect() -> Tuple[Dict[str, List[str]], Set[str], Dict[str, str], Set[str]]
|
|
|
204
203
|
return by_name, on_pr, filtered, on_mg
|
|
205
204
|
|
|
206
205
|
|
|
207
|
-
def read_config() ->
|
|
206
|
+
def read_config() -> list[str]:
|
|
208
207
|
if not CONFIG.exists():
|
|
209
208
|
raise SystemExit("required-checks: missing %s" % CONFIG)
|
|
210
209
|
out = []
|
|
@@ -217,7 +216,7 @@ def read_config() -> List[str]:
|
|
|
217
216
|
return out
|
|
218
217
|
|
|
219
218
|
|
|
220
|
-
def resolve(required: str, on_pr:
|
|
219
|
+
def resolve(required: str, on_pr: set[str]) -> tuple[bool, str]:
|
|
221
220
|
"""Is ``required`` satisfied by some job name in ``on_pr``?
|
|
222
221
|
|
|
223
222
|
Called twice — once against the names that run on every PR, and once
|
|
@@ -242,7 +241,7 @@ def resolve(required: str, on_pr: Set[str]) -> Tuple[bool, str]:
|
|
|
242
241
|
return False, ""
|
|
243
242
|
|
|
244
243
|
|
|
245
|
-
def workflows_for(required: str, by_name:
|
|
244
|
+
def workflows_for(required: str, by_name: dict[str, list[str]]) -> list[str]:
|
|
246
245
|
"""Which workflow file(s) produce ``required``.
|
|
247
246
|
|
|
248
247
|
Accepts the same three spellings :func:`resolve` does — an exact name, a
|
|
@@ -262,7 +261,7 @@ def workflows_for(required: str, by_name: Dict[str, List[str]]) -> List[str]:
|
|
|
262
261
|
return ["an unknown workflow"]
|
|
263
262
|
|
|
264
263
|
|
|
265
|
-
def classic_payload(required:
|
|
264
|
+
def classic_payload(required: list[str]) -> dict:
|
|
266
265
|
"""The `PUT /branches/{branch}/protection` body for this required list."""
|
|
267
266
|
return {
|
|
268
267
|
"required_status_checks": {"strict": True, "contexts": list(required)},
|
|
@@ -274,7 +273,7 @@ def classic_payload(required: List[str]) -> dict:
|
|
|
274
273
|
}
|
|
275
274
|
|
|
276
275
|
|
|
277
|
-
def ruleset_rule(required:
|
|
276
|
+
def ruleset_rule(required: list[str]) -> dict:
|
|
278
277
|
"""The `required_status_checks` RULE for a repository ruleset.
|
|
279
278
|
|
|
280
279
|
Shaped differently from the classic payload on purpose — this is not a
|
|
@@ -294,7 +293,7 @@ def ruleset_rule(required: List[str]) -> dict:
|
|
|
294
293
|
}
|
|
295
294
|
|
|
296
295
|
|
|
297
|
-
def drift(required:
|
|
296
|
+
def drift(required: list[str], remote: list[str]) -> tuple[list[str], list[str]]:
|
|
298
297
|
"""``(missing, extra)`` — how a live mechanism disagrees with the file.
|
|
299
298
|
|
|
300
299
|
Order-insensitive and duplicate-tolerant: GitHub returns contexts in its own
|
|
@@ -315,7 +314,7 @@ def _api(path: str, token: str) -> object:
|
|
|
315
314
|
return json.load(resp)
|
|
316
315
|
|
|
317
316
|
|
|
318
|
-
def ruleset_contexts(detail: dict) ->
|
|
317
|
+
def ruleset_contexts(detail: dict) -> tuple[bool, list[str]]:
|
|
319
318
|
"""``(has_rule, contexts)`` for one ruleset's required-status-checks rule.
|
|
320
319
|
|
|
321
320
|
``has_rule`` is returned separately from an empty list because the two mean
|
|
@@ -329,9 +328,9 @@ def ruleset_contexts(detail: dict) -> Tuple[bool, List[str]]:
|
|
|
329
328
|
return False, []
|
|
330
329
|
|
|
331
330
|
|
|
332
|
-
def verify_remote(required:
|
|
331
|
+
def verify_remote(required: list[str], token: str) -> list[str]:
|
|
333
332
|
"""Compare BOTH live mechanisms against the file. Returns problems."""
|
|
334
|
-
problems:
|
|
333
|
+
problems: list[str] = []
|
|
335
334
|
|
|
336
335
|
prot = _api("/repos/%s/branches/%s/protection" % (REPO, BRANCH), token)
|
|
337
336
|
contexts = ((prot or {}).get("required_status_checks") or {}).get("contexts", [])
|
|
@@ -377,7 +376,7 @@ def verify_remote(required: List[str], token: str) -> List[str]:
|
|
|
377
376
|
return problems
|
|
378
377
|
|
|
379
378
|
|
|
380
|
-
def main(argv:
|
|
379
|
+
def main(argv: list[str]) -> int:
|
|
381
380
|
ap = argparse.ArgumentParser(description=__doc__)
|
|
382
381
|
ap.add_argument("--print-api", action="store_true",
|
|
383
382
|
help="print the CLASSIC branch-protection payload and exit")
|
|
@@ -436,7 +435,7 @@ def main(argv: List[str]) -> int:
|
|
|
436
435
|
"(%d checks)." % (CONFIG.name, len(required)))
|
|
437
436
|
return 0
|
|
438
437
|
|
|
439
|
-
problems:
|
|
438
|
+
problems: list[str] = []
|
|
440
439
|
|
|
441
440
|
ambiguous = {n: w for n, w in sorted(by_name.items()) if len(w) > 1}
|
|
442
441
|
for name, where in ambiguous.items():
|
|
@@ -77,8 +77,8 @@ import argparse
|
|
|
77
77
|
import re
|
|
78
78
|
import subprocess
|
|
79
79
|
import sys
|
|
80
|
+
from collections.abc import Sequence
|
|
80
81
|
from pathlib import Path
|
|
81
|
-
from typing import Dict, List, Optional, Sequence, Tuple
|
|
82
82
|
|
|
83
83
|
ROOT = Path(__file__).resolve().parent.parent
|
|
84
84
|
DEFAULT_TAPS = ROOT / "tests" / "eval" / "taps.txt"
|
|
@@ -89,7 +89,7 @@ SCALE_TAPS = ROOT / "tests" / "eval" / "taps-scale.txt"
|
|
|
89
89
|
_SHA = re.compile(r"[0-9a-f]{40}")
|
|
90
90
|
|
|
91
91
|
#: ``(owner/repo, pinned commit or None, pinned entry count or None)``.
|
|
92
|
-
Row =
|
|
92
|
+
Row = tuple[str, str | None, int | None]
|
|
93
93
|
|
|
94
94
|
#: A repository, or the commit a row pins, could not be fetched.
|
|
95
95
|
UNAVAILABLE = "unavailable"
|
|
@@ -129,7 +129,7 @@ class CorpusError(RuntimeError):
|
|
|
129
129
|
self.detail = detail
|
|
130
130
|
|
|
131
131
|
|
|
132
|
-
def parse_taps(text: str) ->
|
|
132
|
+
def parse_taps(text: str) -> list[Row]:
|
|
133
133
|
"""Rows of ``owner/repo [sha [count]]``, comments and blanks dropped.
|
|
134
134
|
|
|
135
135
|
An absent SHA parses as ``None`` rather than an error so the format stays
|
|
@@ -139,7 +139,7 @@ def parse_taps(text: str) -> List[Row]:
|
|
|
139
139
|
fatal on the same grounds, and requires a SHA — a count beside an unpinned
|
|
140
140
|
repo describes a tree that is free to change underneath it.
|
|
141
141
|
"""
|
|
142
|
-
rows:
|
|
142
|
+
rows: list[Row] = []
|
|
143
143
|
for raw in text.splitlines():
|
|
144
144
|
line = raw.strip()
|
|
145
145
|
if not line or line.startswith("#"):
|
|
@@ -170,7 +170,7 @@ def parse_taps(text: str) -> List[Row]:
|
|
|
170
170
|
return rows
|
|
171
171
|
|
|
172
172
|
|
|
173
|
-
def shares(rows: Sequence[Row]) ->
|
|
173
|
+
def shares(rows: Sequence[Row]) -> list[tuple[str, int, float]]:
|
|
174
174
|
"""``(repo, count, share)`` for every counted row, largest first.
|
|
175
175
|
|
|
176
176
|
Rows with no recorded count are omitted rather than treated as zero: a
|
|
@@ -185,7 +185,7 @@ def shares(rows: Sequence[Row]) -> List[Tuple[str, int, float]]:
|
|
|
185
185
|
key=lambda row: (-row[1], row[0]))
|
|
186
186
|
|
|
187
187
|
|
|
188
|
-
def check_concentration(rows: Sequence[Row]) ->
|
|
188
|
+
def check_concentration(rows: Sequence[Row]) -> str | None:
|
|
189
189
|
"""Return a message when one repository exceeds ``MAX_SHARE``, else ``None``.
|
|
190
190
|
|
|
191
191
|
Static — it reads the counts already in the file, so it costs no network and
|
|
@@ -208,7 +208,7 @@ def check_concentration(rows: Sequence[Row]) -> Optional[str]:
|
|
|
208
208
|
MAX_SHARE * 100))
|
|
209
209
|
|
|
210
210
|
|
|
211
|
-
def extra_taps(configured: Sequence[str], pinned: Sequence[str]) ->
|
|
211
|
+
def extra_taps(configured: Sequence[str], pinned: Sequence[str]) -> list[str]:
|
|
212
212
|
"""Configured taps that this list does not pin, sorted.
|
|
213
213
|
|
|
214
214
|
The third way to score a corpus that is not the pinned one, and the easiest
|
|
@@ -261,7 +261,7 @@ def pin_clone(path: Path, sha: str) -> None:
|
|
|
261
261
|
|
|
262
262
|
|
|
263
263
|
def _materialise(rows: Sequence[Row], verify: bool = True
|
|
264
|
-
) ->
|
|
264
|
+
) -> tuple[dict[str, int], list[CorpusError]]:
|
|
265
265
|
"""Tap, pin and rescan every row. Returns ``(counts, failures)``.
|
|
266
266
|
|
|
267
267
|
Every row is attempted even after one fails. Stopping at the first would
|
|
@@ -271,8 +271,8 @@ def _materialise(rows: Sequence[Row], verify: bool = True
|
|
|
271
271
|
sys.path.insert(0, str(ROOT))
|
|
272
272
|
from boost_cli.core import catalog, registry # deferred: repo-root import shim
|
|
273
273
|
|
|
274
|
-
counts:
|
|
275
|
-
failures:
|
|
274
|
+
counts: dict[str, int] = {}
|
|
275
|
+
failures: list[CorpusError] = []
|
|
276
276
|
for repo, sha, want in rows:
|
|
277
277
|
try:
|
|
278
278
|
try:
|
|
@@ -345,8 +345,8 @@ def _report_failures(failures: Sequence[CorpusError], total_rows: int) -> int:
|
|
|
345
345
|
return EXIT_DRIFT if drift else EXIT_UNAVAILABLE
|
|
346
346
|
|
|
347
347
|
|
|
348
|
-
def relock_text(text: str, counts:
|
|
349
|
-
shas:
|
|
348
|
+
def relock_text(text: str, counts: dict[str, int],
|
|
349
|
+
shas: dict[str, str] | None = None) -> str:
|
|
350
350
|
"""Rewrite each pinned row's entry count — and its SHA when ``shas`` says so.
|
|
351
351
|
|
|
352
352
|
A whole-file rewrite would lose the header, which is where the reasoning
|
|
@@ -379,8 +379,8 @@ def relock_text(text: str, counts: Dict[str, int],
|
|
|
379
379
|
return "\n".join(out) + ("\n" if text.endswith("\n") else "")
|
|
380
380
|
|
|
381
381
|
|
|
382
|
-
def refresh_summary(rows: Sequence[Row], shas:
|
|
383
|
-
counts:
|
|
382
|
+
def refresh_summary(rows: Sequence[Row], shas: dict[str, str],
|
|
383
|
+
counts: dict[str, int]) -> str:
|
|
384
384
|
"""A Markdown table of what a refresh moved, for the pull request body.
|
|
385
385
|
|
|
386
386
|
The point of the scheduled refresh is not the refresh — it is that the diff
|
|
@@ -446,7 +446,7 @@ def _ensure(taps: Path, relock: bool = False) -> int:
|
|
|
446
446
|
return 0
|
|
447
447
|
|
|
448
448
|
|
|
449
|
-
def _refresh(taps: Path, summary_path:
|
|
449
|
+
def _refresh(taps: Path, summary_path: str | None = None) -> int:
|
|
450
450
|
"""Move every row to current upstream HEAD, re-measure, rewrite taps.txt.
|
|
451
451
|
|
|
452
452
|
Pinning bought reproducibility with representativeness: the gate measures
|
|
@@ -465,9 +465,9 @@ def _refresh(taps: Path, summary_path: Optional[str] = None) -> int:
|
|
|
465
465
|
from boost_cli.core import catalog, gitutil, registry # deferred: path shim
|
|
466
466
|
|
|
467
467
|
rows = parse_taps(taps.read_text(encoding="utf-8"))
|
|
468
|
-
shas:
|
|
469
|
-
counts:
|
|
470
|
-
failures:
|
|
468
|
+
shas: dict[str, str] = {}
|
|
469
|
+
counts: dict[str, int] = {}
|
|
470
|
+
failures: list[CorpusError] = []
|
|
471
471
|
for repo, old_sha, _n in rows:
|
|
472
472
|
try:
|
|
473
473
|
try:
|
|
@@ -534,7 +534,7 @@ def _audit(taps: Path) -> int:
|
|
|
534
534
|
return 0
|
|
535
535
|
|
|
536
536
|
|
|
537
|
-
def main(argv:
|
|
537
|
+
def main(argv: list[str] | None = None) -> int:
|
|
538
538
|
p = argparse.ArgumentParser(prog="eval_corpus.py", description=__doc__)
|
|
539
539
|
p.add_argument("--ensure", action="store_true",
|
|
540
540
|
help="tap, pin and verify every row, then rebuild its cache")
|