boost-skill-cli 1.0.209__tar.gz → 1.0.210__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.209 → boost_skill_cli-1.0.210}/Makefile +16 -1
- {boost_skill_cli-1.0.209/boost_skill_cli.egg-info → boost_skill_cli-1.0.210}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/frontmatter.py +18 -2
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_skill_cli.egg-info/SOURCES.txt +27 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/design-roadmap.html +38 -38
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/eval.html +6 -1
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/mcp-hub.html +6 -1
- boost_skill_cli-1.0.210/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +31 -0
- boost_skill_cli-1.0.210/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +30 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap.html +33 -12
- boost_skill_cli-1.0.210/scripts/a11y_check.py +293 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/scripts/build_roadmap.py +4 -1
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/setup.cfg +2 -0
- boost_skill_cli-1.0.210/tests/fuzz/README.md +91 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/frontmatter/01-typical.md +7 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/frontmatter/02-lossy-version.md +6 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +7 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/frontmatter/04-lists.md +8 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/frontmatter/05-nested.md +9 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/frontmatter/06-empty-block.md +2 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/frontmatter/07-unterminated.md +2 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/frontmatter/08-none.md +1 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +5 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/frontmatter/10-keywords.md +8 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/frontmatter/11-crlf.md +5 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/frontmatter/12-bom.md +5 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/registry/01-shorthand.txt +1 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/registry/02-https.txt +1 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/registry/03-ssh.txt +1 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/registry/04-traversal.txt +1 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/registry/06-space.txt +1 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/registry/07-slash.txt +1 -0
- boost_skill_cli-1.0.210/tests/fuzz/corpus/registry/08-bare-host.txt +1 -0
- boost_skill_cli-1.0.210/tests/fuzz/fuzz_frontmatter.py +127 -0
- boost_skill_cli-1.0.210/tests/fuzz/fuzz_registry.py +121 -0
- boost_skill_cli-1.0.210/tests/unit/test_a11y_check.py +214 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_frontmatter.py +28 -1
- boost_skill_cli-1.0.210/tests/unit/test_fuzz_targets.py +87 -0
- boost_skill_cli-1.0.210/tests/visual/a11y_check.mjs +111 -0
- boost_skill_cli-1.0.210/tests/visual/package.json +10 -0
- boost_skill_cli-1.0.209/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -20
- boost_skill_cli-1.0.209/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -20
- boost_skill_cli-1.0.209/tests/visual/package.json +0 -7
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/.gitattributes +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/.gitignore +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/.vale.ini +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/LICENSE +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/README.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/index.html +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/examples/README.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/index.html +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/noxfile.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/style/README.md +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/style/boost.css +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/style/boost.js +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/style/demo.html +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.209 → boost_skill_cli-1.0.210}/tests/visual/visual_check.mjs +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 patch-coverage mutation lint check demo clean-test eval eval-ai eval-rec eval-stats eval-explain audit dist-check bdd bench bench-cli
|
|
13
|
+
.PHONY: venv test unit functional smoke coverage patch-coverage mutation lint check demo clean-test eval eval-ai eval-rec eval-stats eval-explain audit dist-check bdd bench bench-cli fuzz
|
|
14
14
|
|
|
15
15
|
# Every tool comes from a hash-pinned requirements/*.txt — the same files CI
|
|
16
16
|
# installs (see scripts/lock_toolchain.py). pip enforces the hashes, so a dev
|
|
@@ -66,6 +66,7 @@ lint:
|
|
|
66
66
|
$(PY) scripts/build_roadmap.py --check
|
|
67
67
|
$(PY) scripts/build_command_reference.py --check
|
|
68
68
|
$(PY) scripts/lock_toolchain.py --check
|
|
69
|
+
$(PY) scripts/a11y_check.py
|
|
69
70
|
$(PY) scripts/import_budget.py
|
|
70
71
|
$(PY) scripts/perf_gate.py
|
|
71
72
|
$(PY) scripts/check_anchors.py
|
|
@@ -140,6 +141,20 @@ bench:
|
|
|
140
141
|
bench-cli:
|
|
141
142
|
@command -v hyperfine >/dev/null 2>&1 && bash scripts/bench_cli.sh || echo "hyperfine not on PATH — install via 'brew install hyperfine', skipping"
|
|
142
143
|
|
|
144
|
+
# Opt-in coverage-guided fuzzing of the hand-rolled parsers (atheris/libFuzzer).
|
|
145
|
+
# Not part of `make check` — a fuzzer is a search, not a pass/fail gate; the
|
|
146
|
+
# scheduled `fuzz` workflow owns the long runs. Each target degrades cleanly to
|
|
147
|
+
# a seed-corpus pass when atheris is absent (it ships manylinux wheels only), and
|
|
148
|
+
# the seed pass also runs in the normal unit suite so the harnesses can't rot.
|
|
149
|
+
# FUZZ_SECONDS=60 make fuzz to run longer.
|
|
150
|
+
FUZZ_SECONDS ?= 30
|
|
151
|
+
fuzz:
|
|
152
|
+
@for t in fuzz_frontmatter fuzz_registry; do \
|
|
153
|
+
echo "== $$t"; \
|
|
154
|
+
$(PY) tests/fuzz/$$t.py tests/fuzz/corpus/$${t#fuzz_} \
|
|
155
|
+
-max_total_time=$(FUZZ_SECONDS) -artifact_prefix=/tmp/ || exit 1; \
|
|
156
|
+
done
|
|
157
|
+
|
|
143
158
|
# regenerate generated artifacts from their source (registries + roadmap boards)
|
|
144
159
|
generate:
|
|
145
160
|
$(PY) scripts/build_registries.py
|
|
@@ -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.210'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 210)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -48,10 +48,26 @@ def _scalar(raw: str):
|
|
|
48
48
|
return False
|
|
49
49
|
if low == "null" or s == "~":
|
|
50
50
|
return None
|
|
51
|
+
# Numbers are coerced ONLY when the coercion is lossless — that is, when
|
|
52
|
+
# str() of the result gives back exactly what the author wrote. A number
|
|
53
|
+
# whose text carries information the numeric type cannot hold stays a
|
|
54
|
+
# string, because every consumer of frontmatter (`version`, tags, names)
|
|
55
|
+
# reads these values back as text.
|
|
56
|
+
#
|
|
57
|
+
# This is not hypothetical. `version: 1.10` is ten patch releases past 1.1,
|
|
58
|
+
# but float("1.10") is 1.1 and str(1.1) is "1.1" — so boost read a skill
|
|
59
|
+
# published at 1.10 as 1.1, decided 1.1 < 1.9, and never offered the update.
|
|
60
|
+
# `boost outdated` reported "everything up to date" while the tap was nine
|
|
61
|
+
# releases ahead. Leading zeros (`007` -> 7) and exponents (`1e5` -> 100000.0)
|
|
62
|
+
# corrupt the same way. Found by the parser fuzz harness (tests/fuzz/).
|
|
51
63
|
with suppress(ValueError):
|
|
52
|
-
|
|
64
|
+
n = int(s)
|
|
65
|
+
if str(n) == s:
|
|
66
|
+
return n
|
|
53
67
|
with suppress(ValueError):
|
|
54
|
-
|
|
68
|
+
f = float(s)
|
|
69
|
+
if str(f) == s:
|
|
70
|
+
return f
|
|
55
71
|
return s
|
|
56
72
|
|
|
57
73
|
|
|
@@ -262,6 +262,7 @@ requirements/release-tools.in
|
|
|
262
262
|
requirements/release-tools.txt
|
|
263
263
|
requirements/test-tools.in
|
|
264
264
|
requirements/test-tools.txt
|
|
265
|
+
scripts/a11y_check.py
|
|
265
266
|
scripts/bench_cli.sh
|
|
266
267
|
scripts/build_command_reference.py
|
|
267
268
|
scripts/build_registries.py
|
|
@@ -322,7 +323,31 @@ tests/functional/test_property_parsers.py
|
|
|
322
323
|
tests/functional/test_run.py
|
|
323
324
|
tests/functional/test_tap_signing.py
|
|
324
325
|
tests/functional/test_workspace_scope.py
|
|
326
|
+
tests/fuzz/README.md
|
|
327
|
+
tests/fuzz/fuzz_frontmatter.py
|
|
328
|
+
tests/fuzz/fuzz_registry.py
|
|
329
|
+
tests/fuzz/corpus/frontmatter/01-typical.md
|
|
330
|
+
tests/fuzz/corpus/frontmatter/02-lossy-version.md
|
|
331
|
+
tests/fuzz/corpus/frontmatter/03-lossy-numbers.md
|
|
332
|
+
tests/fuzz/corpus/frontmatter/04-lists.md
|
|
333
|
+
tests/fuzz/corpus/frontmatter/05-nested.md
|
|
334
|
+
tests/fuzz/corpus/frontmatter/06-empty-block.md
|
|
335
|
+
tests/fuzz/corpus/frontmatter/07-unterminated.md
|
|
336
|
+
tests/fuzz/corpus/frontmatter/08-none.md
|
|
337
|
+
tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md
|
|
338
|
+
tests/fuzz/corpus/frontmatter/10-keywords.md
|
|
339
|
+
tests/fuzz/corpus/frontmatter/11-crlf.md
|
|
340
|
+
tests/fuzz/corpus/frontmatter/12-bom.md
|
|
341
|
+
tests/fuzz/corpus/registry/01-shorthand.txt
|
|
342
|
+
tests/fuzz/corpus/registry/02-https.txt
|
|
343
|
+
tests/fuzz/corpus/registry/03-ssh.txt
|
|
344
|
+
tests/fuzz/corpus/registry/04-traversal.txt
|
|
345
|
+
tests/fuzz/corpus/registry/05-empty.txt
|
|
346
|
+
tests/fuzz/corpus/registry/06-space.txt
|
|
347
|
+
tests/fuzz/corpus/registry/07-slash.txt
|
|
348
|
+
tests/fuzz/corpus/registry/08-bare-host.txt
|
|
325
349
|
tests/perf/test_benchmarks.py
|
|
350
|
+
tests/unit/test_a11y_check.py
|
|
326
351
|
tests/unit/test_adapters.py
|
|
327
352
|
tests/unit/test_adapters_multi.py
|
|
328
353
|
tests/unit/test_adapters_runner.py
|
|
@@ -345,6 +370,7 @@ tests/unit/test_errors_and_cli_table.py
|
|
|
345
370
|
tests/unit/test_eval_stats_summary.py
|
|
346
371
|
tests/unit/test_faithfulness.py
|
|
347
372
|
tests/unit/test_frontmatter.py
|
|
373
|
+
tests/unit/test_fuzz_targets.py
|
|
348
374
|
tests/unit/test_gitleaks_config.py
|
|
349
375
|
tests/unit/test_gitutil.py
|
|
350
376
|
tests/unit/test_imperative.py
|
|
@@ -389,5 +415,6 @@ tests/unit/test_updatediff.py
|
|
|
389
415
|
tests/unit/test_util.py
|
|
390
416
|
tests/unit/test_version.py
|
|
391
417
|
tests/unit/test_workflows.py
|
|
418
|
+
tests/visual/a11y_check.mjs
|
|
392
419
|
tests/visual/package.json
|
|
393
420
|
tests/visual/visual_check.mjs
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
|
|
29
29
|
/* ---------- Aurora → ANSI palette bridge ---------- */
|
|
30
30
|
.palette { max-width: 940px; margin: 46px auto 0; }
|
|
31
|
-
.palette
|
|
31
|
+
.palette h2 { text-align: center; font-size: 12px; font-weight: 700; font-family: var(--mono); letter-spacing: .18em; text-transform: uppercase; color: var(--text-3); margin-bottom: 20px; }
|
|
32
32
|
.swatches { display: grid; grid-template-columns: repeat(auto-fit, minmax(128px, 1fr)); gap: 12px; }
|
|
33
33
|
.sw { border: 1px solid var(--line); border-radius: 13px; overflow: hidden; background: var(--panel-solid); }
|
|
34
34
|
.sw .chip { height: 46px; }
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
|
|
39
39
|
/* ---------- legend ---------- */
|
|
40
40
|
.legend { max-width: 900px; margin: 60px auto 0; border: 1px solid var(--line); border-radius: 16px; background: var(--panel); padding: 26px 28px; }
|
|
41
|
-
.legend
|
|
41
|
+
.legend h2 { font-size: 14px; font-weight: 700; font-family: var(--mono); letter-spacing: .12em; text-transform: uppercase; color: var(--text-2); margin-bottom: 18px; }
|
|
42
42
|
.legend-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 18px 28px; }
|
|
43
43
|
.legend-grid dt { font-family: var(--mono); font-size: 12.5px; font-weight: 700; color: var(--yellow); margin-bottom: 5px; }
|
|
44
44
|
.legend-grid dd { font-size: 13.5px; color: var(--text-2); line-height: 1.5; }
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
.track { margin-top: 52px; }
|
|
64
64
|
.track-head { display: flex; align-items: center; gap: 14px; }
|
|
65
65
|
.track-icon { width: 12px; height: 34px; border-radius: 5px; background: var(--tk, var(--yellow)); box-shadow: 0 0 22px -2px var(--tk, var(--yellow)); }
|
|
66
|
-
.track-head
|
|
66
|
+
.track-head h2 { font-size: 22px; font-weight: 780; letter-spacing: -.015em; }
|
|
67
67
|
.track-head p { font-size: 14px; color: var(--text-2); margin-top: 1px; }
|
|
68
68
|
.track-head .n { margin-left: auto; font-family: var(--mono); font-size: 12px; color: var(--text-2); border: 1px solid var(--line); border-radius: 999px; padding: 5px 13px; white-space: nowrap; }
|
|
69
69
|
|
|
@@ -83,8 +83,8 @@
|
|
|
83
83
|
.rstatus.progress { color: var(--green); background: rgba(74,222,128,.1); border: 1px solid rgba(74,222,128,.35); }
|
|
84
84
|
.rstatus.done { color: var(--text-3); background: var(--panel); border: 1px solid var(--line); text-decoration: line-through; }
|
|
85
85
|
|
|
86
|
-
.ritem
|
|
87
|
-
.ritem
|
|
86
|
+
.ritem h3 { font-size: 16.5px; font-weight: 720; letter-spacing: -.01em; line-height: 1.28; }
|
|
87
|
+
.ritem h3 code { font-family: var(--mono); font-size: .82em; color: var(--sky); background: rgba(125,211,252,.07); border-radius: 5px; padding: 1px 6px; }
|
|
88
88
|
.ritem > p { font-size: 13.5px; color: var(--text-2); margin-top: 8px; line-height: 1.55; }
|
|
89
89
|
.ritem > p b { color: var(--text); font-weight: 640; }
|
|
90
90
|
.ritem > p code { font-family: var(--mono); font-size: .86em; color: var(--text); background: rgba(255,255,255,.05); border-radius: 5px; padding: 1px 5px; }
|
|
@@ -152,7 +152,7 @@
|
|
|
152
152
|
|
|
153
153
|
<!-- ================= PALETTE BRIDGE ================= -->
|
|
154
154
|
<div class="wrap palette">
|
|
155
|
-
<
|
|
155
|
+
<h2>The bridge — Aurora web tokens → 24-bit ANSI</h2>
|
|
156
156
|
<div class="swatches">
|
|
157
157
|
<div class="sw"><div class="chip" style="background:#22d3ee"></div><div class="lab"><b>Cyan</b><span>#22d3ee · accent</span></div></div>
|
|
158
158
|
<div class="sw"><div class="chip" style="background:#a855f7"></div><div class="lab"><b>Violet</b><span>#a855f7 · brand</span></div></div>
|
|
@@ -166,7 +166,7 @@
|
|
|
166
166
|
<!-- ================= LEGEND ================= -->
|
|
167
167
|
<div class="wrap">
|
|
168
168
|
<div class="legend reveal">
|
|
169
|
-
<
|
|
169
|
+
<h2>How to read this roadmap</h2>
|
|
170
170
|
<dl class="legend-grid">
|
|
171
171
|
<div>
|
|
172
172
|
<dt>Status</dt>
|
|
@@ -224,7 +224,7 @@
|
|
|
224
224
|
<div class="track-head">
|
|
225
225
|
<div class="track-icon"></div>
|
|
226
226
|
<div>
|
|
227
|
-
<
|
|
227
|
+
<h2>Aurora Color Engine</h2>
|
|
228
228
|
<p>Bring the brand palette and gradient into the terminal — with graceful fallbacks.</p>
|
|
229
229
|
</div>
|
|
230
230
|
<span class="n"><!-- ROADMAP:count track=color -->4 items<!-- /ROADMAP:count --></span>
|
|
@@ -234,7 +234,7 @@
|
|
|
234
234
|
<!-- ROADMAP:cards track=color -->
|
|
235
235
|
<article class="ritem" id="BOOST-D01" data-track="color" data-impact="high">
|
|
236
236
|
<div class="ritem-top"><span class="rid">BOOST-D01</span><span class="rstatus done">Shipped</span></div>
|
|
237
|
-
<
|
|
237
|
+
<h3>24-bit Aurora palette in <code>output.py</code></h3>
|
|
238
238
|
<p>The whole CLI runs on eight legacy SGR codes (<code>RED</code>…<code>CYAN</code>) that don't match the brand at all — the front door paints section headers in generic <code>[33m</code> yellow. Add truecolor <code>rgb()</code> helpers mapping the exact web tokens: cyan <b>#22d3ee</b>, violet <b>#a855f7</b>, pink <b>#f472d0</b>, green <b>#4ade80</b>, yellow <b>#facc15</b>, plus <code>--text</code>/<code>--text-3</code> greys. One map recolors everything.</p>
|
|
239
239
|
<div class="rmeta"><span class="m-cat">color</span><span>Complexity S</span><span class="m-imp high">Impact High</span><span class="m-wow">★★★★☆</span></div>
|
|
240
240
|
<div class="rref"><code>core/output.py:15–38</code></div>
|
|
@@ -242,7 +242,7 @@
|
|
|
242
242
|
|
|
243
243
|
<article class="ritem" id="BOOST-D02" data-track="color" data-impact="high">
|
|
244
244
|
<div class="ritem-top"><span class="rid">BOOST-D02</span><span class="rstatus done">Shipped</span></div>
|
|
245
|
-
<
|
|
245
|
+
<h3>Terminal capability detection & graceful degradation</h3>
|
|
246
246
|
<p><code>use_color()</code> is binary — color or nothing. Add a tier ladder: <b>truecolor</b> (<code>COLORTERM=truecolor/24bit</code>) → <b>256</b> → <b>16</b> → <b>none</b>, so the Aurora tokens snap to the nearest available color instead of vanishing. Keep the existing <code>NO_COLOR</code> honor, add a <code>BOOST_COLOR=always/auto/never</code> override, and treat <code>TERM=dumb</code> as none.</p>
|
|
247
247
|
<div class="rmeta"><span class="m-cat">color</span><span>Complexity M</span><span class="m-imp high">Impact High</span><span class="m-wow">★★★☆☆</span></div>
|
|
248
248
|
<div class="rref"><code>core/output.py:26–38</code></div>
|
|
@@ -250,7 +250,7 @@
|
|
|
250
250
|
|
|
251
251
|
<article class="ritem" id="BOOST-D03" data-track="color" data-impact="med">
|
|
252
252
|
<div class="ritem-top"><span class="rid">BOOST-D03</span><span class="rstatus done">Shipped</span></div>
|
|
253
|
-
<
|
|
253
|
+
<h3>Gradient text renderer — the signature move</h3>
|
|
254
254
|
<p>The brand <em>is</em> the cyan→violet→pink <code>--grad</code>. Interpolate it per-character across a string so headings, the <code>boost</code> wordmark and hero counts shimmer in the terminal exactly like the web hero. A pure-Python lerp over the three stops; falls back to a single accent color when truecolor is unavailable.</p>
|
|
255
255
|
<div class="rmeta"><span class="m-cat">color</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★★</span></div>
|
|
256
256
|
<div class="rref"><code>core/output.py · new gradient()</code></div>
|
|
@@ -258,7 +258,7 @@
|
|
|
258
258
|
|
|
259
259
|
<article class="ritem" id="BOOST-D04" data-track="color" data-impact="med">
|
|
260
260
|
<div class="ritem-top"><span class="rid">BOOST-D04</span><span class="rstatus done">Shipped</span></div>
|
|
261
|
-
<
|
|
261
|
+
<h3>Semantic color roles, not raw codes</h3>
|
|
262
262
|
<p>Commands scattered <code>out.c(x, out.YELLOW)</code> and <code>out.GREEN</code> literally throughout the command layer, so a palette change meant a repo-wide sweep. Now a single <code>ROLES</code> table in <code>output.py</code> maps six named roles — <code>accent</code>, <code>brand</code>, <code>success</code>, <code>warn</code>, <code>danger</code>, <code>muted</code> — resolved through the Aurora palette (truecolor → 16-color → plain), and <code>out.role(text, name)</code> paints by intent. Every color call site across all eight command groups now reads as meaning, not mechanics; brand hues (accent/success/warn) upgraded from flat 16-color to on-theme truecolor in the process. Re-theming is a one-file edit.</p>
|
|
263
263
|
<div class="rmeta"><span class="m-cat">color</span><span>Complexity S</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★☆☆☆</span></div>
|
|
264
264
|
<div class="rref"><code>core/output.py:ROLES / role() · commands/*.py</code></div>
|
|
@@ -273,7 +273,7 @@
|
|
|
273
273
|
<div class="track-head">
|
|
274
274
|
<div class="track-icon"></div>
|
|
275
275
|
<div>
|
|
276
|
-
<
|
|
276
|
+
<h2>Structure & Layout</h2>
|
|
277
277
|
<p>Width-aware output, glass panels, and results that never blow up the pane.</p>
|
|
278
278
|
</div>
|
|
279
279
|
<span class="n"><!-- ROADMAP:count track=layout -->7 items<!-- /ROADMAP:count --></span>
|
|
@@ -283,7 +283,7 @@
|
|
|
283
283
|
<!-- ROADMAP:cards track=layout -->
|
|
284
284
|
<article class="ritem" id="BOOST-D05" data-track="layout" data-impact="high">
|
|
285
285
|
<div class="ritem-top"><span class="rid">BOOST-D05</span><span class="rstatus done">Shipped</span></div>
|
|
286
|
-
<
|
|
286
|
+
<h3>Fix <code>search</code>: truncate & width-clamp results</h3>
|
|
287
287
|
<p>Today <code>boost search</code> is the worst screen in the app: a single result can dump a <b>2,000-character description with literal, unrendered <code>\\n\\n</code> escapes</b>, while names are padded to a fixed 30 columns that waste half the row. Clamp each row to the live terminal width, collapse whitespace/escape artifacts, and ellipsize. This one fix turns a wall of noise into a scannable list.</p>
|
|
288
288
|
<div class="rmeta"><span class="m-cat">layout</span><span>Complexity M</span><span class="m-imp high">Impact High</span><span class="m-wow">★★★★★</span></div>
|
|
289
289
|
<div class="rref"><code>commands/discovery.py · search</code></div>
|
|
@@ -291,7 +291,7 @@
|
|
|
291
291
|
|
|
292
292
|
<article class="ritem" id="BOOST-D06" data-track="layout" data-impact="med">
|
|
293
293
|
<div class="ritem-top"><span class="rid">BOOST-D06</span><span class="rstatus done">Shipped</span></div>
|
|
294
|
-
<
|
|
294
|
+
<h3>Glass-panel box primitives</h3>
|
|
295
295
|
<p>The web system frames everything in rounded glass; the CLI frames nothing. Add rounded box-drawing primitives (<code>╭─╮ │ ╰─╯</code>) with dim <code>--line</code> borders and an optional title, mirroring the web <code>.glass</code>/<code>.window</code> surfaces. Reusable chrome for <code>doctor</code>, <code>info</code>, <code>snapshot</code> and success summaries.</p>
|
|
296
296
|
<div class="rmeta"><span class="m-cat">layout</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★☆</span></div>
|
|
297
297
|
<div class="rref"><code>core/output.py · new panel()</code></div>
|
|
@@ -299,7 +299,7 @@
|
|
|
299
299
|
|
|
300
300
|
<article class="ritem" id="BOOST-D07" data-track="layout" data-impact="med">
|
|
301
301
|
<div class="ritem-top"><span class="rid">BOOST-D07</span><span class="rstatus done">Shipped</span></div>
|
|
302
|
-
<
|
|
302
|
+
<h3>Relevance visualization in search</h3>
|
|
303
303
|
<p>Results are "ranked by heuristic relevance" but the ranking is invisible — every row looks equal. Render a tiny gradient relevance bar or score glyph per hit and visually separate <b>curated</b> from GitHub-wide matches, so the eye lands on the best result first.</p>
|
|
304
304
|
<div class="rmeta"><span class="m-cat">layout</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★☆</span></div>
|
|
305
305
|
<div class="rref"><code>commands/discovery.py · search</code></div>
|
|
@@ -307,7 +307,7 @@
|
|
|
307
307
|
|
|
308
308
|
<article class="ritem" id="BOOST-D08" data-track="layout" data-impact="med">
|
|
309
309
|
<div class="ritem-top"><span class="rid">BOOST-D08</span><span class="rstatus done">Shipped</span></div>
|
|
310
|
-
<
|
|
310
|
+
<h3>Width-aware, right-aligned tables</h3>
|
|
311
311
|
<p><code>table()</code> is a naive <code>ljust</code> that ignores terminal width and left-aligns numeric columns. Make it width-aware (shrink the widest text column to fit), right-align counts with tabular figures, and add dim column separators — matching the web's <code>font-variant-numeric: tabular-nums</code> stat blocks.</p>
|
|
312
312
|
<div class="rmeta"><span class="m-cat">layout</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★☆☆</span></div>
|
|
313
313
|
<div class="rref"><code>core/output.py · table()</code></div>
|
|
@@ -315,7 +315,7 @@
|
|
|
315
315
|
|
|
316
316
|
<article class="ritem" id="BOOST-D09" data-track="layout" data-impact="med">
|
|
317
317
|
<div class="ritem-top"><span class="rid">BOOST-D09</span><span class="rstatus done">Shipped</span></div>
|
|
318
|
-
<
|
|
318
|
+
<h3>Terminal-window chrome for <code>preview</code> / <code>cat</code></h3>
|
|
319
319
|
<p>The web guide renders skills inside a titled window with traffic-light dots (<code>.window .dots</code>). Give <code>preview</code>/<code>cat</code> the same treatment: a titled frame with the skill name in the bar, so a rendered <code>SKILL.md</code> in the terminal matches the screenshots on the site.</p>
|
|
320
320
|
<div class="rmeta"><span class="m-cat">layout</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★☆</span></div>
|
|
321
321
|
<div class="rref"><code>commands/info.py · preview/cat</code></div>
|
|
@@ -323,7 +323,7 @@
|
|
|
323
323
|
|
|
324
324
|
<article class="ritem" id="BOOST-D23" data-track="layout" data-impact="high">
|
|
325
325
|
<div class="ritem-top"><span class="rid">BOOST-D23</span><span class="rstatus done">Shipped</span></div>
|
|
326
|
-
<
|
|
326
|
+
<h3><code>trending</code> had the same overflow as <code>search</code></h3>
|
|
327
327
|
<p>Grading the un-touched commands surfaced a sibling of D05: <code>boost trending</code> piped raw catalog descriptions straight into <code>table()</code>, so a single 300-char description blew the table across the pane. Fixed by clipping each description through <code>out.truncate()</code> to the width left after the name/installs/last columns — the same helper the search fix introduced.</p>
|
|
328
328
|
<div class="rmeta"><span class="m-cat">layout</span><span>Complexity S</span><span class="m-imp high">Impact High</span><span class="m-wow">★★★★☆</span></div>
|
|
329
329
|
<div class="rref"><code>commands/discovery.py · cmd_trending</code></div>
|
|
@@ -331,7 +331,7 @@
|
|
|
331
331
|
|
|
332
332
|
<article class="ritem" id="BOOST-D24" data-track="layout" data-impact="med">
|
|
333
333
|
<div class="ritem-top"><span class="rid">BOOST-D24</span><span class="rstatus done">Shipped</span></div>
|
|
334
|
-
<
|
|
334
|
+
<h3>Width-aware shared <code>table()</code></h3>
|
|
335
335
|
<p><code>out.table()</code> backs ~28 call sites, and several overflowed: <code>taps</code> padded the NAME column to the widest repo (<code>K-Dense-AI/claude-scientific-skills</code> = 44 cols) and then printed full URLs, so wide catalogs wrapped. Now <code>table()</code> is width-aware itself — when a row would exceed the terminal it shrinks the widest <b>text</b> column and clips its cells with an ellipsis (ANSI-aware, so colored cells keep their color and close cleanly), while <b>numeric</b> columns are right-aligned like tabular figures and never truncated. Narrow tables render byte-identical to before; the logic only engages on overflow or multi-row number columns. Delivered test-first: dedicated unit coverage for <code>_numeric_col</code>, <code>_clip_visible</code>, <code>_fit_widths</code>, and the integrated render keeps the mutation gate green.</p>
|
|
336
336
|
<div class="rmeta"><span class="m-cat">layout</span><span>Complexity L</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★☆</span></div>
|
|
337
337
|
<div class="rref"><code>core/output.py:table() / _fit_widths / _clip_visible</code></div>
|
|
@@ -346,7 +346,7 @@
|
|
|
346
346
|
<div class="track-head">
|
|
347
347
|
<div class="track-icon"></div>
|
|
348
348
|
<div>
|
|
349
|
-
<
|
|
349
|
+
<h2>Motion & Feedback</h2>
|
|
350
350
|
<p>Make it feel <em>snappy</em> — spinners, progress, and instant first paint.</p>
|
|
351
351
|
</div>
|
|
352
352
|
<span class="n"><!-- ROADMAP:count track=motion -->4 items<!-- /ROADMAP:count --></span>
|
|
@@ -356,7 +356,7 @@
|
|
|
356
356
|
<!-- ROADMAP:cards track=motion -->
|
|
357
357
|
<article class="ritem" id="BOOST-D10" data-track="motion" data-impact="high">
|
|
358
358
|
<div class="ritem-top"><span class="rid">BOOST-D10</span><span class="rstatus done">Shipped</span></div>
|
|
359
|
-
<
|
|
359
|
+
<h3>Braille spinner for network waits</h3>
|
|
360
360
|
<p>Network-bound commands — <code>search</code> (AI rank), <code>tap</code> clone, <code>discover</code>, <code>index</code> — currently freeze silently while they work. Add a lightweight braille-dot spinner (<code>⠋⠙⠹⠸…</code>) tinted with the Aurora accent, auto-suppressed on non-TTY and under <code>NO_COLOR</code>. The single biggest "feels fast" upgrade.</p>
|
|
361
361
|
<div class="rmeta"><span class="m-cat">motion</span><span>Complexity S</span><span class="m-imp high">Impact High</span><span class="m-wow">★★★★☆</span></div>
|
|
362
362
|
<div class="rref"><code>core/output.py · new spinner()</code></div>
|
|
@@ -364,7 +364,7 @@
|
|
|
364
364
|
|
|
365
365
|
<article class="ritem" id="BOOST-D11" data-track="motion" data-impact="med">
|
|
366
366
|
<div class="ritem-top"><span class="rid">BOOST-D11</span><span class="rstatus done">Shipped</span></div>
|
|
367
|
-
<
|
|
367
|
+
<h3>Determinate progress bars for batch ops</h3>
|
|
368
368
|
<p>Multi-item commands — <code>reindex</code>, <code>update</code>, <code>sync</code>, <code>snapshot</code> restore — give no sense of "how far in." Add a gradient-filled progress bar (<code>N/total</code> + ETA) for anything looping over a known count, so long operations read as intentional rather than hung.</p>
|
|
369
369
|
<div class="rmeta"><span class="m-cat">motion</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★☆</span></div>
|
|
370
370
|
<div class="rref"><code>core/output.py · new progress()</code></div>
|
|
@@ -372,7 +372,7 @@
|
|
|
372
372
|
|
|
373
373
|
<article class="ritem" id="BOOST-D12" data-track="motion" data-impact="med">
|
|
374
374
|
<div class="ritem-top"><span class="rid">BOOST-D12</span><span class="rstatus proposed">Proposed</span></div>
|
|
375
|
-
<
|
|
375
|
+
<h3>Stream search hits as they rank</h3>
|
|
376
376
|
<p><code>search</code> computes the full ranking, then prints the whole list at once — the terminal sits blank, then floods. Stream the top hits as they're scored so the first result paints almost immediately. Perceived latency drops even when total time is unchanged.</p>
|
|
377
377
|
<div class="rmeta"><span class="m-cat">motion</span><span>Complexity L</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★☆☆</span></div>
|
|
378
378
|
<div class="rref"><code>commands/discovery.py · search</code></div>
|
|
@@ -380,7 +380,7 @@
|
|
|
380
380
|
|
|
381
381
|
<article class="ritem" id="BOOST-D13" data-track="motion" data-impact="low">
|
|
382
382
|
<div class="ritem-top"><span class="rid">BOOST-D13</span><span class="rstatus done">Shipped</span></div>
|
|
383
|
-
<
|
|
383
|
+
<h3>Framed success summary with next step</h3>
|
|
384
384
|
<p><code>ok()</code> prints a lone green check, then the command just ends. After <code>install</code>/<code>uninstall</code>, close with a small framed confirmation — what changed, where it landed, and the obvious next step (<code>boost info <skill></code>) — so a completed action feels finished, not dropped.</p>
|
|
385
385
|
<div class="rmeta"><span class="m-cat">ux</span><span>Complexity S</span><span class="m-imp low">Impact Low</span><span class="m-wow">★★★☆☆</span></div>
|
|
386
386
|
<div class="rref"><code>core/output.py:41 · commands/pkg.py</code></div>
|
|
@@ -395,7 +395,7 @@
|
|
|
395
395
|
<div class="track-head">
|
|
396
396
|
<div class="track-icon"></div>
|
|
397
397
|
<div>
|
|
398
|
-
<
|
|
398
|
+
<h2>Command-by-command Polish</h2>
|
|
399
399
|
<p>The screens users actually stare at — front door, doctor, list, info, browse.</p>
|
|
400
400
|
</div>
|
|
401
401
|
<span class="n"><!-- ROADMAP:count track=commands -->7 items<!-- /ROADMAP:count --></span>
|
|
@@ -405,7 +405,7 @@
|
|
|
405
405
|
<!-- ROADMAP:cards track=commands -->
|
|
406
406
|
<article class="ritem" id="BOOST-D14" data-track="commands" data-impact="med">
|
|
407
407
|
<div class="ritem-top"><span class="rid">BOOST-D14</span><span class="rstatus done">Shipped</span></div>
|
|
408
|
-
<
|
|
408
|
+
<h3>Front door: gradient wordmark + section glyphs</h3>
|
|
409
409
|
<p>The <code>boost</code> home screen is the first thing everyone sees. Today the wordmark is plain bold and every group header is the same generic yellow. Paint the <code>boost</code> wordmark with the Aurora gradient and give each command group a colored bullet/glyph keyed to a brand hue — turning a flat list into a branded index.</p>
|
|
410
410
|
<div class="rmeta"><span class="m-cat">commands</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★★</span></div>
|
|
411
411
|
<div class="rref"><code>commands/info.py · help renderer</code></div>
|
|
@@ -413,7 +413,7 @@
|
|
|
413
413
|
|
|
414
414
|
<article class="ritem" id="BOOST-D15" data-track="commands" data-impact="med">
|
|
415
415
|
<div class="ritem-top"><span class="rid">BOOST-D15</span><span class="rstatus done">Shipped</span></div>
|
|
416
|
-
<
|
|
416
|
+
<h3><code>doctor</code> as a health dashboard</h3>
|
|
417
417
|
<p><code>doctor</code> is an undifferentiated wall of green checks — no hierarchy, no headline. Reframe it as a panel with a verdict line (<code>● Healthy</code> in green / <code>● Attention</code> in amber), grouped checks, dim sub-detail, and severity color so a problem actually stands out instead of hiding among the ✓s.</p>
|
|
418
418
|
<div class="rmeta"><span class="m-cat">commands</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★☆</span></div>
|
|
419
419
|
<div class="rref"><code>commands/quality.py · doctor</code></div>
|
|
@@ -421,7 +421,7 @@
|
|
|
421
421
|
|
|
422
422
|
<article class="ritem" id="BOOST-D16" data-track="commands" data-impact="med">
|
|
423
423
|
<div class="ritem-top"><span class="rid">BOOST-D16</span><span class="rstatus done">Shipped</span></div>
|
|
424
|
-
<
|
|
424
|
+
<h3><code>info</code> skill identity card</h3>
|
|
425
425
|
<p><code>info</code> lists <code>kv()</code> pairs as flat dim labels. Promote it to a framed identity card: gradient skill name, status badges (<b>installed</b> / <b>pinned</b> / tap origin) styled like the web <code>.badge</code> pills, then the metadata — a real "detail view," not a key-value dump.</p>
|
|
426
426
|
<div class="rmeta"><span class="m-cat">commands</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★☆</span></div>
|
|
427
427
|
<div class="rref"><code>commands/info.py:177+</code></div>
|
|
@@ -429,7 +429,7 @@
|
|
|
429
429
|
|
|
430
430
|
<article class="ritem" id="BOOST-D17" data-track="commands" data-impact="low">
|
|
431
431
|
<div class="ritem-top"><span class="rid">BOOST-D17</span><span class="rstatus done">Shipped</span></div>
|
|
432
|
-
<
|
|
432
|
+
<h3><code>list</code> polish — chips & aligned counts</h3>
|
|
433
433
|
<p><code>list</code> already uses a nice <code>·</code> agent separator; take it further. Color the agent names as small chips, right-align the count footer with tabular figures, and add a dim header rule so the table reads as a designed object rather than raw columns.</p>
|
|
434
434
|
<div class="rmeta"><span class="m-cat">commands</span><span>Complexity S</span><span class="m-imp low">Impact Low</span><span class="m-wow">★★★☆☆</span></div>
|
|
435
435
|
<div class="rref"><code>commands/info.py:130–131</code></div>
|
|
@@ -437,7 +437,7 @@
|
|
|
437
437
|
|
|
438
438
|
<article class="ritem" id="BOOST-D18" data-track="commands" data-impact="low">
|
|
439
439
|
<div class="ritem-top"><span class="rid">BOOST-D18</span><span class="rstatus done">Shipped</span></div>
|
|
440
|
-
<
|
|
440
|
+
<h3>Consistent empty-states & hint styling</h3>
|
|
441
441
|
<p>Empty and hint lines are ad-hoc — <code>info</code>'s "no skills installed" hint is a hand-rolled <code>DIM</code> string. Standardize a single empty-state affordance (muted icon + one-line guidance + suggested command) and a single hint style, applied everywhere, so guidance always looks the same.</p>
|
|
442
442
|
<div class="rmeta"><span class="m-cat">ux</span><span>Complexity S</span><span class="m-imp low">Impact Low</span><span class="m-wow">★★☆☆☆</span></div>
|
|
443
443
|
<div class="rref"><code>commands/info.py:117–119 · core/output.py</code></div>
|
|
@@ -445,7 +445,7 @@
|
|
|
445
445
|
|
|
446
446
|
<article class="ritem" id="BOOST-D25" data-track="commands" data-impact="med">
|
|
447
447
|
<div class="ritem-top"><span class="rid">BOOST-D25</span><span class="rstatus done">Shipped</span></div>
|
|
448
|
-
<
|
|
448
|
+
<h3>Branded usage & error output</h3>
|
|
449
449
|
<p>Grading confirmed this hits <b>every command with a required argument</b> — <code>boost uninstall</code>, <code>boost snapshot</code> and more all dump raw, unstyled <code>argparse</code>: a multi-line usage block with a bare <code>error:</code>, nothing like the branded top-level dispatch (which already routes through <code>Error:</code> + a difflib "did you mean"). The durable fix is a shared <code>BoostArgumentParser</code> subclass whose <code>error()</code>/usage route through the Aurora output layer, adopted across the ~50 per-command parsers — a broad, test-first sweep, so logged rather than rushed.</p>
|
|
450
450
|
<div class="rmeta"><span class="m-cat">ux</span><span>Complexity L</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★☆☆</span></div>
|
|
451
451
|
<div class="rref"><code>cliparse.py (BoostArgumentParser) · all 10 command files</code></div>
|
|
@@ -453,7 +453,7 @@
|
|
|
453
453
|
|
|
454
454
|
<article class="ritem" id="BOOST-D26" data-track="commands" data-impact="high">
|
|
455
455
|
<div class="ritem-top"><span class="rid">BOOST-D26</span><span class="rstatus done">Shipped</span></div>
|
|
456
|
-
<
|
|
456
|
+
<h3><code>browse</code> — Aurora the full-screen TUI</h3>
|
|
457
457
|
<p>The interactive <code>browse</code> pane was the <b>last off-theme surface</b>: a curses screen drawn in raw <code>A_BOLD</code>/<code>A_DIM</code>/<code>A_REVERSE</code> — zero brand color while every other command spoke Aurora. Rebuilt it as a first-class TUI: a macOS <b>titlebar</b> (traffic-light dots + <code>boost browse</code> wordmark under a cyan→violet→pink gradient rule), an <code>❯</code> chevron prompt with a live <code>▏</code> caret, <b>fuzzy-match highlighting</b> (matched chars glow pink as you type), a cyan selection bar, yellow curated <code>★</code>, violet tap labels, a right-edge scrollbar, and a gradient-topped detail pane with <code>#tag</code> chips. Colors come from the single-source <code>out.TOKENS</code> via <code>init_color</code> — parity-locked to <code>style/boost.css</code> — and degrade truecolor → 8-color → monochrome. Stdlib only. With this, <b>every boost command is on-theme</b>.</p>
|
|
458
458
|
<div class="rmeta"><span class="m-cat">commands</span><span>Complexity L</span><span class="m-imp high">Impact High</span><span class="m-wow">★★★★★</span></div>
|
|
459
459
|
<div class="rref"><code>commands/discovery.py · _browse_tui / _aurora_theme</code></div>
|
|
@@ -467,7 +467,7 @@
|
|
|
467
467
|
<div class="track-head">
|
|
468
468
|
<div class="track-icon"></div>
|
|
469
469
|
<div>
|
|
470
|
-
<
|
|
470
|
+
<h2>Design System & Tooling</h2>
|
|
471
471
|
<p>One source of truth for the brand — and the tools to show it off.</p>
|
|
472
472
|
</div>
|
|
473
473
|
<span class="n"><!-- ROADMAP:count track=system -->4 items<!-- /ROADMAP:count --></span>
|
|
@@ -477,7 +477,7 @@
|
|
|
477
477
|
<!-- ROADMAP:cards track=system -->
|
|
478
478
|
<article class="ritem" id="BOOST-D19" data-track="system" data-impact="med">
|
|
479
479
|
<div class="ritem-top"><span class="rid">BOOST-D19</span><span class="rstatus done">Shipped</span></div>
|
|
480
|
-
<
|
|
480
|
+
<h3>Resolve theme drift: <code>style/</code> vs <code>docs/style/</code></h3>
|
|
481
481
|
<p>Two copies of <code>boost.css</code> have <b>diverged</b>: the root <code>style/</code> uses a cyan→violet→pink gradient (<code>--violet #a855f7</code>), while <code>docs/style/</code> uses an orange→pink→violet one (<code>--violet #a78bfa</code>). Same brand, two looks. Pick <code>style/</code> as canonical and make <code>docs/style/</code> a generated copy or symlink so the portfolio, roadmaps and CLI can't drift again.</p>
|
|
482
482
|
<div class="rmeta"><span class="m-cat">system</span><span>Complexity S</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★☆☆</span></div>
|
|
483
483
|
<div class="rref"><code>style/boost.css · docs/style/boost.css</code></div>
|
|
@@ -485,7 +485,7 @@
|
|
|
485
485
|
|
|
486
486
|
<article class="ritem" id="BOOST-D20" data-track="system" data-impact="med">
|
|
487
487
|
<div class="ritem-top"><span class="rid">BOOST-D20</span><span class="rstatus done">Shipped</span></div>
|
|
488
|
-
<
|
|
488
|
+
<h3>Single source of design tokens (web ↔ CLI)</h3>
|
|
489
489
|
<p><b>Done:</b> the CLI palette is now single-sourced — one <code>output.TOKENS</code> dict holds every Aurora RGB triple, and the gradient, brand tints and badges all <em>derive</em> from it (previously cyan/violet/pink were re-typed across <code>_AURORA</code> and <code>_GRAD_STOPS</code>). A test locks the contract so a stray hex can't drift. <b>Remaining:</b> lift <code>TOKENS</code> into a shared <code>tokens.json</code> and generate <em>both</em> the CSS custom properties and this map from it, so the site and the terminal move in lockstep. <b>Shipped as enforcement instead of generation:</b> a unit test parses <code>style/boost.css</code> and asserts every <code>--token</code> matches <code>output.TOKENS</code>, so a hex changed in one place and not the other fails CI — the same guarantee without rewriting the hand-authored stylesheet.</p>
|
|
490
490
|
<div class="rmeta"><span class="m-cat">system</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★☆</span></div>
|
|
491
491
|
<div class="rref"><code>core/output.py TOKENS · style/boost.css · future build_tokens.py</code></div>
|
|
@@ -493,7 +493,7 @@
|
|
|
493
493
|
|
|
494
494
|
<article class="ritem" id="BOOST-D21" data-track="system" data-impact="med">
|
|
495
495
|
<div class="ritem-top"><span class="rid">BOOST-D21</span><span class="rstatus done">Shipped</span></div>
|
|
496
|
-
<
|
|
496
|
+
<h3>Scripted demo recording (VHS / asciinema)</h3>
|
|
497
497
|
<p>There's a <code>docs/demo.tape</code> + <code>demo.gif</code>, but no repeatable way to re-record once the aesthetic changes — and <code>tmux</code> isn't even installed in the dev box. Add a <code>make demo</code> that drives a scripted session (VHS tape or asciinema, optionally split-pane via tmux) and refreshes the GIF, so the README and portfolio always show the current look.</p>
|
|
498
498
|
<div class="rmeta"><span class="m-cat">tooling</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★☆</span></div>
|
|
499
499
|
<div class="rref"><code>docs/demo.tape · Makefile</code></div>
|
|
@@ -501,7 +501,7 @@
|
|
|
501
501
|
|
|
502
502
|
<article class="ritem" id="BOOST-D22" data-track="system" data-impact="med">
|
|
503
503
|
<div class="ritem-top"><span class="rid">BOOST-D22</span><span class="rstatus done">Shipped</span></div>
|
|
504
|
-
<
|
|
504
|
+
<h3>README / portfolio terminal parity</h3>
|
|
505
505
|
<p>The web <code>.window</code> mock shows an <em>idealized</em> boost session — gradient prompt, clean checks — that the real CLI doesn't yet produce. Once D01–D15 land, update the mock (and README code blocks) to mirror the true output 1:1, so every screenshot is honest and the brand reads identically across web, README and terminal.</p>
|
|
506
506
|
<div class="rmeta"><span class="m-cat">system</span><span>Complexity S</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★☆</span></div>
|
|
507
507
|
<div class="rref"><code>docs/index.html · README.md · style/demo.html</code></div>
|
|
@@ -18,7 +18,12 @@
|
|
|
18
18
|
text-wrap: balance; margin-top: 24px; }
|
|
19
19
|
.hero p.lede { max-width: 700px; margin-top: 24px; font-size: 18.5px; color: var(--text-2); }
|
|
20
20
|
.crumbs { font-family: var(--mono); font-size: 12.5px; color: var(--text-3); margin-bottom: 4px; }
|
|
21
|
-
|
|
21
|
+
/* Underlined, not colour-only: --sky on --text-3 is 2.47:1, under the 3:1
|
|
22
|
+
WCAG 1.4.1 needs to distinguish a link from its surrounding text by
|
|
23
|
+
colour alone. The underline is the non-colour cue (same pattern as
|
|
24
|
+
`footer a` in boost.css). Caught by the axe-core sweep. */
|
|
25
|
+
.crumbs a { color: var(--sky); text-decoration: underline;
|
|
26
|
+
text-underline-offset: 2px; text-decoration-thickness: 1px; }
|
|
22
27
|
.stats { margin-top: 58px; }
|
|
23
28
|
|
|
24
29
|
.lead { max-width: 760px; margin: 0 auto; text-align: center; color: var(--text-2);
|
|
@@ -18,7 +18,12 @@
|
|
|
18
18
|
text-wrap: balance; margin-top: 24px; }
|
|
19
19
|
.hero p.lede { max-width: 680px; margin-top: 24px; font-size: 18.5px; color: var(--text-2); }
|
|
20
20
|
.crumbs { font-family: var(--mono); font-size: 12.5px; color: var(--text-3); margin-bottom: 4px; }
|
|
21
|
-
|
|
21
|
+
/* Underlined, not colour-only: --sky on --text-3 is 2.47:1, under the 3:1
|
|
22
|
+
WCAG 1.4.1 needs to distinguish a link from its surrounding text by
|
|
23
|
+
colour alone. The underline is the non-colour cue (same pattern as
|
|
24
|
+
`footer a` in boost.css). Caught by the axe-core sweep. */
|
|
25
|
+
.crumbs a { color: var(--sky); text-decoration: underline;
|
|
26
|
+
text-underline-offset: 2px; text-decoration-thickness: 1px; }
|
|
22
27
|
.stats { margin-top: 58px; }
|
|
23
28
|
|
|
24
29
|
/* Diagram frame: a glass surface that scrolls its own wide SVG (body never scrolls X). */
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: accessibility-audit-pa11y-ci-axe-core
|
|
3
|
+
board: code
|
|
4
|
+
section: docsite
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Quality · A11y
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 4
|
|
10
|
+
note: WCAG AA
|
|
11
|
+
order: 3
|
|
12
|
+
owner: loop/a11y-audit
|
|
13
|
+
pr: 243
|
|
14
|
+
title: Accessibility audit — <code>pa11y-ci</code> / axe-core
|
|
15
|
+
---
|
|
16
|
+
WCAG 2.1 AA over every docs page, in two halves. <code>scripts/a11y_check.py</code>
|
|
17
|
+
is the always-on gate: pure stdlib, so it runs in the lint job beside the other
|
|
18
|
+
<code>--check</code> scripts with no Node, Chrome or network. It covers what the
|
|
19
|
+
markup alone decides — <code>lang</code>, <code>alt</code>, accessible names for
|
|
20
|
+
links and buttons, duplicate ids, heading order — plus the 1.4.3 contrast ratios
|
|
21
|
+
computed from the Aurora tokens for the ink/ground pairs the CSS actually puts
|
|
22
|
+
together (listing the real pairs, not the cross-product, so a pair that never
|
|
23
|
+
renders can't cry wolf). The axe-core sweep in <code>tests/visual/</code> is the
|
|
24
|
+
other half: contrast as <em>rendered</em> over glass and gradient, ARIA validity
|
|
25
|
+
against the computed tree, landmarks, focusable-but-hidden elements — everything
|
|
26
|
+
that needs a live DOM and therefore can't be a cheap always-on gate. The audit
|
|
27
|
+
found one real failure, a skipped heading level on the design board, fixed by
|
|
28
|
+
promoting the section headings with their class-scoped selectors in lockstep so
|
|
29
|
+
the rendering is unchanged. Contrast came back clean: the muted tokens the card
|
|
30
|
+
suspected were already fixed (<code>--text-3</code> had been raised from a 3.9:1
|
|
31
|
+
value), and this gate is what keeps them that way.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: coverage-guided-fuzzing-atheris-oss-fuzz
|
|
3
|
+
board: code
|
|
4
|
+
section: health
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Testing · Bug
|
|
7
|
+
complexity: L
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 4
|
|
10
|
+
note: stretch
|
|
11
|
+
order: 8
|
|
12
|
+
owner: loop/fuzz-parsers
|
|
13
|
+
pr: 242
|
|
14
|
+
title: Coverage-guided fuzzing — <code>atheris</code> / OSS-Fuzz
|
|
15
|
+
---
|
|
16
|
+
Google's <code>atheris</code> instruments the bytecode and evolves inputs toward
|
|
17
|
+
uncovered branches in boost's two hand-rolled parsers — the SKILL.md frontmatter
|
|
18
|
+
reader (a stdlib-only YAML subset, so no upstream project's fuzzing covers it)
|
|
19
|
+
and the tap-spec parser. It has already paid for itself: the frontmatter harness
|
|
20
|
+
found that numeric coercion was <em>lossy</em>. <code>version: 1.10</code> is ten
|
|
21
|
+
patch releases past 1.1, but <code>float("1.10")</code> is <code>1.1</code> — so
|
|
22
|
+
boost read a skill published at 1.10 as 1.1, compared it as older than 1.9, and
|
|
23
|
+
never offered the update, with <code>boost outdated</code> reporting "everything
|
|
24
|
+
up to date" while the tap was nine releases ahead. Note that "it doesn't crash"
|
|
25
|
+
would have missed it entirely: the invariant has to compare the parsed value
|
|
26
|
+
against the source text. The seeds through every invariant run in the required
|
|
27
|
+
suite so a harness cannot rot; the coverage-guided run is a weekly non-blocking
|
|
28
|
+
job, because a timed search is not reproducible enough to gate a merge. Targets
|
|
29
|
+
follow the OSS-Fuzz Python contract, ready for continuous runs once boost
|
|
30
|
+
qualifies.
|