From 0738f1be6aef83e3d1cb08ef820f2fd3f81785d5 Mon Sep 17 00:00:00 2001 From: "Carlos D. Escobar-Valbuena" Date: Sun, 28 Jun 2026 20:43:36 -0500 Subject: [PATCH 1/3] fix(roster): point all companion-skills at broomva/skills + drift-guard (BRO-1584) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After the BRO-1570/1575 consolidation, bstack's roster drifted — 17 of 65 entries still pointed at dead standalone repos or listed consolidated/excluded/relocated skills. bstack is a roster + installer, not a skill-source bundler (its own header: "bstack does not bundle skill source, only the roster + installer wrapper"), so the fix is the roster, not a move. references/companion-skills.yaml (65 → 56 entries, all broomva/skills): - 9 standalone → broomva/skills: autonomous, cross-review, role-x, agentic-control-kernel, kg, prompt-library, p9, arcan-glass, finance-substrate. - removed 3 consolidated-into-agentic-control-kernel: control-metalayer-loop, agent-consciousness, knowledge-graph-memory. - removed 4 excluded products (symphony, symphony-forge, autoany, next-forge), the non-skill tool skills-showcase, and the relocated microgrid-agent. - renamed skills → skills-catalog. tests/roster-monorepo-sync.test.sh — drift-guard so it can't silently rot again: - every entry repo == broomva/skills (single-source invariant, offline) - names unique - (opt-in BSTACK_ROSTER_CHECK_REMOTE=1) every name resolves as a skill in broomva/skills — catches dangling entries (which is exactly how microgrid-agent and the skills→skills-catalog rename were found). references/skills-roster.md — install commands reconciled to the monorepo form; 3 consolidated skills annotated; canonical-source pointer to companion-skills.yaml. The bstack-native skills (p9, kg, …) stay in broomva/skills — confirmed the right call: contract (bstack, L3, deliberate) vs implementation (skills, fast iteration), install is flat-by-name regardless, and one monorepo gets one gate. Co-Authored-By: Claude Opus 4.8 (1M context) --- references/companion-skills.yaml | 86 ++++-------------------------- references/skills-roster.md | 18 ++++--- tests/roster-monorepo-sync.test.sh | 67 +++++++++++++++++++++++ 3 files changed, 87 insertions(+), 84 deletions(-) create mode 100755 tests/roster-monorepo-sync.test.sh diff --git a/references/companion-skills.yaml b/references/companion-skills.yaml index df77097..e927fdf 100644 --- a/references/companion-skills.yaml +++ b/references/companion-skills.yaml @@ -17,14 +17,14 @@ schema_version: 1 skills: # ── Foundation: orchestration + governance modes ──────────────────────── - name: autonomous - repo: broomva/autonomous + repo: broomva/skills category: orchestration required: true introduced_in: 0.1.0 description: "Canonical operating mode that fires the 20-reflex pipeline" - name: cross-review - repo: broomva/cross-review + repo: broomva/skills category: safety primitive: P20 required: true @@ -32,7 +32,7 @@ skills: description: "Cross-model adversarial review gate" - name: role-x - repo: broomva/role-x + repo: broomva/skills category: meta primitive: P17 required: true @@ -41,19 +41,12 @@ skills: # ── Control + knowledge stack ─────────────────────────────────────────── - name: agentic-control-kernel - repo: broomva/agentic-control-kernel + repo: broomva/skills category: meta required: true introduced_in: 0.1.0 description: "Unifying control-systems metalayer kernel" - - name: control-metalayer-loop - repo: broomva/control-metalayer-loop - category: meta - required: true - introduced_in: 0.1.0 - description: "Governance feedback loop" - - name: harness-engineering-playbook repo: broomva/skills skillPath: skills/harness-engineering-playbook/SKILL.md @@ -63,23 +56,8 @@ skills: min_bstack_version: 0.21.0 description: "Patterns for agent harness design — AGENTS.md, smoke/test/lint/typecheck harness, entropy-control checks (migrated 2026-05-25 from broomva/harness-engineering-skill — Phase 4c; renamed)" - - name: agent-consciousness - repo: broomva/agent-consciousness - category: knowledge - required: true - introduced_in: 0.1.0 - description: "Three-substrate persistence + episodic memory" - - - name: knowledge-graph-memory - repo: broomva/knowledge-graph-memory - category: knowledge - primitive: P6 - required: true - introduced_in: 0.1.0 - description: "Conversation logs → Obsidian-shaped knowledge graph" - - name: kg - repo: broomva/kg + repo: broomva/skills category: knowledge primitive: P6 required: true @@ -88,7 +66,7 @@ skills: description: "LLM-as-index loader for research/entities/. Two-tier scoring (catalog tier-1, body-grep tier-2 fallback) routes a topic to top-N entity bodies the agent reasons over. Pairs with bookkeeping's cmd_index (catalog generator) and the workspace's knowledge-catalog-refresh-hook.sh Stop hook (P6)." - name: prompt-library - repo: broomva/prompt-library + repo: broomva/skills category: meta required: true introduced_in: 0.1.0 @@ -96,34 +74,13 @@ skills: # ── Productive-wait + orchestration ───────────────────────────────────── - name: p9 - repo: broomva/p9 + repo: broomva/skills category: lifecycle primitive: P9 required: true introduced_in: 0.1.0 description: "CI watcher + productive-wait" - - name: symphony - repo: broomva/symphony - category: orchestration - required: true - introduced_in: 0.1.0 - description: "Orchestration daemon" - - - name: symphony-forge - repo: broomva/symphony-forge - category: orchestration - required: true - introduced_in: 0.1.0 - description: "Project scaffolding with control metalayer" - - - name: autoany - repo: broomva/autoany - category: meta - required: true - introduced_in: 0.1.0 - description: "EGRI L2 meta-controller (self-improvement)" - - name: alkosto-wait-optimizer repo: broomva/skills skillPath: skills/alkosto-wait-optimizer/SKILL.md @@ -191,15 +148,6 @@ skills: min_bstack_version: 0.21.0 description: "Deep-ocean genomics research — eDNA, AlphaFold, ESMFold, Evo 2, marine biodiversity, agentic bioinformatics" - - name: microgrid-agent - repo: broomva/skills - skillPath: skills/microgrid-agent/SKILL.md - category: platform - required: false - introduced_in: 0.21.4 - min_bstack_version: 0.21.0 - description: "Edge AI agent for autonomous renewable energy microgrid management on Raspberry Pi" - # Compute & remote infrastructure - name: colab-remote repo: broomva/skills @@ -343,35 +291,21 @@ skills: description: "In-silico neuroscience experiments using Meta's TRIBE v2 — predict fMRI cortical responses to video, audio & text without brain scanners" # ── Discovery + skill management ──────────────────────────────────────── - - name: skills + - name: skills-catalog repo: broomva/skills category: meta required: true introduced_in: 0.1.0 description: "Canonical reference of all available skills" - - name: skills-showcase - repo: broomva/skills-showcase - category: meta - required: false - introduced_in: 0.1.0 - description: "Skill catalog presentation + Remotion showcase" - # ── Design + frontend ─────────────────────────────────────────────────── - name: arcan-glass - repo: broomva/arcan-glass + repo: broomva/skills category: design required: false introduced_in: 0.1.0 description: "Broomva trademark web styling system" - - name: next-forge - repo: broomva/next-forge - category: platform - required: false - introduced_in: 0.1.0 - description: "Next.js project scaffolding" - - name: brand-icons repo: broomva/skills skillPath: skills/brand-icons/SKILL.md @@ -566,7 +500,7 @@ skills: # ── Platform + finance ────────────────────────────────────────────────── - name: finance-substrate - repo: broomva/finance-substrate + repo: broomva/skills category: platform required: false introduced_in: 0.1.0 diff --git a/references/skills-roster.md b/references/skills-roster.md index 7213617..76d508b 100644 --- a/references/skills-roster.md +++ b/references/skills-roster.md @@ -2,6 +2,8 @@ 28 curated skills across 7 layers. The Broomva Stack. +> **Canonical machine roster:** [`references/companion-skills.yaml`](companion-skills.yaml) (validated by `tests/roster-monorepo-sync.test.sh`). Every installable bstack-native skill lives in the **broomva/skills** monorepo — install path-independently with `npx skills add broomva/skills --skill `. This doc is the human-readable view; if the two disagree, the YAML wins. + ## Publishing standard (skill layout) — required for installability A skill is a **folder**, per the [Agent Skills standard](https://agentskills.io) — `SKILL.md` + optional `scripts/` / `references/` / `assets/`. **Publish every multi-file skill in a `skills//` subdirectory of its repo — never as a bare top-level `SKILL.md` at the repo root.** @@ -19,18 +21,18 @@ A skill is a **folder**, per the [Agent Skills standard](https://agentskills.io) | # | Skill | Install | Description | |---|-------|---------|-------------| -| 1 | `agentic-control-kernel` | `npx skills add broomva/agentic-control-kernel` | LLM-as-controller with safety shields, typed plant/action/trace schemas, multi-rate loop hierarchy. The governance backbone. | -| 2 | `control-metalayer-loop` | `npx skills add broomva/control-metalayer` | Control primitives: setpoints, sensors, actuators, stability gates, policy profiles. Bootstraps `.control/policy.yaml`. | +| 1 | `agentic-control-kernel` | `npx skills add broomva/skills --skill agentic-control-kernel` | LLM-as-controller with safety shields, typed plant/action/trace schemas, multi-rate loop hierarchy. The governance backbone. | +| 2 | `control-metalayer-loop` | *(consolidated → `agentic-control-kernel`)* | Control primitives: setpoints, sensors, actuators, stability gates, policy profiles. Bootstraps `.control/policy.yaml`. | | 3 | `harness-engineering-playbook` | `npx skills add broomva/skills --skill harness-engineering-playbook` | Agent-first workflow: AGENTS.md, smoke/test/lint/typecheck harness, entropy-control checks. (Migrated 2026-05-25 from `broomva/harness-engineering-skill` — Phase 4c.) | ## Memory & Consciousness | # | Skill | Install | Description | |---|-------|---------|-------------| -| 4 | `agent-consciousness` | `npx skills add broomva/control-metalayer` | Three-substrate persistence: governance + knowledge graph + episodic memory. Progressive crystallization pathway. | -| 5 | `knowledge-graph-memory` | `npx skills add broomva/control-metalayer` | Conversation logs to Obsidian knowledge graph bridge. Generates per-session docs with frontmatter and wikilinks. | -| 6 | `kg` | `npx skills add broomva/kg` | LLM-as-index loader for `research/entities/`. Two-tier scoring (catalog tier-1, body-grep tier-2 fallback) routes a topic to top-N entity bodies the agent reasons over. The runtime form of "the LLM **is** the index" — substrate canonical, one projection (catalog) routes, agent IS the query engine. Pairs with bookkeeping's `cmd_index` and the workspace's `knowledge-catalog-refresh-hook.sh` Stop hook (P6). | -| 7 | `prompt-library` | `npx skills add broomva/prompt-library` | Shared knowledge surface across agents. Versioned prompts + an evaluation engine: every pull/completion writes a typed `prompt_invocation` row with source attribution (`web\|cli\|skill\|api`), latency, tokens, cost, and feedback. The `broomva` Rust CLI (`broomva prompts pull/list/complete/feedback`) is the runtime; the broomva-cli skill carries the auto-tracing mandate. See [prompts-integration.md](prompts-integration.md). | +| 4 | `agent-consciousness` | *(consolidated → `agentic-control-kernel`)* | Three-substrate persistence: governance + knowledge graph + episodic memory. Progressive crystallization pathway. | +| 5 | `knowledge-graph-memory` | *(consolidated → `agentic-control-kernel`)* | Conversation logs to Obsidian knowledge graph bridge. Generates per-session docs with frontmatter and wikilinks. | +| 6 | `kg` | `npx skills add broomva/skills --skill kg` | LLM-as-index loader for `research/entities/`. Two-tier scoring (catalog tier-1, body-grep tier-2 fallback) routes a topic to top-N entity bodies the agent reasons over. The runtime form of "the LLM **is** the index" — substrate canonical, one projection (catalog) routes, agent IS the query engine. Pairs with bookkeeping's `cmd_index` and the workspace's `knowledge-catalog-refresh-hook.sh` Stop hook (P6). | +| 7 | `prompt-library` | `npx skills add broomva/skills --skill prompt-library` | Shared knowledge surface across agents. Versioned prompts + an evaluation engine: every pull/completion writes a typed `prompt_invocation` row with source attribution (`web\|cli\|skill\|api`), latency, tokens, cost, and feedback. The `broomva` Rust CLI (`broomva prompts pull/list/complete/feedback`) is the runtime; the broomva-cli skill carries the auto-tracing mandate. See [prompts-integration.md](prompts-integration.md). | ## Orchestration @@ -53,7 +55,7 @@ A skill is a **folder**, per the [Agent Skills standard](https://agentskills.io) | # | Skill | Install | Description | |---|-------|---------|-------------| -| 14 | `arcan-glass` | `npx skills add broomva/arcan-glass` | BroomVA web design system. Glass/frosted effects, dark-first themes, AI Blue brand tokens. | +| 14 | `arcan-glass` | `npx skills add broomva/skills --skill arcan-glass` | BroomVA web design system. Glass/frosted effects, dark-first themes, AI Blue brand tokens. | | 15 | `next-forge` | `npx skills add broomva/symphony-forge` | Production Next.js SaaS template via symphony-forge. Turborepo, auth, payments, observability. | ## Platform @@ -67,7 +69,7 @@ A skill is a **folder**, per the [Agent Skills standard](https://agentskills.io) | 17c | `ltx-video` | `npx skills add broomva/skills --skill ltx-video` | LTX-2.3 video generation — setup, inference, prompting, ComfyUI integration for Lightricks 22B DiT audio-video model. (Migrated 2026-05-25 from `broomva/ltx-video` — Phase 4b.) | | 17d | `creative-review` | `npx skills add broomva/skills --skill creative-review` | Meta creative review — style adherence scoring, feedback loops, self-improving creative pipeline. (Migrated 2026-05-25 from `broomva/creative-review` — Phase 4b.) | | 17e | `brainrot-for-good` | `npx skills add broomva/skills --skill brainrot-for-good` | High-retention video production using dopamine-aware editing for genuinely valuable content. (Migrated 2026-05-25 from `broomva/brainrot-for-good` — Phase 4b.) | -| 18 | `finance-substrate` | `npx skills add broomva/finance-substrate` | Personal finance & Colombian tax management. Bank CSV import, TRM rates, DIAN tax projection, withholdings, e-invoicing. Zero paid deps. *(Pending Tier-1 vs Tier-2 lock-in.)* | +| 18 | `finance-substrate` | `npx skills add broomva/skills --skill finance-substrate` | Personal finance & Colombian tax management. Bank CSV import, TRM rates, DIAN tax projection, withholdings, e-invoicing. Zero paid deps. *(Pending Tier-1 vs Tier-2 lock-in.)* | | 18a | `investment-management` | `npx skills add broomva/skills --skill investment-management` | Portfolio construction, factor models, backtesting, multi-platform execution (Alpaca, Coinbase, Polymarket). (Migrated 2026-05-25 from `broomva/investment-management` — Phase 4c.) | | 18b | `wealth-management` | `npx skills add broomva/skills --skill wealth-management` | Wealth planning + Monte Carlo simulations + tax-optimized allocation + net worth forecasting. (Migrated 2026-05-25 from `broomva/wealth-management` — Phase 4c.) | | 18c | `haima` | `npx skills add broomva/skills --skill haima` | Agent guide for x402 machine-to-machine payments, secp256k1 wallets, per-task billing, on-chain USDC settlement. (Migrated 2026-05-25 from `broomva/haima-skill` — Phase 4c; renamed to drop `-skill` suffix. Runtime crate stays at `broomva/haima`.) | diff --git a/tests/roster-monorepo-sync.test.sh b/tests/roster-monorepo-sync.test.sh new file mode 100755 index 0000000..623224c --- /dev/null +++ b/tests/roster-monorepo-sync.test.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +# roster-monorepo-sync.test.sh — drift-guard for the companion-skills roster. +# +# After the BRO-1570/1575 consolidation, every bstack-native skill lives in the +# broomva/skills monorepo (bstack is roster + installer, not a skill-source +# bundler). This test keeps the roster from drifting back: +# 1. every entry points at broomva/skills (single-source invariant) +# 2. roster names are unique +# 3. (opt-in, BSTACK_ROSTER_CHECK_REMOTE=1) every name actually resolves as a +# skill in broomva/skills — catches dangling entries (e.g. a skill that was +# relocated out, like microgrid-agent, or renamed, like skills→skills-catalog). +# +# Offline by default (1+2 are deterministic, no network). Run from anywhere. +set -uo pipefail + +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ROSTER="${BSTACK_SKILLS_YAML:-$HERE/references/companion-skills.yaml}" + +PASS=0; FAIL=0; FAILED=() +ok() { PASS=$((PASS + 1)); echo " [pass] $1"; } +fail() { FAIL=$((FAIL + 1)); FAILED+=("$1"); echo " [FAIL] $1"; } + +[ -f "$ROSTER" ] || { echo "no roster at $ROSTER"; exit 2; } + +# 1 — every entry repo == broomva/skills +BAD="$(python3 -c " +import yaml +d = yaml.safe_load(open('$ROSTER')) +print(' '.join(s['name'] for s in d['skills'] if s.get('repo') != 'broomva/skills')) +")" +if [ -z "$BAD" ]; then + ok "all $(python3 -c "import yaml;print(len(yaml.safe_load(open('$ROSTER'))['skills']))") entries point at broomva/skills" +else + fail "entries not pointing at broomva/skills: $BAD" +fi + +# 2 — names unique +DUP="$(python3 -c " +import yaml, collections +c = collections.Counter(s['name'] for s in yaml.safe_load(open('$ROSTER'))['skills']) +print(' '.join(n for n, k in c.items() if k > 1)) +")" +if [ -z "$DUP" ]; then ok "roster names unique"; else fail "duplicate roster names: $DUP"; fi + +# 3 — (opt-in, networked) every name resolves in broomva/skills +if [ "${BSTACK_ROSTER_CHECK_REMOTE:-0}" = "1" ] && command -v gh >/dev/null 2>&1; then + TREE="$(gh api 'repos/broomva/skills/git/trees/main?recursive=1' --jq '.tree[].path' 2>/dev/null \ + | grep -oE 'skills/[^/]+/[^/]+/SKILL.md' | sed -E 's#skills/[^/]+/([^/]+)/SKILL.md#\1#' | sort -u)" + if [ -n "$TREE" ]; then + MISSING="" + for n in $(python3 -c "import yaml;print(' '.join(s['name'] for s in yaml.safe_load(open('$ROSTER'))['skills']))"); do + grep -qxF "$n" <<<"$TREE" || MISSING="$MISSING $n" + done + if [ -z "$MISSING" ]; then ok "every roster name resolves in broomva/skills"; else fail "roster names not found in broomva/skills:$MISSING"; fi + else + echo " [skip] remote check: could not list broomva/skills tree" + fi +else + echo " [skip] remote resolution check (set BSTACK_ROSTER_CHECK_REMOTE=1 + gh to enable)" +fi + +echo "" +echo "roster-monorepo-sync: $PASS passed, $FAIL failed" +if [ "$FAIL" -ne 0 ]; then + printf ' - %s\n' "${FAILED[@]}" + exit 1 +fi From cc2a295f12cf43d68b1321e60180782146b9054a Mon Sep 17 00:00:00 2001 From: "Carlos D. Escobar-Valbuena" Date: Sun, 28 Jun 2026 20:54:37 -0500 Subject: [PATCH 2/3] fix(roster-guard): close fail-open + finish doc reconcile + run remote check in CI (P20) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P20 Strata-B (6/10, CHANGES_NEEDED) on PR #81: - Drift-guard FAILED OPEN on a corrupt/empty roster (python tracebacks went to stderr; $(...) captured empty stdout → read as 'clean'). Added a preflight that asserts the roster parses + is non-empty; verified it now FAILs on both empty 'skills: []' and unparseable YAML. - Remote resolution check (every roster name resolves in broomva/skills) was opt-in and never ran in CI. Now default-on when gh is available+authed (skips gracefully otherwise; =1 requires it, =0 disables); added GH_TOKEN to the CI tests job so it runs on PRs. - skills-roster.md was half-reconciled: repointed the stale alkosto-wait-optimizer standalone install to the monorepo form; annotated the removed products (symphony/symphony-forge/autoany/next-forge) and skills-showcase as not-installable. Curation itself was verified correct by the review (all 9 removals genuine, agentic-control-kernel retained, 56 survivors all resolve). Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 6 ++++++ references/skills-roster.md | 12 ++++++------ tests/roster-monorepo-sync.test.sh | 27 ++++++++++++++++++++++++--- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d17e0d2..c47c4d8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,6 +83,12 @@ jobs: run: python3 -m pip install --quiet PyYAML - name: Run all tests/*.test.sh + env: + # Lets roster-monorepo-sync.test.sh run its remote resolution check + # (every roster name resolves in broomva/skills). Skips gracefully if the + # tree can't be fetched (rate-limit / private); the offline structural + # checks always run regardless. + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # As of v0.8.0 (Phase 5 of substrate completion) the pre-existing # tests/template_lockstep.test.sh and tests/onboard.test.sh are # fixed (case-insensitive lockstep assertion + BSTACK_SKIP_SKILLS=1 diff --git a/references/skills-roster.md b/references/skills-roster.md index 76d508b..a03a64f 100644 --- a/references/skills-roster.md +++ b/references/skills-roster.md @@ -38,9 +38,9 @@ A skill is a **folder**, per the [Agent Skills standard](https://agentskills.io) | # | Skill | Install | Description | |---|-------|---------|-------------| -| 8 | `symphony` | `npx skills add broomva/symphony` | Rust orchestration engine for coding agents. Daemon mode, Linear/GitHub tracker integration, lifecycle hooks. | -| 9 | `symphony-forge` | `npx skills add broomva/symphony-forge` | CLI scaffolder with composable control metalayer. Bootstraps projects with agent governance built in. | -| 10 | `autoany` | `npx skills add broomva/autoany` | EGRI self-improvement framework. Turns ambiguous goals into safe, measurable, rollback-capable recursive improvement loops. | +| 8 | `symphony` | *(ecosystem product — not a portable skill in the monorepo; lives at `broomva/symphony`)* | Rust orchestration engine for coding agents. Daemon mode, Linear/GitHub tracker integration, lifecycle hooks. | +| 9 | `symphony-forge` | *(ecosystem product — not a portable skill in the monorepo; lives at `broomva/symphony-forge`)* | CLI scaffolder with composable control metalayer. Bootstraps projects with agent governance built in. | +| 10 | `autoany` | *(ecosystem product — not a portable skill in the monorepo; lives at `broomva/autoany`)* | EGRI self-improvement framework. Turns ambiguous goals into safe, measurable, rollback-capable recursive improvement loops. | ## Research & Intelligence @@ -49,20 +49,20 @@ A skill is a **folder**, per the [Agent Skills standard](https://agentskills.io) | 11 | `deep-dive-research-orchestrator` | `npx skills add broomva/skills --skill deep-dive-research-orchestrator` | Multi-dimensional research with coordinated AI specialists. 10+ source synthesis with citations. (Migrated 2026-05-25 from `broomva/deep-dive-research-skill` — Phase 4c.) | | 11a | `social-intelligence` | `npx skills add broomva/skills --skill social-intelligence` | Autonomous social engagement + knowledge extraction loop for Moltbook and X — compounds with `blog-post` and `content-creation`. (Migrated 2026-05-25 from `broomva/social-intelligence` — Phase 4c.) | | 12 | `skills` | `npx skills add broomva/skills` | Canonical reference inventory of 83 agent skills across 15 domains. Browsable catalog. | -| 13 | `skills-showcase` | `npx skills add broomva/skills` | Remotion video + X thread generator for the skills inventory. Animated showcase content. | +| 13 | `skills-showcase` | *(repo-root Remotion tool in broomva/skills — not an installable skill)* | Remotion video + X thread generator for the skills inventory. Animated showcase content. | ## Design & Implementation | # | Skill | Install | Description | |---|-------|---------|-------------| | 14 | `arcan-glass` | `npx skills add broomva/skills --skill arcan-glass` | BroomVA web design system. Glass/frosted effects, dark-first themes, AI Blue brand tokens. | -| 15 | `next-forge` | `npx skills add broomva/symphony-forge` | Production Next.js SaaS template via symphony-forge. Turborepo, auth, payments, observability. | +| 15 | `next-forge` | *(ecosystem product — not a portable skill in the monorepo; lives at `broomva/symphony-forge`)* | Production Next.js SaaS template via symphony-forge. Turborepo, auth, payments, observability. | ## Platform | # | Skill | Install | Description | |---|-------|---------|-------------| -| 16 | `alkosto-wait-optimizer` | `npx skills add broomva/alkosto-wait-optimizer-skill` | Probability-based decision tool for optimal waiting times. Bayesian estimation with uncertainty. | +| 16 | `alkosto-wait-optimizer` | `npx skills add broomva/skills --skill alkosto-wait-optimizer` | Probability-based decision tool for optimal waiting times. Bayesian estimation with uncertainty. | | 17 | `content-creation` | `npx skills add broomva/skills --skill content-creation` | Full-stack content pipeline — research → narrative → visual assets → video → social → deploy; ships bstack-launch + open-source-stack example campaigns. (Migrated 2026-05-25 from `broomva/content-creation` — Phase 4b.) | | 17a | `content-engine` | `npx skills add broomva/skills --skill content-engine` | Full-stack AI content studio — visual DNA compiler, cinematic generation, browser autopilot, content loop; bundles 4 sub-skills. (Migrated 2026-05-25 from `broomva/content-engine` — Phase 4b.) | | 17b | `launch-video` | `npx skills add broomva/skills --skill launch-video` | Liquid Glass product launch video — dark void, 3D floating panels, spring animations via Remotion. (Migrated 2026-05-25 from `broomva/launch-video` — Phase 4b.) | diff --git a/tests/roster-monorepo-sync.test.sh b/tests/roster-monorepo-sync.test.sh index 623224c..bf5c100 100755 --- a/tests/roster-monorepo-sync.test.sh +++ b/tests/roster-monorepo-sync.test.sh @@ -22,6 +22,19 @@ fail() { FAIL=$((FAIL + 1)); FAILED+=("$1"); echo " [FAIL] $1"; } [ -f "$ROSTER" ] || { echo "no roster at $ROSTER"; exit 2; } +# Preflight — the roster must PARSE and be non-empty. Without this, a corrupt or +# empty roster makes the $(python …) captures below come back empty (the traceback +# goes to stderr) and checks 1–2 would pass *open* — a drift-guard green-lighting a +# broken roster. Fail hard here instead. +python3 -c " +import yaml, sys +try: + d = yaml.safe_load(open('$ROSTER')) +except Exception as e: + sys.exit('roster does not parse: ' + str(e)) +sys.exit(0 if isinstance(d, dict) and d.get('skills') else 'roster is empty / has no skills') +" || { echo " [FAIL] roster preflight (must parse + be non-empty)"; echo ""; echo "roster-monorepo-sync: 0 passed, 1 failed"; exit 1; } + # 1 — every entry repo == broomva/skills BAD="$(python3 -c " import yaml @@ -42,8 +55,12 @@ print(' '.join(n for n, k in c.items() if k > 1)) ")" if [ -z "$DUP" ]; then ok "roster names unique"; else fail "duplicate roster names: $DUP"; fi -# 3 — (opt-in, networked) every name resolves in broomva/skills -if [ "${BSTACK_ROSTER_CHECK_REMOTE:-0}" = "1" ] && command -v gh >/dev/null 2>&1; then +# 3 — every name resolves in broomva/skills (catches a dangling entry — a name with +# no monorepo skill behind it, e.g. a relocated/renamed skill). Default: run when gh +# is available + authed (covers local dev AND CI with a token); skip gracefully if +# not. BSTACK_ROSTER_CHECK_REMOTE=1 *requires* it (fail if gh can't run); =0 disables. +REMOTE="${BSTACK_ROSTER_CHECK_REMOTE:-auto}" +if [ "$REMOTE" != "0" ] && command -v gh >/dev/null 2>&1 && gh auth status >/dev/null 2>&1; then TREE="$(gh api 'repos/broomva/skills/git/trees/main?recursive=1' --jq '.tree[].path' 2>/dev/null \ | grep -oE 'skills/[^/]+/[^/]+/SKILL.md' | sed -E 's#skills/[^/]+/([^/]+)/SKILL.md#\1#' | sort -u)" if [ -n "$TREE" ]; then @@ -52,11 +69,15 @@ if [ "${BSTACK_ROSTER_CHECK_REMOTE:-0}" = "1" ] && command -v gh >/dev/null 2>&1 grep -qxF "$n" <<<"$TREE" || MISSING="$MISSING $n" done if [ -z "$MISSING" ]; then ok "every roster name resolves in broomva/skills"; else fail "roster names not found in broomva/skills:$MISSING"; fi + elif [ "$REMOTE" = "1" ]; then + fail "remote check required but could not list the broomva/skills tree" else echo " [skip] remote check: could not list broomva/skills tree" fi +elif [ "$REMOTE" = "1" ]; then + fail "remote check required (BSTACK_ROSTER_CHECK_REMOTE=1) but gh is unavailable/unauthed" else - echo " [skip] remote resolution check (set BSTACK_ROSTER_CHECK_REMOTE=1 + gh to enable)" + echo " [skip] remote resolution check (gh unavailable/unauthed; set BSTACK_ROSTER_CHECK_REMOTE=1 to require)" fi echo "" From d73ac8fbf7f5ce2b9200a297d0cafdfc4f680b2e Mon Sep 17 00:00:00 2001 From: "Carlos D. Escobar-Valbuena" Date: Sun, 28 Jun 2026 20:58:49 -0500 Subject: [PATCH 3/3] fix(installer): install monorepo entries with --skill (CodeRabbit, PR #81) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CodeRabbit caught a real regression: repointing every roster entry to repo: broomva/skills meant bin/bstack-skills would run a bare 'npx skills add broomva/skills' per entry — pulling the ENTIRE monorepo each time, not the single skill. Fix: when repo == broomva/skills, install with --skill ; standalone repos still install whole. Verified via a mocked npx: all 56 entries now invoke 'broomva/skills --skill '. Also: - tests/skills-install-uses-skill-flag.test.sh — guards the installer contract (mocks npx, asserts every broomva/skills install carries --skill). - skills-roster.md banner reworded: it's a broader human catalog (also documents ecosystem products), not a strict mirror of the YAML; the YAML is authoritative for what's installable. Co-Authored-By: Claude Opus 4.8 (1M context) --- bin/bstack-skills | 10 +++++- references/skills-roster.md | 2 +- tests/skills-install-uses-skill-flag.test.sh | 37 ++++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) create mode 100755 tests/skills-install-uses-skill-flag.test.sh diff --git a/bin/bstack-skills b/bin/bstack-skills index 24bfd6c..2b8c087 100755 --- a/bin/bstack-skills +++ b/bin/bstack-skills @@ -249,8 +249,16 @@ cmd_install() { fi fi echo " [install] $n ($r)..." + # broomva/skills is the monorepo (many skills) — install the single skill + # with --skill , else a bare `add broomva/skills` pulls everything. + # Standalone repos install whole. + if [ "$r" = "broomva/skills" ]; then + add_args=("$r" --skill "$n") + else + add_args=("$r") + fi # shellcheck disable=SC2086 - if $NPX_CMD "$r" >/dev/null 2>&1; then + if $NPX_CMD "${add_args[@]}" >/dev/null 2>&1; then installed=$((installed + 1)) echo " ✓ installed" else diff --git a/references/skills-roster.md b/references/skills-roster.md index a03a64f..5cf71c5 100644 --- a/references/skills-roster.md +++ b/references/skills-roster.md @@ -2,7 +2,7 @@ 28 curated skills across 7 layers. The Broomva Stack. -> **Canonical machine roster:** [`references/companion-skills.yaml`](companion-skills.yaml) (validated by `tests/roster-monorepo-sync.test.sh`). Every installable bstack-native skill lives in the **broomva/skills** monorepo — install path-independently with `npx skills add broomva/skills --skill `. This doc is the human-readable view; if the two disagree, the YAML wins. +> **Canonical *installable* roster:** [`references/companion-skills.yaml`](companion-skills.yaml) — the 56 bstack-native skills, all in the **broomva/skills** monorepo (validated by `tests/roster-monorepo-sync.test.sh`). Install path-independently: `npx skills add broomva/skills --skill `. **This doc is a broader human catalog**: it also documents ecosystem *products* (e.g. symphony, autoany, next-forge) that are not installable bstack skills, so it intentionally lists more than the YAML. For what is installable, the YAML is authoritative. ## Publishing standard (skill layout) — required for installability diff --git a/tests/skills-install-uses-skill-flag.test.sh b/tests/skills-install-uses-skill-flag.test.sh new file mode 100755 index 0000000..63e03de --- /dev/null +++ b/tests/skills-install-uses-skill-flag.test.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# skills-install-uses-skill-flag.test.sh — installer contract guard. +# Every roster entry now points at the broomva/skills monorepo (BRO-1584). The +# installer MUST therefore install each with `--skill ` — a bare +# `npx skills add broomva/skills` would pull the entire monorepo. This test mocks +# the npx invocation and asserts every install carries --skill . +set -uo pipefail +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +PASS=0; FAIL=0 +ok() { PASS=$((PASS + 1)); echo " [pass] $1"; } +fail() { FAIL=$((FAIL + 1)); echo " [FAIL] $1"; } + +LOG="$(mktemp)"; MOCK="$(mktemp)" +cat > "$MOCK" <<'M' +#!/usr/bin/env bash +echo "$@" >> "$NPX_LOG" +M +chmod +x "$MOCK" + +NPX_LOG="$LOG" BSTACK_DIR="$HERE" BSTACK_NPX_CMD="$MOCK" \ + "$HERE/bin/bstack-skills" install --all >/dev/null 2>&1 || true + +TOTAL="$(wc -l < "$LOG" | tr -d ' ')" +if [ "$TOTAL" -gt 0 ]; then ok "installer attempted $TOTAL skills"; else fail "installer made no invocations"; fi + +# every invocation that targets broomva/skills must carry --skill +BARE="$(grep -E '(^| )broomva/skills( |$)' "$LOG" | grep -vc -- '--skill' || true)" +if [ "${BARE:-0}" -eq 0 ]; then + ok "every broomva/skills install carries --skill (no wholesale-monorepo install)" +else + fail "$BARE install(s) hit broomva/skills without --skill:"; grep -E '(^| )broomva/skills( |$)' "$LOG" | grep -v -- '--skill' | head +fi + +rm -f "$LOG" "$MOCK" +echo "" +echo "skills-install-uses-skill-flag: $PASS passed, $FAIL failed" +[ "$FAIL" -eq 0 ]