Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,21 @@ All notable changes to the claude-plugins project will be documented in this fil

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Entries are listed newest-first; each plugin section is treated as released when merged to `main`.

### vibe v1.0.50

#### Fixed
- Handoff no longer reads symphony-alpha's current Storybook roots as frozen v1.0. symphony-alpha #8867 (ISS-12610, Storybook 3.0.0) made the `<Level> v2.0` roots the plain roots, moved the old plain roots to `<Level> v1.0`, and replaced the `v1.0`/`v2.0` tags with one lifecycle tag per story file (`stable`, `preview`, `experimental`, `deprecated`). 1.0.49 and earlier still treated every plain-root title as v1.0, so a session that synced main and moved its own entries to `Composites/...` with a `stable` tag was blocked, and an edit of a `Surfaces v1.0/` file went unchecked.
- `handoff-inventory.mjs` now judges story files by the scheme of the session's base, reported as `storybookScheme`. A new `storybook-taxonomy.mjs` reads the base's own `apps/storybook/story-group-order.ts`: when it exports `StorybookLifecycle`, the frozen tag is its `Deprecated` value and every frozen root ends in `storybookBaselineVersion`, the same test symphony-alpha's `validate:catalog` applies, so the next rename there moves these checks with it. A base without it keeps the version scheme (plain roots and the `v1.0` tag frozen). A lifecycle export this script cannot read blocks a session that changed a story file (`storybookSchemeRecognized`) instead of guessing.
- Every earlier ruling carries over on both schemes: v1.0 story files stay frozen apart from the compile-only repair (same meta title, tags and story exports as the base), a retitle is judged against the main the session last synced so a sync is never blamed for #8867's renames, and `Start Here/` stays exempt. The inventory's output keys are unchanged.

#### Changed
- `guardrails.md` ("Storybook taxonomy"), the Storybook decomposer, the change and primitive workers, the guardrails reviewer (check 10), `design-pass.md`, the handoff skill and the README place new stories in the current roots with one lifecycle tag (`stable` shipped, `preview` under Labs, `experimental` design-only or not in the live app), put new states of a deprecated component in a new entry in the current root with a permanent name and no version number, keep an existing non-deprecated file's title and tag, and tell a session on a pre-#8867 base to follow that base's `v2.0` rules until it syncs.

#### Tests
- `handoff-inventory-storybook-scheme.test.mjs` (5 cases): scheme detection from the real constant shapes and from a renamed scheme; current-root files new and edited on a lifecycle base (the failure on 1.0.47 to 1.0.49: both edited `stable` files were listed as `frozen`); the v1.0 roots and `deprecated` tag frozen with the compile-only repair kept; a session based before #8867 that syncs main and is not blamed for its renames; an unreadable lifecycle export. Four of the five fail on 1.0.47 and on 1.0.49.
- The Storybook contract tests follow the new wording, plus one for the base-scheme rule.
- Two eval cases tagged `storybook` (Claude, and Codex through the runner): new states for a deprecated component, and a synced session's own `v2.0` entry. One run each: both pass on both harnesses here; on 1.0.48 Codex failed both and Claude (Opus) failed the first (score 0.2) and passed the second.

### vibe v1.0.49

#### Fixed
Expand Down
2 changes: 1 addition & 1 deletion plugins/vibe/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "vibe",
"description": "Vibe sessions, handoff, seed refresh, and ClosedLoop ticket workflows",
"version": "1.0.49",
"version": "1.0.50",
"dependencies": ["closedloop-core"],
"author": {"name": "ClosedLoop", "email": "support@closedloop.ai"}
}
2 changes: 1 addition & 1 deletion plugins/vibe/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "vibe",
"version": "1.0.49",
"version": "1.0.50",
"description": "Vibe sessions, handoff, seed refresh, and ClosedLoop ticket workflows",
"author": {"name": "ClosedLoop", "email": "support@closedloop.ai"},
"homepage": "https://github.com/closedloop-ai/claude-plugins",
Expand Down
21 changes: 17 additions & 4 deletions plugins/vibe/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,15 +156,22 @@ and Storybook skill (`.claude/skills/storybook/`, whose placement workflows
and index scripts it uses) where they say how and mirroring that precedent's
structure, never its root or version, where they do not; the story files the
writer matches are the same capability's, not the same folder's. Stories cover the components consumers
render, not internal render pieces. A v1.0 story file is never edited beyond
a compile-only repair, so new states of its component go in a new v2.0 entry
holding only them. New states
render, not internal render pieces. New stories go in the current roots
(`Composites/`, `Surfaces/` and the other plain levels) with one lifecycle
tag: `stable`, `preview` under Labs, or `experimental` for design-only work.
A v1.0 story file (under a `<Level> v1.0/` root or tagged `deprecated`) is
never edited beyond a compile-only repair, so new states of its component go
in a new entry in the current root holding only them. New states
of any other existing component go in its existing story file under the same
title and tag, since a retitle breaks every link to its stories; handoff
blocks any other edit of a v1.0 story file except a compile-only repair, and a
retitle unless it is a sibling replacement's entry. Story files under the
`Start Here/` root are exempt from the v1.0 freeze and the title, tag and
retitle checks (design ruling, 2026-10-06). The writer records it in its local plan;
retitle checks (design ruling, 2026-10-06). Handoff judges story files by
the scheme of the session's base, read from that base's
`apps/storybook/story-group-order.ts`, so a session still based before
symphony-alpha #8867 keeps the `v1.0`/`v2.0` rules until it syncs main, and a
sync is never blamed for the renames it imported. The writer records it in its local plan;
a conflict goes on the live ticket by audience, design conflicts under
Design Review and everything else on the Engineering checklist, never to the
person.
Expand Down Expand Up @@ -324,6 +331,12 @@ cd plugins
claude plugin eval . --eval-dir vibe/evals --tag visual-cues --scaffold --allow-tools Bash Write Edit --model opus --runs 3 -j 4 --no-publish --ablation none
```

The two cases tagged `storybook` rehearse placement on symphony-alpha's
lifecycle scheme (#8867): new states for a component whose story file is
deprecated go in a new entry in a current root, and after a main sync a
session's own `<Level> v2.0/` entry moves to the plain root with a lifecycle
tag without counting as a retitle.

## Runtime Files

Version `1.0.14` contains 10 skills and 16 agents. It has no standalone
Expand Down
18 changes: 12 additions & 6 deletions plugins/vibe/agents/vibe-change-worker.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,16 +152,22 @@ for a second source author. For a missing primitive use the read-only steward
spec and build its complete states/stories yourself. Keep Storybook collected
locations, catalog and taxonomy correct; all resulting source edits are yours.
Read the repo's `apps/storybook/TAXONOMY.md` and follow it: every new story
goes in a v2.0 root, in its page tree, tagged `v2.0`, with the Storybook
release bump it requires, never in a frozen v1.0 root; new states of an
existing component go in a new v2.0 entry holding only them when its story
file is v1.0, which you never edit beyond a compile-only repair, and otherwise
in its existing story file, title and tag unchanged
goes in a current root (the plain level, such as `Composites/`), in its page
tree, with exactly one lifecycle tag (`stable` for a shipped surface,
`preview` under `Labs`, `experimental` for a design-only or not-in-the-app
entry) and the Storybook release bump it requires, never in a frozen v1.0
root; new states of an existing component go in a new entry in the current
root holding only them when its story file is v1.0 (under a `<Level> v1.0/`
root or tagged `deprecated`), which you never edit beyond a compile-only
repair, and otherwise in its existing story file, title and tag unchanged
(`../skills/vibe/references/guardrails.md`, "Storybook taxonomy"). Never avoid
a rename to protect a v1.0 story file; when a rename breaks one, repair it with
only prop renames, imports and types, no story added or removed and no title,
story ID, tag or visual change, and log `Compile-only repair to v1.0: <file>`
in the change log (design ruling, 2026-10-15). The story
in the change log (design ruling, 2026-10-15). On a base older than the
lifecycle scheme, the doc on that base still sends new work to
`<Level> v2.0/` tagged `v2.0`; after a main sync your own new entries move to
the plain root with a lifecycle tag, which is not a retitle. The story
files you match are the same capability's, not the same folder's (same
section).

Expand Down
22 changes: 15 additions & 7 deletions plugins/vibe/agents/vibe-guardrails-reviewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,15 +121,23 @@ closedloop-graph is required, per `../skills/vibe/references/closedloop-graph.md
lint or type suppression or a raised allowlist count added to make a check
pass (`guardrails.md`, "Checks") is blocking too.
10. Storybook taxonomy (`guardrails.md`, "Storybook taxonomy"): read the
repo's `apps/storybook/TAXONOMY.md`. A new story file titled
under or tagged for a frozen v1.0 root, or any edit or move of a story
file that is v1.0 on main (the inventory's `v1Stories`, reason `frozen`),
is blocking; that component's new states belong in a new v2.0 entry
holding only them, with no version number in its name. Confirm each of
repo's `apps/storybook/TAXONOMY.md` as the session's base has it; the
inventory's `storybookScheme` names that base's scheme. A new story file
titled under or tagged for a frozen v1.0 root (a `<Level> v1.0/` root or
the `deprecated` tag; on a version-scheme base, a plain root or the
`v1.0` tag), or any edit or move of a story file that is v1.0 on main
(the inventory's `v1Stories`, reason `frozen`), is blocking; that
component's new states belong in a new entry in the current root holding
only them, with no version number in its name. Confirm each of
the inventory's `compileOnlyV1Repairs` is purely mechanical (prop
renames, imports, types) with no visual change; anything else in one is
blocking. So is a v2.0 story outside its page tree, without the `v2.0`
tag, or added, moved or renamed without the release bump the doc names.
blocking. So is a new story outside the current roots' page tree (on a
lifecycle-scheme base, a title still under a `<Level> v2.0/` root), a
story file without exactly one lifecycle tag in its meta or with the
wrong one for its place (`stable` shipped, `preview` under `Labs`,
`experimental` design-only or under `Not In The Live App`; on a
version-scheme base, without the `v2.0` tag), or one added, moved or
renamed without the release bump the doc names.
An existing non-v1.0 story file (on main) retitled, re-tagged or moved breaks every
link to its stories and is blocking (the inventory's `retitledStories`
for a title) unless recorded as a sibling replacement's entry; confirm the
Expand Down
4 changes: 2 additions & 2 deletions plugins/vibe/agents/vibe-primitive-worker.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ skill (`.claude/skills/storybook/SKILL.md`, `references/gotchas.md`,
case the screen needs, with one story per variant, size, and state.
3. Stories in a collected location with controls, and a `DS_*` taxonomy
entry for a new `packages/design-system/components/ui/*.tsx`. No tests.
Place them per the repo's `apps/storybook/TAXONOMY.md`: a v2.0 root, the
`v2.0` tag and the release bump, never a frozen v1.0 root
Place them per the repo's `apps/storybook/TAXONOMY.md`: a current root,
one lifecycle tag and the release bump, never a frozen v1.0 root
(`guardrails.md`, "Storybook taxonomy").
4. `pnpm --filter storybook catalog:sync`, `pnpm --filter storybook validate:catalog`,
`pnpm --filter storybook test`, and Biome on your files, until all pass.
Expand Down
37 changes: 21 additions & 16 deletions plugins/vibe/agents/vibe-storybook-decomposer.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,11 @@ taxonomy"). For placement, use that skill's placement pieces:

Read `apps/storybook/AGENTS.md` for
where stories must live to be collected, and the repo's
`apps/storybook/TAXONOMY.md`, which places every new story: a v2.0 root, its
page tree, the `v2.0` tag and the release bump, never a frozen v1.0 root
(`../skills/vibe/references/guardrails.md`, "Storybook taxonomy"). An
`apps/storybook/TAXONOMY.md`, which places every new story: a current root,
its page tree, one lifecycle tag and the release bump, never a frozen v1.0
root (`../skills/vibe/references/guardrails.md`, "Storybook taxonomy"). Read
that doc as the session's base has it: on a base older than the lifecycle
scheme it still places new work under `<Level> v2.0/` with the `v2.0` tag. An
existing component's story file keeps its title and tag ("Precedent search",
step 4).
Read the same session decision table and affected/interacting row IDs. Use
Expand Down Expand Up @@ -78,16 +80,18 @@ Do this first, in both modes.
3. Report everything found, not a pick: the component that provides the
capability and its path; how each host consumes it (a prop, a hook, a
wrapper, its own copy); and every existing story that exercises it, with
its title, story names, version tag and file.
its title, story names, lifecycle tag and file.
4. Decide in this order. First (design ruling, 2026-10-15): a change to an
existing component (new states or variants, an extra column action, a new
footer) never retitles, re-tags or moves its existing story file.
Storybook builds story IDs from the title path, so a retitle breaks every
link to those stories. A v1.0 story file is frozen and never edited, not
even to add a story: the new states go in a new v2.0 entry for that
component holding only the new states, its name descriptive, permanent,
per `apps/storybook/TAXONOMY.md` and without a version number, and the
v1.0 stories stay where they are. The one exception is a compile-only
link to those stories. A v1.0 story file (under a `<Level> v1.0/` root or
tagged `deprecated`) is frozen and never edited, not even to add a story:
the new states go in a new entry for that component in the current root
holding only the new states, its name descriptive, permanent, per
`apps/storybook/TAXONOMY.md` and without a version number, with the
lifecycle tag its place in the tree takes, and the v1.0 stories stay where
they are. The one exception is a compile-only
repair after a rename elsewhere: only mechanical changes (prop renames,
imports, types), no story added or removed, no title, story ID or tag
change and no visual change, since the freeze protects what its stories
Expand All @@ -98,25 +102,26 @@ Do this first, in both modes.
new states as extra stories, its title, tag and existing story names
unchanged. Otherwise only a new component, or a sibling replacement such
as a V3, gets a new
entry and v2.0 placement. This outranks reading a touched story file as
taking the v2.0 version. Then (operator ruling, 2026-10-14): where
entry and a place in the current roots. This outranks reading a touched
story file as moving to the current roots or taking a new lifecycle tag.
Then (operator ruling, 2026-10-14): where
the repo's `apps/storybook/TAXONOMY.md` or `.claude/skills/storybook/`
already say how, follow them; where they do not, mirror the precedent: the same owner,
the same way of consuming it, the component that carries its stories, how
granular they are and which states get variants. Mirroring copies
structure only, never location or version: the root, version tag and v2.0
structure only, never location or lifecycle: the root, lifecycle tag and
tree position always come from `apps/storybook/TAXONOMY.md`, and a
precedent in a v1.0 root never puts new work in v1.0. Either way, stories
document the components consumers actually render, one story per state,
never internal render pieces: a shared capability's generic mechanics stay
in the shared component's existing stories, and the page-level component
consumers render gets variants showing only its domain-specific
configuration (its dimensions, labels, icons). It fits the doc's v2.0
configuration (its dimensions, labels, icons). It fits the doc's
Composites row, "a section of a page".
5. A precedent that disagrees with those docs, or precedents that disagree
with each other, is a Conflict. Decide it by the same order. Where the
docs say nothing, mirror one precedent, chosen in this order: built on
the same providing component, then already in the v2.0 tree, then most
the same providing component, then already in the current roots, then most
recently changed (the latest commit on main to its story file); name the
others.
Report each side with its paths and titles, and its audience, `design` or
Expand All @@ -131,9 +136,9 @@ precedent path, it follows.
```
Placement:
- Capability: <named without the entity>
- Precedents: <each: entity, providing component path, how hosts consume it, each story title, story names, tag and file>, or none found
- Precedents: <each: entity, providing component path, how hosts consume it, each story title, story names, lifecycle tag and file>, or none found
- Owner: <path to build or extend>, per <doc section> or mirroring <precedent path>
- Stories: <each story to add or extend: title, tag, file>, root and tag per <TAXONOMY.md section>, structure per <doc section> or mirroring <precedent>; an existing file's title and tag unchanged, a v1.0 file not edited beyond a compile-only repair (step 4)
- Stories: <each story to add or extend: title, lifecycle tag, file>, root and tag per <TAXONOMY.md section>, structure per <doc section> or mirroring <precedent>; an existing file's title and tag unchanged, a v1.0 file not edited beyond a compile-only repair (step 4)
- Conflict: <each disagreement: audience `design` or `engineering`, both sides quoted with paths, and how it was decided>, or none
```

Expand Down
6 changes: 3 additions & 3 deletions plugins/vibe/evals/codex/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ Visual cases (tag `visual-cues`) use the same stand-in repository and Pillow
renderer as Claude, which renders light and dark (`--theme dark`) from the
stand-in tokens' `:root` and `.dark` blocks. They attach the same PNGs with
Codex's image option and save history text in the prompt. No browser, Electron
window, actual app or external ticket is started. The 23 other cases rehearse
one reply from supplied session state in read-only mode. This is behavior
coverage, not a substitute for live app validation.
window, actual app or external ticket is started. The 25 other cases rehearse
one reply or decision from supplied session state in read-only mode. This is
behavior coverage, not a substitute for live app validation.

The console reports each case and failure. Private artifacts include input,
reply, events, rollout tool calls, the modified fixture, usage and `results.json`.
Expand Down
2 changes: 1 addition & 1 deletion plugins/vibe/evals/codex/test_run.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

def test_one_case_per_claude_prompt_and_role_names() -> None:
found = runner.cases()
assert len(found) == 29
assert len(found) == 31
assert len({c["name"] for c in found}) == len(found)
assert all(c["name"].startswith(("executive-", "product-manager-")) for c in found)
for case in found:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
type: regex
match: contains
flags: i
pattern: 'EDIT_EXISTING_FILE:\s*no\b'
---
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
type: regex
match: contains
pattern: 'TAGS:[^\n]*\b(stable|preview)\b'
---
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
type: regex
match: not_contains
pattern: 'TAGS:[^\n]*(deprecated|v[12]\.0)'
---
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
type: regex
match: not_contains
pattern: 'TITLE:[^\n]*v[12]\.0'
---
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
type: regex
match: contains
pattern: 'TITLE:\s*["''`]?Composites/'
---
Loading
Loading