boost-skill-cli 1.0.101__tar.gz → 1.0.102__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 (252) hide show
  1. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/commands/configuration.py +9 -2
  4. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/catalog.py +40 -6
  5. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  6. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +3 -3
  7. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +3 -3
  8. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap.html +2 -2
  9. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/functional/test_cli_configuration.py +7 -3
  10. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_catalog.py +44 -0
  11. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/.gitattributes +0 -0
  12. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/.gitignore +0 -0
  13. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/CLAUDE.md +0 -0
  14. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/CONTRIBUTING.md +0 -0
  15. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/LICENSE +0 -0
  16. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/MANIFEST.in +0 -0
  17. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/Makefile +0 -0
  18. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/README.md +0 -0
  19. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/SECURITY.md +0 -0
  20. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost +0 -0
  21. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/__init__.py +0 -0
  22. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/__main__.py +0 -0
  23. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/cli.py +0 -0
  24. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/cliparse.py +0 -0
  25. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/commands/__init__.py +0 -0
  26. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/commands/bmad.py +0 -0
  27. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/commands/discovery.py +0 -0
  28. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/commands/hooks.py +0 -0
  29. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/commands/info.py +0 -0
  30. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/commands/intelligence.py +0 -0
  31. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/commands/pkg.py +0 -0
  32. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/commands/quality.py +0 -0
  33. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/commands/taps.py +0 -0
  34. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/commands/team.py +0 -0
  35. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/__init__.py +0 -0
  36. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/agents.py +0 -0
  37. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/ai.py +0 -0
  38. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/claude_settings.py +0 -0
  39. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/config.py +0 -0
  40. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/dense.py +0 -0
  41. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/embed.py +0 -0
  42. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/frontmatter.py +0 -0
  43. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/gitutil.py +0 -0
  44. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/journal.py +0 -0
  45. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/lockfile.py +0 -0
  46. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/logs.py +0 -0
  47. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/mcp.py +0 -0
  48. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/nethttp.py +0 -0
  49. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/output.py +0 -0
  50. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/paths.py +0 -0
  51. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/policy.py +0 -0
  52. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/rag.py +0 -0
  53. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/registry.py +0 -0
  54. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/serve.py +0 -0
  55. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/staleness.py +0 -0
  56. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/store.py +0 -0
  57. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/typosquat.py +0 -0
  58. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/core/util.py +0 -0
  59. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/data/registries.json +0 -0
  60. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/errors.py +0 -0
  61. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_cli/spin.py +0 -0
  62. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
  63. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  64. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  65. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_skill_cli.egg-info/requires.txt +0 -0
  66. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/boost_skill_cli.egg-info/top_level.txt +0 -0
  67. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/.claude/settings.local.json +0 -0
  68. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/DEBUGGING.md +0 -0
  69. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/demo.gif +0 -0
  70. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/demo.tape +0 -0
  71. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/design-roadmap.html +0 -0
  72. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/index.html +0 -0
  73. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/mcp-hub.html +0 -0
  74. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/rag-architecture.md +0 -0
  75. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D01.md +0 -0
  76. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D02.md +0 -0
  77. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D03.md +0 -0
  78. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D04.md +0 -0
  79. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D05.md +0 -0
  80. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D06.md +0 -0
  81. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D07.md +0 -0
  82. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D08.md +0 -0
  83. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D09.md +0 -0
  84. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D10.md +0 -0
  85. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D11.md +0 -0
  86. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D12.md +0 -0
  87. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D13.md +0 -0
  88. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D14.md +0 -0
  89. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D15.md +0 -0
  90. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D16.md +0 -0
  91. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D17.md +0 -0
  92. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D18.md +0 -0
  93. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D19.md +0 -0
  94. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D20.md +0 -0
  95. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D21.md +0 -0
  96. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D22.md +0 -0
  97. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D23.md +0 -0
  98. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D24.md +0 -0
  99. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D25.md +0 -0
  100. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/BOOST-D26.md +0 -0
  101. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
  102. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
  103. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
  104. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
  105. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
  106. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
  107. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
  108. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
  109. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
  110. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
  111. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/command-reference-docs-site.md +0 -0
  112. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
  113. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
  114. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
  115. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
  116. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
  117. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
  118. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
  119. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
  120. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
  121. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
  122. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
  123. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
  124. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
  125. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
  126. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
  127. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
  128. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/html-validation-html-validate.md +0 -0
  129. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
  130. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
  131. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
  132. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
  133. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
  134. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
  135. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
  136. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
  137. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
  138. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
  139. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
  140. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
  141. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
  142. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
  143. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
  144. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
  145. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
  146. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
  147. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
  148. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
  149. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
  150. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
  151. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
  152. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
  153. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
  154. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
  155. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
  156. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
  157. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
  158. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
  159. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
  160. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
  161. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
  162. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
  163. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
  164. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
  165. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
  166. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
  167. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
  168. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
  169. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
  170. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
  171. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
  172. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
  173. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
  174. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
  175. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
  176. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
  177. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
  178. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
  179. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
  180. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
  181. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/typo-detection-codespell.md +0 -0
  182. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
  183. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
  184. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
  185. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/update-diff-before-apply.md +0 -0
  186. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
  187. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
  188. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
  189. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
  190. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
  191. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/docs/roadmap/items/workspace-scope-install.md +0 -0
  192. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/index.html +0 -0
  193. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/pyproject.toml +0 -0
  194. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/scripts/build_registries.py +0 -0
  195. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/scripts/build_roadmap.py +0 -0
  196. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/scripts/eval_recommend.py +0 -0
  197. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/scripts/eval_retrieval.py +0 -0
  198. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/scripts/mutation_gate.py +0 -0
  199. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/setup.cfg +0 -0
  200. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/style/README.md +0 -0
  201. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/style/boost.css +0 -0
  202. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/style/boost.js +0 -0
  203. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/style/demo.html +0 -0
  204. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/conftest.py +0 -0
  205. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/eval/baseline.json +0 -0
  206. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/eval/golden.jsonl +0 -0
  207. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/eval/recommend.jsonl +0 -0
  208. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/functional/test_cli_bmad.py +0 -0
  209. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/functional/test_cli_discovery.py +0 -0
  210. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/functional/test_cli_hooks.py +0 -0
  211. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/functional/test_cli_info.py +0 -0
  212. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/functional/test_cli_intelligence.py +0 -0
  213. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/functional/test_cli_pkg.py +0 -0
  214. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/functional/test_cli_quality.py +0 -0
  215. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/functional/test_cli_taps.py +0 -0
  216. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/functional/test_cli_team.py +0 -0
  217. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/functional/test_everyday_loop.py +0 -0
  218. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/make_fixture.py +0 -0
  219. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/smoke.sh +0 -0
  220. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_agents.py +0 -0
  221. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_ai.py +0 -0
  222. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_claude_settings.py +0 -0
  223. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_cliparse.py +0 -0
  224. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_config.py +0 -0
  225. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_dense.py +0 -0
  226. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_dense_fallback.py +0 -0
  227. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_embed.py +0 -0
  228. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_errors_and_cli_table.py +0 -0
  229. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_frontmatter.py +0 -0
  230. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_gitutil.py +0 -0
  231. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_journal.py +0 -0
  232. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_lockfile.py +0 -0
  233. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_logs.py +0 -0
  234. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_mcp.py +0 -0
  235. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_mutation_hardening.py +0 -0
  236. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_nethttp.py +0 -0
  237. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_output.py +0 -0
  238. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_paths.py +0 -0
  239. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_pkg_confusions.py +0 -0
  240. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_policy.py +0 -0
  241. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_rag.py +0 -0
  242. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_registries_fresh.py +0 -0
  243. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_registry.py +0 -0
  244. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_roadmap_fresh.py +0 -0
  245. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_serve.py +0 -0
  246. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_spin.py +0 -0
  247. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_staleness.py +0 -0
  248. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_store.py +0 -0
  249. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_token_parity.py +0 -0
  250. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_typosquat.py +0 -0
  251. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_util.py +0 -0
  252. {boost_skill_cli-1.0.101 → boost_skill_cli-1.0.102}/tests/unit/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.101
3
+ Version: 1.0.102
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -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.101'
22
- __version_tuple__ = version_tuple = (1, 0, 101)
21
+ __version__ = version = '1.0.102'
22
+ __version_tuple__ = version_tuple = (1, 0, 102)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -928,8 +928,15 @@ def cmd_mcp(argv) -> int:
928
928
 
929
929
  shim = paths.launcher()
930
930
  if args.action == "register":
931
- cmd = ["claude", "mcp", "add", "--scope", "user", "boost", "--",
932
- str(shim), "mcp", "--stdio"]
931
+ # Fork-safe launch env: a host that fork()s into `boost mcp --stdio`
932
+ # on macOS can SIGABRT on the child side *pre-exec* if Obj-C is touched
933
+ # post-fork (CFPreferences / _scproxy proxy lookup). Disabling the
934
+ # fork-safety trap and short-circuiting proxy resolution keeps the
935
+ # host's fork into boost from aborting before our Python ever runs.
936
+ cmd = ["claude", "mcp", "add", "--scope", "user",
937
+ "-e", "OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES",
938
+ "-e", "no_proxy=*",
939
+ "boost", "--", str(shim), "mcp", "--stdio"]
933
940
  else:
934
941
  cmd = ["claude", "mcp", "remove", "boost"]
935
942
 
@@ -21,7 +21,7 @@ import json
21
21
  import os
22
22
  import re
23
23
  from pathlib import Path
24
- from typing import List, Optional, Set, Tuple
24
+ from typing import Dict, List, Optional, Set, Tuple
25
25
 
26
26
  from ..errors import BoostError
27
27
  from . import frontmatter, gitutil, paths, registry, util
@@ -167,15 +167,49 @@ def rebuild_tap(tap: "registry.Tap") -> List[dict]:
167
167
  "commit": gitutil.head_commit(tap.path),
168
168
  "skills": entries,
169
169
  }, indent=1))
170
+ # Drop the mtime-keyed cache so a rebuild is visible to an immediately
171
+ # following load even when the filesystem mtime granularity is coarse.
172
+ _ENTRY_CACHE.pop(str(tap.cache_file), None)
170
173
  return entries
171
174
 
172
175
 
176
+ # Entry-set cache, keyed on each tap cache file's (mtime_ns, size) stamp. The
177
+ # BM25 index is mtime-cached the same way (rag._load_raw); without this, every
178
+ # search reparses every tap cache. Entries are treated read-only by callers, so
179
+ # the cached list is shared by reference (matching the index cache). Keying on
180
+ # nanosecond mtime + size catches rewrites a bare second-resolution mtime would
181
+ # miss.
182
+ _ENTRY_CACHE: Dict[str, Tuple[Tuple[int, int], List[dict]]] = {}
183
+
184
+
185
+ def _cached_tap(tap: "registry.Tap") -> Optional[List[dict]]:
186
+ """Memoized ``skills`` for a tap's cache file, or ``None`` to force a
187
+ rebuild (file missing, unreadable, or corrupt JSON)."""
188
+ p = tap.cache_file
189
+ key = str(p)
190
+ try:
191
+ st = p.stat()
192
+ except OSError:
193
+ _ENTRY_CACHE.pop(key, None)
194
+ return None
195
+ stamp = (st.st_mtime_ns, st.st_size)
196
+ cached = _ENTRY_CACHE.get(key)
197
+ if cached is not None and cached[0] == stamp:
198
+ return cached[1]
199
+ try:
200
+ skills = json.loads(p.read_text()).get("skills", [])
201
+ except (json.JSONDecodeError, OSError):
202
+ _ENTRY_CACHE.pop(key, None)
203
+ return None
204
+ _ENTRY_CACHE[key] = (stamp, skills)
205
+ return skills
206
+
207
+
173
208
  def load_tap(tap: "registry.Tap", rebuild: bool = False) -> List[dict]:
174
- if not rebuild and tap.cache_file.exists():
175
- try:
176
- return json.loads(tap.cache_file.read_text()).get("skills", [])
177
- except (json.JSONDecodeError, OSError):
178
- pass
209
+ if not rebuild:
210
+ cached = _cached_tap(tap)
211
+ if cached is not None:
212
+ return cached
179
213
  if tap.is_cloned:
180
214
  return rebuild_tap(tap)
181
215
  return []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.101
3
+ Version: 1.0.102
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -2,15 +2,15 @@
2
2
  id: cache-the-catalog-entry-set-across-rag-queries
3
3
  board: code
4
4
  section: internals
5
- status: planned
5
+ status: shipped
6
6
  category: Performance
7
7
  complexity: M
8
8
  impact: Med
9
9
  wow: 3
10
10
  note:
11
11
  order: 10
12
- owner:
13
- pr:
12
+ owner: loop/cache-entry-set
13
+ pr: 114
14
14
  title: Cache the catalog entry-set across RAG queries
15
15
  ---
16
16
  <code>rag.retrieve()</code> calls <code>all_entries()</code>, which reads &amp; <code>json.loads</code> <b>every tap cache on every search</b> to build the live map (<code>rag.py:323 · catalog.py:166–181</code>) — the BM25 index is mtime-cached, the entry set is not. Memoize the entry set on cache mtime the same way.
@@ -2,15 +2,15 @@
2
2
  id: mcp-launch-objc-fork-safety
3
3
  board: code
4
4
  section: compat
5
- status: planned
5
+ status: shipped
6
6
  category: Compatibility · macOS
7
7
  complexity: S
8
8
  impact: Med
9
9
  wow: 3
10
10
  note: OBJC_DISABLE_INITIALIZE_FORK_SAFETY
11
11
  order: 9
12
- owner:
13
- pr:
12
+ owner: loop/mcp-fork-safety
13
+ pr: 119
14
14
  title: Harden <code>boost mcp</code> launch against macOS Obj-C fork aborts
15
15
  ---
16
16
  On macOS, a host that spawns <code>boost mcp --stdio</code> via <code>fork()</code>
@@ -548,7 +548,7 @@ by new unit tests covering every branch.</p>
548
548
  </article>
549
549
 
550
550
  <article class="cap rcard">
551
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Performance</span></div>
551
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Performance</span></div>
552
552
  <h3>Cache the catalog entry-set across RAG queries</h3>
553
553
  <p><code>rag.retrieve()</code> calls <code>all_entries()</code>, which reads &amp; <code>json.loads</code> <b>every tap cache on every search</b> to build the live map (<code>rag.py:323 · catalog.py:166–181</code>) — the BM25 index is mtime-cached, the entry set is not. Memoize the entry set on cache mtime the same way.</p>
554
554
  <div class="meta">
@@ -1587,7 +1587,7 @@ and the work stays visible.</p>
1587
1587
  </article>
1588
1588
 
1589
1589
  <article class="cap rcard">
1590
- <div class="head"><span class="pill planned">Planned</span><span class="cat">Compatibility · macOS</span></div>
1590
+ <div class="head"><span class="pill shipped">Shipped</span><span class="cat">Compatibility · macOS</span></div>
1591
1591
  <h3>Harden <code>boost mcp</code> launch against macOS Obj-C fork aborts</h3>
1592
1592
  <p>On macOS, a host that spawns <code>boost mcp --stdio</code> via <code>fork()</code>
1593
1593
  can abort on the child side pre-<code>exec</code> when Obj-C is touched
@@ -763,7 +763,9 @@ class TestMcp:
763
763
  shim = str(paths.repo_root() / "boost")
764
764
  r = boost("mcp", "register")
765
765
  assert "`claude` CLI not found — run this yourself:" in r.out
766
- assert "claude mcp add --scope user boost -- %s mcp --stdio" % shim in r.out
766
+ assert ("claude mcp add --scope user "
767
+ "-e OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES -e no_proxy=* "
768
+ "boost -- %s mcp --stdio" % shim) in r.out
767
769
  r = boost("mcp", "unregister")
768
770
  assert "claude mcp remove boost" in r.out
769
771
  assert journal.events(action="mcp")[0]["subject"] == "unregister"
@@ -783,8 +785,10 @@ class TestMcp:
783
785
  monkeypatch.setattr("boost_cli.commands.configuration.subprocess.run",
784
786
  fake_run)
785
787
  r = boost("mcp", "register")
786
- assert calls == [["claude", "mcp", "add", "--scope", "user", "boost",
787
- "--", str(paths.repo_root() / "boost"),
788
+ assert calls == [["claude", "mcp", "add", "--scope", "user",
789
+ "-e", "OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES",
790
+ "-e", "no_proxy=*",
791
+ "boost", "--", str(paths.repo_root() / "boost"),
788
792
  "mcp", "--stdio"]]
789
793
  assert "Added stdio MCP server boost" in r.out
790
794
  assert "registered boost as an MCP server (scope: user)" in r.out
@@ -345,6 +345,50 @@ class TestTapCaches:
345
345
  assert catalog.load_tap(registry.Tap(name="fake", url="")) == []
346
346
 
347
347
 
348
+ class TestEntrySetCache:
349
+ """load_tap memoizes parsed skills on the cache file's (mtime_ns, size)
350
+ stamp, so repeated searches don't re-parse every tap cache."""
351
+
352
+ def test_unchanged_cache_returns_memoized_object(self, sandbox):
353
+ paths.ensure_dirs()
354
+ tap = registry.Tap(name="fake", url="")
355
+ tap.cache_file.write_text(json.dumps({"skills": [{"name": "s1"}]}))
356
+ first = catalog.load_tap(tap)
357
+ second = catalog.load_tap(tap)
358
+ # A cache hit returns the memoized list itself; a re-parse would build a
359
+ # fresh list, so identity proves the second call did not touch disk.
360
+ assert first == [{"name": "s1"}]
361
+ assert second is first
362
+
363
+ def test_content_change_invalidates_cache(self, sandbox):
364
+ paths.ensure_dirs()
365
+ tap = registry.Tap(name="fake", url="")
366
+ tap.cache_file.write_text(json.dumps({"skills": [{"name": "s1"}]}))
367
+ assert catalog.load_tap(tap) == [{"name": "s1"}]
368
+ # New content ⇒ different size ⇒ new stamp ⇒ the cache must re-read.
369
+ tap.cache_file.write_text(
370
+ json.dumps({"skills": [{"name": "s1"}, {"name": "s2"}]}))
371
+ assert catalog.load_tap(tap) == [{"name": "s1"}, {"name": "s2"}]
372
+
373
+ def test_rebuild_pops_stale_memo(self, sandbox, fixture_tap_src):
374
+ tap = registry.add(str(fixture_tap_src))
375
+ catalog.rebuild_tap(tap) # write the cache file
376
+ catalog.load_tap(tap) # read + memoize it
377
+ assert str(tap.cache_file) in catalog._ENTRY_CACHE
378
+ catalog.rebuild_tap(tap) # must evict the now-stale memo
379
+ assert str(tap.cache_file) not in catalog._ENTRY_CACHE
380
+
381
+ def test_missing_cache_file_evicts_stamp(self, sandbox):
382
+ paths.ensure_dirs()
383
+ tap = registry.Tap(name="fake", url="")
384
+ tap.cache_file.write_text(json.dumps({"skills": [{"name": "s1"}]}))
385
+ assert catalog.load_tap(tap) == [{"name": "s1"}]
386
+ assert str(tap.cache_file) in catalog._ENTRY_CACHE
387
+ tap.cache_file.unlink()
388
+ assert catalog.load_tap(tap) == [] # no file, uncloned
389
+ assert str(tap.cache_file) not in catalog._ENTRY_CACHE
390
+
391
+
348
392
  class TestAllEntriesAndFind:
349
393
  def test_all_entries_config_order(self, sandbox):
350
394
  _fake_taps(