boost-skill-cli 1.0.29__tar.gz → 1.0.30__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.29 → boost_skill_cli-1.0.30}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/commands/info.py +7 -4
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/output.py +10 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/docs/design-roadmap.html +3 -3
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_output.py +24 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/.gitignore +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/LICENSE +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/Makefile +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/README.md +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/docs/index.html +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/docs/roadmap.html +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/setup.cfg +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/style/README.md +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/style/boost.css +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/style/boost.js +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/style/demo.html +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.29 → boost_skill_cli-1.0.30}/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.30'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 30)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -114,10 +114,12 @@ def cmd_list(argv):
|
|
|
114
114
|
print(json.dumps(skills, indent=2, sort_keys=True))
|
|
115
115
|
return 0
|
|
116
116
|
if not skills:
|
|
117
|
-
out.
|
|
118
|
-
|
|
119
|
-
|
|
117
|
+
print(out.empty_state(
|
|
118
|
+
"no skills installed"
|
|
119
|
+
+ (" with tag #%s" % args.tag.lstrip("#") if args.tag else ""),
|
|
120
|
+
hint="boost tap --defaults && boost search <topic>"))
|
|
120
121
|
return 0
|
|
122
|
+
out.heading("installed skills")
|
|
121
123
|
rows = []
|
|
122
124
|
for name in sorted(skills):
|
|
123
125
|
e = skills[name]
|
|
@@ -128,7 +130,8 @@ def cmd_list(argv):
|
|
|
128
130
|
"·".join(a.split("-")[0] for a in e.get("agents") or []),
|
|
129
131
|
" ".join(flags)))
|
|
130
132
|
out.table(rows, headers=("NAME", "VERSION", "TAP", "AGENTS", "FLAGS"))
|
|
131
|
-
print(out.
|
|
133
|
+
print(" " + out.aurora("%d skill%s installed"
|
|
134
|
+
% (len(rows), "" if len(rows) == 1 else "s"), "cyan"))
|
|
132
135
|
return 0
|
|
133
136
|
|
|
134
137
|
|
|
@@ -223,6 +223,16 @@ _TRAFFIC = ((0xff, 0x5f, 0x57, RED), (0xfe, 0xbc, 0x2e, YELLOW),
|
|
|
223
223
|
(0x28, 0xc8, 0x40, GREEN))
|
|
224
224
|
|
|
225
225
|
|
|
226
|
+
def empty_state(message: str, hint: str | None = None) -> str:
|
|
227
|
+
"""A standardized empty-state: a muted ○ bullet + message, with an optional
|
|
228
|
+
dim → hint on the next line. One affordance so 'nothing here' always reads
|
|
229
|
+
the same across commands."""
|
|
230
|
+
out_lines = [" " + c("○ " + message, DIM)]
|
|
231
|
+
if hint:
|
|
232
|
+
out_lines.append(" " + c("→ " + hint, DIM))
|
|
233
|
+
return "\n".join(out_lines)
|
|
234
|
+
|
|
235
|
+
|
|
226
236
|
def titlebar(title: str) -> str:
|
|
227
237
|
"""A terminal window title bar: traffic-light dots + a bold title, the
|
|
228
238
|
terminal echo of the web .window .bar. Plain dots under NO_COLOR."""
|
|
@@ -412,7 +412,7 @@
|
|
|
412
412
|
</article>
|
|
413
413
|
|
|
414
414
|
<article class="ritem" data-track="commands" data-impact="med">
|
|
415
|
-
<div class="ritem-top"><span class="rid">BOOST-D16</span><span class="rstatus
|
|
415
|
+
<div class="ritem-top"><span class="rid">BOOST-D16</span><span class="rstatus done">Shipped</span></div>
|
|
416
416
|
<h4><code>info</code> skill identity card</h4>
|
|
417
417
|
<p><code>info</code> lists <code>kv()</code> pairs as flat dim labels. Promote it to a framed identity card: gradient skill name, status badges (<b>installed</b> / <b>pinned</b> / tap origin) styled like the web <code>.badge</code> pills, then the metadata — a real "detail view," not a key-value dump.</p>
|
|
418
418
|
<div class="rmeta"><span class="m-cat">commands</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★☆</span></div>
|
|
@@ -428,7 +428,7 @@
|
|
|
428
428
|
</article>
|
|
429
429
|
|
|
430
430
|
<article class="ritem" data-track="commands" data-impact="low">
|
|
431
|
-
<div class="ritem-top"><span class="rid">BOOST-D18</span><span class="rstatus
|
|
431
|
+
<div class="ritem-top"><span class="rid">BOOST-D18</span><span class="rstatus done">Shipped</span></div>
|
|
432
432
|
<h4>Consistent empty-states & hint styling</h4>
|
|
433
433
|
<p>Empty and hint lines are ad-hoc — <code>info</code>'s "no skills installed" hint is a hand-rolled <code>DIM</code> string. Standardize a single empty-state affordance (muted icon + one-line guidance + suggested command) and a single hint style, applied everywhere, so guidance always looks the same.</p>
|
|
434
434
|
<div class="rmeta"><span class="m-cat">ux</span><span>Complexity S</span><span class="m-imp low">Impact Low</span><span class="m-wow">★★☆☆☆</span></div>
|
|
@@ -459,7 +459,7 @@
|
|
|
459
459
|
<div class="rcards">
|
|
460
460
|
|
|
461
461
|
<article class="ritem" data-track="system" data-impact="med">
|
|
462
|
-
<div class="ritem-top"><span class="rid">BOOST-D19</span><span class="rstatus
|
|
462
|
+
<div class="ritem-top"><span class="rid">BOOST-D19</span><span class="rstatus done">Shipped</span></div>
|
|
463
463
|
<h4>Resolve theme drift: <code>style/</code> vs <code>docs/style/</code></h4>
|
|
464
464
|
<p>Two copies of <code>boost.css</code> have <b>diverged</b>: the root <code>style/</code> uses a cyan→violet→pink gradient (<code>--violet #a855f7</code>), while <code>docs/style/</code> uses an orange→pink→violet one (<code>--violet #a78bfa</code>). Same brand, two looks. Pick <code>style/</code> as canonical and make <code>docs/style/</code> a generated copy or symlink so the portfolio, roadmaps and CLI can't drift again.</p>
|
|
465
465
|
<div class="rmeta"><span class="m-cat">system</span><span>Complexity S</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★☆☆</span></div>
|
|
@@ -343,6 +343,30 @@ class TestPanel:
|
|
|
343
343
|
assert "\033[1minventory\033[0m" in output.panel("x", title="inventory")
|
|
344
344
|
|
|
345
345
|
|
|
346
|
+
class TestEmptyState:
|
|
347
|
+
def test_message_only_plain(self, monkeypatch):
|
|
348
|
+
monkeypatch.setenv("NO_COLOR", "1")
|
|
349
|
+
assert output.empty_state("nothing here") == " ○ nothing here"
|
|
350
|
+
|
|
351
|
+
def test_message_and_hint_plain(self, monkeypatch):
|
|
352
|
+
monkeypatch.setenv("NO_COLOR", "1")
|
|
353
|
+
assert output.empty_state("empty", hint="try x") == (
|
|
354
|
+
" ○ empty\n → try x")
|
|
355
|
+
|
|
356
|
+
def test_no_hint_is_single_line(self, monkeypatch):
|
|
357
|
+
monkeypatch.setenv("NO_COLOR", "1")
|
|
358
|
+
assert "\n" not in output.empty_state("solo")
|
|
359
|
+
|
|
360
|
+
def test_message_is_dim_when_forced(self, monkeypatch):
|
|
361
|
+
monkeypatch.setenv("CLICOLOR_FORCE", "1")
|
|
362
|
+
assert output.empty_state("x") == " \033[2m○ x\033[0m"
|
|
363
|
+
|
|
364
|
+
def test_both_lines_dim_when_forced(self, monkeypatch):
|
|
365
|
+
monkeypatch.setenv("CLICOLOR_FORCE", "1")
|
|
366
|
+
assert output.empty_state("x", hint="y") == (
|
|
367
|
+
" \033[2m○ x\033[0m\n \033[2m→ y\033[0m")
|
|
368
|
+
|
|
369
|
+
|
|
346
370
|
class TestTitlebar:
|
|
347
371
|
def test_plain_dots_and_title(self, monkeypatch):
|
|
348
372
|
monkeypatch.setenv("NO_COLOR", "1")
|
|
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.29 → boost_skill_cli-1.0.30}/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.29 → boost_skill_cli-1.0.30}/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
|