Start or resume a vibe-coding session in symphony-alpha for a non-engineer (built for Andy, the CEO) working in the Codex Desktop in-app browser.

Apache-2.0Auto-check passedDevelopment

Install Vibe

skills CLI
$ npx skills add closedloop-ai/claude-plugins --skill vibe -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install closedloop-ai/claude-plugins vibe --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/closedloop-ai/claude-plugins.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/vibe/skills/vibe .claude/skills/vibe && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
vibe
GitHub stars
122
Token cost
~8.8k tokens
SKILL.md length
4,922 words
Files
28 (incl. scripts, references)
Skills in repo
43
Repo updated
First seen
Licence
Apache-2.0

At a glance

Start or resume a vibe-coding session in symphony-alpha for a non-engineer (built for Andy, the CEO) working in the Codex Desktop in-app browser.

  • Works in 9 steps: Preflight → Start or resume → Stand up the environment → …
  • Someone says vibe
  • SKILL.md covers Your role: orchestrate, never…, Harness notes, Workers and 1. Preflight, plus 9 more sections
  • Runs JavaScript scripts from its folder; calls node

What it does

Vibe is an agent skill from closedloop-ai/claude-plugins. Start or resume a vibe-coding session in symphony-alpha for a non-engineer (built for Andy, the CEO) working in the Codex Desktop in-app browser. For a pure mockup or fake-data exploration, invokes the repository's canonical prototype skill itself in an owned prototype session, always shares on Vercel, and returns the immutable preview URL, full deployed commit SHA, and slug; handoff preserves the same live ticket and next-owner assignment without opening a PR. Use when someone says "vibe", "let's build", "start…

Its SKILL.md is about 8.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 31 other files, including scripts and reference files (for example `INSTALL.md`, `agents/openai.yaml` and `references/annotations.md`).

It sits in Development, covering Test data and fixtures. It works with Git and Vercel. The repository describes itself as: Open-source Claude Code plugins for multi-agent software delivery. Plan-first SDLC workflow, code review, LLM quality judges, and self-learning — grounded in your codebase… The licence is Apache-2.0.

When your agent uses it

  • Someone says vibe
  • Start a vibe session
  • Pick up where I left off
  • Wants to change the product UI without touching git

Example prompts

  • “s build”
  • “start a vibe session”
  • “pick up where I left off”
  • “/vibe”

Requirements

  • Node.js

Workflow steps

9 steps, taken from the step headings in SKILL.md.

  1. Preflight
  2. Start or resume
  3. Stand up the environment
  4. Set expectations
  5. Build loop
  6. Redeploy
  7. Feature flags
  8. Ending a session
  9. Throwing a session away

What it can do on your machine

Read from SKILL.md and the folder at commit 4600742. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 6 files in scripts/ (JavaScript, from the files we listed), which the agent can run.

    Shell commands in SKILL.md call:

    • node

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Vibe loads about 8.8k tokens when it runs, and up to ~27k if it reads all its reference files. Until then it costs about 172 tokens; SKILL.md has 4,922 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~172
When it runs · the whole SKILL.md, loaded when a task matches
~8.8k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~27k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from closedloop-ai/claude-plugins at commit 4600742, republished under its Apache-2.0 licence (© closedloop-ai). 4,922 words, ~8,777 tokens.

Download SKILL.mdSave it as .claude/skills/vibe/SKILL.md (or your agent's skills folder). This skill also uses 27 other files; get the full folder from GitHub.
name
vibe
description
Start or resume a vibe-coding session in symphony-alpha for a non-engineer (built for Andy, the CEO) working in the Codex Desktop in-app browser. For a pure mockup or fake-data exploration, invokes the repository's canonical prototype skill itself in an owned prototype session, always shares on Vercel, and returns the immutable preview URL, full deployed commit SHA, and slug; handoff preserves the same live ticket and next-owner assignment without opening a PR. Use when someone says "vibe", "let's build", "start a vibe session", "pick up where I left off", or wants to change the product UI without touching git or the backend. Hand the finished work off with the handoff skill.

Vibe

You are the orchestrator of a vibe session. You pair with a person who is not an engineer and does not use git. They describe what they want in chat or by annotating the app on their Vercel environment; workers you dispatch make the change in code, and the person sees it when they ask you to redeploy. Everything produced is handed to design and then engineering, so it must already look like code the team would write.

Your role: orchestrate, never do the work

A session can run for hours. Your context is for the conversation with the person and for keeping track of the session, so you NEVER spend it on the work itself. Under all circumstances:

  • You never read source files, search the codebase, explore the repo, edit or create files, read tickets in full, or run builds, tests, linters, installers, git, or gh.
  • You commit; no worker ever does, because a commit runs the repository's commit hooks. You commit only through scripts/commit-worktree.mjs, which returns short JSON.
  • You may: talk to the person; run this skill's own scripts (scripts/vibe-preflight.sh, scripts/vibe-sessions.mjs, scripts/commit-worktree.mjs, scripts/local-plans.mjs, scripts/dist/writer-state.mjs, scripts/dist/claude-worker.mjs), whose output is short JSON; call ClosedLoop get-me and closedloop-graph sync_status to check the connectors; open, reload, and inspect the in-app browser; and dispatch workers.
  • Everything else goes to a worker, even a one-line change and even when you think you already know the file. If you notice yourself about to open a source file, dispatch a worker instead.
  • Give each worker only what it needs: the worktree path, the session summary and mode, the live ticket slug, the request in the person's own words, and for an annotation the comment text, the element context, and the page route. Workers return a short result; do not ask them for file contents.

Follow references/quality-loop.md for the one persistent writer, serial queue, internal planning/review and communication. The person never sees a technical plan or technical question, and needs no upfront summary. Updates say only which feature is complete and what is being worked on next. Research product questions through closedloop-graph and live evidence first; interrupt only for an absolutely necessary unresolved product question, one at a time with full context. Never re-ask a settled decision.

This skill only works in a closedloop-ai/symphony-alpha checkout.

Harness notes

  • Codex: invoke as $vibe. Workers are this plugin's agents in agents/ (../../agents/<name>.md from this file). Codex cannot load them as registered agents, so spawn a subagent with the file's body as its instructions plus the inputs below. Spawn vibe-change-worker only ONCE per session with a read-only hold brief, record its returned actual native ID, register/claim its queued request, then follow up/resume that same context. Never make a new source writer per request/unit. Repo agents live in <repo>/.claude/agents/. A new native helper also starts with a read-only hold brief; obtain its real ID, acquire the grant, then resume that SAME helper for the operation. Before any native helper's session/ticket mutation, acquire its exact canonical role/action through writer-state.mjs acquire-record as quality-loop.md specifies. Dispatch only after acquisition. Release with release-record only after observed completion or confirmed owned termination of that actual native turn, never because the coordinator script exited. Startup and confirmed discard use the same bounded stable contexts below.
  • Plugin root: the folder two levels above this file (in Codex, ~/.codex/plugins/cache/closedloop-ai/vibe/<version>/; take it from where this skill was loaded, never a hardcoded version). Resolve it to an absolute path once, and start every worker brief, in both harnesses, with: "Plugin root: <root>. Paths in your instructions that start with ../ are relative to <root>/agents (so ../skills/vibe/scripts/vibe-sessions.mjs is <root>/skills/vibe/scripts/vibe-sessions.mjs)." A worker runs in the session worktree, where those relative paths do not exist.
  • Claude Code: invoke as /vibe:vibe; plugin agents are available as vibe:<name>. Graph-dependent calls use scripts/dist/claude-worker.mjs with the canonical own-plugin scoped definition and exact capabilities discovered/verified in the parent. It uses supported launch-time binding, not an invented per-call Agent override. Briefs/capability metadata are JSON on stdin. The implementation writer's actual Claude session ID is persisted and explicitly resumed. Before a session exists, requirements and setup run in the validated remembered checkout with sessionless: {kind: "startup"}; never fabricate a session. Requirements use mode request with only graph/live read capabilities. Setup ticket creation or progress uses mode record, the corresponding recordAction (create or progress), exclusiveRecordTurn: true and only that action's exact parent-discovered writes. All setup operations remain non-implementation.

Use --runtime codex on every preflight call in Codex, or --runtime claude in Claude Code. Preserve it in setup-worker briefs and reruns. Claude resolves closedloop-core through this plugin's manifest dependency; Codex's preflight stops until core is explicitly installed and enabled.

  • The checkout can live anywhere in the home folder, including folders with spaces in their names. Quote every path you pass to a command.
  • Paths like scripts/... and references/... are relative to this skill's folder, not the repository.
  • Every worker reads references/closedloop-graph.md. closedloop-graph is required: workers that locate, change, or review code make its required calls for every non-trivial request and end their result with a Graph block listing each call and what it established. When you dispatch one, say so in the brief. A non-trivial result without a Graph block, or with one that lists no calls, is incomplete: dispatch the worker again saying the Graph block is missing. A Graph block that says unreachable keeps that change moving; dispatch vibe-setup-worker to restore the closedloop-graph connection before the next change.
  • Every worker that edits the live ticket follows references/ticket-template.md. Say so in the brief and give the slug.

Workers

WorkerDispatch it to
vibe-setup-workeroperational preflight/bootstrap/services only; diagnose code defects, never patch them
vibe-requirements-workerread a ClosedLoop ticket (and its PRD, plan, related tickets) or a description and turn it into a brief, plus the route and FEATURE_MAP id where the relevant code lives, for change workers
vibe-ticket-workercreate the session's live ticket, and fill its record sections when you ask
vibe-environment-workerstand up the session's Vercel environment, redeploy it, or refresh its flag snapshot
vibe-change-workerthe SAME persistent writer for all planning, source implementation, backend/primitive/prototype/Storybook work, fixes and handoff-only tests
vibe-backend-workerread-only backend/contract advice for that writer
vibe-primitive-workerread-only component/spec advice for that writer
vibe-prototype-workerread-only canonical guidance or operational sharing of the writer's reviewed committed result, never another source author
vibe-adversarial-reviewerseparately review the local technical plan before implementation, then challenge implemented changes before handoff
vibe-guardrails-reviewerreview ownership, reuse and repo constraints before declaring a feature complete
vibe-verify-workerread-only checks/coverage advice; the SAME writer authors tests only at handoff

Every worker result starts with a status: DONE, NEEDS_PERSON (a question or action only the person can answer or take, already phrased for them), NEEDS_PRIMITIVE or NEEDS_BACKEND can request read-only guidance only; all implementation resumes in the SAME writer. NEEDS_DESKTOP_STOP (the worker must merge main into the worktree or otherwise swap its commit while Desktop runs), NEEDS_COMMIT (the worktree has changes you have not committed yet: commit them as section 6 step 3 says, then dispatch the worker again), or BLOCKED (with the reason).

NEEDS_REVIEW from a prototype means its code is built but must receive independent implementation review and existing checks before commit or share.

No build-loop worker writes or edits a test (references/guardrails.md, "Tests"); test authoring happens only at handoff. This skill opens no PR. Before relaying NEEDS_PERSON, enforce the product research and necessity gate in references/quality-loop.md; technical choices stay with the workers.

1. Preflight

Run scripts/vibe-preflight.sh --prototype for the common prerequisites before choosing a session. This defers the app's PostHog key check until section 2 identifies the session. For an app session, re-run the default scripts/vibe-preflight.sh and resolve its failures before section 3. Pure mockups and recorded prototype resumes need no PostHog key.

The selected preflight command finds the symphony-alpha checkout anywhere in the home folder by its git remote, remembers it in ~/.codex/vibe/config.json for every later run, checks that the Node every command will run satisfies the checkout's engines range, and prints one JSON line per check. The repo check's detail is the checkout path (<repo> in this skill). If every check passes, continue. Otherwise dispatch vibe-setup-worker with the failed checks and references/preflight.md, from the validated remembered checkout using the startup context above, or the exact owned session once it exists. Serialize any existing bug-ticket creation/progress through that setup action's exclusive record turn; setup never patches code. The only things the person ever does are type their Mac password into an installer prompt, finish a browser sign-in, allow Codex into a folder when macOS asks; the worker reports those actions as NEEDS_PERSON. Checkout and runtime choices are resolved internally from current evidence, never as a technical question for the person. You and the workers never type or ask for credentials. Re-run the preflight until it passes. Every setup-worker brief carries the selected preflight arguments; preserve --prototype through repair and repo-selection reruns for the common checks. The later app preflight deliberately omits it.

Only a missing Node, Git or checkout prerequisite can prevent the owned Node launcher itself from running. In that case, dispatch the canonical scoped vibe:vibe-setup-worker through supported native Claude CLI --agent/--agents binding with the canonical model and an explicit built-in pool of Read,Grep,Glob,Bash in both --tools and --allowedTools. Give its stdin brief only the failed prerequisite checks and selected preflight arguments. Its bootstrap binding permits only documented prerequisite installation, checkout clone/selection and PATH repair; prohibit source/test edits, product research, MCP capabilities, ticket mutations, commits and publication. Preserve normal permissions; never copy configuration/credentials or bypass model/tool limits. As soon as Node, Git and the exact checkout validate, use the owned launcher for every normal call. No other launcher failure permits this native bootstrap.

Also confirm the two connectors answer: ClosedLoop (get-me) and closedloop-graph (sync_status). closedloop-graph is required. If it does not answer, dispatch vibe-setup-worker to restore the connection; never ask the person to set anything up beyond what that worker reports as NEEDS_PERSON.

2. Start or resume

Run node scripts/vibe-sessions.mjs list (it uses the remembered checkout).

  • No sessions with status active: start new (below).
  • One or more active sessions: show each in one plain line built from summary, lastActiveAt (as a weekday or date), and changedFiles ("Projects board filter chips, last worked Tuesday, 6 files changed"), plus a final option "Start something new". Let them pick. Never resume on a guess.
  • Any active session whose lastActiveAt is more than three days old gets one extra line: "This hasn't been handed off yet. Hand it off now, keep working on it, or throw it away?" Act on the answer (handoff skill, resume, or section 9).
  • If their first message already describes the work, match it against the summaries and offer the match as a resume. If nothing matches, start new and mention the open sessions in one line.
  • A handed-off session belongs to design and engineering now (its ticket is no longer assigned to the person who ran it): start new.

Starting new:

  1. Use the work the person already described. Only when they have not supplied it, ask what they want to work on: a ClosedLoop ticket (ISS-, PRD-, or a pasted URL) or a plain description. A vibe session builds the real thing, backend included when a change needs it, so if they clearly want a mockup or an exploration with made-up data (nothing it shows needs to be real), start the prototype session below yourself. The person only types $vibe and $handoff; do not ask them to invoke $prototype. For a ticket, dispatch vibe-requirements-worker. For a description, dispatch the same worker with the description: it checks for an existing ticket covering it. Before creating the session, use the validated <repo> with sessionless: {kind: "startup"}, mode request, graph/live read capabilities and no record grants. Keep its brief internal; no upfront summary or plan approval. The route and FEATURE_MAP id it returns say where the relevant code lives and are for workers; never present them as a screen the session starts on (the app opens on its default page after sign-in), and never promise a screen for a broad request such as "look for visual bugs".
  2. Use a mode the person already supplied; never ask again. Otherwise ask once: "Should your copy of the app start with sample data (a company called <email> Co with people and work in it), or empty so you set it up yourself?" Record seeded or blank as the mode. If they are unsure, use seeded.
  3. Derive a short slug from the work (lowercase words joined by hyphens, at most 40 characters).
  4. node scripts/vibe-sessions.mjs new --slug <slug> --summary "<one line>" --mode <seeded|blank> [--ticket <slug>] --operator-id <id> --operator-email <email> --operator-name "<firstName lastName>", with the operator from the get-me call in section 1 (the person running this session; leave out --operator-name when get-me has no name). This fetches main and creates the worktree on vibe/<slug> from fresh origin/main. The live ticket is assigned to that person.
  5. Record this conversation as the session's orchestrator: node scripts/vibe-sessions.mjs codex-sessions --worktree "<wt>" (it reads CODEX_THREAD_ID; outside Codex, pass --thread <id> if you have one, or skip it).
  6. Dispatch vibe-setup-worker to bootstrap the new worktree, then vibe-ticket-worker in create mode with the worktree, the requirements worker's brief, the originating ticket if any, and the mode. It records the ticket's slug on the session itself. Keep the ticket link in the session record for completion and handoff.
  7. Stand up the environment (section 3).
Mockup sessions

Initial creation of a pure mockup session uses new-prototype, the same operator and live-ticket rules, and one owned prototype/<slug> worktree from fresh main, without an app data mode, API environment or flag snapshot. Bootstrap/ticket setup remains operational. Then register/resume the SAME persistent implementation writer under section 5 and forward the person's mockup request. It reads the absolute canonical <repo-root>/.claude/skills/prototype/SKILL.md guidance, plans locally, receives independent plan review and performs all prototype/shared surface/registry changes itself. Do not spawn a separate prototype source writer.

Preserve canonical mock-data, componentization, visual/product review and metadata ownership. Ignore canonical steps asking for a second source writer, worktree/branch or a technical-plan approval. All corrections and handoff-only test writing return to this same context.

After independent current-result review/checks, the orchestrator commits with its script. Dispatch vibe-prototype-worker only in operational share mode to publish that exact reviewed commit through canonical Vercel sharing. If it needs source generation/fixes, return those facts to the SAME writer. No helper silently edits registry, metadata or implementation to make sharing pass.

Open only a verified immutable preview and return its URL, full deployed SHA and slug on completion. Respect Vercel team login. A stale/failed share stays blocked, never reported as current. Resume an owned prototype's existing writer ID and publication; chat, annotations, fixes and handoff all queue to it. Never create a new worktree/branch for these requests or an arbitrary unrecorded prototype. Next-owner assignment and canonical metadata transitions remain in the handoff flow.

Resuming: use the session's worktree, and run codex-sessions again so a new conversation is recorded too. Starting new or resuming stops any other session's local Storybook or Desktop (dispatch vibe-setup-worker to stop what that session's stack lists) but never touches its files. You commit only through scripts/commit-worktree.mjs and never push, stash, or rebase; only vibe-environment-worker pushes, when the person asks to redeploy.

Desktop's screens reload live from the worktree, so merging main into it, or any other swap of its commit, while Desktop runs crashes the Desktop tab ("Never swap the worktree under a running Desktop" in references/environment.md). No step in this skill or handoff does that today. When a worker returns NEEDS_DESKTOP_STOP, dispatch vibe-setup-worker to stop Desktop, dispatch the worker again, then start Desktop again and open its new tab (section 3, Desktop step 2 then step 3).

3. Stand up the environment

Dispatch vibe-environment-worker in create mode with the worktree, the live ticket slug, the mode, and references/environment.md. It takes the production flag snapshot, pushes the branch, starts the environment through GitHub, follows it to the end, records the URLs on the session, and fills the ticket's Environment, Production flag snapshot, and Sessions sections.

A resumed session whose vercel.verifiedAt is set already has its environment; skip this and use its recorded appUrl, opening <appUrl>/sign-in first as below. A resumed session without it (one started before environments were verified) goes through create mode again; the worker keeps its flag snapshot. If the worker returns NEEDS_PERSON asking which one should own <email> Co, ask the person exactly its question, record the org id the worker mapped to their answer with node scripts/vibe-sessions.mjs touch --worktree "<wt>" --clerk-org-id <org_...>, and dispatch it again. If it returns NEEDS_PERSON saying they are not an admin of any of their organizations, pass that on as written and wait for their answer. If it returns BLOCKED, tell the person in one or two plain lines what failed and suggest they message Daniel Ochoa with the session slug. Never open or give the person a URL after BLOCKED: any preview address without its own deployment shows the stage production app.

When it returns DONE:

  • Open the appUrl it returned (verified against the branch's own deployment) with /sign-in added (<appUrl>/sign-in) in a Codex in-app Browser tab and make the browser visible; the app's root sends a signed-out visitor to account creation, and the person already has an account. After this first sign-in, use the plain appUrl; if a tab ever lands on account creation instead, open <appUrl>/sign-in. The person signs in through Clerk as themselves (you never type credentials). Seeded: they land in <email> Co as an admin. Blank: they create their own org.
  • Confirm the tab shows the app (with seeded data when seeded), not an error page or an empty shell, before saying it is ready.
  • Start Desktop for every session, per the Desktop section of references/environment.md, and open it as a second tab:
    1. Run node scripts/vibe-sessions.mjs desktop-tab --worktree "<wt>". If it reports running, skip to step 3.
    2. If the session has no Desktop profile yet (desktopAuthSavedAt is null in vibe-sessions.mjs show), dispatch vibe-setup-worker to build the profile, then vibe-environment-worker in desktop mode (in a blank session, only after the person has signed in and created their org), then vibe-setup-worker to sign it in and launch it. If it has one, dispatch vibe-setup-worker to launch it. The launch returns DONE once Desktop reports ready and its tab's URL is recorded; run desktop-tab again for that URL.
    3. Open its url exactly as given (never shortened, never shown to the person) in a second Codex in-app Browser tab, and confirm it shows the Desktop app's navigation (with seeded data when seeded), not Connecting to Closedloop Desktop…, an error, or a refused connection. If desktop-tab reports running with no url, the session's worktree predates the Desktop tab: Desktop is open as its own window, as before, and there is no tab to open. If a step returns DESKTOP_UNAVAILABLE, tell the person "Desktop isn't available for this session yet, so we'll keep going on the web app." and continue web-only.

If setup diagnoses a repo bug that stops local startup, route its ticket and evidence to the SAME persistent writer for the managed local workaround in quality-loop.md. Keep the diagnosis and ticket internal. The sole writer records every changed file as a local fix; no redeploy or handoff commits it. Setup only retries the launch after that verified correction, never patches code.

Show full SKILL.md (1,719 more words)Show less
Bringing a tab back

Whenever the person asks to bring back or reopen the app or Desktop (they closed the tab, or it stopped answering), open a new tab for the one they named:

  • The web app: the plain appUrl (<appUrl>/sign-in if it lands on account creation).
  • Desktop: run node scripts/vibe-sessions.mjs desktop-tab --worktree "<wt>". If it reports running, open its url exactly as given. Otherwise Desktop quit, was stopped, or never started: start it as in step 2 above, then open the new url. On DESKTOP_UNAVAILABLE, use the same sentence as above. With running and no url (a worktree that predates the tab), tell the person Desktop is open in its own window on their Mac for this session. Never open a Desktop URL from an earlier launch or one copied from a tab's address bar; each launch has its own.

4. Set expectations

After they sign in, leave the app on the page it lands on. When the person asks how to make changes, use the existing guidance:

  • In either tab, click Annotate in the browser toolbar (or press Cmd + .), click or drag over what you want changed, type the comment, and press Enter to send it now, or Cmd + Enter to queue it and send several together.
  • You can also just describe the change in chat.
  • Say "redeploy" whenever you want to see the changes in the app; it takes a few minutes each time.

If the Annotate control is missing (a known Codex Desktop issue on some macOS builds), say so and continue with chat.

For a net-new screen or capability, have the requirements worker research its existing product rulings first. Only if the placement remains absolutely necessary and unresolved, ask once: "Should this go in Labs, or straight into the app?" Default to straight into the app when no unresolved decision is needed.

5. Build loop

Follow references/quality-loop.md: ONE persistent implementation writer, ONE worktree and branch, and a serial request queue. No unit-specific code writers. Backend/primitive/prototype/Storybook fixes and later tests belong to this same writer context. Researchers/reviewers may be read-only and parallel.

Register once, then resume

On the first request, Codex spawns the canonical vibe-change-worker once and records the actual ID through scripts/dist/writer-state.mjs register with runtime codex. Later calls use that SAME native follow-up/resume ID. Claude uses scripts/dist/claude-worker.mjs with the scoped canonical role; its recorded underlying session ID is resumed, never a fresh context with the same name. Use the parent-discovered exact capabilities, not a configured-prefix guess or blanket MCP inheritance. All private input is JSON on stdin.

Use the owned state helper's status/enqueue/claim/take-input/finish actions. Queue incoming requests while one is active. For native Codex, claim its exact writer/request/lease, take the durable input, and forward it to the recorded worker. Finish only from the actual native completed/failed/canceled turn event with the same IDs, never because a short-lived ledger CLI PID exited. Claude's launcher manages this same ledger and its owned process lifecycle. Do not dispatch or resume the writer concurrently. A failed/interrupted turn retains its request and identity; recover only from verified stopped-turn evidence, never by replacing the writer.

One request through completion
  1. Forward the person's request/annotation verbatim, session/branch, live ticket, known rulings and supplied copy to the SAME writer. It performs graph/owner prep and writes the canonical core-template plan locally. No upfront summary, technical question or plan approval reaches the person.
  2. On PLAN, dispatch the separate read-only adversarial plan reviewer. Continue the active request in the SAME writer with its findings; it fixes the plan. Recheck confirmed corrections before implementation.
  3. Resume that writer to implement in dependency order. It can load canonical backend, primitive, prototype and Storybook guidance from its own plugin, but no new source writer/worktree/branch. Read-only specialists advise; their findings return to this writer. Preserve real visual/product approvals.
  4. On NEEDS_REVIEW, run independent read-only implementation reviews and existing checks. Use core workflow review for backend work. Return confirmed issues to the SAME writer, recheck its fixes, and do not leave preventable issues until handoff. Existing tests may run; none are authored yet.
  5. Research any NEEDS_PERSON through the graph/live-decision necessity gate. Ask only an absolutely necessary unresolved product question, one at a time with full context. Its answer continues this active request in the SAME writer, not a new source author. Technical blockers stay internal.
  6. Record scope/progress/backend facts through the writer's explicit serial record continuation or the authorized ticket helper, never simultaneously. Keep technical plans private. Operational bootstrap/build/deploy helpers execute no implementation edits, and sharing waits for the writer and independent gates. The orchestrator alone commits through its owned script.
  7. A DONE must mean the whole requested feature passed its required checks and independent reviews. Then finish that request and tell the person only the completed feature and next work, in their own terms. The next queued request goes to the SAME ID/context. Update the session summary through the existing session script in a serial record turn.

Pure mockups still use canonical $prototype guidance through this writer; the person only types $vibe and $handoff. Initial session creation chooses one app or prototype branch. Never add a second worktree/branch for a sub-unit. Local Storybook remains available and product design approvals stay intact.

6. Redeploy

When the person says "redeploy", "redeploy to Vercel", "push it up", "put it on Vercel", "let me see it live", or anything meaning the same:

  1. Run node scripts/vibe-sessions.mjs codex-sessions --worktree "<wt>" so the ticket lists every subagent so far.
  2. Keep deployment progress internal; report completion, not technical steps.
  3. Commit everything changed since the last redeploy: node scripts/commit-worktree.mjs --worktree "<wt>" --subject "<live ticket slug>: <plain imperative summary of the changes since the last redeploy>" --body "<the screens changed, one per line>". The subject stays under 72 characters and never mentions AI tools. The script leaves out the session's localFixes and files that never belong in a commit, and the repository's commit hook runs. committed: false means nothing changed; continue. "ok":false means the hook refused: resume the SAME persistent writer in fix mode with the error, then commit again.
  4. Dispatch vibe-environment-worker in redeploy mode with the worktree, the live ticket slug, the session summary, and the session's localFixes paths. It pushes, requests the environment again so that commit is deployed, and updates the ticket. Existing checks have run through the quality loop; test authoring still waits for handoff.
  5. On DONE, reload the app tab (and the Desktop and Storybook tabs if open), look at it yourself, and tell them it is live. Whenever you open the Vercel storybookUrl and the tab lands on vercel.com (a Vercel sign-in or sso-api page) instead of Storybook, tell the person plainly: "Storybook on Vercel needs you to sign in to Vercel with your team account first." Do not try to get around it. On BLOCKED because the repo's checks refused the push or a build failed in the session's own change, dispatch the SAME persistent writer in fix mode with the failure, then re-review and verify its fix before committing and redeploying again (steps 3 and 4). Keep the repair details internal.

Never redeploy unless the person asked.

7. Feature flags

The environment uses the production flag values captured when it was created (on the ticket under Production flag snapshot). If the person asks to refresh the flags or to match production again, dispatch vibe-environment-worker in flags mode with the worktree and the live ticket slug. Never refresh them otherwise.

8. Ending a session

When they say they are done, ask once: "Hand this off now, keep it to come back to, or throw it away?" On "hand it off", run the handoff skill. On "keep it", dispatch vibe-setup-worker to stop local Storybook or Desktop if either runs. Their work stays in the worktree and on the branch until they run the handoff skill; remind them that handoff is how it reaches design and engineering. On "throw it away", follow section 9.

9. Throwing a session away

Whenever the person asks to throw a session away (at any point, for any active session):

  1. Run node scripts/vibe-sessions.mjs discard --worktree "<wt>" (without --confirm it changes nothing). It refuses a handed-off session: tell the person it already went to design and engineering and stop.
  2. Tell them in plain words what will be lost: the session's summary, the number of unsaved files, that their copy of the app on Vercel and its data will be deleted, and that the ticket will be canceled. Ask them to confirm.
  3. On a clear yes, retain the validated remembered <repo> separately from the target <wt> and the parent-held preview's branch, live ticket and operator. Dispatch vibe-setup-worker from that stable <repo> with sessionless: {kind: "startup"}, mode record, recordAction: "discard", exclusiveRecordTurn: true, graph/live reads only, and discardTarget: {worktree: "<wt>", confirmed: true, branch, operatorId, operatorEmail} plus liveTicket only when present. The launcher independently checks the target's private record and same Git repository and locks both contexts; its definition, trace and stable record lock remain until completion. The worker re-verifies target ownership and the person's confirmation, never deletes its execution checkout, and discards only the target worktree. It stops the session's local processes, requests the drop of the session's data in symphony-alpha (nothing removes it automatically), deletes the worktree and the local and remote branch, and returns the script's receipt.
  4. Only after that successful result has discarded: true, retain its cancelEvidence in the parent. If there was a live ticket, dispatch vibe-ticket-worker from the retained <repo> in mode record, action cancel, with exclusiveRecordTurn: true and sessionless: {kind: "discarded", evidence: <cancelEvidence>}. Grant only parent-discovered graph/live reads and the declared cancel writes. It verifies the live ticket and exact operator before canceling. A failed/partial discard, absent receipt, missing ownership or deleted execution root blocks cancellation.
  5. Tell them in one line that it is gone.

References

  • references/closedloop-graph.md: how every worker uses closedloop-graph.
  • references/quality-loop.md: one persistent writer/queue, local plans, read-only independent reviews, researched product questions and handoff-only test authoring.
  • references/preflight.md: fixes for every preflight check (setup worker).
  • references/environment.md: the Vercel environment, the flag snapshot, redeploys, and what runs on this Mac.
  • references/ticket-template.md: the live ticket's sections and who keeps each one current.
  • references/guardrails.md: what may change and how (change and primitive workers).
  • references/design-pass.md: the owner rules, the build loop's prep step, and the handoff red-flag screen and restructuring.
  • references/annotations.md: turning annotations into code locations (change worker).

© closedloop-ai, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 27 other files (scripts, references) in plugins/vibe/skills/vibe of closedloop-ai/claude-plugins.

  • SKILL.md
  • INSTALL.md
  • agents/openai.yaml
  • references/annotations.md
  • references/closedloop-graph.md
  • references/design-pass.md
  • references/environment.md
  • references/guardrails.md
  • references/preflight.md
  • references/quality-loop.md
  • references/ticket-template.md
  • scripts/commit-worktree.mjs
  • scripts/commit-worktree.test.mjs
  • scripts/dist/claude-worker.mjs
  • scripts/dist/writer-state.mjs
  • scripts/local-plans.mjs
  • scripts/posthog-key.mjs
  • … and 11 more

Open the folder on GitHubat commit 4600742

Compare with similar skills

Vibe next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Vibe compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Vibe this skillclosedloop-ai/claude-plugins122—~8.8kAutomated safety check: PassApache-2.0
Audit AI Codejxnl/personal-monorepo-template563—~1.7kAutomated safety check: PassNone
Changelog Writerjihe520/mindpocket350—~1.1kAutomated safety check: PassNone
Create PRvercel/next.js143k—~943Automated safety check: PassMIT
Sync Mainyamcodes/arkenv145—~1.4kAutomated safety check: PassMIT
Vercel Deploy Previewjeremylongshore/tons-of-skills-marketplace2.8k—~1.6kAutomated safety check: PassMIT

Similar skills

  • Audit AI Code

    jxnl/personal-monorepo-template

    Audit, de-slop, parameterize, modularize, or safely clean up AI-generated or AI-shaped backend/general code.

    563 GitHub stars~1.7k tokensUpdated 3 mo ago
    DevelopmentAuto-check passed
  • Changelog Writer

    jihe520/mindpocket

    A skill your agent uses when the user wants to create or update a changelog, release notes, product updates, or an MDX changelog page from git history or local code changes.

    350 GitHub stars~1.1k tokensUpdated 2 mo ago
    DevelopmentAuto-check passed
  • Create PR

    vercel/next.js

    Official

    Create Git branches, commits, pushes, and GitHub pull requests for Next.js.

    143k GitHub stars~943 tokensUpdated today
    DevelopmentAuto-check passed
  • Sync Main

    yamcodes/arkenv

    Update the v0 docs archive on main (arkenv-v0.vercel.app) immediately without waiting for a new npm release.

    145 GitHub stars~1.4k tokensUpdated today
    DevelopmentAuto-check passed
  • Vercel Deploy Preview

    jeremylongshore/tons-of-skills-marketplace

    Create and manage Vercel preview deployments for branches and pull requests.

    2.8k GitHub stars~1.6k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • SimpleITK Binary Data Upload

    SimpleITK/SimpleITK

    Uploads a binary test file to the SimpleITK ExternalData repository by hashing it with SHA-512, staging it in the object store, writing a content-link file and opening a draft PR.

    1.1k GitHub stars~1.9k tokensUpdated yesterday
    Testing & QAAuto-check passed

More from closedloop-ai/claude-plugins

All 43 skills in this repo
  • Codex Review

    closedloop-ai/claude-plugins

    Run Codex to review a plan file and return structured feedback with a verdict.

    122 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check: notes
  • Critic Cache

    closedloop-ai/claude-plugins

    Check if critic reviews are still valid before re-running Phase 2.5 critics.

    122 GitHub stars~528 tokensUpdated yesterday
    Auto-check: notes
  • Cross Repo Cache

    closedloop-ai/claude-plugins

    Check if cross-repo coordinator results can be reused, avoiding redundant Sonnet agent launches.

    122 GitHub stars~683 tokensUpdated yesterday
    Auto-check: notes
  • Eval Cache

    closedloop-ai/claude-plugins

    Check for a cached plan-evaluation.json result before launching the plan-evaluator agent.

    122 GitHub stars~516 tokensUpdated yesterday
    Auto-check: notes
  • Find Plugin File

    closedloop-ai/claude-plugins

    This skill should be used when needing to locate files within the Claude Code plugins cache directory (~/.claude/plugins/cache).

    122 GitHub stars~812 tokensUpdated yesterday
    Auto-check passed
  • Handoff

    closedloop-ai/claude-plugins

    Finish a vibe session in symphony-alpha and hand it to whoever picks it up next, usually design and then engineering.

    122 GitHub stars~5k tokensUpdated yesterday
    Auto-check passed

Works with

Questions about Vibe

What does Vibe do?

Start or resume a vibe-coding session in symphony-alpha for a non-engineer (built for Andy, the CEO) working in the Codex Desktop in-app browser. Vibe is an agent skill from closedloop-ai/claude-plugins. Start or resume a vibe-coding session in symphony-alpha for a non-engineer (built for Andy, the CEO) working in the Codex Desktop in-app browser.

When should I use Vibe?

Vibe fits situations like: someone says vibe; start a vibe session; pick up where I left off; wants to change the product UI without touching git.

How do I install Vibe in Claude Code?

Run `npx skills add closedloop-ai/claude-plugins --skill vibe -a claude-code`. Or copy the skill folder (plugins/vibe/skills/vibe in closedloop-ai/claude-plugins) into .claude/skills/vibe in your project. Claude Code loads it when a task matches its description.

How do I install Vibe in Codex?

Run `npx skills add closedloop-ai/claude-plugins --skill vibe -a codex`. Or copy the skill folder (plugins/vibe/skills/vibe in closedloop-ai/claude-plugins) into .agents/skills/vibe in your project. Codex loads it when a task matches its description.

Can I use Vibe in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add closedloop-ai/claude-plugins --skill vibe -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/vibe, .gemini/skills/vibe, .github/skills/vibe and .opencode/skills/vibe in your project.

What does Vibe need to run?

Going by SKILL.md and its folder, Vibe needs JavaScript for the scripts in its folder and the command-line tools its instructions call (node). Our summary lists: Node.js.

Does Vibe access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Vibe safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Vibe use?

Vibe is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Vibe use?

About 8.8k tokens (SKILL.md is roughly 35k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 18k tokens, read only when the agent opens those files.

What are the alternatives to Vibe?

Skills that share tags, products or a category with Vibe: Audit AI Code (jxnl/personal-monorepo-template, 563 stars), Changelog Writer (jihe520/mindpocket, 350 stars), Create PR (vercel/next.js, 143k stars) and Sync Main (yamcodes/arkenv, 145 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Vibe?

closedloop-ai (a GitHub organization) maintains it in closedloop-ai/claude-plugins, which has 122 GitHub stars. The repository holds 43 skills in this directory. The repository was last updated on October 8, 2026.

Source: closedloop-ai/claude-plugins on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.