boost-skill-cli 1.0.329__tar.gz → 1.0.331__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.329/boost_skill_cli.egg-info → boost_skill_cli-1.0.331}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/rag.py +48 -3
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +17 -1
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +12 -1
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +24 -1
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +23 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +16 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap.html +99 -8
- boost_skill_cli-1.0.331/tests/unit/test_dedup_trust.py +117 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_embed.py +15 -1
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.gitattributes +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.gitignore +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/.vale.ini +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/LICENSE +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/Makefile +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/README.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/codecov.yml +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/index.html +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/README.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/examples/README.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/index.html +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/noxfile.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/setup.cfg +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/style/README.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/style/boost.css +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/style/boost.js +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/style/demo.html +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.329 → boost_skill_cli-1.0.331}/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.331'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 331)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -23,6 +23,7 @@ import re
|
|
|
23
23
|
import sqlite3
|
|
24
24
|
from collections import defaultdict
|
|
25
25
|
from collections.abc import Sequence
|
|
26
|
+
from functools import lru_cache
|
|
26
27
|
from pathlib import Path
|
|
27
28
|
from typing import Dict, List, Optional, Tuple, cast
|
|
28
29
|
|
|
@@ -31,7 +32,7 @@ try: # TypedDict lives in typing on 3.9+, kept optional for safety
|
|
|
31
32
|
except ImportError: # pragma: no cover - 3.9+ always has it
|
|
32
33
|
TypedDict = None # type: ignore
|
|
33
34
|
|
|
34
|
-
from . import ai, catalog, frontmatter, gitutil, paths, registry, util
|
|
35
|
+
from . import ai, catalog, config, frontmatter, gitutil, paths, registry, util
|
|
35
36
|
|
|
36
37
|
# v2: `snip` stores a larger head of the matched chunk (not just SNIP_WIDTH
|
|
37
38
|
# chars) so `retrieve` can window it onto the query terms; bump forces a
|
|
@@ -527,6 +528,50 @@ def entry_key(entry: dict) -> Tuple[str, str]:
|
|
|
527
528
|
return (entry["tap"], entry["skill_md"])
|
|
528
529
|
|
|
529
530
|
|
|
531
|
+
@lru_cache(maxsize=1)
|
|
532
|
+
def _confidence_map() -> Dict[str, str]:
|
|
533
|
+
"""``tap name -> confidence`` from the shipped registry catalog.
|
|
534
|
+
|
|
535
|
+
Cached because dedup asks per hit and the catalog is 466 rows; parsing it
|
|
536
|
+
inside a search loop would be a real cost for a value that cannot change
|
|
537
|
+
while the process runs.
|
|
538
|
+
"""
|
|
539
|
+
out: Dict[str, str] = {}
|
|
540
|
+
for row in config.load_registry_catalog():
|
|
541
|
+
name = row.get("name")
|
|
542
|
+
conf = row.get("confidence")
|
|
543
|
+
if name and conf:
|
|
544
|
+
out[str(name)] = str(conf)
|
|
545
|
+
return out
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
def registry_confidence(tap: str) -> Optional[str]:
|
|
549
|
+
"""The shipped confidence for a tap, or None if it is not catalogued."""
|
|
550
|
+
return _confidence_map().get(tap)
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
# Lower sorts better. Unknown registries rank below every known one rather than
|
|
554
|
+
# above, so an uncatalogued tap never outranks a vetted one by default.
|
|
555
|
+
_CONFIDENCE_ORDER = {"high": 0, "med": 1, "low": 2}
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
def source_rank(entry: dict) -> Tuple[int, int]:
|
|
559
|
+
"""How much this copy's *source* is worth, for choosing between identical bodies.
|
|
560
|
+
|
|
561
|
+
Only ever used inside a content cluster, where every candidate has the same
|
|
562
|
+
body — so this decides where the user installs from, not what they find.
|
|
563
|
+
|
|
564
|
+
The user's own ``curated`` flag comes first and the shipped ``confidence``
|
|
565
|
+
second, deliberately: a maintainer opinion baked into the package should
|
|
566
|
+
never override a decision the machine's owner made with `boost tap
|
|
567
|
+
--curated`.
|
|
568
|
+
"""
|
|
569
|
+
curated = 0 if entry.get("curated") else 1
|
|
570
|
+
conf = _CONFIDENCE_ORDER.get(registry_confidence(entry.get("tap", "")) or "",
|
|
571
|
+
len(_CONFIDENCE_ORDER))
|
|
572
|
+
return (curated, conf)
|
|
573
|
+
|
|
574
|
+
|
|
530
575
|
def dedupe_by_content(hits: List[Hit], limit: int) -> List[Hit]:
|
|
531
576
|
"""Collapse byte-identical copies, then take ``limit``.
|
|
532
577
|
|
|
@@ -562,9 +607,9 @@ def dedupe_by_content(hits: List[Hit], limit: int) -> List[Hit]:
|
|
|
562
607
|
best[digest] = len(out)
|
|
563
608
|
out.append(hit)
|
|
564
609
|
continue
|
|
565
|
-
# Same body already shown. Keep its rank, but prefer a
|
|
610
|
+
# Same body already shown. Keep its rank, but prefer a better source.
|
|
566
611
|
kept = out[seen]
|
|
567
|
-
if hit["entry"]
|
|
612
|
+
if source_rank(hit["entry"]) < source_rank(kept["entry"]):
|
|
568
613
|
# cast, not a literal annotation: `Hit` is total=False for the
|
|
569
614
|
# optional `content` key, and NotRequired needs 3.11 while boost
|
|
570
615
|
# targets 3.9.
|
|
@@ -485,6 +485,7 @@ tests/unit/test_command_reference_fresh.py
|
|
|
485
485
|
tests/unit/test_community_health_files.py
|
|
486
486
|
tests/unit/test_config.py
|
|
487
487
|
tests/unit/test_content_dedupe.py
|
|
488
|
+
tests/unit/test_dedup_trust.py
|
|
488
489
|
tests/unit/test_dense.py
|
|
489
490
|
tests/unit/test_dense_fallback.py
|
|
490
491
|
tests/unit/test_dense_fix_hint.py
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
id: code-scanning-rule-can-be-restored
|
|
3
3
|
board: code
|
|
4
4
|
section: trust
|
|
5
|
-
status:
|
|
5
|
+
status: shipped
|
|
6
6
|
category: Release safety
|
|
7
7
|
complexity: S
|
|
8
8
|
impact: Med
|
|
@@ -45,3 +45,19 @@ path filters and runs on <code>push</code>, <code>pull_request</code> and
|
|
|
45
45
|
repo has hit twice. And it catches something the status check does not —
|
|
46
46
|
<code>codeql-analyze</code> passes when the <em>job</em> succeeds, including when it succeeds
|
|
47
47
|
having found error-severity alerts.
|
|
48
|
+
|
|
49
|
+
<b>Done — the rule is back, and scoped exactly as this card prescribed.</b> Read from the live
|
|
50
|
+
<code>main</code> ruleset (id <code>19130332</code>): it carries a <code>code_scanning</code> rule
|
|
51
|
+
whose <code>code_scanning_tools</code> list is <b><code>CodeQL</code> alone</b>, at
|
|
52
|
+
<code>security_alerts_threshold: high_or_higher</code> and <code>alerts_threshold: errors</code>.
|
|
53
|
+
Scorecard is not in the list, which is the single decision this card exists to get right.
|
|
54
|
+
|
|
55
|
+
The safety precondition still holds and was re-checked rather than assumed: <b>CodeQL has 0 open
|
|
56
|
+
alerts</b>, while Scorecard has <b>4 open</b> (down from the 7 recorded above), every one still a
|
|
57
|
+
posture metric that must not be dismissed. Had Scorecard been added to that tool list, those four
|
|
58
|
+
would block every merge in the repository immediately — the failure mode this card correctly
|
|
59
|
+
identifies as the reason the work looked blocked.
|
|
60
|
+
|
|
61
|
+
No change was needed. Recording it as shipped so the board stops advertising work that is already
|
|
62
|
+
in place, and so the tool-list constraint stays written down: anyone re-editing this rule through the
|
|
63
|
+
GitHub UI will be offered Scorecard right next to CodeQL in the picker.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
id: demo-cannot-open-its-own-pr
|
|
3
3
|
board: code
|
|
4
4
|
section: pipeline
|
|
5
|
-
status:
|
|
5
|
+
status: shipped
|
|
6
6
|
category: CI reporting
|
|
7
7
|
complexity: S
|
|
8
8
|
impact: Med
|
|
@@ -61,3 +61,14 @@ that job cannot open a pull request either. So this toggle now gates two items r
|
|
|
61
61
|
the second is a supply-chain freshness gap rather than a docs asset. That does not make the
|
|
62
62
|
decision automatic, but it does change what is on each side of it.
|
|
63
63
|
|
|
64
|
+
|
|
65
|
+
<b>Unblocked, and already working — the setting was flipped.</b> This card's blocker is
|
|
66
|
+
<code>can_approve_pull_request_reviews: false</code>. The API now reports it as <b><code>true</code></b>,
|
|
67
|
+
and the effect is visible rather than theoretical: <code>demo.yml</code>'s recent runs are green, and
|
|
68
|
+
<b>PR <code>#353</code> was opened by <code>github-actions[bot]</code></b> — the exact action
|
|
69
|
+
this card says is impossible.
|
|
70
|
+
|
|
71
|
+
Nothing in the tree needed changing. Recording it as shipped rather than deleting it, because the
|
|
72
|
+
card's analysis was right about <em>where</em> the blocker was: the earlier investigation had chased
|
|
73
|
+
<code>demo.yml</code>'s own <code>permissions:</code> block, and the note that no edit to the workflow
|
|
74
|
+
could fix a repository-level setting is what stopped that from being a long false lead.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
id: merged-loop-branches-are-never-pruned
|
|
3
3
|
board: code
|
|
4
4
|
section: pipeline
|
|
5
|
-
status:
|
|
5
|
+
status: shipped
|
|
6
6
|
category: Hygiene · DX
|
|
7
7
|
complexity: S
|
|
8
8
|
impact: Low
|
|
@@ -45,3 +45,26 @@ Low impact and near-zero risk to fix — flip <code>delete_branch_on_merge</
|
|
|
45
45
|
the backlog can be pruned by listing merged PR head refs. The reason it is worth doing at all is
|
|
46
46
|
that CLAUDE.md tells every agent to run <code>git worktree list</code> and inspect branch state
|
|
47
47
|
before touching a tree, and 68 stale entries make that check noisier for every concurrent loop.
|
|
48
|
+
|
|
49
|
+
<b>Shipped — and the premise had gone stale, which is why it was worth re-checking rather than
|
|
50
|
+
assuming.</b> This card's core claim is that <code>delete_branch_on_merge</code> is <code>false</code>.
|
|
51
|
+
It is now <b><code>true</code></b>, and the backlog it describes is gone: against the card's
|
|
52
|
+
<b>77 branches, 70 of them <code>loop/*</code></b>, the repository today carries <b>5 branches, 2
|
|
53
|
+
<code>loop/*</code></b>.
|
|
54
|
+
|
|
55
|
+
Two stragglers predating the setting change were still present and are now deleted:
|
|
56
|
+
<code>evals-harness</code> (PR <code>#317</code>, merged) and <code>mcp-task-entrance</code>
|
|
57
|
+
(PR <code>#318</code>, merged). Both were classified the way this card insists on — by
|
|
58
|
+
<b>pull-request state</b>, not commit reachability — because the squash-merge point above is
|
|
59
|
+
real: <code>compare(main...branch).ahead_by</code> reports every merged branch as permanently ahead,
|
|
60
|
+
so reachability would have reported 0 of them deletable.
|
|
61
|
+
|
|
62
|
+
Three branches remain and are deliberately <em>not</em> deleted: <code>bot/demo-gif</code> has an
|
|
63
|
+
open PR (<code>#353</code>), and <code>badges</code>, <code>loop/keyless-card-dedupe</code> and
|
|
64
|
+
<code>loop/sbom-in-release-job</code> have <b>no PR on record</b>. A branch with no PR cannot be shown
|
|
65
|
+
to be merged, and deleting it could destroy unmerged work — so the safe rule is to leave it for
|
|
66
|
+
a human, which is also why no automated pruner is proposed here.
|
|
67
|
+
|
|
68
|
+
<b>No automation was added.</b> The repository setting does the job going forward; a workflow that
|
|
69
|
+
deleted branches on a schedule would add a way to lose work in exchange for tidying a list that is
|
|
70
|
+
now five entries long.
|
|
@@ -164,3 +164,26 @@ bodies. Both are refinements — the byte-identical case is 78.3% of the pro
|
|
|
164
164
|
quality prior than <code>curated</code> and near-identical (rather than byte-identical) clustering.
|
|
165
165
|
Unowned and ready for anyone — the byte-identical case was 78.3% of the problem, so the
|
|
166
166
|
remainder is refinement rather than the bulk.
|
|
167
|
+
|
|
168
|
+
<b>The quality prior is now richer than the <code>curated</code> flag alone.</b> Inside a cluster
|
|
169
|
+
every copy is byte-identical, so which one survives is not a relevance question — it decides
|
|
170
|
+
where the user installs from. Two signals exist and they are not the same thing: the entry's own
|
|
171
|
+
<code>curated</code> flag, which is a decision this machine's owner made with
|
|
172
|
+
<code>boost tap --curated</code>, and <code>confidence</code> in the shipped
|
|
173
|
+
<code>registries.json</code> (high / med / low across 466 registries, currently 268 / 153 / 45).
|
|
174
|
+
|
|
175
|
+
<code>rag.source_rank</code> orders on the user's flag <em>first</em> and the shipped confidence
|
|
176
|
+
second, deliberately: a maintainer opinion baked into the package should never override a choice made
|
|
177
|
+
on the user's own machine. An uncatalogued registry ranks below every catalogued one rather than
|
|
178
|
+
above, so an unknown tap never wins by default, and equal trust falls back to ranking order so the
|
|
179
|
+
result stays deterministic when there is no signal at all. The catalog is read once
|
|
180
|
+
(<code>lru_cache</code>) because dedup asks per hit and parsing 466 rows inside a search loop would
|
|
181
|
+
be a real cost for a value that cannot change while the process runs.
|
|
182
|
+
|
|
183
|
+
Retrieval quality is untouched by construction — the gate reads 0.863 / 0.473 / 0.607 / 0.662
|
|
184
|
+
before and after, because the prior only chooses between copies that are already identical.
|
|
185
|
+
|
|
186
|
+
<b>Still open:</b> near-identical rather than byte-identical clustering, where
|
|
187
|
+
<code>core/typosquat.py</code>'s confusion machinery would apply. Stars and recency, which the card
|
|
188
|
+
also names, have no shipped data source today — adding one is its own piece of work rather than
|
|
189
|
+
a tweak to this.
|
|
@@ -71,3 +71,19 @@ normal PR gate once a human opens it.
|
|
|
71
71
|
Either way the freshness gap this item exists to close narrows from "nobody is watching" to "a
|
|
72
72
|
human clicks a button", which is the honest available improvement while the setting stands.
|
|
73
73
|
|
|
74
|
+
|
|
75
|
+
<b>The blocker is gone.</b> This card is gated on the same repository setting as
|
|
76
|
+
<code>demo-cannot-open-its-own-pr</code>, and the API now reports
|
|
77
|
+
<code>can_approve_pull_request_reviews: <b>true</b></code>. Confirmed working rather than merely
|
|
78
|
+
configured: <code>#353</code> was opened by <code>github-actions[bot]</code>.
|
|
79
|
+
|
|
80
|
+
So the “honest available improvement while the setting stands” compromise described above
|
|
81
|
+
— a workflow that only reports drift and waits for a human to click a button — is no
|
|
82
|
+
longer the ceiling. A scheduled job can now regenerate the lock and open its own PR, which is what
|
|
83
|
+
this card originally asked for.
|
|
84
|
+
|
|
85
|
+
Deliberately left unimplemented here. It needs a real decision about cadence and about what happens
|
|
86
|
+
when the regenerated lock fails <code>lock_toolchain.py --check</code> on a runner, and shipping an
|
|
87
|
+
untested scheduled workflow that opens PRs against <code>main</code> is worse than shipping nothing.
|
|
88
|
+
The value of this note is that the next person picking it up starts from “build it”
|
|
89
|
+
rather than from “it cannot be built”.
|
|
@@ -1681,7 +1681,24 @@ than a description of them, and <code>lock_toolchain.py --audit</code> then runs
|
|
|
1681
1681
|
normal PR gate once a human opens it.
|
|
1682
1682
|
|
|
1683
1683
|
Either way the freshness gap this item exists to close narrows from "nobody is watching" to "a
|
|
1684
|
-
human clicks a button", which is the honest available improvement while the setting stands
|
|
1684
|
+
human clicks a button", which is the honest available improvement while the setting stands.
|
|
1685
|
+
|
|
1686
|
+
|
|
1687
|
+
<b>The blocker is gone.</b> This card is gated on the same repository setting as
|
|
1688
|
+
<code>demo-cannot-open-its-own-pr</code>, and the API now reports
|
|
1689
|
+
<code>can_approve_pull_request_reviews: <b>true</b></code>. Confirmed working rather than merely
|
|
1690
|
+
configured: <code>#353</code> was opened by <code>github-actions[bot]</code>.
|
|
1691
|
+
|
|
1692
|
+
So the “honest available improvement while the setting stands” compromise described above
|
|
1693
|
+
— a workflow that only reports drift and waits for a human to click a button — is no
|
|
1694
|
+
longer the ceiling. A scheduled job can now regenerate the lock and open its own PR, which is what
|
|
1695
|
+
this card originally asked for.
|
|
1696
|
+
|
|
1697
|
+
Deliberately left unimplemented here. It needs a real decision about cadence and about what happens
|
|
1698
|
+
when the regenerated lock fails <code>lock_toolchain.py --check</code> on a runner, and shipping an
|
|
1699
|
+
untested scheduled workflow that opens PRs against <code>main</code> is worse than shipping nothing.
|
|
1700
|
+
The value of this note is that the next person picking it up starts from “build it”
|
|
1701
|
+
rather than from “it cannot be built”.</p>
|
|
1685
1702
|
<div class="meta">
|
|
1686
1703
|
<span class="m">Complexity <b>M</b></span>
|
|
1687
1704
|
<span class="m">Impact <b>Med</b></span>
|
|
@@ -3318,7 +3335,7 @@ concrete proof that the original recommendation would have blocked every release
|
|
|
3318
3335
|
</article>
|
|
3319
3336
|
|
|
3320
3337
|
<article class="cap rcard" id="demo-cannot-open-its-own-pr">
|
|
3321
|
-
<div class="head"><span class="pill
|
|
3338
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">CI reporting</span></div>
|
|
3322
3339
|
<h3><code>demo.yml</code> still fails on every push — and the fix is not in the workflow</h3>
|
|
3323
3340
|
<p><code>demo-gif-workflow-has-never-succeeded</code> (shipped, PR 294) fixed the recorder:
|
|
3324
3341
|
<code>charmbracelet/vhs-action</code>'s broken ffmpeg installer was replaced with apt plus
|
|
@@ -3366,7 +3383,19 @@ permission: since <code>#349</code> switched off Dependabot's version updates fo
|
|
|
3366
3383
|
toolchain, the replacement is a scheduled job that regenerates the lock and proposes it — and
|
|
3367
3384
|
that job cannot open a pull request either. So this toggle now gates two items rather than one, and
|
|
3368
3385
|
the second is a supply-chain freshness gap rather than a docs asset. That does not make the
|
|
3369
|
-
decision automatic, but it does change what is on each side of it
|
|
3386
|
+
decision automatic, but it does change what is on each side of it.
|
|
3387
|
+
|
|
3388
|
+
|
|
3389
|
+
<b>Unblocked, and already working — the setting was flipped.</b> This card's blocker is
|
|
3390
|
+
<code>can_approve_pull_request_reviews: false</code>. The API now reports it as <b><code>true</code></b>,
|
|
3391
|
+
and the effect is visible rather than theoretical: <code>demo.yml</code>'s recent runs are green, and
|
|
3392
|
+
<b>PR <code>#353</code> was opened by <code>github-actions[bot]</code></b> — the exact action
|
|
3393
|
+
this card says is impossible.
|
|
3394
|
+
|
|
3395
|
+
Nothing in the tree needed changing. Recording it as shipped rather than deleting it, because the
|
|
3396
|
+
card's analysis was right about <em>where</em> the blocker was: the earlier investigation had chased
|
|
3397
|
+
<code>demo.yml</code>'s own <code>permissions:</code> block, and the note that no edit to the workflow
|
|
3398
|
+
could fix a repository-level setting is what stopped that from being a long false lead.</p>
|
|
3370
3399
|
<div class="meta">
|
|
3371
3400
|
<span class="m">Complexity <b>S</b></span>
|
|
3372
3401
|
<span class="m">Impact <b>Med</b></span>
|
|
@@ -3376,7 +3405,7 @@ decision automatic, but it does change what is on each side of it.</p>
|
|
|
3376
3405
|
</article>
|
|
3377
3406
|
|
|
3378
3407
|
<article class="cap rcard" id="merged-loop-branches-are-never-pruned">
|
|
3379
|
-
<div class="head"><span class="pill
|
|
3408
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Hygiene · DX</span></div>
|
|
3380
3409
|
<h3>68 of the repo's 77 branches are merged <code>loop/*</code> branches nobody deletes</h3>
|
|
3381
3410
|
<p>The repository carries <b>77 branches, 70 of them <code>loop/*</code></b>. Classifying each by the
|
|
3382
3411
|
state of its pull request: <b>68 have a merged PR</b> and are safe to delete, <b>1</b> has an open
|
|
@@ -3409,7 +3438,30 @@ manually.
|
|
|
3409
3438
|
Low impact and near-zero risk to fix — flip <code>delete_branch_on_merge</code> to true and
|
|
3410
3439
|
the backlog can be pruned by listing merged PR head refs. The reason it is worth doing at all is
|
|
3411
3440
|
that CLAUDE.md tells every agent to run <code>git worktree list</code> and inspect branch state
|
|
3412
|
-
before touching a tree, and 68 stale entries make that check noisier for every concurrent loop
|
|
3441
|
+
before touching a tree, and 68 stale entries make that check noisier for every concurrent loop.
|
|
3442
|
+
|
|
3443
|
+
<b>Shipped — and the premise had gone stale, which is why it was worth re-checking rather than
|
|
3444
|
+
assuming.</b> This card's core claim is that <code>delete_branch_on_merge</code> is <code>false</code>.
|
|
3445
|
+
It is now <b><code>true</code></b>, and the backlog it describes is gone: against the card's
|
|
3446
|
+
<b>77 branches, 70 of them <code>loop/*</code></b>, the repository today carries <b>5 branches, 2
|
|
3447
|
+
<code>loop/*</code></b>.
|
|
3448
|
+
|
|
3449
|
+
Two stragglers predating the setting change were still present and are now deleted:
|
|
3450
|
+
<code>evals-harness</code> (PR <code>#317</code>, merged) and <code>mcp-task-entrance</code>
|
|
3451
|
+
(PR <code>#318</code>, merged). Both were classified the way this card insists on — by
|
|
3452
|
+
<b>pull-request state</b>, not commit reachability — because the squash-merge point above is
|
|
3453
|
+
real: <code>compare(main...branch).ahead_by</code> reports every merged branch as permanently ahead,
|
|
3454
|
+
so reachability would have reported 0 of them deletable.
|
|
3455
|
+
|
|
3456
|
+
Three branches remain and are deliberately <em>not</em> deleted: <code>bot/demo-gif</code> has an
|
|
3457
|
+
open PR (<code>#353</code>), and <code>badges</code>, <code>loop/keyless-card-dedupe</code> and
|
|
3458
|
+
<code>loop/sbom-in-release-job</code> have <b>no PR on record</b>. A branch with no PR cannot be shown
|
|
3459
|
+
to be merged, and deleting it could destroy unmerged work — so the safe rule is to leave it for
|
|
3460
|
+
a human, which is also why no automated pruner is proposed here.
|
|
3461
|
+
|
|
3462
|
+
<b>No automation was added.</b> The repository setting does the job going forward; a workflow that
|
|
3463
|
+
deleted branches on a schedule would add a way to lose work in exchange for tidying a list that is
|
|
3464
|
+
now five entries long.</p>
|
|
3413
3465
|
<div class="meta">
|
|
3414
3466
|
<span class="m">Complexity <b>S</b></span>
|
|
3415
3467
|
<span class="m">Impact <b>Low</b></span>
|
|
@@ -3635,7 +3687,30 @@ bodies. Both are refinements — the byte-identical case is 78.3% of the pro
|
|
|
3635
3687
|
<b>Claim released.</b> The key fix and content-hash dedup have merged; what is left is a richer
|
|
3636
3688
|
quality prior than <code>curated</code> and near-identical (rather than byte-identical) clustering.
|
|
3637
3689
|
Unowned and ready for anyone — the byte-identical case was 78.3% of the problem, so the
|
|
3638
|
-
remainder is refinement rather than the bulk
|
|
3690
|
+
remainder is refinement rather than the bulk.
|
|
3691
|
+
|
|
3692
|
+
<b>The quality prior is now richer than the <code>curated</code> flag alone.</b> Inside a cluster
|
|
3693
|
+
every copy is byte-identical, so which one survives is not a relevance question — it decides
|
|
3694
|
+
where the user installs from. Two signals exist and they are not the same thing: the entry's own
|
|
3695
|
+
<code>curated</code> flag, which is a decision this machine's owner made with
|
|
3696
|
+
<code>boost tap --curated</code>, and <code>confidence</code> in the shipped
|
|
3697
|
+
<code>registries.json</code> (high / med / low across 466 registries, currently 268 / 153 / 45).
|
|
3698
|
+
|
|
3699
|
+
<code>rag.source_rank</code> orders on the user's flag <em>first</em> and the shipped confidence
|
|
3700
|
+
second, deliberately: a maintainer opinion baked into the package should never override a choice made
|
|
3701
|
+
on the user's own machine. An uncatalogued registry ranks below every catalogued one rather than
|
|
3702
|
+
above, so an unknown tap never wins by default, and equal trust falls back to ranking order so the
|
|
3703
|
+
result stays deterministic when there is no signal at all. The catalog is read once
|
|
3704
|
+
(<code>lru_cache</code>) because dedup asks per hit and parsing 466 rows inside a search loop would
|
|
3705
|
+
be a real cost for a value that cannot change while the process runs.
|
|
3706
|
+
|
|
3707
|
+
Retrieval quality is untouched by construction — the gate reads 0.863 / 0.473 / 0.607 / 0.662
|
|
3708
|
+
before and after, because the prior only chooses between copies that are already identical.
|
|
3709
|
+
|
|
3710
|
+
<b>Still open:</b> near-identical rather than byte-identical clustering, where
|
|
3711
|
+
<code>core/typosquat.py</code>'s confusion machinery would apply. Stars and recency, which the card
|
|
3712
|
+
also names, have no shipped data source today — adding one is its own piece of work rather than
|
|
3713
|
+
a tweak to this.</p>
|
|
3639
3714
|
<div class="meta">
|
|
3640
3715
|
<span class="m">Complexity <b>M</b></span>
|
|
3641
3716
|
<span class="m hi">Impact <b>High</b></span>
|
|
@@ -5746,7 +5821,7 @@ same-repo PRs and red CI.</p>
|
|
|
5746
5821
|
</article>
|
|
5747
5822
|
|
|
5748
5823
|
<article class="cap rcard" id="code-scanning-rule-can-be-restored">
|
|
5749
|
-
<div class="head"><span class="pill
|
|
5824
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Release safety</span></div>
|
|
5750
5825
|
<h3>The <code>code_scanning</code> ruleset rule can go back on — but only scoped to CodeQL</h3>
|
|
5751
5826
|
<p>Repairing the <code>main</code> ruleset dropped its <code>code_scanning</code> rule in favour of
|
|
5752
5827
|
<code>codeql-analyze</code> as a required status check (see
|
|
@@ -5779,7 +5854,23 @@ path filters and runs on <code>push</code>, <code>pull_request</code> and
|
|
|
5779
5854
|
<code>merge_group</code>, so it always reports and cannot produce the never-reports deadlock this
|
|
5780
5855
|
repo has hit twice. And it catches something the status check does not —
|
|
5781
5856
|
<code>codeql-analyze</code> passes when the <em>job</em> succeeds, including when it succeeds
|
|
5782
|
-
having found error-severity alerts
|
|
5857
|
+
having found error-severity alerts.
|
|
5858
|
+
|
|
5859
|
+
<b>Done — the rule is back, and scoped exactly as this card prescribed.</b> Read from the live
|
|
5860
|
+
<code>main</code> ruleset (id <code>19130332</code>): it carries a <code>code_scanning</code> rule
|
|
5861
|
+
whose <code>code_scanning_tools</code> list is <b><code>CodeQL</code> alone</b>, at
|
|
5862
|
+
<code>security_alerts_threshold: high_or_higher</code> and <code>alerts_threshold: errors</code>.
|
|
5863
|
+
Scorecard is not in the list, which is the single decision this card exists to get right.
|
|
5864
|
+
|
|
5865
|
+
The safety precondition still holds and was re-checked rather than assumed: <b>CodeQL has 0 open
|
|
5866
|
+
alerts</b>, while Scorecard has <b>4 open</b> (down from the 7 recorded above), every one still a
|
|
5867
|
+
posture metric that must not be dismissed. Had Scorecard been added to that tool list, those four
|
|
5868
|
+
would block every merge in the repository immediately — the failure mode this card correctly
|
|
5869
|
+
identifies as the reason the work looked blocked.
|
|
5870
|
+
|
|
5871
|
+
No change was needed. Recording it as shipped so the board stops advertising work that is already
|
|
5872
|
+
in place, and so the tool-list constraint stays written down: anyone re-editing this rule through the
|
|
5873
|
+
GitHub UI will be offered Scorecard right next to CodeQL in the picker.</p>
|
|
5783
5874
|
<div class="meta">
|
|
5784
5875
|
<span class="m">Complexity <b>S</b></span>
|
|
5785
5876
|
<span class="m">Impact <b>Med</b></span>
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"""Which copy survives dedup, when every copy is byte-identical.
|
|
2
|
+
|
|
3
|
+
Content-hash dedup collapses a cluster to one result. Because the bodies are
|
|
4
|
+
identical, *which* one survives is not a relevance question at all — it decides
|
|
5
|
+
where the user installs from. The roadmap card asks for "a quality prior —
|
|
6
|
+
source trust, stars, recency, maintenance".
|
|
7
|
+
|
|
8
|
+
Two signals exist today and they are not the same thing:
|
|
9
|
+
|
|
10
|
+
* the entry's own ``curated`` flag — the user tapped that registry with
|
|
11
|
+
``--curated``, i.e. a decision this machine's owner made;
|
|
12
|
+
* ``confidence`` in the shipped ``registries.json`` — high / med / low, a
|
|
13
|
+
maintainer judgement about the registry, covering 466 registries.
|
|
14
|
+
|
|
15
|
+
The user's own flag outranks the shipped default deliberately: a shipped
|
|
16
|
+
opinion should never override a decision the user made on their own machine.
|
|
17
|
+
Below both, ranking order breaks the tie, so the behaviour stays deterministic
|
|
18
|
+
when there is no trust signal at all.
|
|
19
|
+
"""
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
from boost_cli.core import rag
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _hit(name, tap, score, content, curated=False):
|
|
26
|
+
return {"entry": {"name": name, "tap": tap, "curated": curated,
|
|
27
|
+
"skill_md": "%s/SKILL.md" % name, "kind": "skill",
|
|
28
|
+
"description": ""},
|
|
29
|
+
"score": score, "snippet": "", "content": content}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class TestTrustRank:
|
|
33
|
+
"""`source_rank` orders candidates; lower sorts first."""
|
|
34
|
+
|
|
35
|
+
def test_a_curated_tap_beats_an_uncurated_one(self, monkeypatch):
|
|
36
|
+
monkeypatch.setattr(rag, "registry_confidence", lambda tap: None)
|
|
37
|
+
assert rag.source_rank({"tap": "a/x", "curated": True}) < \
|
|
38
|
+
rag.source_rank({"tap": "b/y", "curated": False})
|
|
39
|
+
|
|
40
|
+
def test_high_confidence_beats_low(self, monkeypatch):
|
|
41
|
+
conf = {"a/x": "high", "b/y": "low"}
|
|
42
|
+
monkeypatch.setattr(rag, "registry_confidence", conf.get)
|
|
43
|
+
assert rag.source_rank({"tap": "a/x"}) < rag.source_rank({"tap": "b/y"})
|
|
44
|
+
|
|
45
|
+
def test_high_beats_med_beats_low(self, monkeypatch):
|
|
46
|
+
conf = {"h": "high", "m": "med", "l": "low"}
|
|
47
|
+
monkeypatch.setattr(rag, "registry_confidence", conf.get)
|
|
48
|
+
ranks = [rag.source_rank({"tap": t}) for t in ("h", "m", "l")]
|
|
49
|
+
assert ranks == sorted(ranks) and len(set(ranks)) == 3
|
|
50
|
+
|
|
51
|
+
def test_the_users_own_flag_outranks_a_shipped_high(self, monkeypatch):
|
|
52
|
+
# A shipped opinion must not override a decision made on this machine.
|
|
53
|
+
conf = {"rando": None, "shipped": "high"}
|
|
54
|
+
monkeypatch.setattr(rag, "registry_confidence", conf.get)
|
|
55
|
+
assert rag.source_rank({"tap": "rando", "curated": True}) < \
|
|
56
|
+
rag.source_rank({"tap": "shipped", "curated": False})
|
|
57
|
+
|
|
58
|
+
def test_an_unknown_registry_ranks_below_a_known_one(self, monkeypatch):
|
|
59
|
+
monkeypatch.setattr(rag, "registry_confidence",
|
|
60
|
+
{"known": "low"}.get)
|
|
61
|
+
assert rag.source_rank({"tap": "known"}) < \
|
|
62
|
+
rag.source_rank({"tap": "never-heard-of-it"})
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class TestDedupUsesIt:
|
|
66
|
+
"""The prior only matters inside a cluster of identical bodies."""
|
|
67
|
+
|
|
68
|
+
def test_a_trusted_copy_wins_over_a_better_ranked_one(self, monkeypatch):
|
|
69
|
+
monkeypatch.setattr(rag, "registry_confidence",
|
|
70
|
+
{"rando/x": "low", "solid/y": "high"}.get)
|
|
71
|
+
hits = [_hit("rule", "rando/x", 3.0, "same"),
|
|
72
|
+
_hit("rule", "solid/y", 2.0, "same")]
|
|
73
|
+
assert rag.dedupe_by_content(hits, 10)[0]["entry"]["tap"] == "solid/y"
|
|
74
|
+
|
|
75
|
+
def test_the_cluster_keeps_its_best_score(self, monkeypatch):
|
|
76
|
+
monkeypatch.setattr(rag, "registry_confidence",
|
|
77
|
+
{"rando/x": "low", "solid/y": "high"}.get)
|
|
78
|
+
hits = [_hit("rule", "rando/x", 3.0, "same"),
|
|
79
|
+
_hit("rule", "solid/y", 2.0, "same")]
|
|
80
|
+
assert rag.dedupe_by_content(hits, 10)[0]["score"] == 3.0
|
|
81
|
+
|
|
82
|
+
def test_equal_trust_falls_back_to_rank(self, monkeypatch):
|
|
83
|
+
monkeypatch.setattr(rag, "registry_confidence",
|
|
84
|
+
{"a/x": "high", "b/y": "high"}.get)
|
|
85
|
+
hits = [_hit("rule", "a/x", 3.0, "same"), _hit("rule", "b/y", 2.0, "same")]
|
|
86
|
+
assert rag.dedupe_by_content(hits, 10)[0]["entry"]["tap"] == "a/x"
|
|
87
|
+
|
|
88
|
+
def test_trust_never_merges_distinct_bodies(self, monkeypatch):
|
|
89
|
+
# The prior decides *which* copy, never *whether* to collapse.
|
|
90
|
+
monkeypatch.setattr(rag, "registry_confidence",
|
|
91
|
+
{"a/x": "high", "b/y": "low"}.get)
|
|
92
|
+
hits = [_hit("rule", "a/x", 3.0, "one body"),
|
|
93
|
+
_hit("rule", "b/y", 2.0, "a different body")]
|
|
94
|
+
assert len(rag.dedupe_by_content(hits, 10)) == 2
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class TestConfidenceLookup:
|
|
98
|
+
"""Reading the shipped catalog, without paying for it on every call."""
|
|
99
|
+
|
|
100
|
+
def test_a_shipped_registry_resolves(self):
|
|
101
|
+
# Picked from registries.json; asserted as a real value, not just truthy.
|
|
102
|
+
assert rag.registry_confidence("Aaronontheweb/dotnet-cursor-rules") == "med"
|
|
103
|
+
|
|
104
|
+
def test_an_unknown_registry_is_none(self):
|
|
105
|
+
assert rag.registry_confidence("nobody/nothing") is None
|
|
106
|
+
|
|
107
|
+
def test_the_catalog_is_read_once(self, monkeypatch):
|
|
108
|
+
# 466 registries parsed per hit would be a real cost in a search loop.
|
|
109
|
+
calls = []
|
|
110
|
+
rag._confidence_map.cache_clear()
|
|
111
|
+
real = rag.config.load_registry_catalog
|
|
112
|
+
monkeypatch.setattr(rag.config, "load_registry_catalog",
|
|
113
|
+
lambda: calls.append(1) or real())
|
|
114
|
+
rag.registry_confidence("a")
|
|
115
|
+
rag.registry_confidence("b")
|
|
116
|
+
rag.registry_confidence("c")
|
|
117
|
+
assert len(calls) == 1
|
|
@@ -120,9 +120,23 @@ class TestProviderSelection:
|
|
|
120
120
|
|
|
121
121
|
|
|
122
122
|
class TestEmbed:
|
|
123
|
-
def test_none_without_provider(self, sandbox):
|
|
123
|
+
def test_none_without_provider(self, sandbox, monkeypatch):
|
|
124
|
+
# `local_available` is forced off for the same reason as the tests in
|
|
125
|
+
# TestProviderSelection: since the [rag] extra bundles a local model,
|
|
126
|
+
# "no key" no longer implies "no provider", and `embed` returns real
|
|
127
|
+
# vectors rather than None once anything has warmed that backend. Left
|
|
128
|
+
# ambient this passed or failed depending on test ORDER, which made it
|
|
129
|
+
# a latent flake rather than an assertion about the code.
|
|
130
|
+
monkeypatch.setattr(embed, "local_available", lambda: False)
|
|
124
131
|
assert embed.embed(["hi"]) is None
|
|
125
132
|
|
|
133
|
+
def test_the_local_backend_alone_still_embeds(self, sandbox, monkeypatch):
|
|
134
|
+
# The other half: with no key but the extra present, embedding works.
|
|
135
|
+
# That is the keyless tier, and nothing else in this file covers it.
|
|
136
|
+
monkeypatch.setattr(embed, "local_available", lambda: True)
|
|
137
|
+
monkeypatch.setattr(embed, "_embed_local", lambda texts, **kw: [[0.1]])
|
|
138
|
+
assert embed.embed(["hi"]) == [[0.1]]
|
|
139
|
+
|
|
126
140
|
def test_empty_batch_is_empty_list(self, sandbox, monkeypatch):
|
|
127
141
|
monkeypatch.setenv("OPENAI_API_KEY", "o")
|
|
128
142
|
assert embed.embed([]) == []
|
|
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
|