Repository navigation
chore: arethetypeswrong で exports と型定義の対応を CI で検査する - #380
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
attw-addToCi 対話コンテキスト
目的配布物の #319 は配布物の検査と複数の修正を1つにまとめていたので、分けて出し直している。その一部で、msw 依存の除去と 設計方針
却下した代替案
意図的に対応しないこと
発見された制約
新たに確認できた事実
注意が必要な難所
残作業
|
| "test:type-check": "tsc --noEmit", | ||
| "test:pack-smoke": "node scripts/pack-smoke.mjs" | ||
| "test:pack-smoke": "node scripts/pack-smoke.mjs", | ||
| "test:attw": "attw --pack --profile node16 --ignore-rules false-cjs" |
There was a problem hiding this comment.
CI の test job は build の後に run-p -c test:* を実行するので、ここに足すだけで CI で走ります。workflow は変えていません。
1回目の --profile node16 は、node10 の結果を表に出しますが、合否判定には使いません。サブパスは exports でしか公開していないので、node10 では解決できなくて当然です。ただしこれだと root の node10(top-level の types)も判定から外れるので、2回目で root だけを strict profile で検査しています。同じ名前の tarball を作るので、&& で順番に実行しています。
--ignore-rules false-cjs は 🎭 Masquerading as CJS だけを除外します。tsup から tsc への移行で types を分けて直し、そのときにこの指定を外します。
| "url": "https://github.com/nota/typed-api-spec" | ||
| }, | ||
| "devDependencies": { | ||
| "@arethetypeswrong/cli": "^0.18.5", |
There was a problem hiding this comment.
0.x なので、^0.18.5 で入るのは 0.18.x までです。判定ルールが変わる minor 更新は Dependabot の PR として来るので、その PR の CI で検出できます。lockfile の差分は attw とその依存の追加だけです。
レビュー報告書
AIとの対話コンテキストPR コメント(「attw-addToCi 対話コンテキスト」、source commit 2e50d39)から読み込んだ。 概要:
pull request概要欄サマリー
品質評価
説明と実装の整合性差分は
細かい表現のずれが2点ある(Codex も同じ指摘)。
また、概要欄の「attw は package のディレクトリに tarball を作り、検査後に消す」は通常の終了(型の問題による exit 1 も含む)では正しいが、attw 0.18.5 の削除処理は 命名・設計パターンの一貫性概ね既存の慣習と一致している。
軽微な点として、既存の 長期視点で命名・設計を考察する
バグ・脆弱性の調査Codex CLI に、並列 pack の安全性、tarball の残骸、profile と ignore-rules の影響、attw が同梱する TypeScript、Dependabot との組み合わせ、bin の解決、publish workflow について相談した。Codex の指摘を attw 0.18.5 の実装(
並列 pack について: attw はパッケージのディレクトリ、pack-smoke は 考慮漏れの確認設計判断の根拠
却下した代替案の再評価
失敗した試行のプロセス検証対話コンテキストに「試したがダメだった」という記載は無い。除外を外すと exit 1 になる確認は、ローカルで再現できた。 意図的に対応しない事項の妥当性
記載されている事実の正確性
レビュー作業において発生した問題
結論merge 可。ただし、対話コンテキストと概要欄の補足、および root の node10 検査の要否の判断を推奨する。 この PR は、tsc への移行前に 推奨するアクション:
|
--profile node16 は root の node10 も合否判定から外すので、top-level の types を書き誤っても検出できなかった。root だけを strict profile で続けて検査する。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
sanity-review の指摘に対応しました。
名前( |
yokotaso
left a comment
There was a problem hiding this comment.
LGTM
- 修正が本体に影響がないことを確認しました
概要
配布物の
exportsと型定義の対応が正しいかを、arethetypeswrong(attw)で CI で検査する。この後に tsup から tsc へ移行する予定で、そのときにexportsや top-level のtypesを壊したら気づけるよう、移行の前に入れておく。変更
pkgs/typed-api-specの devDependencies に@arethetypeswrong/cliを追加test:attwを追加CI の test job は build の後に
npm test(run-p -c test:*)を実行するので、workflow は変えていない。test:attwはtest:pack-smokeと同じく build 済みのdistを pack して検査する。2回に分けて実行している理由
1回目は全サブパスを
--profile node16で検査する。この profile は node10(moduleResolution: node)の結果を表に出すが、合否判定には使わない。サブパスはexportsでしか公開していないので、node10 では解決できなくて当然だから。ただしこれだと、root の node10 も合否判定から外れる。root は node10 でも top-level の
main/typesで解決でき、TypeScript 5 でmodule: "commonjs"にしてmoduleResolutionを書かないと node10 になるので、この解決を使う利用者はいる。tsc への移行で top-level のtypesを書き誤っても1回目では検出できないので、2回目で root だけを strict profile(node10 も合否判定に入れる)で検査する。2回とも同じディレクトリに同じ名前の tarball を作るので、別の
test:*にして並列に走らせず、&&で順番に実行している。なお top-level の
mainが指すファイルが無くても、attw は型しか見ないので検出しない。pack-smoke もexports経由で読み込むので検出しない。これは pack-smoke 側で別に対応する。--ignore-rules false-cjsで除外している指摘今の
exportsは、各サブパスのtypesが CJS と ESM で共通(./dist/*.d.ts)。そのため ESM から import しても CJS 向けの.d.tsが使われ、attw はすべてのサブパスで🎭 Masquerading as CJSを指摘する。tsup は ESM 向けの
.d.mtsも出力しているので、typesをrequire/importごとに分ければ今でも直せる。ただし tsc に移行すると出力のパスが変わり、exportsを書き直す事になる。二度手間になるので、tsc への移行で直し、それまでは除外する。--ignore-rulesで除外しているのはこのルールだけで、main ブランチで実行した時点では、合否判定の対象(node16 の CJS / ESM と bundler、root の node10)に他の指摘は出ていない(#369 でIncorrect default exportは解消済み)。ただしこの指定は、今後新しく出るfalse-cjsも隠すので、tsc への移行の完了時に必ず外す。補足
run-pで並列に走っても衝突しない。attw が pack の後に強制終了されたり、解析中の例外(exit 3)で落ちたりすると tarball が残る。CI は使い捨ての環境なので実害は無いAI が済ませた確認
npm run test:attw -w pkgs/typed-api-specが exit 0--ignore-rules false-cjsを外して1回目を実行すると exit 1 になり、全サブパスでMasquerading as CJSだけが出るtypesを存在しないファイルに書き換えると、1回目は通り、2回目がnode10: ❌ No typesで exit 1 になるnpm test -w pkgs/typed-api-spec(lint・format・unit・type-check・pack-smoke・attw)が通り、作業ツリーに tarball が残らない動作確認方法
1回目の表では、node16 (from ESM) を含め全サブパスが 🟢 になる(node10 は
(ignored))。2回目の表では、root の node10 も含めて 🟢 になり、exit 0 で終わる。除外を外した結果を見る時は、pkgs/typed-api-specでnpx attw --pack --profile node16を実行する。🤖 Generated with Claude Code