boost-skill-cli 1.0.441__tar.gz → 1.0.443__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.441/boost_skill_cli.egg-info → boost_skill_cli-1.0.443}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
- boost_skill_cli-1.0.443/docs/demo.gif +0 -0
- boost_skill_cli-1.0.443/docs/roadmap/items/eval-stats-could-never-publish.md +45 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap.html +43 -1
- boost_skill_cli-1.0.443/tests/unit/test_publish_golden_dataset.py +226 -0
- boost_skill_cli-1.0.443/tests/unit/test_workflow_push_has_credentials.py +100 -0
- boost_skill_cli-1.0.441/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/.gitattributes +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/.gitignore +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/.vale.ini +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/LICENSE +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/Makefile +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/README.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/codecov.yml +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/chat.html +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/demo.html +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/index.html +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/langchain.html +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/evals/README.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/examples/README.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/index.html +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/noxfile.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/setup.cfg +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/style/README.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/style/boost.css +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/style/boost.js +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/style/demo.html +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.441 → boost_skill_cli-1.0.443}/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.443'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 443)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -241,6 +241,7 @@ docs/roadmap/items/eval-corpus-is-one-strangers-repo.md
|
|
|
241
241
|
docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md
|
|
242
242
|
docs/roadmap/items/eval-corpus-was-not-actually-pinned.md
|
|
243
243
|
docs/roadmap/items/eval-deduped-ranked-lists-by-name.md
|
|
244
|
+
docs/roadmap/items/eval-stats-could-never-publish.md
|
|
244
245
|
docs/roadmap/items/expanded-card-bodies-overflow.md
|
|
245
246
|
docs/roadmap/items/extension-free-tests-core-dense-py.md
|
|
246
247
|
docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md
|
|
@@ -640,6 +641,7 @@ tests/unit/test_post_deploy_smoke.py
|
|
|
640
641
|
tests/unit/test_project_mcp_sidecar.py
|
|
641
642
|
tests/unit/test_projectlock.py
|
|
642
643
|
tests/unit/test_provenance.py
|
|
644
|
+
tests/unit/test_publish_golden_dataset.py
|
|
643
645
|
tests/unit/test_rag.py
|
|
644
646
|
tests/unit/test_rag_fusion.py
|
|
645
647
|
tests/unit/test_registries_fresh.py
|
|
@@ -670,6 +672,7 @@ tests/unit/test_util.py
|
|
|
670
672
|
tests/unit/test_version.py
|
|
671
673
|
tests/unit/test_workflow_concurrency.py
|
|
672
674
|
tests/unit/test_workflow_concurrency_groups.py
|
|
675
|
+
tests/unit/test_workflow_push_has_credentials.py
|
|
673
676
|
tests/unit/test_workflow_timeouts.py
|
|
674
677
|
tests/unit/test_workflows.py
|
|
675
678
|
tests/visual/a11y_check.mjs
|
|
Binary file
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: eval-stats-could-never-publish
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Build · Bug
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 4
|
|
10
|
+
note: the published-metrics file has ONE commit in its whole history — the one that created it
|
|
11
|
+
order: 109
|
|
12
|
+
owner: fix/eval-stats-push-auth
|
|
13
|
+
pr:
|
|
14
|
+
title: The published metrics could never be published
|
|
15
|
+
---
|
|
16
|
+
<code>eval-stats.yml</code> regenerates <code>docs/eval-latest.json</code> — the payload the docs site
|
|
17
|
+
reads — commits it, and pushes to <code>main</code> on a schedule. The proof that it never landed is
|
|
18
|
+
in the file's own history: <b>one commit, ever</b>, the one that created it in
|
|
19
|
+
<code>#421</code>.
|
|
20
|
+
|
|
21
|
+
<b>The cause is a pair of individually-correct lines.</b> The checkout sets
|
|
22
|
+
<code>persist-credentials: false</code>, which is right and is what zizmor's
|
|
23
|
+
<code>artipacked</code> rule asks for. Ninety lines later the job runs
|
|
24
|
+
<code>git push origin HEAD:main</code>. With no persisted credentials the remote carries no auth, so
|
|
25
|
+
that push cannot work — and nothing in either line looks wrong on its own. The defect only exists
|
|
26
|
+
in the distance between them.
|
|
27
|
+
|
|
28
|
+
<b>It reported success while doing nothing, which is why it survived.</b> The step exits 0 early
|
|
29
|
+
when there is nothing to commit, so a run that found no metric drift and a run that could not
|
|
30
|
+
publish are the same green tick. Of the two scheduled runs, one passed that way and one failed —
|
|
31
|
+
and the failure was invisible for the same reason <code>fuzz</code> and <code>shards</code> were:
|
|
32
|
+
until <code>#508</code>, <code>ci-failure-issue.yml</code> watched 2 of 26 workflows, and a cron
|
|
33
|
+
job's failure is a red square on a page nobody opens.
|
|
34
|
+
|
|
35
|
+
<b>The fix was already in the repo.</b> <code>ci.yml</code> pushes its badges branch to an explicit
|
|
36
|
+
<code>x-access-token</code> URL — keeping the safe checkout default <i>and</i> being able to push.
|
|
37
|
+
The same three lines applied here. Nothing about the problem was novel; what was missing was anything
|
|
38
|
+
that compared the two workflows.
|
|
39
|
+
|
|
40
|
+
So the guard does that comparison. <code>tests/unit/test_workflow_push_has_credentials.py</code>
|
|
41
|
+
fails the build when a workflow checks out without persisting credentials and then pushes without
|
|
42
|
+
supplying any. It folds shell line-continuations before matching, because a push carrying a token in
|
|
43
|
+
its URL is long enough to wrap — matching per physical line would have failed the correct fix and
|
|
44
|
+
passed the broken one, which is the failure mode a guard can least afford. Both directions were
|
|
45
|
+
verified: green on the fix, and red again when the bare push is restored.
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
<div class="stat"><b>16</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>240</b><span>Loop finds</span></div>
|
|
137
137
|
<!-- /ROADMAP:stats -->
|
|
138
138
|
</div>
|
|
139
139
|
</section>
|
|
@@ -6111,6 +6111,48 @@ vacuously if the trigger detection silently stops matching.</p></details>
|
|
|
6111
6111
|
<span class="m">two PRs deadlocked each other for hours — re-running the job just moved the cancellation to the other one</span>
|
|
6112
6112
|
</div>
|
|
6113
6113
|
</article>
|
|
6114
|
+
|
|
6115
|
+
<article class="cap rcard" id="eval-stats-could-never-publish">
|
|
6116
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Build · Bug</span></div>
|
|
6117
|
+
<h3>The published metrics could never be published</h3>
|
|
6118
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
6119
|
+
<p><code>eval-stats.yml</code> regenerates <code>docs/eval-latest.json</code> — the payload the docs site
|
|
6120
|
+
reads — commits it, and pushes to <code>main</code> on a schedule. The proof that it never landed is
|
|
6121
|
+
in the file's own history: <b>one commit, ever</b>, the one that created it in
|
|
6122
|
+
<code>#421</code>.
|
|
6123
|
+
|
|
6124
|
+
<b>The cause is a pair of individually-correct lines.</b> The checkout sets
|
|
6125
|
+
<code>persist-credentials: false</code>, which is right and is what zizmor's
|
|
6126
|
+
<code>artipacked</code> rule asks for. Ninety lines later the job runs
|
|
6127
|
+
<code>git push origin HEAD:main</code>. With no persisted credentials the remote carries no auth, so
|
|
6128
|
+
that push cannot work — and nothing in either line looks wrong on its own. The defect only exists
|
|
6129
|
+
in the distance between them.
|
|
6130
|
+
|
|
6131
|
+
<b>It reported success while doing nothing, which is why it survived.</b> The step exits 0 early
|
|
6132
|
+
when there is nothing to commit, so a run that found no metric drift and a run that could not
|
|
6133
|
+
publish are the same green tick. Of the two scheduled runs, one passed that way and one failed —
|
|
6134
|
+
and the failure was invisible for the same reason <code>fuzz</code> and <code>shards</code> were:
|
|
6135
|
+
until <code>#508</code>, <code>ci-failure-issue.yml</code> watched 2 of 26 workflows, and a cron
|
|
6136
|
+
job's failure is a red square on a page nobody opens.
|
|
6137
|
+
|
|
6138
|
+
<b>The fix was already in the repo.</b> <code>ci.yml</code> pushes its badges branch to an explicit
|
|
6139
|
+
<code>x-access-token</code> URL — keeping the safe checkout default <i>and</i> being able to push.
|
|
6140
|
+
The same three lines applied here. Nothing about the problem was novel; what was missing was anything
|
|
6141
|
+
that compared the two workflows.
|
|
6142
|
+
|
|
6143
|
+
So the guard does that comparison. <code>tests/unit/test_workflow_push_has_credentials.py</code>
|
|
6144
|
+
fails the build when a workflow checks out without persisting credentials and then pushes without
|
|
6145
|
+
supplying any. It folds shell line-continuations before matching, because a push carrying a token in
|
|
6146
|
+
its URL is long enough to wrap — matching per physical line would have failed the correct fix and
|
|
6147
|
+
passed the broken one, which is the failure mode a guard can least afford. Both directions were
|
|
6148
|
+
verified: green on the fix, and red again when the bare push is restored.</p></details>
|
|
6149
|
+
<div class="meta">
|
|
6150
|
+
<span class="m">Complexity <b>S</b></span>
|
|
6151
|
+
<span class="m">Impact <b>Med</b></span>
|
|
6152
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
6153
|
+
<span class="m">the published-metrics file has ONE commit in its whole history — the one that created it</span>
|
|
6154
|
+
</div>
|
|
6155
|
+
</article>
|
|
6114
6156
|
<!-- /ROADMAP:cards -->
|
|
6115
6157
|
|
|
6116
6158
|
</div>
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"""Unit tests: the LangSmith golden-set publisher, which had none.
|
|
2
|
+
|
|
3
|
+
``evals/publish_golden_dataset.py`` is the "observe" leg of boost's LangChain
|
|
4
|
+
integration — it mirrors ``tests/eval/golden.jsonl`` into a LangSmith dataset so
|
|
5
|
+
online evals grade against the same ground truth the offline Tier-1 gate floors.
|
|
6
|
+
It is deliberately outside the required gate (a required check that depends on a
|
|
7
|
+
SaaS account fails when someone else's billing lapses), and the cost of that is
|
|
8
|
+
that **nothing exercised it at all**: no test imported it, so every path
|
|
9
|
+
including the argument parsing was unverified.
|
|
10
|
+
|
|
11
|
+
It cannot be tested against the real service, and should not be. What *is*
|
|
12
|
+
testable is everything the network never sees, which is where the bugs a reader
|
|
13
|
+
would actually hit live:
|
|
14
|
+
|
|
15
|
+
* the two opt-in guards return cleanly rather than tracebacking, which is the
|
|
16
|
+
documented contract for a surface that must degrade when unconfigured;
|
|
17
|
+
* the golden file parses the way the offline gate parses it — comments and
|
|
18
|
+
blanks dropped — because a publisher that silently disagrees with the gate
|
|
19
|
+
about which rows count would publish a dataset that grades differently while
|
|
20
|
+
claiming to be the same ground truth;
|
|
21
|
+
* every row becomes exactly one example with the query as input and the
|
|
22
|
+
judgments as output.
|
|
23
|
+
|
|
24
|
+
The client is a stub. That is not a shortcut around the interesting part: the
|
|
25
|
+
interesting part is the mapping from a golden row to an example, and a stub is
|
|
26
|
+
what makes it observable.
|
|
27
|
+
"""
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
import importlib.util
|
|
31
|
+
import json
|
|
32
|
+
from pathlib import Path
|
|
33
|
+
|
|
34
|
+
import pytest
|
|
35
|
+
|
|
36
|
+
ROOT = Path(__file__).resolve().parents[2]
|
|
37
|
+
SCRIPT = ROOT / "evals" / "publish_golden_dataset.py"
|
|
38
|
+
GOLDEN = ROOT / "tests" / "eval" / "golden.jsonl"
|
|
39
|
+
|
|
40
|
+
pytestmark = pytest.mark.skipif(
|
|
41
|
+
not SCRIPT.exists(), reason="evals/ not reachable (e.g. mutation sandbox)")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def load_publisher():
|
|
45
|
+
"""Import the script by path, the way this repo tests scripts/."""
|
|
46
|
+
spec = importlib.util.spec_from_file_location("publish_golden_dataset",
|
|
47
|
+
SCRIPT)
|
|
48
|
+
mod = importlib.util.module_from_spec(spec)
|
|
49
|
+
assert spec.loader is not None
|
|
50
|
+
spec.loader.exec_module(mod)
|
|
51
|
+
return mod
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
MOD = load_publisher()
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class TestLoadGolden:
|
|
58
|
+
"""The parse must agree with the gate's, or the two grade different sets."""
|
|
59
|
+
|
|
60
|
+
def test_comments_and_blanks_are_dropped(self, tmp_path):
|
|
61
|
+
path = tmp_path / "g.jsonl"
|
|
62
|
+
path.write_text(
|
|
63
|
+
'# a comment\n\n{"query": "q1", "relevant": ["a"]}\n'
|
|
64
|
+
' \n{"query": "q2", "relevant": ["b"]}\n', encoding="utf-8")
|
|
65
|
+
assert [r["query"] for r in MOD.load_golden(path)] == ["q1", "q2"]
|
|
66
|
+
|
|
67
|
+
def test_the_real_golden_set_parses(self):
|
|
68
|
+
rows = MOD.load_golden(GOLDEN)
|
|
69
|
+
assert rows, "the shipped golden set parsed as empty"
|
|
70
|
+
assert all("query" in r for r in rows)
|
|
71
|
+
|
|
72
|
+
def test_it_agrees_with_the_gate_on_how_many_rows_there_are(self):
|
|
73
|
+
# THE POINT of testing the parser at all. The offline gate and this
|
|
74
|
+
# publisher both read golden.jsonl; if they disagree about which lines
|
|
75
|
+
# count, the LangSmith dataset silently grades a different set while
|
|
76
|
+
# claiming to be the same ground truth.
|
|
77
|
+
expected = sum(
|
|
78
|
+
1 for line in GOLDEN.read_text(encoding="utf-8").splitlines()
|
|
79
|
+
if line.strip() and not line.strip().startswith("#"))
|
|
80
|
+
assert len(MOD.load_golden(GOLDEN)) == expected
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class TestItDegradesWhenUnconfigured:
|
|
84
|
+
"""Both guards are documented as "message, not traceback". Pin that."""
|
|
85
|
+
|
|
86
|
+
def test_a_missing_key_returns_nonzero_without_raising(self, monkeypatch,
|
|
87
|
+
capsys):
|
|
88
|
+
monkeypatch.delenv("LANGSMITH_API_KEY", raising=False)
|
|
89
|
+
assert MOD.main(["--golden", str(GOLDEN)]) == 1
|
|
90
|
+
assert "LANGSMITH_API_KEY" in capsys.readouterr().err
|
|
91
|
+
|
|
92
|
+
def test_a_missing_package_returns_nonzero_without_raising(self, monkeypatch,
|
|
93
|
+
capsys):
|
|
94
|
+
monkeypatch.setenv("LANGSMITH_API_KEY", "not-a-real-key")
|
|
95
|
+
monkeypatch.setitem(__import__("sys").modules, "langsmith", None)
|
|
96
|
+
assert MOD.main(["--golden", str(GOLDEN)]) == 1
|
|
97
|
+
assert "langsmith" in capsys.readouterr().err
|
|
98
|
+
|
|
99
|
+
def test_the_key_check_happens_before_any_client_is_built(self, monkeypatch):
|
|
100
|
+
# Ordering, not politeness: reaching a Client() constructor without a
|
|
101
|
+
# key is how an opt-in surface turns into a traceback on a machine that
|
|
102
|
+
# simply never opted in.
|
|
103
|
+
monkeypatch.delenv("LANGSMITH_API_KEY", raising=False)
|
|
104
|
+
built = []
|
|
105
|
+
monkeypatch.setitem(__import__("sys").modules, "langsmith",
|
|
106
|
+
_fake_langsmith(built))
|
|
107
|
+
MOD.main(["--golden", str(GOLDEN)])
|
|
108
|
+
assert built == []
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class _FakeDataset:
|
|
112
|
+
def __init__(self, ident="ds-1"):
|
|
113
|
+
self.id = ident
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class _FakeClient:
|
|
117
|
+
"""Enough of langsmith.Client to observe what would be sent."""
|
|
118
|
+
|
|
119
|
+
def __init__(self, existing=False, calls=None):
|
|
120
|
+
self.calls = calls if calls is not None else []
|
|
121
|
+
self._existing = existing
|
|
122
|
+
self.created_examples = []
|
|
123
|
+
self.deleted = []
|
|
124
|
+
|
|
125
|
+
def has_dataset(self, dataset_name):
|
|
126
|
+
self.calls.append(("has_dataset", dataset_name))
|
|
127
|
+
return self._existing
|
|
128
|
+
|
|
129
|
+
def read_dataset(self, dataset_name):
|
|
130
|
+
self.calls.append(("read_dataset", dataset_name))
|
|
131
|
+
return _FakeDataset()
|
|
132
|
+
|
|
133
|
+
def create_dataset(self, dataset_name, description=""):
|
|
134
|
+
self.calls.append(("create_dataset", dataset_name))
|
|
135
|
+
return _FakeDataset()
|
|
136
|
+
|
|
137
|
+
def list_examples(self, dataset_id):
|
|
138
|
+
self.calls.append(("list_examples", dataset_id))
|
|
139
|
+
return [_FakeDataset("ex-1"), _FakeDataset("ex-2")]
|
|
140
|
+
|
|
141
|
+
def delete_example(self, example_id):
|
|
142
|
+
self.deleted.append(example_id)
|
|
143
|
+
|
|
144
|
+
def create_examples(self, dataset_id, examples):
|
|
145
|
+
self.calls.append(("create_examples", dataset_id))
|
|
146
|
+
self.created_examples = examples
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _fake_langsmith(built, existing=False, box=None):
|
|
150
|
+
"""A stand-in ``langsmith`` module whose Client records what it was asked."""
|
|
151
|
+
import types
|
|
152
|
+
mod = types.ModuleType("langsmith")
|
|
153
|
+
|
|
154
|
+
def _client(*a, **k):
|
|
155
|
+
client = _FakeClient(existing=existing)
|
|
156
|
+
built.append(client)
|
|
157
|
+
if box is not None:
|
|
158
|
+
box.append(client)
|
|
159
|
+
return client
|
|
160
|
+
|
|
161
|
+
mod.Client = _client
|
|
162
|
+
return mod
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _run(monkeypatch, tmp_path, rows, existing=False):
|
|
166
|
+
"""Publish ``rows`` through a stub client; return that client."""
|
|
167
|
+
path = tmp_path / "g.jsonl"
|
|
168
|
+
path.write_text("\n".join(json.dumps(r) for r in rows), encoding="utf-8")
|
|
169
|
+
monkeypatch.setenv("LANGSMITH_API_KEY", "not-a-real-key")
|
|
170
|
+
built: list = []
|
|
171
|
+
monkeypatch.setitem(__import__("sys").modules, "langsmith",
|
|
172
|
+
_fake_langsmith(built, existing=existing))
|
|
173
|
+
rc = MOD.main(["--golden", str(path), "--name", "test-set"])
|
|
174
|
+
assert rc == 0
|
|
175
|
+
assert built, "no client was constructed"
|
|
176
|
+
return built[0]
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
ROWS = [{"query": "how do I review code", "relevant": ["code-review"],
|
|
180
|
+
"kind": "skill", "note": "n1"},
|
|
181
|
+
{"query": "commit conventions", "relevant": ["conventional-commits"],
|
|
182
|
+
"kind": "rule", "note": ""}]
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class TestEveryRowBecomesAnExample:
|
|
186
|
+
def test_one_example_per_row(self, monkeypatch, tmp_path):
|
|
187
|
+
client = _run(monkeypatch, tmp_path, ROWS)
|
|
188
|
+
assert len(client.created_examples) == len(ROWS)
|
|
189
|
+
|
|
190
|
+
def test_the_query_is_the_input(self, monkeypatch, tmp_path):
|
|
191
|
+
client = _run(monkeypatch, tmp_path, ROWS)
|
|
192
|
+
assert [e["inputs"]["query"] for e in client.created_examples] == \
|
|
193
|
+
[r["query"] for r in ROWS]
|
|
194
|
+
|
|
195
|
+
def test_the_judgments_are_the_output(self, monkeypatch, tmp_path):
|
|
196
|
+
# This is the ground truth an online eval grades against; losing it
|
|
197
|
+
# would leave a dataset of questions with no answers, which still
|
|
198
|
+
# publishes cleanly.
|
|
199
|
+
client = _run(monkeypatch, tmp_path, ROWS)
|
|
200
|
+
assert client.created_examples[0]["outputs"]["relevant"] == \
|
|
201
|
+
["code-review"]
|
|
202
|
+
assert client.created_examples[0]["outputs"]["kind"] == "skill"
|
|
203
|
+
|
|
204
|
+
def test_a_row_missing_optional_fields_still_publishes(self, monkeypatch,
|
|
205
|
+
tmp_path):
|
|
206
|
+
# golden.jsonl's optional keys are optional in the gate too.
|
|
207
|
+
client = _run(monkeypatch, tmp_path, [{"query": "bare"}])
|
|
208
|
+
example = client.created_examples[0]
|
|
209
|
+
assert example["outputs"]["relevant"] == []
|
|
210
|
+
assert example["metadata"]["note"] == ""
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
class TestItMirrorsRatherThanAccretes:
|
|
214
|
+
"""Re-running must leave the dataset equal to the file, not appended to."""
|
|
215
|
+
|
|
216
|
+
def test_a_new_dataset_is_created_when_absent(self, monkeypatch, tmp_path):
|
|
217
|
+
client = _run(monkeypatch, tmp_path, ROWS, existing=False)
|
|
218
|
+
assert ("create_dataset", "test-set") in client.calls
|
|
219
|
+
|
|
220
|
+
def test_existing_examples_are_deleted_before_the_new_ones_land(
|
|
221
|
+
self, monkeypatch, tmp_path):
|
|
222
|
+
# Without this, publishing twice doubles every example and the dataset
|
|
223
|
+
# quietly stops matching the file it claims to mirror.
|
|
224
|
+
client = _run(monkeypatch, tmp_path, ROWS, existing=True)
|
|
225
|
+
assert client.deleted, "no existing examples were removed"
|
|
226
|
+
assert ("create_dataset", "test-set") not in client.calls
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Unit tests: a workflow that pushes has credentials to push with.
|
|
2
|
+
|
|
3
|
+
``actions/checkout`` with ``persist-credentials: false`` leaves no auth in the
|
|
4
|
+
remote — which is the right default, and what zizmor's ``artipacked`` rule asks
|
|
5
|
+
for. A later bare ``git push origin`` in the same job therefore cannot work.
|
|
6
|
+
|
|
7
|
+
``eval-stats.yml`` had exactly that pair. It regenerates
|
|
8
|
+
``docs/eval-latest.json`` — the payload the docs site reads — commits it, and
|
|
9
|
+
pushes. The proof that it never landed is in the file's own history: **one
|
|
10
|
+
commit, ever**, the one that created it. Every scheduled refresh since has
|
|
11
|
+
either found nothing to commit or died on the push.
|
|
12
|
+
|
|
13
|
+
It is the same silence as ``shards`` and ``fuzz``: a workflow that looks like a
|
|
14
|
+
control and produces nothing, on a cron nobody watches. The run even reports
|
|
15
|
+
*success* when there is nothing to commit, so the conclusion column cannot
|
|
16
|
+
distinguish "no drift" from "cannot publish".
|
|
17
|
+
|
|
18
|
+
``ci.yml`` already had the fix in the repo — it pushes its badges branch with an
|
|
19
|
+
explicit ``x-access-token`` URL, keeping the safe checkout default *and* being
|
|
20
|
+
able to push. This test pins the pairing so the two halves cannot drift apart
|
|
21
|
+
again in either direction.
|
|
22
|
+
"""
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import re
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
|
|
28
|
+
import pytest
|
|
29
|
+
|
|
30
|
+
WORKFLOWS = Path(__file__).resolve().parents[2] / ".github" / "workflows"
|
|
31
|
+
|
|
32
|
+
pytestmark = pytest.mark.skipif(
|
|
33
|
+
not WORKFLOWS.exists(),
|
|
34
|
+
reason=".github/workflows not reachable (e.g. mutation sandbox)")
|
|
35
|
+
|
|
36
|
+
#: A push that carries its own credentials, rather than relying on the ones the
|
|
37
|
+
#: checkout deliberately did not persist.
|
|
38
|
+
_AUTHED_PUSH = re.compile(r"git push[^\n]*(x-access-token|\$\{\{\s*secrets\.|"
|
|
39
|
+
r"\$\{\{\s*github\.token|GITHUB_TOKEN|GH_TOKEN)")
|
|
40
|
+
_ANY_PUSH = re.compile(r"^\s*git push\b", re.M)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def join_continuations(text: str) -> str:
|
|
44
|
+
"""Fold shell line-continuations, so one command is one line.
|
|
45
|
+
|
|
46
|
+
A push long enough to need credentials in its URL is a push long enough to
|
|
47
|
+
be wrapped, and matching per physical line would read the token on the next
|
|
48
|
+
line as absent — failing a workflow that is correct. Folding first is what
|
|
49
|
+
the shell itself does.
|
|
50
|
+
"""
|
|
51
|
+
return re.sub(r"\\\n\s*", " ", text)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def pushing_workflows() -> dict[str, str]:
|
|
55
|
+
"""``{file name: folded text}`` for every workflow containing a git push."""
|
|
56
|
+
out = {}
|
|
57
|
+
for path in sorted(WORKFLOWS.glob("*.yml")):
|
|
58
|
+
text = join_continuations(path.read_text(encoding="utf-8"))
|
|
59
|
+
if _ANY_PUSH.search(text):
|
|
60
|
+
out[path.name] = text
|
|
61
|
+
return out
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class TestTheGuardCanActuallySee:
|
|
65
|
+
def test_at_least_one_workflow_pushes(self):
|
|
66
|
+
# Otherwise every assertion below is vacuous.
|
|
67
|
+
assert pushing_workflows(), "no workflow matched a git push"
|
|
68
|
+
|
|
69
|
+
def test_an_authed_push_is_recognised(self):
|
|
70
|
+
line = ('git push -qf "https://x-access-token:${{ github.token }}'
|
|
71
|
+
'@github.com/${{ github.repository }}" badges:badges')
|
|
72
|
+
assert _AUTHED_PUSH.search(line)
|
|
73
|
+
|
|
74
|
+
def test_a_bare_push_is_not_recognised_as_authed(self):
|
|
75
|
+
assert not _AUTHED_PUSH.search(" git push origin HEAD:main")
|
|
76
|
+
|
|
77
|
+
def test_a_wrapped_authed_push_is_recognised(self):
|
|
78
|
+
# The shape the fix actually takes: a token URL is too long for one
|
|
79
|
+
# line, so without folding the continuation this guard would fail a
|
|
80
|
+
# workflow that is correct.
|
|
81
|
+
wrapped = (' git push -q \\\n'
|
|
82
|
+
' "https://x-access-token:${{ github.token }}'
|
|
83
|
+
'@github.com/${{ github.repository }}" \\\n'
|
|
84
|
+
' HEAD:main\n')
|
|
85
|
+
assert _AUTHED_PUSH.search(join_continuations(wrapped))
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@pytest.mark.parametrize("name", sorted(pushing_workflows()))
|
|
89
|
+
def test_a_push_after_an_unpersisted_checkout_carries_a_token(name):
|
|
90
|
+
text = pushing_workflows()[name]
|
|
91
|
+
if "persist-credentials: false" not in text:
|
|
92
|
+
pytest.skip("%s keeps the checkout credentials" % name)
|
|
93
|
+
bare = [line.strip() for line in text.splitlines()
|
|
94
|
+
if _ANY_PUSH.match(line) and not _AUTHED_PUSH.search(line)]
|
|
95
|
+
assert not bare, (
|
|
96
|
+
"%s checks out with persist-credentials: false — so the remote has no "
|
|
97
|
+
"auth — and then pushes without supplying any: %s. eval-stats.yml did "
|
|
98
|
+
"exactly this and never once refreshed docs/eval-latest.json; the "
|
|
99
|
+
"file has one commit in its whole history. ci.yml shows the fix: push "
|
|
100
|
+
"to an explicit x-access-token URL." % (name, bare))
|
|
Binary file
|
|
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
|