boost-skill-cli 1.0.28__tar.gz → 1.0.29__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 (105) hide show
  1. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/PKG-INFO +1 -1
  2. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/_version.py +2 -2
  3. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/info.py +3 -3
  4. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/output.py +18 -0
  5. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_skill_cli.egg-info/PKG-INFO +1 -1
  6. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/design-roadmap.html +1 -1
  7. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_output.py +25 -0
  8. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/.gitignore +0 -0
  9. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/CLAUDE.md +0 -0
  10. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/CONTRIBUTING.md +0 -0
  11. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/LICENSE +0 -0
  12. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/MANIFEST.in +0 -0
  13. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/Makefile +0 -0
  14. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/README.md +0 -0
  15. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/SECURITY.md +0 -0
  16. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost +0 -0
  17. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/__init__.py +0 -0
  18. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/__main__.py +0 -0
  19. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/cli.py +0 -0
  20. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/__init__.py +0 -0
  21. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/bmad.py +0 -0
  22. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/configuration.py +0 -0
  23. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/discovery.py +0 -0
  24. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/hooks.py +0 -0
  25. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/intelligence.py +0 -0
  26. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/pkg.py +0 -0
  27. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/quality.py +0 -0
  28. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/taps.py +0 -0
  29. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/team.py +0 -0
  30. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/__init__.py +0 -0
  31. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/agents.py +0 -0
  32. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/ai.py +0 -0
  33. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/catalog.py +0 -0
  34. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/claude_settings.py +0 -0
  35. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/config.py +0 -0
  36. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/dense.py +0 -0
  37. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/embed.py +0 -0
  38. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/frontmatter.py +0 -0
  39. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/gitutil.py +0 -0
  40. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/journal.py +0 -0
  41. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/lockfile.py +0 -0
  42. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/logs.py +0 -0
  43. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/paths.py +0 -0
  44. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/policy.py +0 -0
  45. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/rag.py +0 -0
  46. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/registry.py +0 -0
  47. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/store.py +0 -0
  48. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/util.py +0 -0
  49. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/data/registries.json +0 -0
  50. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/errors.py +0 -0
  51. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
  52. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
  53. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_skill_cli.egg-info/entry_points.txt +0 -0
  54. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_skill_cli.egg-info/requires.txt +0 -0
  55. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_skill_cli.egg-info/top_level.txt +0 -0
  56. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/.claude/settings.local.json +0 -0
  57. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/DEBUGGING.md +0 -0
  58. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/demo.gif +0 -0
  59. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/demo.tape +0 -0
  60. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/index.html +0 -0
  61. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/rag-architecture.md +0 -0
  62. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/roadmap.html +0 -0
  63. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/pyproject.toml +0 -0
  64. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/scripts/build_registries.py +0 -0
  65. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/scripts/mutation_gate.py +0 -0
  66. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/setup.cfg +0 -0
  67. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/style/README.md +0 -0
  68. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/style/boost.css +0 -0
  69. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/style/boost.js +0 -0
  70. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/style/demo.html +0 -0
  71. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/conftest.py +0 -0
  72. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_bmad.py +0 -0
  73. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_configuration.py +0 -0
  74. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_discovery.py +0 -0
  75. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_hooks.py +0 -0
  76. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_info.py +0 -0
  77. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_intelligence.py +0 -0
  78. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_pkg.py +0 -0
  79. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_quality.py +0 -0
  80. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_taps.py +0 -0
  81. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_team.py +0 -0
  82. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_everyday_loop.py +0 -0
  83. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/make_fixture.py +0 -0
  84. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/smoke.sh +0 -0
  85. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_agents.py +0 -0
  86. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_ai.py +0 -0
  87. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_catalog.py +0 -0
  88. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_claude_settings.py +0 -0
  89. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_config.py +0 -0
  90. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_dense.py +0 -0
  91. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_embed.py +0 -0
  92. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_errors_and_cli_table.py +0 -0
  93. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_frontmatter.py +0 -0
  94. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_gitutil.py +0 -0
  95. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_journal.py +0 -0
  96. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_lockfile.py +0 -0
  97. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_logs.py +0 -0
  98. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_mutation_hardening.py +0 -0
  99. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_paths.py +0 -0
  100. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_policy.py +0 -0
  101. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_rag.py +0 -0
  102. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_registry.py +0 -0
  103. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_store.py +0 -0
  104. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_util.py +0 -0
  105. {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/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.28
3
+ Version: 1.0.29
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.28'
22
- __version_tuple__ = version_tuple = (1, 0, 28)
21
+ __version__ = version = '1.0.29'
22
+ __version_tuple__ = version_tuple = (1, 0, 29)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -344,9 +344,9 @@ def cmd_preview(argv):
344
344
  args = ap.parse_args(argv)
345
345
  path, lock, cat = _resolve_skill_md(args.name)
346
346
  meta, body = frontmatter.parse(_read(path))
347
- print(out.c("%s · v%s · %s" % (meta.get("name") or args.name,
348
- meta.get("version") or "?",
349
- (lock or cat or {}).get("tap", "local")), out.DIM))
347
+ print(out.titlebar("%s · v%s · %s" % (meta.get("name") or args.name,
348
+ meta.get("version") or "?",
349
+ (lock or cat or {}).get("tap", "local"))))
350
350
  print()
351
351
  _render_markdown(body)
352
352
  return 0
@@ -217,6 +217,24 @@ def panel(lines, title: str | None = None, hue: str = "cyan") -> str:
217
217
  return "\n".join(rows)
218
218
 
219
219
 
220
+ # macOS-style traffic-light dots (close/minimise/zoom), matching the web
221
+ # .window .bar dots — exact truecolor with a 16-color fallback each.
222
+ _TRAFFIC = ((0xff, 0x5f, 0x57, RED), (0xfe, 0xbc, 0x2e, YELLOW),
223
+ (0x28, 0xc8, 0x40, GREEN))
224
+
225
+
226
+ def titlebar(title: str) -> str:
227
+ """A terminal window title bar: traffic-light dots + a bold title, the
228
+ terminal echo of the web .window .bar. Plain dots under NO_COLOR."""
229
+ level = color_level()
230
+ if level == 0:
231
+ dots = "● ● ●"
232
+ else:
233
+ dots = " ".join((rgb(r, g, bl) if level == 2 else fb) + "●" + RESET
234
+ for r, g, bl, fb in _TRAFFIC)
235
+ return " " + dots + " " + c(title, BOLD)
236
+
237
+
220
238
  def meter(fraction: float, width: int = 4) -> str:
221
239
  """A tiny proportional bar for a 0..1 fraction — filled ▰ vs empty ▱.
222
240
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boost-skill-cli
3
- Version: 1.0.28
3
+ Version: 1.0.29
4
4
  Summary: boost — Homebrew for AI coding skills
5
5
  Author: Jonathan Reyes
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -310,7 +310,7 @@
310
310
  </article>
311
311
 
312
312
  <article class="ritem" data-track="layout" data-impact="med">
313
- <div class="ritem-top"><span class="rid">BOOST-D09</span><span class="rstatus proposed">Proposed</span></div>
313
+ <div class="ritem-top"><span class="rid">BOOST-D09</span><span class="rstatus done">Shipped</span></div>
314
314
  <h4>Terminal-window chrome for <code>preview</code> / <code>cat</code></h4>
315
315
  <p>The web guide renders skills inside a titled window with traffic-light dots (<code>.window .dots</code>). Give <code>preview</code>/<code>cat</code> the same treatment: a titled frame with the skill name in the bar, so a rendered <code>SKILL.md</code> in the terminal matches the screenshots on the site.</p>
316
316
  <div class="rmeta"><span class="m-cat">layout</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★☆</span></div>
@@ -343,6 +343,31 @@ class TestPanel:
343
343
  assert "\033[1minventory\033[0m" in output.panel("x", title="inventory")
344
344
 
345
345
 
346
+ class TestTitlebar:
347
+ def test_plain_dots_and_title(self, monkeypatch):
348
+ monkeypatch.setenv("NO_COLOR", "1")
349
+ assert output.titlebar("skill") == " ● ● ● skill"
350
+
351
+ def test_truecolor_dots_exact(self, monkeypatch):
352
+ monkeypatch.setenv("COLORTERM", "truecolor")
353
+ monkeypatch.setenv("CLICOLOR_FORCE", "1")
354
+ # exact bar pins the three traffic-light hexes, single-space separators
355
+ # between dots, and the bold title
356
+ assert output.titlebar("x") == (
357
+ " \033[38;2;255;95;87m●\033[0m" # #ff5f57 close
358
+ " \033[38;2;254;188;46m●\033[0m" # #febc2e minimise
359
+ " \033[38;2;40;200;64m●\033[0m" # #28c840 zoom
360
+ " \033[1mx\033[0m")
361
+
362
+ def test_basic_dots_use_16color_fallback(self, monkeypatch):
363
+ # Force the 16-color tier: dots fall back to basic RED/YELLOW/GREEN.
364
+ monkeypatch.setattr(output, "color_level", lambda: 1)
365
+ bar = output.titlebar("x")
366
+ assert output.RED + "●" + output.RESET in bar
367
+ assert output.YELLOW + "●" + output.RESET in bar
368
+ assert output.GREEN + "●" + output.RESET in bar
369
+
370
+
346
371
  class TestMeter:
347
372
  def test_full(self):
348
373
  assert output.meter(1.0, 4) == "▰▰▰▰"
File without changes