boost-skill-cli 1.0.267__tar.gz → 1.0.268__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.267/boost_skill_cli.egg-info → boost_skill_cli-1.0.268}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/store.py +50 -1
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
- boost_skill_cli-1.0.268/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +36 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap.html +33 -1
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_store.py +146 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/.gitattributes +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/.gitignore +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/.vale.ini +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/LICENSE +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/Makefile +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/README.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/codecov.yml +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/index.html +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/examples/README.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/index.html +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/noxfile.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/setup.cfg +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/style/README.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/style/boost.css +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/style/boost.js +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/style/demo.html +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/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.268'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 268)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -126,6 +126,41 @@ def preserved_agent_scope(only_agents: Optional[List[str]],
|
|
|
126
126
|
return [a for a in recorded if a] or None
|
|
127
127
|
|
|
128
128
|
|
|
129
|
+
def declared_agent_scope(only_agents: Optional[List[str]],
|
|
130
|
+
existing: Optional[dict]) -> Optional[List[str]]:
|
|
131
|
+
"""The scope to RECORD in the lock: an explicit narrowing, or the last one.
|
|
132
|
+
|
|
133
|
+
Deliberately *not* :func:`preserved_agent_scope`. That one answers "which
|
|
134
|
+
agents should this install link into", and falls back to the lock's
|
|
135
|
+
``agents`` — which records what happens to be linked right now. Writing
|
|
136
|
+
that back as a declared scope would promote "these were the enabled agents
|
|
137
|
+
at install time" into "the user asked for exactly these", permanently
|
|
138
|
+
freezing a skill out of any agent enabled later. The two questions look
|
|
139
|
+
alike and are not, so they get separate functions.
|
|
140
|
+
|
|
141
|
+
Only an explicit ``--agent`` narrows. Absent that, an earlier declaration
|
|
142
|
+
is carried forward so ``update``/``reinstall`` don't drop it, and a skill
|
|
143
|
+
that was never narrowed keeps no scope at all (``None``).
|
|
144
|
+
"""
|
|
145
|
+
if only_agents is not None:
|
|
146
|
+
return list(only_agents)
|
|
147
|
+
return (existing or {}).get("only_agents")
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def scoped_agents(entry: dict, enabled: Dict[str, Path]) -> Dict[str, Path]:
|
|
151
|
+
"""The enabled agents a locked skill is supposed to be linked into.
|
|
152
|
+
|
|
153
|
+
Fails **open**: an entry with no ``only_agents`` — every entry written
|
|
154
|
+
before this field existed — means "not narrowed", so it gets every enabled
|
|
155
|
+
agent. That keeps ``boost sync`` doing its other job, which is linking
|
|
156
|
+
already-installed skills into an agent that was enabled afterwards.
|
|
157
|
+
"""
|
|
158
|
+
scope = entry.get("only_agents")
|
|
159
|
+
if not scope:
|
|
160
|
+
return enabled.copy()
|
|
161
|
+
return {a: d for a, d in enabled.items() if a in scope}
|
|
162
|
+
|
|
163
|
+
|
|
129
164
|
def unlink_agents(name: str) -> List[str]:
|
|
130
165
|
"""Remove the ``name`` symlink from every enabled agent dir.
|
|
131
166
|
|
|
@@ -326,6 +361,11 @@ def install(entry: dict, force: bool = False,
|
|
|
326
361
|
"pinned": bool((existing or {}).get("pinned")),
|
|
327
362
|
"quarantined": False,
|
|
328
363
|
"agents": res.linked,
|
|
364
|
+
# `agents` is what IS linked; `only_agents` is what the user ASKED for.
|
|
365
|
+
# sync needs the second: it links a skill into every enabled agent, and
|
|
366
|
+
# without a record of the request it cannot tell a deliberate `--agent`
|
|
367
|
+
# narrowing from a skill that simply predates a newly enabled agent.
|
|
368
|
+
"only_agents": declared_agent_scope(only_agents, existing),
|
|
329
369
|
"tags": (existing or {}).get("tags", []),
|
|
330
370
|
})
|
|
331
371
|
journal.log("install", name, tap=entry["tap"], version=entry.get("version"))
|
|
@@ -806,6 +846,10 @@ def install_from_path(src_dir: Path, name: Optional[str] = None,
|
|
|
806
846
|
"pinned": bool((existing or {}).get("pinned")),
|
|
807
847
|
"quarantined": False,
|
|
808
848
|
"agents": res.linked,
|
|
849
|
+
# `boost import --agent ...` narrows the same way `install` does, so it
|
|
850
|
+
# has to record the same declaration — otherwise the links are narrow
|
|
851
|
+
# but sync sees no scope and widens them right back.
|
|
852
|
+
"only_agents": declared_agent_scope(only_agents, existing),
|
|
809
853
|
"tags": (existing or {}).get("tags", []),
|
|
810
854
|
})
|
|
811
855
|
journal.log("import", name, source=str(src_dir))
|
|
@@ -922,7 +966,12 @@ def sync_plan() -> Dict[str, list]:
|
|
|
922
966
|
continue
|
|
923
967
|
if entry.get("quarantined"):
|
|
924
968
|
continue
|
|
925
|
-
|
|
969
|
+
# Only the agents this skill was installed for. Walking every enabled
|
|
970
|
+
# agent made `boost sync` a second path to the scope leak that
|
|
971
|
+
# `preserved_agent_scope` closed on the install side: it reported a
|
|
972
|
+
# missing_link for each agent outside the narrowing, and sync_apply
|
|
973
|
+
# dutifully linked them, undoing `install --agent` in one command.
|
|
974
|
+
for agent, adir in scoped_agents(entry, agents.enabled_agents()).items():
|
|
926
975
|
link = adir / name
|
|
927
976
|
if not link.is_symlink() or not link.exists():
|
|
928
977
|
plan["missing_links"].append((name, agent))
|
|
@@ -296,6 +296,7 @@ docs/roadmap/items/structured-json-log-output-mode.md
|
|
|
296
296
|
docs/roadmap/items/supply-chain-posture-openssf-scorecard.md
|
|
297
297
|
docs/roadmap/items/surface-every-docs-page-from-the-guide.md
|
|
298
298
|
docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md
|
|
299
|
+
docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md
|
|
299
300
|
docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md
|
|
300
301
|
docs/roadmap/items/theme-asset-linting-stylelint-eslint.md
|
|
301
302
|
docs/roadmap/items/typo-detection-codespell.md
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: sync-relinks-into-every-agent-ignoring-scope
|
|
3
|
+
board: code
|
|
4
|
+
section: internals
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Bug
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 2
|
|
10
|
+
note: the half of the scope leak PR #288 deliberately left open
|
|
11
|
+
order: 34
|
|
12
|
+
owner: loop/sync-agent-scope
|
|
13
|
+
pr:
|
|
14
|
+
title: <code>sync</code> relinks a narrowed skill into every agent
|
|
15
|
+
---
|
|
16
|
+
<code>store.preserved_agent_scope</code> (PR #288) stopped <code>update</code> and
|
|
17
|
+
<code>reinstall</code> widening a skill installed with <code>--agent</code> narrowing, but
|
|
18
|
+
<code>sync_plan()</code> was a second, independent path to the same leak: it walked
|
|
19
|
+
<code>agents.enabled_agents()</code> for <b>every</b> locked skill and reported a
|
|
20
|
+
<code>missing_link</code> for any agent the skill was not linked into — the lock's recorded
|
|
21
|
+
scope was never consulted. <code>sync_apply</code> then dutifully linked them, so a
|
|
22
|
+
single <code>boost sync</code> undid the narrowing that <code>install --agent</code> asked for and
|
|
23
|
+
rewrote the lock to match.
|
|
24
|
+
|
|
25
|
+
It was left out of #288 because the fix is a real trade-off, not an oversight:
|
|
26
|
+
<code>boost sync</code> is also how a <i>newly enabled</i> agent picks up skills installed
|
|
27
|
+
before it existed, and honouring the lock's <code>agents</code> list would silently break that —
|
|
28
|
+
<code>agents</code> records what is linked <i>right now</i>, so reading it as a scope would
|
|
29
|
+
freeze every existing skill out of any agent enabled later.
|
|
30
|
+
|
|
31
|
+
Resolved by separating the two questions. A new <code>only_agents</code> field records what the
|
|
32
|
+
user <i>asked</i> for, written only by an explicit <code>--agent</code> and carried forward across
|
|
33
|
+
<code>update</code>/<code>reinstall</code>; <code>agents</code> keeps meaning what is actually linked.
|
|
34
|
+
<code>sync_plan</code> filters through <code>scoped_agents()</code>, which <b>fails open</b> — an entry
|
|
35
|
+
with no declaration, which is every entry written before this field existed, still fans out to
|
|
36
|
+
every enabled agent. So narrowing is honoured and the newly-enabled-agent path is untouched.
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
<div class="stat"><b>16</b><span>Shipped</span></div>
|
|
111
111
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
112
112
|
<div class="stat"><b>4</b><span>Planned</span></div>
|
|
113
|
-
<div class="stat"><b>
|
|
113
|
+
<div class="stat"><b>161</b><span>Loop finds</span></div>
|
|
114
114
|
<!-- /ROADMAP:stats -->
|
|
115
115
|
</div>
|
|
116
116
|
</section>
|
|
@@ -1102,6 +1102,38 @@ already used elsewhere in <code>pkg.py</code>.</p>
|
|
|
1102
1102
|
</div>
|
|
1103
1103
|
</article>
|
|
1104
1104
|
|
|
1105
|
+
<article class="cap rcard" id="sync-relinks-into-every-agent-ignoring-scope">
|
|
1106
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Bug</span></div>
|
|
1107
|
+
<h3><code>sync</code> relinks a narrowed skill into every agent</h3>
|
|
1108
|
+
<p><code>store.preserved_agent_scope</code> (PR #288) stopped <code>update</code> and
|
|
1109
|
+
<code>reinstall</code> widening a skill installed with <code>--agent</code> narrowing, but
|
|
1110
|
+
<code>sync_plan()</code> was a second, independent path to the same leak: it walked
|
|
1111
|
+
<code>agents.enabled_agents()</code> for <b>every</b> locked skill and reported a
|
|
1112
|
+
<code>missing_link</code> for any agent the skill was not linked into — the lock's recorded
|
|
1113
|
+
scope was never consulted. <code>sync_apply</code> then dutifully linked them, so a
|
|
1114
|
+
single <code>boost sync</code> undid the narrowing that <code>install --agent</code> asked for and
|
|
1115
|
+
rewrote the lock to match.
|
|
1116
|
+
|
|
1117
|
+
It was left out of #288 because the fix is a real trade-off, not an oversight:
|
|
1118
|
+
<code>boost sync</code> is also how a <i>newly enabled</i> agent picks up skills installed
|
|
1119
|
+
before it existed, and honouring the lock's <code>agents</code> list would silently break that —
|
|
1120
|
+
<code>agents</code> records what is linked <i>right now</i>, so reading it as a scope would
|
|
1121
|
+
freeze every existing skill out of any agent enabled later.
|
|
1122
|
+
|
|
1123
|
+
Resolved by separating the two questions. A new <code>only_agents</code> field records what the
|
|
1124
|
+
user <i>asked</i> for, written only by an explicit <code>--agent</code> and carried forward across
|
|
1125
|
+
<code>update</code>/<code>reinstall</code>; <code>agents</code> keeps meaning what is actually linked.
|
|
1126
|
+
<code>sync_plan</code> filters through <code>scoped_agents()</code>, which <b>fails open</b> — an entry
|
|
1127
|
+
with no declaration, which is every entry written before this field existed, still fans out to
|
|
1128
|
+
every enabled agent. So narrowing is honoured and the newly-enabled-agent path is untouched.</p>
|
|
1129
|
+
<div class="meta">
|
|
1130
|
+
<span class="m">Complexity <b>S</b></span>
|
|
1131
|
+
<span class="m">Impact <b>Med</b></span>
|
|
1132
|
+
<span class="m">Wow <b class="wow">★★</b></span>
|
|
1133
|
+
<span class="m">the half of the scope leak PR</span>
|
|
1134
|
+
</div>
|
|
1135
|
+
</article>
|
|
1136
|
+
|
|
1105
1137
|
<article class="cap rcard" id="onboard-overwrites-generated-files-without-confirm">
|
|
1106
1138
|
<div class="head"><span class="pill planned">Planned</span><span class="cat">UX · Bug</span></div>
|
|
1107
1139
|
<h3><code>boost onboard</code> silently overwrites existing generated files</h3>
|
|
@@ -506,7 +506,16 @@ class TestSyncPlan:
|
|
|
506
506
|
# only claude-code was linked, so the other agent dirs were never
|
|
507
507
|
# created — sync still wants links there, and the stale-link scan
|
|
508
508
|
# skips the nonexistent dirs.
|
|
509
|
+
#
|
|
510
|
+
# `--agent` is used here purely to leave those dirs uncreated, so the
|
|
511
|
+
# declaration it records is cleared again: a *narrowed* skill is now
|
|
512
|
+
# deliberately left alone (TestSyncRespectsDeclaredScope), and what
|
|
513
|
+
# this test is about is the unnarrowed fan-out reporting a missing
|
|
514
|
+
# directory as missing_links rather than stale_links.
|
|
509
515
|
store.install(entry, only_agents=["claude-code"])
|
|
516
|
+
e = lockfile.get_skill("brainstorming")
|
|
517
|
+
e["only_agents"] = None
|
|
518
|
+
lockfile.set_skill("brainstorming", e)
|
|
510
519
|
assert not (paths.home() / ".windsurf" / "skills").exists()
|
|
511
520
|
plan = store.sync_plan()
|
|
512
521
|
assert plan == {**self.EMPTY, "missing_links": [
|
|
@@ -1527,3 +1536,140 @@ class TestReinstallKeepsAgentScope:
|
|
|
1527
1536
|
res = store.install(entry, scope="project", base=str(repo), force=True)
|
|
1528
1537
|
assert res.linked == ["cursor"]
|
|
1529
1538
|
assert not (repo / ".claude" / "skills" / "brainstorming").exists()
|
|
1539
|
+
|
|
1540
|
+
|
|
1541
|
+
class TestDeclaredAgentScope:
|
|
1542
|
+
"""What the lock RECORDS as the requested scope.
|
|
1543
|
+
|
|
1544
|
+
Distinct from `preserved_agent_scope`, which answers "what should this
|
|
1545
|
+
install link into". Conflating them is the bug: `agents` records what is
|
|
1546
|
+
linked right now, so promoting it to a declared scope would freeze a skill
|
|
1547
|
+
out of every agent enabled later.
|
|
1548
|
+
"""
|
|
1549
|
+
|
|
1550
|
+
def test_an_explicit_narrowing_is_recorded(self):
|
|
1551
|
+
assert store.declared_agent_scope(["cursor"], None) == ["cursor"]
|
|
1552
|
+
|
|
1553
|
+
def test_a_never_narrowed_install_declares_nothing(self):
|
|
1554
|
+
assert store.declared_agent_scope(None, None) is None
|
|
1555
|
+
assert store.declared_agent_scope(None, {}) is None
|
|
1556
|
+
|
|
1557
|
+
def test_the_linked_agents_list_is_not_promoted_to_a_declaration(self):
|
|
1558
|
+
# The whole point. This entry was installed unnarrowed and happens to
|
|
1559
|
+
# be linked into one agent; that must not become "only ever cursor".
|
|
1560
|
+
assert store.declared_agent_scope(None, {"agents": ["cursor"]}) is None
|
|
1561
|
+
|
|
1562
|
+
def test_an_earlier_declaration_survives_update(self):
|
|
1563
|
+
# update/reinstall pass only_agents=None; the request must persist.
|
|
1564
|
+
assert store.declared_agent_scope(
|
|
1565
|
+
None, {"agents": ["cursor"], "only_agents": ["cursor"]}) == ["cursor"]
|
|
1566
|
+
|
|
1567
|
+
def test_a_re_narrowing_replaces_the_old_declaration(self):
|
|
1568
|
+
assert store.declared_agent_scope(
|
|
1569
|
+
["windsurf"], {"only_agents": ["cursor"]}) == ["windsurf"]
|
|
1570
|
+
|
|
1571
|
+
def test_the_declaration_is_copied_not_aliased(self):
|
|
1572
|
+
# The caller's list must not become the lock's mutable state.
|
|
1573
|
+
asked = ["cursor"]
|
|
1574
|
+
got = store.declared_agent_scope(asked, None)
|
|
1575
|
+
asked.append("windsurf")
|
|
1576
|
+
assert got == ["cursor"]
|
|
1577
|
+
|
|
1578
|
+
|
|
1579
|
+
class TestScopedAgents:
|
|
1580
|
+
ENABLED: ClassVar[dict] = {"claude-code": Path("/a"), "cursor": Path("/b")}
|
|
1581
|
+
|
|
1582
|
+
def test_no_declaration_means_every_enabled_agent(self):
|
|
1583
|
+
assert store.scoped_agents({}, self.ENABLED) == self.ENABLED
|
|
1584
|
+
|
|
1585
|
+
def test_a_declaration_filters_to_it(self):
|
|
1586
|
+
assert store.scoped_agents({"only_agents": ["cursor"]}, self.ENABLED) \
|
|
1587
|
+
== {"cursor": Path("/b")}
|
|
1588
|
+
|
|
1589
|
+
def test_an_empty_declaration_fails_open(self):
|
|
1590
|
+
# Every entry written before this field existed reads as [] or absent.
|
|
1591
|
+
# Reading that as "link nowhere" would strand every existing install.
|
|
1592
|
+
assert store.scoped_agents({"only_agents": []}, self.ENABLED) == self.ENABLED
|
|
1593
|
+
|
|
1594
|
+
def test_a_declared_agent_that_is_not_enabled_is_not_invented(self):
|
|
1595
|
+
assert store.scoped_agents(
|
|
1596
|
+
{"only_agents": ["cursor", "zed"]}, self.ENABLED) == {"cursor": Path("/b")}
|
|
1597
|
+
|
|
1598
|
+
def test_the_enabled_mapping_is_not_mutated(self):
|
|
1599
|
+
enabled = dict(self.ENABLED)
|
|
1600
|
+
store.scoped_agents({"only_agents": ["cursor"]}, enabled)
|
|
1601
|
+
assert enabled == self.ENABLED
|
|
1602
|
+
|
|
1603
|
+
|
|
1604
|
+
class TestSyncRespectsDeclaredScope:
|
|
1605
|
+
"""`boost sync` was a second, independent path to the scope leak.
|
|
1606
|
+
|
|
1607
|
+
`preserved_agent_scope` (PR #288) closed the install side. sync_plan walked
|
|
1608
|
+
every enabled agent regardless, reported a missing_link for each one outside
|
|
1609
|
+
the narrowing, and sync_apply linked them — so a single `boost sync` undid
|
|
1610
|
+
what `install --agent` asked for.
|
|
1611
|
+
"""
|
|
1612
|
+
|
|
1613
|
+
def test_sync_does_not_report_links_outside_the_declared_scope(self, tap, entry):
|
|
1614
|
+
store.install(entry, only_agents=["claude-code"])
|
|
1615
|
+
assert store.sync_plan()["missing_links"] == []
|
|
1616
|
+
|
|
1617
|
+
def test_sync_does_not_relink_a_narrowed_skill(self, tap, entry):
|
|
1618
|
+
store.install(entry, only_agents=["claude-code"])
|
|
1619
|
+
store.sync_apply(store.sync_plan())
|
|
1620
|
+
assert _link("claude-code").is_symlink()
|
|
1621
|
+
for agent in ("windsurf", "cursor"):
|
|
1622
|
+
assert not _link(agent).exists(), agent
|
|
1623
|
+
|
|
1624
|
+
def test_a_dropped_link_inside_the_scope_is_still_repaired(self, tap, entry):
|
|
1625
|
+
# Narrowing must not turn sync off for the agents it does cover.
|
|
1626
|
+
store.install(entry, only_agents=["claude-code"])
|
|
1627
|
+
_link("claude-code").unlink()
|
|
1628
|
+
assert store.sync_plan()["missing_links"] == [("brainstorming", "claude-code")]
|
|
1629
|
+
store.sync_apply(store.sync_plan())
|
|
1630
|
+
assert _link("claude-code").is_symlink()
|
|
1631
|
+
|
|
1632
|
+
def test_an_unnarrowed_skill_still_reaches_a_newly_enabled_agent(self,
|
|
1633
|
+
brainstorming):
|
|
1634
|
+
# sync's other job. An entry with no declaration must keep fanning out,
|
|
1635
|
+
# which is why scoped_agents fails open rather than closed.
|
|
1636
|
+
_link("cursor").unlink()
|
|
1637
|
+
assert store.sync_plan()["missing_links"] == [("brainstorming", "cursor")]
|
|
1638
|
+
|
|
1639
|
+
def test_a_pre_existing_lock_entry_is_unaffected(self, brainstorming):
|
|
1640
|
+
# Locks written before `only_agents` existed have no such key at all.
|
|
1641
|
+
e = lockfile.get_skill("brainstorming")
|
|
1642
|
+
assert "only_agents" in e # new installs record it (as None)
|
|
1643
|
+
del e["only_agents"]
|
|
1644
|
+
lockfile.set_skill("brainstorming", e)
|
|
1645
|
+
for agent in AGENT_DIRS:
|
|
1646
|
+
_link(agent).unlink()
|
|
1647
|
+
assert sorted(store.sync_plan()["missing_links"]) == [
|
|
1648
|
+
("brainstorming", "claude-code"), ("brainstorming", "cursor"),
|
|
1649
|
+
("brainstorming", "windsurf")]
|
|
1650
|
+
|
|
1651
|
+
def test_the_declaration_is_written_to_the_lock(self, tap, entry):
|
|
1652
|
+
store.install(entry, only_agents=["claude-code"])
|
|
1653
|
+
assert lockfile.get_skill("brainstorming")["only_agents"] == ["claude-code"]
|
|
1654
|
+
|
|
1655
|
+
def test_an_unnarrowed_install_records_no_declaration(self, brainstorming):
|
|
1656
|
+
assert lockfile.get_skill("brainstorming")["only_agents"] is None
|
|
1657
|
+
|
|
1658
|
+
def test_a_forced_reinstall_keeps_the_declaration(self, tap, entry):
|
|
1659
|
+
store.install(entry, only_agents=["claude-code"])
|
|
1660
|
+
store.install(entry, force=True)
|
|
1661
|
+
assert lockfile.get_skill("brainstorming")["only_agents"] == ["claude-code"]
|
|
1662
|
+
assert store.sync_plan()["missing_links"] == []
|
|
1663
|
+
|
|
1664
|
+
def test_import_from_path_records_its_narrowing(self, sandbox, tmp_path):
|
|
1665
|
+
# `boost import --agent ...` is a second entry point to the same lock
|
|
1666
|
+
# entry. Narrow links plus no declaration is the worst combination:
|
|
1667
|
+
# sync sees no scope and widens them straight back.
|
|
1668
|
+
src = tmp_path / "mine"
|
|
1669
|
+
src.mkdir()
|
|
1670
|
+
(src / "SKILL.md").write_text(
|
|
1671
|
+
"---\nname: mine\ndescription: d\nversion: 1.0.0\n---\nbody\n",
|
|
1672
|
+
encoding="utf-8")
|
|
1673
|
+
store.install_from_path(src, only_agents=["claude-code"])
|
|
1674
|
+
assert lockfile.get_skill("mine")["only_agents"] == ["claude-code"]
|
|
1675
|
+
assert store.sync_plan()["missing_links"] == []
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_skill_cli.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{boost_skill_cli-1.0.267 → boost_skill_cli-1.0.268}/boost_skill_cli.egg-info/entry_points.txt
RENAMED
|
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
|