boost-skill-cli 1.0.148__tar.gz → 1.0.149__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.148 → boost_skill_cli-1.0.149}/Makefile +19 -1
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/PKG-INFO +5 -1
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_skill_cli.egg-info/PKG-INFO +5 -1
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_skill_cli.egg-info/SOURCES.txt +18 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_skill_cli.egg-info/requires.txt +6 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/pyproject.toml +10 -0
- boost_skill_cli-1.0.149/scripts/bench_cli.sh +27 -0
- boost_skill_cli-1.0.149/tests/bdd/features/adapt.feature +46 -0
- boost_skill_cli-1.0.149/tests/bdd/features/browse.feature +26 -0
- boost_skill_cli-1.0.149/tests/bdd/features/count.feature +24 -0
- boost_skill_cli-1.0.149/tests/bdd/features/discover.feature +39 -0
- boost_skill_cli-1.0.149/tests/bdd/features/doctor.feature +30 -0
- boost_skill_cli-1.0.149/tests/bdd/features/environment.py +66 -0
- boost_skill_cli-1.0.149/tests/bdd/features/explain.feature +25 -0
- boost_skill_cli-1.0.149/tests/bdd/features/index.feature +25 -0
- boost_skill_cli-1.0.149/tests/bdd/features/install.feature +43 -0
- boost_skill_cli-1.0.149/tests/bdd/features/list.feature +42 -0
- boost_skill_cli-1.0.149/tests/bdd/features/mcp.feature +31 -0
- boost_skill_cli-1.0.149/tests/bdd/features/search.feature +37 -0
- boost_skill_cli-1.0.149/tests/bdd/features/steps/cli_steps.py +104 -0
- boost_skill_cli-1.0.149/tests/bdd/features/steps/discovery_steps.py +77 -0
- boost_skill_cli-1.0.149/tests/bdd/features/steps/mcp_steps.py +48 -0
- boost_skill_cli-1.0.149/tests/bdd/features/steps/quality_steps.py +12 -0
- boost_skill_cli-1.0.149/tests/perf/test_benchmarks.py +59 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/.gitattributes +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/.gitignore +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/LICENSE +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/README.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/index.html +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/docs/roadmap.html +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/examples/README.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/index.html +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/setup.cfg +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/style/README.md +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/style/boost.css +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/style/boost.js +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/style/demo.html +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.148 → boost_skill_cli-1.0.149}/tests/unit/test_workflows.py +0 -0
|
@@ -10,7 +10,7 @@ PYTEST := $(VENV)/bin/pytest
|
|
|
10
10
|
# pinned taps out of the developer's real ~/.boost.
|
|
11
11
|
EVAL_HOME := $(CURDIR)/.eval-home
|
|
12
12
|
|
|
13
|
-
.PHONY: venv test unit functional smoke coverage mutation lint check demo clean-test eval eval-ai eval-rec eval-stats eval-explain audit dist-check
|
|
13
|
+
.PHONY: venv test unit functional smoke coverage mutation lint check demo clean-test eval eval-ai eval-rec eval-stats eval-explain audit dist-check bdd bench bench-cli
|
|
14
14
|
|
|
15
15
|
venv:
|
|
16
16
|
python3 -m venv $(VENV)
|
|
@@ -96,6 +96,24 @@ eval-explain:
|
|
|
96
96
|
PYTHON=$(PY) BOOST_HOME=$(EVAL_HOME) bash scripts/ensure_eval_corpus.sh
|
|
97
97
|
BOOST_HOME=$(EVAL_HOME) $(PY) scripts/eval_explain.py --fail-under 0.80
|
|
98
98
|
|
|
99
|
+
# Opt-in Gherkin/BDD suite (tests/bdd) — additive to tests/functional, not a
|
|
100
|
+
# replacement. Needs the [bdd] extra (`pip install -e '.[bdd]'`); not part of
|
|
101
|
+
# `make check`.
|
|
102
|
+
bdd:
|
|
103
|
+
$(VENV)/bin/behave tests/bdd/features
|
|
104
|
+
|
|
105
|
+
# Opt-in micro-benchmarks (tests/perf) for perf-sensitive core paths. Needs
|
|
106
|
+
# the [perf] extra (`pip install -e '.[perf]'`); not part of `make check` — a
|
|
107
|
+
# timing regression is informational, not a merge gate.
|
|
108
|
+
bench:
|
|
109
|
+
$(PYTEST) tests/perf --benchmark-only -q
|
|
110
|
+
|
|
111
|
+
# Opt-in wall-clock benchmark of the real `boost` binary via hyperfine. Not
|
|
112
|
+
# part of `make check`; degrades cleanly (prints a skip message, exits 0) when
|
|
113
|
+
# hyperfine isn't installed (`brew install hyperfine`).
|
|
114
|
+
bench-cli:
|
|
115
|
+
@command -v hyperfine >/dev/null 2>&1 && bash scripts/bench_cli.sh || echo "hyperfine not on PATH — install via 'brew install hyperfine', skipping"
|
|
116
|
+
|
|
99
117
|
# regenerate generated artifacts from their source (registries + roadmap boards)
|
|
100
118
|
generate:
|
|
101
119
|
$(PY) scripts/build_registries.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.149
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -708,6 +708,10 @@ Requires-Dist: ragas<0.3,>=0.2; extra == "eval"
|
|
|
708
708
|
Requires-Dist: langchain-core<0.4; extra == "eval"
|
|
709
709
|
Requires-Dist: langchain-community<0.4; extra == "eval"
|
|
710
710
|
Requires-Dist: langchain-openai<1; extra == "eval"
|
|
711
|
+
Provides-Extra: bdd
|
|
712
|
+
Requires-Dist: behave>=1.2.6; extra == "bdd"
|
|
713
|
+
Provides-Extra: perf
|
|
714
|
+
Requires-Dist: pytest-benchmark>=4.0; extra == "perf"
|
|
711
715
|
Dynamic: license-file
|
|
712
716
|
|
|
713
717
|
# boost — a package manager for AI coding skills
|
|
@@ -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.149'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 149)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.149
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -708,6 +708,10 @@ Requires-Dist: ragas<0.3,>=0.2; extra == "eval"
|
|
|
708
708
|
Requires-Dist: langchain-core<0.4; extra == "eval"
|
|
709
709
|
Requires-Dist: langchain-community<0.4; extra == "eval"
|
|
710
710
|
Requires-Dist: langchain-openai<1; extra == "eval"
|
|
711
|
+
Provides-Extra: bdd
|
|
712
|
+
Requires-Dist: behave>=1.2.6; extra == "bdd"
|
|
713
|
+
Provides-Extra: perf
|
|
714
|
+
Requires-Dist: pytest-benchmark>=4.0; extra == "perf"
|
|
711
715
|
Dynamic: license-file
|
|
712
716
|
|
|
713
717
|
# boost — a package manager for AI coding skills
|
|
@@ -217,6 +217,7 @@ docs/roadmap/items/workspace-scope-install.md
|
|
|
217
217
|
examples/README.md
|
|
218
218
|
examples/adapt-demo.sh
|
|
219
219
|
examples/boost-run-prototype.sh
|
|
220
|
+
scripts/bench_cli.sh
|
|
220
221
|
scripts/build_registries.py
|
|
221
222
|
scripts/build_roadmap.py
|
|
222
223
|
scripts/ensure_eval_corpus.sh
|
|
@@ -231,6 +232,22 @@ style/demo.html
|
|
|
231
232
|
tests/conftest.py
|
|
232
233
|
tests/make_fixture.py
|
|
233
234
|
tests/smoke.sh
|
|
235
|
+
tests/bdd/features/adapt.feature
|
|
236
|
+
tests/bdd/features/browse.feature
|
|
237
|
+
tests/bdd/features/count.feature
|
|
238
|
+
tests/bdd/features/discover.feature
|
|
239
|
+
tests/bdd/features/doctor.feature
|
|
240
|
+
tests/bdd/features/environment.py
|
|
241
|
+
tests/bdd/features/explain.feature
|
|
242
|
+
tests/bdd/features/index.feature
|
|
243
|
+
tests/bdd/features/install.feature
|
|
244
|
+
tests/bdd/features/list.feature
|
|
245
|
+
tests/bdd/features/mcp.feature
|
|
246
|
+
tests/bdd/features/search.feature
|
|
247
|
+
tests/bdd/features/steps/cli_steps.py
|
|
248
|
+
tests/bdd/features/steps/discovery_steps.py
|
|
249
|
+
tests/bdd/features/steps/mcp_steps.py
|
|
250
|
+
tests/bdd/features/steps/quality_steps.py
|
|
234
251
|
tests/eval/baseline.json
|
|
235
252
|
tests/eval/explain.jsonl
|
|
236
253
|
tests/eval/golden.jsonl
|
|
@@ -249,6 +266,7 @@ tests/functional/test_cli_taps.py
|
|
|
249
266
|
tests/functional/test_cli_team.py
|
|
250
267
|
tests/functional/test_everyday_loop.py
|
|
251
268
|
tests/functional/test_property_parsers.py
|
|
269
|
+
tests/perf/test_benchmarks.py
|
|
252
270
|
tests/unit/test_adapters.py
|
|
253
271
|
tests/unit/test_agents.py
|
|
254
272
|
tests/unit/test_ai.py
|
|
@@ -55,6 +55,16 @@ eval = [
|
|
|
55
55
|
"langchain-community<0.4",
|
|
56
56
|
"langchain-openai<1",
|
|
57
57
|
]
|
|
58
|
+
# Opt-in Gherkin/BDD functional suite (tests/bdd) — reusable Given/When/Then
|
|
59
|
+
# scenarios over the same in-process CLI entrypoint tests/functional drives.
|
|
60
|
+
# Additive to, not a replacement for, the pytest functional suite; not part of
|
|
61
|
+
# `make check`. `pip install -e '.[bdd]'`.
|
|
62
|
+
bdd = ["behave>=1.2.6"]
|
|
63
|
+
# Opt-in micro-benchmarks (tests/perf, `make bench`) for perf-sensitive core
|
|
64
|
+
# paths (BM25 indexing/search, catalog scan). Not part of `make check` — a
|
|
65
|
+
# timing regression shouldn't block a merge the way a correctness gate does.
|
|
66
|
+
# `pip install -e '.[perf]'`.
|
|
67
|
+
perf = ["pytest-benchmark>=4.0"]
|
|
58
68
|
|
|
59
69
|
[project.scripts]
|
|
60
70
|
boost = "boost_cli.cli:main"
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Wall-clock benchmark of the real `boost` binary via hyperfine — the actual
|
|
3
|
+
# fork+exec CLI, not the in-process pytest-benchmark suite (tests/perf).
|
|
4
|
+
# Opt-in (`make bench-cli`); not part of `make check`. Degrades cleanly if
|
|
5
|
+
# hyperfine isn't installed.
|
|
6
|
+
set -uo pipefail
|
|
7
|
+
|
|
8
|
+
if ! command -v hyperfine >/dev/null 2>&1; then
|
|
9
|
+
echo "hyperfine not installed — install via 'brew install hyperfine', skipping"
|
|
10
|
+
exit 0
|
|
11
|
+
fi
|
|
12
|
+
|
|
13
|
+
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
14
|
+
SB="$(mktemp -d "${TMPDIR:-/tmp}/boost-bench-XXXXXX")"
|
|
15
|
+
trap 'rm -rf "$SB"' EXIT
|
|
16
|
+
export HOME="$SB" BOOST_NO_AI=1 BOOST_ASSUME_YES=1 NO_COLOR=1
|
|
17
|
+
|
|
18
|
+
FIX="$(python3 "$ROOT/tests/make_fixture.py" "$SB/fixture-tap")"
|
|
19
|
+
"$ROOT/boost" tap "$FIX" >/dev/null
|
|
20
|
+
"$ROOT/boost" install brainstorming >/dev/null
|
|
21
|
+
|
|
22
|
+
echo "== hyperfine: $(command -v hyperfine) over $ROOT/boost (sandbox: $SB)"
|
|
23
|
+
hyperfine --warmup 3 \
|
|
24
|
+
"$ROOT/boost --help" \
|
|
25
|
+
"$ROOT/boost list" \
|
|
26
|
+
"$ROOT/boost search brainstorming" \
|
|
27
|
+
"$ROOT/boost count"
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
Feature: boost adapt
|
|
2
|
+
Render a skill as another agent framework's native source (CrewAI, Agents SDK).
|
|
3
|
+
|
|
4
|
+
Background:
|
|
5
|
+
Given a fresh boost environment
|
|
6
|
+
And the fixture tap is added
|
|
7
|
+
|
|
8
|
+
Scenario: adapting an installed skill to CrewAI
|
|
9
|
+
Given the "brainstorming" skill is installed
|
|
10
|
+
When I run "boost adapt brainstorming --to crewai"
|
|
11
|
+
Then the exit code should be 0
|
|
12
|
+
And the output should contain "from crewai import Agent"
|
|
13
|
+
And the output should contain "brainstorming = Agent("
|
|
14
|
+
|
|
15
|
+
Scenario: adapting an installed skill to the Agents SDK
|
|
16
|
+
Given the "brainstorming" skill is installed
|
|
17
|
+
When I run "boost adapt brainstorming --to agents-sdk"
|
|
18
|
+
Then the exit code should be 0
|
|
19
|
+
And the output should contain "from agents import Agent"
|
|
20
|
+
And the output should match "name=\"brainstorming\""
|
|
21
|
+
|
|
22
|
+
Scenario: adapting a tapped-but-not-installed skill still resolves
|
|
23
|
+
When I run "boost adapt brainstorming --to crewai"
|
|
24
|
+
Then the exit code should be 0
|
|
25
|
+
And the output should contain "brainstorming = Agent("
|
|
26
|
+
|
|
27
|
+
Scenario: --model none opts out of pinning an LLM
|
|
28
|
+
Given the "brainstorming" skill is installed
|
|
29
|
+
When I run "boost adapt brainstorming --to crewai --model none"
|
|
30
|
+
Then the exit code should be 0
|
|
31
|
+
And the output should not contain "llm="
|
|
32
|
+
|
|
33
|
+
Scenario: an unknown framework is rejected
|
|
34
|
+
Given the "brainstorming" skill is installed
|
|
35
|
+
When I run "boost adapt brainstorming --to langchain"
|
|
36
|
+
Then the exit code should be 1
|
|
37
|
+
And the output should contain "unknown framework"
|
|
38
|
+
|
|
39
|
+
Scenario: --to is required
|
|
40
|
+
Given the "brainstorming" skill is installed
|
|
41
|
+
When I run "boost adapt brainstorming"
|
|
42
|
+
Then the exit code should be 2
|
|
43
|
+
|
|
44
|
+
Scenario: adapting an unknown skill fails
|
|
45
|
+
When I run "boost adapt does-not-exist --to crewai"
|
|
46
|
+
Then the exit code should be 1
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
Feature: boost browse
|
|
2
|
+
Interactive full-screen TUI with fuzzy search. There is no TTY in these
|
|
3
|
+
scenarios, so `browse` takes its documented non-interactive escape hatch
|
|
4
|
+
and prints the full catalog instead of launching curses.
|
|
5
|
+
|
|
6
|
+
Background:
|
|
7
|
+
Given a fresh boost environment
|
|
8
|
+
|
|
9
|
+
Scenario: no skills available to browse
|
|
10
|
+
When I run "boost browse"
|
|
11
|
+
Then the exit code should be 1
|
|
12
|
+
And the output should contain "no skills available to browse"
|
|
13
|
+
|
|
14
|
+
Scenario: without a TTY, prints the full catalog instead of the TUI
|
|
15
|
+
Given the fixture tap is added
|
|
16
|
+
When I run "boost browse"
|
|
17
|
+
Then the exit code should be 0
|
|
18
|
+
And the output should contain "interactive mode needs a TTY — showing the full catalog"
|
|
19
|
+
And the output should contain "brainstorming"
|
|
20
|
+
And the output should contain "commit-messages"
|
|
21
|
+
And the output should contain "5 skills · install with `boost install <name>`"
|
|
22
|
+
|
|
23
|
+
Scenario: --help documents the command without touching the catalog
|
|
24
|
+
When I run "boost browse --help"
|
|
25
|
+
Then the exit code should be 0
|
|
26
|
+
And the output should contain "Interactive full-screen TUI with fuzzy search"
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
Feature: boost count
|
|
2
|
+
A one-line inventory summary: installed / available / taps / discovery index.
|
|
3
|
+
|
|
4
|
+
Background:
|
|
5
|
+
Given a fresh boost environment
|
|
6
|
+
|
|
7
|
+
Scenario: an empty environment
|
|
8
|
+
When I run "boost count"
|
|
9
|
+
Then the exit code should be 0
|
|
10
|
+
And the output should contain "installed 0 · available 0 (across 0 taps) · discovery index not built"
|
|
11
|
+
|
|
12
|
+
Scenario: one tap with one installed skill
|
|
13
|
+
Given the "brainstorming" skill is installed
|
|
14
|
+
When I run "boost count"
|
|
15
|
+
Then the exit code should be 0
|
|
16
|
+
And the output should contain "installed 1 · available 5 (across 1 tap) · discovery index not built"
|
|
17
|
+
And the output should contain "╭─ inventory"
|
|
18
|
+
|
|
19
|
+
Scenario: --json is machine readable
|
|
20
|
+
Given the "brainstorming" skill is installed
|
|
21
|
+
When I run "boost count --json"
|
|
22
|
+
Then the exit code should be 0
|
|
23
|
+
And the output should match "\"installed\": 1"
|
|
24
|
+
And the output should match "\"taps\": 1"
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
Feature: boost discover
|
|
2
|
+
Browse and filter the GitHub-wide discovery index built by `boost index`.
|
|
3
|
+
|
|
4
|
+
Background:
|
|
5
|
+
Given a fresh boost environment
|
|
6
|
+
|
|
7
|
+
Scenario: without an index and without gh, hints to install gh
|
|
8
|
+
Given the GitHub CLI is not installed
|
|
9
|
+
When I run "boost discover"
|
|
10
|
+
Then the exit code should be 0
|
|
11
|
+
And the output should contain "the discovery index has not been built yet"
|
|
12
|
+
And the output should contain "install the GitHub CLI first"
|
|
13
|
+
|
|
14
|
+
Scenario: without an index but with gh, hints to run boost index
|
|
15
|
+
Given the GitHub CLI is installed and code search returns 2 sample skill files
|
|
16
|
+
When I run "boost discover"
|
|
17
|
+
Then the exit code should be 0
|
|
18
|
+
And the output should contain "build it with `boost index` (GitHub Code Search)"
|
|
19
|
+
|
|
20
|
+
Scenario: a query filters indexed entries
|
|
21
|
+
Given the discovery index is seeded with sample items
|
|
22
|
+
When I run "boost discover acme"
|
|
23
|
+
Then the exit code should be 0
|
|
24
|
+
And the output should contain "skills/web/SKILL.md"
|
|
25
|
+
And the output should not contain "octo/skills"
|
|
26
|
+
And the output should contain "2 of 3 indexed skills · GitHub reports ~42 total"
|
|
27
|
+
|
|
28
|
+
Scenario: a query with no matches reports the index size
|
|
29
|
+
Given the discovery index is seeded with sample items
|
|
30
|
+
When I run "boost discover zzz"
|
|
31
|
+
Then the exit code should be 0
|
|
32
|
+
And the output should contain "no indexed skills match 'zzz'"
|
|
33
|
+
And the output should contain "the index holds 3 entries — rebuild with `boost index`"
|
|
34
|
+
|
|
35
|
+
Scenario: a corrupt index fails cleanly
|
|
36
|
+
Given the discovery index is corrupt
|
|
37
|
+
When I run "boost discover"
|
|
38
|
+
Then the exit code should be 1
|
|
39
|
+
And the output should contain "the discovery index is corrupt"
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
Feature: boost doctor
|
|
2
|
+
Check installation health and report issues.
|
|
3
|
+
|
|
4
|
+
Background:
|
|
5
|
+
Given a fresh boost environment
|
|
6
|
+
|
|
7
|
+
Scenario: an empty environment is healthy
|
|
8
|
+
When I run "boost doctor"
|
|
9
|
+
Then the exit code should be 0
|
|
10
|
+
And the output should contain "boost doctor"
|
|
11
|
+
And the output should contain "no taps configured — add one with `boost tap owner/repo`"
|
|
12
|
+
And the output should contain "0 skills installed · 0 taps synced · 0 broken links"
|
|
13
|
+
|
|
14
|
+
Scenario: a healthy environment with installed skills
|
|
15
|
+
Given the "brainstorming" skill is installed
|
|
16
|
+
When I run "boost doctor"
|
|
17
|
+
Then the exit code should be 0
|
|
18
|
+
And the output should contain "git on PATH"
|
|
19
|
+
And the output should contain "1 tap cloned & cached"
|
|
20
|
+
And the output should contain "1 skill installed · 1 tap synced · 0 broken links"
|
|
21
|
+
And the output should contain "● healthy"
|
|
22
|
+
|
|
23
|
+
Scenario: a broken symlink is reported and flips the verdict
|
|
24
|
+
Given the "brainstorming" skill is installed
|
|
25
|
+
And a broken skill symlink exists
|
|
26
|
+
When I run "boost doctor"
|
|
27
|
+
Then the exit code should be 1
|
|
28
|
+
And the output should contain "1 broken symlink in agent dirs — run `boost heal`"
|
|
29
|
+
And the output should contain "need attention"
|
|
30
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""behave hooks — mirrors tests/conftest.py's sandboxing for BDD scenarios.
|
|
2
|
+
|
|
3
|
+
Every scenario runs against a throwaway $HOME (never the real one) and shares
|
|
4
|
+
one fixture tap built once per run via tests/make_fixture.py.
|
|
5
|
+
"""
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import os
|
|
9
|
+
import shutil
|
|
10
|
+
import subprocess
|
|
11
|
+
import sys
|
|
12
|
+
import tempfile
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
ROOT = Path(__file__).resolve().parents[3]
|
|
16
|
+
if str(ROOT) not in sys.path:
|
|
17
|
+
sys.path.insert(0, str(ROOT))
|
|
18
|
+
|
|
19
|
+
_SANDBOX_ENV = ("BOOST_HOME", "BOOST_AGENTS_STORE", "BOOST_DEBUG",
|
|
20
|
+
"BOOST_LOG_LEVEL", "BOOST_NO_LOG", "VOYAGE_API_KEY",
|
|
21
|
+
"OPENAI_API_KEY", "BOOST_NO_EMBED")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def before_all(context):
|
|
25
|
+
context._run_dir = Path(tempfile.mkdtemp(prefix="boost-bdd-"))
|
|
26
|
+
dest = context._run_dir / "fixture-tap"
|
|
27
|
+
subprocess.run(
|
|
28
|
+
[sys.executable, str(ROOT / "tests" / "make_fixture.py"), str(dest)],
|
|
29
|
+
check=True, capture_output=True)
|
|
30
|
+
context.fixture_tap_src = dest
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
_scenario_counter = [0]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def before_scenario(context, scenario):
|
|
37
|
+
context._saved_env = dict(os.environ)
|
|
38
|
+
_scenario_counter[0] += 1
|
|
39
|
+
home = context._run_dir / ("home-%d" % _scenario_counter[0])
|
|
40
|
+
home.mkdir(parents=True, exist_ok=True)
|
|
41
|
+
os.environ["HOME"] = str(home)
|
|
42
|
+
for var in _SANDBOX_ENV:
|
|
43
|
+
os.environ.pop(var, None)
|
|
44
|
+
os.environ["BOOST_NO_AI"] = "1" # deterministic: no AI calls
|
|
45
|
+
os.environ["NO_COLOR"] = "1" # plain output for assertions
|
|
46
|
+
os.environ["BOOST_ASSUME_YES"] = "1" # never block on confirm()
|
|
47
|
+
context._home = home
|
|
48
|
+
context._tapped = False
|
|
49
|
+
context._patchers = []
|
|
50
|
+
|
|
51
|
+
from boost_cli.core import logs
|
|
52
|
+
logs.reset()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def after_scenario(context, scenario):
|
|
56
|
+
for patcher in reversed(context._patchers):
|
|
57
|
+
patcher.stop()
|
|
58
|
+
context._patchers = []
|
|
59
|
+
from boost_cli.core import logs
|
|
60
|
+
logs.reset()
|
|
61
|
+
os.environ.clear()
|
|
62
|
+
os.environ.update(context._saved_env)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def after_all(context):
|
|
66
|
+
shutil.rmtree(context._run_dir, ignore_errors=True)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Feature: boost explain
|
|
2
|
+
Explain what a skill does in plain English (falls back to a heuristic
|
|
3
|
+
summary when AI is unavailable — the sandbox always sets BOOST_NO_AI=1).
|
|
4
|
+
|
|
5
|
+
Background:
|
|
6
|
+
Given a fresh boost environment
|
|
7
|
+
And the fixture tap is added
|
|
8
|
+
|
|
9
|
+
Scenario: explaining an installed skill without AI uses the heuristic fallback
|
|
10
|
+
Given the "brainstorming" skill is installed
|
|
11
|
+
When I run "boost explain brainstorming"
|
|
12
|
+
Then the exit code should be 0
|
|
13
|
+
And the output should contain "using the heuristic fallback"
|
|
14
|
+
And the output should contain "Outline:"
|
|
15
|
+
And the output should contain "Key rules:"
|
|
16
|
+
|
|
17
|
+
Scenario: explaining a skill that is only in a tap (not installed)
|
|
18
|
+
When I run "boost explain jira-integration"
|
|
19
|
+
Then the exit code should be 0
|
|
20
|
+
And the output should contain "using the heuristic fallback"
|
|
21
|
+
|
|
22
|
+
Scenario: explaining an unknown skill fails
|
|
23
|
+
When I run "boost explain does-not-exist"
|
|
24
|
+
Then the exit code should be 1
|
|
25
|
+
And the output should contain "no skill named 'does-not-exist' in any tap"
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Feature: boost index
|
|
2
|
+
Build the discovery registry via GitHub Code Search. `gh` is always
|
|
3
|
+
mocked in these scenarios — no real network call.
|
|
4
|
+
|
|
5
|
+
Background:
|
|
6
|
+
Given a fresh boost environment
|
|
7
|
+
|
|
8
|
+
Scenario: requires the GitHub CLI
|
|
9
|
+
Given the GitHub CLI is not installed
|
|
10
|
+
When I run "boost index"
|
|
11
|
+
Then the exit code should be 1
|
|
12
|
+
And the output should contain "the GitHub CLI (gh) is required to build the index"
|
|
13
|
+
And the output should contain "brew install gh"
|
|
14
|
+
|
|
15
|
+
Scenario: builds the cache from gh's JSON output
|
|
16
|
+
Given the GitHub CLI is installed and code search returns 2 sample skill files
|
|
17
|
+
When I run "boost index --limit 100"
|
|
18
|
+
Then the exit code should be 0
|
|
19
|
+
And the output should contain "indexed 2 skill files across 2 repos (GitHub reports 7 total)"
|
|
20
|
+
|
|
21
|
+
Scenario: a gh failure on the first page aborts with an error
|
|
22
|
+
Given the GitHub CLI is installed but code search fails
|
|
23
|
+
When I run "boost index --limit 50"
|
|
24
|
+
Then the exit code should be 1
|
|
25
|
+
And the output should contain "GitHub code search failed"
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
Feature: boost install
|
|
2
|
+
Install a skill from a tap registry into the local store and link it into
|
|
3
|
+
every enabled agent.
|
|
4
|
+
|
|
5
|
+
Background:
|
|
6
|
+
Given a fresh boost environment
|
|
7
|
+
And the fixture tap is added
|
|
8
|
+
|
|
9
|
+
Scenario: installing a known skill links it into every agent
|
|
10
|
+
When I run "boost install brainstorming"
|
|
11
|
+
Then the exit code should be 0
|
|
12
|
+
And the output should contain "copied to ~/.agents/skills/brainstorming"
|
|
13
|
+
And the output should contain "linked → claude-code · windsurf · cursor"
|
|
14
|
+
And the output should contain "Installed 1 new skill; quality score 95/100"
|
|
15
|
+
And the output should contain "next: boost info brainstorming"
|
|
16
|
+
|
|
17
|
+
Scenario: --dry-run changes nothing on disk
|
|
18
|
+
When I run "boost install brainstorming --dry-run"
|
|
19
|
+
Then the exit code should be 0
|
|
20
|
+
And the output should contain "would install brainstorming v1.4.0 from fixture-tap"
|
|
21
|
+
And the output should contain "dry run — nothing was changed"
|
|
22
|
+
|
|
23
|
+
Scenario: --agent restricts linking to a single agent
|
|
24
|
+
When I run "boost install brainstorming --agent claude-code"
|
|
25
|
+
Then the exit code should be 0
|
|
26
|
+
And the output should contain "linked → claude-code"
|
|
27
|
+
And the output should not contain "windsurf"
|
|
28
|
+
|
|
29
|
+
Scenario: an unknown agent is rejected
|
|
30
|
+
When I run "boost install brainstorming --agent emacs"
|
|
31
|
+
Then the exit code should be 1
|
|
32
|
+
And the output should contain "unknown agent: emacs"
|
|
33
|
+
|
|
34
|
+
Scenario: installing an unknown skill fails with a hint
|
|
35
|
+
When I run "boost install does-not-exist"
|
|
36
|
+
Then the exit code should be 1
|
|
37
|
+
And the output should contain "no skill named 'does-not-exist' in any tap"
|
|
38
|
+
|
|
39
|
+
Scenario: a mix of known and unknown skills installs the known ones
|
|
40
|
+
When I run "boost install brainstorming nope"
|
|
41
|
+
Then the exit code should be 1
|
|
42
|
+
And the output should contain "nope: no skill named 'nope' in any tap"
|
|
43
|
+
And the output should contain "Installed 1 new skill; quality score 95/100"
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
Feature: boost list
|
|
2
|
+
List installed skills, rules, and workflows.
|
|
3
|
+
|
|
4
|
+
Background:
|
|
5
|
+
Given a fresh boost environment
|
|
6
|
+
|
|
7
|
+
Scenario: no skills installed shows an empty state
|
|
8
|
+
When I run "boost list"
|
|
9
|
+
Then the exit code should be 0
|
|
10
|
+
And the output should contain "no skills installed"
|
|
11
|
+
And the output should contain "boost tap --defaults"
|
|
12
|
+
|
|
13
|
+
Scenario: an installed skill is listed with its version and tap
|
|
14
|
+
Given the "brainstorming" skill is installed
|
|
15
|
+
When I run "boost list"
|
|
16
|
+
Then the exit code should be 0
|
|
17
|
+
And the output should contain "installed skills"
|
|
18
|
+
And the output should contain "brainstorming"
|
|
19
|
+
And the output should contain "1.4.0"
|
|
20
|
+
And the output should contain "fixture-tap"
|
|
21
|
+
And the output should contain "1 skill installed"
|
|
22
|
+
|
|
23
|
+
Scenario: --json is machine readable
|
|
24
|
+
Given the "brainstorming" skill is installed
|
|
25
|
+
When I run "boost list --json"
|
|
26
|
+
Then the exit code should be 0
|
|
27
|
+
And the output should match "\"brainstorming\""
|
|
28
|
+
And the output should match "\"skills\""
|
|
29
|
+
|
|
30
|
+
Scenario: --tag narrows the listing to custom-tagged skills
|
|
31
|
+
Given the "brainstorming" skill is installed
|
|
32
|
+
When I run "boost tag brainstorming +fav"
|
|
33
|
+
And I run "boost list --tag fav"
|
|
34
|
+
Then the exit code should be 0
|
|
35
|
+
And the output should contain "brainstorming"
|
|
36
|
+
And the output should contain "#fav"
|
|
37
|
+
|
|
38
|
+
Scenario: --tag with no matching skills shows the tagged empty state
|
|
39
|
+
Given the "brainstorming" skill is installed
|
|
40
|
+
When I run "boost list --tag nope-tag"
|
|
41
|
+
Then the exit code should be 0
|
|
42
|
+
And the output should contain "no skills installed with tag #nope-tag"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
Feature: boost mcp
|
|
2
|
+
Register boost as an MCP server for Claude Code. Never shells out to a real
|
|
3
|
+
`claude` CLI in these scenarios — shutil.which/subprocess.run are mocked.
|
|
4
|
+
|
|
5
|
+
Background:
|
|
6
|
+
Given a fresh boost environment
|
|
7
|
+
|
|
8
|
+
Scenario: registering without the claude CLI prints the manual command
|
|
9
|
+
Given the "claude" CLI is not on PATH
|
|
10
|
+
When I run "boost mcp register"
|
|
11
|
+
Then the exit code should be 0
|
|
12
|
+
And the output should contain "`claude` CLI not found — run this yourself:"
|
|
13
|
+
And the output should contain "claude mcp add boost --scope user"
|
|
14
|
+
|
|
15
|
+
Scenario: registering with the claude CLI present succeeds
|
|
16
|
+
Given the "claude" CLI is on PATH and succeeds
|
|
17
|
+
When I run "boost mcp register"
|
|
18
|
+
Then the exit code should be 0
|
|
19
|
+
And the output should contain "registered boost as an MCP server (scope: user)"
|
|
20
|
+
|
|
21
|
+
Scenario: a claude mcp add failure surfaces the error
|
|
22
|
+
Given the "claude" CLI is on PATH but fails with "no auth"
|
|
23
|
+
When I run "boost mcp register"
|
|
24
|
+
Then the exit code should be 1
|
|
25
|
+
And the output should contain "claude mcp register failed: no auth"
|
|
26
|
+
|
|
27
|
+
Scenario: unregistering without the claude CLI prints the manual command
|
|
28
|
+
Given the "claude" CLI is not on PATH
|
|
29
|
+
When I run "boost mcp unregister"
|
|
30
|
+
Then the exit code should be 0
|
|
31
|
+
And the output should contain "claude mcp remove boost"
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
Feature: boost search
|
|
2
|
+
Search skills across tap registries, ranked by full-content BM25.
|
|
3
|
+
|
|
4
|
+
Background:
|
|
5
|
+
Given a fresh boost environment
|
|
6
|
+
|
|
7
|
+
Scenario: no taps configured fails with a hint
|
|
8
|
+
When I run "boost search anything"
|
|
9
|
+
Then the exit code should be 1
|
|
10
|
+
And the output should contain "no taps configured — nothing to search"
|
|
11
|
+
And the output should contain "boost tap --defaults"
|
|
12
|
+
|
|
13
|
+
Scenario: multi-word query ranks the exact match first
|
|
14
|
+
Given the fixture tap is added
|
|
15
|
+
When I run "boost search commit messages"
|
|
16
|
+
Then the exit code should be 0
|
|
17
|
+
And the output should contain "commit-messages"
|
|
18
|
+
And the output should contain "ranked by full-content BM25"
|
|
19
|
+
|
|
20
|
+
Scenario: no matches hints at discover
|
|
21
|
+
Given the fixture tap is added
|
|
22
|
+
When I run "boost search zzzznothing"
|
|
23
|
+
Then the exit code should be 0
|
|
24
|
+
And the output should contain "no matches for 'zzzznothing'"
|
|
25
|
+
And the output should contain "try `boost discover zzzznothing`"
|
|
26
|
+
|
|
27
|
+
Scenario: --json emits a single-line JSON document
|
|
28
|
+
Given the fixture tap is added
|
|
29
|
+
When I run "boost search brainstorming --json"
|
|
30
|
+
Then the exit code should be 0
|
|
31
|
+
And the output should match "\"name\": \"brainstorming\""
|
|
32
|
+
|
|
33
|
+
Scenario: --limit rejects a non-positive value
|
|
34
|
+
Given the fixture tap is added
|
|
35
|
+
When I run "boost search x --limit 0"
|
|
36
|
+
Then the exit code should be 2
|
|
37
|
+
And the output should contain "must be >= 1"
|