4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IBM BobでVSCode拡張機能を作ってみた - 画像スライドショー

4
Last updated at Posted at 2026-02-17

はじめに

VSCode拡張を作ってみたいと思ったものの、何から始めればいいのか全く分かりませんでした。
この記事では、そんな私が IBM Bobを利用しながら拡張機能を作成した過程を共有します。

IBM Bobとは?

IBM Bob(以下、Bob)は、IBMが提供するAIコーディングアシスタントです。

「こんな機能が欲しい」と日本語で伝えると、Bobが自動的にコードを書いてくれるツールです。
Bobを使うと、開発時間が大幅に短縮され、対話しながら学べるための高品質なコードが書けます。

作ったもの

作業中に愛犬などの癒しの画像を見られる、サイドバーに常駐するスライドショーを作成しました。

機能

  • サイドバーに常駐表示
  • 画像を3秒ごとに自動切り替え
  • 「前へ」「次へ」「一時停止/再開」ボタン
  • jpg/jpeg/png対応
  • 画像カウンター表示(例:1/5)

dog.gif

開発環境

  • OS: macOS
  • Node.js: v16以上
  • VSCode: 最新版
  • 開発ツール: IBM Bob
  • 言語: TypeScript

準備

# npm(Node Package Manager)のバージョン確認
npm -v

# Yeomanとgenerator-codeをインストール
npm install -g yo generator-code
  • Yeoman: プロジェクトの雛形を自動生成するツール。必要なファイルやフォルダをまとめて作ってくれます。
  • generator-code: VSCode拡張機能用の雛形生成ツール。yo code コマンドで、拡張機能のひな形を作成できます。

VSCode拡張機能の基礎知識

拡張機能の構造

VSCode拡張機能は、主に以下のファイルで構成されます:

拡張機能フォルダ/
├── package.json          # 設定ファイル(マニフェスト)
├── src/
│   └── extension.ts      # メインプログラム
├── out/                  # コンパイル後のファイル
└── node_modules/         # 依存ライブラリ

その中でも基本となる以下の2つのファイルについてご説明します。

1. package.json

拡張機能の設定ファイルです。VSCodeに「この拡張機能は何をするのか」を伝えます。

例:

{
  "name": "my-extension",              // 拡張機能の名前
  "displayName": "My Extension",       // 表示名
  "version": "0.0.1",                  // バージョン
  "engines": {
    "vscode": "^1.74.0"                // 対応VSCodeバージョン
  },
  "main": "./out/extension.js",        // メインファイル
  "activationEvents": [                // いつ起動するか
    "onStartupFinished"
  ],
  "contributes": {                     // 提供する機能
    "commands": [                      // コマンドの定義
      {
        "command": "extension.helloWorld",
        "title": "Hello World"
      }
    ]
  }
}

2. extension.ts

拡張機能のメインプログラムです。今回はTypeScriptで書きました。
例:

import * as vscode from 'vscode';

// 拡張機能が有効化されたときに呼ばれる
export function activate(context: vscode.ExtensionContext) {
    console.log('拡張機能が起動しました!');
    
    // ここに機能を実装
}

// 拡張機能が無効化されたときに呼ばれる
export function deactivate() {
    console.log('拡張機能が終了しました');
}

開発の流れ

ステップ1: Planモードで設計

Bobに要件を伝えます。

あなたは熟練のVSCode拡張の開発者です。

目的:
「常駐」できる画像スライドショー拡張のMVPを作りたいです。
WebviewView(サイドバーのカスタムビュー)で表示してください。

要件:
- WebviewViewProvider を使ってサイドバーに常駐表示する
- 画像はローカルフォルダから読み込む
- 対象拡張子:jpg / jpeg / png
- 画像を約3秒ごとに自動で切り替える
- 「前へ」「次へ」「一時停止/再開」ボタンを配置
- デフォルトフォルダは ./photos

制約/注意:
- VSCodeのセキュリティ制約に配慮し設定する
- 画像が0枚のときは「画像が見つかりません」表示にする
  • MVP: Minimum Viable Product(最小限の機能を持つ製品)
  • WebviewView: サイドバーに表示するカスタムビュー
  • WebviewViewProvider: WebviewViewを提供するクラス

Bobが自動的にTODOリストを作成してくれます。
以下の画像は今回作成されたTODOリストです。

todo.png

ステップ2: Codeモードで実装

Planモードで設計を確認した後、BobのCodeモードで実装を進めました。

1. プロジェクト雛形の作成

BobがYeomanを使用し、TypeScript拡張のプロジェクト雛形を生成てくれました。

yo code

作成された構造は以下の通りです。

VScode_extensions/
├── src/
│   ├── extension.ts          # エントリーポイント
│   └── slideshowProvider.ts  # WebviewViewProvider実装
├── photos/                    # 画像フォルダ
├── package.json              # マニフェスト
├── tsconfig.json            # TypeScript設定
├── .vscode/
│   ├── launch.json          # デバッグ設定
│   └── tasks.json           # ビルドタスク
└── README.md

2. 主要ファイルの実装

package.json

{
  "name": "image-slideshow",           // 拡張機能の名前
  "displayName": "Image Slideshow",    // 表示名
  "version": "0.0.1",                  // バージョン
  "engines": {
    "vscode": "^1.74.0"                // 対応VSCodeバージョン
  },
  "activationEvents": [                // いつ起動するか
    "onStartupFinished"
  ],
  "main": "./out/extension.js",        // メインファイル
  "contributes": {                     // 提供する機能
    "views": {
      "explorer": [                    // エクスプローラーに追加
        {
          "type": "webview",
          "id": "imageSlideshowView",
          "name": "Image Slideshow"
        }
      ]
    }
  }
}

src/extension.ts

ここでは、「サイドバーに表示するWebviewを登録し、表示されたタイミングで中身(HTML)をセットする」という流れを実装しました。

import * as vscode from 'vscode';
import { SlideshowProvider } from './slideshowProvider';

export function activate(context: vscode.ExtensionContext) {
    // SlideshowProviderのインスタンスを作成
    const provider = new SlideshowProvider(context.extensionUri);
    
    // VSCodeにWebviewViewProviderを登録
    context.subscriptions.push(
        vscode.window.registerWebviewViewProvider(
            SlideshowProvider.viewType,
            provider
        )
    );
}

export function deactivate() {}

src/slideshowProvider.ts

ここでメインの機能を実装しています。


export class SlideshowProvider implements vscode.WebviewViewProvider {
    // ビューのID(package.jsonと一致させる)
    public static readonly viewType = 'imageSlideshowView';

    constructor(private readonly _extensionUri: vscode.Uri) {}

    // VSCodeがビューを表示するときに呼ばれる
    public resolveWebviewView(
        webviewView: vscode.WebviewView,
        context: vscode.WebviewViewResolveContext,
        _token: vscode.CancellationToken,
    ) {
        // Webviewの設定
        webviewView.webview.options = {
            enableScripts: true,              // JavaScriptを有効化
            localResourceRoots: [             // アクセス可能なフォルダ
                this._extensionUri,
                this._getPhotosUri()
            ]
        };

        // HTMLコンテンツを設定
        webviewView.webview.html = this._getHtmlForWebview(webviewView.webview);
    }

    // 画像フォルダのURIを取得
    private _getPhotosUri(): vscode.Uri {
        const workspaceFolders = vscode.workspace.workspaceFolders;
        if (workspaceFolders && workspaceFolders.length > 0) {
            return vscode.Uri.file(
                path.join(workspaceFolders[0].uri.fsPath, 'photos')
            );
        }
        return this._extensionUri;
    }

    // 画像ファイルのリストを取得
    private _getImageFiles(): string[] {
        const photosPath = this._getPhotosUri().fsPath;
        
        // フォルダが存在しない場合は空配列を返す
        if (!fs.existsSync(photosPath)) {
            return [];
        }

        // フォルダ内のファイル一覧を取得
        const files = fs.readdirSync(photosPath);
        
        // 画像ファイルのみをフィルタリング
        return files.filter(file => {
            const ext = path.extname(file).toLowerCase();
            return ['.jpg', '.jpeg', '.png'].includes(ext);
        });
    }
}

また、Webview側はHTML/CSS/JavaScriptでスライドショーを実装しています(ここは省略します)。
setInterval で3秒ごとに次の画像へ切り替え、ボタンで前へ/次へ/停止・再開を操作できるようにしています。

ステップ3: コンパイルと実行

# 依存関係のインストール
npm install

# TypeScriptをJavaScriptにコンパイル
npm run compile

その後、VSCodeで F5キー を押すと、拡張開発用の新しいVSCodeが起動します。
エクスプローラーに「Image Slideshow」が表示されれば成功です。

あとは、拡張機能をインストールすれば使用することができます。

まとめ

学んだこと

VSCode拡張機能の基礎

  • 拡張機能の構造(package.json、extension.ts)
  • WebviewViewProviderの使い方

IBM Bobの活用

  • Planモードでの設計
  • Codeモードでの実装
  • 対話的な開発プロセス

IBM Bobを使うことで、初心者でもVSCode拡張機能を作ることができました。AIアシスタントの力を借りることで、「作りたいもの」のアイデアを素早く形にできる時代になったことを実感しました。

フィードバックなどございましたら、ぜひコメントでお知らせください!

無料ではじめてみましょう

無料トライアルでは30日間40Bobコインまで利用ができます。申し込みはこちら
Bobcoinが足りなくなったらこちらで少額から購入できます。

参考リンク

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?