Canopyとは
Canopyは、ソースコードを文字列ではなく構造(IR: Intermediate Representation)として扱うエディタです。MoonBit で書かれ、ブラウザ上で動作します。
Figmaがピクセルではなくレイヤーやコンポーネントの構造を直接操作するのと同様に、Canopyでは「定義」「関数呼び出し」「型注釈」といったプログラムの構造を直接操作できます。ソースコードの信頼できる唯一の情報源(source of truth)は CRDT 文書としての文字列にあり、Canopyはパーサーと投影機構を通じてそこから IR を導出します。
解決したい問題
現在のコードエディタは、基本的に「文字列を編集するツール」です。人間には直感的ですが、コンピュータにとってソースコードの意味を理解するのは難しく、AIも「どこを編集すべきか」を推測しがちです。
Canopyは、文字列を情報源として保ちつつ、そこから導出した 構造(IR) を直接操作することで、この問題にアプローチします。AST(抽象構文木)が構文の形を表すのに対し、CanopyのIRは編集対象となる実体(entity)と、その根拠(ソースコード内の位置、構文上の役割、言語固有のキーなど)を束ねた薄い索引です。編集はIR上の操作として計算され、最終的にテキストへの変更差分へと変換されます。
Canopyでできること
構造編集
変数の名前変更や関数の抽出を、テキスト置換ではなく「構造操作」として安全に行えます。たとえば「このlet定義を前に移動する」という操作を、インデントやカンマの調整を気にせず実行できます。IR上では「LetDefエンティティを別の位置へ移動する」という単一の意図として表現され、実際の文字列変更はCanopyが計算します。
テキスト編集との両立
構造編集に加え、CodeMirrorのような通常のテキスト入力も併用できます。場面に応じて、文字列として書くモードと構造を直接触るモードを切り替えられます。
AIとの連携
編集対象がIR上の明確なノードになるため、AIへの指示や変更の適用が正確になります。たとえば「この変数をリネームして」と頼んでも、テキストエディタのように同名の別の変数まで誤って変えるリスクを抑えられます。選択対象が「どのスコープのどの定義か」まで構造として特定できるため、AIも意図した操作を実行しやすくなります。
エディタ状態をAIコンテキストにする Cognition や、LLM出力を検証済みJSXとして扱う GenUI 実験(2026年7月)も、この方向の延長にあります。
複数人同時編集
複数人が同じ文書をリアルタイムで編集できます。カーソルや選択範囲だけでなく、編集対象の構造(関数、定義、見出しなど)を保ったまま衝突なく統合でき、WebSocket relay serverを介してブラウザ上で協調作業が行えます。
技術的な位置づけ
Canopyは、後付けの同期機能を足したテキストエディタではありません。2025年12月のプロトタイプは CRDT 実験として始まり、構造編集やUIはその上に積み上げられています。複数人編集の基盤は eg-walker 論文 に基づく CRDT を実装した event-graph-walker です。
大きく分けて3つの層があります。
- CRDTレイヤー(event-graph-walker): 文書の文字列と履歴を保持し、複数人編集時の整合性を保つ。文書の唯一の永続的な source of truth
- パーサー・投影レイヤー(loom): 文字列を解析してCST(具象構文木)を作り、そこから編集対象のIRを導出する
- UIレイヤー(Rabbita / Ideal): IRを人間が触れる形で表示・操作。構造ビュー、アウトライン、診断、AI向けコンテキストなどもここから作られる
また、Canopyは単一のエディタではなく、複数の言語や編集形態を支えるフレームワークを目指しています。Lambda(関数型言語)、JSON、Markdown、JSX など、異なる言語に対して同じ構造編集の仕組みを適用できるように設計されています。
どんな時に役立つ?
- 「AIにコードを直してもらうとき、意図しないところまで変えられて困る」
- 「チームで同じファイルを同時に編集したい」
- 「リファクタリングをもっと安全に、機械的に正確に行いたい」
- 「ノートやドキュメントも、プログラムと同じエディタで扱いたい」
こうした場面でCanopyの設計が強みを発揮します。
関連リポジトリ
Canopyは単独のリポジトリではなく、以下のライブラリ群とともに開発されています。
- canopy: 構造編集エディタ本体
- loom: 增量パーサーとCST/IR投影
- incr: 增量計算ライブラリ
- js_engine: MoonBit製JavaScriptインタプリタ(test262で検証)
- moondsp: MoonBitでの音楽DSL/DSP実験
開発日誌
Canopyの開発状況は、月ごとの開発日誌で公開しています。読み方の目安は次のとおりです。
| 読み方 | 向いている人 | 形式 |
|---|---|---|
| まとめ | 月の流れを2分で追いたい | 日本語 |
| Highlights | 英語で同じくらいの長さで読みたい | 英語 |
| 全文日誌 | PR単位の詳細まで追いたい | 日本語 |
| GenUI実験 | 7月のLLM連携実験の設計を読みたい | 日本語 |
| 期間 | 全文(日本語) | まとめ(日本語) | Highlights(英語) |
|---|---|---|---|
| 2025年12月〜2026年2月 | 日誌 | まとめ | Highlights |
| 2026年3月 | 日誌 | まとめ | Highlights |
| 2026年4月 | 日誌 | まとめ | Highlights |
| 2026年5月 | 日誌 | まとめ | Highlights |
| 2026年6月 | 日誌 ・ Devlog(英語全訳) | まとめ | Highlights |
| 2026年7月 | 日誌 | まとめ | Highlights |
GenUI 実験の設計詳細: Canopy GenUI実験(2026年7月)