Two halves of the same flow, recorded deterministically by one script: the CLI a developer runs locally, and the portal view a curator sees in parallel. Switch tabs to compare.
Same scripted scenario, two perspectives. The CLI half walks
init --project → login → bootstrap → project list →
plan show → plan import → plan history → doctor.
The portal half shows the curator viewing the same project, plan, and members in real time.
Want to re-record locally?
./scripts/record-onboarding-demo.sh generates both halves from the same seeded dataset.
The first demo we ever recorded, still useful as the shortest possible tour:
(1) init --project + login + bootstrap for project-aware install,
(2) project list + project show + plan show to browse the curated bundle,
(3) plan import + plan history + doctor to import an updated plan and verify state.
The developer clones a repo and runs one command. If direnv is installed, it happens automatically:
$ git clone git@github.com:acme/billing-service && cd billing-service
$ direnv allow
# detected: rust, axum, postgres
# install 4 matching skills + 1 project-pinned bundle? [Y/n]
OK installed 4 skills · 2 agents · 1 command
OK linked into .claude/skills/, .claude/agents/, .claude/commands/
The curator opens the portal at https://acme.skills.example/projects/acme-billing-service.
They see the same bundle the developer just installed, plus drafts captured from prior sessions waiting for review.
$ skill-pool doctor
OK registry reachable (acme.skills.example, latency 23ms)
OK token valid (tenant: acme · scope: publish · expires in 87 days)
OK 7 skills linked (into .claude/skills/)
OK 2 agents linked (into .claude/agents/)
OK 1 command linked (into .claude/commands/)
OK no dangling symlinks
The developer starts a Claude Code session. The freshly-linked skills, agents, and commands are immediately available — Claude picks them up the way it picks up any other entries in ~/.claude/.