Skip to content

chore(spindle-ui,spindle-mcp-server): テンプレート形式の Code Connect に移行 - #2192

Open
herablog wants to merge 6 commits into
mainfrom
claude/code-connect-templates-migration-1aherb
Open

chore(spindle-ui,spindle-mcp-server): テンプレート形式の Code Connect に移行#2192
herablog wants to merge 6 commits into
mainfrom
claude/code-connect-templates-migration-1aherb

Conversation

@herablog

Copy link
Copy Markdown
Member

概要

Figma が framework-specific parser を廃止したため、Code Connect を parser 方式(.figma.tsx)からテンプレートファイル方式(.figma.ts)に移行しました。

これは将来対応ではなく、既に発生している破損の修復を兼ねています。

事実 根拠
parser のサポート終了 = 2026-08-17 Figma 公式アナウンス
@figma/code-connect@2.0.0 公開 = 2026-08-18 npm registry
v2.0.0 の publish は config に parser があると即エラー終了 CLI 実装の parserMode === 'forbid' ガード
CI は npm i -g @figma/code-connect(= latest = 2.0.0)を使用 figma-code-connect.yml

つまり .figma.tsx を触る次の main への push で、Publish Figma Code Connect ワークフローが失敗する状態でした。v2.0.0 は以下のエラーを出します。

Framework-specific parsers are no longer supported in Code Connect CLI v2.
Run `figma connect migrate` to convert parser-based Code Connect to template files

変更内容

figma connect migrate で機械移行したうえで、後述の要修正点を手で直しています。

コンポーネント(12ファイル → 10テンプレート)

同一の Figma ノードを variant で共有しているものは、v2 の仕様上1ファイルに統合されます(1ノード + 1ラベル = 1 doc で、variant の出し分けはテンプレート内の分岐でしか表現できないため)。

  • NavigationTab: CapsuleTab / InlineTab / UnderlineTab が1ファイルに統合。3タブ共通ファイルとして親ディレクトリに NavigationTab.figma.ts を配置し、各タブの実装ファイル冒頭から参照コメントで辿れるようにしました
  • SnackBar: 自動生成されるフォールバック分岐が Error になっていたため、Information を else に置き直しました(NavigationTab 側のフォールバックは CapsuleTab のまま)

アイコン(380件 → バッチ形式)

icons.figma.tsx 2499行を、共有テンプレート9行 + icons.figma.batch.json に縮約しました。CLI が差分を ${figma.batch.componentName} に畳み込んでいます。

scripts/figma-connect-icons.ts.figma.batch.jsoncomponents のみを生成するよう変更したので、今後アイコンを追加しても差分は JSON の数行だけになります。

設定・CI

  • figma.config.json から parser を削除し、label / language を明示。テンプレートファイルの既定ラベルは "Code" なので、明示しないと Dev Mode 上で別セクション扱いになり既存の React ドキュメントが残留します
  • tsconfig.jsonexclude.figma.ts / .figma.batch.ts を追加。追加しないと include: ["src"] に一致して tsc がテンプレートをコンパイルしビルドが壊れます
  • biome は formatter を有効のまま linter のみ無効化
  • CI から npm i -g を廃止し、devDependency + pnpm exec に統一。floating な global install が勝手に v2 に上がったことが今回の破損の直接原因なので、バージョンを lockfile で固定します
  • --exit-on-unreadable-files を追加。テンプレート方式ではパース失敗が「ログを出して次のファイルへ」となり、CI が緑のままそのコンポーネントだけ Dev Mode から消えるため。特にバッチファイルは1ファイルで380件を抱えています

spindle-mcp-server

.figma.tsx.figma.ts のリネームに追従しました。copy-assets.js のコピー対象が *.{tsx,css,mdx,md} だけでテンプレートが assets に入っていなかったため、専用タスクも追加しています。3タブは自ディレクトリにテンプレートを持たないので、親ディレクトリの共有テンプレートにフォールバックします。

補足: CLI のバージョンは 1.4.9 のまま

一度 1.5.3 に上げましたが、1.4.9 の時点で既にテンプレートファイルと .figma.batch.json の両方をサポートしており、移行後の構成では結果が完全に同一だったため据え置きました。CI で使う --exit-on-unreadable-files も 1.4.9 に存在します。

結果として package.json / pnpm-lock.yaml はこの PR で一切変更していません。2.0.0 への更新は quarantine(minimumReleaseAge: 4320、解禁は 2026-08-21 23:05 JST)経過後に Renovate に任せられます。

検証

移行前後で figma connect parse の結果を突き合わせています。

  • doc 数 394 → 390(SnackBar 3→1、NavigationTab 3→1)
  • 対象 Figma ノードの欠落・追加ともにゼロ(390 → 390)
  • 全390件が label=React / language=jsx
  • アイコン380件すべて、移行前と import 文字列が完全一致(CLI が生成する import は from "..." になり Dev Mode の表示が変わってしまうため、from '...'; に直しています)
  • biome 整形の前後で figma.code テンプレートリテラルの内容がバイト一致(整形がスニペットを壊していないことの確認)
  • figma connect parse --exit-on-unreadable-files が exit 0 で完走
  • tsc -p tsconfig.cjs.json --listFiles.figma.* が0件

未確認の点

  • figma connect preview / publish --dry-run は未実行ですFIGMA_ACCESS_TOKEN が必要なため)。マージ前に SnackBar と NavigationTab の分岐を figma connect preview --unique で目視確認いただけると安心です
  • 旧 doc が Dev Mode に残った場合は figma connect unpublish --node <url> --label React で個別に削除できます

🤖 Generated with Claude Code

https://claude.ai/code/session_01JMEHqqeA4E13MMxhFQEceC


Generated by Claude Code

@changeset-bot

changeset-bot Bot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: b49188d

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@openameba/spindle-mcp-server Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Visit the preview URL for this PR (updated for commit b49188d):

https://ameba-spindle--pr2192-claude-code-connect-d6bp3qzi.web.app

(expires Wed, 23 Sep 2026 01:18:35 GMT)

🔥 via Firebase Hosting GitHub Action 🌎

Sign: e7521619a2dd5c653490c8246e81ec2a5c8f1435

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 36a38f0e46

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/spindle-mcp-server/src/components.ts
claude added 4 commits August 20, 2026 09:07
Figma が framework-specific parser を 2026-08-17 で廃止し、CLI v2.0.0 は
figma.config.json に parser が設定されていると publish を即エラー終了する。
CI は `npm i -g @figma/code-connect` で latest を入れていたため、このままでは
次の publish が失敗する。

手書きコンポーネント12ファイルを `figma connect migrate` でテンプレート
ファイル(.figma.ts)に移行した。icons.figma.tsx は差分が大きいため別対応とし、
本コミットでは parser 併用のまま v1.5.3 に固定して中間状態を publish 可能にする。

- 12ファイル -> 10テンプレート。SnackBar と NavigationTab は Figma 上で
  同一ノードを variant で共有しているため、v2 の仕様上1ファイルに統合される
  - NavigationTab は3タブ共通ファイルとして親ディレクトリに配置し、
    各タブの実装ファイルから参照コメントで辿れるようにした
  - 自動生成されるフォールバック分岐が SnackBar は Error、NavigationTab は
    Capsule になるため、SnackBar は Information を else に置き直した
- figma.config.json に label/language を明示。テンプレートファイルの既定
  ラベルは "Code" のため、明示しないと Dev Mode 上で別セクション扱いになり
  既存の React ドキュメントが残留する
- tsconfig の exclude に .figma.ts / .figma.batch.ts を追加。追加しないと
  include: ["src"] に一致して tsc がテンプレートをコンパイルしビルドが壊れる
- biome は formatter を有効のまま linter のみ無効化
- CI から `npm i -g` を廃止し devDependency + `pnpm exec` に統一。
  バージョンが lockfile で固定され、CLI の勝手な major 更新を防げる

検証: 移行前後で figma connect parse を比較し、対象 Figma ノードの欠落・
追加ともにゼロ、全390 doc が label=React / language=jsx であることを確認。
biome 整形の前後で figma.code テンプレートリテラルの内容が
バイト一致することも確認済み。
icons.figma.tsx (380件の figma.connect) を .figma.batch.json + 共有テンプレート
に移行し、figma.config.json から parser を削除して parser 非依存の構成にした。

- 380件は「named import のシンボル名だけが異なる」均一な形なので、CLI が
  ${figma.batch.componentName} に畳み込み、2499行 -> テンプレート9行 + JSON に縮約
  - CLI が生成する import 文は `from "..."` (ダブルクォート・セミコロンなし)
    になり Dev Mode の表示が変わってしまうため、移行前と同じ
    `from '...';` に直した。380件すべてが移行前の import 文字列と一致することを確認
- scripts/figma-connect-icons.ts は .figma.batch.json の components のみを
  生成するよう変更。共有テンプレートは手書きの固定ファイルとして扱う。
  biome は .json を整形しないため、CLI と同じ2スペース+末尾改行で出力する
- include から src/**/*.tsx を削除。テンプレート以外がマッチしていると
  CLI v2 が parser 構成とみなして publish を拒否する
- CI に --exit-on-unreadable-files を追加

CLI は 1.5.3 のまま据え置いた。pnpm-workspace.yaml の minimumReleaseAge
(3日) により 2.0.0 (2026-08-18公開) はまだインストールできず、また parser を
削除した本構成は 1.5.3 でも 2.0.0 でも同じ結果になるため急ぐ必要がない。
2.0.0 への更新は quarantine 経過後に Renovate 側で拾える。

検証: 移行前の parse 結果と比較し、Figma ノードの欠落・追加ともにゼロ、
390 doc すべて label=React / language=jsx。
`figma connect parse --exit-on-unreadable-files` が exit 0 で完走することも確認。
@figma/code-connect を 1.5.3 に上げていたが、1.4.9 のままに戻した。

1.4.9 の時点で既にテンプレートファイル (raw templates) と .figma.batch.json の
両方をサポートしており、移行後の構成でも結果は完全に同一だった:
parse の結果は 390 doc / Figma ノードの欠落・追加ゼロ / 全件 label=React・
language=jsx で 1.5.3 と一致。CI で使う --exit-on-unreadable-files も
1.4.9 に存在する (1.5.3 との差分は preview のサブオプションと
migrate --delete のみで、publish には影響しない)。

バージョンを据え置くことで pnpm-lock.yaml の変更が不要になり、
lockfile は移行前と完全に同一のまま維持される。今後のバージョン更新は
Renovate に任せる。
`.figma.tsx` から `.figma.ts` へのリネームに MCP サーバー側が追従できておらず、
components.test.ts が figma フィールドの欠落で失敗していた。

- components.ts: 関連ファイル探索の拡張子を `.figma.ts` に変更
- copy-assets.js: assets のコピー対象は `*.{tsx,css,mdx,md}` のみで
  `.figma.ts` が含まれていなかったため、専用タスクを追加
- 単一の Figma コンポーネントセットの variant として定義されている
  CapsuleTab / InlineTab / UnderlineTab は自ディレクトリにテンプレートを
  持たないため、親ディレクトリの共有テンプレート
  (NavigationTab.figma.ts) にフォールバックする
- 実在しなくなった `.figma.tsx` を除外するガードを削除

検証: components.test.ts が通ることを確認。あわせて3タブが共有テンプレートを
解決し、テンプレートを持たないコンポーネントでは figma が undefined のままに
なることも確認した。
@herablog
herablog force-pushed the claude/code-connect-templates-migration-1aherb branch from 36a38f0 to f72a104 Compare August 20, 2026 09:09
@herablog herablog changed the title chore(spindle-ui,spindle-mcp-server): Code Connect をテンプレートファイルに移行 chore(spindle-ui,spindle-mcp-server): テンプレート形式の Code Connect に移行 Aug 20, 2026
@reg-suit

reg-suit Bot commented Aug 20, 2026

Copy link
Copy Markdown

reg-suit detected visual differences.

Check this report, and review them.

🔴 Changed 🔵 Passing
3 263
How can I change the check status? If reviewers approve this PR, the reg context status will be green automatically.

親ディレクトリの共有テンプレートへのフォールバックにテストが無く、
壊れても既存スイートが通ってしまう状態だったため追加した。

- Button のアサーションを expect.any(Object) からファイル名の固定に変更。
  拡張子が .figma.tsx に戻っても検知できるようにする
- CapsuleTab / InlineTab / UnderlineTab が NavigationTab.figma.ts を
  参照することを検証。ファイル名だけでなく内容も確認し、空ファイルや
  別内容での空振りを防ぐ
- 親ディレクトリにも共有テンプレートが無い場合に figma が付かないことを
  Form/DropDown で検証。implementation の存在も見て、コンポーネント自体が
  見つかっていないことによる空振りと区別する

検証: 以下の3通りに実装を一時的に壊し、それぞれ想定どおり失敗することを
確認した。
- ext を .figma.tsx に戻す -> Button が失敗
- フォールバックの分岐を削除 -> 3タブが失敗
- copy-assets.js のテンプレートコピーを削除 -> Button と3タブが失敗
@herablog herablog self-assigned this Aug 21, 2026
Comment thread packages/spindle-ui/tsconfig.json Outdated
テンプレートファイルへの移行で `.figma.tsx` は1つも残らなくなったため、
`src/**/*.figma.tsx` の exclude は効かない設定になっていた。

`tsc -p tsconfig.cjs.json --listFiles` に figma 関連ファイルが1件も
含まれないことを確認済み。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants