boost-skill-cli 1.0.182__tar.gz → 1.0.184__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.182 → boost_skill_cli-1.0.184}/Makefile +1 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +3 -3
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap.html +1 -1
- boost_skill_cli-1.0.184/scripts/perf_gate.py +149 -0
- boost_skill_cli-1.0.184/tests/unit/test_perf_gate.py +64 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/.gitattributes +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/.gitignore +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/.vale.ini +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/LICENSE +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/README.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/index.html +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/examples/README.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/index.html +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/noxfile.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/setup.cfg +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/style/README.md +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/style/boost.css +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/style/boost.js +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/style/demo.html +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/tests/unit/test_workflows.py +0 -0
|
@@ -56,6 +56,7 @@ lint:
|
|
|
56
56
|
$(PY) scripts/build_roadmap.py --check
|
|
57
57
|
$(PY) scripts/build_command_reference.py --check
|
|
58
58
|
$(PY) scripts/import_budget.py
|
|
59
|
+
$(PY) scripts/perf_gate.py
|
|
59
60
|
|
|
60
61
|
# Supply-chain CVE gate: fail on a known OSV/PyPI advisory in the project's
|
|
61
62
|
# dependency closure. Mirrors the pip-audit CI workflow; run before releasing.
|
|
@@ -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.184'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 184)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -239,6 +239,7 @@ scripts/eval_retrieval.py
|
|
|
239
239
|
scripts/eval_stats_summary.py
|
|
240
240
|
scripts/import_budget.py
|
|
241
241
|
scripts/mutation_gate.py
|
|
242
|
+
scripts/perf_gate.py
|
|
242
243
|
style/README.md
|
|
243
244
|
style/boost.css
|
|
244
245
|
style/boost.js
|
|
@@ -309,6 +310,7 @@ tests/unit/test_mutation_hardening.py
|
|
|
309
310
|
tests/unit/test_nethttp.py
|
|
310
311
|
tests/unit/test_output.py
|
|
311
312
|
tests/unit/test_paths.py
|
|
313
|
+
tests/unit/test_perf_gate.py
|
|
312
314
|
tests/unit/test_pkg_confusions.py
|
|
313
315
|
tests/unit/test_pkg_injection.py
|
|
314
316
|
tests/unit/test_pkg_secrets.py
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
id: performance-regression-gate-pytest-benchmark
|
|
3
3
|
board: code
|
|
4
4
|
section: dx
|
|
5
|
-
status:
|
|
5
|
+
status: shipped
|
|
6
6
|
category: Testing · Perf
|
|
7
7
|
complexity: M
|
|
8
8
|
impact: Med
|
|
9
9
|
wow: 3
|
|
10
10
|
note: scan & registry
|
|
11
11
|
order: 6
|
|
12
|
-
owner:
|
|
13
|
-
pr:
|
|
12
|
+
owner: loop/perfgate
|
|
13
|
+
pr: 207
|
|
14
14
|
title: Performance-regression gate — <code>pytest-benchmark</code>
|
|
15
15
|
---
|
|
16
16
|
Benchmark the hot paths — a catalog scan over a large skills tree, a
|
|
@@ -1387,7 +1387,7 @@ improvement is real (or isn't)."</p>
|
|
|
1387
1387
|
</article>
|
|
1388
1388
|
|
|
1389
1389
|
<article class="cap rcard">
|
|
1390
|
-
<div class="head"><span class="pill
|
|
1390
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Testing · Perf</span></div>
|
|
1391
1391
|
<h3>Performance-regression gate — <code>pytest-benchmark</code></h3>
|
|
1392
1392
|
<p>Benchmark the hot paths — a catalog scan over a large skills tree, a
|
|
1393
1393
|
registry load — and fail the build when a change regresses them past a
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Performance-regression gate: complexity scaling, not wall-clock baselines.
|
|
3
|
+
|
|
4
|
+
A saved-baseline benchmark compare flakes on shared CI runners — machine speed
|
|
5
|
+
varies run to run, so absolute thresholds either false-alarm or sandbag. What
|
|
6
|
+
a gate CAN assert robustly is *how cost grows with input size*: time the hot
|
|
7
|
+
paths at two catalog sizes on the SAME machine in the SAME process, and fail
|
|
8
|
+
when the big/small ratio blows past the size ratio times a slack factor. An
|
|
9
|
+
accidental O(n²) (size ratio 8 → time ratio ~64×) is caught decisively; noise
|
|
10
|
+
and slow runners cancel out of the ratio. One generous absolute backstop
|
|
11
|
+
catches only catch-fire regressions.
|
|
12
|
+
|
|
13
|
+
Paths gated (the ones `boost search`/`tap` lean on):
|
|
14
|
+
* catalog.scan_dir — walking + classifying a tap tree
|
|
15
|
+
* rag.build — BM25 indexing of the scanned entries
|
|
16
|
+
* rag.retrieve — query over the built index
|
|
17
|
+
|
|
18
|
+
Usage:
|
|
19
|
+
PYTHONPATH=. python3 scripts/perf_gate.py # run the gate
|
|
20
|
+
PYTHONPATH=. python3 scripts/perf_gate.py -v # per-path timings
|
|
21
|
+
|
|
22
|
+
Deliberately NOT part of `make check`'s five-gate contract (v1 blast-radius);
|
|
23
|
+
CI runs it in the lint job. The opt-in micro-benchmarks (tests/perf, `make
|
|
24
|
+
bench`) remain the profiling tool; this is the regression tripwire.
|
|
25
|
+
"""
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
import argparse
|
|
29
|
+
import os
|
|
30
|
+
import sys
|
|
31
|
+
import tempfile
|
|
32
|
+
import time
|
|
33
|
+
from pathlib import Path
|
|
34
|
+
|
|
35
|
+
# Run from a source checkout without an install (same shim as the eval gate).
|
|
36
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
|
37
|
+
|
|
38
|
+
SMALL, BIG = 64, 512 # catalog sizes; 8× input
|
|
39
|
+
SLACK = 3.0 # fail when time-ratio > size-ratio × SLACK (24×)
|
|
40
|
+
ABS_BACKSTOP_S = 30.0 # any single big-size op slower than this fails
|
|
41
|
+
MIN_SAMPLE_S = 0.05 # repeat an op until a sample is ≥ 50ms (jitter)
|
|
42
|
+
BEST_OF = 3
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _mk_catalog(root: Path, n: int) -> None:
|
|
46
|
+
"""Materialize a synthetic tap tree with n skills + n rules + n workflows.
|
|
47
|
+
|
|
48
|
+
Content scales with the tree so indexing has real text to chew on, and
|
|
49
|
+
names are unique per size so nothing is accidentally shared or cached.
|
|
50
|
+
"""
|
|
51
|
+
lorem = ["retrieval", "augmentation", "index", "tokens", "ranking", "corpus", "recall", "precision", "embedding", "catalog", "skill", "agent", "workflow", "rule"]
|
|
52
|
+
for i in range(n):
|
|
53
|
+
d = root / ("skill-%04d" % i)
|
|
54
|
+
d.mkdir(parents=True)
|
|
55
|
+
words = " ".join(lorem[(i + j) % len(lorem)] for j in range(60))
|
|
56
|
+
(d / "SKILL.md").write_text(
|
|
57
|
+
"---\nname: skill-%04d\ndescription: synthetic skill %d for the "
|
|
58
|
+
"perf gate\n---\n\n# skill-%04d\n\n%s\n" % (i, i, i, words),
|
|
59
|
+
encoding="utf-8")
|
|
60
|
+
(root / "rules" / ("rule-%04d.mdc" % i)).parent.mkdir(exist_ok=True)
|
|
61
|
+
(root / "rules" / ("rule-%04d.mdc" % i)).write_text(
|
|
62
|
+
"---\ndescription: synthetic rule %d\n---\nAlways %s.\n"
|
|
63
|
+
% (i, " ".join(lorem[i % len(lorem)] for _ in range(20))),
|
|
64
|
+
encoding="utf-8")
|
|
65
|
+
(root / "commands" / ("wf-%04d.md" % i)).parent.mkdir(exist_ok=True)
|
|
66
|
+
(root / "commands" / ("wf-%04d.md" % i)).write_text(
|
|
67
|
+
"# wf-%04d\n\nRun the synthetic workflow %d: %s\n"
|
|
68
|
+
% (i, i, words[:120]), encoding="utf-8")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _time(fn) -> float:
|
|
72
|
+
"""Best-of-BEST_OF timing; each sample loops fn until ≥ MIN_SAMPLE_S."""
|
|
73
|
+
best = float("inf")
|
|
74
|
+
for _ in range(BEST_OF):
|
|
75
|
+
reps = 0
|
|
76
|
+
t0 = time.perf_counter()
|
|
77
|
+
while True:
|
|
78
|
+
fn()
|
|
79
|
+
reps += 1
|
|
80
|
+
dt = time.perf_counter() - t0
|
|
81
|
+
if dt >= MIN_SAMPLE_S:
|
|
82
|
+
break
|
|
83
|
+
best = min(best, dt / reps)
|
|
84
|
+
return best
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _measure(size: int, verbose: bool) -> dict:
|
|
88
|
+
"""Time the three hot paths against a fresh synthetic catalog of `size`."""
|
|
89
|
+
from boost_cli.core import catalog, rag
|
|
90
|
+
|
|
91
|
+
with tempfile.TemporaryDirectory(prefix="perfgate-") as tmp:
|
|
92
|
+
tap = Path(tmp) / "tap"
|
|
93
|
+
_mk_catalog(tap, size)
|
|
94
|
+
os.environ["BOOST_HOME"] = str(Path(tmp) / "home")
|
|
95
|
+
os.environ["HOME"] = tmp
|
|
96
|
+
|
|
97
|
+
out = {"scan": _time(lambda: catalog.scan_dir(tap, "perf"))}
|
|
98
|
+
entries = catalog.scan_dir(tap, "perf")
|
|
99
|
+
if len(entries) != 3 * size: # a generator bug would invalidate ratios
|
|
100
|
+
raise SystemExit("perf-gate: generator drift: %d entries for n=%d"
|
|
101
|
+
% (len(entries), size))
|
|
102
|
+
|
|
103
|
+
# build is once-per-corpus in real life — time single builds (forced).
|
|
104
|
+
best = float("inf")
|
|
105
|
+
for _ in range(BEST_OF):
|
|
106
|
+
t0 = time.perf_counter()
|
|
107
|
+
rag.build(entries, force=True)
|
|
108
|
+
best = min(best, time.perf_counter() - t0)
|
|
109
|
+
out["build"] = best
|
|
110
|
+
|
|
111
|
+
out["retrieve"] = _time(
|
|
112
|
+
lambda: rag.retrieve("ranking corpus recall skill", k=20))
|
|
113
|
+
if verbose:
|
|
114
|
+
for k, v in out.items():
|
|
115
|
+
print(" n=%-4d %-9s %8.1f ms" % (size, k, v * 1000))
|
|
116
|
+
return out
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def main(argv=None) -> int:
|
|
120
|
+
ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
|
|
121
|
+
ap.add_argument("-v", "--verbose", action="store_true")
|
|
122
|
+
args = ap.parse_args(argv)
|
|
123
|
+
|
|
124
|
+
small = _measure(SMALL, args.verbose)
|
|
125
|
+
big = _measure(BIG, args.verbose)
|
|
126
|
+
|
|
127
|
+
size_ratio = BIG / SMALL
|
|
128
|
+
limit = size_ratio * SLACK
|
|
129
|
+
failed = []
|
|
130
|
+
for path in ("scan", "build", "retrieve"):
|
|
131
|
+
ratio = big[path] / small[path] if small[path] > 0 else float("inf")
|
|
132
|
+
line = "%-9s %7.1fms -> %8.1fms ratio %5.1fx (limit %.0fx)" % (
|
|
133
|
+
path, small[path] * 1000, big[path] * 1000, ratio, limit)
|
|
134
|
+
ok = ratio <= limit and big[path] <= ABS_BACKSTOP_S
|
|
135
|
+
print((" PASS " if ok else " FAIL ") + line)
|
|
136
|
+
if not ok:
|
|
137
|
+
failed.append(path)
|
|
138
|
+
|
|
139
|
+
if failed:
|
|
140
|
+
print("perf-gate: FAILED — superlinear scaling (or >%ds backstop) on: %s"
|
|
141
|
+
% (int(ABS_BACKSTOP_S), ", ".join(failed)), file=sys.stderr)
|
|
142
|
+
return 1
|
|
143
|
+
print("perf-gate: OK — all paths scale within %.0fx of linear at %dx input"
|
|
144
|
+
% (SLACK, int(size_ratio)))
|
|
145
|
+
return 0
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
if __name__ == "__main__":
|
|
149
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""Unit tests for scripts/perf_gate.py — the scaling-ratio decision logic."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import importlib.util
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
_SCRIPT = Path(__file__).resolve().parents[2] / "scripts" / "perf_gate.py"
|
|
10
|
+
|
|
11
|
+
_skip = pytest.mark.skipif(not _SCRIPT.exists(), reason="script not reachable")
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _mod():
|
|
15
|
+
spec = importlib.util.spec_from_file_location("perf_gate", _SCRIPT)
|
|
16
|
+
assert spec and spec.loader
|
|
17
|
+
module = importlib.util.module_from_spec(spec)
|
|
18
|
+
spec.loader.exec_module(module)
|
|
19
|
+
return module
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@_skip
|
|
23
|
+
def test_linear_scaling_passes(monkeypatch, capsys):
|
|
24
|
+
pg = _mod()
|
|
25
|
+
fake = {64: {"scan": .01, "build": .01, "retrieve": .001},
|
|
26
|
+
512: {"scan": .08, "build": .08, "retrieve": .008}} # exactly 8x
|
|
27
|
+
monkeypatch.setattr(pg, "_measure", lambda n, v: fake[n])
|
|
28
|
+
assert pg.main([]) == 0
|
|
29
|
+
assert "perf-gate: OK" in capsys.readouterr().out
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@_skip
|
|
33
|
+
def test_quadratic_scaling_fails(monkeypatch, capsys):
|
|
34
|
+
pg = _mod()
|
|
35
|
+
fake = {64: {"scan": .01, "build": .01, "retrieve": .001},
|
|
36
|
+
512: {"scan": .64, "build": .08, "retrieve": .008}} # scan at 64x
|
|
37
|
+
monkeypatch.setattr(pg, "_measure", lambda n, v: fake[n])
|
|
38
|
+
assert pg.main([]) == 1
|
|
39
|
+
out = capsys.readouterr()
|
|
40
|
+
assert "FAIL scan" in out.out
|
|
41
|
+
assert "superlinear" in out.err
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@_skip
|
|
45
|
+
def test_absolute_backstop_fails_even_at_linear_ratio(monkeypatch, capsys):
|
|
46
|
+
pg = _mod()
|
|
47
|
+
fake = {64: {"scan": 5.0, "build": .01, "retrieve": .001},
|
|
48
|
+
512: {"scan": 40.0, "build": .08, "retrieve": .008}} # 8x but 40s
|
|
49
|
+
monkeypatch.setattr(pg, "_measure", lambda n, v: fake[n])
|
|
50
|
+
assert pg.main([]) == 1
|
|
51
|
+
assert "FAIL scan" in capsys.readouterr().out
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@_skip
|
|
55
|
+
def test_synthetic_catalog_has_expected_entry_count(tmp_path):
|
|
56
|
+
pg = _mod()
|
|
57
|
+
pg._mk_catalog(tmp_path, 5)
|
|
58
|
+
import boost_cli.core.catalog as catalog
|
|
59
|
+
entries = catalog.scan_dir(tmp_path, "t")
|
|
60
|
+
kinds = sorted(e.get("kind", "skill") for e in entries)
|
|
61
|
+
assert len(entries) == 15
|
|
62
|
+
assert kinds.count("skill") == 5
|
|
63
|
+
assert kinds.count("rule") == 5
|
|
64
|
+
assert kinds.count("workflow") == 5
|
|
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.182 → boost_skill_cli-1.0.184}/boost_skill_cli.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{boost_skill_cli-1.0.182 → boost_skill_cli-1.0.184}/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
|
|
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.182 → boost_skill_cli-1.0.184}/docs/roadmap/items/boost-run-live-agents.md
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
|