boost-skill-cli 1.0.46__tar.gz → 1.0.48__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 (110) hide show
  1. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/.gitignore +3 -0
  2. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/PKG-INFO +1 -1
  3. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/_version.py +2 -2
  4. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  5. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/docs/roadmap.html +280 -1
  6. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/CLAUDE.md +0 -0
  7. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/CONTRIBUTING.md +0 -0
  8. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/LICENSE +0 -0
  9. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/MANIFEST.in +0 -0
  10. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/Makefile +0 -0
  11. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/README.md +0 -0
  12. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/SECURITY.md +0 -0
  13. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost +0 -0
  14. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/__init__.py +0 -0
  15. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/__main__.py +0 -0
  16. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/cli.py +0 -0
  17. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/cliparse.py +0 -0
  18. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/commands/__init__.py +0 -0
  19. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/commands/bmad.py +0 -0
  20. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/commands/configuration.py +0 -0
  21. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/commands/discovery.py +0 -0
  22. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/commands/hooks.py +0 -0
  23. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/commands/info.py +0 -0
  24. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/commands/intelligence.py +0 -0
  25. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/commands/pkg.py +0 -0
  26. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/commands/quality.py +0 -0
  27. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/commands/taps.py +0 -0
  28. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/commands/team.py +0 -0
  29. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/__init__.py +0 -0
  30. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/agents.py +0 -0
  31. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/ai.py +0 -0
  32. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/catalog.py +0 -0
  33. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/claude_settings.py +0 -0
  34. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/config.py +0 -0
  35. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/dense.py +0 -0
  36. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/embed.py +0 -0
  37. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/frontmatter.py +0 -0
  38. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/gitutil.py +0 -0
  39. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/journal.py +0 -0
  40. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/lockfile.py +0 -0
  41. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/logs.py +0 -0
  42. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/output.py +0 -0
  43. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/paths.py +0 -0
  44. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/policy.py +0 -0
  45. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/rag.py +0 -0
  46. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/registry.py +0 -0
  47. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/store.py +0 -0
  48. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/core/util.py +0 -0
  49. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/data/registries.json +0 -0
  50. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/errors.py +0 -0
  51. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_cli/spin.py +0 -0
  52. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
  53. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  54. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  55. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_skill_cli.egg-info/requires.txt +0 -0
  56. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/boost_skill_cli.egg-info/top_level.txt +0 -0
  57. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/docs/.claude/settings.local.json +0 -0
  58. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/docs/DEBUGGING.md +0 -0
  59. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/docs/demo.gif +0 -0
  60. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/docs/demo.tape +0 -0
  61. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/docs/design-roadmap.html +0 -0
  62. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/docs/index.html +0 -0
  63. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/docs/rag-architecture.md +0 -0
  64. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/pyproject.toml +0 -0
  65. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/scripts/build_registries.py +0 -0
  66. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/scripts/mutation_gate.py +0 -0
  67. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/setup.cfg +0 -0
  68. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/style/README.md +0 -0
  69. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/style/boost.css +0 -0
  70. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/style/boost.js +0 -0
  71. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/style/demo.html +0 -0
  72. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/conftest.py +0 -0
  73. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/functional/test_cli_bmad.py +0 -0
  74. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/functional/test_cli_configuration.py +0 -0
  75. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/functional/test_cli_discovery.py +0 -0
  76. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/functional/test_cli_hooks.py +0 -0
  77. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/functional/test_cli_info.py +0 -0
  78. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/functional/test_cli_intelligence.py +0 -0
  79. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/functional/test_cli_pkg.py +0 -0
  80. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/functional/test_cli_quality.py +0 -0
  81. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/functional/test_cli_taps.py +0 -0
  82. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/functional/test_cli_team.py +0 -0
  83. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/functional/test_everyday_loop.py +0 -0
  84. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/make_fixture.py +0 -0
  85. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/smoke.sh +0 -0
  86. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_agents.py +0 -0
  87. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_ai.py +0 -0
  88. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_catalog.py +0 -0
  89. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_claude_settings.py +0 -0
  90. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_cliparse.py +0 -0
  91. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_config.py +0 -0
  92. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_dense.py +0 -0
  93. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_embed.py +0 -0
  94. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_errors_and_cli_table.py +0 -0
  95. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_frontmatter.py +0 -0
  96. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_gitutil.py +0 -0
  97. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_journal.py +0 -0
  98. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_lockfile.py +0 -0
  99. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_logs.py +0 -0
  100. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_mutation_hardening.py +0 -0
  101. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_output.py +0 -0
  102. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_paths.py +0 -0
  103. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_policy.py +0 -0
  104. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_rag.py +0 -0
  105. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_registry.py +0 -0
  106. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_spin.py +0 -0
  107. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_store.py +0 -0
  108. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_token_parity.py +0 -0
  109. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_util.py +0 -0
  110. {boost_skill_cli-1.0.46 → boost_skill_cli-1.0.48}/tests/unit/test_version.py +0 -0
@@ -224,3 +224,6 @@ boost_cli/_version.py
224
224
  _bmad/
225
225
  _bmad-output/
226
226
  .claude/skills/bmad-*/
227
+
228
+ # mutmut mutation-testing workspace (regenerated by `mutmut run`)
229
+ mutants/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.46
3
+ Version: 1.0.48
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.46'
22
- __version_tuple__ = version_tuple = (1, 0, 46)
21
+ __version__ = version = '1.0.48'
22
+ __version_tuple__ = version_tuple = (1, 0, 48)
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.46
3
+ Version: 1.0.48
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -116,7 +116,7 @@
116
116
  <div class="stat"><b>4</b><span>Shipped</span></div>
117
117
  <div class="stat"><b>3</b><span>Next up</span></div>
118
118
  <div class="stat"><b>4</b><span>Planned</span></div>
119
- <div class="stat"><b>32</b><span>Loop finds</span></div>
119
+ <div class="stat"><b>48</b><span>Loop finds</span></div>
120
120
  </div>
121
121
  </section>
122
122
 
@@ -872,6 +872,285 @@
872
872
  </div>
873
873
  </section>
874
874
 
875
+ <!-- ============ COMPATIBILITY & INSTALL INTEGRITY ============ -->
876
+ <section class="block reveal" id="compat">
877
+ <div class="block-head">
878
+ <h2>Compatibility &amp; install integrity</h2>
879
+ <span class="count">// planned · free tooling to prove boost installs &amp; runs everywhere it claims</span>
880
+ <span class="rule"></span>
881
+ </div>
882
+ <div class="rgrid">
883
+
884
+ <article class="cap rcard">
885
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Compat · Platform</span></div>
886
+ <h3>Windows in the CI matrix</h3>
887
+ <p>The test matrix runs macOS and Ubuntu only, so
888
+ <code>windows-latest</code> path separators, case-sensitivity and
889
+ console-encoding bugs ship uncaught to any Windows user. Adding one
890
+ matrix leg closes the biggest untested surface for a tool that promises
891
+ to work "everywhere your agent does".</p>
892
+ <div class="meta">
893
+ <span class="m">Complexity <b>S</b></span>
894
+ <span class="m hi">Impact <b>High</b></span>
895
+ <span class="m">Wow <b class="wow">★★★★</b></span>
896
+ <span class="m">untested OS</span>
897
+ </div>
898
+ </article>
899
+
900
+ <article class="cap rcard">
901
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Testing · Install</span></div>
902
+ <h3>Clean-env install smoke — pip &amp; <code>pipx</code></h3>
903
+ <p>Every gate runs against an editable <code>pip install -e .</code>, which
904
+ hides missing package-data, a broken entry point or an undeclared
905
+ dependency. A job that <code>pip install</code>s the built wheel into a
906
+ <em>fresh</em> venv (and <code>pipx install</code>s it) then runs
907
+ <code>boost --version</code> proves the artifact a user actually gets
908
+ works.</p>
909
+ <div class="meta">
910
+ <span class="m">Complexity <b>S</b></span>
911
+ <span class="m hi">Impact <b>High</b></span>
912
+ <span class="m">Wow <b class="wow">★★★★</b></span>
913
+ <span class="m">tests the real artifact</span>
914
+ </div>
915
+ </article>
916
+
917
+ <article class="cap rcard">
918
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Testing · Deps</span></div>
919
+ <h3>Lowest-version resolution — <code>uv --resolution lowest-direct</code></h3>
920
+ <p>CI always installs the <em>newest</em> compatible dependencies, so the
921
+ lower bounds declared in <code>pyproject.toml</code> are never actually
922
+ exercised. Resolving and testing against the minimum versions catches
923
+ the "works here, breaks on the floor we advertise" class of bug.</p>
924
+ <div class="meta">
925
+ <span class="m">Complexity <b>S</b></span>
926
+ <span class="m">Impact <b>Med</b></span>
927
+ <span class="m">Wow <b class="wow">★★★</b></span>
928
+ <span class="m">honours declared floors</span>
929
+ </div>
930
+ </article>
931
+
932
+ <article class="cap rcard">
933
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Compat · Python</span></div>
934
+ <h3>Pre-release Python canary — 3.14t free-threaded</h3>
935
+ <p>An allow-failure matrix leg on Python pre-releases and the free-threaded
936
+ (no-GIL) build gives early warning of breakage before users on new
937
+ interpreters hit it. Cheap insurance for a project that already targets
938
+ 3.9&nbsp;→&nbsp;3.14 and can't afford a surprise on release day.</p>
939
+ <div class="meta">
940
+ <span class="m">Complexity <b>S</b></span>
941
+ <span class="m">Impact <b>Med</b></span>
942
+ <span class="m">Wow <b class="wow">★★★</b></span>
943
+ <span class="m">continue-on-error</span>
944
+ </div>
945
+ </article>
946
+
947
+ <article class="cap rcard">
948
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Perf · Startup</span></div>
949
+ <h3>Startup &amp; import-time budget — <code>-X importtime</code></h3>
950
+ <p>For a CLI, cold-start latency <em>is</em> the UX — every command pays it.
951
+ A gate on <code>python -X importtime boost</code> catches the accidental
952
+ top-level import of a heavy module (the optional <code>[rag]</code> stack
953
+ is the obvious trap) and keeps common commands feeling instant.</p>
954
+ <div class="meta">
955
+ <span class="m">Complexity <b>M</b></span>
956
+ <span class="m hi">Impact <b>High</b></span>
957
+ <span class="m">Wow <b class="wow">★★★★</b></span>
958
+ <span class="m">lazy-import guard</span>
959
+ </div>
960
+ </article>
961
+
962
+ <article class="cap rcard">
963
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Quality · Packaging</span></div>
964
+ <h3>Package-metadata validation — <code>twine check</code> + friends</h3>
965
+ <p>Before every publish, <code>twine check</code> confirms the long
966
+ description renders on PyPI, <code>check-wheel-contents</code> catches
967
+ stray or missing files, and <code>pyroma</code> scores the metadata
968
+ completeness. Stops a broken PyPI page or an empty wheel from reaching
969
+ users — the release path currently trusts the build blindly.</p>
970
+ <div class="meta">
971
+ <span class="m">Complexity <b>S</b></span>
972
+ <span class="m">Impact <b>Med</b></span>
973
+ <span class="m">Wow <b class="wow">★★★</b></span>
974
+ <span class="m">pre-publish gate</span>
975
+ </div>
976
+ </article>
977
+
978
+ <article class="cap rcard">
979
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Security · Repro</span></div>
980
+ <h3>Hash-pinned, reproducible toolchain — <code>uv.lock</code></h3>
981
+ <p>Pin the dev and CI toolchain with a hash-locked <code>uv.lock</code> (or
982
+ a hashed constraints file) so a yanked or compromised transitive
983
+ dependency can't silently change a build. The reproducibility layer that
984
+ complements Dependabot and <code>pip-audit</code> — same inputs, same
985
+ bytes, every run.</p>
986
+ <div class="meta">
987
+ <span class="m">Complexity <b>M</b></span>
988
+ <span class="m">Impact <b>Med</b></span>
989
+ <span class="m">Wow <b class="wow">★★★</b></span>
990
+ <span class="m">supply-chain repro</span>
991
+ </div>
992
+ </article>
993
+
994
+ <article class="cap rcard">
995
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Testing · Infra</span></div>
996
+ <h3>One command, every env — <code>nox</code></h3>
997
+ <p>A <code>noxfile.py</code> makes the full lint / test / smoke / mutation
998
+ gate reproducible across 3.9&nbsp;→&nbsp;3.14 in isolated environments,
999
+ locally and in CI alike — so "green on my machine" and "green in CI"
1000
+ finally mean the same thing, and a contributor can run the exact gate
1001
+ before pushing.</p>
1002
+ <div class="meta">
1003
+ <span class="m">Complexity <b>S</b></span>
1004
+ <span class="m">Impact <b>Med</b></span>
1005
+ <span class="m">Wow <b class="wow">★★</b></span>
1006
+ <span class="m">local == CI</span>
1007
+ </div>
1008
+ </article>
1009
+
1010
+ </div>
1011
+ </section>
1012
+
1013
+ <!-- ============ SKILL-CONTENT TRUST & SAFETY ============ -->
1014
+ <section class="block reveal" id="trust">
1015
+ <div class="block-head">
1016
+ <h2>Skill-content trust &amp; safety</h2>
1017
+ <span class="count">// planned · boost's core threat model — the third-party skills it installs run inside an agent</span>
1018
+ <span class="rule"></span>
1019
+ </div>
1020
+ <div class="rgrid">
1021
+
1022
+ <article class="cap rcard">
1023
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Security · Content</span></div>
1024
+ <h3>Prompt-injection scanning of skill Markdown</h3>
1025
+ <p>The highest-signal gap: boost installs Markdown an agent then <em>executes</em>,
1026
+ and nothing inspects that content. Scan skills for injection patterns —
1027
+ <em>"ignore previous instructions"</em>, data-exfiltration prompts,
1028
+ embedded <code>curl … | sh</code> — with free rule engines
1029
+ (<code>semgrep</code> custom rules, <code>garak</code>/<code>llm-guard</code>
1030
+ patterns) at tap and install time.</p>
1031
+ <div class="meta">
1032
+ <span class="m">Complexity <b>M</b></span>
1033
+ <span class="m hi">Impact <b>High</b></span>
1034
+ <span class="m">Wow <b class="wow">★★★★★</b></span>
1035
+ <span class="m">the core risk</span>
1036
+ </div>
1037
+ </article>
1038
+
1039
+ <article class="cap rcard">
1040
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Security · Integrity</span></div>
1041
+ <h3>Integrity verification — <code>boost verify</code></h3>
1042
+ <p>The lockfile already records a <code>sha256</code> per install via
1043
+ <code>util.sha256_dir</code>, but nothing ever re-checks it. A
1044
+ <code>verify</code> command (and a <code>doctor</code> gate) that
1045
+ re-hashes installed skills and flags drift turns that stored digest into
1046
+ actual tamper-detection — cheap, and built on machinery that already
1047
+ exists.</p>
1048
+ <div class="meta">
1049
+ <span class="m">Complexity <b>S</b></span>
1050
+ <span class="m hi">Impact <b>High</b></span>
1051
+ <span class="m">Wow <b class="wow">★★★★</b></span>
1052
+ <span class="m">reuses sha256_dir</span>
1053
+ </div>
1054
+ </article>
1055
+
1056
+ <article class="cap rcard">
1057
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Security · Provenance</span></div>
1058
+ <h3>Tap signing &amp; provenance — Sigstore / minisign</h3>
1059
+ <p>A tap records its <code>commit</code> today but offers no cryptographic
1060
+ proof the content came from its claimed publisher, so a hijacked mirror
1061
+ can serve altered skills undetected. Verify a signature (Sigstore
1062
+ keyless or <code>minisign</code>) before trusting a tap — free, and the
1063
+ standard the wider ecosystem is converging on.</p>
1064
+ <div class="meta">
1065
+ <span class="m">Complexity <b>M</b></span>
1066
+ <span class="m">Impact <b>Med</b></span>
1067
+ <span class="m">Wow <b class="wow">★★★★</b></span>
1068
+ <span class="m">keyless OIDC</span>
1069
+ </div>
1070
+ </article>
1071
+
1072
+ <article class="cap rcard">
1073
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Security · Registry</span></div>
1074
+ <h3>Typosquat &amp; name-confusion detection</h3>
1075
+ <p>The classic package-manager attack: a skill named one edit-distance from
1076
+ a popular one, or a familiar name that quietly resolves to an unexpected
1077
+ <code>owner/repo</code>. Flag near-duplicate names and owner mismatches
1078
+ at search and install time so a user can't fat-finger their way into a
1079
+ malicious skill.</p>
1080
+ <div class="meta">
1081
+ <span class="m">Complexity <b>M</b></span>
1082
+ <span class="m">Impact <b>Med</b></span>
1083
+ <span class="m">Wow <b class="wow">★★★★</b></span>
1084
+ <span class="m">edit-distance guard</span>
1085
+ </div>
1086
+ </article>
1087
+
1088
+ <article class="cap rcard">
1089
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Security · Supply chain</span></div>
1090
+ <h3>Update-diff before apply</h3>
1091
+ <p><code>boost update</code> overwrites installed skills in place. Show a
1092
+ content diff of what an upstream change alters — and require confirmation
1093
+ for anything that touches executable-looking instructions — so a poisoned
1094
+ update is <em>visible</em> instead of silent. The "review the diff" gate,
1095
+ applied to skills.</p>
1096
+ <div class="meta">
1097
+ <span class="m">Complexity <b>M</b></span>
1098
+ <span class="m">Impact <b>Med</b></span>
1099
+ <span class="m">Wow <b class="wow">★★★</b></span>
1100
+ <span class="m">no silent overwrites</span>
1101
+ </div>
1102
+ </article>
1103
+
1104
+ <article class="cap rcard">
1105
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Security · Secrets</span></div>
1106
+ <h3>Secret &amp; PII scanning of installed skills</h3>
1107
+ <p>Point the round-2 secret scanners (<code>gitleaks</code>/<code>trufflehog</code>)
1108
+ at <em>third-party</em> skill content, not just boost's own repo — catching
1109
+ a skill that ships embedded credentials or, worse, one whose prompt
1110
+ coaxes the agent into harvesting the user's. Same free tools, a different
1111
+ and higher-stakes target.</p>
1112
+ <div class="meta">
1113
+ <span class="m">Complexity <b>S</b></span>
1114
+ <span class="m">Impact <b>Med</b></span>
1115
+ <span class="m">Wow <b class="wow">★★★</b></span>
1116
+ <span class="m">installed content</span>
1117
+ </div>
1118
+ </article>
1119
+
1120
+ <article class="cap rcard">
1121
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Security · Integrity</span></div>
1122
+ <h3>Lockfile enforcement &amp; commit pinning</h3>
1123
+ <p>Promote the recorded <code>sha256</code> from a note to a rule: refuse to
1124
+ load a skill whose content has drifted from the lockfile, and let users
1125
+ pin a skill to an exact commit. The enforcement layer that makes the
1126
+ <code>verify</code> digest binding rather than advisory.</p>
1127
+ <div class="meta">
1128
+ <span class="m">Complexity <b>S</b></span>
1129
+ <span class="m">Impact <b>Med</b></span>
1130
+ <span class="m">Wow <b class="wow">★★★</b></span>
1131
+ <span class="m">pin to commit</span>
1132
+ </div>
1133
+ </article>
1134
+
1135
+ <article class="cap rcard">
1136
+ <div class="head"><span class="pill planned">Planned</span><span class="cat">Security · Policy</span></div>
1137
+ <h3>Capability manifest &amp; least-privilege policy</h3>
1138
+ <p>Extend the existing <code>policy.py</code> so a skill declares the
1139
+ capabilities it expects — network, shell, file scope — and the user's
1140
+ policy allows or denies them. Turns install-time governance into
1141
+ least-privilege for the instructions an agent is about to run, the
1142
+ natural next step for a tool that already blocks installs by policy.</p>
1143
+ <div class="meta">
1144
+ <span class="m">Complexity <b>L</b></span>
1145
+ <span class="m">Impact <b>Med</b></span>
1146
+ <span class="m">Wow <b class="wow">★★★★</b></span>
1147
+ <span class="m">builds on policy.py</span>
1148
+ </div>
1149
+ </article>
1150
+
1151
+ </div>
1152
+ </section>
1153
+
875
1154
  <footer>
876
1155
  <p>Maintained by the boost quality loop · themed with
877
1156
  <a href="../style/boost.css">style/boost.css</a> ·
File without changes