npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

wicked-studio

v0.4.10

Published

The coder-facing skin of the wicked experience plane — a pure HTTP/WS client of the wicked-crew daemon's /api/v1

Readme

wicked-studio

npm · CI · License: MIT

The coder-facing skin of the wicked experience plane. A React SPA that is a pure HTTP/WS client of the wicked-crew daemon: launch and steer governed agent runs, answer human gates, watch live CoreEvent streams, browse projects, repo intelligence, evidence, coverage, and the decisions ledger — everything the daemon exposes on /api/v1 and /ws, and nothing else.

What the skin surfaces (0.4.x)

Every capability below is a real /api/v1 or /ws wire — no invented routes — verified by a 21-scenario functional campaign against an isolated daemon (21/21 PASS, evidence-graded; estate-review/STUDIO-CAMPAIGN.md). Legs the campaign could only prove over the wire rather than through the UI are marked as such below.

  • Projects — create/rename/archive/restore, attach and detach members (repos, runs, chats, docs), a merged activity feed with a prompt inbox, a per-project dashboard, and a four-mode project shell (chat / build / document / video) with deep-linkable routes (/p/:id/…).
  • Repo intelligence — register a local path or clone from a URL; either launches a governed onboarding run (indexannotate, two tool units) that builds the repo's code graph. Then: graph view with ego-focus navigation, blast radius for any symbol, hotspots, the domain graph + coverage view, and a requirements browser with operator overrides (PATCH title/notes/status/risk).
  • Governed runs — the composer (Ask / Balanced / Autonomous, seat selection, repo binding, PR delivery), run list/detail/timeline with event backfill on reload, HITL steering gates (approve / approve-with-steer / reject, plus keyboard batch triage), elicitation prompts, durable pre-gate guidance notes, and the lifecycle verbs the UI wires today: cancel, inject a message, unarchive, retry lineage. (Resume and archive exist as typed client wires, campaign-verified over the API — the UI affordances are a filed gap, not yet shipped.)
  • Evidence — per-unit transcripts, the worktree file & diff viewer, and one-click evidence bundle download for any run. The skin surfaces the gates; it never grades.
  • Group chat — fan one question out to your whole warm CLI roster and watch each seat answer side by side.
  • Governed PTY terminals — real terminals (xterm over /ws/terminals/:id), including the seat sign-in flow from settings.
  • Workflow builder — inspect and create WorkflowDefs (phases, gates, validation) and their inline tool scripts, then launch runs against them.
  • Governance — policies, conformance rules (with facet preview), the decisions/claims ledger, and the audit view.
  • Settings — daemon settings plus studio.* namespaced keys: appearance/theme (including brand-learn), notifications, composer preferences.
  • Document & Video modes — the merged creator surface, riding crew's proxied interactive bridge under /api/v1/projects/:id/interactive/*.
  • Command palette + deep links — Cmd+K verbs (open terminal, answer prompts), bookmarkable routes throughout, desktop gate notifications.
┌─────────────────────┐         HTTP /api/v1  +  WS /ws          ┌──────────────────────┐
│   wicked-studio     │ ───────────────────────────────────────▶ │  wicked-crew daemon  │
│   (this repo, SPA)  │ ◀─────────────────────────────────────── │  (control plane:     │
│   the skin          │       wire contract: wicked-crew-api-types │  API/engine/gates)  │
└─────────────────────┘                                           └──────────────────────┘

The division of labor

  • wicked-crew is the control plane — the daemon, the /api/v1 REST surface, the /ws event stream, the wicked-core engine underneath, the gates and the evidence. It is fully functional headless.
  • wicked-studio is the skin — a client of that control plane, developed, versioned, and released as its own product. It imports zero crew source; the only thing the two share is the published wire contract, wicked-crew-api-types.
  • Crew still ships a default skin. wicked-crew's release build (build:with-studio) copies this package's built dist/ into the daemon's serving tree, so npx wicked-crew serve keeps the one-command local UX — UI and API same-origin on one port. The dependency direction is control-plane-ships-a-dist-artifact: crew depends on studio's build output, never on its source; studio depends on crew's wire contract, never on its internals.

Pairing with a daemon

The connection surface is deliberately small (src/api/client.ts):

| Mode | How the SPA finds the daemon | |---|---| | Bundled / same-origin (production) | window.location.origin — whatever origin the daemon serves the SPA from is where the SPA calls back to. --port / CREW_PORT just work; no host is baked into the bundle. | | Split dev or standalone | VITE_API_HOST (host:port, no scheme), baked at build time by Vite. .env.development sets 127.0.0.1:7701 — the crew daemon's default — for the npm run dev server on :4200. |

The daemon's loopback CORS admits any http://localhost:* / http://127.0.0.1:* origin, so a standalone studio on its own port can drive a local daemon out of the box.

Install

You rarely install studio directly: npx wicked-crew serve ships this UI bundled, same-origin on one port. Or use the family installer — npx wicked-installer installs/updates the whole wicked-* family (wicked-crew, which serves this skin, included). For a studio you build and host yourself, see Standalone build.

Develop

# a running control plane (defaults to 127.0.0.1:7701)
npx wicked-crew serve

# then, in this repo
npm install
npm run dev        # vite on http://127.0.0.1:4200, pointed at :7701 via .env.development

npm test (vitest + testing-library), npm run typecheck, npm run lint, npm run build (tsc + vite → dist/). CI runs all four on every PR.

Standalone build

VITE_API_HOST=127.0.0.1:7701 npm run build
# serve dist/ from ANY static server (SPA fallback to index.html), e.g.:
npx serve dist   # or python -m http.server -d dist

e2e/studio_standalone_test.py is the scripted proof of this mode: it builds the SPA, serves dist/ from a plain static server on its own port, points it at a live daemon, and drives a real flow (list runs → open a run → approve a human gate → watch CoreEvents over WS) with a real browser. See the header of that file for prerequisites and knobs.

Releasing / how crew consumes this

The npm package ships dist/ only (files: ["dist"]). wicked-crew declares wicked-studio as a devDependency and its build:with-studio copies node_modules/wicked-studio/dist into packages/crew/dist/studio, which the daemon serves same-origin (headless fallback when absent). Installs from git get a fresh dist/ via the prepare hook (scripts/prepare-dist.mjs); publishers run npm run build && npm publish so the tarball is built from the tagged source.

The data-testid contract (testid-inventory.json)

testid-inventory.json (repo root, committed; emitted into dist/testid-inventory.json by the build) is the machine-readable inventory of every data-testid the UI declares — the selector contract that test generators and the model-free campaign runner build against, versioned with this package. tests/testidInventory.test.ts re-scans src/ and fails CI on any drift, so a testid change (or a package.json version bump — the artifact carries studioVersion) ships only together with a reviewed npm run manifest:testids regeneration. The drift-handling doctrine downstream is embedded in the file's $doc header: a selector miss fails the deterministic run; the authoring agent re-authors against the live DOM; the runner re-records; the substitution lands in the spec diff. No agentic fallback inside the runner.

Provenance

Extracted from the wicked-crew monorepo (packages/studio) as its own product — the carve kept the code as-is and preserved the package's full in-monorepo history via git subtree split (92 commits). An earlier, pre-consolidation incarnation of this product is archived read-only at wicked-studio-archived.

Requirements

  • Node.js ≥ 22.0.0
  • npm ≥ 10 (for workspaces and prepare hooks)
  • A running wicked-crew daemon (v0.7.0+) for the SPA to connect to. The floor is real, not ceremonial: the UI calls routes that first shipped in crew 0.7.0 — PUT /runs/:id/guidance (the durable pre-gate note) exists only there, and the projects surface, /audit, and run archiving need ≥ 0.6.0 — so an older daemon 404s on surfaces the skin treats as present.
  • A modern browser (Chrome, Edge, Firefox, Safari)
  • macOS, Linux, or Windows

Contributing

  1. Fork the repo and create a feature branch.
  2. npm install && npm run dev — SPA on :4200, daemon on :7701.
  3. npm test && npm run typecheck && npm run lint before committing.
  4. Open a PR; CI runs all four gates on ubuntu / macos / windows.

The only external coupling is the wire contract (wicked-crew-api-types). Studio imports zero crew source — all crew interaction goes through /api/v1 and /ws. Keep it that way.

License

MIT