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.
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/info.py +3 -3
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/output.py +18 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/design-roadmap.html +1 -1
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_output.py +25 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/.gitignore +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/LICENSE +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/Makefile +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/README.md +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/index.html +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/docs/roadmap.html +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/setup.cfg +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/style/README.md +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/style/boost.css +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/style/boost.js +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/style/demo.html +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/unit/test_version.py +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.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.
|
|
348
|
-
|
|
349
|
-
|
|
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
|
|
|
@@ -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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/boost_skill_cli.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.0.28 → boost_skill_cli-1.0.29}/tests/functional/test_cli_configuration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|