diff --git a/code/.storybook/main.ts b/code/.storybook/main.ts index 4419ece13e05..8f73a0cd8736 100644 --- a/code/.storybook/main.ts +++ b/code/.storybook/main.ts @@ -70,10 +70,6 @@ const config = defineMain({ directory: '../addons/a11y/src', titlePrefix: 'addons/accessibility', }, - { - directory: '../addons/review/src', - titlePrefix: 'addons/review', - }, { directory: '../addons/a11y/template/stories', titlePrefix: 'addons/accessibility', @@ -127,7 +123,6 @@ const config = defineMain({ '@storybook/addon-vitest', '@storybook/addon-a11y', '@storybook/addon-mcp', - '@storybook/addon-review', 'storybook-addon-pseudo-states', '@chromatic-com/storybook', './services-preset.ts', diff --git a/code/addons/review/README.md b/code/addons/review/README.md deleted file mode 100644 index bb681eac7c5c..000000000000 --- a/code/addons/review/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# @storybook/addon-review - -Renders an agent-pushed review of a code change inside Storybook. - -An ADE agent pushes a review payload via the companion MCP server -(`@storybook/addon-mcp`); the dev server enriches it with the current git -branch, caches it, and broadcasts it over the Storybook channel. This addon's -page receives the payload (and requests a replay on mount so late or refreshed -tabs catch up) and renders it as a dedicated review experience: - -- **Summary** — the review title and narrative, with the affected stories - grouped into Collections (agent-curated clusters) or by Components, plus - search and expand/collapse. -- **Story view** — each reviewed story opens at a normal Storybook story URL - (`?path=/story/...&collection=N`) with a toolbar header for previous/next - navigation through the review and a link back to the summary. - -## Channel contract - -Event names live in `src/constants.ts` and are the cross-repo contract with -`@storybook/addon-mcp`. They must match the emitter's constants exactly. - -- `…/push-review` — agent → server: a new review payload. -- `…/display-review` — server → tabs: broadcast a review (`createdAt`-stamped). -- `…/request-review` — tab → server: replay the cached review (on mount). - -## Review state shape - -See `src/review-state.ts`. It is a duplicate of the canonical valibot schema -that lives in the MCP addon; this side only renders, so it needs the type, not -the validator. diff --git a/code/addons/review/build-config.ts b/code/addons/review/build-config.ts deleted file mode 100644 index fed4597b0146..000000000000 --- a/code/addons/review/build-config.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { BuildEntries } from '../../../scripts/build/utils/entry-utils.ts'; - -const config: BuildEntries = { - entries: { - browser: [ - { - exportEntries: ['.'], - entryPoint: './src/index.ts', - }, - { - exportEntries: ['./manager'], - entryPoint: './src/manager.tsx', - dts: false, - }, - ], - }, -}; - -export default config; diff --git a/code/addons/review/manager.js b/code/addons/review/manager.js deleted file mode 100644 index bb3432a1730f..000000000000 --- a/code/addons/review/manager.js +++ /dev/null @@ -1 +0,0 @@ -export * from './dist/manager.js'; diff --git a/code/addons/review/package.json b/code/addons/review/package.json deleted file mode 100644 index 78560f5fef7c..000000000000 --- a/code/addons/review/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "@storybook/addon-review", - "version": "10.5.0-alpha.7", - "description": "Storybook addon that renders agent-pushed reviews", - "keywords": [ - "storybook", - "storybook-addon", - "review", - "mcp", - "agent" - ], - "homepage": "https://github.com/storybookjs/storybook/tree/next/code/addons/review", - "bugs": { - "url": "https://github.com/storybookjs/storybook/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/storybookjs/storybook.git", - "directory": "code/addons/review" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "license": "MIT", - "type": "module", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "code": "./src/index.ts", - "default": "./dist/index.js" - }, - "./manager": "./dist/manager.js", - "./package.json": "./package.json" - }, - "files": [ - "dist/**/*", - "README.md", - "*.js", - "*.d.ts", - "!src/**/*" - ], - "dependencies": { - "markdown-to-jsx": "^7.7.2" - }, - "devDependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0", - "typescript": "^5.9.3" - }, - "peerDependencies": { - "storybook": "workspace:^" - }, - "publishConfig": { - "access": "public" - }, - "storybook": { - "displayName": "Review", - "unsupportedFrameworks": [ - "react-native" - ] - } -} diff --git a/code/addons/review/project.json b/code/addons/review/project.json deleted file mode 100644 index 4a042f15c2ee..000000000000 --- a/code/addons/review/project.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "addon-review", - "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "projectType": "library", - "targets": { - "compile": {}, - "check": {} - }, - "tags": ["library"] -} diff --git a/code/addons/review/src/index.ts b/code/addons/review/src/index.ts deleted file mode 100644 index ddcd95ae6000..000000000000 --- a/code/addons/review/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -// The review ingest contract is core-owned. This husk re-exports it so any -// remaining importer of `@storybook/addon-review` keeps resolving until the -// package is deleted. -export { REVIEW_EVENTS as EVENTS, REVIEW_NAMESPACE as ADDON_ID } from 'storybook/internal/types'; -export type { ReviewState, ReviewCollection, CollectionKind } from 'storybook/internal/types'; diff --git a/code/addons/review/src/manager.tsx b/code/addons/review/src/manager.tsx deleted file mode 100644 index c95cab84ba68..000000000000 --- a/code/addons/review/src/manager.tsx +++ /dev/null @@ -1,4 +0,0 @@ -// The review manager UI now lives in core (`core/src/manager/components/review`) -// and mounts directly from the manager App. This addon entry is an empty husk -// kept only until the package is removed; it registers nothing. -export {}; diff --git a/code/addons/review/tsconfig.json b/code/addons/review/tsconfig.json deleted file mode 100644 index 73a65ef2ef6e..000000000000 --- a/code/addons/review/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": {}, - "include": ["src/**/*"] -} diff --git a/code/addons/review/vitest.config.ts b/code/addons/review/vitest.config.ts deleted file mode 100644 index 25fae90d1f77..000000000000 --- a/code/addons/review/vitest.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig, mergeConfig } from 'vitest/config'; - -import { vitestCommonConfig } from '../../vitest.shared.ts'; - -export default mergeConfig( - vitestCommonConfig, - defineConfig({ - // Add custom config here - }) -); diff --git a/code/core/src/common/versions.ts b/code/core/src/common/versions.ts index d72a356d666c..d95d73be4bc4 100644 --- a/code/core/src/common/versions.ts +++ b/code/core/src/common/versions.ts @@ -5,7 +5,6 @@ export default { '@storybook/addon-links': '10.5.0-alpha.7', '@storybook/addon-onboarding': '10.5.0-alpha.7', 'storybook-addon-pseudo-states': '10.5.0-alpha.7', - '@storybook/addon-review': '10.5.0-alpha.7', '@storybook/addon-themes': '10.5.0-alpha.7', '@storybook/addon-vitest': '10.5.0-alpha.7', '@storybook/builder-vite': '10.5.0-alpha.7', diff --git a/code/core/src/core-server/server-channel/review-channel.test.ts b/code/core/src/core-server/server-channel/review-channel.test.ts index e0e8aae0f4c4..47ce94bc1055 100644 --- a/code/core/src/core-server/server-channel/review-channel.test.ts +++ b/code/core/src/core-server/server-channel/review-channel.test.ts @@ -54,7 +54,6 @@ const sampleReview: ReviewState = { title: 'Button', rationale: 'The directly changed component.', storyIds: ['button--primary'], - kind: 'atomic', }, ], }; diff --git a/code/core/src/manager/components/review/review-state.ts b/code/core/src/manager/components/review/review-state.ts index 1f5c43633ca3..c627d0cd8552 100644 --- a/code/core/src/manager/components/review/review-state.ts +++ b/code/core/src/manager/components/review/review-state.ts @@ -1,3 +1,3 @@ // The review payload type is the core-owned ingest contract. Re-exported here so // the addon's manager code keeps importing it from a local path. -export type { CollectionKind, ReviewCollection, ReviewState } from 'storybook/internal/types'; +export type { ReviewCollection, ReviewState } from 'storybook/internal/types'; diff --git a/code/core/src/manager/components/review/screens/SummaryScreen.stories.tsx b/code/core/src/manager/components/review/screens/SummaryScreen.stories.tsx index 2fda906a5a11..b478ded4df5c 100644 --- a/code/core/src/manager/components/review/screens/SummaryScreen.stories.tsx +++ b/code/core/src/manager/components/review/screens/SummaryScreen.stories.tsx @@ -35,13 +35,11 @@ const full: ReviewState = { { title: 'Core Button — primary/solid variant', rationale: 'Render the **solid variant** directly; best show the heavier weight and padding.', - kind: 'atomic', storyIds: ['button-component--variants', 'button-component--base', 'button-component--sizes'], }, { title: 'Related Button-based components', rationale: '`ToggleButton` and `ReviewChangesButton` build on the same `Button` primitive.', - kind: 'transitive', storyIds: ['components-togglebutton--variants', 'components-togglebutton--sizes'], }, ], @@ -58,7 +56,6 @@ const largeCascade: ReviewState = { title: 'Storybook manager surfaces', rationale: 'Manager views consume shared typography, spacing, and theming tokens that can shift subtly.', - kind: 'consumer', storyIds: [ 'manager-main--default', 'manager-main--about-page', @@ -72,7 +69,6 @@ const largeCascade: ReviewState = { title: 'Sidebar density and search experience', rationale: 'Sidebar layouts are sensitive to token updates in spacing and color contrast, especially in filtered states.', - kind: 'consumer', storyIds: [ 'manager-sidebar-sidebar--searching', 'manager-sidebar-sidebar--statuses-open', @@ -84,7 +80,6 @@ const largeCascade: ReviewState = { title: 'Settings and onboarding pages', rationale: 'Settings pages use shared UI primitives and should be spot-checked for readability and alignment.', - kind: 'transitive', storyIds: [ 'manager-settings-aboutscreen--default', 'manager-settings-guidepage--default', @@ -96,7 +91,6 @@ const largeCascade: ReviewState = { title: 'Core UI primitives', rationale: 'Primitive components amplify token regressions across addons and manager surfaces.', - kind: 'atomic', storyIds: [ 'components-tabs-tabsview--basic', 'components-card--default', @@ -108,7 +102,6 @@ const largeCascade: ReviewState = { title: 'Performance and analyzer tools', rationale: 'Bench and diagnostics views exercise dense layouts where token changes are easy to miss.', - kind: 'catch-all', storyIds: [ 'bench--es-build-analyzer', 'manager-sidebar-filesearchmodal--default', @@ -154,7 +147,6 @@ const atomicChange: ReviewState = { 'button-component--icon-only', 'button-component--base', ], - kind: 'atomic', }, { title: 'Toolbar, Tabs & Select — direct consumers', @@ -168,7 +160,6 @@ const atomicChange: ReviewState = { 'components-tabs--stateless-with-tools', 'select-component--base', ], - kind: 'consumer', }, { title: 'Modal & Popover — overlays with buttons', @@ -180,7 +171,6 @@ const atomicChange: ReviewState = { 'overlay-popover--with-hide-button', 'overlay-popover--with-chrome', ], - kind: 'consumer', }, { title: 'Docs blocks & Manager menu — transitive', @@ -192,7 +182,6 @@ const atomicChange: ReviewState = { 'manager-container-menu--with-shortcuts', 'manager-container-menu--with-shortcuts-active', ], - kind: 'transitive', }, ], changedFiles: ['core/src/components/components/Button/Button.tsx'], @@ -206,13 +195,11 @@ const manyCollections: ReviewState = { { title: 'Collection 01 — Button core', rationale: 'Base button stories and primary variants.', - kind: 'atomic', storyIds: ['button-component--base', 'button-component--variants', 'button-component--sizes'], }, { title: 'Collection 02 — Button details', rationale: 'Additional button states and icon usage.', - kind: 'atomic', storyIds: [ 'button-component--paddings', 'button-component--pseudo-states', @@ -222,7 +209,6 @@ const manyCollections: ReviewState = { { title: 'Collection 03 — Toggle and tabs', rationale: 'ToggleButton and tab view combinations.', - kind: 'consumer', storyIds: [ 'components-togglebutton--variants', 'components-togglebutton--sizes', @@ -232,7 +218,6 @@ const manyCollections: ReviewState = { { title: 'Collection 04 — Tabs and toolbar', rationale: 'Navigation/tab states with toolbar layouts.', - kind: 'consumer', storyIds: [ 'components-tabs--stateful-static', 'components-tabs--stateless-with-tools', @@ -242,7 +227,6 @@ const manyCollections: ReviewState = { { title: 'Collection 05 — Toolbar variants', rationale: 'Scrollable toolbar and abstract toolbar coverage.', - kind: 'consumer', storyIds: [ 'components-toolbar--scrollable', 'components-abstracttoolbar--basic', @@ -252,7 +236,6 @@ const manyCollections: ReviewState = { { title: 'Collection 06 — Surface primitives', rationale: 'Cards, bars, and collapsible primitives.', - kind: 'consumer', storyIds: [ 'components-card--default', 'components-bar-bar--default', @@ -262,7 +245,6 @@ const manyCollections: ReviewState = { { title: 'Collection 07 — Overlay modal', rationale: 'Modal base and interactive states.', - kind: 'consumer', storyIds: [ 'overlay-modal--base', 'overlay-modal--interactive-mouse', @@ -272,7 +254,6 @@ const manyCollections: ReviewState = { { title: 'Collection 08 — Overlay popover', rationale: 'Popover/chrome combinations and behavior.', - kind: 'consumer', storyIds: [ 'overlay-popover--with-chrome', 'overlay-popover--with-hide-button', @@ -282,13 +263,11 @@ const manyCollections: ReviewState = { { title: 'Collection 09 — Manager main', rationale: 'Main manager page states.', - kind: 'consumer', storyIds: ['manager-main--default', 'manager-main--about-page', 'manager-main--guide-page'], }, { title: 'Collection 10 — Manager settings', rationale: 'Settings pages and checklist entry points.', - kind: 'consumer', storyIds: [ 'manager-settings-aboutscreen--default', 'manager-settings-guidepage--default', @@ -298,7 +277,6 @@ const manyCollections: ReviewState = { { title: 'Collection 11 — Guide variants', rationale: 'Guide page variations for state coverage.', - kind: 'consumer', storyIds: [ 'manager-settings-guidepage--all-done', 'manager-settings-guidepage--ai-cta-open', @@ -308,7 +286,6 @@ const manyCollections: ReviewState = { { title: 'Collection 12 — Guide + freeze stories', rationale: 'Guide and freeze test stories.', - kind: 'consumer', storyIds: [ 'manager-settings-guidepage--ai-cta-done', 'manager-settings-freezebehavior--play-clicks-button', @@ -318,7 +295,6 @@ const manyCollections: ReviewState = { { title: 'Collection 13 — Freeze loop and sidebar', rationale: 'Freeze animation loop and basic sidebar states.', - kind: 'consumer', storyIds: [ 'manager-settings-freezebehavior--continuous-loop-and-animation', 'manager-sidebar-sidebar--simple', @@ -328,7 +304,6 @@ const manyCollections: ReviewState = { { title: 'Collection 14 — Sidebar status/search', rationale: 'Search and status-focused sidebar views.', - kind: 'consumer', storyIds: [ 'manager-sidebar-sidebar--statuses-open', 'manager-sidebar-sidebar--searching', @@ -338,7 +313,6 @@ const manyCollections: ReviewState = { { title: 'Collection 15 — Sidebar file search', rationale: 'Sidebar file-search specific components.', - kind: 'consumer', storyIds: [ 'manager-sidebar-filesearchmodal--default', 'manager-sidebar-filesearchlist--default', @@ -348,7 +322,6 @@ const manyCollections: ReviewState = { { title: 'Collection 16 — Menu and viewport', rationale: 'Menu variants and preview viewport panel.', - kind: 'transitive', storyIds: [ 'manager-container-menu--with-shortcuts-active', 'manager-components-preview-viewport--default', @@ -358,7 +331,6 @@ const manyCollections: ReviewState = { { title: 'Collection 17 — Docs preview blocks', rationale: 'Docs block preview stories with toolbar/code.', - kind: 'transitive', storyIds: [ 'addons-docs-blocks-components-preview--with-toolbar', 'addons-docs-blocks-components-preview--code-expanded', @@ -368,7 +340,6 @@ const manyCollections: ReviewState = { { title: 'Collection 18 — Bench + docs mix', rationale: 'Heavier analyzer story plus docs previews.', - kind: 'catch-all', storyIds: [ 'bench--es-build-analyzer', 'addons-docs-blocks-components-preview--with-toolbar', @@ -378,7 +349,6 @@ const manyCollections: ReviewState = { { title: 'Collection 19 — Cross-manager mix', rationale: 'Mixed manager states to create dense list.', - kind: 'catch-all', storyIds: [ 'manager-main--default', 'manager-settings-checklist--default', @@ -388,7 +358,6 @@ const manyCollections: ReviewState = { { title: 'Collection 20 — Large mixed tail', rationale: 'Final mixed collection to reach 20 groups.', - kind: 'catch-all', storyIds: [ 'components-tabs-tabsview--basic', 'manager-container-menu--with-shortcuts', diff --git a/code/core/src/shared/review/index.ts b/code/core/src/shared/review/index.ts index 7752ba4892d2..85b3bd03f8ec 100644 --- a/code/core/src/shared/review/index.ts +++ b/code/core/src/shared/review/index.ts @@ -1,2 +1,2 @@ export { REVIEW_EVENTS, REVIEW_NAMESPACE } from './events.ts'; -export type { CollectionKind, ReviewCollection, ReviewState } from './review-state.ts'; +export type { ReviewCollection, ReviewState } from './review-state.ts'; diff --git a/code/core/src/shared/review/review-state.ts b/code/core/src/shared/review/review-state.ts index ad7f25049dca..bd31b955ee0d 100644 --- a/code/core/src/shared/review/review-state.ts +++ b/code/core/src/shared/review/review-state.ts @@ -12,13 +12,10 @@ * `description` / `collections` in sync with that schema. */ -export type CollectionKind = 'atomic' | 'consumer' | 'transitive' | 'catch-all'; - export interface ReviewCollection { title: string; rationale: string; storyIds: string[]; - kind?: CollectionKind; } export interface ReviewState { diff --git a/code/core/src/types/modules/review.ts b/code/core/src/types/modules/review.ts index 0f32590c5643..ae7a7041491e 100644 --- a/code/core/src/types/modules/review.ts +++ b/code/core/src/types/modules/review.ts @@ -1,6 +1,2 @@ export { REVIEW_EVENTS, REVIEW_NAMESPACE } from '../../shared/review/events.ts'; -export type { - CollectionKind, - ReviewCollection, - ReviewState, -} from '../../shared/review/review-state.ts'; +export type { ReviewCollection, ReviewState } from '../../shared/review/review-state.ts'; diff --git a/code/package.json b/code/package.json index 548ac9815d6c..24aa1c5e6f33 100644 --- a/code/package.json +++ b/code/package.json @@ -56,7 +56,6 @@ "@storybook/addon-links": "workspace:*", "@storybook/addon-mcp": "*", "@storybook/addon-onboarding": "workspace:*", - "@storybook/addon-review": "workspace:*", "@storybook/addon-themes": "workspace:*", "@storybook/addon-vitest": "workspace:*", "@storybook/angular": "workspace:*", diff --git a/scripts/build/entry-configs.ts b/scripts/build/entry-configs.ts index 5db491697bc5..4d4a84fe2ee5 100644 --- a/scripts/build/entry-configs.ts +++ b/scripts/build/entry-configs.ts @@ -1,8 +1,6 @@ // @ts-ignore import a11yConfig from '../../../code/addons/a11y/build-config'; // @ts-ignore -import reviewConfig from '../../../code/addons/review/build-config'; -// @ts-ignore import docsConfig from '../../../code/addons/docs/build-config'; // @ts-ignore import linksConfig from '../../../code/addons/links/build-config'; @@ -93,7 +91,6 @@ export const buildEntries = { // addons '@storybook/addon-a11y': a11yConfig, - '@storybook/addon-review': reviewConfig, '@storybook/addon-docs': docsConfig, '@storybook/addon-links': linksConfig, '@storybook/addon-onboarding': onboardingConfig, diff --git a/scripts/display-review.ts b/scripts/display-review.ts index 67f339628f1c..5ef51ec43087 100644 --- a/scripts/display-review.ts +++ b/scripts/display-review.ts @@ -87,10 +87,10 @@ const BADGE_A11Y_REPORT: Array<{ importPaths: string[]; storyNames: string[] }> }, ]; -/** Review addon surfaces that render Badge for story status. */ +/** Review surfaces that render Badge for story status. */ const BADGE_REVIEW_SURFACES: Array<{ importPaths: string[]; storyNames: string[] }> = [ { - importPaths: ['./addons/review/src/ReviewToolbarHeader.stories.tsx'], + importPaths: ['./core/src/manager/components/review/ReviewToolbarHeader.stories.tsx'], storyNames: ['New Story'], }, ]; diff --git a/yarn.lock b/yarn.lock index 1470a2373010..42dcd5b0dde5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9240,19 +9240,6 @@ __metadata: languageName: unknown linkType: soft -"@storybook/addon-review@workspace:*, @storybook/addon-review@workspace:code/addons/review": - version: 0.0.0-use.local - resolution: "@storybook/addon-review@workspace:code/addons/review" - dependencies: - markdown-to-jsx: "npm:^7.7.2" - react: "npm:^18.2.0" - react-dom: "npm:^18.2.0" - typescript: "npm:^5.9.3" - peerDependencies: - storybook: "workspace:^" - languageName: unknown - linkType: soft - "@storybook/addon-themes@workspace:*, @storybook/addon-themes@workspace:code/addons/themes": version: 0.0.0-use.local resolution: "@storybook/addon-themes@workspace:code/addons/themes" @@ -9522,7 +9509,6 @@ __metadata: "@storybook/addon-links": "workspace:*" "@storybook/addon-mcp": "npm:*" "@storybook/addon-onboarding": "workspace:*" - "@storybook/addon-review": "workspace:*" "@storybook/addon-themes": "workspace:*" "@storybook/addon-vitest": "workspace:*" "@storybook/angular": "workspace:*"