boost-skill-cli 1.2.35__tar.gz → 1.2.36__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.2.35 → boost_skill_cli-1.2.36}/Makefile +2 -0
- {boost_skill_cli-1.2.35/boost_skill_cli.egg-info → boost_skill_cli-1.2.36}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_skill_cli.egg-info/SOURCES.txt +9 -0
- boost_skill_cli-1.2.36/docs/roadmap/items/vex-openvex-feed.md +39 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap.html +37 -1
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/security-design.md +37 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/verifying-releases.md +9 -0
- boost_skill_cli-1.2.36/docs/vex/meta.md +12 -0
- boost_skill_cli-1.2.36/docs/vex/openvex.json +61 -0
- boost_skill_cli-1.2.36/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +15 -0
- boost_skill_cli-1.2.36/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +22 -0
- boost_skill_cli-1.2.36/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +17 -0
- boost_skill_cli-1.2.36/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +20 -0
- boost_skill_cli-1.2.36/scripts/build_vex.py +175 -0
- boost_skill_cli-1.2.36/tests/unit/test_vex.py +266 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.gitattributes +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.gitignore +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/.vale.ini +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/DCO +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/LICENSE +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/README.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/codecov.yml +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/bmad.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/index.html +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/branch-current-gate.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/semantic-search.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/README.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/examples/README.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/index.html +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/noxfile.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/setup.cfg +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/style/README.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/style/boost.css +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/style/boost.js +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/style/demo.html +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.35 → boost_skill_cli-1.2.36}/tests/visual/visual_check.mjs +0 -0
|
@@ -88,6 +88,7 @@ lint:
|
|
|
88
88
|
$(PY) scripts/build_registries.py --check
|
|
89
89
|
$(PY) scripts/build_roadmap.py --check
|
|
90
90
|
$(PY) scripts/build_command_reference.py --check
|
|
91
|
+
$(PY) scripts/build_vex.py --check
|
|
91
92
|
$(PY) scripts/lock_toolchain.py --check
|
|
92
93
|
$(PY) scripts/a11y_check.py
|
|
93
94
|
$(PY) scripts/page_budget.py
|
|
@@ -237,6 +238,7 @@ generate:
|
|
|
237
238
|
$(PY) scripts/build_registries.py
|
|
238
239
|
$(PY) scripts/build_roadmap.py
|
|
239
240
|
$(PY) scripts/build_command_reference.py
|
|
241
|
+
$(PY) scripts/build_vex.py
|
|
240
242
|
|
|
241
243
|
# regenerate docs/demo.gif (brew install vhs)
|
|
242
244
|
demo:
|
|
@@ -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.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2,
|
|
21
|
+
__version__ = version = '1.2.36'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 36)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -464,6 +464,7 @@ docs/roadmap/items/update-diff-before-apply.md
|
|
|
464
464
|
docs/roadmap/items/update-refreshed-rules-without-a-gate.md
|
|
465
465
|
docs/roadmap/items/update-refreshes-rules-and-workflows.md
|
|
466
466
|
docs/roadmap/items/update-reinstall-widens-agent-scope.md
|
|
467
|
+
docs/roadmap/items/vex-openvex-feed.md
|
|
467
468
|
docs/roadmap/items/visual-regression-pass-on-the-guide.md
|
|
468
469
|
docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md
|
|
469
470
|
docs/roadmap/items/windows-in-the-ci-matrix.md
|
|
@@ -476,6 +477,12 @@ docs/roadmap/items/zip-strict-audit.md
|
|
|
476
477
|
docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md
|
|
477
478
|
docs/roadmap/items/zizmor-pin-is-a-yanked-release.md
|
|
478
479
|
docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md
|
|
480
|
+
docs/vex/meta.md
|
|
481
|
+
docs/vex/openvex.json
|
|
482
|
+
docs/vex/statements/gitleaks-secretscan-test-fixtures.md
|
|
483
|
+
docs/vex/statements/quality-trust-fingerprint-not-sensitive.md
|
|
484
|
+
docs/vex/statements/zizmor-adhoc-packages-lint-runners.md
|
|
485
|
+
docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md
|
|
479
486
|
evals/README.md
|
|
480
487
|
evals/__init__.py
|
|
481
488
|
evals/baseline.json
|
|
@@ -508,6 +515,7 @@ scripts/build_demo_index.py
|
|
|
508
515
|
scripts/build_registries.py
|
|
509
516
|
scripts/build_roadmap.py
|
|
510
517
|
scripts/build_scale_corpus.py
|
|
518
|
+
scripts/build_vex.py
|
|
511
519
|
scripts/check_anchors.py
|
|
512
520
|
scripts/check_branch_current.py
|
|
513
521
|
scripts/check_dco.py
|
|
@@ -770,6 +778,7 @@ tests/unit/test_typosquat.py
|
|
|
770
778
|
tests/unit/test_updatediff.py
|
|
771
779
|
tests/unit/test_util.py
|
|
772
780
|
tests/unit/test_version.py
|
|
781
|
+
tests/unit/test_vex.py
|
|
773
782
|
tests/unit/test_visual_harness_flags.py
|
|
774
783
|
tests/unit/test_workflow_concurrency.py
|
|
775
784
|
tests/unit/test_workflow_concurrency_groups.py
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: vex-openvex-feed
|
|
3
|
+
board: code
|
|
4
|
+
section: health
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Security · Posture
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: Low
|
|
9
|
+
wow: 2
|
|
10
|
+
note: OSPS-VM-04.02 — 4 statements, zero fabricated CVEs
|
|
11
|
+
order: 45
|
|
12
|
+
owner: loop/vex
|
|
13
|
+
pr:
|
|
14
|
+
title: A machine-readable VEX feed, sourced from findings that already existed
|
|
15
|
+
---
|
|
16
|
+
<code>OSPS-VM-04.02</code> — a Level 3 Baseline criterion <a
|
|
17
|
+
href="roadmap.html#osps-baseline-levels">the audit</a> hadn't reached — asks for a VEX
|
|
18
|
+
document accounting for vulnerabilities that don't affect the project, with the
|
|
19
|
+
non-exploitability reasoning attached. boost already had that reasoning; it just wasn't in a
|
|
20
|
+
form a consumer could ingest. CodeQL dismissals carry a <code>#
|
|
21
|
+
codeql[rule-id]</code> comment, <code>.gitleaks.toml</code> allowlists boost's own synthetic
|
|
22
|
+
secret-scanner fixtures, and <code>.github/zizmor.yml</code> documents six ignores by reason.
|
|
23
|
+
<a href="https://openvex.dev/">OpenVEX</a> 0.2.0 turns those into
|
|
24
|
+
a published document at <code>docs/vex/openvex.json</code>,
|
|
25
|
+
generated by <code>scripts/build_vex.py</code> from one statement file per finding under
|
|
26
|
+
<code>docs/vex/statements/</code> — the same one-file-per-item convention the roadmap boards
|
|
27
|
+
themselves use, wired into <code>make generate</code> and a <code>--check</code> freshness
|
|
28
|
+
gate in CI.
|
|
29
|
+
<b>Four statements, and every one traces to a real, already-merged suppression</b> — not an
|
|
30
|
+
invented CVE. boost has never had one, so nothing here is named <code>CVE-</code> or
|
|
31
|
+
<code>GHSA-</code>; each statement's vulnerability name is the scanner's own rule id instead
|
|
32
|
+
(<code>codeql:py/clear-text-logging-sensitive-data</code>, <code>gitleaks:...</code>,
|
|
33
|
+
<code>zizmor:dangerous-triggers</code>, <code>zizmor:adhoc-packages</code>).
|
|
34
|
+
<b>This satisfies one criterion, not the level.</b> <code>OSPS-QA-07.01</code> — a non-author
|
|
35
|
+
human approval before merge — is the wall Level 3 hits regardless, and this change does not
|
|
36
|
+
move it; <code>docs/openssf-badge.md</code> tracks the passing-badge criteria only and has no
|
|
37
|
+
Baseline rows to flip, so the record lives here and in
|
|
38
|
+
<code>docs/security-design.md</code>
|
|
39
|
+
instead.
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
<div class="stat"><b>17</b><span>Shipped</span></div>
|
|
134
134
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
135
135
|
<div class="stat"><b>7</b><span>Planned</span></div>
|
|
136
|
-
<div class="stat"><b>
|
|
136
|
+
<div class="stat"><b>280</b><span>Loop finds</span></div>
|
|
137
137
|
<!-- /ROADMAP:stats -->
|
|
138
138
|
</div>
|
|
139
139
|
</section>
|
|
@@ -5287,6 +5287,42 @@ composed into a blind spot, which is the shape most of these have.</p>
|
|
|
5287
5287
|
<span class="m">Gemini warned once per skill per session and no boost surface could see it</span>
|
|
5288
5288
|
</div>
|
|
5289
5289
|
</article>
|
|
5290
|
+
|
|
5291
|
+
<article class="cap rcard" id="vex-openvex-feed">
|
|
5292
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Security · Posture</span></div>
|
|
5293
|
+
<h3>A machine-readable VEX feed, sourced from findings that already existed</h3>
|
|
5294
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
5295
|
+
<p><code>OSPS-VM-04.02</code> — a Level 3 Baseline criterion <a
|
|
5296
|
+
href="roadmap.html#osps-baseline-levels">the audit</a> hadn't reached — asks for a VEX
|
|
5297
|
+
document accounting for vulnerabilities that don't affect the project, with the
|
|
5298
|
+
non-exploitability reasoning attached. boost already had that reasoning; it just wasn't in a
|
|
5299
|
+
form a consumer could ingest. CodeQL dismissals carry a <code>#
|
|
5300
|
+
codeql[rule-id]</code> comment, <code>.gitleaks.toml</code> allowlists boost's own synthetic
|
|
5301
|
+
secret-scanner fixtures, and <code>.github/zizmor.yml</code> documents six ignores by reason.
|
|
5302
|
+
<a href="https://openvex.dev/">OpenVEX</a> 0.2.0 turns those into
|
|
5303
|
+
a published document at <code>docs/vex/openvex.json</code>,
|
|
5304
|
+
generated by <code>scripts/build_vex.py</code> from one statement file per finding under
|
|
5305
|
+
<code>docs/vex/statements/</code> — the same one-file-per-item convention the roadmap boards
|
|
5306
|
+
themselves use, wired into <code>make generate</code> and a <code>--check</code> freshness
|
|
5307
|
+
gate in CI.
|
|
5308
|
+
<b>Four statements, and every one traces to a real, already-merged suppression</b> — not an
|
|
5309
|
+
invented CVE. boost has never had one, so nothing here is named <code>CVE-</code> or
|
|
5310
|
+
<code>GHSA-</code>; each statement's vulnerability name is the scanner's own rule id instead
|
|
5311
|
+
(<code>codeql:py/clear-text-logging-sensitive-data</code>, <code>gitleaks:...</code>,
|
|
5312
|
+
<code>zizmor:dangerous-triggers</code>, <code>zizmor:adhoc-packages</code>).
|
|
5313
|
+
<b>This satisfies one criterion, not the level.</b> <code>OSPS-QA-07.01</code> — a non-author
|
|
5314
|
+
human approval before merge — is the wall Level 3 hits regardless, and this change does not
|
|
5315
|
+
move it; <code>docs/openssf-badge.md</code> tracks the passing-badge criteria only and has no
|
|
5316
|
+
Baseline rows to flip, so the record lives here and in
|
|
5317
|
+
<code>docs/security-design.md</code>
|
|
5318
|
+
instead.</p></details>
|
|
5319
|
+
<div class="meta">
|
|
5320
|
+
<span class="m">Complexity <b>S</b></span>
|
|
5321
|
+
<span class="m">Impact <b>Low</b></span>
|
|
5322
|
+
<span class="m">Wow <b class="wow">★★</b></span>
|
|
5323
|
+
<span class="m">OSPS-VM-04.02 — 4 statements, zero fabricated CVEs</span>
|
|
5324
|
+
</div>
|
|
5325
|
+
</article>
|
|
5290
5326
|
<!-- /ROADMAP:cards -->
|
|
5291
5327
|
|
|
5292
5328
|
</div>
|
|
@@ -173,6 +173,43 @@ Every one of these gates blocks a merge to `main`.
|
|
|
173
173
|
| `import-linter` | the layering that keeps `core/` free of CLI concerns |
|
|
174
174
|
| SLSA provenance + PyPI Trusted Publishing | a released artifact traces to the commit and workflow that built it |
|
|
175
175
|
|
|
176
|
+
## VEX: accounting for findings that don't affect boost
|
|
177
|
+
|
|
178
|
+
Every tool in the table above finds things it does not fix — a CodeQL query
|
|
179
|
+
firing on a pattern that isn't actually sensitive here, a gitleaks match on a
|
|
180
|
+
string that was never a real credential, a zizmor rule on a trigger that
|
|
181
|
+
carries its own mitigation. Each dismissal already has a written reason living
|
|
182
|
+
next to the code it describes: a `# codeql[rule-id]` suppression comment, a
|
|
183
|
+
`.gitleaks.toml` allowlist entry, an ignore in `.github/zizmor.yml`. None of
|
|
184
|
+
that was a document a consumer could ingest, which is exactly what OSPS
|
|
185
|
+
Baseline's `OSPS-VM-04.02` asks for: *"While active, any vulnerabilities in
|
|
186
|
+
the software components not affecting the project MUST be accounted for in a
|
|
187
|
+
VEX document, augmenting the vulnerability report with non-exploitability
|
|
188
|
+
details."*
|
|
189
|
+
|
|
190
|
+
[`docs/vex/openvex.json`](vex/openvex.json) is that document — an
|
|
191
|
+
[OpenVEX](https://openvex.dev/) 0.2.0 feed, published at
|
|
192
|
+
<https://jonnyeclectic.github.io/boost/vex/openvex.json>. It is generated by
|
|
193
|
+
`scripts/build_vex.py` from one Markdown file per statement under
|
|
194
|
+
[`docs/vex/statements/`](vex/statements/) — the same one-file-per-item
|
|
195
|
+
convention `docs/roadmap/items/*.md` uses, so two people adding two different
|
|
196
|
+
findings edit two different files rather than one shared JSON blob.
|
|
197
|
+
`make generate` regenerates it; `make lint` and CI both run
|
|
198
|
+
`build_vex.py --check` and fail if the committed document has drifted from
|
|
199
|
+
its source files.
|
|
200
|
+
|
|
201
|
+
Every statement in it today is sourced from a real, already-dismissed finding
|
|
202
|
+
in this repository, not an invented one — the print-side CodeQL
|
|
203
|
+
`py/clear-text-logging-sensitive-data` finding on `trust add`'s fingerprint
|
|
204
|
+
line, the gitleaks allowlist entry for `tests/unit/test_secretscan.py`'s
|
|
205
|
+
synthetic fixtures, and the two categories of `zizmor` ignores in
|
|
206
|
+
`.github/zizmor.yml`. **boost has never had a CVE**, so the document names no
|
|
207
|
+
CVE or GHSA identifier — each statement's `vulnerability.name` is the
|
|
208
|
+
scanner's own rule id (`codeql:...`, `gitleaks:...`, `zizmor:...`) instead. An
|
|
209
|
+
empty-but-honest VEX document would have been the right call had none of these
|
|
210
|
+
findings existed to describe; naming a vulnerability that was never reported
|
|
211
|
+
would not have been.
|
|
212
|
+
|
|
176
213
|
## Security review record
|
|
177
214
|
|
|
178
215
|
OpenSSF Best Practices `security_review` asks for a review performed within the
|
|
@@ -77,6 +77,15 @@ PGP key for boost, they did not come from this project.
|
|
|
77
77
|
| Git tag | Points at the commit the release was built from | `git verify-tag` is *not* applicable — tags are unsigned; the provenance attestation is the authority |
|
|
78
78
|
| Release notes | Assembled from the merged pull requests in that release | [Releases page](https://github.com/jonnyeclectic/boost/releases) |
|
|
79
79
|
|
|
80
|
+
## VEX: findings that do not affect boost
|
|
81
|
+
|
|
82
|
+
The SBOM says what is in a release; a separate, continuously-updated
|
|
83
|
+
[OpenVEX](https://openvex.dev/) document says which known findings against
|
|
84
|
+
those components don't actually affect boost, with the reasoning attached.
|
|
85
|
+
It is not published per release — it is always current at
|
|
86
|
+
[`docs/vex/openvex.json`](vex/openvex.json). See
|
|
87
|
+
[security-design.md](security-design.md#vex-accounting-for-findings-that-dont-affect-boost).
|
|
88
|
+
|
|
80
89
|
## Can you rebuild it yourself? Yes — the measurement
|
|
81
90
|
|
|
82
91
|
A reproducible build lets a third party rebuild the artifact from source and
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: openvex
|
|
3
|
+
author: "the boost project (https://github.com/jonnyeclectic/boost)"
|
|
4
|
+
version: 1
|
|
5
|
+
timestamp: "2026-08-28T00:00:00Z"
|
|
6
|
+
---
|
|
7
|
+
Document-level identity for `docs/vex/openvex.json`, hand-edited the way a
|
|
8
|
+
changelog is: bump `version` and set `timestamp` to the date of the change
|
|
9
|
+
whenever a statement under `statements/` is added, changed, or removed.
|
|
10
|
+
Neither field is computed — `scripts/build_vex.py` deliberately never reads
|
|
11
|
+
the wall clock, so `--check` can compare byte-for-byte. This body is prose
|
|
12
|
+
for humans editing the file; it is not part of the generated document.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"@context": "https://openvex.dev/ns/v0.2.0",
|
|
3
|
+
"@id": "https://jonnyeclectic.github.io/boost/vex/openvex.json",
|
|
4
|
+
"author": "the boost project (https://github.com/jonnyeclectic/boost)",
|
|
5
|
+
"timestamp": "2026-08-28T00:00:00Z",
|
|
6
|
+
"version": 1,
|
|
7
|
+
"statements": [
|
|
8
|
+
{
|
|
9
|
+
"vulnerability": {
|
|
10
|
+
"name": "gitleaks:leaked-secret-detection"
|
|
11
|
+
},
|
|
12
|
+
"products": [
|
|
13
|
+
{
|
|
14
|
+
"@id": "pkg:pypi/boost-skill-cli"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"status": "not_affected",
|
|
18
|
+
"justification": "vulnerable_code_not_present",
|
|
19
|
+
"impact_statement": "`tests/unit/test_secretscan.py` exists to prove `boost_cli/core/secretscan.py`\nflags private keys and API tokens, so it ships synthetic examples of both by\ndesign — strings shaped exactly like the credentials gitleaks' own ruleset\nlooks for. gitleaks correctly matches the shape; none of the matched strings\nis a real, working credential, was ever live, or grants access to anything.\n`.gitleaks.toml` allowlists only this one file, by exact path, and the\nallowlist's own comment states why: nothing else in the repository is\nexcluded from the scan."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"vulnerability": {
|
|
23
|
+
"name": "codeql:py/clear-text-logging-sensitive-data"
|
|
24
|
+
},
|
|
25
|
+
"products": [
|
|
26
|
+
{
|
|
27
|
+
"@id": "pkg:pypi/boost-skill-cli"
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"status": "not_affected",
|
|
31
|
+
"justification": "vulnerable_code_not_present",
|
|
32
|
+
"impact_statement": "CodeQL's `py/clear-text-logging-sensitive-data` query flags\n`boost trust add`'s success line, which prints the trusted key's name and\nminisign fingerprint, because the argument is user-supplied and `fingerprint`\nreads like a credential name. It is not one: the value is a minisign\n**public** key fingerprint, which is meant to be published, and printing it is\nthe entire point of the command — it is how a user checks by eye that the key\nthey just trusted matches the one the publisher advertises. The class of data\nthe query exists to catch (a secret, token, or password) is not present in\nwhat is logged, so the pattern the rule looks for does not apply here. An\nearlier automated fix that replaced this line with a constant string removed\nthe only verification `trust add` offers; the line was restored, the\nsuppression carries this reasoning inline\n(`# codeql[py/clear-text-logging-sensitive-data]`), and\n`tests/functional/test_tap_signing.py` pins the output so it cannot be quietly\ndropped a second time."
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"vulnerability": {
|
|
36
|
+
"name": "zizmor:adhoc-packages"
|
|
37
|
+
},
|
|
38
|
+
"products": [
|
|
39
|
+
{
|
|
40
|
+
"@id": "pkg:pypi/boost-skill-cli"
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"status": "not_affected",
|
|
44
|
+
"justification": "inline_mitigations_already_exist",
|
|
45
|
+
"impact_statement": "zizmor's `adhoc-packages` rule flags installing packages without a lockfile,\nbecause an unpinned install can resolve to a tampered or unexpectedly newer\npackage. Two workflows do this on purpose: `theme-lint.yml` installs\nmajor-pinned linters with `--no-save` into an empty checkout — boost ships no\n`package.json`, so a lockfile would exist solely for this one step — and\n`visual.yml` installs a pinned `puppeteer-core` from\n`tests/visual/package.json`, also `--no-save`. Both run on an ephemeral\nrunner, hold only `contents: read`, and their output gates nothing but\nthemselves — a compromised lint or screenshot tool in either job cannot reach\na secret or influence a later, privileged job."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"vulnerability": {
|
|
49
|
+
"name": "zizmor:dangerous-triggers"
|
|
50
|
+
},
|
|
51
|
+
"products": [
|
|
52
|
+
{
|
|
53
|
+
"@id": "pkg:pypi/boost-skill-cli"
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"status": "not_affected",
|
|
57
|
+
"justification": "inline_mitigations_already_exist",
|
|
58
|
+
"impact_statement": "zizmor's `dangerous-triggers` rule flags `workflow_run`, because the classic\nfailure mode is a privileged run executing pull-request-controlled code. Four\nworkflows use it — `ci-failure-issue.yml`, `publish.yml`, `post-deploy.yml`,\n`sbom.yml` — and each carries the mitigation that makes the pattern safe in\nits specific case, recorded inline in `.github/zizmor.yml`: none of them\nchecks out the triggering run's head SHA (each explicitly checks out `main`,\na release tag, or nothing at all), so no code a fork's pull request could\ninfluence ever runs in the privileged context. `publish.yml`, the one job that\nholds write credentials (PyPI Trusted Publisher OIDC), is additionally scoped\nto `push` events from this repository only — a fork PR opened from a branch\nnamed `main` cannot satisfy that filter. `sbom.yml` is gated on\n`head_repository == this repository` for the same reason. The remaining two\nhold only `contents: read` and no secrets."
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: gitleaks-secretscan-test-fixtures
|
|
3
|
+
vulnerability: "gitleaks:leaked-secret-detection"
|
|
4
|
+
status: not_affected
|
|
5
|
+
justification: vulnerable_code_not_present
|
|
6
|
+
source: .gitleaks.toml, tests/unit/test_secretscan.py
|
|
7
|
+
---
|
|
8
|
+
`tests/unit/test_secretscan.py` exists to prove `boost_cli/core/secretscan.py`
|
|
9
|
+
flags private keys and API tokens, so it ships synthetic examples of both by
|
|
10
|
+
design — strings shaped exactly like the credentials gitleaks' own ruleset
|
|
11
|
+
looks for. gitleaks correctly matches the shape; none of the matched strings
|
|
12
|
+
is a real, working credential, was ever live, or grants access to anything.
|
|
13
|
+
`.gitleaks.toml` allowlists only this one file, by exact path, and the
|
|
14
|
+
allowlist's own comment states why: nothing else in the repository is
|
|
15
|
+
excluded from the scan.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: quality-trust-fingerprint-not-sensitive
|
|
3
|
+
vulnerability: "codeql:py/clear-text-logging-sensitive-data"
|
|
4
|
+
status: not_affected
|
|
5
|
+
justification: vulnerable_code_not_present
|
|
6
|
+
source: boost_cli/commands/quality.py:1248
|
|
7
|
+
---
|
|
8
|
+
CodeQL's `py/clear-text-logging-sensitive-data` query flags
|
|
9
|
+
`boost trust add`'s success line, which prints the trusted key's name and
|
|
10
|
+
minisign fingerprint, because the argument is user-supplied and `fingerprint`
|
|
11
|
+
reads like a credential name. It is not one: the value is a minisign
|
|
12
|
+
**public** key fingerprint, which is meant to be published, and printing it is
|
|
13
|
+
the entire point of the command — it is how a user checks by eye that the key
|
|
14
|
+
they just trusted matches the one the publisher advertises. The class of data
|
|
15
|
+
the query exists to catch (a secret, token, or password) is not present in
|
|
16
|
+
what is logged, so the pattern the rule looks for does not apply here. An
|
|
17
|
+
earlier automated fix that replaced this line with a constant string removed
|
|
18
|
+
the only verification `trust add` offers; the line was restored, the
|
|
19
|
+
suppression carries this reasoning inline
|
|
20
|
+
(`# codeql[py/clear-text-logging-sensitive-data]`), and
|
|
21
|
+
`tests/functional/test_tap_signing.py` pins the output so it cannot be quietly
|
|
22
|
+
dropped a second time.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: zizmor-adhoc-packages-lint-runners
|
|
3
|
+
vulnerability: "zizmor:adhoc-packages"
|
|
4
|
+
status: not_affected
|
|
5
|
+
justification: inline_mitigations_already_exist
|
|
6
|
+
source: .github/zizmor.yml (theme-lint.yml:48, visual.yml:38)
|
|
7
|
+
---
|
|
8
|
+
zizmor's `adhoc-packages` rule flags installing packages without a lockfile,
|
|
9
|
+
because an unpinned install can resolve to a tampered or unexpectedly newer
|
|
10
|
+
package. Two workflows do this on purpose: `theme-lint.yml` installs
|
|
11
|
+
major-pinned linters with `--no-save` into an empty checkout — boost ships no
|
|
12
|
+
`package.json`, so a lockfile would exist solely for this one step — and
|
|
13
|
+
`visual.yml` installs a pinned `puppeteer-core` from
|
|
14
|
+
`tests/visual/package.json`, also `--no-save`. Both run on an ephemeral
|
|
15
|
+
runner, hold only `contents: read`, and their output gates nothing but
|
|
16
|
+
themselves — a compromised lint or screenshot tool in either job cannot reach
|
|
17
|
+
a secret or influence a later, privileged job.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: zizmor-dangerous-triggers-workflow-run
|
|
3
|
+
vulnerability: "zizmor:dangerous-triggers"
|
|
4
|
+
status: not_affected
|
|
5
|
+
justification: inline_mitigations_already_exist
|
|
6
|
+
source: .github/zizmor.yml (ci-failure-issue.yml:28, publish.yml:19, post-deploy.yml:21, sbom.yml:29)
|
|
7
|
+
---
|
|
8
|
+
zizmor's `dangerous-triggers` rule flags `workflow_run`, because the classic
|
|
9
|
+
failure mode is a privileged run executing pull-request-controlled code. Four
|
|
10
|
+
workflows use it — `ci-failure-issue.yml`, `publish.yml`, `post-deploy.yml`,
|
|
11
|
+
`sbom.yml` — and each carries the mitigation that makes the pattern safe in
|
|
12
|
+
its specific case, recorded inline in `.github/zizmor.yml`: none of them
|
|
13
|
+
checks out the triggering run's head SHA (each explicitly checks out `main`,
|
|
14
|
+
a release tag, or nothing at all), so no code a fork's pull request could
|
|
15
|
+
influence ever runs in the privileged context. `publish.yml`, the one job that
|
|
16
|
+
holds write credentials (PyPI Trusted Publisher OIDC), is additionally scoped
|
|
17
|
+
to `push` events from this repository only — a fork PR opened from a branch
|
|
18
|
+
named `main` cannot satisfy that filter. `sbom.yml` is gated on
|
|
19
|
+
`head_repository == this repository` for the same reason. The remaining two
|
|
20
|
+
hold only `contents: read` and no secrets.
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Copyright the boost contributors.
|
|
3
|
+
# SPDX-License-Identifier: GPL-3.0-only
|
|
4
|
+
"""Render ``docs/vex/openvex.json`` — boost's OpenVEX 0.2.0 feed — from a
|
|
5
|
+
human-edited source of truth.
|
|
6
|
+
|
|
7
|
+
OSPS Baseline ``OSPS-VM-04.02`` asks for exactly this: "While active, any
|
|
8
|
+
vulnerabilities in the software components not affecting the project MUST be
|
|
9
|
+
accounted for in a VEX document, augmenting the vulnerability report with
|
|
10
|
+
non-exploitability details." boost's scanners (CodeQL, gitleaks, zizmor) each
|
|
11
|
+
already carry that reasoning inline — a ``# codeql[rule-id]`` suppression
|
|
12
|
+
comment, a gitleaks allowlist entry, a ``.github/zizmor.yml`` ignore — but none
|
|
13
|
+
of that is a document a consumer can *ingest*. This script is the bridge.
|
|
14
|
+
|
|
15
|
+
Source of truth is ``docs/vex/statements/*.md``, one Markdown-with-frontmatter
|
|
16
|
+
file per VEX statement — the same convention ``scripts/build_roadmap.py`` uses
|
|
17
|
+
for ``docs/roadmap/items/*.md``, for the same reason: two loops adding two
|
|
18
|
+
different findings touch two different files and merge cleanly. Document-level
|
|
19
|
+
identity (author, version, timestamp) lives in the single shared
|
|
20
|
+
``docs/vex/meta.md``, edited by hand when a statement is added, changed, or
|
|
21
|
+
removed — bump ``version`` and ``timestamp`` together, the same way a package
|
|
22
|
+
changelog does. Nothing here reads the wall clock: the output is a pure
|
|
23
|
+
function of the committed files, so ``--check`` (and the test suite's
|
|
24
|
+
freshness test) can compare it byte-for-byte.
|
|
25
|
+
|
|
26
|
+
Statement frontmatter:
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
id: quality-trust-fingerprint-not-sensitive # must equal the filename
|
|
30
|
+
vulnerability: "codeql:py/clear-text-logging-sensitive-data"
|
|
31
|
+
status: not_affected # not_affected|affected|fixed|under_investigation
|
|
32
|
+
justification: vulnerable_code_not_present # required when status is not_affected
|
|
33
|
+
products: # optional; defaults to [DEFAULT_PRODUCT]
|
|
34
|
+
- pkg:pypi/boost-skill-cli
|
|
35
|
+
---
|
|
36
|
+
Free-text impact statement — why this finding does not affect boost. This
|
|
37
|
+
becomes the OpenVEX statement's `impact_statement` field.
|
|
38
|
+
|
|
39
|
+
Run: python3 scripts/build_vex.py # regenerate docs/vex/openvex.json
|
|
40
|
+
Verify: python3 scripts/build_vex.py --check # fail if it has drifted
|
|
41
|
+
"""
|
|
42
|
+
from __future__ import annotations
|
|
43
|
+
|
|
44
|
+
import argparse
|
|
45
|
+
import json
|
|
46
|
+
import sys
|
|
47
|
+
from pathlib import Path
|
|
48
|
+
|
|
49
|
+
ROOT = Path(__file__).resolve().parent.parent
|
|
50
|
+
# Reuse the repo's stdlib-only frontmatter parser (no new dependency), the same
|
|
51
|
+
# way scripts/build_roadmap.py does. Importable without an editable install.
|
|
52
|
+
sys.path.insert(0, str(ROOT))
|
|
53
|
+
from boost_cli.core import frontmatter # noqa: E402
|
|
54
|
+
|
|
55
|
+
VEX_DIR = ROOT / "docs" / "vex"
|
|
56
|
+
STATEMENTS_DIR = VEX_DIR / "statements"
|
|
57
|
+
META_FILE = VEX_DIR / "meta.md"
|
|
58
|
+
OUTPUT_FILE = VEX_DIR / "openvex.json"
|
|
59
|
+
|
|
60
|
+
CONTEXT = "https://openvex.dev/ns/v0.2.0"
|
|
61
|
+
# Same canonical Pages URL as Makefile's BOOST_SITE and
|
|
62
|
+
# scripts/post_deploy_smoke.py's DEFAULT_BASE — keep the three in sync.
|
|
63
|
+
SITE_BASE = "https://jonnyeclectic.github.io/boost/"
|
|
64
|
+
DOC_ID = SITE_BASE + "vex/openvex.json"
|
|
65
|
+
DEFAULT_PRODUCT = "pkg:pypi/boost-skill-cli"
|
|
66
|
+
|
|
67
|
+
VALID_STATUS = ("not_affected", "affected", "fixed", "under_investigation")
|
|
68
|
+
# The five OpenVEX justifications for a `not_affected` statement.
|
|
69
|
+
VALID_JUSTIFICATION = (
|
|
70
|
+
"component_not_present",
|
|
71
|
+
"vulnerable_code_not_present",
|
|
72
|
+
"vulnerable_code_not_in_execute_path",
|
|
73
|
+
"vulnerable_code_cannot_be_controlled_by_adversary",
|
|
74
|
+
"inline_mitigations_already_exist",
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class VexError(Exception):
|
|
79
|
+
"""A statement or the document metadata is malformed."""
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def load_meta() -> dict:
|
|
83
|
+
meta, _ = frontmatter.parse(META_FILE.read_text(encoding="utf-8"))
|
|
84
|
+
for field in ("author", "version", "timestamp"):
|
|
85
|
+
if not meta.get(field):
|
|
86
|
+
raise VexError("%s: missing %r" % (META_FILE.name, field))
|
|
87
|
+
return meta
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def load_statements() -> list[dict]:
|
|
91
|
+
"""Load and validate every statement, sorted by id for a stable order."""
|
|
92
|
+
statements = []
|
|
93
|
+
for path in sorted(STATEMENTS_DIR.glob("*.md")):
|
|
94
|
+
meta, body = frontmatter.parse(path.read_text(encoding="utf-8"))
|
|
95
|
+
meta["_file"] = path.name
|
|
96
|
+
meta["_body"] = body.strip()
|
|
97
|
+
if not meta.get("id"):
|
|
98
|
+
raise VexError("%s: missing 'id'" % path.name)
|
|
99
|
+
if meta["id"] != path.stem:
|
|
100
|
+
raise VexError(
|
|
101
|
+
"%s: id %r does not match filename" % (path.name, meta["id"]))
|
|
102
|
+
if not meta.get("vulnerability"):
|
|
103
|
+
raise VexError("%s: missing 'vulnerability'" % path.name)
|
|
104
|
+
status = meta.get("status")
|
|
105
|
+
if status not in VALID_STATUS:
|
|
106
|
+
raise VexError("%s: bad status %r" % (path.name, status))
|
|
107
|
+
justification = meta.get("justification")
|
|
108
|
+
if status == "not_affected" and justification not in VALID_JUSTIFICATION:
|
|
109
|
+
raise VexError(
|
|
110
|
+
"%s: status 'not_affected' requires a valid 'justification' "
|
|
111
|
+
"(one of %s)" % (path.name, ", ".join(VALID_JUSTIFICATION)))
|
|
112
|
+
if not meta["_body"]:
|
|
113
|
+
raise VexError(
|
|
114
|
+
"%s: empty impact statement — the body is what makes this "
|
|
115
|
+
"finding reviewable, not just machine-readable" % path.name)
|
|
116
|
+
statements.append(meta)
|
|
117
|
+
statements.sort(key=lambda m: str(m["id"]))
|
|
118
|
+
return statements
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def render_statement(meta: dict) -> dict:
|
|
122
|
+
products = meta.get("products") or [DEFAULT_PRODUCT]
|
|
123
|
+
stmt = {
|
|
124
|
+
"vulnerability": {"name": meta["vulnerability"]},
|
|
125
|
+
"products": [{"@id": p} for p in products],
|
|
126
|
+
"status": meta["status"],
|
|
127
|
+
}
|
|
128
|
+
if meta.get("justification"):
|
|
129
|
+
stmt["justification"] = meta["justification"]
|
|
130
|
+
stmt["impact_statement"] = meta["_body"]
|
|
131
|
+
return stmt
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def build() -> str:
|
|
135
|
+
meta = load_meta()
|
|
136
|
+
statements = [render_statement(s) for s in load_statements()]
|
|
137
|
+
doc = {
|
|
138
|
+
"@context": CONTEXT,
|
|
139
|
+
"@id": DOC_ID,
|
|
140
|
+
"author": meta["author"],
|
|
141
|
+
"timestamp": meta["timestamp"],
|
|
142
|
+
"version": int(meta["version"]),
|
|
143
|
+
"statements": statements,
|
|
144
|
+
}
|
|
145
|
+
return json.dumps(doc, indent=2, ensure_ascii=False) + "\n"
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def main(argv: list[str] | None = None) -> int:
|
|
149
|
+
parser = argparse.ArgumentParser(
|
|
150
|
+
description="Regenerate docs/vex/openvex.json from docs/vex/statements/*.md.")
|
|
151
|
+
parser.add_argument(
|
|
152
|
+
"--check", action="store_true",
|
|
153
|
+
help="verify the committed document matches a fresh render; exit 1 on drift.")
|
|
154
|
+
args = parser.parse_args(argv)
|
|
155
|
+
|
|
156
|
+
fresh = build()
|
|
157
|
+
if args.check:
|
|
158
|
+
committed = OUTPUT_FILE.read_text(encoding="utf-8") if OUTPUT_FILE.exists() else None
|
|
159
|
+
if committed != fresh:
|
|
160
|
+
print("ERROR: docs/vex/openvex.json is stale — regenerate with\n"
|
|
161
|
+
" python3 scripts/build_vex.py\n"
|
|
162
|
+
"and commit the result (see CONTRIBUTING.md).", file=sys.stderr)
|
|
163
|
+
print("::error::VEX document is stale — run "
|
|
164
|
+
"`python3 scripts/build_vex.py` and commit", file=sys.stderr)
|
|
165
|
+
return 1
|
|
166
|
+
print("docs/vex/openvex.json is up to date.")
|
|
167
|
+
return 0
|
|
168
|
+
|
|
169
|
+
OUTPUT_FILE.write_text(fresh, encoding="utf-8")
|
|
170
|
+
print("wrote %s" % OUTPUT_FILE)
|
|
171
|
+
return 0
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
if __name__ == "__main__":
|
|
175
|
+
raise SystemExit(main())
|