sparkle-design-cli 2.5.0-beta.3 → 2.5.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CONTRIBUTING.md CHANGED
@@ -39,11 +39,37 @@ npm run sync:anti-pattern-docs # ルールの解説を隣接リポジトリの
39
39
 
40
40
  ## リリース手順(メンテナ向け)
41
41
 
42
- publish は GitHub Actions の **Publish to npm** workflow 経由。ローカル `npm publish` は禁止。
42
+ publish は GitHub Actions 経由。ローカル `npm publish` は禁止。npm は 2027 年 1 月に granular access token での直接 publish を廃止するため、**trusted publishing(OIDC)で stage → メンテナーが 2FA で承認**する形にしている。
43
43
 
44
44
  1. `package.json` の `version` を更新(安定版: `X.Y.Z` / RC: `X.Y.Z-rc.N` / Beta: `X.Y.Z-beta.N`)
45
45
  2. `CHANGELOG.md` に該当セクションを追加
46
- 3. PR をマージ後、**Publish to npm** workflow を `channel: auto` で実行
46
+ 3. PR をマージ後、**Publish to npm** workflow を main から実行する(`gh workflow run --ref` はブランチ名かタグ名のみで SHA は渡せない。main 以外からの実行は拒否される)。CI は `npm stage publish` するだけで、まだ公開されない。Summary に stage ID と commit が出る
47
+ ```bash
48
+ gh workflow run "Publish to npm" --repo goodpatch/sparkle-design-cli --ref main -f channel=auto
49
+ ```
50
+ 4. メンテナーが 2FA 付きで承認する(不要なら `stage reject`)。手元で `npm login --registry=https://registry.npmjs.org` 済みであること(社内 proxy が既定 registry の環境があるので `--registry` を必ず付ける)
51
+ ```bash
52
+ npx -y npm@11.21.0 stage download <stage-id> --registry=https://registry.npmjs.org # 任意: 中身を確認
53
+ npx -y npm@11.21.0 stage approve <stage-id> --otp=<code> --registry=https://registry.npmjs.org
54
+ ```
55
+ 5. 公開を確認したら、Summary に出た commit で tag と GitHub Release を作る(npm で公開済みか・`gitHead` が一致するかを確かめてから動く)
56
+ ```bash
57
+ gh workflow run "Publish GitHub Release" --repo goodpatch/sparkle-design-cli -f ref=<Summary の commit>
58
+ ```
59
+
60
+ dist-tag は stage 時に決まり、承認時には変えられない。
61
+
62
+ ### trusted publisher(OIDC)の設定
63
+
64
+ トークンの発行・更新は不要。npm 側でパッケージとワークフローを一度だけ結び付ける(npm の 2FA が要るのでメンテナーが実行する):
65
+
66
+ ```bash
67
+ npx -y npm@11.21.0 trust github sparkle-design-cli \
68
+ --repository goodpatch/sparkle-design-cli --file publish.yml --allow-stage-publish --registry=https://registry.npmjs.org
69
+ npx -y npm@11.21.0 trust list sparkle-design-cli --registry=https://registry.npmjs.org
70
+ ```
71
+
72
+ `--allow-publish` は付けない(CI から直接公開できないようにし、公開の確定を人の 2FA に限る)。OIDC で stage できることを確認したら `NPM_TOKEN` secret は削除する。private リポジトリなので provenance は付かない。
47
73
 
48
74
  `channel: auto` は `package.json` の version 形式から dist-tag を自動判定します(`-beta.N` → `beta` / `-rc.N` → `next` / それ以外 → `latest`)。既存 RC / Beta を latest に昇格させる場合は、新しい `X.Y.Z` として改めて publish します(`npm dist-tag add` での手動付け替えも可能ですが、version 管理が明確になる前者を推奨)。
49
75
 
package/README.md CHANGED
@@ -6,7 +6,7 @@ Sparkle Design のプロジェクト初期セットアップ、CSS 生成、導
6
6
 
7
7
  | ドキュメント | 内容 |
8
8
  | ---------------------------------------------- | --------------------------------------------------------------------------- |
9
- | [docs/anti-patterns.md](docs/anti-patterns.md) | `check` の抑制方法、新セマンティックトークンへの移行、余白スケール |
9
+ | [docs/anti-patterns.md](docs/anti-patterns.md) | `check` の抑制・除外方法、新セマンティックトークンへの移行、余白スケール |
10
10
  | [docs/config.md](docs/config.md) | `sparkle.config.json` の `extend`(フォント追加・カスタムカラー・任意 CSS) |
11
11
  | [docs/theming.md](docs/theming.md) | 複数のテーマ配色を 1 デプロイでサポートする(`generate --scope`) |
12
12
  | [docs/manual-setup.md](docs/manual-setup.md) | Next.js / Vite 以外への手動セットアップ |
@@ -74,6 +74,9 @@ npx sparkle-design-cli check src --format json
74
74
  # 現在有効なアンチパターンルールを一覧表示(プラグイン由来のものも含む)
75
75
  npx sparkle-design-cli rules
76
76
 
77
+ # 旧セマンティックトークンを新トークンへ移行(既定は dry-run。--write で書き換え)
78
+ npx --yes sparkle-design-cli migrate
79
+
77
80
  # Artifact Registry の npm registry 用トークンを ~/.npmrc に書く(beta)
78
81
  npx --yes sparkle-design-cli@beta auth
79
82
  ```
@@ -160,6 +163,9 @@ sparkle-design-cli check --help
160
163
  - `-h, --help`: ヘルプメッセージを表示
161
164
  - `--strict`: **`error` の違反があるか、実行に失敗して未検査のルールがある**場合に exit code 1 で終了(`warning` / `info` は exit code に影響しません)
162
165
  - `--format <text|json>`: 出力形式。AI 連携では `json` を推奨
166
+ - `-c, --config <path>`: 除外設定(`check.ignore` / `check.allowTokens`)を読む設定ファイル(既定: `./sparkle.config.json`。無ければ除外なし)
167
+
168
+ 意図的な箇所を検査から外すには、行単位(`sparkle-disable-line` / `sparkle-disable-next-line`)、ファイル単位(`sparkle-disable-file`)、パス単位(`sparkle.config.json` の `check.ignore`)の 3 つの方法があります。自前の CSS で定義して意図して使う shadcn/ui のトークンは、`check.allowTokens` でクラス単位に宣言できます(`shadcn-token` の指摘にだけ効きます)。詳しくは [docs/anti-patterns.md の「抑制する」](docs/anti-patterns.md#抑制する) を参照してください。
163
169
 
164
170
  #### ルールの強さ(severity)
165
171
 
@@ -200,6 +206,21 @@ npx sparkle-design-cli rules --format json
200
206
 
201
207
  AI エージェントや CI からこの `lint:sparkle` を呼ぶ運用にすると、ガイドラインの注意書きだけに頼らず機械的に検査できます。
202
208
 
209
+ ### migrate: 新セマンティックトークンへの移行
210
+
211
+ `check` が警告する旧セマンティックトークン(`bg-primary-600` / `var(--radius-halfModal)` など)を新トークンへ書き換えます。
212
+
213
+ ```bash
214
+ npx --yes sparkle-design-cli migrate # src を dry-run(変更内容を diff 形式で表示するだけ)
215
+ npx --yes sparkle-design-cli migrate --write # [自動変換可] の箇所だけ書き換える
216
+ npx --yes sparkle-design-cli migrate --include 'src/components/**/*.tsx'
217
+ ```
218
+
219
+ - **既定は dry-run** で、`--write` を付けたときだけファイルを書き換えます。探索範囲は `check` と同じです(既定 `src`、パスを並べて指定可)
220
+ - 書き換えるのは移行先が一意に決まり値も変わらない `[自動変換可]` だけです。`[要判断]`(候補が複数ある等)と `[構造変更あり]` は報告するだけで置換しません
221
+
222
+ 分類の考え方は [docs/anti-patterns.md](docs/anti-patterns.md#新セマンティックトークンへの移行beta-期間中) を参照してください。
223
+
203
224
  ### auth: Artifact Registry の認証(beta)
204
225
 
205
226
  社内パッケージの配信先を Google Artifact Registry(AR)に移行するための準備です(goodpatch/sparkle-design-internal#261)。Google の資格情報から AR 用のアクセストークンを取得し、ユーザー単位の `~/.npmrc` に書きます。
@@ -8,11 +8,13 @@ import { PLUGIN_SPEC_MARKDOWN } from '../lib/plugin-api.js';
8
8
  import { loadAntiPatternPlugins } from '../lib/load-plugins.js';
9
9
  import { runRules } from '../lib/rules-report.js';
10
10
  import { runAuth } from '../lib/auth.js';
11
+ import { runMigrate } from '../lib/migrate.js';
11
12
 
12
13
  const SUBCOMMANDS = new Set([
13
14
  'generate',
14
15
  'check',
15
16
  'rules',
17
+ 'migrate',
16
18
  'setup',
17
19
  'auth',
18
20
  'stop-hook',
@@ -69,6 +71,7 @@ function parseCheckOptions(args) {
69
71
  targets: [],
70
72
  strict: false,
71
73
  format: 'text',
74
+ configPath: null,
72
75
  help: false,
73
76
  };
74
77
 
@@ -79,6 +82,9 @@ function parseCheckOptions(args) {
79
82
  options.help = true;
80
83
  } else if (arg === '--strict') {
81
84
  options.strict = true;
85
+ } else if (arg === '-c' || arg === '--config') {
86
+ options.configPath = requireOptionValue(args, i, '-c/--config');
87
+ i += 1;
82
88
  } else if (arg === '--format') {
83
89
  const value = requireOptionValue(args, i, '--format');
84
90
  if (value !== 'text' && value !== 'json') {
@@ -179,6 +185,53 @@ function parseRulesOptions(args) {
179
185
  return options;
180
186
  }
181
187
 
188
+ /**
189
+ * `migrate` のオプション。
190
+ *
191
+ * 既定は dry-run。`--write` を付けたときだけファイルを書き換える(不可逆操作を
192
+ * デフォルトにしない)。`--dry-run` は既定と同じだが、明示したい人のために受け付ける。
193
+ * 両方指定は意図が矛盾するのでその場で失敗させる。
194
+ * en: Dry-run by default; only `--write` rewrites files. `--dry-run` together
195
+ * with `--write` is contradictory and fails fast.
196
+ */
197
+ function parseMigrateOptions(args) {
198
+ const options = {
199
+ targets: [],
200
+ includes: [],
201
+ write: false,
202
+ dryRun: false,
203
+ configPath: null,
204
+ help: false,
205
+ };
206
+
207
+ for (let i = 0; i < args.length; i += 1) {
208
+ const arg = args[i];
209
+ if (arg === '-h' || arg === '--help') {
210
+ options.help = true;
211
+ } else if (arg === '--write') {
212
+ options.write = true;
213
+ } else if (arg === '--dry-run') {
214
+ options.dryRun = true;
215
+ } else if (arg === '--include') {
216
+ options.includes.push(requireOptionValue(args, i, '--include'));
217
+ i += 1;
218
+ } else if (arg === '-c' || arg === '--config') {
219
+ options.configPath = requireOptionValue(args, i, '-c/--config');
220
+ i += 1;
221
+ } else if (arg.startsWith('-')) {
222
+ throw new Error(`Unknown option for migrate: ${arg}`);
223
+ } else {
224
+ options.targets.push(arg);
225
+ }
226
+ }
227
+
228
+ if (options.write && options.dryRun) {
229
+ throw new Error('--write と --dry-run は同時に指定できません');
230
+ }
231
+
232
+ return options;
233
+ }
234
+
182
235
  /**
183
236
  * `auth` のオプション。未知のフラグはその場で失敗させる(他のサブコマンドと同じ)。
184
237
  * en: Unknown flags fail fast, same as the other subcommands.
@@ -214,6 +267,7 @@ Commands:
214
267
  generate sparkle.config.json から CSS を生成
215
268
  check Sparkle Design のアンチパターンを検査
216
269
  rules 現在有効なアンチパターンルールを一覧表示(プラグイン由来のものも含む)
270
+ migrate 旧セマンティックトークンを新トークンへ移行(既定は dry-run。--write で書き換え)
217
271
  setup Sparkle Design プロジェクトをセットアップ(パッケージ導入 + 初期ファイル + AI ガード + generate)
218
272
  auth Artifact Registry の npm registry 用アクセストークンを ~/.npmrc に書く(beta)
219
273
  stop-hook AI assistant の Stop hook 用 internal subcommand(severity=error の findings か、
@@ -237,6 +291,12 @@ Check:
237
291
  sparkle-design-cli check src --format json
238
292
  sparkle-design-cli check src/components src/features
239
293
 
294
+ Migrate:
295
+ sparkle-design-cli migrate # src を dry-run(変更内容を表示するだけ)
296
+ sparkle-design-cli migrate --include 'src/components/**/*.tsx'
297
+ sparkle-design-cli migrate --write # [自動変換可] の箇所だけ書き換える
298
+ sparkle-design-cli migrate src/app src/features --write
299
+
240
300
  Rules:
241
301
  sparkle-design-cli rules # 有効なルールを severity 別に一覧表示
242
302
  sparkle-design-cli rules --format json # CI / AI 向け
@@ -312,6 +372,44 @@ Check options:
312
372
  --strict severity=error の違反があれば exit code 1 で終了
313
373
  (warning / info は報告のみで exit code に影響しない)
314
374
  --format <text|json> 出力形式 (default: text)
375
+ -c, --config <path> 除外設定(check.ignore / check.allowTokens)を読む設定ファイル
376
+ (default: ./sparkle.config.json。無ければ除外なし)
377
+
378
+ Check の除外:
379
+ 同じ行に置く // sparkle-disable-line <rule-id>
380
+ 直前の行に置く // sparkle-disable-next-line <rule-id>
381
+ ファイル内に置く /* sparkle-disable-file <rule-id> */(ファイル全体に効く。場所は問わない)
382
+ パス単位 sparkle.config.json の check.ignore に glob とルール ID を書く
383
+ { "check": { "ignore": [{ "files": ["src/app/(marketing)/**"], "rules": ["tailwind-typography"] }] } }
384
+ (rules を省略すると全ルール。glob は cwd からの相対パスで、cwd の外には効かない)
385
+ トークン単位 自前の CSS で定義して意図して使う shadcn/ui のトークンを check.allowTokens で宣言する
386
+ { "check": { "allowTokens": ["text-muted-foreground",
387
+ { "tokens": ["bg-background"], "files": ["src/app/docs/**"] }] } }
388
+ (shadcn-token の指摘にだけ効く。指摘されたクラス名(variant・/50・! を除いた部分)が
389
+ 宣言と完全一致するものだけを許可。cwd の外には効かない)
390
+ 行コメントは font-import-in-css / csp-font-block には効かない(ファイル単位かパス単位で外す)。
391
+ 除外した件数は出力と JSON の summary.ignoredFindingCount に出る。
392
+ 詳細は docs/anti-patterns.md
393
+
394
+ Migrate options:
395
+ -h, --help このヘルプメッセージを表示
396
+ [path ...] 探索するパス(default: src。check と同じ探索範囲。
397
+ .js / .jsx / .ts / .tsx / .css、node_modules と .git は除外)
398
+ --dry-run ファイルを変更せず、変更内容を diff 形式で表示する(既定)
399
+ --write [自動変換可] の箇所だけを書き換える
400
+ --include <glob> 対象を cwd からの相対パス(cwd の外は絶対パス)が glob に
401
+ マッチするファイルに絞る(複数指定可。** / * / ? / {a,b} に対応)
402
+ -c, --config <path> check.ignore を読む設定ファイル(check と同じ。
403
+ default: ./sparkle.config.json。無ければ除外なし)
404
+
405
+ Migrate の分類:
406
+ 自動変換可 bg- / text- / border- などの用途と variant 接頭辞(hover: 等)から移行先が
407
+ 一意に決まり、値も変わらないもの。--write のときだけ置換する
408
+ 要判断 移行先候補が複数ある / 対応する新トークンが無いもの。候補を表示するだけで置換しない
409
+ 構造変更あり トークンの差し替えでは済まない(マークアップ変更を伴う)もの。指摘するだけで置換しない
410
+ 対応表は check の移行ルールと共通(lib/token-migration.js)。check の除外
411
+ (抑制コメント・sparkle-disable-file・sparkle.config.json の check.ignore)にかかる
412
+ 箇所は migrate でも書き換えない
315
413
 
316
414
  Auth options:
317
415
  -h, --help このヘルプメッセージを表示
@@ -442,6 +540,7 @@ async function main() {
442
540
  const hasBlockingIssues = await checkProject(options.targets, {
443
541
  strict: options.strict,
444
542
  format: options.format,
543
+ configPath: options.configPath,
445
544
  });
446
545
  if (hasBlockingIssues && options.strict) {
447
546
  process.exit(1);
@@ -501,6 +600,21 @@ async function main() {
501
600
  return;
502
601
  }
503
602
 
603
+ if (command === 'migrate') {
604
+ const options = parseMigrateOptions(args.slice(1));
605
+ if (options.help) {
606
+ showHelp();
607
+ process.exit(0);
608
+ }
609
+ runMigrate({
610
+ targets: options.targets,
611
+ includes: options.includes,
612
+ write: options.write,
613
+ configPath: options.configPath,
614
+ });
615
+ return;
616
+ }
617
+
504
618
  if (command === 'plugin-spec') {
505
619
  await runPluginSpec(args.slice(1));
506
620
  return;
@@ -6,7 +6,18 @@
6
6
 
7
7
  ## 抑制する
8
8
 
9
- 特定の箇所だけ検査から外すには、ESLint と同じ形のコメントを使います。
9
+ 検査から外す方法は、範囲の狭い順に 3 つあります。どれもルール ID を指定でき、ID は `rules` コマンドの出力と `check` の指摘に出ているものです。複数指定するときは、コメントではカンマ区切り(`tailwind-typography, use-figma-spacing-scale`)、設定ファイルでは配列の要素を分けます(`["tailwind-typography", "use-figma-spacing-scale"]`。1 つの文字列にカンマで並べると 1 つの未知 ID として扱われ、何も外れません)。
10
+
11
+ このほか、自前の CSS で定義した shadcn/ui のトークンを意図して使う場合は、ルールごとではなくクラス単位で宣言する [`check.allowTokens`](#トークン単位checkallowtokens) があります。
12
+
13
+ ### 行単位
14
+
15
+ ESLint と同じ形のコメントです。**コメントの種類で置く場所が決まっています**。直前の行に `sparkle-disable-line` を置いても抑制されません。
16
+
17
+ | コメント | 置く場所 |
18
+ | ------------------------------------- | ---------------------- |
19
+ | `sparkle-disable-line <rule-id>` | 指摘される行と同じ行 |
20
+ | `sparkle-disable-next-line <rule-id>` | 指摘される行の直前の行 |
10
21
 
11
22
  ```tsx
12
23
  {/* sparkle-disable-next-line legacy-color-token */}
@@ -15,7 +26,71 @@
15
26
  <div className="bg-primary-600" /> {/* sparkle-disable-line legacy-color-token */}
16
27
  ```
17
28
 
18
- ルール ID はカンマ区切りで複数指定できます。ID は `rules` コマンドの出力と `check` の指摘に出ているものです。
29
+ 行コメントはルール定義から出る指摘に効きます。`check` 本体が直接行う `font-import-in-css` と `csp-font-block` には効かないので、下のファイル単位かパス単位で外してください。
30
+
31
+ ### ファイル単位
32
+
33
+ `sparkle-disable-file` をファイル内のどこかに書くと、そのファイル全体で指定ルールを外します。行コメントと同じく**ルール ID は必須**です(ID を省略したコメントは何も外しません)。
34
+
35
+ ```tsx
36
+ /* sparkle-disable-file tailwind-typography, use-figma-spacing-scale */
37
+ ```
38
+
39
+ 効くのは `check` が走査したファイルと、`csp-font-block` の指摘元になった `next.config.*` です。
40
+
41
+ ### パス単位(`sparkle.config.json`)
42
+
43
+ デザイナーとの調整待ちの公開ページのように、意図して残す箇所がディレクトリ単位でまとまっているときは、`sparkle.config.json` の `check.ignore` に書きます。コメントを足して回らずに済み、何を外しているかが 1 か所で分かります。
44
+
45
+ ```json
46
+ {
47
+ "primary": "blue",
48
+ "check": {
49
+ "ignore": [
50
+ { "files": ["src/app/(marketing)/**", "src/app/blog"], "rules": ["tailwind-typography"] },
51
+ { "files": ["**/*.stories.tsx"] }
52
+ ]
53
+ }
54
+ }
55
+ ```
56
+
57
+ - `files` は **cwd(`check` を実行するディレクトリ)からの相対パス**の glob です。`check` の出力に出るパスと同じ基準で照合します。`**` / `*` / `?` / `{a,b}` が使えます。`-c` で別の場所の設定ファイルを指定しても、基準は cwd のままです
58
+ - glob 記号を含まないパス(上の `src/app/blog`)はディレクトリ指定とみなし、配下のファイルすべてに効きます
59
+ - cwd の外のファイル(出力が `../` で始まるもの)には効きません
60
+ - `rules` を省略すると、そのパスの**全ルール**を外します。関係ないルールまで外れないよう、できるだけ `rules` を指定してください
61
+ - 別の設定ファイルを使うときは `check -c <path>`(`migrate -c <path>` も同じ)で指定します。既定の `./sparkle.config.json` が無ければ除外なしで動きます
62
+ - 形が不正な設定(`check` / `ignore` / `allowTokens` が想定の型でない、`files` が空、未知のキー、空・絶対パス・`..` を含むパスなど)は exit 1 で止まります(`migrate` も同じ。ただし `migrate` は `allowTokens` を使わないので、その形は検証しません)。除外の typo に気付かないまま検査が素通りするのを防ぐためです。stop-hook では exit 2 で応答終了を 1 度ブロックし、設定を直すよう伝えます
63
+
64
+ 除外するのは「Sparkle のトークンに置き換えられない・置き換えない理由がある」箇所だけにしてください。検出されたからといって外すのではなく、まず Sparkle のトークンへ置き換えられないかを確認します(例: `shadcn-token` の指摘は、多くの場合 `text-text-neutral-low` などへ置き換えるのが正解です)。
65
+
66
+ ### トークン単位(`check.allowTokens`)
67
+
68
+ プロジェクトが shadcn/ui のトークン(`text-muted-foreground` など)を自前の CSS で定義し、Sparkle 以外の UI で意図して使っている場合は、`check.allowTokens` で宣言します。**まず Sparkle のトークンへ置き換えられないかを確認し、置き換えない理由がある場合だけ**使ってください。
69
+
70
+ ```json
71
+ {
72
+ "primary": "blue",
73
+ "check": {
74
+ "allowTokens": [
75
+ "text-muted-foreground",
76
+ { "tokens": ["bg-background", "border-border"], "files": ["src/app/docs/**"] }
77
+ ]
78
+ }
79
+ }
80
+ ```
81
+
82
+ - **`shadcn-token` の指摘にだけ効きます**。他のルールの指摘は外れません(他ルールを外したいときは、上のファイル単位・パス単位を使います)
83
+ - 指摘されたクラスが宣言と**完全一致する**ときだけ、その指摘を出しません。宣言していないクラスは引き続き検出されるので、意図しない持ち込みは見逃しません。`hover:bg-background` / `bg-background/50` / `!bg-background` のような variant・opacity・important 付きも、指摘されるクラス名(`bg-background`)で照合します。宣言にも variant などを付けずにクラス名だけを書いてください
84
+ - 文字列で書いたクラスは全体(cwd の外のファイルを除く)で許可します。`{ "tokens": [...], "files": [glob] }` で書くと、そのパスでだけ許可します(glob の書き方はパス単位と同じ)
85
+ - `shadcn-token` の検出対象ではないクラスを書くと、stderr に警告が出て JSON の `ignoreWarnings` にも載ります(`{ "source": "allowTokens", "ruleId": "shadcn-token", "token": "..." }`。typo に気付けるように)
86
+
87
+ ### 除外しすぎに気付くために
88
+
89
+ - 除外した件数は出力に `N 件を除外しました(行コメント a / sparkle-disable-file b / check.ignore c / check.allowTokens d)` の形で出ます(0 件の内訳は省略)。1 件の指摘が複数の方法にかかる場合は、行コメント → ファイル単位 → パス単位 → トークン単位の順で最初に当たったものとして数えます
90
+ - JSON 出力では `summary.ignoredFindingCount` に合計、トップレベルの `ignored` に仕組みごとの内訳が入ります
91
+ - `check.ignore` や `sparkle-disable-file` に**有効なルールに無い ID**を書くと、stderr に警告が出て JSON の `ignoreWarnings` にも載ります(typo や、プラグインを入れていない環境での指定に気付けるように)
92
+ - 除外したファイル × ルールでルールの実行が失敗しても、「未検査」(`skippedRules`)には数えません
93
+ - 除外した箇所は `migrate` でも書き換えません
19
94
 
20
95
  ## 新セマンティックトークンへの移行(beta 期間中)
21
96
 
@@ -55,6 +130,27 @@ src/Card.tsx:8 [warning] [legacy-color-token] 旧セマンティックカラー
55
130
  >
56
131
  > 旧→新の対応表は `lib/token-migration.js` に一元化してあり、`test/token-migration.test.js` が**実際に生成した CSS を読んで**「表に書いた移行先が実在し、旧トークンと同じ実値に解決される」ことを検証しています。表とトークン定義が食い違ったらテストが落ちるので、案内が嘘になりません。検出パターンがマッチする文字列は必ず対応表で解決できることも全数検証しています(片方だけ更新すると「検出したのに黙って捨てる」穴になるため)。
57
132
 
133
+ ### `migrate` で書き換える
134
+
135
+ `check` が提示する移行先のうち `[自動変換可]` のものは、`migrate` サブコマンドでまとめて書き換えられます。対応表は `check` と同じ `lib/token-migration.js` を使うので、`check` の案内と `migrate` の書き換え先が食い違うことはありません。
136
+
137
+ ```bash
138
+ npx --yes sparkle-design-cli migrate # dry-run。変更内容を diff 形式で表示するだけ
139
+ npx --yes sparkle-design-cli migrate --write # [自動変換可] の箇所だけ書き換える
140
+ ```
141
+
142
+ | 分類 | `migrate` の挙動 |
143
+ | ------------ | ---------------------------------------------------------------------------------------------------------------------------- |
144
+ | 自動変換可 | 用途(`bg-` / `text-` / `border-` …)と variant 接頭辞から移行先が一意に決まり、値も変わらない。`--write` のときだけ置換する |
145
+ | 要判断 | 移行先候補が複数ある / 対応する新トークンが無い。候補を列挙するだけで置換しない |
146
+ | 構造変更あり | トークンの差し替えでは済まない(マークアップ変更を伴う)。該当箇所を指摘するだけ |
147
+
148
+ - variant 接頭辞(`hover:` / `group-hover:` / `dark:` …)、opacity modifier(`/50`)、important(`!`)は置換後もそのまま残ります
149
+ - `check` で報告しないもの(そのファイル自身が宣言している変数・行頭から始まるブロックコメント)は `migrate` も書き換えません。`sparkle-disable-line legacy-color-token` などの抑制コメントを付けた箇所も書き換えません(誤検出を抑制した箇所を黙って書き換えないため)
150
+ - 書き換えた後に 2 回目を実行しても、`migrate` の `[自動変換可]` は 0 件になります(新トークンは検出パターンにマッチしない)
151
+ - **`check` が `[自動変換可]` と案内しても、`migrate` が `[要判断]` として書き換えずに残す箇所があります。** 検出はファイル全体への正規表現なので、パス(`'/img/fill-primary-600.svg'` / `"bg-primary-600/hero.png"`)、import / require の specifier、`url()` の中のようなクラス名でない文字列にもマッチします。`check` は報告するだけなので案内を変えていませんが、`migrate` は資産パスや import を壊さないよう、これらと数値・角括弧以外の modifier(`/data.json` など)付きのものを書き換えません。クラス名として使っている箇所なら手で置き換えてください
152
+ - `--include <glob>` で対象を cwd からの相対パスで絞れます(`**` / `*` / `?` / `{a,b}`)
153
+
58
154
  ## 余白のスケール(`use-figma-spacing-scale`)
59
155
 
60
156
  Figma の余白は 17 段(0 / 2 / 4 / 6 / 8 / 12 / 16 / 20 / 24 / 32 / 40 / 48 / 56 / 72 / 88 / 104 / 120 px)です。Tailwind の 1 ステップは 4px なので、`p-4` = 16px、`p-6` = 24px が対応します。このスケールから外れた値を `info` で報告し、前後の候補を提示します。
package/docs/config.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # 設定ファイルの拡張(`extend`)
2
2
 
3
+ > `check` の除外設定(`check.ignore` / `check.allowTokens`)も `sparkle.config.json` に書きます。書き方は [anti-patterns.md の「抑制する」](anti-patterns.md#パス単位sparkleconfigjson) を参照してください。
4
+
3
5
  Figma プラグインが出力する基本4項目に加えて、プロジェクト固有の拡張を `extend` セクションにまとめます。`extend` はオブジェクト直書き(推奨)またはファイルパスを指定できます。
4
6
 
5
7
  ```json