name puppet
description Adopt a foreign project that carries its own proto-toolkit Yggdrasil can't natively load, and drive it like a puppet: bootstrap Yggdrasil context inline (read-only — no worktree or checkpoint), then load a cached onboarding for the target (or scan and build one), emulate its skills and conventions, and take over its role. Read-only by default. Invoke as /puppet <target-project-dir>.
disable-model-invocation true
allowed-tools Read · Glob · Grep

Puppet

Walk into a project that has its own ad-hoc toolkit — skills, templates, conventions — built before (or beside) Yggdrasil, and take it over: orient on it, pick up its kit, and drive it as if you were its native agent.

A deliberate hack. /puppet hand-emulates what a real execution partner (Odin Codin') will eventually do natively — adopt a project's own layer and run it. Yggdrasil can't load a foreign project's .claude/skills as live skills (Claude Code only auto-loads skills at session start, from the running project), so this reads them as plain documents and acts them out. Lossy by design — "do your best with what you have." It changes neither project beyond existing as a command, and retires once the real project-layer mechanism exists.

Gate — read-only by default. While puppeting, touch nothing in either project's real content — no edits, writes, or commits to the target or to Yggdrasil — unless Brad explicitly asks for a specific change. He drives every mutation. The one exception is puppet's own bookkeeping under .puppet/ (the onboarding cache, research/, .scratch/) — that gitignored workspace is yours to manage freely.

Don't stress. Puppet is a deliberate, explicit utility — Brad drives it consciously and signals mode boundaries himself. There is no formal "exit puppet mode" ritual, and you don't need to police the boundary or hedge every action against the Gate. When Brad explicitly asks for a Yggdrasil-side change (e.g. improving puppet itself, capturing a lesson), briefly call out that it crosses the read-only boundary, then continue as directed — a light acknowledgment, not a block and not silence. The Gate above is a default for unattended drift, not a tripwire to fret over.

Permissions model — what prompts and what doesn't. The allowed-tools: [Read, Glob, Grep] frontmatter is a type-hint: it pre-approves the read tools (so scanning foreign trees is frictionless anywhere, even outside the session's path whitelists) but does not restrict the command — allowed-tools only ever grants, never limits. The read-only discipline is carried by the Gate above (the intent) plus the committed .claude/settings.json (the enforcement). settings.json pre-approves exactly two things: git clone (so /scry clones don't prompt) and Write/Edit under .puppet/** (the gitignored workspace). Everything else still prompts — every Write/Edit to either real project and every non-git clone Bash command — which is the human-in-the-loop boundary, by design.

This command only orients and takes over the role. It does not start doing the target's work — that waits for Brad's go-ahead, exactly like /good-morning.

Steps

  1. Parse the invocation. The argument after /puppet is the target project's root directory (e.g. C:\Projects\XI-RE-VibeTesting). Anything beyond the path is optional direction. If no path was given, ask for one.

  2. Bootstrap Yggdrasil context inline — no briefing, no worktree, no pin. Load Yggdrasil's own context so this puppet session rides the real toolkit and gets logged, but do not delegate to /good-morning — its session-worktree creation and checkpoint pin are for real Yggdrasil work sessions and would violate puppet's read-only, no-checkpoint stance. Do only this:

    • Read working/current-plan.md (Yggdrasil's plan) for context/logging — the tool we're bringing. (Step 3 loads the target — the project we're bringing it to.)
    • Skip the briefing (this isn't a Yggdrasil work session).
    • Create no session worktree and write no checkpoint/pin. Puppet is a read-only foreign adoption; none of good-morning's worktree-lifecycle or ledger-surfacing machinery applies.
  3. Resolve the target's puppet directory, then load-or-build it. Encode the target path into a directory label: drop the drive colon and turn each path separator into a hyphen (C:\Projects\XI-RE-VibeTestingC-Projects-XI-RE-VibeTesting). The puppet dir is .puppet/<label>/. Then:

    • If .puppet/<label>/PUPPET.md exists → load it instead of re-scanning. It's the cached onboarding: read it, note its last_scanned date, and if it looks stale (or Brad asks), offer a fresh re-scan.
    • If it doesn't exist → do the full scan and build it (step 3a).

    3a. Full scan (first time on a target) — assume a proto-toolkit "abomination." Read the foreign tree the way /good-morning reads Yggdrasil:

    • Self-description & conventions — its CLAUDE.md, AGENTS.md, README.
    • Its kit — inventory .claude/skills/, any commands/, templates. Read each skill enough to emulate it on demand (inert markdown to us — on-demand playbooks, not loaded capabilities).
    • Live state & open threads — plan docs, findings, scratch, TODOs.
    • Git & write policy — read it explicitly.

    Then write .puppet/<label>/PUPPET.md — frontmatter target: (the canonical path; the dir label is just a label) + last_scanned: (date) — containing: an emulated-skills index (skill · triggers · what it does), a notable-files index (one-liners; notable, not exhaustive), and the bulk, a self-generated onboarding summary ("skip the full scan; here's what you need to start"). Create the workspace subdirs under the puppet dir when first needed: research/ (durable working store — cloned repos go under research/repos/, and artifacts Brad hands over for analysis go under research/artifacts/, the standing drop location) and .scratch/ (throwaway working files).

  4. Reconcile conventions — the target's house rules win in its own tree. While wearing the kit, follow the target's conventions (confidence rules, templates, terminology, version assumptions) over Yggdrasil's where they clash. (The source-fidelity convention — prefer gh/git clone over WebFetch — is auto-inherited from the personal layer and applies throughout.)

  5. Take over — wear the kit, then stand ready.

    • Wear the kit: keep the target's emulated skills in hand. When a later task matches one's triggers, act as though that skill were loaded — follow its SKILL.md as your playbook for that task.
    • Surface the workspace paths: give Brad the puppet dir's full absolute paths as part of standing ready — especially the artifacts drop-path (.puppet/<label>/research/artifacts/, rendered as an absolute path) where he hands you files for analysis. Do this on every run (cache-hit or fresh scan) so he never has to reconstruct the encoded label himself.
    • Stand ready: like /good-morning, state where the project stands and what the immediate next step looks like — then stop. Don't start the target's work until Brad says go.

What this command does NOT do

  • No work execution. Orientation + role-takeover only; wait for a go-ahead.
  • No native skill loading. It emulates the target's skills from their markdown; it does not install or activate them.
  • No mutation of either project's real content. See the Gate — only .puppet/ bookkeeping is yours; everything else waits for Brad's explicit ask.
  • No Yggdrasil checkpoint. This isn't a Yggdrasil work session — don't pin or commit Yggdrasil's current-plan.md on the way in.