From workflow
Set up a committed project orchestrator from a short stack-and-conventions interview, and optionally a per-user operator profile.
How this skill is triggered — by the user, by Claude, or both
Slash command
/workflow:onboard [--show]When to use
When you want to set up the project orchestrator or personalize an operator profile — interview the stack and conventions to build a committed project orchestrator, optionally a per-user profile. Not to add skills or hooks (use evolve) or generate a CLAUDE.md (use /init).
[--show]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
`onboard` runs **two independent flows**. **Flow A** sets up a **committed project orchestrator**: a short PROJECT interview (stack + conventions) produces a thin-wrapper agent under `.claude/agents/` that **inherits** the live `core:orchestrator` contract verbatim plus an injected `## Project profile` block; each teammate opts in locally by setting `"agent": "<name>"` in the gitignored `.claud...
onboard runs two independent flows. Flow A sets up a committed project orchestrator: a short PROJECT interview (stack + conventions) produces a thin-wrapper agent under .claude/agents/ that inherits the live core:orchestrator contract verbatim plus an injected ## Project profile block; each teammate opts in locally by setting "agent": "<name>" in the gitignored .claude/settings.local.json. Flow B is optional and per-user: if the user wants to personalize for themselves, the SAME 3-round personal interview produces a user-scope operator-profile skill written to ~/.claude/skills/ — outside the repo, never committed, preloaded into orchestrators by name. The skill never writes files itself — it delegates every write and commit to a core:generalist subagent. On re-run, if an orchestrator already exists, the very first question is Keep as-is vs Reconfigure.
/workflow:onboard
├─ parse flags (--show)
├─ locate LIVE core:orchestrator (source of truth) [§2 unchanged]
├─ FLOW A — PROJECT orchestrator (committed)
│ ├─ detect existing by `## Project profile` signature
│ │ └─ found → gate: Keep as-is | Reconfigure
│ └─ PROJECT interview (2 rounds) → build agent (mirror + ## Project profile)
├─ FLOW B — personal operator-profile (optional, user-scope)
│ ├─ gate: "personalize for yourself too?" yes | no
│ └─ yes → detect existing ~/.claude/skills/operator-profile → Keep | Reconfigure | Skip
│ → PERSONAL interview (today's 3 rounds, prefilled) → build skill
├─ confirm write + commit (one prompt, covers both flows)
├─ delegate to ONE core:generalist (both writes + settings.local + gitignore + commit)
└─ report (both flows) + restart reminder + opt-in note
This skill owns the interviews, sourcing, name resolution, and rendering. All file writes and the commit are delegated, keeping onboard compatible with the no-write orchestrator contract.
--show → render the existing project orchestrator's ## Project profile block (locate it via §3) AND, if present, the body of ~/.claude/skills/operator-profile/SKILL.md, then exit without changes. If neither exists, say so and stop.Glob for the installed core orchestrator, in this order, and use the first match:
~/.claude/plugins/marketplaces/*/plugins/core/agents/orchestrator.mdplugins/core/agents/orchestrator.md (repo-local fallback)~/.claude/agents/orchestrator.mdRead the matched file. From its frontmatter, capture the behavior-contract keys to mirror verbatim into the generated wrapper: disallowedTools, skills, color, and model only if it is present. From its body, capture the single-sentence operating instruction verbatim — the wrapper reuses it unchanged, before the profile block. The mirrored skills: list now carries operator-profile from upstream automatically, so the generated wrapper inherits the personal profile by name with no special-casing here.
Never hardcode the orchestrator's behavior or skills list. Always read them live here so the generated wrapper tracks upstream changes to core:orchestrator. If no source matches, tell the user the core plugin must be installed and stop — there is nothing to inherit.
Find any orchestrator this skill previously committed to the repo:
Glob .claude/agents/*.md; Read each and select those whose body contains a ## Project profile block (the onboard signature).name: and its ## Project profile block.AskUserQuestion which one is the target.Also Read .claude/settings.local.json and capture any top-level agent value — it tells whether this user is already opted in.
Runs only when §3 found an existing orchestrator, before the PROJECT interview. AskUserQuestion with two options:
.claude/settings.local.json "agent": "<name>" (preserve siblings); ensure .gitignore covers .claude/settings.local.json. This path does NOT stop here — it skips the PROJECT interview but STILL proceeds to FLOW B (§6) and the final delegation/report.## Project profile, proceed to §5, and rewrite the same file/name in place (no rename).Run two AskUserQuestion rounds. Each option set is ≤4 options; rely on the automatic free-text Other for anything outside the list. On a Reconfigure (§4), pre-select / pre-fill every option from the detected ## Project profile.
Collect the answers into a single resolved project profile used in §8.
First, an AskUserQuestion gate: "Personalize for yourself too?" — yes | no.
~/.claude/skills/operator-profile/SKILL.md (Glob + Read). If found, AskUserQuestion with Keep | Reconfigure | Skip (prefill the rounds from it on Reconfigure). Keep and Skip write no personal file; Reconfigure (or a fresh run with no existing file) runs the three rounds below.Run three AskUserQuestion rounds. Each option set is ≤4 options; rely on the automatic free-text Other for anything outside the list. On a Reconfigure, pre-select / pre-fill every option from the detected profile.
Collect the answers into a single resolved operator profile used in §9.
.claude/agents/<name>.md in the repo — a committed artifact. There is no global/project question.<repo>-orchestrator, where <repo> is the kebab-cased basename of git rev-parse --show-toplevel. Confirm it or let the user override via AskUserQuestion (with Other). The name MUST be kebab-case and unique among existing agents.settings.local.json agent value equals the bare name: — NOT plugin-namespaced, since this is not a plugin agent.Assemble the file content from the mirrored values captured in §2 and the project profile from §5. Only name, description, and the ## Project profile block are personalized — the body sentence and the behavior-contract frontmatter are mirrored, never invented:
---
name: <name>
description: "<repo>'s project orchestrator: generalist coordinator tuned to this project's stack and conventions. Inherits the full core:orchestrator contract; never writes files, delegates to writer subagents."
disallowedTools: <mirrored verbatim from source>
skills: <mirrored verbatim from source>
color: <mirrored from source>
---
<verbatim one-sentence body from the source orchestrator>
## Project profile
- **Type**: <…> **Language**: <…> **Frameworks**: <…> **Package mgr**: <…>
- **Test**: <…> **Lint/format**: <…> **Commits**: <…>
- **House rules**: <rule · rule · …>
Apply this profile to every task: respect this project's stack, test/lint commands, commit convention, and house rules. This profile refines HOW work fits THIS project — it never overrides the core:orchestrator operating contract above.
If the source declared model, include the mirrored model line; otherwise omit it.
Produced only when §6 ran with personalize=yes AND the user chose Reconfigure or it is a fresh personal profile. Assemble the user-scope skill from the operator profile resolved in §6:
---
name: operator-profile
description: "The operator's personal working profile — role, seniority, stack, tone, language, and output preferences. Preloaded into orchestrators to shape HOW Claude communicates and decides for this user."
when_to_use: "Auto-loaded as background context whenever an orchestrator runs; not a manual command. Re-run /workflow:onboard and choose to personalize to (re)generate it."
user-invocable: false
---
# Operator profile
- **Role**: <…> **Seniority**: <…> **Stack/domains**: <…> **Focus**: <…>
- **Tone**: <concision> · <register> · responds in <language> · emojis: <…>
- **Output**: <format> · <depth> · autonomy: <…> · verification: <…>
Apply this profile to every task: shape tone, verbosity and output format to it. This profile refines HOW you communicate and decide — it never overrides the orchestrator's operating contract.
This skill MUST stay preloadable: never add disable-model-invocation: true here. user-invocable: false hides it from the / menu while leaving it loadable by name from the orchestrator's mirrored skills: list — a future editor must not add disable-model-invocation, or the orchestrator can no longer preload it.
Before any write, one AskUserQuestion summarizing the planned effect of BOTH flows — the agent committed to .claude/agents/<name>.md; the optional ~/.claude/skills/operator-profile/SKILL.md if §6 produced one; settings.local.json stays local/gitignored; .gitignore is ensured — with three options:
This skill MUST NOT Write/Edit itself — it may run under the no-write orchestrator. Spawn one core:generalist subagent via Agent, passing the full resolved file content(s) from §8 (and §9 when produced) and these exact instructions:
<repo>/.claude/agents/<name>.md (create parent dirs). This is a COMMITTED artifact — do NOT add it to .gitignore.~/.claude/skills/operator-profile/SKILL.md (expand ~, create parent dirs). This lives OUTSIDE the repo and is per-user — NEVER git add it, NEVER add it to .gitignore. Skip this step entirely when personalize=no, or Keep, or Skip.<repo>/.claude/settings.local.json: set the top-level key "agent": "<name>". If the file is absent, create it as { "agent": "<name>" }. If present, ADD/REPLACE only the agent key and PRESERVE all sibling keys (e.g. ultracode) — never replace the whole object..gitignore covers .claude/settings.local.json (append the line if missing). The agent file is NOT gitignored.git add .claude/agents/<name>.md plus .gitignore ONLY if it changed, then git commit with a Conventional Commit message: feat(orchestrator): add <name> project orchestrator (fresh) or chore(orchestrator): reconfigure <name> (reconfigure). NEVER git add settings.local.json; NEVER git add anything under ~/.claude/. No co-author line, no "Generated with Claude Code".After the subagent returns, report what changed.
Summarize:
## Project profile,operator-profile skill was written (with its ~/.claude/skills/operator-profile/SKILL.md path) or skipped,settings.local.json wiring ("agent": "<name>"),.gitignore touch, if any,Flag that a Claude Code restart is required for the new default agent (and a freshly created operator-profile skill) to take effect, and that /reload-plugins (or a restart) was needed for /workflow:onboard itself to appear. Note that teammates opt in by re-running /workflow:onboard and choosing Keep as-is.
.claude/settings.local.json is the per-user opt-in — never committed, always gitignored.operator-profile skill to ~/.claude/skills/, never committed, always preloaded by name via the mirrored skills: list — and graceful (skipped with a debug warning) when the user never created it.## Project profile block are personalized.core:generalist, staying compatible with the no-write orchestrator contract.npx claudepluginhub shoto290/shoto --plugin workflowCreates bite-sized, testable implementation plans from specs or requirements, with file structure and task decomposition. Activates before coding multi-step tasks.