Give the angular-vite sandbox app a build (browser) target whose styles
array and stylePreprocessorOptions.includePaths are load bearing for a
story's visuals: a banner stylesheet whose theme partial resolves only
through the inherited include path. Regressions in browserTarget option
handling now surface as a failed Storybook build or a Chromatic visual
diff.
Co-authored-by: Gert Hengeveld <gert@chromatic.com>
Allow required SB11 breaking-change labels as soon as the repository enters an 11.0 prerelease, while retaining minor and patch restrictions for later phases.
The Vitest 4 floor raise (#36164) obsoleted the dedicated Vitest 3
kitchen-sink variant. Remove the job definition and its registration
from the CircleCI config generator, and delete the
test-storybooks/portable-stories-kitchen-sink/react-vitest-3 template
that this job exclusively consumed.
Validated by regenerating all four CircleCI workflows (normal, merged,
daily, docs) before and after: normal/docs are byte-identical, merged/
daily differ only by the removed job, and tsc/oxlint/oxfmt are clean on
the touched files.
The `init-empty` and `init-empty-windows` CI jobs time out while
installing Playwright browser binaries with `--with-deps` (triggered
because `CI=true` is set). Their smoke tests run `npm run storybook
-- --smoke-test`, which doesn't require Playwright at all.
Add `STORYBOOK_CLI_SKIP_PLAYWRIGHT_INSTALLATION=true` to the
environment for `defineEmptyInitFlow` and `defineEmptyInitWindows`.
The existing `STORYBOOK_CLI_SKIP_PLAYWRIGHT_INSTALLATION` guard in
`AddonVitestService.ts` handles this cleanly.
`defineEmptyInitFeatures` is intentionally left unchanged: it runs
`npx vitest`, which requires Playwright browser binaries to be present.
AI-Generated: true
react-aria-components runs react-aria's private modules at runtime and
pins the exact versions it shipped with; those modules hold module-level
React contexts, so a second react-aria resolution forks them and RAC
components silently disconnect from ours. Root resolutions now pin
react-aria and react-stately to the exact versions react-aria-components
depends on, collapsing every dependent - our workspaces, RAC's pin, the
scoped shims, and any future transitive range - onto one copy at
resolution time.
A lockstep test guards the pins: it fails whenever the resolutions stop
matching the react-aria-components manifest (the packages are published
in lockstep, so upgrades bump all three together) or drift outside the
ranges code/core declares. With the invariant enforced structurally, the
PopoverProvider import comment and the lint-message warnings about
drifting copies no longer carry their weight.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSk2g5RrcpxacMMUTRv9HK
- Replaced `setFieldValue` with `set` in multiple migration scripts and tests for consistency.
- Updated the handling of config mutations to assert success after changes.
- Refactored tests to align with the new configuration structure and methods.
- Improved error handling for config mutations to provide clearer diagnostics.
- Adjusted the logic for managing `beforeEach` hooks and other parameters in preview configurations.
PR #36237 removed the PnP machinery itself; this sweeps the dead
scrubber entries it left behind:
- sanitize-published-sandbox: drop pnpFallbackMode from STRIP_KEYS and
.pnp.cjs/.pnp.loader.mjs from EXCLUDE_GLOBS (nothing generates those
artifacts now that sandboxes always use the node-modules linker)
- scripts/utils/yarn.ts: drop `pnpFallbackMode none` from
configureYarn2ForVerdaccio (a PnP-only setting next to an
unconditional node-modules linker)
- update the integrity tests asserting the exact key/glob sets
Verified: git grep -i -P 'pnp(?!m)' over scripts/ is empty;
sanitize-published-sandbox.test.ts and yarn.test.ts suites pass.
- delete test-storybooks-pnp CI job referencing the removed fixture
- Yarn scaffolds now explicitly set nodeLinker node-modules (pnp is the Yarn default)
- drop dead usePnp field, .pnp.cjs NODE_OPTIONS hook, sandbox pnp option, and its always-true guard
- resolve SB11 PnP TODOs and reword stale comment-only mentions
Remove @storybook/preset-create-react-app end to end: the package itself,
its workspace dependency and lockfile entries, the react-webpack CRA glue
(cra-config, framework-preset-cra, the default preset-cra addon entry and
its package export), and the builder-webpack5 special case that skipped
default webpack config when the CRA preset was present.
CRA projects now get a dedicated init error instead of a scaffoldable
generator (follow-up commit); the telemetry react-scripts mapping stays.
With the shared surface reduced to a single gh wrapper, a workspace
package no longer earns its keep. scripts/utils returns to being plain
internal code of @storybook/scripts (gh.ts stays there for
collect-pr-data), and agent-eval's results downloader gets its
self-contained gh wrapper back, matching that script's zero-dependency
design.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0122Na2V3ursCnPqLm2aKZKA
Four hand-rolled ANSI regexes (node-logger's wrap-utils and its test
helper, npm-registry, agent-eval's runner-output parsing) and the
ansi-regex test dependency all collapse onto the node:util builtin —
the very replacement the depend/ban-dependencies lint rule prescribes
for strip-ansi. Verified a superset of the local regexes on wrap-utils'
own OSC-8 hyperlink sequences. The shared ansi.ts helper becomes
unnecessary and is deleted; the two table renderers measure width via
the builtin directly. The strip-ansi package remains only in core's
component-testing, which runs in the browser where node:util does not
exist.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0122Na2V3ursCnPqLm2aKZKA
Per-symbol accounting of what the consolidation actually shares:
only the gh CLI wrapper (collect-pr-data + agent-eval's results
downloader) and the ANSI helpers stripAnsi/visibleLength (npm-registry
and eval's formatTable on one side, agent-eval's table and runner-output
parsing on the other) have users in both packages. Those stay, the
strip helpers now as ansi.ts.
Everything single-sided moves back to its user: the picocolors styling,
box table and math helpers return to agent-eval/lib/utils, and
scripts/eval's formatTable returns to its lib/utils.ts, rebuilt on the
shared visibleLength instead of a private stripAnsi.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0122Na2V3ursCnPqLm2aKZKA
The scripts-utils packagization exists for consumers outside
@storybook/scripts (agent-eval); within scripts the relative imports
were fine as they were, so the codemod is reverted and the now-unused
workspace dependency dropped. Only the helpers scripts newly adopted
(gh, colors, table) reference utils files added by the consolidation.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0122Na2V3ursCnPqLm2aKZKA
scripts/utils becomes @storybook/scripts-utils, the single home for
helpers both the build scripts and the eval harnesses need. Its files
stay put; the ~60 importers inside @storybook/scripts switch to the
package specifier, and agent-eval depends on it as a workspace package.
Centralised into it:
- colors.ts (picocolors-backed styling, stripAnsi, visibleLength) —
replaces agent-eval's copy, scripts/eval's stripAnsi and the one in
scripts/release/npm-registry.ts
- table.ts — agent-eval's box renderer plus formatPlainTable, the
renamed scripts/eval formatTable, now sharing one width computation
- math.ts — the eval stats helpers, unchanged
- gh.ts — one GitHub CLI exec wrapper behind scripts/eval's
collect-pr-data helpers and agent-eval's results downloader
Also drops the stale agent-eval/typescript entry from the ecosystem-ci
resolutions snapshot, left behind by the version alignment.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0122Na2V3ursCnPqLm2aKZKA
Restores the pre-existing top-level location (relocating it under
code/lib turned out to conflict with a prior requirement). The utils
package stays nested, now at agent-eval/utils. Reverses the path
fallout of the earlier move: workspace and vitest registration, workflow
and CircleCI paths, REPO_ROOT-derived paths, tsconfig mappings, and the
code-scope lint/knip config that no longer applies outside code/.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0122Na2V3ursCnPqLm2aKZKA
agent-eval moves from the repo root to code/lib/agent-eval, and
@storybook/agent-eval-utils from code/lib/agent-eval-utils to
code/lib/agent-eval/utils (registered explicitly in the workspace list,
since code/lib/* does not match a nested package).
Path fallout: workspace and vitest project registration collapse into the
existing code/lib globs; oxfmt/oxlint ignores anchor on **/agent-eval/;
the eval workflows, CircleCI job config and Vercel CLI calls point at the
new location; REPO_ROOT-derived paths in templates.ts, compare-results
and the misuse panel climb three levels instead of one; tsconfig paths
and the vitest alias resolve @storybook/mcp and the utils package
relative to code/lib.
Now that the tree sits inside code/'s lint scope, the code oxlint config
treats eval fixture stories like other fixture stories (renderer-package
and import-extension rules off for evals/, templates/ ignored), the app
route shims skip import extensions for the vendored @/ alias, and the
root .mjs override ignores bare package specifiers. Knip gets a
workspace entry scoping analysis to harness code rather than sandbox
fixtures.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0122Na2V3ursCnPqLm2aKZKA
- generate-types.ts: on d.ts timeout, no longer resolve the race right
after kill('SIGTERM') - the exit/close listeners settle it once the
child has actually terminated, so a retry can never overlap a process
that is still writing .d.ts files; escalate to SIGKILL after 5s if
SIGTERM is ignored (CodeRabbit).
- PropertyExtractor.test.ts: configure the console.warn mock inside
beforeEach per repo Vitest guidelines (CodeRabbit nitpick).
- PropertyExtractor.ts: tighten the deprecation warning copy - merge the
duplicated found/removed lines, capitalize the bullet actions, and
normalize 'animate.enter'/'animate.leave' spacing (advisor review).
- Docs snippet: same slash-spacing normalization in the note comment.
Collapse the postinstall template matrix to vitest.config.4.template, drop the workspace-file merge path (updateWorkspaceFile) and workspace template, always reference setup-file.browser.4, remove the Vitest-3 server branch and vitest.workspace discovery probes, and drop the deprecated @vitest/browser/context console suppression. Remove the setup-file.browser.3 shim, its export/build-config/optimizeDeps entries, and the stale Vitest 3 doc tabs.
ChildProcess.kill takes a signal name or number, not an exit code;
kill(408) throws ERR_UNKNOWN_SIGNAL inside the timeout callback and
crashes the entire build instead of reaching the dts retry logic just
below. Send SIGTERM so a timed-out entry is retried as intended.
The unscoped package now lives in the monorepo and is already on the public registry at 10.6.0-alpha.7, so sandbox publishes 409 unless it is on the same no-proxy list as the other local Storybook packages.