kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

WorkIQを使う拡張機能ContextRelay for Microsoft 365

長年(でもない)アイディアを温めていて、ようやく公開にこぎつけることができました。新しいVisual Studio Code用拡張機能です。

marketplace.visualstudio.com

Microsoft 365リソースにアクセスするという拡張機能という性格上、ソースコードも公開しています。

github.com

MicrosoftもWork IQのMCPサーバーを公開しているので、通常そちらを使えば大丈夫です。ただ、あちらはGitHub CopilotのPremium Request使っちゃうんですよね。Microsoft 365 CopilotのライセンスがあるんだからWork IQのAPIを呼び出したいと思っていたのですが、5/1からパブリックプレビューになったので、拡張機能に追加しました。

techcommunity.microsoft.com

Work IQ追加前のもともとの想定としてはGraphで対象リソースを探し、それをコンテキストにしてCopilotにハンドオフ資料を作ってもらうという想定です。

拡張機能初期セットアップ

EntraにAPIを使用するための登録が必要です。ドキュメントにも書いていますが、これだけ使います。

不要なコネクターはオプションで無効化できます。

テナントIDとアプリケーションIDを登録してください。

使い方(Graph API編)

拡張機能のウィンドウはGitHub CopilotのUI準拠にしています。コマンドパレットでcontextrelayから呼び出してください。

Microsoft 365 CopilotのライセンスがあるEntraアカウントでログインしてください。

スラッシュコマンドに/allを指定したらすべてのリソース(Exchange, Teams, OneDrive, SharePoint, To Do, Planner, OneNote, Connector)から探します。組み合わせもできます。

例えば、勤怠アプリの仕様書をOneDriveから探す場合、/onedriveを指定して「勤怠管理」と検索すると、このように出てきます。そして、pinをクリックします。

pinを立てると、そのファイルをコンテキストとしてCopilotに渡して処理されます。

もちろん複数のファイルにpinを指定してもいいです。結果はコンテキストとプロンプトに依存します。

使い方(Work IQ編)

/workiqを指定するとWorkIQを使って検索します。/workiqはほかのコマンドと排他で、優先されます。

単にチャットする

/ask を指定すると、コンテキストなしでCopilotとチャットできます。Web検索を有効にしているので、Microsoft 365 CopilotのWebでのチャットと変わらない、はずです。

後始末

/clearでチャットをクリアして新しいチャットの開始ができます。

仕様・制限事項

現在Copilot 拡張APIにモデル指定機能がないので、自動のみです。

今後の予定

APIの追従にはついていこうと思っています。/onedriveとか指定した時のレンダリングがちょっと不満なので、改良したいと思っています。

Visual Studio版も内部でテスト中です。アプリケーション IDは別になります。

何回実行しても特定の時間まで実行しないアプリランチャー

ほとんど毎日の作業としてこんなものがあります。

  1. Windows Terminalを起動する(スタートアップ起動)
  2. winget実行してアプリケーションを最新にする
  3. npm installを(同上)
  4. dotnet global packageを(同上)
  5. PowerShellのパッケージを(同上) ....

シェルのヒストリーがあるとはいえ、まぁまぁめんどくさい。バッチにして、Terminalのタブ起動時に実行してもいいけど、空振りすることがわかっているのに実行されるのもちょっと嫌だなぁ、と思っていたらはせがわようすけさんがこんなことを書かれていました。

そうだよなぁ、まさにそうと思って簡単なツール作ってみるか?とGitHubにレポジトリ作ったのがこの後すぐ…だけど、めんどくさくなってきて(笑。ほかにもやることあったし)、長い間放置していました。

当時からRustもあり、勉強がてらいいかな?と思ったけど、C/C++のほうがわかるし別に起動してすぐ終わるツールだからC++でいっかと思ってつくりはじめたものの、時間とられすぎて放置していたのです。でもやっぱり面倒になったところに出てきたのがGitHub Copilot(とエージェント)。コード補完やAskしかなかった頃は「違うそうじゃない」と思って、やはりあきらめたのです。

しかし、GPT-5以降のモデルの利用やAgentモードになって自分が作るよりも立派なものをより早くできるようになったので冬休み頑張って仕上げました(Copilotが)。Coding Agentは今のところUbuntuで動いていたので、WindowsのC++は駄目だろう?と思っていたのですがビルドは当然してくれないものの、コンパイルエラーにならない程度のものを作ってくれてびっくりでした。

あとはローカルのVisual Studioで仕上げます。最初「GoogleTestとcmakeがデファクトだよ」と言われて(Ubuntuで動いていたのもあったのでしょうが)、そのまま承諾していたらローカルでGoogleTestがさっぱり動かない。DLLがないっぽいのですが、ちょっとわからなかったし動かせる自信もモチベーションもなかったので、MicrosoftのC++ Testing Frameworkに変えて、cmakeもやめました(のでコミット記録が結構残っています)。この辺の変更もAgentにやってもらいました。

この辺は最初にちゃんとカスタムイントラクション作らなかったのがいけなかったかな、と反省しています。

あと、レポジトリのルートにあるreadme.mdをVisual Studioが認識しない?っぽいのでそこも結構困る。いぜんかずきさんが似たこと(.NETのプロジェクト)で困られていて、「GitHubにあるものであれば大丈夫そうだ」と書かれていましたが、C++のプロジェクトでは認識していないようにも見えます。この辺は要調査。

とまぁ長々と書きましたが、Copilotのおかげで割と自分が納得いくツールになったと思うので良ければ使ってください。wingetへの登録も後ほど…。Visual Studio 2026使っているのにツールセットが2022なのはGitHub Actionsのhosted runnerにVisual Studio 2026が入っていないからです。

github.com

最初はNTFS代替ストリームに最終実行時間を書こうかなとか思っていましたが、起動パラメータとかjsonにするんだからjsonでもいいかと思いなおしました。200KB程度の小さいバイナリーにしましたが、できれば100KB程度にしたかった。

Visual Studioの新しいソリューション形式slnx

先日Visual Studio 2022 17.0 Preview 3が公開されました。新しいプレビューが公開されると、プレビュー機能のダイアログ(今はタブになりましたが)を一通り見るのですが、気になる項目が増えていました。

もちろん有効にします(非推奨とか、古い互換性のための機能でない限り原則有効にします😉)。

Visual Studioのソリューションを選択して保存時にslnxが増えています。

読み込むときにも選択肢として増えています。何が違うのでしょう。

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.10.34804.81
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorApp1", "BlazorApp1\BlazorApp1\BlazorApp1.csproj", "{BFD7AF15-7028-43D2-AC5D-1AD1B7D7C4C7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorApp1.Client", "BlazorApp1\BlazorApp1.Client\BlazorApp1.Client.csproj", "{82BD4B72-63B3-4C4F-992D-09FF5586C07D}"
EndProject
Global
    GlobalSection(ExtensibilityGlobals) = postSolution
        SolutionGuid = {B7807233-0A06-4B9F-B06C-4A4C48D34E24}
    EndGlobalSection
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
        {82BD4B72-63B3-4C4F-992D-09FF5586C07D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {82BD4B72-63B3-4C4F-992D-09FF5586C07D}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {82BD4B72-63B3-4C4F-992D-09FF5586C07D}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {82BD4B72-63B3-4C4F-992D-09FF5586C07D}.Release|Any CPU.Build.0 = Release|Any CPU
        {BFD7AF15-7028-43D2-AC5D-1AD1B7D7C4C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
        {BFD7AF15-7028-43D2-AC5D-1AD1B7D7C4C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
        {BFD7AF15-7028-43D2-AC5D-1AD1B7D7C4C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
        {BFD7AF15-7028-43D2-AC5D-1AD1B7D7C4C7}.Release|Any CPU.Build.0 = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionConfigurationPlatforms) = preSolution
        Debug|Any CPU = Debug|Any CPU
        Release|Any CPU = Release|Any CPU
    EndGlobalSection
    GlobalSection(SolutionProperties) = preSolution
        HideSolutionNode = FALSE
    EndGlobalSection
EndGlobal

Blazorのプロジェクトをテンプレートで作っただけのおなじみの(?)sln構成です。これをslnxにするとこうなります。

<Solution>
  <Project Path="BlazorApp1\BlazorApp1.Client\BlazorApp1.Client.csproj" Type="Classic C#" />
  <Project Path="BlazorApp1\BlazorApp1\BlazorApp1.csproj" Type="Classic C#" />
</Solution>

簡単!.NETのプロジェクトがSDKスタイルになった時のようです。前々から「projectのGUIDや構成定義は必要なのか」とか思っていたので、すべてcsprojに行ってくれたのは助かります。ただ、これまだ始まったばかりのようで、関連付けも行われていません。

そして、当然ですが、dotnetコマンドでもサポートされていないようでビルドができません。

devenvコマンドならビルドができます(もちろんPreview版のVisual StudioのDeveloper Command Promptを起動します)。

プレビューを使わないといけないからCIで使えないし、このslnのファイル構成を当てにしている拡張機能やツールもたくさんあるでしょうから、どのくらいでデフォルト有効になるのかちょっとわからないですが、XMLになってパースしやすくなるのと、サイズが劇的に小さくなるのは非常にうれしいですね。Visual Studio 2022 17.10正式版ではサポートになるのかな?楽しみです。

Visual Studio SubscriptionのAzure特典でWindows Client OSとVisual Studio入りイメージを使う

免責事項開始
本件はMicrosoftサポートに問い合わせて得られた結果を書いていますが、ライセンスに関することはAzureサポートにお問い合わせください。
免責事項終了

いつのころからか定かではない(多分DevBoxがリリースされたころ)のですが、Visual Studioサブスクリプション特典のAzureサブスクリプションを使ってVisual Studio入りイメージを使おうとすると上記のエラーが出るようになりました。確実に以前は使えており、数年前にデプロイしたWindows 10 + Visual Studio入りイメージがAzure上にあります。

2023年5-6月ごろだったか、このエラーに初めて遭遇して、「一時的なものだろう」と思っていたのですが、まったく直る気配もなかったので、8月に問い合わせ始めて、ようやく今日回答がもらえました。まとめるとこんな感じ。

  • Visual Studio サブスクリプションの特典Azureサブスクリプションの場合、クレジットカードなどを登録して上限解除しなければVisual Studio入りイメージは使えない(これはサードパーティーオファーなどと同じ)
  • ただし、Azureサポートが試したところ、サードパーティーオファーと異なり、「無料枠から」クレジットが消費され、上限を超えた場合(Enterpriseの場合$200/month)に登録した課金方法への請求が行われる

とのことでした。「以前は大丈夫だったのに」と言って証拠のデプロイ済みVMも見せたのですが、いつ変わったかはサポートでもわからないといわれました。そして、多くの人は個人MSアカウント(outlook.jpなど)を使ってAzureサブスクリプションを使っているかもしれません。Virtual Desktopが出たころからですがこんなチェックが増えています。

一番下のLicensingI confirm I have an eligible Windows 10/11 license with multi-tenant hosting rights.(Windows 10/11のマルチテナントホスティングライセンスを保有しています)という宣言です。知られている通り、Windows 10/11をAzureで使う場合Windows VDAもしくはWindows E3/E5のライセンスが必要です。Visual Studioサブスクリプションにはないのでは?ということはWindows Client OSが使えないのでは?ということになってしまいます。うーん、困った。

これも聞いたところ、「Visual Studioサブスクリプションの場合は使ってもよい(チェックを入れればよい)」のだそうです。根拠はたぶんこちら。

Visual Studio のサブスクライバーは、Microsoft Windows Virtual Desktop サービスで Azure Dev/Test の個人クレジットを使用できるようになりました。

出展:learn.microsoft.com

現実的にAzure Virtual Desktopを使う場合、Entraが必要で、個人MSアカウントでは無理(だよね?)なわけですが、ここでやるということになるのでしょうか。でも、正直これは困るのでこのサブスクリプションをEntraのテナント側に引っ越そうかなと思っています…。

あくまでも本記事は個人のメモなので、Azureサポートにご確認ください(大事なことなので二回目)