9740bc64c9
Continuous Deployment / Deploy to Production (push) Blocked by required conditions
Continuous Deployment / Rollback Deployment (push) Blocked by required conditions
Continuous Deployment / Post-deployment Monitoring (push) Blocked by required conditions
Continuous Deployment / Notify Deployment Status (push) Blocked by required conditions
Firmware QEMU Tests (ADR-061) / QEMU Test (edge-tier1) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (full-adr060) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (tdm-3node) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / Swarm Test (ADR-062) (push) Has been skipped
npm packages / tools/ruview-mcp (node 22) (push) Failing after 1s
nvsim-server → ghcr.io / build-and-publish (push) Failing after 1s
ruview-swarm CI guard / tests (full+train) (push) Failing after 2s
Bench Regression Guard / bench compile-verify (--no-run) (push) Failing after 0s
Bench Regression Guard / bench fast-run (informational, non-gating) (push) Has been skipped
Firmware CI / Verify version.txt matches release tag (push) Has been skipped
Dashboard a11y + cross-browser / a11y (push) Failing after 0s
nvsim Dashboard → GitHub Pages / build-and-deploy (push) Failing after 2s
Firmware CI / Build firmware (esp32s3 / 4mb) (push) Failing after 15s
Firmware QEMU Tests (ADR-061) / Build Espressif QEMU (push) Failing after 1s
Firmware QEMU Tests (ADR-061) / Fuzz Testing (ADR-061 Layer 6) (push) Failing after 1s
Continuous Deployment / Pre-deployment Checks (push) Has been skipped
Continuous Deployment / Deploy to Staging (push) Waiting to run
Firmware CI / Build firmware (esp32c6 / c6-4mb) (push) Failing after 15s
Firmware CI / Build firmware (esp32s3 / 8mb) (push) Failing after 15s
Firmware QEMU Tests (ADR-061) / QEMU Test (boundary-max) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (boundary-min) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (default) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / QEMU Test (edge-tier0) (push) Has been skipped
Firmware QEMU Tests (ADR-061) / NVS Matrix Generation (push) Failing after 1s
Security Scanning / Security Policy Compliance (push) Failing after 0s
Security Scanning / Security Report (push) Waiting to run
Security Scanning / Dependency Vulnerability Scan (push) Failing after 0s
Security Scanning / Static Application Security Testing (push) Failing after 1s
Security Scanning / Infrastructure Security Scan (push) Failing after 1s
Security Scanning / Secret Scanning (push) Failing after 1s
npm packages / harness/ruview (node 22) (push) Failing after 17s
Security Scanning / License Compliance Scan (push) Failing after 1s
Security Scanning / Container Security Scan (push) Failing after 4s
three.js demos → GitHub Pages / build-and-deploy (push) Failing after 1s
Verify Pipeline Determinism / Verify Pipeline Determinism (3.11) (push) Failing after 1s
Fix-Marker Regression Guard / Verify fix markers (push) Failing after 1s
ADR-115 MQTT integration tests / mqtt-integration (push) Failing after 1s
npm packages / harness/ruview (node 20) (push) Failing after 1s
npm packages / tools/ruview-mcp (node 20) (push) Failing after 1s
npm packages / tools/ruview-cli (node 20) (push) Failing after 1s
npm packages / tools/ruview-cli (node 22) (push) Failing after 1s
BFLD MQTT Integration / cargo test --features mqtt (live mosquitto) (push) Failing after 29s
ruview-swarm CI guard / build train_marl bin (push) Failing after 2s
ruview-swarm CI guard / clippy (-D warnings, --no-deps) (push) Failing after 3s
ruview-swarm CI guard / tests (ruflo) (push) Failing after 1s
ruview-swarm CI guard / tests (train) (push) Failing after 2s
ruview-swarm CI guard / tests (default) (push) Failing after 2s
Point Cloud Viewer → GitHub Pages / build-and-deploy (push) Failing after 8s
ruview-swarm CI guard / ITAR / publish guard (push) Failing after 0s
wifi-densepose sensing-server → Docker Hub + ghcr.io / build · push · smoke-test (push) Failing after 1s
103 lines
5.1 KiB
Bash
103 lines
5.1 KiB
Bash
#!/usr/bin/env bash
|
|
# Structural smoke test for the `ruview` Claude Code plugin.
|
|
# Run from anywhere: bash plugins/ruview/scripts/smoke.sh
|
|
set -u
|
|
|
|
# Resolve plugin root (this file lives in <root>/scripts/smoke.sh).
|
|
# Plugin lives at <repo>/plugins/ruview ; marketplace manifest is at <repo>/.claude-plugin/marketplace.json
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
REPO="$(cd "$ROOT/../.." && pwd)"
|
|
MARKET="$REPO/.claude-plugin/marketplace.json"
|
|
|
|
PASS=0
|
|
FAIL=0
|
|
ok() { echo " PASS $1"; PASS=$((PASS+1)); }
|
|
bad() { echo " FAIL $1"; FAIL=$((FAIL+1)); }
|
|
has() { grep -q "$1" "$2" 2>/dev/null; }
|
|
|
|
echo "ruview plugin smoke test"
|
|
echo "root: $ROOT"
|
|
echo "repo: $REPO"
|
|
echo
|
|
|
|
# 1. repo-root marketplace.json exists, lists the ruview plugin, points source at ./plugins/ruview
|
|
if [ -f "$MARKET" ] && has '"ruview"' "$MARKET" && has '"\./plugins/ruview"' "$MARKET"; then ok "repo-root .claude-plugin/marketplace.json lists 'ruview' with source ./plugins/ruview"; else bad "marketplace.json missing / wrong location / wrong source ($MARKET)"; fi
|
|
|
|
# 2. plugin.json exists with required fields
|
|
PJ="$ROOT/.claude-plugin/plugin.json"
|
|
if [ -f "$PJ" ] && has '"name"' "$PJ" && has '"description"' "$PJ" && has '"version"' "$PJ"; then ok "plugin.json has name/description/version"; else bad "plugin.json missing or incomplete"; fi
|
|
|
|
# 3. plugin.json has keywords
|
|
if has '"keywords"' "$PJ"; then ok "plugin.json has keywords"; else bad "plugin.json missing keywords"; fi
|
|
|
|
# 4. plugin.json does NOT enumerate skills/commands/agents (auto-discovered)
|
|
if has '"skills"' "$PJ" || has '"commands"' "$PJ" || has '"agents"' "$PJ"; then bad "plugin.json must NOT contain skills/commands/agents arrays"; else ok "plugin.json does not enumerate skills/commands/agents"; fi
|
|
|
|
# 5. every skill has SKILL.md with name + description + allowed-tools, and no wildcard tools
|
|
SKILL_OK=1
|
|
for d in "$ROOT"/skills/*/; do
|
|
[ -d "$d" ] || continue
|
|
f="$d/SKILL.md"
|
|
if [ ! -f "$f" ]; then bad "missing $f"; SKILL_OK=0; continue; fi
|
|
has '^name:' "$f" || { bad "$f missing 'name:'"; SKILL_OK=0; }
|
|
has '^description:' "$f" || { bad "$f missing 'description:'"; SKILL_OK=0; }
|
|
has '^allowed-tools:' "$f" || { bad "$f missing 'allowed-tools:'"; SKILL_OK=0; }
|
|
if grep -E '^allowed-tools:.*(\*|\ball tools\b)' "$f" >/dev/null 2>&1; then bad "$f uses wildcard tools"; SKILL_OK=0; fi
|
|
done
|
|
[ "$SKILL_OK" = 1 ] && ok "all skills have valid frontmatter, no wildcard tools"
|
|
|
|
# 6. expected skills present
|
|
EXPECTED_SKILLS="ruview-quickstart ruview-hardware-setup ruview-configure ruview-applications ruview-model-training ruview-advanced-sensing ruview-cli-api ruview-mmwave ruview-verify"
|
|
SKILLS_PRESENT=1
|
|
for s in $EXPECTED_SKILLS; do
|
|
[ -f "$ROOT/skills/$s/SKILL.md" ] || { bad "expected skill missing: $s"; SKILLS_PRESENT=0; }
|
|
done
|
|
[ "$SKILLS_PRESENT" = 1 ] && ok "expected skill set present ($(echo $EXPECTED_SKILLS | wc -w) skills)"
|
|
|
|
# 7. every command has a description in frontmatter
|
|
CMD_OK=1
|
|
for f in "$ROOT"/commands/*.md; do
|
|
[ -f "$f" ] || { bad "no command files found"; CMD_OK=0; break; }
|
|
has '^description:' "$f" || { bad "$f missing 'description:'"; CMD_OK=0; }
|
|
done
|
|
[ "$CMD_OK" = 1 ] && ok "all commands have a description"
|
|
|
|
# 8. every agent has name + description + model
|
|
AG_OK=1
|
|
for f in "$ROOT"/agents/*.md; do
|
|
[ -f "$f" ] || { bad "no agent files found"; AG_OK=0; break; }
|
|
has '^name:' "$f" || { bad "$f missing 'name:'"; AG_OK=0; }
|
|
has '^description:' "$f" || { bad "$f missing 'description:'"; AG_OK=0; }
|
|
has '^model:' "$f" || { bad "$f missing 'model:'"; AG_OK=0; }
|
|
done
|
|
[ "$AG_OK" = 1 ] && ok "all agents have name/description/model"
|
|
|
|
# 9. README has Compatibility + Namespace coordination
|
|
RM="$ROOT/README.md"
|
|
if has '## Compatibility' "$RM" && has 'Namespace coordination' "$RM"; then ok "README has Compatibility + Namespace coordination"; else bad "README missing Compatibility or Namespace coordination section"; fi
|
|
|
|
# 10. ADR-0001 exists with Status: Proposed
|
|
ADR="$ROOT/docs/adrs/0001-ruview-plugin-contract.md"
|
|
if [ -f "$ADR" ] && grep -qi 'Status:.*Proposed' "$ADR"; then ok "ADR-0001 present with Status: Proposed"; else bad "ADR-0001 missing or not 'Proposed'"; fi
|
|
|
|
# 11. Codex mirror present
|
|
if [ -f "$ROOT/codex/AGENTS.md" ] && ls "$ROOT"/codex/prompts/*.md >/dev/null 2>&1; then ok "Codex mirror present (AGENTS.md + prompts/)"; else bad "Codex mirror missing"; fi
|
|
|
|
# 11b. command <-> Codex prompt parity
|
|
PARITY=1
|
|
for f in "$ROOT"/commands/*.md; do
|
|
[ -f "$f" ] || continue
|
|
base="$(basename "$f")"
|
|
[ -f "$ROOT/codex/prompts/$base" ] || { bad "no Codex prompt for command $base"; PARITY=0; }
|
|
done
|
|
[ "$PARITY" = 1 ] && ok "every command has a matching Codex prompt"
|
|
|
|
# 12. no skills/commands/agents accidentally placed inside .claude-plugin/
|
|
if ls "$ROOT"/.claude-plugin/skills "$ROOT"/.claude-plugin/commands "$ROOT"/.claude-plugin/agents >/dev/null 2>&1; then bad "skills/commands/agents must not live under .claude-plugin/"; else ok ".claude-plugin/ contains only plugin.json"; fi
|
|
|
|
echo
|
|
echo "----------------------------------------"
|
|
echo "PASS: $PASS FAIL: $FAIL"
|
|
[ "$FAIL" -eq 0 ] || exit 1
|