boost-skill-cli 1.0.23__tar.gz → 1.0.25__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.23 → boost_skill_cli-1.0.25}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/commands/discovery.py +5 -2
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/docs/design-roadmap.html +29 -5
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/docs/roadmap.html +141 -1
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/functional/test_cli_discovery.py +8 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/.gitignore +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/LICENSE +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/Makefile +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/README.md +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/docs/index.html +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/setup.cfg +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/style/README.md +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/style/boost.css +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/style/boost.js +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/style/demo.html +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/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.25'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 25)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -602,7 +602,9 @@ def cmd_trending(argv):
|
|
|
602
602
|
if not curated:
|
|
603
603
|
out.info("no curated skills available — add taps with `boost tap --defaults`")
|
|
604
604
|
return 0
|
|
605
|
-
out.
|
|
605
|
+
descw = max(out.term_width() - 24, 24) # reserve name + version columns
|
|
606
|
+
out.table([(e["name"], "v" + e["version"],
|
|
607
|
+
out.truncate(e["description"], descw))
|
|
606
608
|
for e in sorted(curated, key=lambda e: e["name"])[:args.limit]])
|
|
607
609
|
return 0
|
|
608
610
|
agg = {}
|
|
@@ -611,8 +613,9 @@ def cmd_trending(argv):
|
|
|
611
613
|
rec = agg.setdefault(name, {"count": 0, "last": ev.get("ts", "")})
|
|
612
614
|
rec["count"] += 1
|
|
613
615
|
ranked = sorted(agg.items(), key=lambda kv: (-kv[1]["count"], kv[0]))
|
|
616
|
+
descw = max(out.term_width() - 44, 24) # reserve name/installs/last columns
|
|
614
617
|
out.table([(name, str(rec["count"]), util.rel_time(rec["last"]),
|
|
615
|
-
by_name.get(name, {}).get("description", ""))
|
|
618
|
+
out.truncate(by_name.get(name, {}).get("description", ""), descw))
|
|
616
619
|
for name, rec in ranked[:args.limit]],
|
|
617
620
|
headers=("name", "installs", "last", "description"))
|
|
618
621
|
out.info(out.c("based on local install activity", out.DIM))
|
|
@@ -142,7 +142,7 @@
|
|
|
142
142
|
<code>NO_COLOR</code> and non-TTY are always respected.
|
|
143
143
|
</p>
|
|
144
144
|
<div class="stats">
|
|
145
|
-
<div class="stat reveal"><b>
|
|
145
|
+
<div class="stat reveal"><b>25</b><span>Design opportunities</span></div>
|
|
146
146
|
<div class="stat reveal"><b>5</b><span>Design tracks</span></div>
|
|
147
147
|
<div class="stat reveal"><b>0</b><span>New dependencies</span></div>
|
|
148
148
|
<div class="stat reveal"><b>1:1</b><span>Web ↔ CLI parity goal</span></div>
|
|
@@ -213,7 +213,7 @@
|
|
|
213
213
|
<button class="pill" data-filter="impact" data-val="med">Med</button>
|
|
214
214
|
<button class="pill" data-filter="impact" data-val="low">Low</button>
|
|
215
215
|
</div>
|
|
216
|
-
<p class="roadmap-count"><b id="shown">
|
|
216
|
+
<p class="roadmap-count"><b id="shown">25</b> of <b>25</b> opportunities shown</p>
|
|
217
217
|
</div>
|
|
218
218
|
|
|
219
219
|
<div class="wrap" id="board">
|
|
@@ -273,7 +273,7 @@
|
|
|
273
273
|
<h3>Structure & Layout</h3>
|
|
274
274
|
<p>Width-aware output, glass panels, and results that never blow up the pane.</p>
|
|
275
275
|
</div>
|
|
276
|
-
<span class="n">
|
|
276
|
+
<span class="n">7 items</span>
|
|
277
277
|
</div>
|
|
278
278
|
<div class="rcards">
|
|
279
279
|
|
|
@@ -317,6 +317,22 @@
|
|
|
317
317
|
<div class="rref"><code>commands/info.py · preview/cat</code></div>
|
|
318
318
|
</article>
|
|
319
319
|
|
|
320
|
+
<article class="ritem" data-track="layout" data-impact="high">
|
|
321
|
+
<div class="ritem-top"><span class="rid">BOOST-D23</span><span class="rstatus done">Shipped</span></div>
|
|
322
|
+
<h4><code>trending</code> had the same overflow as <code>search</code></h4>
|
|
323
|
+
<p>Grading the un-touched commands surfaced a sibling of D05: <code>boost trending</code> piped raw catalog descriptions straight into <code>table()</code>, so a single 300-char description blew the table across the pane. Fixed by clipping each description through <code>out.truncate()</code> to the width left after the name/installs/last columns — the same helper the search fix introduced.</p>
|
|
324
|
+
<div class="rmeta"><span class="m-cat">layout</span><span>Complexity S</span><span class="m-imp high">Impact High</span><span class="m-wow">★★★★☆</span></div>
|
|
325
|
+
<div class="rref"><code>commands/discovery.py · cmd_trending</code></div>
|
|
326
|
+
</article>
|
|
327
|
+
|
|
328
|
+
<article class="ritem" data-track="layout" data-impact="med">
|
|
329
|
+
<div class="ritem-top"><span class="rid">BOOST-D24</span><span class="rstatus proposed">Proposed</span></div>
|
|
330
|
+
<h4>Width-aware shared <code>table()</code></h4>
|
|
331
|
+
<p><code>out.table()</code> backs 28 call sites, and several still overflow: <code>taps</code> pads the NAME column to the widest repo (<code>K-Dense-AI/claude-scientific-skills</code> = 44 cols) and then prints full URLs, so wide catalogs wrap. The durable fix is to make <code>table()</code> itself width-aware — shrink the widest text column to the terminal and right-align numeric columns — instead of truncating per-caller. Higher blast radius (28 callers, many exact-output tests), so it needs a careful, test-first pass.</p>
|
|
332
|
+
<div class="rmeta"><span class="m-cat">layout</span><span>Complexity L</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★★☆</span></div>
|
|
333
|
+
<div class="rref"><code>core/output.py:table() · commands/taps.py</code></div>
|
|
334
|
+
</article>
|
|
335
|
+
|
|
320
336
|
</div>
|
|
321
337
|
</section>
|
|
322
338
|
|
|
@@ -375,12 +391,12 @@
|
|
|
375
391
|
<h3>Command-by-command Polish</h3>
|
|
376
392
|
<p>The screens users actually stare at — front door, doctor, list, info.</p>
|
|
377
393
|
</div>
|
|
378
|
-
<span class="n">
|
|
394
|
+
<span class="n">6 items</span>
|
|
379
395
|
</div>
|
|
380
396
|
<div class="rcards">
|
|
381
397
|
|
|
382
398
|
<article class="ritem" data-track="commands" data-impact="med">
|
|
383
|
-
<div class="ritem-top"><span class="rid">BOOST-D14</span><span class="rstatus
|
|
399
|
+
<div class="ritem-top"><span class="rid">BOOST-D14</span><span class="rstatus done">Shipped</span></div>
|
|
384
400
|
<h4>Front door: gradient wordmark + section glyphs</h4>
|
|
385
401
|
<p>The <code>boost</code> home screen is the first thing everyone sees. Today the wordmark is plain bold and every group header is the same generic yellow. Paint the <code>boost</code> wordmark with the Aurora gradient and give each command group a colored bullet/glyph keyed to a brand hue — turning a flat list into a branded index.</p>
|
|
386
402
|
<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>
|
|
@@ -419,6 +435,14 @@
|
|
|
419
435
|
<div class="rref"><code>commands/info.py:117–119 · core/output.py</code></div>
|
|
420
436
|
</article>
|
|
421
437
|
|
|
438
|
+
<article class="ritem" data-track="commands" data-impact="med">
|
|
439
|
+
<div class="ritem-top"><span class="rid">BOOST-D25</span><span class="rstatus proposed">Proposed</span></div>
|
|
440
|
+
<h4>Branded usage & error output</h4>
|
|
441
|
+
<p>Run a subcommand wrong — <code>boost snapshot</code> with no action — and you get raw, unstyled <code>argparse</code>: a multi-line usage dump with a bare <code>error:</code>, nothing like the branded help. Route argparse's usage/error through the Aurora output layer (accent the program name, dim the usage grammar, use the standard <code>Error:</code> affordance) so <em>failure</em> looks as designed as success. Bonus: a "did you mean …" suggestion for unknown commands.</p>
|
|
442
|
+
<div class="rmeta"><span class="m-cat">ux</span><span>Complexity M</span><span class="m-imp med">Impact Med</span><span class="m-wow">★★★☆☆</span></div>
|
|
443
|
+
<div class="rref"><code>cli.py · argparse formatter</code></div>
|
|
444
|
+
</article>
|
|
445
|
+
|
|
422
446
|
</div>
|
|
423
447
|
</section>
|
|
424
448
|
|
|
@@ -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>
|
|
119
|
+
<div class="stat"><b>16</b><span>Loop finds</span></div>
|
|
120
120
|
</div>
|
|
121
121
|
</section>
|
|
122
122
|
|
|
@@ -456,6 +456,146 @@
|
|
|
456
456
|
</div>
|
|
457
457
|
</section>
|
|
458
458
|
|
|
459
|
+
<!-- ============ PIPELINE & SUPPLY-CHAIN INTEGRITY ============ -->
|
|
460
|
+
<section class="block reveal" id="pipeline">
|
|
461
|
+
<div class="block-head">
|
|
462
|
+
<h2>Pipeline & supply-chain integrity</h2>
|
|
463
|
+
<span class="count">// planned · free tooling to secure the CI/CD path itself</span>
|
|
464
|
+
<span class="rule"></span>
|
|
465
|
+
</div>
|
|
466
|
+
<div class="rgrid">
|
|
467
|
+
|
|
468
|
+
<article class="cap rcard">
|
|
469
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">Security · CI/CD</span></div>
|
|
470
|
+
<h3>Workflow SAST — <code>zizmor</code></h3>
|
|
471
|
+
<p>boost's four workflows embed <code>github-script</code> JavaScript and
|
|
472
|
+
shell and drive a Trusted-Publisher release — a rich attack surface.
|
|
473
|
+
<code>zizmor</code> statically flags template injection, unpinned
|
|
474
|
+
actions, over-broad <code>GITHUB_TOKEN</code> permissions and dangerous
|
|
475
|
+
triggers. The one tool that audits the automation that ships every
|
|
476
|
+
other fix.</p>
|
|
477
|
+
<div class="meta">
|
|
478
|
+
<span class="m">Complexity <b>S</b></span>
|
|
479
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
480
|
+
<span class="m">Wow <b class="wow">★★★★★</b></span>
|
|
481
|
+
<span class="m">pipx-run</span>
|
|
482
|
+
</div>
|
|
483
|
+
</article>
|
|
484
|
+
|
|
485
|
+
<article class="cap rcard">
|
|
486
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">Quality · CI/CD</span></div>
|
|
487
|
+
<h3>Workflow linting — <code>actionlint</code></h3>
|
|
488
|
+
<p>Catches GitHub Actions YAML bugs before they fail a live release:
|
|
489
|
+
malformed <code>${{ }}</code> expressions, deprecated syntax, and
|
|
490
|
+
shellcheck run over every <code>run:</code> block. Cheap insurance for a
|
|
491
|
+
repo whose release is fully automated — a broken workflow is a broken
|
|
492
|
+
publish.</p>
|
|
493
|
+
<div class="meta">
|
|
494
|
+
<span class="m">Complexity <b>S</b></span>
|
|
495
|
+
<span class="m">Impact <b>Med</b></span>
|
|
496
|
+
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
497
|
+
<span class="m">shellcheck built in</span>
|
|
498
|
+
</div>
|
|
499
|
+
</article>
|
|
500
|
+
|
|
501
|
+
<article class="cap rcard">
|
|
502
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">Security · Supply chain</span></div>
|
|
503
|
+
<h3>Build provenance — SLSA attestations</h3>
|
|
504
|
+
<p><code>actions/attest-build-provenance</code> emits a cryptographically
|
|
505
|
+
signed, verifiable record of <em>which workflow built which wheel from
|
|
506
|
+
which commit</em>, layered on top of the existing PyPI Trusted
|
|
507
|
+
Publishing. Consumers can <code>gh attestation verify</code> the
|
|
508
|
+
artifact they install — provenance without a paid signing service.</p>
|
|
509
|
+
<div class="meta">
|
|
510
|
+
<span class="m">Complexity <b>S</b></span>
|
|
511
|
+
<span class="m">Impact <b>Med</b></span>
|
|
512
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
513
|
+
<span class="m">SLSA build L2</span>
|
|
514
|
+
</div>
|
|
515
|
+
</article>
|
|
516
|
+
|
|
517
|
+
<article class="cap rcard">
|
|
518
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">Security · Supply chain</span></div>
|
|
519
|
+
<h3>SBOM on every release — CycloneDX / Syft</h3>
|
|
520
|
+
<p>Generate a CycloneDX SBOM with the free <code>anchore/sbom-action</code>
|
|
521
|
+
and attach it to each GitHub Release, so downstreams can inventory and
|
|
522
|
+
scan exactly what boost is built from. Modest today (boost is close to
|
|
523
|
+
stdlib-only) but it grows in value as the optional <code>[rag]</code>
|
|
524
|
+
extras pull in real dependencies.</p>
|
|
525
|
+
<div class="meta">
|
|
526
|
+
<span class="m">Complexity <b>S</b></span>
|
|
527
|
+
<span class="m">Impact <b>Med</b></span>
|
|
528
|
+
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
529
|
+
<span class="m">feeds osv-scanner</span>
|
|
530
|
+
</div>
|
|
531
|
+
</article>
|
|
532
|
+
|
|
533
|
+
<article class="cap rcard">
|
|
534
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">Security · Vuln</span></div>
|
|
535
|
+
<h3>SBOM-aware scanning — <code>osv-scanner</code></h3>
|
|
536
|
+
<p>Google's <code>osv-scanner</code> cross-checks a lockfile or the SBOM
|
|
537
|
+
above against the OSV database, with broader ecosystem coverage than a
|
|
538
|
+
single-language audit. The SBOM-driven complement to <code>pip-audit</code>:
|
|
539
|
+
one scans the resolved env, the other scans the published manifest.</p>
|
|
540
|
+
<div class="meta">
|
|
541
|
+
<span class="m">Complexity <b>S</b></span>
|
|
542
|
+
<span class="m">Impact <b>Med</b></span>
|
|
543
|
+
<span class="m">Wow <b class="wow">★★</b></span>
|
|
544
|
+
<span class="m">OSV-backed</span>
|
|
545
|
+
</div>
|
|
546
|
+
</article>
|
|
547
|
+
|
|
548
|
+
<article class="cap rcard">
|
|
549
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">Testing · Type</span></div>
|
|
550
|
+
<h3>Second type checker — <code>pyright</code></h3>
|
|
551
|
+
<p>Run Microsoft's <code>pyright</code> alongside mypy. Its independent
|
|
552
|
+
inference catches <code>None</code>-flow and narrowing bugs the current
|
|
553
|
+
mypy config lets slide, and it's the same engine most editors use — so
|
|
554
|
+
CI enforces what contributors already see. Two type checkers rarely
|
|
555
|
+
agree on <em>nothing</em>.</p>
|
|
556
|
+
<div class="meta">
|
|
557
|
+
<span class="m">Complexity <b>M</b></span>
|
|
558
|
+
<span class="m">Impact <b>Med</b></span>
|
|
559
|
+
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
560
|
+
<span class="m">editor-parity</span>
|
|
561
|
+
</div>
|
|
562
|
+
</article>
|
|
563
|
+
|
|
564
|
+
<article class="cap rcard">
|
|
565
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">Quality · Smell</span></div>
|
|
566
|
+
<h3>Widen the ruff rule surface — <code>B·SIM·C4·PERF·RUF</code></h3>
|
|
567
|
+
<p>Beyond the <code>S</code> security family (round 1), enable
|
|
568
|
+
flake8-bugbear (<code>B</code>), simplify (<code>SIM</code>),
|
|
569
|
+
comprehensions (<code>C4</code>), perflint (<code>PERF</code>) and
|
|
570
|
+
Ruff-native (<code>RUF</code>) rules — bug, readability and performance
|
|
571
|
+
smells caught at zero new-tool cost since ruff already runs in the lint
|
|
572
|
+
gate.</p>
|
|
573
|
+
<div class="meta">
|
|
574
|
+
<span class="m">Complexity <b>S</b></span>
|
|
575
|
+
<span class="m">Impact <b>Med</b></span>
|
|
576
|
+
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
577
|
+
<span class="m">0 new deps</span>
|
|
578
|
+
</div>
|
|
579
|
+
</article>
|
|
580
|
+
|
|
581
|
+
<article class="cap rcard">
|
|
582
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">Testing · Gap</span></div>
|
|
583
|
+
<h3>Patch-coverage gate — <code>diff-cover</code></h3>
|
|
584
|
+
<p>Enforce coverage on the <em>changed lines</em> of each PR — no external
|
|
585
|
+
service needed, it reads the same <code>coverage.xml</code> the suite
|
|
586
|
+
already emits. Pairs with the 80% project gate so new code can't quietly
|
|
587
|
+
ride in under-tested behind an already-high overall number.</p>
|
|
588
|
+
<div class="meta">
|
|
589
|
+
<span class="m">Complexity <b>S</b></span>
|
|
590
|
+
<span class="m">Impact <b>Med</b></span>
|
|
591
|
+
<span class="m">Wow <b class="wow">★★</b></span>
|
|
592
|
+
<span class="m">self-hosted</span>
|
|
593
|
+
</div>
|
|
594
|
+
</article>
|
|
595
|
+
|
|
596
|
+
</div>
|
|
597
|
+
</section>
|
|
598
|
+
|
|
459
599
|
<footer>
|
|
460
600
|
<p>Maintained by the boost quality loop · themed with
|
|
461
601
|
<a href="../style/boost.css">style/boost.css</a> ·
|
|
@@ -563,6 +563,14 @@ class TestTrending:
|
|
|
563
563
|
assert "jira-integration" in r.out
|
|
564
564
|
assert "brainstorming" not in r.out
|
|
565
565
|
|
|
566
|
+
def test_long_description_is_clipped(self, boost, tapped, monkeypatch):
|
|
567
|
+
# D23: description column must not dump raw — it clips to the width.
|
|
568
|
+
boost("install", "brainstorming")
|
|
569
|
+
monkeypatch.setenv("COLUMNS", "40")
|
|
570
|
+
r = boost("trending")
|
|
571
|
+
assert "brainstorming" in r.out
|
|
572
|
+
assert "…" in r.out
|
|
573
|
+
|
|
566
574
|
|
|
567
575
|
# ---------------------------------------------------------------- stats
|
|
568
576
|
|
|
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
|
|
File without changes
|
{boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/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
|
{boost_skill_cli-1.0.23 → boost_skill_cli-1.0.25}/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
|