refactor(csp): #176 B 案 PR 6 (scope 縮小) — styles.ts 削除 + migration tracker glob 化、Astro inline 残存は #289 へ委譲 - #290
Conversation
`style-src 'unsafe-inline'` 撤廃 + 暫定 strip integration / styles.ts / migration tracker 削除を含む B 案最終 PR の設計書。9 ファイル変更内容を diff 形式で詳述、decisions.md [067] エントリの確定文面を draft、 リスク 6 件 + ロールバック計画 + PR description テンプレートを含む。 実装は本セッションでは行わず、次セッションで writing-plans skill 経由で plan を起草してから着手する。
- src/utils/styles.ts: 削除 (PR 1〜5b で全 import 元が CSS class 参照に置換完了)
- src/utils/__tests__/inline-style-migration.test.ts:
- MIGRATED_FILES array (31 件) を await glob('src/components/**/*.tsx') に置換し全件カバー化
- 件数 > 0 を陽性 assert で silent skip 防止
- 陽性対照 (migration detector の陽性対照) は完全維持
PR 6 実施中の npm run test:e2e で Astro <element style="..."> 属性 65 件 /
15 ファイルが未移行で残存していたことが判明 (CSP style-src 'self' 違反 12 spec)。
B 案 PR 1〜5b は React style={{...}} のみが対象で Astro 側 inline 属性は
scope 外だった (Astro <style> block の scoped CSS とは別物)。
本 PR 6 は scope を styles.ts 削除 + migration tracker glob 化のみに縮小し、
CSP flip / stripMetaStyleSrc 撤去 / decisions.md [067] は後続 PR に委譲する。
spec ヘッダに ⚠️ post-mortem section を追加、plan も historical record として
descope note 付きで保存。
レビュー(多角的評価)scope 縮小判断(flip 見送り)と post-mortem の記録は妥当だと思います。実コード変更は ✅ 確認できた点
🟡 マージ前に直したい点1.
|
….ts 参照を意味クラス案内に更新 PR #290 self-review 🟡 #1 / #2 対応: - docs/shared-agent-rules.md §7: `src/utils/styles.ts` の `colors.*` インラインスタイル指示 を、@layer components 意味クラス使用に書き換え。本 PR で styles.ts 削除済のため、削除前の指示 は dead reference になり、新規 contributor が `@/utils/styles` を再導入する地雷化を防ぐ。 Astro 側は #289 で migration 進行中の旨を併記 - src/utils/__tests__/inline-style-migration.test.ts JSDoc: `[067]` (本 PR で descope 済) への 参照を「B 案完了時に追加予定」に弱め、historical 一貫性を確保 global.css:186 のコメント参照は reviewer 判断「breadcrumb として残しても害は薄い」に従い 据え置き。
|
レビューありがとうございます。指摘対応を 対応
据え置き
CI
merge 判断は reviewer 側にお返しします。追加指摘あればお知らせください。 |
🖼️ Visual Regression Test 結果
|
再レビュー (commit
|
概要
#176B 案 PR 6 を scope 縮小 で実施。当初は「public/_headersからstyle-src 'unsafe-inline'撤廃 + cleanup」を予定していたが、実装中のnpm run test:e2eで Astro<element style="...">属性 65 件 / 15 ファイル が未移行で残存していたことが発覚 (CSP 違反 12 spec fail)。元の B 案 PR 1〜5b は Reactstyle={{...}}のみが対象で、Astro 側 inline 属性は scope 外だった。→ 本 PR では
styles.ts削除 + migration tracker glob 化のみ に scope 縮小し、CSP flip /stripMetaStyleSrc撤去 /decisions.md [067]は後続 PR に委譲する。残存 65 件の対応は新規 issue #289 で追跡。詳細経緯:⚠️ post-mortem section 参照。
docs/superpowers/specs/2026-05-07-issue-176-b6-csp-flip-and-cleanup-design.mdの冒頭変更内容
cleanup (本 PR の実施スコープ)
src/utils/styles.ts: 削除 (PR 1〜5b で全 import 元が CSS class 参照に置換完了済の orphan file)src/utils/__tests__/inline-style-migration.test.ts:MIGRATED_FILESarray (31 件) をawait glob('src/components/**/*.tsx')に置換し全件カバー化migration detector の陽性対照) は完全維持設計記録 (post-mortem)
docs/superpowers/plans/に保存見送り (後続 PR に委譲)
public/_headersのstyle-src 'self'反転 (元 spec §7.1)src/utils/csp.ts:PRODUCTION_CSP同期 (元 spec §7.2)astro.config.mjsのstripMetaStyleSrc撤去 (元 spec §7.3)headers.test.ts/meta-csp.test.ts/astro-config-csp.test.tsの strict 化 (元 spec §7.6 / §7.7 / §7.8)docs/decisions.md [067]追加 (元 spec §7.9) — B 案完了時に書く→ 全て #289 (Astro inline migration) 完了後の最終 flip PR で実施。
関連 PR / issue
<element style="...">属性 65 件の CSS class 移行'unsafe-inline'完全撤廃 →#176close検証
npm run build && npm run test(vitest) green (750 tests)npx astro checkgreen (0 errors / 0 warnings)npm run test:e2e(build + preview) green (146 passed / 1 skipped)grep -rn --include='*.tsx' 'style={{' src/= 0 件 (PR 5b 時点から維持)grep -rn '@/utils/styles' src/ tests/= 0 件src/components/**/*.tsx50 件カバーロールバック計画
cleanup commit (
985f0c3) のみが本 PR のコード変更。revert すれば PR 5b マージ済の状態に戻る。styles.tsは git history に保存されているため復元可能。メモリ参照 (進捗 doc 更新)
post-merge で
docs/projects/issue-176-b-plan-progress.mdの PR 6 列を「✅ scope 縮小 merge」更新する別 chore PR を予定 (feedback_followup_routing.md)。