Files
ruvnet--ruview/plugins/ruview/docs/adrs/0001-ruview-plugin-contract.md
wehub-resource-sync 9740bc64c9
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
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 / 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
Continuous Deployment / Deploy to Production (push) Has been cancelled
Continuous Deployment / Rollback Deployment (push) Has been cancelled
Continuous Deployment / Post-deployment Monitoring (push) Has been cancelled
Continuous Deployment / Notify Deployment Status (push) Has been cancelled
Continuous Deployment / Deploy to Staging (push) Has been cancelled
Security Scanning / Security Report (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 11:59:54 +08:00

6.3 KiB

ADR-0001 — ruview plugin contract

  • Status: Proposed
  • Date: 2026-05-11
  • Scope: plugins/ruview (and the repo-root .claude-plugin/marketplace.json that lists it)

Context

RuView (WiFi-DensePose) is a large dual-codebase project (Rust v2/, Python archive/v1/, ESP32 firmware, 96 ADRs). Newcomers and operators repeatedly re-derive the same workflows: spin up the Docker demo, flash and provision an ESP32, run a sensing application, train a pose model, run the witness verification. We want those workflows packaged as a single discoverable Claude Code plugin (and mirrored for Codex), spanning practical → advanced.

Decision

  1. One mega-plugin, marketplace-listed from the repo root. A single plugin ruview under plugins/ruview/, listed by .claude-plugin/marketplace.json at the repo root (marketplace name ruview, plugin source: "./plugins/ruview"). The manifest sits at the repo root so claude plugin marketplace add ruvnet/RuView (and /plugin marketplace add ruvnet/RuView in Claude Code) resolve it — Claude Code looks for .claude-plugin/marketplace.json at the cloned repo's root, not in subdirectories. No sub-plugins; the breadth is organized by skill instead.

  2. Directory contract.

    .claude-plugin/marketplace.json                  # REPO ROOT — marketplace name `ruview`, plugin source ./plugins/ruview
    plugins/ruview/.claude-plugin/plugin.json        # name, description, version, author, homepage, license, keywords — NO skills/commands/agents arrays
    plugins/ruview/skills/<name>/SKILL.md            # frontmatter: name, description, allowed-tools
    plugins/ruview/commands/<name>.md                # frontmatter: description (+ argument-hint)
    plugins/ruview/agents/<name>.md                  # frontmatter: name, description, model
    plugins/ruview/docs/adrs/0001-ruview-plugin-contract.md
    plugins/ruview/scripts/smoke.sh                  # structural contract
    plugins/ruview/codex/AGENTS.md + codex/README.md + codex/prompts/*.md   # Codex mirror
    plugins/ruview/README.md                         # Compatibility + Namespace coordination + Verification + ADR sections
    

    Skills/commands/agents are auto-discovered from the directory tree — they are deliberately not enumerated in plugin.json.

  3. Shell-first skills. Skills drive RuView's own tooling — cargo, python, idf.py (via the Windows Python-subprocess pattern in CLAUDE.local.md), docker, node scripts. allowed-tools is limited to core tools (Bash Read Write Edit Glob Grep); no mcp__claude-flow__* dependency and no wildcard tools. The only external CLI referenced is npx @claude-flow/cli@latest security scan, and only as an optional step for security changes.

  4. Namespace. The plugin claims the ruview-* namespace for skills (ruview-quickstart, ruview-hardware-setup, ruview-configure, ruview-applications, ruview-model-training, ruview-advanced-sensing, ruview-cli-api, ruview-mmwave, ruview-verify), commands (/ruview-*), and agents (ruview-*). It writes to no claude-flow memory namespace. Coexists with the ruflo marketplace with zero overlap (ruview-* vs. ruflo-*); if both are present, defer to ruflo-agentdb ADR-0001 §"Namespace convention".

  5. Codex mirror — full command parity. Every /ruview-* command (ruview-start, ruview-flash, ruview-provision, ruview-app, ruview-train, ruview-advanced, ruview-verify) has a matching codex/prompts/<name>.md; codex/AGENTS.md carries the project rules and codex/README.md documents installation. The mirror covers the operator-facing commands in full; the additional skills (ruview-quickstart, ruview-hardware-setup, ruview-configure, ruview-applications, ruview-model-training, ruview-advanced-sensing, ruview-cli-api, ruview-mmwave, ruview-verify) and agents have no Codex equivalent — their knowledge is folded into AGENTS.md and the prompt files. The smoke script enforces command↔prompt parity.

  6. Compatibility surface. Targets the ruvnet/RuView / wifi-densepose repo layout (v2/crates/, firmware/esp32-csi-node/, archive/v1/, scripts/, docs/adr/). Hardware docs default to ESP32 on COM8 and tell the reader to confirm the port.

  7. Smoke contract (scripts/smoke.sh, ≥13 checks): repo-root .claude-plugin/marketplace.json exists + lists ruview + points source at ./plugins/ruview; plugin.json has name/description/version/keywords and does not contain skills/commands/agents arrays; every skills/*/SKILL.md has name + description + allowed-tools; no wildcard (*) in any allowed-tools; the expected skill set is present; every commands/*.md has a description; every agents/*.md has name + description + model; README contains a ## Compatibility section and a Namespace coordination block; this ADR exists with Status: Proposed; codex/AGENTS.md and codex/prompts/*.md exist and every commands/<name>.md has a matching codex/prompts/<name>.md (command↔prompt parity); nothing is misplaced under .claude-plugin/.

Consequences

  • Good: /plugin marketplace add ruvnet/RuView + /plugin install ruview@ruview (or claude --plugin-dir ./plugins/ruview from a clone) gives newcomers and operators the whole RuView workflow surface; no MCP-server prerequisite; Codex users get the same operator commands; the smoke script makes drift visible.
  • Cost: a mega-plugin means coarser install granularity (you get all 9 skills or none); the Codex mirror must be kept in sync by hand (the smoke script checks command↔prompt presence parity, not content parity); a skill stem (ruview-verify) collides with a command stem — tolerated by Claude Code (both resolve), but claude plugin details lists it twice.
  • Follow-ups: if the skill set grows past comfortable browsing (it's at 9), revisit the "one mega-plugin" decision and split by lifecycle (ruview-edge, ruview-train, …); add a content-parity lint between commands and Codex prompts; consider renaming /ruview-verify to drop the skill/command stem collision; consider pinning a tested claude-flow CLI minor for the security-scan step if that step becomes load-bearing; verify the underlying RuView command flags (sensing-server --help, gcloud-train.sh, provision.py) against the live tree rather than from README/scripts.