boost-skill-cli 1.0.185__tar.gz → 1.0.186__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.
Files changed (340) hide show
  1. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/.gitignore +3 -0
  2. boost_skill_cli-1.0.186/.lycheeignore +11 -0
  3. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/Makefile +1 -0
  4. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/PKG-INFO +3 -2
  5. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/README.md +2 -1
  6. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/_version.py +2 -2
  7. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_skill_cli.egg-info/PKG-INFO +3 -2
  8. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_skill_cli.egg-info/SOURCES.txt +6 -1
  9. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/adapters.html +2 -0
  10. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/eval.html +3 -0
  11. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/mcp-hub.html +5 -0
  12. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/boost-run-live-agents.md +1 -1
  13. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +10 -5
  14. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/framework-adapter-langgraph.md +1 -1
  15. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/framework-adapter-multi-agent.md +1 -1
  16. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/framework-adapters-boost-adapt.md +1 -1
  17. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +2 -2
  18. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +1 -1
  19. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +3 -3
  20. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap.html +16 -11
  21. boost_skill_cli-1.0.186/scripts/check_anchors.py +108 -0
  22. boost_skill_cli-1.0.186/tests/unit/test_check_anchors.py +79 -0
  23. boost_skill_cli-1.0.186/tests/visual/package.json +7 -0
  24. boost_skill_cli-1.0.186/tests/visual/visual_check.mjs +98 -0
  25. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/.gitattributes +0 -0
  26. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/.gitleaks.toml +0 -0
  27. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/.htmlvalidate.json +0 -0
  28. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/.markdownlint-cli2.jsonc +0 -0
  29. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/.pre-commit-config.yaml +0 -0
  30. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/.stylelintrc.json +0 -0
  31. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/.vale/styles/boost/Terminology.yml +0 -0
  32. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
  33. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/.vale.ini +0 -0
  34. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/CLAUDE.md +0 -0
  35. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/CONTRIBUTING.md +0 -0
  36. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/LICENSE +0 -0
  37. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/MANIFEST.in +0 -0
  38. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/SECURITY.md +0 -0
  39. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost +0 -0
  40. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/__init__.py +0 -0
  41. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/__main__.py +0 -0
  42. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/cli.py +0 -0
  43. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/cliparse.py +0 -0
  44. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/commands/__init__.py +0 -0
  45. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/commands/bmad.py +0 -0
  46. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/commands/configuration.py +0 -0
  47. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/commands/discovery.py +0 -0
  48. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/commands/hooks.py +0 -0
  49. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/commands/info.py +0 -0
  50. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/commands/intelligence.py +0 -0
  51. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/commands/pkg.py +0 -0
  52. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/commands/quality.py +0 -0
  53. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/commands/taps.py +0 -0
  54. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/commands/team.py +0 -0
  55. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/__init__.py +0 -0
  56. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/adapters.py +0 -0
  57. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/agents.py +0 -0
  58. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/ai.py +0 -0
  59. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/catalog.py +0 -0
  60. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/claude_settings.py +0 -0
  61. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/config.py +0 -0
  62. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/dense.py +0 -0
  63. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/embed.py +0 -0
  64. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/frontmatter.py +0 -0
  65. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/gitutil.py +0 -0
  66. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/imperative.py +0 -0
  67. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/injectscan.py +0 -0
  68. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/journal.py +0 -0
  69. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/lockfile.py +0 -0
  70. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/logs.py +0 -0
  71. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/mcp.py +0 -0
  72. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/nethttp.py +0 -0
  73. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/output.py +0 -0
  74. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/paths.py +0 -0
  75. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/policy.py +0 -0
  76. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/rag.py +0 -0
  77. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/registry.py +0 -0
  78. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/rules.py +0 -0
  79. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/secretscan.py +0 -0
  80. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/serve.py +0 -0
  81. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/stackprobe.py +0 -0
  82. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/staleness.py +0 -0
  83. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/store.py +0 -0
  84. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/typosquat.py +0 -0
  85. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/updatediff.py +0 -0
  86. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/util.py +0 -0
  87. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/core/workflows.py +0 -0
  88. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/data/registries.json +0 -0
  89. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/errors.py +0 -0
  90. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_cli/spin.py +0 -0
  91. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  92. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  93. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_skill_cli.egg-info/requires.txt +0 -0
  94. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/boost_skill_cli.egg-info/top_level.txt +0 -0
  95. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/.claude/settings.local.json +0 -0
  96. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/DEBUGGING.md +0 -0
  97. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/commands.html +0 -0
  98. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/demo.gif +0 -0
  99. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/demo.tape +0 -0
  100. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/design-roadmap.html +0 -0
  101. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/index.html +0 -0
  102. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/rag-architecture.md +0 -0
  103. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D01.md +0 -0
  104. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D02.md +0 -0
  105. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D03.md +0 -0
  106. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D04.md +0 -0
  107. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D05.md +0 -0
  108. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D06.md +0 -0
  109. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D07.md +0 -0
  110. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D08.md +0 -0
  111. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D09.md +0 -0
  112. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D10.md +0 -0
  113. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D11.md +0 -0
  114. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D12.md +0 -0
  115. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D13.md +0 -0
  116. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D14.md +0 -0
  117. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D15.md +0 -0
  118. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D16.md +0 -0
  119. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D17.md +0 -0
  120. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D18.md +0 -0
  121. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D19.md +0 -0
  122. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D20.md +0 -0
  123. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D21.md +0 -0
  124. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D22.md +0 -0
  125. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D23.md +0 -0
  126. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D24.md +0 -0
  127. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D25.md +0 -0
  128. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/BOOST-D26.md +0 -0
  129. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  130. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  131. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  132. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  133. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  134. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  135. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  136. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
  137. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  138. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  139. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  140. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  141. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  142. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  143. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  144. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  145. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  146. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  147. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
  148. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  149. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  150. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  151. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  152. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  153. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  154. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  155. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  156. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
  157. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  158. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  159. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
  160. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  161. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  162. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  163. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  164. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
  165. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  166. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  167. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  168. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  169. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  170. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  171. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  172. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
  173. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
  174. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  175. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  176. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  177. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  178. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  179. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  180. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  181. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  182. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  183. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  184. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  185. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  186. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  187. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  188. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  189. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  190. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  191. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  192. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
  193. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  194. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  195. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  196. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  197. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  198. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  199. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  200. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
  201. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  202. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  203. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
  204. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  205. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  206. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  207. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  208. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  209. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  210. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  211. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  212. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  213. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  214. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  215. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  216. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  217. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  218. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  219. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  220. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  221. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  222. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
  223. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  224. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  225. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
  226. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  227. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  228. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/docs/roadmap/items/workspace-scope-install.md +0 -0
  229. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/eslint.config.mjs +0 -0
  230. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/examples/README.md +0 -0
  231. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/examples/adapt-demo.sh +0 -0
  232. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/examples/boost-run-prototype.sh +0 -0
  233. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/index.html +0 -0
  234. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/noxfile.py +0 -0
  235. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/pyproject.toml +0 -0
  236. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/scripts/bench_cli.sh +0 -0
  237. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/scripts/build_command_reference.py +0 -0
  238. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/scripts/build_registries.py +0 -0
  239. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/scripts/build_roadmap.py +0 -0
  240. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/scripts/ensure_eval_corpus.sh +0 -0
  241. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/scripts/eval_explain.py +0 -0
  242. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/scripts/eval_recommend.py +0 -0
  243. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/scripts/eval_retrieval.py +0 -0
  244. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/scripts/eval_stats_summary.py +0 -0
  245. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/scripts/import_budget.py +0 -0
  246. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/scripts/mutation_gate.py +0 -0
  247. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/scripts/perf_gate.py +0 -0
  248. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/setup.cfg +0 -0
  249. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/style/README.md +0 -0
  250. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/style/boost.css +0 -0
  251. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/style/boost.js +0 -0
  252. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/style/demo.html +0 -0
  253. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/adapt.feature +0 -0
  254. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/browse.feature +0 -0
  255. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/count.feature +0 -0
  256. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/discover.feature +0 -0
  257. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/doctor.feature +0 -0
  258. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/environment.py +0 -0
  259. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/explain.feature +0 -0
  260. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/index.feature +0 -0
  261. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/install.feature +0 -0
  262. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/list.feature +0 -0
  263. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/mcp.feature +0 -0
  264. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/search.feature +0 -0
  265. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/steps/cli_steps.py +0 -0
  266. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/steps/discovery_steps.py +0 -0
  267. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/steps/mcp_steps.py +0 -0
  268. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/bdd/features/steps/quality_steps.py +0 -0
  269. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/conftest.py +0 -0
  270. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/eval/baseline.json +0 -0
  271. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/eval/explain.jsonl +0 -0
  272. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/eval/golden.jsonl +0 -0
  273. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/eval/recommend.jsonl +0 -0
  274. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/eval/taps.txt +0 -0
  275. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/functional/test_cli_adapt.py +0 -0
  276. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/functional/test_cli_bmad.py +0 -0
  277. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/functional/test_cli_configuration.py +0 -0
  278. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/functional/test_cli_discovery.py +0 -0
  279. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/functional/test_cli_hooks.py +0 -0
  280. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/functional/test_cli_info.py +0 -0
  281. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/functional/test_cli_intelligence.py +0 -0
  282. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/functional/test_cli_pkg.py +0 -0
  283. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/functional/test_cli_quality.py +0 -0
  284. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/functional/test_cli_taps.py +0 -0
  285. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/functional/test_cli_team.py +0 -0
  286. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/functional/test_everyday_loop.py +0 -0
  287. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/functional/test_property_parsers.py +0 -0
  288. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/make_fixture.py +0 -0
  289. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/perf/test_benchmarks.py +0 -0
  290. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/smoke.sh +0 -0
  291. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_adapters.py +0 -0
  292. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_agents.py +0 -0
  293. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_ai.py +0 -0
  294. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_catalog.py +0 -0
  295. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_claude_settings.py +0 -0
  296. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_cliparse.py +0 -0
  297. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_command_reference_fresh.py +0 -0
  298. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_config.py +0 -0
  299. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_dense.py +0 -0
  300. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_dense_fallback.py +0 -0
  301. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_docs_pages_linked.py +0 -0
  302. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_embed.py +0 -0
  303. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_errors_and_cli_table.py +0 -0
  304. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_eval_stats_summary.py +0 -0
  305. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_frontmatter.py +0 -0
  306. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_gitleaks_config.py +0 -0
  307. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_gitutil.py +0 -0
  308. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_imperative.py +0 -0
  309. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_import_budget.py +0 -0
  310. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_injectscan.py +0 -0
  311. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_journal.py +0 -0
  312. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_lockfile.py +0 -0
  313. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_logs.py +0 -0
  314. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_mcp.py +0 -0
  315. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_mutation_hardening.py +0 -0
  316. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_nethttp.py +0 -0
  317. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_output.py +0 -0
  318. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_paths.py +0 -0
  319. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_perf_gate.py +0 -0
  320. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_pkg_confusions.py +0 -0
  321. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_pkg_injection.py +0 -0
  322. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_pkg_secrets.py +0 -0
  323. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_policy.py +0 -0
  324. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_rag.py +0 -0
  325. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_registries_fresh.py +0 -0
  326. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_registry.py +0 -0
  327. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_roadmap_fresh.py +0 -0
  328. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_rules.py +0 -0
  329. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_secretscan.py +0 -0
  330. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_serve.py +0 -0
  331. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_spin.py +0 -0
  332. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_stackprobe.py +0 -0
  333. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_staleness.py +0 -0
  334. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_store.py +0 -0
  335. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_token_parity.py +0 -0
  336. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_typosquat.py +0 -0
  337. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_updatediff.py +0 -0
  338. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_util.py +0 -0
  339. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_version.py +0 -0
  340. {boost_skill_cli-1.0.185 → boost_skill_cli-1.0.186}/tests/unit/test_workflows.py +0 -0
@@ -230,3 +230,6 @@ mutants/
230
230
 
231
231
  # sandboxed boost home for the Tier 1 eval corpus (`make eval` taps here)
232
232
  .eval-home/
233
+ tests/visual/node_modules/
234
+ tests/visual/out/
235
+ tests/visual/package-lock.json
@@ -0,0 +1,11 @@
1
+ # Links lychee should not fetch.
2
+ #
3
+ # The docs are the GitHub Pages site rooted at docs/, so every asset and
4
+ # cross-page link is checked as a real file path — nothing is excluded for
5
+ # convenience. These two entries are unavoidable:
6
+
7
+ # Local dev server referenced in `boost serve` documentation examples.
8
+ ^https?://(localhost|127\.0\.0\.1)(:\d+)?
9
+
10
+ # Example/placeholder hosts in configuration snippets (not real endpoints).
11
+ ^https?://(example\.(com|org)|your-org)
@@ -57,6 +57,7 @@ lint:
57
57
  $(PY) scripts/build_command_reference.py --check
58
58
  $(PY) scripts/import_budget.py
59
59
  $(PY) scripts/perf_gate.py
60
+ $(PY) scripts/check_anchors.py
60
61
 
61
62
  # Supply-chain CVE gate: fail on a known OSV/PyPI advisory in the project's
62
63
  # dependency closure. Mirrors the pip-audit CI workflow; run before releasing.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.185
3
+ Version: 1.0.186
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -840,7 +840,8 @@ boost bundle dump > Boostfile # everyone else runs: boost bundle install
840
840
  ## 75 commands, organized into 8 groups
841
841
 
842
842
  `boost --help` prints the full grouped command list; for a visual tour see
843
- [`docs/overview.html`](docs/overview.html).
843
+ [`docs/index.html`](docs/index.html), and for every flag of every command see
844
+ [`docs/commands.html`](docs/commands.html).
844
845
 
845
846
  | Group | Commands |
846
847
  |---|---|
@@ -124,7 +124,8 @@ boost bundle dump > Boostfile # everyone else runs: boost bundle install
124
124
  ## 75 commands, organized into 8 groups
125
125
 
126
126
  `boost --help` prints the full grouped command list; for a visual tour see
127
- [`docs/overview.html`](docs/overview.html).
127
+ [`docs/index.html`](docs/index.html), and for every flag of every command see
128
+ [`docs/commands.html`](docs/commands.html).
128
129
 
129
130
  | Group | Commands |
130
131
  |---|---|
@@ -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.185'
22
- __version_tuple__ = version_tuple = (1, 0, 185)
21
+ __version__ = version = '1.0.186'
22
+ __version_tuple__ = version_tuple = (1, 0, 186)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.185
3
+ Version: 1.0.186
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -840,7 +840,8 @@ boost bundle dump > Boostfile # everyone else runs: boost bundle install
840
840
  ## 75 commands, organized into 8 groups
841
841
 
842
842
  `boost --help` prints the full grouped command list; for a visual tour see
843
- [`docs/overview.html`](docs/overview.html).
843
+ [`docs/index.html`](docs/index.html), and for every flag of every command see
844
+ [`docs/commands.html`](docs/commands.html).
844
845
 
845
846
  | Group | Commands |
846
847
  |---|---|
@@ -2,6 +2,7 @@
2
2
  .gitignore
3
3
  .gitleaks.toml
4
4
  .htmlvalidate.json
5
+ .lycheeignore
5
6
  .markdownlint-cli2.jsonc
6
7
  .pre-commit-config.yaml
7
8
  .stylelintrc.json
@@ -232,6 +233,7 @@ scripts/bench_cli.sh
232
233
  scripts/build_command_reference.py
233
234
  scripts/build_registries.py
234
235
  scripts/build_roadmap.py
236
+ scripts/check_anchors.py
235
237
  scripts/ensure_eval_corpus.sh
236
238
  scripts/eval_explain.py
237
239
  scripts/eval_recommend.py
@@ -286,6 +288,7 @@ tests/unit/test_adapters.py
286
288
  tests/unit/test_agents.py
287
289
  tests/unit/test_ai.py
288
290
  tests/unit/test_catalog.py
291
+ tests/unit/test_check_anchors.py
289
292
  tests/unit/test_claude_settings.py
290
293
  tests/unit/test_cliparse.py
291
294
  tests/unit/test_command_reference_fresh.py
@@ -331,4 +334,6 @@ tests/unit/test_typosquat.py
331
334
  tests/unit/test_updatediff.py
332
335
  tests/unit/test_util.py
333
336
  tests/unit/test_version.py
334
- tests/unit/test_workflows.py
337
+ tests/unit/test_workflows.py
338
+ tests/visual/package.json
339
+ tests/visual/visual_check.mjs
@@ -38,6 +38,8 @@
38
38
  table.map td.sdk code { color: var(--green); }
39
39
  .two { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; margin-top: 30px; }
40
40
  @media (max-width: 760px) { .two { grid-template-columns: 1fr; } }
41
+ /* narrow screens: the mapping table scrolls inside itself (visual_check) */
42
+ @media (max-width: 760px) { table.map { display: block; overflow-x: auto; } }
41
43
  .panel { border: 1px solid var(--line); border-radius: 14px; padding: 22px 22px 8px;
42
44
  background: var(--panel); }
43
45
  .panel h3 { font-size: 16px; margin: 0 0 4px; }
@@ -98,6 +98,9 @@
98
98
  footer p { color: var(--text-3); font-size: 13px; }
99
99
  footer a { color: var(--sky); text-decoration: none; }
100
100
 
101
+ /* narrow screens: the contract table scrolls inside itself instead of
102
+ widening the document (caught by tests/visual/visual_check.mjs) */
103
+ @media (max-width: 760px) { table.contract { display: block; overflow-x: auto; } }
101
104
  @media (max-width: 820px) {
102
105
  .cheat { grid-template-columns: 1fr; }
103
106
  .cheat .col-head.tech { margin-top: 8px; }
@@ -86,6 +86,11 @@
86
86
  footer p { color: var(--text-3); font-size: 13px; }
87
87
  footer a { color: var(--sky); text-decoration: none; }
88
88
 
89
+ /* grid items default to min-width:auto, so one unbreakable code string
90
+ can push the single-column cheat grid past the viewport (visual_check) */
91
+ .cheat > * { min-width: 0; }
92
+ .sec-title code { overflow-wrap: anywhere; } /* boost_discover_github in an h2 */
93
+ details.card .body code { overflow-wrap: anywhere; }
89
94
  @media (max-width: 820px) {
90
95
  .cheat, .split { grid-template-columns: 1fr; }
91
96
  .cheat .col-head.tech { margin-top: 8px; }
@@ -13,4 +13,4 @@ owner:
13
13
  pr:
14
14
  title: <code>boost run</code> — search → adapt → a live agent doing the task, in one command
15
15
  ---
16
- The allure ceiling on <code>boost adapt</code> (#146, #163): it stops at <b>source you assemble</b>, and the adapted agent has a brain (prompt) but no <b>hands</b> (tools). Close both. <code>boost run &lt;skill&gt; [target]</code> = adapt → wire a default toolset (file read, ripgrep/shell, web) → execute on boost's model and stream the result. Opt-in like the conformance path (installs the framework + needs a key, so the zero-dep default holds). Two prerequisites ship with it: (1) <b>tool-wiring</b> — emit/attach the tools a skill needs (or declares) so the agent can act, not roleplay; (2) reuse the <a href="../adapters.html">adapt</a> renderer for the agent def. Pairs with <code>[[framework-adapter-multi-agent]]</code> so a skill like <code>rust-review</code> runs as a real crew. This is the screenshot: "one command → an expert agent audits your repo, on Claude, that you never wrote." <b>Working preview:</b> <code>examples/boost-run-prototype.sh</code> already does this by hand (adapt → wire a read_file tool → <code>Runner.run</code> on a file with planted bugs).
16
+ The allure ceiling on <code>boost adapt</code> (#146, #163): it stops at <b>source you assemble</b>, and the adapted agent has a brain (prompt) but no <b>hands</b> (tools). Close both. <code>boost run &lt;skill&gt; [target]</code> = adapt → wire a default toolset (file read, ripgrep/shell, web) → execute on boost's model and stream the result. Opt-in like the conformance path (installs the framework + needs a key, so the zero-dep default holds). Two prerequisites ship with it: (1) <b>tool-wiring</b> — emit/attach the tools a skill needs (or declares) so the agent can act, not roleplay; (2) reuse the <a href="adapters.html">adapt</a> renderer for the agent def. Pairs with <code>[[framework-adapter-multi-agent]]</code> so a skill like <code>rust-review</code> runs as a real crew. This is the screenshot: "one command → an expert agent audits your repo, on Claude, that you never wrote." <b>Working preview:</b> <code>examples/boost-run-prototype.sh</code> already does this by hand (adapt → wire a read_file tool → <code>Runner.run</code> on a file with planted bugs).
@@ -2,19 +2,24 @@
2
2
  id: broken-link-and-anchor-checking-lychee
3
3
  board: code
4
4
  section: docsite
5
- status: planned
5
+ status: shipped
6
6
  category: Quality · Docs
7
7
  complexity: S
8
8
  impact: Med
9
9
  wow: 3
10
- note: URLs + anchors
10
+ note: 8 dead links found
11
11
  order: 5
12
- owner:
13
- pr:
12
+ owner: loop/lychee
13
+ pr: 210
14
14
  title: Broken-link &amp; anchor checking — <code>lychee</code>
15
15
  ---
16
16
  Fast, free link checker over the README and <code>docs/*.html</code>:
17
17
  verifies external URLs (GitHub, PyPI), asset paths
18
18
  (<code>../style/boost.css</code>) and in-page anchors
19
19
  (<code>#next</code>, <code>#health</code>) still resolve. A dead link in
20
- the landing page is the first broken promise a visitor sees.
20
+ the landing page is the first broken promise a visitor sees. Red on
21
+ its first run: eight were already broken — four <code>../adapters.html</code>
22
+ at the wrong depth, two dangling anchors, one link to an item file as
23
+ though it were a page, and a README pointing at
24
+ <code>docs/overview.html</code>, renamed to <code>index.html</code>
25
+ and never updated.
@@ -13,4 +13,4 @@ owner:
13
13
  pr:
14
14
  title: <code>boost adapt --to langgraph</code> — third framework renderer
15
15
  ---
16
- Extend <code>boost adapt</code> (shipped in #146) with a LangGraph target. Unlike CrewAI / Agents-SDK, a LangGraph agent isn't one <code>Agent(...)</code> constructor — the skill body is the system prompt of a node bound into a <code>StateGraph</code>. Add a <code>render_langgraph</code> to <code>core/adapters.py</code> emitting a node factory (prebuilt <code>create_react_agent</code>, or a prompt-carrying node) + its <code>FORMATS</code> row, with byte-exact golden + <code>compile()</code> tests. Then add a <code>langgraph</code> leg to <code>.github/workflows/adapter-conformance.yml</code> (pip install langgraph, import the emitted file). Follows the pattern in <a href="../adapters.html">adapters.html</a>: one <code>render_*</code> fn + registry row + golden test + one matrix line.
16
+ Extend <code>boost adapt</code> (shipped in #146) with a LangGraph target. Unlike CrewAI / Agents-SDK, a LangGraph agent isn't one <code>Agent(...)</code> constructor — the skill body is the system prompt of a node bound into a <code>StateGraph</code>. Add a <code>render_langgraph</code> to <code>core/adapters.py</code> emitting a node factory (prebuilt <code>create_react_agent</code>, or a prompt-carrying node) + its <code>FORMATS</code> row, with byte-exact golden + <code>compile()</code> tests. Then add a <code>langgraph</code> leg to <code>.github/workflows/adapter-conformance.yml</code> (pip install langgraph, import the emitted file). Follows the pattern in <a href="adapters.html">adapters.html</a>: one <code>render_*</code> fn + registry row + golden test + one matrix line.
@@ -13,4 +13,4 @@ owner:
13
13
  pr:
14
14
  title: <code>boost adapt</code> — multi-agent skills → crews/graphs, not one Agent
15
15
  ---
16
- Today <code>boost adapt</code> (#146, #163) projects a skill into a <b>single</b> framework Agent carrying its instructions/role/model — but a skill can declare tools and a whole subagent graph (e.g. <code>rust-review</code> = worker + dedup-judge + fp-judge). Adapt the richer structure: emit a CrewAI <code>Crew</code> (agents + tasks) or a LangGraph <code>StateGraph</code> when a skill's frontmatter/plugin dir declares subagents, and surface declared tools as stubs. Scope: detect subagent/tool declarations in <code>SKILL.md</code>/<code>plugins/*/agents/*.md</code>; add a crew/graph renderer path in <code>core/adapters.py</code> (single-Agent stays the default for flat skills); golden + <code>compile()</code> tests + a conformance leg. Turns "one skill → one agent" into "one skill → a runnable multi-agent workflow." See <a href="../adapters.html">adapters.html</a>.
16
+ Today <code>boost adapt</code> (#146, #163) projects a skill into a <b>single</b> framework Agent carrying its instructions/role/model — but a skill can declare tools and a whole subagent graph (e.g. <code>rust-review</code> = worker + dedup-judge + fp-judge). Adapt the richer structure: emit a CrewAI <code>Crew</code> (agents + tasks) or a LangGraph <code>StateGraph</code> when a skill's frontmatter/plugin dir declares subagents, and surface declared tools as stubs. Scope: detect subagent/tool declarations in <code>SKILL.md</code>/<code>plugins/*/agents/*.md</code>; add a crew/graph renderer path in <code>core/adapters.py</code> (single-Agent stays the default for flat skills); golden + <code>compile()</code> tests + a conformance leg. Turns "one skill → one agent" into "one skill → a runnable multi-agent workflow." See <a href="adapters.html">adapters.html</a>.
@@ -13,4 +13,4 @@ owner: loop/framework-adapters
13
13
  pr: 146
14
14
  title: <code>boost adapt</code> — render a skill as another framework's agent source
15
15
  ---
16
- boost only installs skills as files for editor agents (Claude Code, Cursor, Windsurf); CrewAI / OpenAI-Agents-SDK apps can't consume them — an agent there is a value built in source. <code>boost adapt &lt;skill&gt; --to crewai|agents-sdk</code> renders one <code>SKILL.md</code> into each framework's native <code>Agent(...)</code> as a deterministic, zero-dependency string transform (<code>core/adapters.py</code>). Strings emit via <code>json.dumps</code> so any body (quotes, <code>"""</code>, unicode) stays valid Python; 97.6% mutation kill. Docs: <a href="../adapters.html">adapters.html</a>.
16
+ boost only installs skills as files for editor agents (Claude Code, Cursor, Windsurf); CrewAI / OpenAI-Agents-SDK apps can't consume them — an agent there is a value built in source. <code>boost adapt &lt;skill&gt; --to crewai|agents-sdk</code> renders one <code>SKILL.md</code> into each framework's native <code>Agent(...)</code> as a deterministic, zero-dependency string transform (<code>core/adapters.py</code>). Strings emit via <code>json.dumps</code> so any body (quotes, <code>"""</code>, unicode) stays valid Python; 97.6% mutation kill. Docs: <a href="adapters.html">adapters.html</a>.
@@ -13,7 +13,7 @@ owner: loop/mcp-startup-fork-safety
13
13
  pr: 162
14
14
  title: Self-harden every boost process against the macOS fork-safety abort
15
15
  ---
16
- The launch-env fix (<a href="#mcp-launch-objc-fork-safety">#119</a>) only
16
+ The launch-env fix (<a href="https://github.com/jonnyeclectic/boost/pull/119">#119</a>) only
17
17
  protects hosts that register boost <em>through boost</em>, which
18
18
  injects <code>no_proxy=*</code>. A host that <code>fork()</code>s into
19
19
  <code>boost mcp --stdio</code> from a stale or hand-written config —
@@ -26,4 +26,4 @@ The launch-env fix (<a href="#mcp-launch-objc-fork-safety">#119</a>) only
26
26
  <code>getproxies()</code> short-circuits on
27
27
  <code>getproxies_environment()</code> and never consults
28
28
  SystemConfiguration. Belt-and-suspenders atop the
29
- <code>nethttp</code> opener (<a href="#fork-safe-network-proxy-handler">#115</a>).
29
+ <code>nethttp</code> opener (<a href="https://github.com/jonnyeclectic/boost/pull/115">#115</a>).
@@ -13,7 +13,7 @@ owner: loop/docs-discoverable
13
13
  pr: 128
14
14
  title: Surface every <code>docs/*.html</code> page from the main page
15
15
  ---
16
- <a href="make-the-roadmaps-discoverable.html">Making the roadmaps discoverable</a>
16
+ <a href="roadmap.html">Making the roadmaps discoverable</a>
17
17
  put both boards in the Visual Guide nav, but the same gap remains for
18
18
  the rest of <code>docs/*.html</code>: <code>mcp-hub.html</code> is
19
19
  reachable only if you already know the URL — nothing on
@@ -2,15 +2,15 @@
2
2
  id: visual-regression-pass-on-the-guide
3
3
  board: code
4
4
  section: planned
5
- status: planned
5
+ status: shipped
6
6
  category: Design · QA
7
7
  complexity: M
8
8
  impact: Med
9
9
  wow: 3
10
10
  note:
11
11
  order: 3
12
- owner:
13
- pr:
12
+ owner: loop/visual
13
+ pr: 209
14
14
  title: Visual regression pass on the guide
15
15
  ---
16
16
  Drive <code>docs/index.html</code> in a real browser across breakpoints
@@ -487,7 +487,7 @@ message, so routing it through the helper would change user-facing errors.</p>
487
487
  </article>
488
488
 
489
489
  <article class="cap rcard">
490
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Design · QA</span></div>
490
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Design · QA</span></div>
491
491
  <h3>Visual regression pass on the guide</h3>
492
492
  <p>Drive <code>docs/index.html</code> in a real browser across breakpoints
493
493
  to confirm the glass cards, aurora, and terminal windows render
@@ -1451,7 +1451,7 @@ improvement is real (or isn't)."</p>
1451
1451
  <article class="cap rcard">
1452
1452
  <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Interop</span></div>
1453
1453
  <h3><code>boost adapt</code> — render a skill as another framework's agent source</h3>
1454
- <p>boost only installs skills as files for editor agents (Claude Code, Cursor, Windsurf); CrewAI / OpenAI-Agents-SDK apps can't consume them — an agent there is a value built in source. <code>boost adapt &lt;skill&gt; --to crewai|agents-sdk</code> renders one <code>SKILL.md</code> into each framework's native <code>Agent(...)</code> as a deterministic, zero-dependency string transform (<code>core/adapters.py</code>). Strings emit via <code>json.dumps</code> so any body (quotes, <code>"""</code>, unicode) stays valid Python; 97.6% mutation kill. Docs: <a href="../adapters.html">adapters.html</a>.</p>
1454
+ <p>boost only installs skills as files for editor agents (Claude Code, Cursor, Windsurf); CrewAI / OpenAI-Agents-SDK apps can't consume them — an agent there is a value built in source. <code>boost adapt &lt;skill&gt; --to crewai|agents-sdk</code> renders one <code>SKILL.md</code> into each framework's native <code>Agent(...)</code> as a deterministic, zero-dependency string transform (<code>core/adapters.py</code>). Strings emit via <code>json.dumps</code> so any body (quotes, <code>"""</code>, unicode) stays valid Python; 97.6% mutation kill. Docs: <a href="adapters.html">adapters.html</a>.</p>
1455
1455
  <div class="meta">
1456
1456
  <span class="m">Complexity <b>M</b></span>
1457
1457
  <span class="m">Impact <b>Med-High</b></span>
@@ -1462,7 +1462,7 @@ improvement is real (or isn't)."</p>
1462
1462
  <article class="cap rcard">
1463
1463
  <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Interop</span></div>
1464
1464
  <h3><code>boost adapt --to langgraph</code> — third framework renderer</h3>
1465
- <p>Extend <code>boost adapt</code> (shipped in #146) with a LangGraph target. Unlike CrewAI / Agents-SDK, a LangGraph agent isn't one <code>Agent(...)</code> constructor — the skill body is the system prompt of a node bound into a <code>StateGraph</code>. Add a <code>render_langgraph</code> to <code>core/adapters.py</code> emitting a node factory (prebuilt <code>create_react_agent</code>, or a prompt-carrying node) + its <code>FORMATS</code> row, with byte-exact golden + <code>compile()</code> tests. Then add a <code>langgraph</code> leg to <code>.github/workflows/adapter-conformance.yml</code> (pip install langgraph, import the emitted file). Follows the pattern in <a href="../adapters.html">adapters.html</a>: one <code>render_*</code> fn + registry row + golden test + one matrix line.</p>
1465
+ <p>Extend <code>boost adapt</code> (shipped in #146) with a LangGraph target. Unlike CrewAI / Agents-SDK, a LangGraph agent isn't one <code>Agent(...)</code> constructor — the skill body is the system prompt of a node bound into a <code>StateGraph</code>. Add a <code>render_langgraph</code> to <code>core/adapters.py</code> emitting a node factory (prebuilt <code>create_react_agent</code>, or a prompt-carrying node) + its <code>FORMATS</code> row, with byte-exact golden + <code>compile()</code> tests. Then add a <code>langgraph</code> leg to <code>.github/workflows/adapter-conformance.yml</code> (pip install langgraph, import the emitted file). Follows the pattern in <a href="adapters.html">adapters.html</a>: one <code>render_*</code> fn + registry row + golden test + one matrix line.</p>
1466
1466
  <div class="meta">
1467
1467
  <span class="m">Complexity <b>M</b></span>
1468
1468
  <span class="m">Impact <b>Med</b></span>
@@ -1473,7 +1473,7 @@ improvement is real (or isn't)."</p>
1473
1473
  <article class="cap rcard">
1474
1474
  <div class="head"><span class="pill planned">Planned</span><span class="cat">Interop</span></div>
1475
1475
  <h3><code>boost adapt</code> — multi-agent skills → crews/graphs, not one Agent</h3>
1476
- <p>Today <code>boost adapt</code> (#146, #163) projects a skill into a <b>single</b> framework Agent carrying its instructions/role/model — but a skill can declare tools and a whole subagent graph (e.g. <code>rust-review</code> = worker + dedup-judge + fp-judge). Adapt the richer structure: emit a CrewAI <code>Crew</code> (agents + tasks) or a LangGraph <code>StateGraph</code> when a skill's frontmatter/plugin dir declares subagents, and surface declared tools as stubs. Scope: detect subagent/tool declarations in <code>SKILL.md</code>/<code>plugins/*/agents/*.md</code>; add a crew/graph renderer path in <code>core/adapters.py</code> (single-Agent stays the default for flat skills); golden + <code>compile()</code> tests + a conformance leg. Turns "one skill → one agent" into "one skill → a runnable multi-agent workflow." See <a href="../adapters.html">adapters.html</a>.</p>
1476
+ <p>Today <code>boost adapt</code> (#146, #163) projects a skill into a <b>single</b> framework Agent carrying its instructions/role/model — but a skill can declare tools and a whole subagent graph (e.g. <code>rust-review</code> = worker + dedup-judge + fp-judge). Adapt the richer structure: emit a CrewAI <code>Crew</code> (agents + tasks) or a LangGraph <code>StateGraph</code> when a skill's frontmatter/plugin dir declares subagents, and surface declared tools as stubs. Scope: detect subagent/tool declarations in <code>SKILL.md</code>/<code>plugins/*/agents/*.md</code>; add a crew/graph renderer path in <code>core/adapters.py</code> (single-Agent stays the default for flat skills); golden + <code>compile()</code> tests + a conformance leg. Turns "one skill → one agent" into "one skill → a runnable multi-agent workflow." See <a href="adapters.html">adapters.html</a>.</p>
1477
1477
  <div class="meta">
1478
1478
  <span class="m">Complexity <b>L</b></span>
1479
1479
  <span class="m">Impact <b>Med</b></span>
@@ -1484,7 +1484,7 @@ improvement is real (or isn't)."</p>
1484
1484
  <article class="cap rcard">
1485
1485
  <div class="head"><span class="pill planned">Planned</span><span class="cat">Interop</span></div>
1486
1486
  <h3><code>boost run</code> — search → adapt → a live agent doing the task, in one command</h3>
1487
- <p>The allure ceiling on <code>boost adapt</code> (#146, #163): it stops at <b>source you assemble</b>, and the adapted agent has a brain (prompt) but no <b>hands</b> (tools). Close both. <code>boost run &lt;skill&gt; [target]</code> = adapt → wire a default toolset (file read, ripgrep/shell, web) → execute on boost's model and stream the result. Opt-in like the conformance path (installs the framework + needs a key, so the zero-dep default holds). Two prerequisites ship with it: (1) <b>tool-wiring</b> — emit/attach the tools a skill needs (or declares) so the agent can act, not roleplay; (2) reuse the <a href="../adapters.html">adapt</a> renderer for the agent def. Pairs with <code>[[framework-adapter-multi-agent]]</code> so a skill like <code>rust-review</code> runs as a real crew. This is the screenshot: "one command → an expert agent audits your repo, on Claude, that you never wrote." <b>Working preview:</b> <code>examples/boost-run-prototype.sh</code> already does this by hand (adapt → wire a read_file tool → <code>Runner.run</code> on a file with planted bugs).</p>
1487
+ <p>The allure ceiling on <code>boost adapt</code> (#146, #163): it stops at <b>source you assemble</b>, and the adapted agent has a brain (prompt) but no <b>hands</b> (tools). Close both. <code>boost run &lt;skill&gt; [target]</code> = adapt → wire a default toolset (file read, ripgrep/shell, web) → execute on boost's model and stream the result. Opt-in like the conformance path (installs the framework + needs a key, so the zero-dep default holds). Two prerequisites ship with it: (1) <b>tool-wiring</b> — emit/attach the tools a skill needs (or declares) so the agent can act, not roleplay; (2) reuse the <a href="adapters.html">adapt</a> renderer for the agent def. Pairs with <code>[[framework-adapter-multi-agent]]</code> so a skill like <code>rust-review</code> runs as a real crew. This is the screenshot: "one command → an expert agent audits your repo, on Claude, that you never wrote." <b>Working preview:</b> <code>examples/boost-run-prototype.sh</code> already does this by hand (adapt → wire a read_file tool → <code>Runner.run</code> on a file with planted bugs).</p>
1488
1488
  <div class="meta">
1489
1489
  <span class="m">Complexity <b>L</b></span>
1490
1490
  <span class="m hi">Impact <b>High</b></span>
@@ -1573,18 +1573,23 @@ and the work stays visible.</p>
1573
1573
  </article>
1574
1574
 
1575
1575
  <article class="cap rcard">
1576
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Quality · Docs</span></div>
1576
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Quality · Docs</span></div>
1577
1577
  <h3>Broken-link &amp; anchor checking — <code>lychee</code></h3>
1578
1578
  <p>Fast, free link checker over the README and <code>docs/*.html</code>:
1579
1579
  verifies external URLs (GitHub, PyPI), asset paths
1580
1580
  (<code>../style/boost.css</code>) and in-page anchors
1581
1581
  (<code>#next</code>, <code>#health</code>) still resolve. A dead link in
1582
- the landing page is the first broken promise a visitor sees.</p>
1582
+ the landing page is the first broken promise a visitor sees. Red on
1583
+ its first run: eight were already broken — four <code>../adapters.html</code>
1584
+ at the wrong depth, two dangling anchors, one link to an item file as
1585
+ though it were a page, and a README pointing at
1586
+ <code>docs/overview.html</code>, renamed to <code>index.html</code>
1587
+ and never updated.</p>
1583
1588
  <div class="meta">
1584
1589
  <span class="m">Complexity <b>S</b></span>
1585
1590
  <span class="m">Impact <b>Med</b></span>
1586
1591
  <span class="m">Wow <b class="wow">★★★</b></span>
1587
- <span class="m">URLs + anchors</span>
1592
+ <span class="m">8 dead links found</span>
1588
1593
  </div>
1589
1594
  </article>
1590
1595
 
@@ -1675,7 +1680,7 @@ and the work stays visible.</p>
1675
1680
  <article class="cap rcard">
1676
1681
  <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Docs · Discoverability</span></div>
1677
1682
  <h3>Surface every <code>docs/*.html</code> page from the main page</h3>
1678
- <p><a href="make-the-roadmaps-discoverable.html">Making the roadmaps discoverable</a>
1683
+ <p><a href="roadmap.html">Making the roadmaps discoverable</a>
1679
1684
  put both boards in the Visual Guide nav, but the same gap remains for
1680
1685
  the rest of <code>docs/*.html</code>: <code>mcp-hub.html</code> is
1681
1686
  reachable only if you already know the URL — nothing on
@@ -1874,7 +1879,7 @@ and the work stays visible.</p>
1874
1879
  <article class="cap rcard">
1875
1880
  <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Compatibility · macOS</span></div>
1876
1881
  <h3>Self-harden every boost process against the macOS fork-safety abort</h3>
1877
- <p>The launch-env fix (<a href="#mcp-launch-objc-fork-safety">#119</a>) only
1882
+ <p>The launch-env fix (<a href="https://github.com/jonnyeclectic/boost/pull/119">#119</a>) only
1878
1883
  protects hosts that register boost <em>through boost</em>, which
1879
1884
  injects <code>no_proxy=*</code>. A host that <code>fork()</code>s into
1880
1885
  <code>boost mcp --stdio</code> from a stale or hand-written config —
@@ -1887,7 +1892,7 @@ and the work stays visible.</p>
1887
1892
  <code>getproxies()</code> short-circuits on
1888
1893
  <code>getproxies_environment()</code> and never consults
1889
1894
  SystemConfiguration. Belt-and-suspenders atop the
1890
- <code>nethttp</code> opener (<a href="#fork-safe-network-proxy-handler">#115</a>).</p>
1895
+ <code>nethttp</code> opener (<a href="https://github.com/jonnyeclectic/boost/pull/115">#115</a>).</p>
1891
1896
  <div class="meta">
1892
1897
  <span class="m">Complexity <b>S</b></span>
1893
1898
  <span class="m">Impact <b>Med</b></span>
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env python3
2
+ """Verify every local link and #fragment in the docs site resolves.
3
+
4
+ lychee (the links workflow) checks external URLs and that local files exist,
5
+ but it does not resolve fragments into local HTML — and that is exactly where
6
+ a dangling anchor hides, because the roadmap boards are GENERATED from card
7
+ copy in docs/roadmap/items/*.md. A bad href there is invisible until the page
8
+ renders.
9
+
10
+ Checks, treating docs/ as the Pages root (docs/index.html is the site root, so
11
+ `../style/boost.css` correctly resolves to the repo-root stylesheet):
12
+ * in-page `#frag` -> an element with that id/name exists on the page
13
+ * `other.html#frag` -> the target file exists AND carries that anchor
14
+ * `path/to/asset.css` -> the file exists on disk
15
+
16
+ Usage: python3 scripts/check_anchors.py [--docs docs]
17
+ """
18
+ from __future__ import annotations
19
+
20
+ import argparse
21
+ import sys
22
+ from html.parser import HTMLParser
23
+ from pathlib import Path
24
+
25
+ ROOT = Path(__file__).resolve().parent.parent
26
+ SKIP_PREFIXES = ("http://", "https://", "mailto:", "data:", "javascript:", "tel:")
27
+
28
+
29
+ class _Page(HTMLParser):
30
+ """Collect anchor ids and every href/src on one page."""
31
+
32
+ def __init__(self) -> None:
33
+ super().__init__()
34
+ self.ids: set = set()
35
+ self.refs: list = []
36
+
37
+ def handle_starttag(self, tag, attrs) -> None:
38
+ d = dict(attrs)
39
+ for key in ("id", "name"):
40
+ if d.get(key):
41
+ self.ids.add(d[key])
42
+ for key in ("href", "src"):
43
+ if d.get(key):
44
+ self.refs.append(d[key])
45
+
46
+
47
+ def _parse(path: Path) -> _Page:
48
+ page = _Page()
49
+ page.feed(path.read_text(encoding="utf-8"))
50
+ return page
51
+
52
+
53
+ def check(docs_dir: Path) -> list:
54
+ """Return a list of human-readable problems (empty when everything resolves)."""
55
+ problems: list = []
56
+ cache: dict = {}
57
+ for page_path in sorted(docs_dir.glob("*.html")):
58
+ page = _parse(page_path)
59
+ for raw in page.refs:
60
+ ref = raw.strip()
61
+ if not ref or ref.startswith(SKIP_PREFIXES):
62
+ continue
63
+ if ref.startswith("#"):
64
+ frag = ref[1:]
65
+ if frag and frag not in page.ids:
66
+ problems.append("%s: dangling in-page anchor %s"
67
+ % (page_path.name, ref))
68
+ continue
69
+ rel, _, frag = ref.partition("#")
70
+ if not rel:
71
+ continue
72
+ target = (page_path.parent / rel).resolve()
73
+ if not target.exists():
74
+ problems.append("%s: missing local target %s" % (page_path.name, ref))
75
+ continue
76
+ if frag and target.suffix == ".html":
77
+ if target not in cache:
78
+ cache[target] = _parse(target)
79
+ if frag not in cache[target].ids:
80
+ problems.append("%s: %s -> no anchor #%s in %s"
81
+ % (page_path.name, ref, frag, target.name))
82
+ return problems
83
+
84
+
85
+ def main(argv=None) -> int:
86
+ ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
87
+ ap.add_argument("--docs", default=str(ROOT / "docs"))
88
+ args = ap.parse_args(argv)
89
+
90
+ docs_dir = Path(args.docs)
91
+ problems = check(docs_dir)
92
+ pages = len(list(docs_dir.glob("*.html")))
93
+ if problems:
94
+ for p in problems:
95
+ print(" " + p, file=sys.stderr)
96
+ print("check-anchors: FAILED — %d broken reference(s) across %d pages"
97
+ % (len(problems), pages), file=sys.stderr)
98
+ print("hint: the roadmap boards are GENERATED — fix the link in the "
99
+ "matching docs/roadmap/items/*.md, then rerun "
100
+ "scripts/build_roadmap.py", file=sys.stderr)
101
+ return 1
102
+ print("check-anchors: OK — every local link and anchor resolves across "
103
+ "%d pages" % pages)
104
+ return 0
105
+
106
+
107
+ if __name__ == "__main__":
108
+ raise SystemExit(main())
@@ -0,0 +1,79 @@
1
+ """Unit tests for scripts/check_anchors.py — the local link/anchor checker."""
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" / "check_anchors.py"
10
+ _DOCS = Path(__file__).resolve().parents[2] / "docs"
11
+
12
+ _skip = pytest.mark.skipif(not _SCRIPT.exists(), reason="script not reachable")
13
+
14
+
15
+ def _mod():
16
+ spec = importlib.util.spec_from_file_location("check_anchors", _SCRIPT)
17
+ assert spec and spec.loader
18
+ module = importlib.util.module_from_spec(spec)
19
+ spec.loader.exec_module(module)
20
+ return module
21
+
22
+
23
+ @_skip
24
+ def test_real_docs_have_no_broken_links():
25
+ """The in-suite twin of the CI anchor pass."""
26
+ problems = _mod().check(_DOCS)
27
+ assert problems == [], "broken links in docs/: %s" % problems
28
+
29
+
30
+ @_skip
31
+ def test_dangling_in_page_anchor_is_caught(tmp_path):
32
+ (tmp_path / "a.html").write_text(
33
+ '<a href="#nope">x</a><h2 id="yes">y</h2>', encoding="utf-8")
34
+ problems = _mod().check(tmp_path)
35
+ assert len(problems) == 1 and "#nope" in problems[0]
36
+
37
+
38
+ @_skip
39
+ def test_valid_in_page_anchor_passes(tmp_path):
40
+ (tmp_path / "a.html").write_text(
41
+ '<a href="#yes">x</a><h2 id="yes">y</h2>', encoding="utf-8")
42
+ assert _mod().check(tmp_path) == []
43
+
44
+
45
+ @_skip
46
+ def test_missing_local_target_is_caught(tmp_path):
47
+ (tmp_path / "a.html").write_text('<link href="../style/gone.css">', encoding="utf-8")
48
+ problems = _mod().check(tmp_path)
49
+ assert len(problems) == 1 and "missing local target" in problems[0]
50
+
51
+
52
+ @_skip
53
+ def test_cross_page_anchor_checked_against_the_target(tmp_path):
54
+ (tmp_path / "a.html").write_text('<a href="b.html#deep">x</a>', encoding="utf-8")
55
+ (tmp_path / "b.html").write_text('<h2 id="other">y</h2>', encoding="utf-8")
56
+ problems = _mod().check(tmp_path)
57
+ assert len(problems) == 1 and "no anchor #deep" in problems[0]
58
+
59
+ (tmp_path / "b.html").write_text('<h2 id="deep">y</h2>', encoding="utf-8")
60
+ assert _mod().check(tmp_path) == []
61
+
62
+
63
+ @_skip
64
+ def test_external_and_scheme_links_are_skipped(tmp_path):
65
+ (tmp_path / "a.html").write_text(
66
+ '<a href="https://example.com/nope#frag">x</a>'
67
+ '<a href="mailto:a@b.c">y</a><img src="data:image/svg+xml,x">',
68
+ encoding="utf-8")
69
+ assert _mod().check(tmp_path) == []
70
+
71
+
72
+ @_skip
73
+ def test_main_reports_and_exits_nonzero_on_break(tmp_path, capsys):
74
+ (tmp_path / "a.html").write_text('<a href="#nope">x</a>', encoding="utf-8")
75
+ rc = _mod().main(["--docs", str(tmp_path)])
76
+ assert rc == 1
77
+ err = capsys.readouterr().err
78
+ assert "check-anchors: FAILED" in err
79
+ assert "build_roadmap.py" in err # the actionable hint
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "boost-visual-check",
3
+ "private": true,
4
+ "description": "Headless-Chrome render sweep for the docs pages (see visual_check.mjs)",
5
+ "type": "module",
6
+ "dependencies": { "puppeteer-core": "24.23.0" }
7
+ }