npx skills add ...
npx skills add recoupable/skills --skill recoup-platform-build-os
Scaffold and run a label's self-managing "music-company OS" inside its own git repo — the full label-intelligence workspace (folders, a self-managing CLAUDE.md mirrored to AGENTS.md, a read-only doctor + never-stale janitor, compound-learning and self-improvement loops, an in-place plugin) seeded with Recoup's conventions (top-level artists/{slug}/RECOUP.md identity files, releases/{slug}/RELEASE.md) and backed by the Recoup API as system of record. Use for "set up our label OS", "build the org workspace", "turn this repo into our label brain", or onboarding a new org/label repo. Pulls the real roster from the live account (auth via recoup-platform-connect-account), onboards artists API-first via recoup-roster-add-artist, and calls the other recoup-* skills (research/content/release/song/catalog) instead of reinventing them. The single workspace/OS builder — also covers the lightweight "just mirror my roster into folders" case.
npx skills add recoupable/skills --skill recoup-platform-build-os
The point is not the folders — it's to scaffold a system that both manages itself and improves itself. It keeps its own state current (never-stale) and gets better at its own job over time: compounding knowledge, promoting repeated work into new skills, and improving its own machinery. Hold that as the goal of every phase below; the structure only exists to serve it.
Concretely, turn a kickoff input into a living operating system: a folder + file structure, a
self-managing CLAUDE.md (mirrored to AGENTS.md), a plugin/ directory (an in-place installable
plugin with skills inside), a never-stale janitor backed by a read-only doctor, a compound-learning
loop, and a self-improvement loop. The plugin is named {DOMAIN_SLUG}-os by default and includes
manifests/adapters for Claude, Cursor, and Codex.
This builder skill is for the agent running it. Follow the phases in order. Don't stop halfway — drive to a working OS, then report. Read the references as you reach each phase.
This skill is workspace-os (by Sidney Swift) locked to one domain — a music company /
independent label — and wired into Recoup. The phases below are unchanged; apply them with
these Recoup rules layered on top.
artists/. The release lifecycle
(demo -> A&R -> signed -> production -> release -> promo -> catalog) is tracked per release
under artists/{slug}/releases/ (stage in RELEASE.md) — there is no separate top-level
pipeline/; unsigned candidates live in prospects/. Spend Phase 0's effort understanding this
specific label (roster, genres, deal posture, content motion, team), not which archetype it is.artists/{artist-slug}/ — no orgs/ nesting (the repo already is the org).artists/{artist-slug}/RECOUP.md — identity file, frontmatter artistName / artistSlug
/ artistId (artistId = the Recoup account_id). Same shape recoup-roster-list-artists,
recoup-roster-add-artist read/write.releases/{release-slug}/RELEASE.md and releases/top-tracks.md per artist.slugify = lowercase-kebab; never append IDs to folder names..env.example (documenting RECOUP_API_KEY
or RECOUP_ACCESS_TOKEN, RECOUP_ORG_ID, optional RECOUP_API_URL) and a .gitignore that
ignores .env. Real credentials live outside the repo (env vars / ~/.claude/recoup.env); never
commit them — the repo is shared across the label's team.recoup-platform-connect-account (mints/loads the
credential: RECOUP_API_KEY or RECOUP_ACCESS_TOKEN, optional RECOUP_ORG_ID).recoup-roster-onboard to bootstrap it (it
fans recoup-roster-add-artist out across parallel subagents); otherwise materialize the
existing roster into artists/ yourself: GET /api/organizations (or use RECOUP_ORG_ID) ->
GET /api/artists?org_id=… -> mkdir -p artists/{slugify(name)} and write RECOUP.md per
artist (artistName/artistSlug/artistId from account_id); skip existing. Use
recoup-roster-list-artists to inventory first and recoup-platform-api-access for the
call shapes.operations/sync.md with the contract: DB owns structured entities (roster,
socials, metrics, releases-as-records, billing); the repo owns the unstructured brain
(knowledge, research, plans, drafts). Entity creation is API-first — onboard a new artist
with recoup-roster-add-artist (the 8-call create -> enrich chain), then its folder
appears; never create an artist by mkdir alone. Use recoup-platform-api-access for raw
REST / connector calls. Empty orgs+artists usually means a throwaway key, not a blank label —
surface it, don't fabricate a roster.plugin/skills/ that
duplicate Recoup capabilities — wire to the installed recoup-* skills: roster
(recoup-roster-*), research (recoup-research-*), content (recoup-content-*), release
(recoup-release-*), song (recoup-song-*), catalog (recoup-catalog-*). The OS's own
plugin/skills/ should be label-specific glue (this label's routines/orchestration) plus the
standard maintenance organs (doctor/janitor/learn/reflect/skillify/intake). Default the plugin
name to {label-slug}-os.artists/,
knowledge/, library/, work/, artifacts/, plugin/, operations/), add optional folders
only with real material: content/ (the flywheel), deals/ (catalog acquisitions), contacts/
(industry network), proof/ (press/milestones), business/ (splits/royalties/contracts),
prospects/ (A&R funnel), reference/ (label bible). Mark inferred items "draft — confirm". See
references/blueprint.md for the full tree.assets/, the entity is artists/ and there is no pipeline folder — leave {PIPELINE}
empty, or set it to prospects/ only if the label does A&R. The doctor reads release status from
each artists/{slug}/releases/ (stage in RELEASE.md), not a top-level funnel.Every belief below serves one goal: a system that manages itself (stays current) and improves itself (compounds its knowledge, its capabilities, and its own machinery).
plugin/skills/. One-off work stays in work/ (dated) — it never becomes its own top-level folder.CLAUDE.md encodes where new things
go and how to keep the system current.{domain}-doctor run, a skill's verification, a reachable trigger — not the agent's
feeling. And the OS improves itself over time ({domain}-reflect), not just its contents.Read references/domain-inference.md.
Read references/blueprint.md.
clients/ / artists/ / features/), the compounding stores knowledge/
and library/, work/ (non-recurring output, by project), artifacts/ (finalized recurring
outputs like the dashboard), plugin/ (the in-place plugin), and operations/ (routines, sync,
health, improvements).reference/ (canon/source), proof/ (outcomes), content/ (a real content motion), business/
(legal/finance/metrics). When unsure, leave it out; adding later is one mkdir.operations, not operating-system;
knowledge, not knowledge-base). Rename to the domain's language but keep it a single word.
(Skill folders inside plugin/skills/ stay kebab-case — a different convention.)work/; only work that repeats or needs upkeep becomes a skill in
plugin/. Push over-preparation into subfolders and stubs, not a row of empty top-level dirs.README.md stub stating what belongs there.artifacts/dashboard.html from assets/dashboard.html.tmpl (HTML, not md). Seed
operations/health.md (empty — the {domain}-doctor fills it) and operations/improvements.md
(a header for the {domain}-reflect ledger).CLAUDE.md from assets/CLAUDE.md.tmpl, customized to the
domain (filing decision tree, the auto-manage loop, never-stale contract, repetition-to-skill rule).
Read references/self-management.md for what the contract must contain.AGENTS.md as a symlink to CLAUDE.md (ln -s CLAUDE.md AGENTS.md) so agent runners that
look for either file get the same brain. If symlinks aren't supported, write an AGENTS.md that
says "See CLAUDE.md" — but prefer the symlink.library/ (blank instruments you reuse — templates, scripts, checklists) and knowledge/
(settled answers you read back — faqs, insights, decisions, sops). Rule of thumb: if you'd use it
to make something it's library/; if you'd consult it to decide something it's knowledge/.plugin/)Read references/skill-authoring.md and references/skillifying-work.md (promotion workflow).
{DOMAIN_SLUG}-os (kebab-case) unless the user explicitly gave
a name. Use that same name in every manifest.plugin/ as a real plugin in place: plugin/.claude-plugin/plugin.json from
assets/claude-plugin.json.tmpl, plugin/.codex-plugin/plugin.json from
assets/codex-plugin.json.tmpl, and a plugin/skills/ directory. The Codex manifest must include
"skills": "./skills/"; see references/packaging.md..agents/skills as a symlink to ../plugin/skills so Cursor and Codex can discover the same
project skills. If symlinks aren't supported, copy plugin/skills/ there and note that it is a
compatibility mirror.plugin/skills/{name}/SKILL.md (frontmatter name +
description with real trigger phrases, then imperative steps referencing the workspace paths).assets/doctor-SKILL.md.tmpl) — the read-only verification surface (health score +
punch list to operations/health.md); the janitor and the build report are gated on it. Also
generate operations/doctor.py from assets/doctor.py.tmpl (fill the PIPELINE/ENTITY/slug) as
its deterministic fast path — so the mechanical checks ship with the build instead of being
reinvented later.assets/janitor-SKILL.md.tmpl) — run the doctor, then reconcile and fix what's safe.assets/compound-learn-SKILL.md.tmpl) — capture
decisions/answers/patterns into knowledge/ after each work session.assets/reflect-SKILL.md.tmpl) — improve the OS itself (skills, routing,
checks, templates) into operations/improvements.md; the 50/50 budget.assets/skillify-SKILL.md.tmpl) — promote proven repeatable work into
staged, verified skills.{domain}-intake.description for routing while the pack is small; add
a plugin/skills/RESOLVER.md (trigger -> skill table) only once skills grow enough that
descriptions overlap or the doctor's reachability check flags ambiguity.work/, not a
throwaway skill. For skills created from completed work, follow the skillify loop: prove provenance,
extract the repeatable process, stage in work/, verify with the strongest domain-appropriate check,
ask before moving into plugin/skills/, then repackage.Read references/packaging.md.
{domain}-doctor first — packaging is gated on a clean (or explained) report.plugin/ directory is already the installable plugin — no copying. Validate it: every
plugin/skills/*/ has a SKILL.md; both plugin manifests are valid JSON and share the {DOMAIN_SLUG}-os
name; the Codex manifest points at ./skills/; no angle brackets in any description; no stray
non-skill folders in plugin/skills/; .agents/skills points to or mirrors plugin/skills/. Fix
before packaging.zip the contents of plugin/ to /tmp first, then copy the .plugin to the outputs folder and
present it for install.operations/routines.md, AND drop a ready-to-use schedule from
assets/janitor-schedule.tmpl (GitHub Actions / cron / launchd / agent-runner task) so enabling it
later is a single copy, not a research project. The OS is still complete — the janitor also runs on
demand — but until the schedule is armed, the doctor keeps a standing low "schedule armed" finding,
because "self-reconciles when no one is looking" is only true once it actually runs unattended.Run {domain}-doctor and report its score as the build's verification surface — "done" is a clean
(or explained) doctor run, not a feeling. Summarize: the structure created, the skills authored, the
plugin produced, the schedule set, and the health score. List what was inferred vs. confirmed so the
user can correct any assumptions.