boost-skill-cli 1.0.262__tar.gz → 1.0.264__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/build_roadmap.py +51 -9
- boost_skill_cli-1.0.264/tests/unit/test_roadmap_fresh.py +151 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_toolchain_lock.py +61 -1
- boost_skill_cli-1.0.262/tests/unit/test_roadmap_fresh.py +0 -86
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/.gitattributes +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/.gitignore +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/.vale.ini +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/LICENSE +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/Makefile +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/README.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/codecov.yml +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/index.html +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/docs/roadmap.html +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/examples/README.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/index.html +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/noxfile.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/setup.cfg +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/style/README.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/style/boost.css +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/style/boost.js +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/style/demo.html +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.262 → boost_skill_cli-1.0.264}/tests/visual/visual_check.mjs +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.264'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 264)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -265,6 +265,40 @@ def build_design() -> tuple[Path, str]:
|
|
|
265
265
|
return DESIGN_HTML, html
|
|
266
266
|
|
|
267
267
|
|
|
268
|
+
_CARD_ID = re.compile(r'<article class="(?:cap rcard|ritem)" id="([^"]+)"')
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
def diagnose(path, committed: str, fresh: str) -> list[str]:
|
|
272
|
+
"""Explain *why* a board drifted, in the terms the reader needs.
|
|
273
|
+
|
|
274
|
+
The common cause is not a hand-edit. It is a rebase: another PR's card
|
|
275
|
+
merges in as a clean new ``docs/roadmap/items/*.md``, git merges the
|
|
276
|
+
generated HTML textually and succeeds, and the board is silently missing
|
|
277
|
+
that card. The old message said only "out of date", so a PR that changed no
|
|
278
|
+
Python at all went red across lint and every test leg with nothing in the
|
|
279
|
+
log pointing at the actual cause.
|
|
280
|
+
"""
|
|
281
|
+
was = _CARD_ID.findall(committed)
|
|
282
|
+
now = _CARD_ID.findall(fresh)
|
|
283
|
+
missing = [i for i in now if i not in set(was)]
|
|
284
|
+
extra = [i for i in was if i not in set(now)]
|
|
285
|
+
lines = []
|
|
286
|
+
if missing:
|
|
287
|
+
lines.append(" missing %d card(s) present in docs/roadmap/items/: %s"
|
|
288
|
+
% (len(missing), ", ".join(missing[:8])
|
|
289
|
+
+ (" …" if len(missing) > 8 else "")))
|
|
290
|
+
lines.append(" ↳ almost always a rebase: someone else's card landed on "
|
|
291
|
+
"main and the generated HTML merged textually.")
|
|
292
|
+
if extra:
|
|
293
|
+
lines.append(" %d card(s) in the HTML have no item file: %s"
|
|
294
|
+
% (len(extra), ", ".join(extra[:8])
|
|
295
|
+
+ (" …" if len(extra) > 8 else "")))
|
|
296
|
+
if not missing and not extra:
|
|
297
|
+
lines.append(" the same cards, rendered differently — an item file's "
|
|
298
|
+
"fields or body changed, or the generator did.")
|
|
299
|
+
return lines
|
|
300
|
+
|
|
301
|
+
|
|
268
302
|
def main(argv: list[str] | None = None) -> int:
|
|
269
303
|
parser = argparse.ArgumentParser(description="Regenerate the roadmap boards.")
|
|
270
304
|
parser.add_argument(
|
|
@@ -277,21 +311,29 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
277
311
|
drift = []
|
|
278
312
|
for path, fresh in targets:
|
|
279
313
|
if args.check:
|
|
280
|
-
|
|
281
|
-
|
|
314
|
+
committed = path.read_text(encoding="utf-8")
|
|
315
|
+
if committed != fresh:
|
|
316
|
+
drift.append((path, committed, fresh))
|
|
282
317
|
else:
|
|
283
318
|
path.write_text(fresh, encoding="utf-8")
|
|
284
319
|
print("wrote %s" % path)
|
|
285
320
|
|
|
286
321
|
if args.check:
|
|
287
322
|
if drift:
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
323
|
+
report = ["ERROR: the roadmap board is stale — regenerate with",
|
|
324
|
+
" python3 scripts/build_roadmap.py",
|
|
325
|
+
"and commit the result (see CONTRIBUTING.md).",
|
|
326
|
+
""]
|
|
327
|
+
for path, committed, fresh in drift:
|
|
328
|
+
report.append("%s" % path)
|
|
329
|
+
report.extend(diagnose(path, committed, fresh))
|
|
330
|
+
print("\n".join(report), file=sys.stderr)
|
|
331
|
+
# One annotation so the cause is visible on the checks tab without
|
|
332
|
+
# opening a log: this failure lands on every matrix leg at once and
|
|
333
|
+
# reads as a broken build rather than a stale generated file.
|
|
334
|
+
print("::error::roadmap board is stale — run "
|
|
335
|
+
"`python3 scripts/build_roadmap.py` and commit "
|
|
336
|
+
"(usually needed after a rebase)")
|
|
295
337
|
return 1
|
|
296
338
|
print("roadmap boards are up to date.")
|
|
297
339
|
return 0
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"""Committed roadmap HTML stays in lockstep with its item source files.
|
|
2
|
+
|
|
3
|
+
The roadmap boards are generated from ``docs/roadmap/items/*.md`` by
|
|
4
|
+
``scripts/build_roadmap.py`` and injected into the marker regions of the
|
|
5
|
+
hand-authored pages. This test — the in-suite twin of the
|
|
6
|
+
``build_roadmap.py --check`` CI step — fails if the committed HTML drifts from a
|
|
7
|
+
fresh render, so a stale board can't merge.
|
|
8
|
+
|
|
9
|
+
Skips when the repo-root files aren't reachable (e.g. the mutation sandbox,
|
|
10
|
+
which only copies ``boost_cli/``).
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import importlib.util
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
import pytest
|
|
18
|
+
|
|
19
|
+
_ROOT = Path(__file__).resolve().parents[2]
|
|
20
|
+
_SCRIPT = _ROOT / "scripts" / "build_roadmap.py"
|
|
21
|
+
_ITEMS = _ROOT / "docs" / "roadmap" / "items"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _load_builder():
|
|
25
|
+
spec = importlib.util.spec_from_file_location("build_roadmap", _SCRIPT)
|
|
26
|
+
assert spec and spec.loader
|
|
27
|
+
module = importlib.util.module_from_spec(spec)
|
|
28
|
+
spec.loader.exec_module(module)
|
|
29
|
+
return module
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@pytest.mark.skipif(not (_SCRIPT.exists() and _ITEMS.exists()),
|
|
33
|
+
reason="repo-root files not reachable (e.g. mutation sandbox)")
|
|
34
|
+
def test_roadmap_html_is_regenerated():
|
|
35
|
+
builder = _load_builder()
|
|
36
|
+
path, fresh = builder.build_code()
|
|
37
|
+
committed = path.read_text(encoding="utf-8")
|
|
38
|
+
# Reuse the script's own diagnosis rather than restating "out of date".
|
|
39
|
+
# This assertion fires on all nine test legs at once, so what it says is
|
|
40
|
+
# what nine failures say — and the cause is a rebase far more often than a
|
|
41
|
+
# hand-edit.
|
|
42
|
+
assert committed == fresh, "\n".join(
|
|
43
|
+
["docs/roadmap.html is stale — regenerate with",
|
|
44
|
+
" python3 scripts/build_roadmap.py",
|
|
45
|
+
"and commit the result (see CONTRIBUTING.md).",
|
|
46
|
+
*builder.diagnose(path, committed, fresh)])
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@pytest.mark.skipif(not (_SCRIPT.exists() and _ITEMS.exists()),
|
|
50
|
+
reason="repo-root files not reachable (e.g. mutation sandbox)")
|
|
51
|
+
def test_design_roadmap_html_is_regenerated():
|
|
52
|
+
builder = _load_builder()
|
|
53
|
+
path, fresh = builder.build_design()
|
|
54
|
+
committed = path.read_text(encoding="utf-8")
|
|
55
|
+
assert committed == fresh, "\n".join(
|
|
56
|
+
["docs/design-roadmap.html is stale — regenerate with",
|
|
57
|
+
" python3 scripts/build_roadmap.py",
|
|
58
|
+
"and commit the result (see CONTRIBUTING.md).",
|
|
59
|
+
*builder.diagnose(path, committed, fresh)])
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@pytest.mark.skipif(not (_SCRIPT.exists() and _ITEMS.exists()),
|
|
63
|
+
reason="repo-root files not reachable (e.g. mutation sandbox)")
|
|
64
|
+
def test_check_flag_passes_on_fresh_tree():
|
|
65
|
+
builder = _load_builder()
|
|
66
|
+
assert builder.main(["--check"]) == 0
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@pytest.mark.skipif(not (_SCRIPT.exists() and _ITEMS.exists()),
|
|
70
|
+
reason="repo-root files not reachable (e.g. mutation sandbox)")
|
|
71
|
+
def test_every_code_item_has_required_fields():
|
|
72
|
+
builder = _load_builder()
|
|
73
|
+
for item in builder.load_items("code"):
|
|
74
|
+
for field in ("id", "section", "status", "title"):
|
|
75
|
+
assert item.get(field), "%s: missing %r" % (item["_file"], field)
|
|
76
|
+
assert item["status"] in builder.STATUS_LABEL, (
|
|
77
|
+
"%s: bad status %r" % (item["_file"], item["status"]))
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@pytest.mark.skipif(not (_SCRIPT.exists() and _ITEMS.exists()),
|
|
81
|
+
reason="repo-root files not reachable (e.g. mutation sandbox)")
|
|
82
|
+
def test_every_design_item_has_required_fields():
|
|
83
|
+
builder = _load_builder()
|
|
84
|
+
for item in builder.load_items("design"):
|
|
85
|
+
for field in ("id", "track", "status", "title"):
|
|
86
|
+
assert item.get(field), "%s: missing %r" % (item["_file"], field)
|
|
87
|
+
assert item["status"] in builder.DESIGN_STATUS, (
|
|
88
|
+
"%s: bad status %r" % (item["_file"], item["status"]))
|
|
89
|
+
assert str(item.get("impact", "")).lower() in builder.IMPACT_LABEL, (
|
|
90
|
+
"%s: bad impact %r" % (item["_file"], item.get("impact")))
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# ── the diagnosis itself ─────────────────────────────────────────────────────
|
|
94
|
+
#
|
|
95
|
+
# The failure above lands on lint and on all nine test legs simultaneously, for
|
|
96
|
+
# a PR that may have changed no Python at all. Whether it reads as "the build is
|
|
97
|
+
# broken" or as "regenerate the board after your rebase" is entirely down to
|
|
98
|
+
# what these strings say, so they are tested rather than trusted.
|
|
99
|
+
|
|
100
|
+
CARD = '<article class="cap rcard" id="%s">body</article>'
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
@pytest.mark.skipif(not _SCRIPT.exists(), reason="repo-root files not reachable")
|
|
104
|
+
class TestDiagnose:
|
|
105
|
+
def _lines(self, committed, fresh):
|
|
106
|
+
return _load_builder().diagnose(Path("docs/roadmap.html"),
|
|
107
|
+
committed, fresh)
|
|
108
|
+
|
|
109
|
+
def test_a_card_missing_from_the_html_names_it_and_blames_the_rebase(self):
|
|
110
|
+
# THE case this exists for: another PR's item file merged in cleanly,
|
|
111
|
+
# the generated HTML merged textually, and the card is simply absent.
|
|
112
|
+
lines = self._lines(CARD % "old-one",
|
|
113
|
+
(CARD % "old-one") + (CARD % "someone-elses-card"))
|
|
114
|
+
text = "\n".join(lines)
|
|
115
|
+
assert "someone-elses-card" in text
|
|
116
|
+
assert "rebase" in text
|
|
117
|
+
assert "missing 1 card" in text
|
|
118
|
+
|
|
119
|
+
def test_several_missing_cards_are_summarised_not_dumped(self):
|
|
120
|
+
fresh = "".join(CARD % ("card-%d" % i) for i in range(20))
|
|
121
|
+
text = "\n".join(self._lines("", fresh))
|
|
122
|
+
assert "missing 20 card(s)" in text
|
|
123
|
+
assert text.count("card-") <= 9, "8 named plus the ellipsis"
|
|
124
|
+
assert "…" in text
|
|
125
|
+
|
|
126
|
+
def test_a_card_with_no_item_file_is_called_out_separately(self):
|
|
127
|
+
lines = self._lines(CARD % "deleted-item", "")
|
|
128
|
+
text = "\n".join(lines)
|
|
129
|
+
assert "no item file" in text
|
|
130
|
+
assert "deleted-item" in text
|
|
131
|
+
assert "rebase" not in text, "nothing is missing — different cause"
|
|
132
|
+
|
|
133
|
+
def test_same_cards_rendered_differently_says_so(self):
|
|
134
|
+
# A field or body edit, or a generator change — not a rebase.
|
|
135
|
+
lines = self._lines('<article class="cap rcard" id="a">old</article>',
|
|
136
|
+
'<article class="cap rcard" id="a">new</article>')
|
|
137
|
+
text = "\n".join(lines)
|
|
138
|
+
assert "rendered differently" in text
|
|
139
|
+
assert "missing" not in text
|
|
140
|
+
|
|
141
|
+
def test_the_design_board_shape_is_recognised_too(self):
|
|
142
|
+
# design-roadmap.html uses <article class="ritem" …>, not "cap rcard".
|
|
143
|
+
fresh = ('<article class="ritem" id="BOOST-D99" data-track="x" '
|
|
144
|
+
'data-impact="y">body</article>')
|
|
145
|
+
assert "BOOST-D99" in "\n".join(self._lines("", fresh))
|
|
146
|
+
|
|
147
|
+
def test_it_never_returns_nothing(self):
|
|
148
|
+
# An empty diagnosis would leave the assertion message ending on a
|
|
149
|
+
# colon with no explanation — worse than the message it replaced.
|
|
150
|
+
for committed, fresh in (("", ""), ("x", "y"), (CARD % "a", CARD % "a")):
|
|
151
|
+
assert self._lines(committed, fresh)
|
|
@@ -21,7 +21,12 @@ REQS = ROOT / "requirements"
|
|
|
21
21
|
GROUPS = ("lint-tools", "test-tools", "mutation-tools", "coverage-tools",
|
|
22
22
|
"release-tools")
|
|
23
23
|
|
|
24
|
+
# The extras group is not optional decoration: without it, `coverage[toml]==7.15.2`
|
|
25
|
+
# matches `name=coverage`, then `spec` fails because the next character is `[`,
|
|
26
|
+
# and the pin invariant below reports a perfectly pinned line as unpinned.
|
|
27
|
+
# uv and pip-tools emit `name[extra]==version` routinely.
|
|
24
28
|
_REQ = re.compile(r"^(?P<name>[A-Za-z0-9][A-Za-z0-9._-]*)"
|
|
29
|
+
r"(?P<extras>\[[^\]]+\])?"
|
|
25
30
|
r"(?P<spec>==[^\s;\\]+)?(?P<rest>.*)$")
|
|
26
31
|
|
|
27
32
|
|
|
@@ -91,7 +96,8 @@ class TestLockInvariants:
|
|
|
91
96
|
m = _REQ.match(line.strip())
|
|
92
97
|
assert m, "unparseable requirement in %s: %r" % (stem, line)
|
|
93
98
|
assert m.group("spec"), \
|
|
94
|
-
"%s is not pinned with == in %s" % (
|
|
99
|
+
"%s is not pinned with == in %s: %r" % (
|
|
100
|
+
m.group("name"), stem, line)
|
|
95
101
|
|
|
96
102
|
def test_every_pin_carries_hashes(self):
|
|
97
103
|
# This is the whole point: pip implies --require-hashes when any hash is
|
|
@@ -124,6 +130,60 @@ class TestLockInvariants:
|
|
|
124
130
|
assert str(ROOT) not in text, stem
|
|
125
131
|
|
|
126
132
|
|
|
133
|
+
class TestRequirementPattern:
|
|
134
|
+
"""The pattern itself, against literal lines.
|
|
135
|
+
|
|
136
|
+
Everything else in this file runs `_REQ` over whatever `requirements/*.txt`
|
|
137
|
+
happens to contain today, so a form the lock does not currently use is a
|
|
138
|
+
form the pattern is never tested against. That is exactly how the extras
|
|
139
|
+
case got here: nothing in the lock carries an extra, so `coverage[toml]==…`
|
|
140
|
+
reading as *unpinned* stayed invisible until a Dependabot PR regenerated
|
|
141
|
+
the lock and the gate rejected a valid pin with a message naming the wrong
|
|
142
|
+
problem.
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
@staticmethod
|
|
146
|
+
def _parsed(line):
|
|
147
|
+
m = _REQ.match(line)
|
|
148
|
+
assert m, "unparseable: %r" % line
|
|
149
|
+
return m
|
|
150
|
+
|
|
151
|
+
def test_a_plain_pin(self):
|
|
152
|
+
m = self._parsed("hypothesis==6.140.3")
|
|
153
|
+
assert m.group("name") == "hypothesis"
|
|
154
|
+
assert m.group("extras") is None
|
|
155
|
+
assert m.group("spec") == "==6.140.3"
|
|
156
|
+
|
|
157
|
+
def test_a_pin_carrying_an_extra(self):
|
|
158
|
+
# THE BUG: this used to come back with spec=None.
|
|
159
|
+
m = self._parsed("coverage[toml]==7.15.2")
|
|
160
|
+
assert m.group("name") == "coverage"
|
|
161
|
+
assert m.group("extras") == "[toml]"
|
|
162
|
+
assert m.group("spec") == "==7.15.2"
|
|
163
|
+
|
|
164
|
+
def test_a_pin_carrying_several_extras(self):
|
|
165
|
+
m = self._parsed("ruff[all,dev]==0.16.0")
|
|
166
|
+
assert m.group("extras") == "[all,dev]"
|
|
167
|
+
assert m.group("spec") == "==0.16.0"
|
|
168
|
+
|
|
169
|
+
def test_a_pin_with_an_environment_marker(self):
|
|
170
|
+
m = self._parsed("coverage[toml]==7.10.7 ; python_full_version < '3.10'")
|
|
171
|
+
assert m.group("name") == "coverage"
|
|
172
|
+
assert m.group("spec") == "==7.10.7", "the marker must not eat the pin"
|
|
173
|
+
|
|
174
|
+
def test_names_with_dots_dashes_and_digits(self):
|
|
175
|
+
for line, name in (("zope.interface==7.0", "zope.interface"),
|
|
176
|
+
("ruff-lsp==0.1", "ruff-lsp"),
|
|
177
|
+
("s3transfer==0.10", "s3transfer")):
|
|
178
|
+
assert self._parsed(line).group("name") == name
|
|
179
|
+
|
|
180
|
+
def test_an_unpinned_requirement_still_reports_unpinned(self):
|
|
181
|
+
# The fix must not make everything look pinned.
|
|
182
|
+
for line in ("hypothesis", "hypothesis>=6", "coverage[toml]>=7.15",
|
|
183
|
+
"coverage[toml]~=7.15"):
|
|
184
|
+
assert self._parsed(line).group("spec") is None, line
|
|
185
|
+
|
|
186
|
+
|
|
127
187
|
class TestEvalExtraStaysOut:
|
|
128
188
|
def test_langchain_stack_is_not_locked(self):
|
|
129
189
|
# The [eval] extra deliberately pins the old langchain 0.3 stack (ragas
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
"""Committed roadmap HTML stays in lockstep with its item source files.
|
|
2
|
-
|
|
3
|
-
The roadmap boards are generated from ``docs/roadmap/items/*.md`` by
|
|
4
|
-
``scripts/build_roadmap.py`` and injected into the marker regions of the
|
|
5
|
-
hand-authored pages. This test — the in-suite twin of the
|
|
6
|
-
``build_roadmap.py --check`` CI step — fails if the committed HTML drifts from a
|
|
7
|
-
fresh render, so a stale board can't merge.
|
|
8
|
-
|
|
9
|
-
Skips when the repo-root files aren't reachable (e.g. the mutation sandbox,
|
|
10
|
-
which only copies ``boost_cli/``).
|
|
11
|
-
"""
|
|
12
|
-
from __future__ import annotations
|
|
13
|
-
|
|
14
|
-
import importlib.util
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
|
|
17
|
-
import pytest
|
|
18
|
-
|
|
19
|
-
_ROOT = Path(__file__).resolve().parents[2]
|
|
20
|
-
_SCRIPT = _ROOT / "scripts" / "build_roadmap.py"
|
|
21
|
-
_ITEMS = _ROOT / "docs" / "roadmap" / "items"
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def _load_builder():
|
|
25
|
-
spec = importlib.util.spec_from_file_location("build_roadmap", _SCRIPT)
|
|
26
|
-
assert spec and spec.loader
|
|
27
|
-
module = importlib.util.module_from_spec(spec)
|
|
28
|
-
spec.loader.exec_module(module)
|
|
29
|
-
return module
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
@pytest.mark.skipif(not (_SCRIPT.exists() and _ITEMS.exists()),
|
|
33
|
-
reason="repo-root files not reachable (e.g. mutation sandbox)")
|
|
34
|
-
def test_roadmap_html_is_regenerated():
|
|
35
|
-
builder = _load_builder()
|
|
36
|
-
path, fresh = builder.build_code()
|
|
37
|
-
committed = path.read_text(encoding="utf-8")
|
|
38
|
-
assert committed == fresh, (
|
|
39
|
-
"docs/roadmap.html is out of date — regenerate with\n"
|
|
40
|
-
" python3 scripts/build_roadmap.py\n"
|
|
41
|
-
"and commit the result (see CONTRIBUTING.md)."
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
@pytest.mark.skipif(not (_SCRIPT.exists() and _ITEMS.exists()),
|
|
46
|
-
reason="repo-root files not reachable (e.g. mutation sandbox)")
|
|
47
|
-
def test_design_roadmap_html_is_regenerated():
|
|
48
|
-
builder = _load_builder()
|
|
49
|
-
path, fresh = builder.build_design()
|
|
50
|
-
committed = path.read_text(encoding="utf-8")
|
|
51
|
-
assert committed == fresh, (
|
|
52
|
-
"docs/design-roadmap.html is out of date — regenerate with\n"
|
|
53
|
-
" python3 scripts/build_roadmap.py\n"
|
|
54
|
-
"and commit the result (see CONTRIBUTING.md)."
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
@pytest.mark.skipif(not (_SCRIPT.exists() and _ITEMS.exists()),
|
|
59
|
-
reason="repo-root files not reachable (e.g. mutation sandbox)")
|
|
60
|
-
def test_check_flag_passes_on_fresh_tree():
|
|
61
|
-
builder = _load_builder()
|
|
62
|
-
assert builder.main(["--check"]) == 0
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
@pytest.mark.skipif(not (_SCRIPT.exists() and _ITEMS.exists()),
|
|
66
|
-
reason="repo-root files not reachable (e.g. mutation sandbox)")
|
|
67
|
-
def test_every_code_item_has_required_fields():
|
|
68
|
-
builder = _load_builder()
|
|
69
|
-
for item in builder.load_items("code"):
|
|
70
|
-
for field in ("id", "section", "status", "title"):
|
|
71
|
-
assert item.get(field), "%s: missing %r" % (item["_file"], field)
|
|
72
|
-
assert item["status"] in builder.STATUS_LABEL, (
|
|
73
|
-
"%s: bad status %r" % (item["_file"], item["status"]))
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
@pytest.mark.skipif(not (_SCRIPT.exists() and _ITEMS.exists()),
|
|
77
|
-
reason="repo-root files not reachable (e.g. mutation sandbox)")
|
|
78
|
-
def test_every_design_item_has_required_fields():
|
|
79
|
-
builder = _load_builder()
|
|
80
|
-
for item in builder.load_items("design"):
|
|
81
|
-
for field in ("id", "track", "status", "title"):
|
|
82
|
-
assert item.get(field), "%s: missing %r" % (item["_file"], field)
|
|
83
|
-
assert item["status"] in builder.DESIGN_STATUS, (
|
|
84
|
-
"%s: bad status %r" % (item["_file"], item["status"]))
|
|
85
|
-
assert str(item.get("impact", "")).lower() in builder.IMPACT_LABEL, (
|
|
86
|
-
"%s: bad impact %r" % (item["_file"], item.get("impact")))
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|