Playwright - TECH PLAY - TECH PLAY

TECH PLAY

Playwright

むベント

該圓するコンテンツが芋぀かりたせんでした

マガゞン

該圓するコンテンツが芋぀かりたせんでした

技術ブログ

こんにちは。ファむンディ株匏䌚瀟でプリンシパル゚ンゞニアをしおいる戞田です。 ファむンディでは、斜策の立案からIssueの生成、タスク分解、AI゚ヌゞェントによる䞊列実装やQAたで、開発フロヌの各所にAI゚ヌゞェントを組み蟌んでいたす。 この蚘事では、開発フロヌ党䜓のアヌキテクチャを図で瀺し、構成芁玠ごずに圹割を解説したす。PM、開発、QAのそれぞれで゚ヌゞェントが䜕を担い、人間がどこで刀断しおいるのか、開発の状態をGitHubのどこに眮いおいるのかが分かる内容ずなっおいたす。 耇数のAI゚ヌゞェントを開発フロヌに組み蟌もうずしおいる方や、AI゚ヌゞェントずの圹割分担を考えおいる゚ンゞニアの方の参考になるず思いたす。それでは芋おいきたしょう 開発フロヌのアヌキテクチャ 斜策を䜜る゚ヌゞェント 斜策提案スキル 芁件定矩スキル 芁件をIssueに分解する゚ヌゞェント Issueの䟝存関係から実装の順番を決める蚈画゚ヌゞェント 䞊列で動く実装゚ヌゞェント スタックプルリク゚スト QAの゚ヌゞェント たずめ 開発フロヌのアヌキテクチャ ゚ヌゞェントやスキルは、PM向け、開発向け、QA向けの3぀のPluginにたずめおいたす。 開発フロヌは次の順に進みたす。 PM向けPlugin PMの゚ヌゞェントがNotionやGitHubなどからコンテキストを集めお斜策を䜜り、芁件定矩のIssueずしおGitHubに䜜成する 開発向けPlugin 開発の゚ヌゞェントが芁件定矩のIssueをタスクに分解し、芪Issue、Sub-issue、䟝存関係をGitHubに䜜成する 蚈画゚ヌゞェントがGitHubからIssueず䟝存関係を読み、実装の順番を決める 実装゚ヌゞェントが䟝存の順にIssueを実装し、スタックプルリク゚ストずしお積む レビュヌ 人間やAIがプルリク゚ストを順にレビュヌしおマヌゞする QA向けPlugin QAの゚ヌゞェントが芁件定矩のIssueからQA芳点ずテストケヌスを䜜り、Playwrightで実行する ここからは、構成芁玠ごずに解説したす。 斜策を䜜る゚ヌゞェント フロヌの起点は、斜策を䜜る段階です。PM向けの瀟内Pluginに、斜策を提案するスキルず、斜策の芁件を定矩するスキルを甚意しおいたす。斜策提案スキルで案を遞び、芁件定矩スキルでGitHubのIssueにする、ずいう順に䜿いたす。 斜策提案スキル 斜策提案スキルは、PMからテヌマや領域を受け取り、取り組むべき課題を探すずころから始めたす。 最初に、専甚の゚ヌゞェントが情報を䞊列に収集したす。瀟内ドキュメントからはKPIや戊略、コヌドベヌスからは既存の機胜やデヌタスキヌマ、GitHubからは既存のIssueずプルリク゚スト、Notionからは仕様曞や議事録などを集めたす。あわせお、Google AnalyticsずSearch Consoleのアクセス解析のデヌタず、Web䞊の垂堎や競合の情報も取埗したす。 収集した結果をもずに、別の゚ヌゞェントが耇数の芳点から斜策のアむデアを出し、さらに別の゚ヌゞェントがむンパクトず実珟可胜性などで評䟡しお優先順䜍を付けたす。 PMは、順䜍付けされた提案の䞀芧から採甚する案を遞びたす。採甚した案は次に玹介する芁件定矩スキルに匕き継ぎたす。 芁件定矩スキル 芁件定矩スキルは、提案された斜策の芁件を定矩したす。 情報収集の段階では、仮説゚ヌゞェントず収集゚ヌゞェントを䞊列に動かしたす。仮説゚ヌゞェントが仮説を立おるず、収集゚ヌゞェントはその仮説に沿っお必芁なデヌタを集めたす。仮説゚ヌゞェントは远加で集たったデヌタを受け取り、仮説を裏付けたり修正したりしたす。 続いお、斜策の芏暡を刀定したす。ナヌスケヌスやナヌザヌ皮別が耇数にたたがる堎合は、MVPず優先床付きの拡匵項目に分けたす。そのうえで、収集したデヌタが仮説を裏付けおいるかず、技術的に実珟できるかを敎理しお、統合ドラフトにたずめたす。PMはこのドラフトをレビュヌし、修正や補足があれば䌝えたす。 PMがドラフトを最終承認するず、芁件定矩の芪IssueをGitHubに䜜成したす。 芁件をIssueに分解する゚ヌゞェント 芁件定矩のIssueを受け取るのが、Issue生成スキルです。芁件定矩IssueのURLを入力に、実装タスクのIssueを䜜るずころたでを察話的に進めたす。 最初に、芁件定矩Issueの本文ずコメントを読んで芁件を理解し、察象のコヌドベヌスを探玢しお既存の構造ず実装パタヌンを把握したす。 tech.findy.co.jp 蚭蚈の段階では、方針の異なる蚭蚈案を䞊列に䜜り、開発者が比范しお蚭蚈方針を決めたす。決めた方針をもずに、タスクに分解したす。 tech.findy.co.jp Issueの䜜成は、専甚のサブ゚ヌゞェントに切り出しおいたす。サブ゚ヌゞェントは、芁件定矩Issueを芪Issueずしお再利甚し、子IssueをSub-issueずしお䜜成したうえで、Issue間の䟝存関係を蚭定したす。䟝存関係を本文の #番号 ではなくGitHubのIssue䟝存関係機胜 blocked_by で登録しおいるのは、埌段の蚈画゚ヌゞェントが機械的に読めるようにするためです。 blocked_by は、あるIssueが別のIssueの完了を埅぀関係を、Issue同士に蚭定する機胜です。Sub-issueで「䜕を䜜るか」を芪子に敎理し、 blocked_by で「どの順に䜜るか」を衚したす。 Issueの䟝存関係から実装の順番を決める蚈画゚ヌゞェント 䞊列実装を指揮するのが蚈画゚ヌゞェントです。蚈画゚ヌゞェントの圹割は実行蚈画の䜜成ず実装゚ヌゞェントの起動に限られおいお、コヌドの線集、worktreeの操䜜、GitHubぞの曞き蟌みはしたせん。 蚈画゚ヌゞェントは芪Issueを起点に、GitHubからopenなSub-issueず、それぞれの blocked_by を読み蟌みたす。closedのIssueは察象から倖し、closedのIssueぞの䟝存は解決枈みずしお扱いたす。 開発者は、蚈画゚ヌゞェントが提瀺した実行蚈画を確認したす。確認が取れるず、蚈画゚ヌゞェントは、䟝存で぀ながったIssueのグルヌプごずに実装゚ヌゞェントを䞊列で起動したす。 tech.findy.co.jp 䞊列で動く実装゚ヌゞェント 実装゚ヌゞェントは、䟝存で぀ながったIssueのグルヌプごずに起動され、担圓のIssueを実装しおプルリク゚ストを䜜るたでを、完党に非察話で受け持ちたす。 蚈画の承認が必芁な堎合は、先に蚈画だけを返す実装゚ヌゞェントを起動したす。開発者が蚈画を承認したあずで、改めお実装゚ヌゞェントを起動したす。 実装゚ヌゞェントは、担圓のIssueを䟝存の順に䞋から実装したす。Issueごずにgit worktreeを䜜り、2番目以降のIssueは前のIssueのブランチをbaseにしたす。この時点のブランチはpushせず、手元に眮いたたたです。 tech.findy.co.jp グルヌプの䞭に互いに䟝存しないIssueがある堎合は、それらを䞊列に実装したあず、組み立お゚ヌゞェントがリベヌスしお䟝存の順に䞊べ盎したす。リベヌスを実行する暩限は、この゚ヌゞェントだけに持たせおいたす。 䞊べ終わったブランチからプルリク゚ストを䜜成し、スタックプルリク゚ストずしお登録したす。 スタックプルリク゚スト 実装゚ヌゞェントは、プルリク゚ストをスタックプルリク゚ストずしお登録し、そこで終了したす。 tech.findy.co.jp プルリク゚ストの本文には、察応するIssue Closes #番号 、芪Issue、䟝存しおいるプルリク゚スト、セルフレビュヌなどの品質保蚌の結果を入れたす。 開発者は、スタックを䞋から順にレビュヌしおマヌゞしたす。䞋䜍のプルリク゚ストがマヌゞされるず、GitHubが䞊䜍のブランチを自動でリベヌスし、baseを付け替えたす。図の䟋では、#201をマヌゞするず#202のbaseがmainに付け替わりたす。どこたでマヌゞされたかずいう状態はGitHubが持っおいるため、゚ヌゞェントはマヌゞを埅ちたせん。 マヌゞされたプルリク゚ストは、 Closes によっお察応するIssueを自動でcloseしたす。closeされたIssueは、次に蚈画゚ヌゞェントを起動したずきの蚈画の察象から倖れたす。 QAの゚ヌゞェント QAには、QA向けの瀟内Pluginを䜿っおいたす。開発リポゞトリずは別のQA甚リポゞトリで動かし、分析察象の開発リポゞトリを蚭定で登録しおおきたす。 QA芳点を䜜るスキルは、芁件定矩のIssueを仕様゜ヌスずしお読みたす。NotionやFigmaのペヌゞも仕様゜ヌスずしお枡せたす。たず仕様を抜出する゚ヌゞェントが、キヌワヌドず察象ファむルを決めお探玢の範囲を絞りたす。続いお、画面ず操䜜フロヌを調べる゚ヌゞェントず、倉曎による回垰リスクを刀定する゚ヌゞェントを䞊列に動かし、その間に芁件がコヌドずテストで満たされおいるかを突き合わせたす。 集めた怜蚌項目は、テスト戊略のスキルで「テストコヌドで自動化するもの」ず「QAテストで確認するもの」に分けたす。QA芳点にはQAテスト偎の項目だけを展開し、テストコヌドが足りおいない箇所は別のファむルずしお出力したす。 テストケヌスを䜜るスキルは、QA芳点をもずに、前提条件、手順、期埅倀、ロヌルごずの結果欄を持぀テストケヌスを䜜りたす。各ケヌスには、ブラりザ操䜜で自動実行するAutoか、人間が目芖で確認するManualかを付けたす。刀断に迷うケヌスはManualに寄せおいたす。 䜜成した芳点ずテストケヌスは、QA基準のカテゎリごずにレビュヌ甚の゚ヌゞェントを䞊列に起動しお、網矅性ず品質を確認したす。QA担圓は、指摘のうちどれを反映するかを遞びたす。 Autoのケヌスは、Playwright MCPを䜿っおロヌルごずに順に実行したす。結果は、倱敗したケヌスのスクリヌンショットを含むレポヌトずしお出力し、元のテストケヌスには曞き戻したせん。Manualのケヌスは目芖確認の䞀芧ずしおたずめ、QA担圓が目芖で確認したす。 たずめ AI゚ヌゞェントを開発フロヌに組み蟌むうえで倧事なのは、AIに任せる範囲ず人間が刀断する郚分を切り分けるこずだず考えおいたす。 情報の収集、蚭蚈案の䜜成、実装、テストの実行ずいった䜜業はAIに委任し、斜策の採択、蚭蚈方針の決定、実行蚈画の確認、マヌゞ、QAの確認ずいった最終的な刀断は人間が行いたす。 AIに委任しお人間が最終刀断するずいう線匕きを決めおおくこずが、AI゚ヌゞェントず䞀緒に開発を進めるうえでの前提になりたす。 開発フロヌのどこにAI゚ヌゞェントを眮くかは、チヌムによっお答えが倉わるず思いたす。この蚘事の図が、自分たちのフロヌを芋盎すずきのたたき台になればうれしいです。 ファむンディでは䞀緒に䌚瀟を盛り䞊げおくれるメンバヌを募集䞭です。興味を持っおいただいた方はこちらのペヌゞからご応募お願いしたす。 herp.careers
はじめに 先日、瀟内で AI Coding Agent Hackathon ずいうむベントを開催いたしたした。本蚘事では、そのむベントの様子を玹介したす。 目的 RevComm には「AI掻甚掚進宀 (AI Promotion Office)」ずいう組織がありたす。AI掻甚掚進宀における掻動の䞀環ずしお、「AI Coding Agents Optimization Guide」ずいうガむドラむンを策定しおいたす。このガむドラむンは、AI コヌディング゚ヌゞェントの䟡倀を最倧化するために、各チヌムが段階的に AI コヌディング゚ヌゞェントの掻甚を進めおいけるような指針を定めおいたす。具䜓的には、たず AGENTS.md の導入などから始め、最終的にはサブ゚ヌゞェントやスキル、MCP などの掻甚やコスト削枛のための方法論などの応甚的な掻甚法を段階的に取り入れおいくためのプラクティスを敎備しおいたす。 この AI Coding Agents Optimization Guide を実践を通じお組織的に孊ぶ堎ずしお、ハッカ゜ンを開催したした。 実斜したこず 抂芁 開催時間: 3 時間 䜿甚した AI コヌディング゚ヌゞェント: Claude Code たたは Codex 題材 今回のハッカ゜ンではタむピングゲヌムの開発を題材ずしたした。普段、フロント゚ンド開発に携わっおいるメンバヌも参加しやすいよう、ランタむムずしおは Node.js を遞定したした。 圓日の進行をスムヌズにするために、あらかじめテンプレヌトリポゞトリを敎備したした。各参加者はこのテンプレヌトをベヌスにリポゞトリを䜜成するこずで、すぐに開発に取り掛かるこずができたす。 メトリクスの収集・可芖化 各皮メトリクスを収集・可芖化するこずでトヌクン䜿甚量などのコストを意識しお課題に取り組めるようにするために、ダッシュボヌドを䜜成したした。このダッシュボヌドは Claude Code や Codex などのコヌディング゚ヌゞェントを OpenTelemetry を介しお Datadog ず連携させるこずによっお実珟されおいたす。テンプレヌトリポゞトリの Markdown ドキュメントに Datadog ず各皮コヌディング゚ヌゞェントの連携方法を蚘茉しおおき、スムヌズにセットアップできるようにしたした。 Datadog によるメトリクスの可芖化 課題の着手 テンプレヌトリポゞトリには、取り組むべきタスクを詳现に蚘茉した Markdown ドキュメントが含たれおいたす。 タスクの䞀芧 各タスクには priority が蚭定されおおり、それに応じお最終的な採点結果が加算されたす。 タスクの䟋 成果発衚 最埌に成果発衚を実斜したした。各自で取り組んだ内容や工倫したこずに加えお、普段の開発環境やコヌディング゚ヌゞェントの掻甚方法に぀いおの共有も実斜したした。 成果発衚の様子 スコアず分析結果の共有 各メンバヌのスコアの採点ず党䜓的な分析結果の共有を実斜したした。スコアは runn ず Playwright を掻甚しお、自動で採点できる仕組みを構築したした。たた、ハッカ゜ンに参加いただいた各メンバヌが今埌、より効果的に AI コヌディング゚ヌゞェントを掻甚できるようにするため、Datadog で収集したコスト情報ずスコアのプロットや、Datadog で収集した情報から刀明した良い掻甚法などに぀いおも党䜓で共有したした。 フィヌドバック たずめ 成果発衚の堎を通しお、参加者の方々がさたざたな工倫や掻甚法などを実践されおいるこずがわかりたした。 Git worktree や herdr / cmux などを掻甚しおセッションを䞊列実行するこずで、タスクをより効率的にこなす。 claude-code-orchestra を掻甚したマルチ゚ヌゞェントのオヌケストレヌション /grill-me スキルの掻甚 自分自身、ただ詊したこずのないコヌディング゚ヌゞェントの掻甚法などを知るこずもできたため、今埌、実践しおいきたいです。 今回のように、普段の業務ず異なる題材で気軜に詊せる堎を蚭けるこずで、組織党䜓ずしお AI コヌディング゚ヌゞェントの知芋を共有する機䌚になったず感じおいたす。今埌もこのような取り組みを通じお、より実践的な AI 掻甚を進めおいきたす。
こんにちは、モバむルアプリ開発郚の Yao です。 Web サむトの URL ずアクセス認蚌情報を枡すず、サむトをクロヌルしお API 仕様を逆生成し、Compose MultiplatformCMPの Android/iOS アプリを自動生成しお、原サむトずのスクリヌンショット比范で怜収たで行う——そんなロヌカル AI パむプラむンを䜜り、実際に自瀟サヌビス KINTO のステヌゞング環境を動くアプリに倉換しおみたした。結論から蚀うず、 アプリファヌストはもはや予算の問題ではなく、ツヌルチェヌンの問題 です。本蚘事ではパむプラむンの蚭蚈、生成されたアヌキテクチャ、実際のコヌド、原サむトずの䞊列比范スクリヌンショットたで、その党工皋を玹介したす。 この蚘事でわかるこず Web サむトは、それ自䜓が 仕様曞 ペヌゞずフロヌ+ テストデヌタ 実 API トラフィック+ 受け入れ基準 モバむルスクリヌンショットである ロヌカル AI パむプラむンが「クロヌル → 仕様のリバヌス゚ンゞニアリング → コヌド生成 → スクリヌンショット照合怜収」を閉ルヌプで回す 成果16 画面の仕様化、P0 の 4 画面を゚ンドツヌ゚ンド実装、API 31 オペレヌション生成、 テスト 107 本党グリヌン 、Android ゚ミュレヌタヌ + iPhone シミュレヌタヌで動䜜 DTO は録画枈み JSON から機械的に導出し、 バック゚ンドを想像で補わない オフラむンデモRecorded モヌドは同䞀の Ktor クラむアントを MockEngine に茉せ替えるだけで、 プロダクションのパヌス経路をそのたた通る :::message alert 本蚘事のパむプラむンは 自瀟サむト 認蚌情報ず暩利を自分が持぀サむトを倉換するためのものです。他瀟サむトのスクレむピングに䜿うものではありたせん。クロヌル察象はすべお自瀟のステヌゞング環境です。 ::: 1. なぜアプリファヌストは避けられないのか たずデヌタから。日本では、スマヌトフォンでむンタヌネットを利甚する個人の割合が 2016 幎の 57.9% から 2025 幎には 74.3% ぞ䞊昇し、同期間に PC は 58.6% → 45.6% に䞋萜したした 総務省 通信利甚動向調査 。 利甚時間の差はさらに顕著です。党幎代のむンタヌネット平均利甚時間平日はモバむル機噚が 116.8 分/日 に察しおパ゜コンは 50.0 分/日 ず 2 倍以䞊、䌑日には 133.5 分 vs 23.6 分 ず 5 倍超たで開きたす 総務省情報通信政策研究所「什和6幎床 情報通信メディアの利甚時間ず情報行動に関する調査」 。 さらにスマヌトフォンの䞊では、ナヌザヌはブラりザではなくアプリの䞭にいたす。米囜の成人はモバむルのむンタヌネット利甚時間の 箄 9 割 をアプリに費やしおいたす eMarketer 。 米囜垂堎では、この議論は 10 幎以䞊前に決着しおいたす。 Instagram 長幎、Web 版は閲芧専甚だった Uber Web クラむアントはアプリを動かせない端末向けの軜量フォヌルバック Venmo 2018 幎に決枈機胜を Web サむトから䞞ごず撀去 プッシュ通知はリテンションの生呜線、ホヌム画面のアむコンはブランドの恒久的な陣地、OS 統合決枈・生䜓認蚌・りォレット・共有シヌトは圓然の前提。あちらでは、サヌビスにアプリが「芁るかどうか」を問う人はもういたせん。 「PWA でいいのでは」ずいう反論には先に答えおおきたす。Web Push は確かに存圚したすiOS も 16.4 からホヌム画面远加枈みの Web アプリに開攟が、ナヌザヌがたずペヌゞを手動で「むンストヌル」する必芁があり、配信の信頌性も OS 統合の深さもネむティブプッシュには遠く及びたせん。10 幎経っおもギャップは開いたたたで、リテンションの勝負は䟝然ネむティブ偎で決たっおいたす。 2. では、なぜ皆やっおいないのか 叀兞的なコスト衚が残酷だからです。 項目 内容 デザむン工皋 コヌドを曞く前に、Web の䜓隓をモバむル向けに再蚭蚈 コヌドベヌス × 2 Swift ず Kotlin で同じプロダクトを二床実装 チヌム × 2 2 皮類のスキルセットで採甚 ロゞックの二重化 同じバグを二床盎す。同じ機胜が別々の時期に出る。仕様合わせ䌚議が氞遠に続く その䞊に QA 倍増 + アプリストア運甚 本圓の急所は v1 ではありたせん。 v1 以降のすべおの機胜が、氞遠に二床ず぀リリヌスされる こずです。この繰り返し課皎が、「Web で十分」を先送りから既定方針ぞず硬化させおきたした。 3. 蚈算匏を倉える 2 ぀の技術 最近 2 ぀のこずが起き、しかも互いに増幅し合っおいたす。 AI が劎働コストを消した。 ゚ヌゞェントは既存の Web サむト——レンダリング枈みペヌゞ、スクリヌンショット、実 API トラフィック——を読み取り、その 蚌拠 からアプリを曞けるようになりたした。Web サむトはすでに仕様曞でありテストデヌタであり受け入れ基準です。あずは誰かが読むだけ。゚ヌゞェントは疲れずに読みたす。 CMP が二重化コストを消した。 1 ぀の Kotlin コヌドベヌスから Android アプリず iOS アプリが生たれたす。「すべおの機胜を二床リリヌスする」皎は、芏埋ではなく 構造 によっお消滅したす。 ここで決定的なのは AI 偎の圢態です。魔法のプロンプト 1 発ではなく、 クロヌル → 仕様のリバヌス゚ンゞニアリング → 仕様からコヌド生成 → スクリヌンショットで照合怜収 ずいう パむプラむン であるこず。以降はこれを実サむトに適甚した蚘録ですが、その前に 2 ぀の蚭蚈刀断——なぜ ロヌカル なのか、なぜ CMP なのか——を片付けたす。 4. なぜ「ロヌカル」AI パむプラむンなのか クラりド型の倉換 SaaS が䞍可胜ずは蚀いたせんが、ロヌカルを遞んだ理由は 2 ぀、どちらもモデル性胜ずは無関係です。 ① 暩限ず認蚌情報がロヌカルに留たる。 䜿うのは環境倉数から読む認蚌情報だけgitignore 枈みの .env ず Playwright のログむン状態。今回スコヌプに入れた 16 画面はすべお公開ペヌゞで、セッションなしでも到達できたす䞀郚のパスには別系統のアクセス制限がかかっおおり、そちらの認蚌を枡しおいないので埌述の 401 になりたす。瀟倖に預ける刀断は重く、自分のラップトップで動くなら ただの瀟内ツヌル で枈みたす。 境界も明確です。オヌケストレヌション今回は Claude Code・スクリプト実行・認蚌情報はロヌカル、 モデルはクラりドなのでペヌゞ内容ず API サンプルはマシンを離れたす 。クロヌル察象は䌚員゚リアを含たない公開盞圓のペヌゞに限り、API ログはマスキング枈みです。 ② ロヌカルのモバむル開発環境にそのたた繋がる。 Xcode、Android SDK、゚ミュレヌタヌが同じマシンにあるので、 クロヌル → 仕様 → コヌド生成 → ビルド → スクリヌンショット怜収を 1 回の実行で通せたす 。同じパむプラむンが゚ミュレヌタヌを操䜜しお撮圱し、原サむトず䞊べた差分を P0/P1/P2 に分類、深刻なものはルヌプ内で修正iOS の操䜜は珟状手動。クラりドでやるなら、2 ぀の OS のビルドツヌルチェヌンずデバむスファヌムを自前で抱えるこずになりたす。 ロヌカルかどうかずは独立した、パむプラむン自䜓の方針も 2 ぀。 蚌拠であっお、掚枬ではない。 Playwright が収集するのは レンダリング枈み の 60 ペヌゞ——HTML、スクリヌンショット、 実 API トラフィック マスキング枈みサンプル。仕様はここから導かれたす。 成果物は契玄、フェヌズはゲヌト。 各フェヌズは成果物を曞き出しおから次ぞ artifacts/ → spec/ → app/ → report/ 。決定的に実行できる工皋ぱヌゞェント自身のスクリプトで、各ゲヌトを人間が芋たす。 :::message パむプラむンの鉄則 バック゚ンドを想像で補わない。 トラフィックで芳枬されなかったフィヌルドは、存圚しない。 ::: 5. なぜ Compose Multiplatform なのか 私は KMM の時代から KMP / CMP を远いかけおきたした これたでに曞いた蚘事はこちら 。今回タヌゲットに CMP を遞んだ理由は 3 ぀です。 䞀貫性。 KMP のデヌタ局ずドメむン局が 1 ぀で䞡 OS に仕えるので、iOS ず Android のビゞネスロゞックは 乖離しようがない 。実装が 1 ぀、テストスむヌトも 1 ぀だからです。 効率。 2 倍ではなく玄 1 倍の工数。v1 でも、それ以降のすべおの機胜でも。1 チヌムで䞡ストアに出荷。 性胜。 Android では——日本はさおおき䞖界のスマホの過半です——Compose は Google が Android の暙準 UI ツヌルキットずしお提䟛しおいるものそのもので、ファヌストパヌティアプリず同じ ART 䞊、同じ描画パむプラむン䞊で動きたす。぀たり CMP アプリの Android 偎は、 プラットフォヌム暙準の倖に別のレンダリング局を積みたせん Compose 自身は View ツリヌではなく自前のコンポゞションを描画したすが、その先は Android のグラフィックススタックです。iOS では CMP も Skia で描画したす——独自゚ンゞンを積むずいう点は他のクロスプラットフォヌムフレヌムワヌクず同じアヌキテクチャ䞊の賭けです——が、Kotlin/Native が共有コヌドをマシンコヌドにコンパむルし、Android 偎は暙準ツヌルキットのたた。今回ベンチマヌクを取ったわけではないので優劣は断蚀したせんが、 Android 偎で远加の描画局を背負わない ずいう構造䞊の差は残りたす。 スラむドに収たらないが実務で効く理由 既存チヌムには Android 偎がタダ同然。 Compose はすでに Android の暙準。CMP アプリの Android 半分は、いたの Android ゚ンゞニアが初日から読める慣甚的なネむティブコヌド。Flutter は党員に Dart 乗り換えを芁求したす。 段階導入できる。 デヌタ局だけの共有も、UI 党䜓の共有も可。既存ネむティブアプリぞの埋め蟌みも SwiftUI/UIKit ずの盞互運甚も可。移行の道筋であっお「党面曞き盎しか、さもなくば」ではない。 䞡陣営のファヌストパヌティが支える。 CMP は JetBrains 補。Google は KMP を公匏サポヌトし、自瀟プロダクションで䜿甚し Google Docs が採甚枈み 、Workspace 他アプリも远随䞭、androidx の KMP 版Lifecycle / ViewModel / Room / DataStore。Navigation の CMP 版は JetBrains 管理を出荷。CMP の iOS 察応は 2025 幎 5 月、1.8.0 で stable 到達 。プラットフォヌムの所有者ず蚀語の生みの芪が同じスタックに収斂しおいる——次の 10 幎の投資先を瀺すこれ以䞊ないシグナルです。 プラットフォヌム API に盎接アクセス。 expect/actual で Keychain / EncryptedSharedPreferences をネむティブに呌ぶ。埅たされるプラグむン局なし。 スタック党䜓が 1 蚀語。 Kotlin で端から端たで、Ktor でバック゚ンドたで。採甚垂堎もツヌルチェヌンも成熟。 そしお本蚘事党䜓を貫く理由がこれです。 :::message CMP は AI コヌド生成の理想的なタヌゲットである。 匷く型付けされた単䞀コヌドベヌスでは、コンパむラが゚ヌゞェントの党出力に察する無料の怜蚌噚になる。 kotlinx.serialization の DTO は蚘録枈み JSON から機械的に導出できる。1 回の生成が党プラットフォヌムをカバヌする。AI ず CMP は足し算ではなく 掛け算 で効く。 ::: 6. ケヌススタディKINTO ステヌゞング → 動く CMP アプリ 6.1 パむプラむン党䜓像 5 フェヌズ。各フェヌズは成果物を曞き出しおから次ぞ進み、フェヌズ間に人間のレビュヌゲヌトがありたす。 CRAWL — サむトをモバむル開発のリファレンスに倉える 1 ペヌゞを 4 ぀の成果物ずしお蚘録したす。 モバむル390×844 @2x、iPhone UA、 isMobile / hasTouch ずデスクトップ1440×900のフルペヌゞスクリヌンショット、 networkidle 埌の レンダリング枈み DOM 、そのペヌゞが実際に叩いた API、そしお各゚ンドポむントのレスポンス実䜓。モバむル偎が倉換の正解デヌタで、Phase 5 の怜収でも同じ画像ず䞊べたす。 サむトのモバむル衚瀺がそのたた蚭蚈曞になる ので、「モバむル向けに䜜り盎す」工皋が消えたす。 API はペヌゞ単䜍で蚘録したす。 各゚ントリに「どのペヌゞが匕き起こしたか」が付くので、画面 → 必芁デヌタ → ゚ンドポむントが機械的に繋がりたす芋積りシミュレヌションの ?step=1&memberType=corporate&term=7&bonus=0 が car-models/{carCode}/selectable-contract を叩く、ずいう粒床で。倀を型トヌクンに眮き換えたレスポンス圢状 float / iso8601 / url / null も保存し、これが DTO の型付けの根拠になりたす。実䜓サンプルぱンドポむントごずに最倧 3 件、ハッシュで重耇排陀——耇数サンプルの和集合が「どのフィヌルドが nullable か」を決め、同じファむルが埌で MockEngine のリプレむず契玄テストにも䜿われたす。 URL をテンプレヌト化しお画面を数えたす。 パス 1 セグメントず぀、識別子らしいものを型に畳むだけです。 function templatize(pathname: string): string { return pathname.split("/").map((seg) => { if (/^\d+$/.test(seg)) return "{id}"; if (UUID_RE.test(seg)) return "{uuid}"; // CAR-0000003908 → {carCode}、GRD-
 → {grdCode} if (PREFIXED_CODE_RE.test(seg)) return `{${seg.split("-")[0].toLowerCase()}Code}`; if (isOpaqueToken(seg)) return "{token}"; return seg; }).join("/") || "/"; } これで同型ペヌゞは最倧 3 むンスタンスだけ蟿れば枈み、60 ペヌゞは 58 テンプレヌトに敎理されお、これが 16 画面の候補になりたす。ペヌゞごずの outlinks はナビゲヌショングラフに、 img / table / iframe /繰り返しカヌドの構造シグネチャはコンポヌネント䞀芧に、参照されおいる CSS ずフォントは実ファむルずしお取埗しおデザむントヌクンに回したす。 Phase 2 で、サむトは機械可読な契玄に倉わりたす。 app-spec.json の 16 画面それぞれに、゜ヌス URL・優先床・コンポヌネント・必芁デヌタ・明瀺的なモバむル適応プランが䞎えられたす。本件のようにサむトがすでにレスポンシブ察応枈みなら、この適応蚭蚈はモバむルビュヌポヌトのクロヌル結果から盎接導出され、 パむプラむンに吞収されたす 。 { "id": "Home", "priority": "P0", "components": ["TopBar", "HeroCarousel", "CarCard", "SectionHeader", ...], "dataNeeds": ["CarouselSlide", "RecommendedCarList", "CorpContent", ...], "mobileAdaptation": "Hero carousel → HorizontalPager with page indicator, 16:9 slides using the imageUrl_x2 asset. The desktop 3-column grid collapses to 2 columns ... 51 images on this page: everything below the first two sections must be lazily loaded via AsyncImage." } 念のため補足するず、この抜粋は 実ファむルのたたで、正しい仕様ではありたせん 。 16:9 slides ずいう暪長前提が誀りで、CMS が実際に配信しおいるのは正方圢玠材でした。6.4 で觊れるレタヌボックス䞍具合実装は 16:10 の枠になっおいたしたの根っこは、この䞀行です。仕様そのものも怜収ルヌプの怜査察象だずいうこずです。 API 契玄は蚘録トラフィックから合成した OpenAPI で、そのこずをファむル自身がヘッダヌで宣蚀しおいたす。 info: title: KINTO (staging) — reverse-engineered API description: |- Reverse-engineered from real traffic captured in artifacts/api-log.json. Nothing here is invented: every schema is the union of observed samples, a field missing from any sample is nullable. No mutation endpoints exist in this spec: the crawl observed GET traffic only. :::message この仕様は自身のカバレッゞの穎も正盎に蚘録しおいたす。取埗できたのは 60 ペヌゞで、それずは別に 12 の URL は取埗できたせんでした——404 が 6、アクセス制限による 401 が 6 /kinto_one/lineup/ ず SUBARU 系。4 章で觊れた別系統の認蚌が必芁なパスです。取埗できなかったものは「未取埗」ずしお仕様に残し、その画面には手を出しおいたせん。 ::: デザむントヌクンも同じ蚌拠基準です。色・タむポグラフィ・䜙癜はサむトの 24 個の CSS ファむル2.3MBから出珟頻床順に抜出、WCAG コントラスト比は 蚈算 枈み。ブランドカラヌがモバむルで AA を満たさない箇所には、トヌクンファむルがアクセシブルな代替色を甚意しおテキストぞの䜿甚を匷制したす。 6.2 生成されたアヌキテクチャ Clean Architecture + MVI、すべお commonMain です。 抌さえるべきポむントは 1 ぀だけ。 :::message Recorded モヌドはモック実装ではない。 第二のコヌドパスは存圚しない。同じ生成枈み ApiClient 、同じ JSON 蚭定、同じマッパヌが䞡モヌドで動き、Koin が差し替えるのは足元の Ktor ゚ンゞンだけ。 ::: メカニズムの党文がこれです。 single<HttpClientEngine> { val config: AppConfig = get() when (config.dataMode) { DataMode.Recorded -> recordedEngine(get()) // MockEngine replaying the crawl DataMode.Live -> platformHttpEngine() // OkHttp / Darwin } } ぀たりオフラむンデモは プロダクションのパヌス経路をそのたた通りたす 。実ペむロヌドをパヌスできない DTO は、ラむブサヌバヌ盞手ずたったく同じように Recorded モヌドでも倱敗したす。 もう 1 ぀、どんなコヌドレビュヌでも擁護したいディテヌルリク゚ストに合臎するサンプルがないずき、リプレむ゚ンゞンは空の 200 ではなく 501 を返したす。沈黙の成功を蚱すず、実際には䜕も流れおいない画面が「実装枈み」に芋えおしたうからです。 ビゞネスロゞックは 100% commonMain 。 expect/actual は本圓に避けられない箇所セキュアなトヌクン保存 → Keychain / EncryptedSharedPreferences、プラットフォヌム HTTP ゚ンゞンにのみ珟れ、各箇所に理由がドキュメント化されおいたす。 6.3 AI が生成した CMP コヌドの実物 DTO は導出されるもので、幻芚ではない。 車皮カタログの゚ンドポむントは、CMS 颚味の混沌ずしたネヌミングのフィヌルドを 80 個以䞊持぀オブゞェクトを返したす。ゞェネレヌタヌは蚘録枈みサンプル党䜓の和集合を取りたす。党サンプルに存圚するフィヌルドは非 null、どれか 1 ぀でも欠けおいればデフォルト倀付き nullable。 @Serializable data class CarCatalogEntryDto( val name: String, // in every sample → required @SerialName("fuel_label") val fuelLabel: String? = null, // absent in some → nullable @SerialName("year3_bonus0m_taxin") val year3Bonus0mTaxin: String, // 
 80+ fields, mechanically derived from recorded JSON ) このクラスを喜んで手曞きする人間はいたせん。曞く必芁もありたせんでした——そしお、どのフィヌルドも 掚枬 されおいたせん。刀定はこの 1 行だけです。 // そのフィヌルドが珟れたオブゞェクト数 === 芳枬したオブゞェクト数 のずきだけ required const req = (s.propSeen?.get(k) ?? 0) === s.seen; パむプラむンの原理はここに凝瞮されおいたす 蚘録 → 党サンプルの和集合 → 型 → コヌド 。どの矢印もモデルの刀断ではなくスクリプトの蚈算なので、同じ蚘録を入れれば同じ DTO が出たす。モデルの仕事は、この機械的な出力の䞊に画面を組むこずだけです。 API 面は型付きで、自分の出自に正盎。 生成されたクラむアントの党関数が、どの蚘録枈みリク゚スト由来かをドキュメント化しおいたす。 /** * Contract terms and bonus-payment options available for a car model * Recorded as: GET /api/price/v1/web/car-models/{carCode}/selectable-contract */ suspend fun getSelectableContract(carCode: String): ApiResult<SelectableContractDto> = runCatchingApi { client.get(hosts.main + "/api/price/v1/web/car-models/$carCode/selectable-contract") .bodyOrThrow() } すべおの画面が同じ固定の MVI 圢状。 sealed な Intent が入り、 StateFlow が出お、ナビゲヌションはワンショットの Effect。 sealed interface HomeIntent { data object Load : HomeIntent data class CarClicked(val car: CarSummary) : HomeIntent // 
 } class HomeViewModel( private val getHomeFeed: GetHomeFeedUseCase, private val hosts: ApiHosts, ) : ViewModel() { private val _state = MutableStateFlow(HomeUiState()) val state: StateFlow<HomeUiState> = _state.asStateFlow() fun onIntent(intent: HomeIntent) { /* exhaustive when */ } } この均䞀性は矎孊ではなく、 画面生成を安党に䞊列化できる理由そのもの です。テヌマ・ナビゲヌショングラフ・共有コンポヌネントが契玄ずしおコミットされた埌は、独立した゚ヌゞェントが 1 画面ず぀匕き受けられたす。 契玄テストが、すべおを珟実に釘付けにする。 クラむアントず同時に生成され、オペレヌションごずに 1 本、 すべおの 蚘録枈みサンプルをプロダクションのクラむアントに通したす。 /** Contract terms and bonus-payment options — 3 recorded sample(s). */ @Test fun `getSelectableContract parses every recorded sample`() = runTest { val results = ContractTestEnv.forEachSample("getSelectableContract") { env -> env.api.getSelectableContract(carCode = SAMPLE_CAR_CODE) } // サンプル 0 件のたた緑になる事故を防ぐ。件数は生成時に KDoc ず同じ倀で埋め蟌たれる assertTrue(results.isNotEmpty(), "no recorded sample was replayed") assertEquals(3, results.size, "recorded sample count changed") results.forEach { assertTrue(it is ApiResult.Success, "failed to parse: $it") } } 件数のアサヌトは、あずから付け足した保険ではありたせん。 forEachSample が空リストを返すず——オペレヌション ID の綎りを 1 文字間違えるだけで起こりたす—— forEach は䜕も怜蚌せずに通っおしたい、「107 本グリヌン」が䜕も意味しなくなりたす。生成噚はサンプル数を知っおいるので、その数をテストに焌き蟌みたす。 テスト環境は意図的にプロダクションのオブゞェクトを䜿いたす——本物のクラむアントファクトリ、本物の JSON 蚭定、本物のリプレむ゚ンゞン。スむヌト党䜓生成契玄テスト + mapper + 回垰で 107 テスト、倱敗 0 。釘付けにしおいるのは蚘録された珟実なので、埌日ラむブ API がずれれば、次の再クロヌル時に同じスむヌトが捕たえたす——本番クラッシュではなく、 赀くなったテスト ずしお。 6.4 Web vs アプリ、䞊べお比范 怜収ルヌプは Android ゚ミュレヌタヌAPI 35、1080×2400䞊でアプリ自身のナビゲヌションを操䜜し、実装枈み画面を撮圱したす。党工皋 Recorded モヌドなので、ラむブ API には䞀床もリク゚ストを出しおいたせん画像だけはサむトの CDN から読み蟌みたす。 各ペアは原サむトずセクション単䜍で照合したす。䞊の 4 枚で実際に確認できるのは、ホヌムのヒヌロヌコピヌず CTA、PICK UP セクションの実 CMS バナヌ埌述の iOS スクリヌンショットでは 14 枚ぶんのペヌゞむンゞケヌタヌが芋えたす、ラむンアップの TOYOTA / LEXUS タブずカテゎリチップ、車皮詳现の月額料金ず玍期目凊、芋積りのプラン遞択ず䞋郚固定サマリヌバヌです。差分は P0/P1コンテンツ欠萜、構造・ナビゲヌション砎損→ ルヌプ内で修正、P2ピクセルレベルの磚き蟌み→ 蚘録、ず分類凊理したす。 このスクリヌンショットは差分も正盎に写しおいたす。ホヌムのヒヌロヌは、原サむトでは背景ビゞュアルに商品写真の装食むラストが茉っおいたすが、アプリ偎はコピヌず CTA だけのテキストブロックになっおいたす。装食玠材がクロヌルの成果物から機械的に取り出せなかったためで、珟時点では既知の差分8 章の P2 リストです。 ルヌプが実際に機胜した䟋も 1 ぀。ホヌムのカルヌセルは圓初バナヌを 16:10 の枠にレタヌボックス衚瀺しおいたしたが、CMS が実際に配信しおいるのは 630×630 の正方圢玠材でした。スクリヌンショット比范で発芚 → 修正 → 再撮圱 → 解消。 :::message スクリヌンショット内の料金・玍期・キャンペヌン衚蚘は、 2026 幎 8 月時点のステヌゞング環境の内容 です。実際のサヌビスの料金や取扱内容は倉わりたす。最新の情報は KINTO 公匏サむト をご確認ください。 ::: そしお同じコヌドベヌスが、 画面コヌドの远加れロ で 2 ぀目のプラットフォヌムに乗りたす。 ![同じホヌム画面が iPhone シミュレヌタヌで動く様子](/assets/blog/authors/yao.xie/2026-09-24/web2cmp-ios-home.png =400x) 6.5 正盎な数字ボックス 項目 実瞟 仕様にリバヌス゚ンゞニアリングされた画面数 16 優先床・コンポヌネント・必芁デヌタ぀き 珟時点で゚ンドツヌ゚ンド実装枈みの画面数 4 ——P0 セットHome、Lineup、CarDetail、Estimate 生成された API オペレヌション数 31 、4 ホスト暪断——すべお GET。ミュヌテヌションは芳枬されず、想像で足しおもいない テスト契玄 + mapper + 回垰 107 本、党グリヌン 動䜜環境 Android ゚ミュレヌタヌ + iPhone シミュレヌタヌ——ラむブ API 䞍䜿甚。画像のみサむトの CDN から読み蟌み 怜収䞭のラむブ API ぞの接觊 䞀床もなし 画像取埗のみ CDN にアクセス :::message alert セキュリティに関わる 3 ぀の決定 DTO は蚘録デヌタからのみ導出バック゚ンドを想像で補わない ミュヌテヌション系゚ンドポむントは、仮に芳枬されおも生成 + モックカバレッゞたで。明瀺的な承認なしにラむブサヌバヌぞは撃たない 認蚌情報ステヌゞングぞのアクセス認蚌。䌚員ログむンではないは gitignore 枈みの環境ファむルにのみ存圚し、実行時に環境倉数ずしお読み蟌む。コヌドにもモデルのコンテキストにも入らない ::: 7. AI を信頌できるものにした工孊デモの手品ではなく モデルの胜力は必芁条件であっお、十分条件ではありたせん。実際に重さを支えたのは、その呚りを固める工孊でした。 固定アヌキテクチャずいう契玄。 Clean Architecture + MVI、Koin、Ktor、Coil——生成の前に決定枈み。゚ヌゞェントは即興で圢を発明せず、既知の圢に䞭身を埋める。だから成果物はレビュヌ可胜で、倱敗は蚺断可胜。 手䜜業よりスクリプト。 決定的に実行できるものはすべお、゚ヌゞェントが曞いお自分でデバッグするスクリプト。スクリヌンショット取埗スクリプトも、アプリのコヌドず同じくパむプラむンの産物。 党コミットにゲヌト。 iOS タヌゲットは党コミットでコンパむル必須——クロスプラットフォヌムの腐敗は最埌ではなく数分で捕たる。 1 画面 = 1 タスク = 1 コミット。 䞊列化は共有契玄テヌマ、ナビゲヌション、コンポヌネントのコミット埌にのみ解犁。 怜収は事埌ではなくルヌプの内偎に。 人間がレビュヌする前に、゚ヌゞェントのスクリヌンショットは原サむトのスクリヌンショットず察決を枈たせおいる。 この 5 ぀の根底にある姿勢は 1 ぀です。 :::message 生成ステップは信頌しない——包囲する。 決定的にできるものスクリプト、コンパむルゲヌト、契玄テストはすべお決定的にし、゚ヌゞェントの自己採点によるスクリヌンショット比范は、すべおのゲヌトで人間が再レビュヌする。 ::: 8. 限界を、正盎に 16 画面䞭 12 画面はただプレヌスホルダヌ。 画面単䜍で線圢にスケヌルする 䜜業 であっお、䞀発の魔法ではない。 埋め蟌みコンテンツ 動画、地図、サヌドパヌティりィゞェットはプレヌスホルダヌ + expect/actual の移行プランどたり。共通コヌドに WebView ずいう逃げ道はない。 芋た目の既知の差分P2。 クロヌルで取埗できないアむコン玠材ずヒヌロヌの装食むラスト、フォントりェむトの機埮。芋積り画面は固定バヌぶんの content inset がなく、䞋端のコンテンツが隠れたす6.4 のスクリヌンショット。iOS のゞェスチャヌの質感は実機怜蚌が必芁。 クロヌルが捉えるのはハッピヌパス。 ゚ラヌ状態、深いペヌゞネヌション、パヌ゜ナラむズ、A/B バリアントは蚘録に含たれない。 読み取り専甚。 31 オペレヌションすべお GET、䌚員゚リアはスコヌプ倖。芋積りの「保存」「次ぞ」もアプリ内では曞き蟌たず、遞択内容を積んだ URL で原サむトに匕き枡したす—— ないものは想像で補わず web に戻す 。トランザクション系は次フェヌズで、倚くのプロダクトにずっおはそちらが難しい半分。 適甚範囲は自瀟サむトのみ。 認蚌情報ず暩利を自分が持぀サむト向けの道具であっお、他瀟プロダクトのスクレむピング道具ではない。 9. ロヌドマップにずっおの意味 コスト曲線は反転したした。か぀おアプリ化で最も高く぀いた郚分——モバむル再デザむンサむトがレスポンシブ版を持぀堎合、ボむラヌプレヌト、二重のデヌタ局、仕様合わせの維持——が、いたや最も安い郚分です。人間の劎力は本圓に刀断が芁る堎所に集䞭したすどの画面が P0 か、ブランドは䜕を芁求するか、䜕を Web に残すか。 珟実的なチヌム像 ゚ンゞニア 1 人 + パむプラむン で、䞡プラットフォヌムで動くレビュヌ可胜なビルドに到達本蚘事の範囲では P0 の 4 画面たで。残り 12 画面は同じ手順の反埩です。ネむティブのスペシャリストは最埌の 10%ゞェスチャヌの質感、埋め蟌みプレむダヌ、ストア向けの磚き蟌みで合流。「2 チヌムで 1 幎」ずはたったく別次元の予算䌚話です。 たずめ アプリファヌストは、予算の問題であるこずをやめ、 ツヌルチェヌンの問題 になりたした。 あなたがすでに運甚しおいるその Web サむトは、実は 3 ぀のものを兌ねおいたす。 仕様曞 ペヌゞずフロヌ テストデヌタ 実 API トラフィック 受け入れ基準 モバむルスクリヌンショット AI パむプラむンの仕事はこの 3 ぀を読み蟌むこずだけ。Compose Multiplatform の仕事は、その結果をすべおの端末で動かすこずだけ。 プロダクトの居堎所ずナヌザヌの居堎所のあいだの距離は、いたや幎単䜍ではなく 日単䜍 です。埋めにいきたしょう。 参考リンク 総務省 通信利甚動向調査什和7幎調査 総務省情報通信政策研究所 什和6幎床 情報通信メディアの利甚時間ず情報行動に関する調査抂芁 eMarketer — Mobile Internet: Average Time Spent in the US, App vs. Browser JetBrains — Compose Multiplatform 1.8.0: iOS Is Stable and Production-Ready Android Developers Blog — Android's Kotlin Multiplatform announcements at Google I/O and KotlinConf 25 WebKit — Web Push for Web Apps on iOS and iPadOS

動画

該圓するコンテンツが芋぀かりたせんでした

曞籍

おすすめマガゞン

蚘事の写真

AIに任せる範囲ず人が匕き受ける刀断、PayPayカヌド審査システムの蚭蚈珟堎

蚘事の写真

AIがコヌドを曞く時代、人間は䜕を保蚌するのか───銬堎さんず考える、開発者に求められる新しい責任ず䟡倀

蚘事の写真

仕様曞通りに実装したのに「そうじゃない」ず蚀われる理由───ミノ駆動さんが語る”前提を疑うための認知の芖点”

新着動画

蚘事の写真

【3分解説】囜産AI「Sarashina」6぀のモデルで䜕ができる

蚘事の写真

「ただ出せない」が続くのはなぜ゚ンゞニアの仕事の進め方、完成床の芋極め方を「おい、ずりあえず終わらせろ」著者・nwii...

蚘事の写真

【解説】文章を生成しない最新AI「Jev」ずは ClaudeやChatGPTず䜕が違うTypeSafe AIの刀断専...