Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
124 commits
Select commit Hold shift + click to select a range
72052ef
initial v9 branch commit. setup temp app for testing with yarn constr…
cb-ekuersch Jan 26, 2026
af65e3a
React 19 & CMR v7 (#350)
cb-ekuersch Feb 10, 2026
4189185
Merge remote-tracking branch 'origin/master' into cds-v9
cb-ekuersch Feb 10, 2026
82ebc15
fix: lint and typecheck issue (#389)
haoruikun-cb Feb 12, 2026
5f63387
Merge remote-tracking branch 'origin/master' into cds-v9
cb-ekuersch Feb 12, 2026
c47c886
feat: Partial application of theme vars (#391)
cb-ekuersch Feb 12, 2026
61b830d
Merge remote-tracking branch 'origin/master' into cds-v9
cb-ekuersch Feb 12, 2026
cac94ed
chore: dedupe
cb-ekuersch Feb 12, 2026
d87f722
chore: expclude new expo app from build task in CI
cb-ekuersch Feb 12, 2026
642fac0
Merge remote-tracking branch 'origin/master' into cds-v9
cb-ekuersch Feb 12, 2026
69ad7f6
Harryhao/cds 1513 consolidate listcell border props (#352)
haoruikun-cb Feb 12, 2026
5310927
Merge remote-tracking branch 'origin/master' into cds-v9
cb-ekuersch Feb 13, 2026
6a11ffd
Merge branch 'master' into hunter/v9-master-feb-18
hcopp Feb 18, 2026
82dc77e
Merge pull request #404 from coinbase/hunter/v9-master-feb-18
hcopp Feb 18, 2026
8f6a31b
Merge branch 'master' into cds-v9
cb-ekuersch Feb 18, 2026
2474ee0
feat: deprecate individual Text components and add default a11yRole f…
haoruikun-cb Feb 20, 2026
0118b5b
feat(CDS-1612) implement the button variant change (#407)
haoruikun-cb Feb 20, 2026
8c2c1da
Harryhao/cds 1268 shorten interactable css variables (#410)
haoruikun-cb Feb 20, 2026
b48ec52
chore: Remove fixed dimensions (#398)
cb-ekuersch Feb 22, 2026
0e206e9
Merge remote-tracking branch 'origin/master' into cds-v9
cb-ekuersch Feb 22, 2026
df03dec
chore: fix resize regression in select dropdown after recent changes …
cb-ekuersch Feb 22, 2026
b12cf83
fix: layout issue with Toast - use safe area insets to avoid bottom n…
cb-ekuersch Feb 22, 2026
f606fe2
fix: lint error for previous mobile Toast component changes
cb-ekuersch Feb 22, 2026
f304449
chore: update restricted imports to prevent using React 19 features
cb-ekuersch Feb 23, 2026
d57b21b
fix: restricted React imports (new eslint rule in prev. commit) in mo…
cb-ekuersch Feb 23, 2026
a8d9ea3
chore: update versions for v9 (#406)
hcopp Feb 23, 2026
8ef8d8f
chore: carousel v9 updates (#420)
hcopp Feb 23, 2026
65ed4bc
chore: adjust alert spacing to match latest design (#425)
hcopp Feb 24, 2026
c92aa6e
feat: migrate Stepper from React Spring to Framer Motion (#424)
adrienzheng-cb Feb 25, 2026
f22ab56
chore: merge master into v9 branch (#436)
adrienzheng-cb Feb 25, 2026
e25d761
fix: mobile running issue (#442)
haoruikun-cb Feb 25, 2026
2591612
chore: remove common deps on react-native/floating-ui (#447)
adrienzheng-cb Feb 26, 2026
7f37fe5
feat(CDS-1634): mobile Select/Combobox in new tray (#448)
haoruikun-cb Feb 26, 2026
87c685a
chore: merge master into cds-v9 (#450)
hcopp Feb 27, 2026
bea8fe5
chore: Remove React Spring from SlideButton APIs (#419)
cb-ekuersch Feb 27, 2026
c094094
Drop PopperJS in favor of Floating UI (#418)
cb-ekuersch Feb 27, 2026
3aaba52
Merge branch 'master' into cds-v9
hcopp Feb 27, 2026
d6681bf
Fix changelog
hcopp Feb 27, 2026
6803220
Merge pull request #454 from coinbase/hunter/cds-v9-merge-no-squash
hcopp Feb 27, 2026
0fe118e
feat(cds 1615) deprecate dangerouslySetBackground/dangerouslySetColor…
haoruikun-cb Feb 27, 2026
56e93e5
feat: Avatar name variant fixes (#443)
haoruikun-cb Mar 3, 2026
6492ecd
Merge remote-tracking branch 'origin/master' into cds-v9
cb-ekuersch Mar 4, 2026
21fdb27
fix: stabilize SegmentedTabs test environment by providing explicit i…
haoruikun-cb Mar 4, 2026
5182c33
refactor(CDS-828): refactor components with conditional wrapper (#441)
haoruikun-cb Mar 5, 2026
10c8919
feat: support foregroundMuted but mark it as deprecated (#471)
haoruikun-cb Mar 5, 2026
4d5fd81
Merge branch 'master' into cds-v9
cb-ekuersch Mar 5, 2026
843fcc5
Merge branch 'master' into cds-v9
adrienzheng-cb Mar 6, 2026
db3163e
fix: transition test (#475)
adrienzheng-cb Mar 6, 2026
0215217
feat: set up open source migrator package (#390)
adrienzheng-cb Mar 6, 2026
74f7e41
fix: address test-expo build failure (#479)
haoruikun-cb Mar 6, 2026
6721524
feat: restore paginationVariant in Carousel and marked it as deprecat…
haoruikun-cb Mar 6, 2026
7022b58
Merge branch 'master' into cds-v9
cb-ekuersch Mar 9, 2026
761f262
Merge branch 'master' into cds-v9
cb-ekuersch Mar 9, 2026
7f08983
feat: restore breaking changes in v9 and use deprecation instead (#480)
haoruikun-cb Mar 9, 2026
e63ca6d
feat: spread props last eslint (#485)
hcopp Mar 9, 2026
e7f8991
Merge branch 'master' into v9-merge-master-03-10
adrienzheng-cb Mar 10, 2026
65d5344
lint + test fix
adrienzheng-cb Mar 10, 2026
53a7825
Merge pull request #489 from coinbase/v9-merge-master-03-10
adrienzheng-cb Mar 10, 2026
46dd4e2
Merge remote-tracking branch 'origin/master' into cds-v9
cb-ekuersch Mar 11, 2026
fb66e62
chore: deprecate cross-platform layout types, use platform-specific t…
adrienzheng-cb Mar 11, 2026
5f2e988
chore: deprecate select-related components
adrienzheng-cb Mar 12, 2026
2a3bc9d
minor fix
adrienzheng-cb Mar 13, 2026
8be8b27
Merge pull request #490 from coinbase/adrien/remove-dimension-value
adrienzheng-cb Mar 13, 2026
7b81d40
Merge remote-tracking branch 'origin/master' into cds-v9
cb-ekuersch Mar 13, 2026
0132915
chore: prevent stetching on mobile IconButton and update Button docs …
cb-ekuersch Mar 15, 2026
e5a6a18
chore: Add IconButton's padding logic to LikeButton for easier positi…
cb-ekuersch Mar 15, 2026
2d732c7
Merge branch 'cds-v9' into adrien/deprecate-select
adrienzheng-cb Mar 16, 2026
e2f0e04
update jsdocs
adrienzheng-cb Mar 16, 2026
071dacf
Merge pull request #497 from coinbase/adrien/deprecate-select
adrienzheng-cb Mar 16, 2026
2128176
chore: merge master into cds-v9 (#514)
hcopp Mar 17, 2026
36bb38c
Merge branch 'master' into cds-v9
cb-ekuersch Mar 20, 2026
5233f2f
Merge remote-tracking branch 'origin/master' into cds-v9
adrienzheng-cb Mar 22, 2026
5bd5fcd
Merge branch 'master' into cds-v9
cb-ekuersch Mar 23, 2026
0963a4c
fix: mobile test & doc metadata (#532)
adrienzheng-cb Mar 23, 2026
c6a91eb
fix: remove last couple of Dimension value. (#530)
adrienzheng-cb Mar 24, 2026
1a947ce
Merge branch 'master' into cds-v9
cb-ekuersch Mar 25, 2026
1cb54f9
feat (CDS-1613): button variant migrator (#544)
haoruikun-cb Mar 25, 2026
5d19725
fix: tab navigation deprecation (#548)
haoruikun-cb Mar 25, 2026
1fe93bd
Merge branch 'master' into cds-v9
cb-ekuersch Mar 27, 2026
01398d6
chore: rework mobile visreg to run on new expo app set up to run cds …
cb-ekuersch Mar 27, 2026
8afa010
Merge branch 'master' into cds-v9
cb-ekuersch Mar 28, 2026
42b04c8
Merge remote-tracking branch 'origin/master' into cds-v9
cb-ekuersch Mar 29, 2026
083ad14
fix: restore renamed props and constants. (#547)
adrienzheng-cb Mar 30, 2026
89c5bcb
chore: merge master (#564)
adrienzheng-cb Mar 30, 2026
5b4d737
chore: deprecate visualization packages (#567)
cb-ekuersch Apr 1, 2026
162aba4
feat: add transform for useMergerefs (#531)
adrienzheng-cb Apr 1, 2026
e2248eb
Merge remote-tracking branch 'origin/master' into cds-v9
cb-ekuersch Apr 2, 2026
3b7ed32
feat: add agent skill to write jscodeshift transform (#580)
adrienzheng-cb Apr 2, 2026
d8cdb0b
chore: yarn dedupe and fix lint erorrs
cb-ekuersch Apr 2, 2026
d37a3b3
chore: remove mobile-app and ui-mobile-playground, adopt test-expo (#…
cb-ekuersch Apr 2, 2026
b9383d0
feat: add migration script for layout types (#587)
adrienzheng-cb Apr 10, 2026
4b765ff
Merge remote-tracking branch 'origin/master' into cds-v9-master
cb-ekuersch Apr 13, 2026
0692fb7
chore: lint fix for mobile
cb-ekuersch Apr 13, 2026
6de4f93
Merge remote-tracking branch 'origin/master' into cds-v9-master
cb-ekuersch Apr 13, 2026
f17592e
chore: [CDS-1896] Drop unused deprecations (#614)
cb-ekuersch Apr 13, 2026
87142bb
changes
adrienzheng-cb Apr 15, 2026
43d457d
undo the accident push
adrienzheng-cb Apr 17, 2026
41b647d
fix: missing padding start on alpha select carent element (#624)
cb-ekuersch Apr 17, 2026
451a053
feat: add migrate-visualization-imports codemod (#626)
adrienzheng-cb Apr 21, 2026
a15cd7b
chore: merge master into cds-v9-master (04-21)
adrienzheng-cb Apr 21, 2026
032acb5
format + lint
adrienzheng-cb Apr 21, 2026
5ba0bed
Merge pull request #634 from coinbase/adrien/merge-master-04-21
adrienzheng-cb Apr 21, 2026
e9607e4
fix: configure dotted area to use mask (#638)
hcopp Apr 23, 2026
3816486
Merge branch 'master' into cds-v9-master
cb-ekuersch Apr 23, 2026
215e5bf
fix: chart issues with v9 dependencies (#644)
hcopp Apr 27, 2026
b541b39
feat: add migrate-interactable-css-vars codemods for v8→v9 (#627)
adrienzheng-cb Apr 28, 2026
ad6824c
feat: add codemod for v9 ThemeProvider (#622)
adrienzheng-cb Apr 28, 2026
79004dc
Merge remote-tracking branch 'origin/master' into cds-v9-master
cb-ekuersch Apr 28, 2026
09b8a67
Merge branch 'master' into cds-v9-master
cb-ekuersch Apr 29, 2026
4a36db8
chore: prepare release candidates (#653)
cb-ekuersch Apr 29, 2026
af4bc82
fix: defer initial path-morph kickoff to fix invisible bars on mount …
adrienzheng-cb Apr 30, 2026
c8f5732
chore: prepare cds-migrator for npm publishing (#656)
adrienzheng-cb Apr 30, 2026
fa4ee7a
Merge branch 'master' into cds-v9-master
cb-ekuersch May 12, 2026
82bc40e
fix: type discrepancy in deprecated TabbedChips component
cb-ekuersch May 13, 2026
dd46a8a
chore: merge master (#689)
adrienzheng-cb May 15, 2026
847b915
chore: prepare for final v9 release (#697)
cb-ekuersch May 20, 2026
aec6796
feat(migrator): add import rewrite support for wrapper packages (#701)
adrienzheng-cb May 20, 2026
006fb38
chore: deprecate web checkbox group (#704)
adrienzheng-cb May 20, 2026
82ae267
chore: merge master into v9 (#705)
cb-ekuersch May 20, 2026
68dd1dc
Merge branch 'master' into cds-v9-master
cb-ekuersch May 20, 2026
626120d
fix changelogs and yarn
cb-ekuersch May 20, 2026
41d00b4
remove misplaced gradient unit test after merging master
cb-ekuersch May 20, 2026
a4c7fb4
Fix visreg issues (#710)
cb-ekuersch May 21, 2026
1fdc8ec
fix: remove alignSelf from mobile Button (#711)
adrienzheng-cb May 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
161 changes: 161 additions & 0 deletions .claude/skills/cds-migrator-transform/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
---
name: cds-migrator-transform
description: |
Use when a CDS change in **cds-web**, **cds-common**, **cds-mobile**, **web-visualization**, or
**mobile-visualization** needs a **jscodeshift** migration in `packages/migrator` to update callers or
mitigate breaking API or import moves (add or change a transform, tests, or preset entry).
allowed-tools: Read, Grep, Glob, StrReplace, Bash(yarn nx run:*), call_mcp_tool
argument-hint: '<symbol or API change> — <target behavior> — [preset or standalone] — [web|mobile|both] — [optional: Sourcegraph scope / repos / queries the user supplies]'
---

# CDS migrator transform (jscodeshift)

Adds or updates a **jscodeshift** transform under `packages/migrator/src/transforms/`.

**Where to put files** is **not** always a “version” folder. Choose a subdirectory (or root) that fits the work:

- **Major / preset migrations** often use a version-style folder (`v9/`, `v10/`, …) aligned with a preset such as `v8-to-v9`.
- **Other codemods** (rename, internal API move, one-off cleanup) can live under any clear grouping the team agrees on (`v9/` still, a feature folder, or directly under `transforms/`).

Follow the steps in order unless the user already locked scope.

## Prerequisites

- **Nx + yarn**: run migrator commands as `yarn nx run migrator:<target>` (see repo `AGENTS.md`).
- **Sourcegraph MCP (strongly recommended)**: Before calling Sourcegraph tools, read the tool schema under `mcps/user-sourcegraph/tools/` (e.g. `sourcegraph_search.json`, `sourcegraph_fetch_file.json`). If Sourcegraph is not configured, tell the user to add the **Sourcegraph** MCP server in Cursor MCP settings and authenticate if required, then continue with workspace `grep` or whatever source the user provides. **Do not invent search queries or repo filters in this skill**—use the symbols, repositories, queries, or links the **user** gives you; if they omitted search context, ask what to search before assuming scope.

---

## 1 — Define the migration

Capture explicitly:

1. **Symbol(s)** to migrate (export name, import path, prop name, type name, etc.).
2. **Desired outcome**: rename, change import path/module, replace expression, map enum/string values, add local type alias, etc.
3. **Preset (if any) and on-disk location**: whether this ships in a preset (`packages/migrator/src/presets/<preset>/manifest.json`) or runs **only via `-t <name>`** without a preset entry. Pick the directory under `transforms/` for the new files (versioned `v9/` / `v10/`, or another name, or `transforms/` root). **Align the manifest `file` field with that path** when you add an entry (see step 7).

If anything is ambiguous, ask the user before coding.

---

## 2 — Platform scope: one transform or two?

1. **Web-only** (e.g. CSS, DOM, `@coinbase/cds-web`): single transform, typically under `transforms/<subdir>/<name>-web.ts` or a neutral name if only web is affected.
2. **Mobile-only** (e.g. React Native, `@coinbase/cds-mobile`): single transform for mobile.
3. **Both** with **different** replacement rules (e.g. `DimensionValue` → web local alias vs RN import): **two** transforms (`…-web.ts`, `…-mobile.ts`).
4. **Both** with **identical** AST changes: one transform is enough.

Document in the transform file header **what** is migrated and **what is not** (re-exports, `require`, dynamic import, etc.).

---

## 3 — Research usage (Sourcegraph + repo)

1. **Inputs from the user**: They should supply what to look for—symbol names, old/new APIs, repos or orgs to include, example file paths, or concrete Sourcegraph queries. **Follow that source of truth**; do not rely on fixed query templates in this skill.
2. **Sourcegraph MCP**: Run searches and fetches using the user’s queries and scope. Read MCP tool schemas first. Use `sourcegraph_fetch_file` when line previews are not enough.
3. **This monorepo**: Supplement with `grep` / `Glob` under `packages/` when the migration touches CDS itself or when the user asks for in-repo usage.

Record a short list of **patterns you actually saw** in the results (import style, re-exports, edge cases)—derived from discovery, not from a checklist in this doc.

**OSS hygiene**: Research may reference internal repos or paths. Anything **committed** to this repo (fixtures, test comments, JSDoc) must stay **generic**: neutral component names, no internal hostnames or file paths, no product codenames. Describe fixtures as “representative pattern” or “composite example” only—see §6.

---

## 4 — Case matrix and user confirmation

From research, build a table:

| Case | Example | Automate in codemod? | If not: strategy |
| ---- | ------- | -------------------- | ------------------------------ |
| … | … | Yes / No | TODO comment / skip / doc only |

**Stop and confirm with the user** which rows to automate vs leave manual/TODO-only before implementing non-trivial logic. Call out gaps that **their** search surfaced but the AST transform will not handle (re-exports, dynamic imports, etc., as applicable).

---

## 5 — Implement transforms

**Location**: `packages/migrator/src/transforms/<subdir>/<name>.ts`, or `transforms/<name>.ts` at the transforms root. The manifest `file` value (when used) must be the path **relative to `transforms/`** without extension, e.g. `v9/my-transform`, `v10/my-transform`, or `my-oneoff/my-transform`.

**Patterns**:

- Default export: `export default function transformer(file, api, options)` (required by jscodeshift; `no-restricted-exports` is off for `packages/migrator/src/transforms/**/*.ts` in root `eslint.config.mjs`).
- Import **`transformLogger`**, **`addTodoComment`**, **`hasMigrationTodo`** from `transform-utils`. Typical depths: **`../../utils/transform-utils`** from `transforms/<subdir>/<name>.ts`; **`../utils/transform-utils`** from `transforms/<name>.ts`. If you nest deeper under `transforms/`, add one `../` per extra level.
- **Package scope from jscodeshift `options`**: When matching or rewriting **`@<scope>/cds-…`** import paths, use **`getPackageScopeFromOptions(options)`** from **`../../utils/package-scope`** (same depth pattern as `transform-utils`). The cds-migrator CLI forwards **`--packageScope`** / **`-ps`** into `options.packageScope` (`coinbase` or `@coinbase` both normalize to `@coinbase`). **If set**, only rewrite modules under that scope; **if omitted**, match any scope (e.g. regex like `@…/cds-common/…`). State this in the transform’s file header so consumers know they can narrow runs. Reference: `packages/migrator/src/transforms/v9/migrate-use-merge-refs.ts` and `packages/migrator/src/utils/package-scope.ts`.
- **Import mappings from jscodeshift `options`**: When a transform matches imports by their source path, **apply import mappings before running the regex** so that consumers who proxy CDS through a wrapper package (e.g. `@acme/shared/cds → @coinbase/cds-web`) are also covered. Use **`getImportMappingsFromOptions(options)`** and **`applyImportMappings(src, rewrites)`** from **`../../utils/import-mapping`** (same depth pattern as `transform-utils`). The CLI passes mappings via **`--import-mapping '<from>=<to>'`** (repeatable flag) or via a **`cds-migrator.config.json`** file at the repo root / target path (`"importMappings": [{ "from": "...", "to": "..." }]`); CLI values win on conflicts. Apply the rewrite only for **matching**—never mutate the actual `source.value` in the AST unless the transform is explicitly rewriting import paths. Reference: `packages/migrator/src/transforms/v9/button-variant-values.ts` and `packages/migrator/src/utils/import-mapping.ts`.
- Prefer **constants** and small helpers in the transform file. Use **`packages/migrator/src/utils/`** for shared plumbing (logging, package scope, import mappings, import helpers); keep **migration-specific** rules and rewrites in the transform itself rather than in extra modules that only exist to share logic between codemods.
- **Idempotency**: second run should no-op when migration is complete.
- **TODO path**: for dynamic or ambiguous AST, insert a standard CDS migration TODO via `addTodoComment` and log with `transformLogger.warn`.

Reference examples in-repo: `transforms/v9/` (`migrate-use-merge-refs.ts`, `button-variant-values.ts`, `migrate-layout-types-*.ts`).

---

## 6 — Tests and fixtures

**Goal**: exhaustive **behavior** coverage with **minimal** on-disk goldens. Follow what `transforms/v9/__tests__/` does today.

### Inline-first (default)

1. **Test file**: `packages/migrator/src/transforms/<subdir>/__tests__/<name>.test.ts`.
2. **Most cases** live **inline** as string sources. Prefer **`runInlineTest(transform, options, { path: '…', source: \`…\` }, expectedString, tsxTestOptions)`** from **`jscodeshift/src/testUtils`** for the full transformed output (or **`''`** when the codemod should no-op). Avoid **`applyTransform`** + fragment `expect`s unless there is a rare reason not to pin an exact golden.
3. **Imports**: **`tsxTestOptions`** from **`../../../test-utils/codemodTestUtils`** (path depth matches one `__tests__/` folder under `transforms/<subdir>/`). That module currently exports only **`tsxTestOptions`** (`{ parser: 'tsx' }`).
4. Mock **`console.log` / `console.warn`** when transforms log during tests (see existing v9 tests).

Cover: patterns from the user’s research, **idempotency**, **no-op** when nothing migrates, **scope-aware** behavior (`packageScope` / `-ps`) via `runInlineTest(transform, { packageScope: '@coinbase' }, …)`.

### Paired file fixtures (sparingly)

Use **at most one or two** paired **`foo.input.tsx` / `foo.output.tsx`** per transform suite for **larger composite** examples (multi-import layouts, full component excerpts). Everything else stays inline.

1. **Directory**: `packages/migrator/src/transforms/<subdir>/__testfixtures__/<suite-name>/` (e.g. `<suite-name>` matches the transform id: `button-variant-values`, `migrate-use-merge-refs`).
2. **Run paired tests** with **`runTest(__dirname, '<transform-name>', {}, '<suite-name>/<base>', tsxTestOptions)`** — the prefix is **`suite-folder/base`** without extension.
3. **List E2E cases explicitly** in the test file, e.g. `const E2E_PAIRED_PREFIXES = ['button-variant-values/e2e-survey-confirmation-panel', …] as const` and **`it.each(E2E_PAIRED_PREFIXES)('%s', (prefix) => { runTest(…); })`**. Do not assume a filesystem discovery helper exists.

### OSS-safe comments

- Fixture files and test JSDoc must **not** cite internal hosts, confidential repos, real consumer file paths, or product-specific component names used in research.
- Prefer short comments like **“Representative pattern: …”** or **“Composite … props”** and **fictional** export names (`SurveyConfirmationPanel`, `ChatToolbarActions`, not internal codenames).
- Sourcegraph remains valuable **during development**; keep findings out of committed strings unless they are already public (e.g. this monorepo).

### Prettier

**`__testfixtures__` is in `.prettierignore`**—golden outputs must match the codemod’s **`toSource()`** exactly.

**Run until green**:

```bash
yarn nx run migrator:test --testPathPattern='<your-test-pattern>'
yarn nx run migrator:typecheck
yarn nx format:write --projects=migrator
# or format only non-fixture sources, e.g.:
# yarn nx format:write --files=<changed files excluding __testfixtures__>
yarn nx run migrator:lint
```

Reference tests: `transforms/v9/__tests__/button-variant-values.test.ts`, `migrate-use-merge-refs.test.ts`, `migrate-layout-types-web.test.ts`, `migrate-layout-types-mobile.test.ts`.

---

## 7 — Preset manifest

**Only if** this codemod should appear in a preset (major upgrade bundle, curated migration set, etc.): add an entry to `packages/migrator/src/presets/<preset>/manifest.json`:

- **`name`**: stable CLI identifier.
- **`description`**: short, user-facing.
- **`file`**: path relative to `transforms/` without extension—must match where the file actually lives (e.g. `v9/my-transform`, `v10/my-transform`, or `some-group/my-transform`).

**Non-version / standalone codemods** may **omit** the preset entirely and still be run with the migrator CLI (e.g. `-t <name>`). See `packages/migrator/docs/PRESETS_AND_TRANSFORMS.md`. If omitted from any preset, say so in the PR/summary.

---

## Checklist (before finishing)

- [ ] User confirmed automatable vs manual cases.
- [ ] Web/mobile split matches real replacement behavior.
- [ ] Coverage matches **sources, scopes, and cases** the user specified (anything out of scope is documented).
- [ ] Tests: **inline cases** for edges + **0–2** paired E2E fixtures; **OSS-safe** names/comments; `migrator:test`, `migrator:lint`, and `migrator:typecheck` pass; formatting applied (non-fixture sources as needed).
- [ ] If the transform is preset-backed: manifest entry added and `file` matches the real path under `transforms/` (no mismatch between folder name and `file`). If standalone: team knows how to invoke it (CLI / docs).
- [ ] Transform header documents limitations (`export … from`, `require`, dynamic import, etc.).
- [ ] If the transform is **scope-aware**: behavior with and without `options.packageScope` / CLI `-ps` is documented and covered by tests where relevant.
- [ ] If the transform **matches import paths**: `applyImportMappings` is called before the regex so wrapper/re-exporting packages are handled; behavior with and without `--import-mapping` / `cds-migrator.config.json` is documented and covered by tests where relevant.
2 changes: 0 additions & 2 deletions .claude/skills/components.styles/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ Find the component source file:
```bash
packages/web/src/[source-category]/[ComponentName].tsx # for web
packages/mobile/src/[source-category]/[ComponentName].tsx # for mobile
packages/web-visualization/src/[source-category]/[ComponentName].tsx # for web visualization
packages/mobile-visualization/src/[source-category]/[ComponentName].tsx # for mobile visualization
```

## Step 2: Evaluate Component Structure
Expand Down
6 changes: 0 additions & 6 deletions .claude/skills/components.write-docs/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,6 @@ packages/web/src/[source-category]/[ComponentName].tsx # for web
packages/mobile/src/[source-category]/[ComponentName].tsx # for mobile
```

Also check visualization packages if applicable:

- `packages/web-visualization/src/...`
- `packages/mobile-visualization/src/...`

Also check for Storybook stories (`packages/*/src/**/__stories__/[ComponentName].stories.tsx`). If one exists, add the `storybook` field to webMetadata.json.

### Check for Styles
Expand Down Expand Up @@ -684,4 +679,3 @@ Before completing, verify:
3. Ensure all examples work and have proper code snippets
4. Include accessibility section with specific examples
5. Test all examples and props tables render correctly
6. For visualization components, use paths like `web-visualization` or `mobile-visualization` instead of `web` or `mobile`
7 changes: 3 additions & 4 deletions .claude/skills/deprecate-cds-api/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ argument-hint: '<SymbolName or path> — replacement — [@deprecationExpectedRe

# Deprecate CDS public API

Automate the standard CDS deprecation workflow for symbols exported from `packages/web`, `packages/mobile`, `packages/common`, `packages/web-visualization`, or `packages/mobile-visualization`.
Automate the standard CDS deprecation workflow for symbols exported from `packages/web`, `packages/mobile`, or `packages/common`.

## Inputs to confirm first

Expand All @@ -28,7 +28,7 @@ Automate the standard CDS deprecation workflow for symbols exported from `packag

**Deprecate the symbol everywhere it is publicly reachable**, not only where it is first implemented.

1. For each CDS package (`web`, `mobile`, `common`, `web-visualization`, `mobile-visualization`), trace the symbol from that package’s `package.json` **`exports`** map → barrel / `index` files → the module that declares or re-exports the symbol.
1. For each CDS package (`web`, `mobile`, `common`), trace the symbol from that package’s `package.json` **`exports`** map → barrel / `index` files → the module that declares or re-exports the symbol.
2. **`Grep`** for the symbol name under `packages/<name>/src` (e.g. `export { Foo`, `export * from`, `Foo as`) to catch re-exports and alternate entry paths.
3. **Every** package that publicly exports the symbol must end up with deprecation coverage: primary implementation **and** any re-export site where your tooling or consumers would not see JSDoc from the source file (add JSDoc on the re-export line or duplicate the tags as needed so imports from `@coinbase/cds-web`, `@coinbase/cds-mobile`, `@coinbase/cds-common`, etc. all surface the deprecation).

Expand Down Expand Up @@ -69,7 +69,6 @@ The tag must satisfy `@deprecationExpectedRemoval v…` as enforced by ESLint (e
1. **Confirm with the user** which major **`N`** to use, unless they already specified it in **Inputs** (e.g. “remove in v10” → use `v10`).
2. **Default suggestion** when the user wants a recommendation: read the **`version`** field from the relevant `package.json` and set **`N = current major + 1`**.
- **`packages/web`**, **`packages/mobile`**, and **`packages/common`** always share the same semver — read **`version`** from any one of them (e.g. `8.60.0` → suggest **`v9`**).
- Symbols owned only by **`packages/web-visualization`** or **`packages/mobile-visualization`**: read **that** package’s `package.json` (those versions are independent from web/mobile/common).
3. After agreeing on **`N`**, use **`@deprecationExpectedRemoval v<N>`** everywhere for this deprecation (same **Step 3**).

Do **not** assume the default without checking—either the user names **`N`**, or they accept the suggested next-major after you show the current **`version`**.
Expand Down Expand Up @@ -141,7 +140,7 @@ Use the workspace convention:
yarn nx run <project>:lint
```

Examples: `web`, `mobile`, `common`, `web-visualization`, `mobile-visualization` — run **each** project you touched. Fix any reported issues before finishing (most often: missing `@deprecationExpectedRemoval`, or `@deprecated` text not ending with the standard sentence).
Examples: `web`, `mobile`, `common` — run **each** project you touched. Fix any reported issues before finishing (most often: missing `@deprecationExpectedRemoval`, or `@deprecated` text not ending with the standard sentence).

---

Expand Down
4 changes: 1 addition & 3 deletions .claude/skills/git.detect-breaking-changes/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ Only analyze changes within these packages:
- `packages/web/`
- `packages/mobile/`
- `packages/common/`
- `packages/web-visualization/`
- `packages/mobile-visualization/`

## Determining the public API surface

Expand Down Expand Up @@ -85,7 +83,7 @@ Examples:

### 5. DOM / element structure change (web packages only)

Applies to `packages/web/` and `packages/web-visualization/` only. Changes to the rendered HTML element tree that could break consumer CSS selectors or DOM queries targeting internal component structure.
Applies to `packages/web/` only. Changes to the rendered HTML element tree that could break consumer CSS selectors or DOM queries targeting internal component structure.

Examples:

Expand Down
7 changes: 3 additions & 4 deletions .codeflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ secure:
branches:
- master
- release-8.x
- cds-v9-master
auto_assign_reviewers: true
# Marks
upstream_repository: coinbase/cds
Expand Down Expand Up @@ -124,11 +123,11 @@ build:
expire_tmp_tags_after_days: 1
expire_all_after_days: 2
- BaldurNode:
name: package-ui-mobile-playground
path: ./packages/ui-mobile-playground/publish.Dockerfile
name: package-ui-scorecard
path: ./packages/ui-scorecard/publish.Dockerfile
architecture: amd64
autobuild_files:
- packages/ui-mobile-playground/package.json
- packages/ui-scorecard/package.json
expire_keep_tags_after_days: 1
expire_tmp_tags_after_days: 1
expire_all_after_days: 2
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ jobs:
fetch-depth: 100 # TODO: This needs to include the merge-base
- uses: ./.github/actions/setup
- name: Build
run: yarn nx affected --exclude=mobile-app --target=build --base=$NX_BASE --head=$NX_HEAD
run: yarn nx affected --exclude=expo-app --target=build --base=$NX_BASE --head=$NX_HEAD

depcheck:
name: Depcheck
Expand Down
Loading
Loading