- アプリケーション基盤: VS Code拡張機能の基本構成を作成 (
srcディレクトリ構造など)。 - サービス (Services):
DocService: MDN検索およびコンテンツ取得 (ライブラリ:jsdom,turndownを使用)。GeminiService: AIによる要約・コード生成 (ライブラリ:@google/generative-aiを使用)。ExecutionService: ローカルNode.js環境でのコード実行 (child_processを使用)。
- コントローラー:
DocMateControllerを実装し、検索 → 要約 → 実行 → 自動修正のフローを制御。 - UI:
WebviewProviderを実装し、サイドパネルに結果を表示。 - コマンド:
docmate.explainコマンドを登録し、右クリックメニューから呼び出せるように設定。 - 設定:
docmate.apiKey(APIキー) とdocmate.model(モデル名) の設定項目を追加。
npx --package yo --package generator-code -- yo code(プロジェクトの雛形作成)- 選択オプション:
- Extension Type: New Extension (TypeScript)
- Bundler: webpack
- Package Manager: npm
- 選択オプション:
npm install @google/generative-ai jsdom turndown marked(依存ライブラリのインストール)npm install --save-dev @types/jsdom @types/turndown @types/marked(型定義ファイルのインストール)npm run compile(TypeScriptのビルド)
-
ファイル移動時の競合エラー:
- 問題: 初期セットアップ時に
mvコマンドとnpm installが並行して走り、ファイルロック等の競合が発生した。 - 対処: バックグラウンドプロセスを停止し、
rsyncコマンドを使用して安全にファイルを移動した。
- 問題: 初期セットアップ時に
-
Markedライブラリの互換性:
- 問題:
markedv12以降はESM専用であり、VS Code拡張機能(CommonJS)でrequireするとエラーになった。 - 対処: CommonJSをサポートしている
marked@4にダウングレード (npm install marked@4) した。
- 問題:
-
Geminiモデルの利用可能性:
- 問題: デフォルト設定の
gemini-1.5-flashでAPI呼び出しを行うと404エラーが発生した(APIバージョンの違いや地域制限の可能性)。 - 対処: 利用可能な
gemini-2.5-flashにデフォルトモデルを変更し、設定ファイル (package.json) とコードを更新した。
- 問題: デフォルト設定の
-
Webviewのセキュリティ:
- 対処: 外部スクリプトやスタイルの読み込みを制限し、基本的なCSP (Content Security Policy) に準拠する形にした(スタイルはインラインで記述)。
-
複数サンプルコードの対応:
GeminiServiceのプロンプトを改修し、単一のコードではなくexamples配列(タイトル、説明、コード)を含むJSON形式でレスポンスを受け取るように変更。
-
Google Colab風UI (Webview):
WebviewProviderを大幅に改修。各サンプルコードを独立した「セル」として表示。- コードエディタ(textarea)、実行ボタン、実行結果表示エリア(トグル開閉式)をセットにしたUIを実装。
- 実行結果エリアはデフォルトで折りたたまれ、実行時またはクリック時に展開される仕様とした。
- 対話的なコード実行:
- Webview内の「Run」ボタンから、編集後のコードを拡張機能本体に送信 (
postMessage) する仕組みを実装。 DocMateControllerにrunCodeメソッドを追加し、受け取ったコードを即座に実行して結果を返すようにした。- これにより、ユーザーはサンプルコードを自由に書き換えて試行錯誤できるようになった。
- デバッグ用スクリプトの作成:
src/debug_jsdom.tsを作成し、MDN以外のドキュメントサイト(Python, Javaなど)のHTML構造や検索結果をJSDOMでパースしてMarkdown化する挙動を手元で素早くテストできるようにした。- 言語別(
languageIdごと)に検索先やセレクタを振り分けるロジックの基盤となる知識を得た。
- Python / Java の公式検索ページの仕様:
docs.python.org/search.htmlやdocs.oracle.com/.../search.htmlのような検索ページは、検索結果のリストをサーバーサイドで静的なHTMLとして返すのではなく、クライアントサイドのJavaScriptを使って動的に描画する仕様になっている。- そのため、JSDOMのような静的なパーサーで単純にURLを読み込んでも「JavaScriptを有効にしてください」といったメッセージしか取得できず、検索結果のリンク一覧を取得することができない。
- 今後のAPI選定の方針:
- MDNのように
api/v1/searchという扱いやすい専用APIを提供してくれているサイトは実は少数派である。 - 多言語対応を本格的に進める場合、各公式サイトのスクレイピングに依存するとJS必須のサイトで詰むため、DuckDuckGo API のサイト内検索や、全言語のドキュメントをJSONで返してくれる DevDocs API のような汎用的な検索APIの導入を検討する必要がある。
- MDNのように
-
DevDocs APIの連携:
- MDNで提供されていない言語(Python, Java, C, C++, Go, PHP, Ruby, Rust, Kotlin, Dart)のドキュメント検索のために、DevDocs API (
https://devdocs.io/docs/{slug}/index.json) をdocService.tsに統合した。 devDocsSlugs言語マップを作成し、各言語とDevDocs上の最新バージョンslug(例:python~3.14,openjdk~25)を紐付けた。- C#はDevDocsに存在しないためサポート対象外とし、Swiftは現在未提供であることを確認した。
- MDNで提供されていない言語(Python, Java, C, C++, Go, PHP, Ruby, Rust, Kotlin, Dart)のドキュメント検索のために、DevDocs API (
-
ハッシュベースの正確なHTML抽出:
fetchContentメソッドを拡張し、DevDocsのURLに含まれるハッシュ値(例:#print)を利用して、ページ全体ではなく目的のクラスや関数の定義部分(<dt>)とその説明部分(直後の<dd>要素など)のみをピンポイントで抽出するロジックを実装した。- 不要なサイドバーなどを削除する
querySelectorAll処理を JSDOM のパースエラー回避のためにtry...catchで保護した。
-
React / Vue などのハイブリッド言語のフォールバック検索:
javascriptreact(React) やvueファイルにおいて、useStateなどの特有のAPIはDevDocs(React/Vue)から正常に引けるように設定した。- しかし
constやmapなどの「JavaScriptの標準機能」を検索した際にReact/Vueの辞書でエラー(null)になる仕様上の落とし穴を解決するため、「React/Vueの辞書で見つからなかった場合、自動的に言語設定を 'javascript' に書き換えてMDNに再検索(再帰処理)しにいく最強のフォールバック仕組み」 を導入した。
-
未対応言語と通知のUX改善:
- 対応していない言語(例:
plaintext)の検索が走った際に、単に結果なし(null)を返すのではなくthrow new Errorで明示的に弾くように修正。 docMateController.tsのプログレス通知のメッセージをSearching MDN ...から汎用的なSearching documentation ...に変更し、DevDocs検索時にも違和感がないように改善した。
- 対応していない言語(例: