yoi/tickets/scope-redesign.md
2026-04-13 04:10:19 +09:00

2.6 KiB
Raw Blame History

Scope の再設計

背景

Scope は Pod の作業ディレクトリとアクセス権限を定義するもの。全ての Pod が必ず持つ。

現状の問題:

  1. Pod.scopeOption<Scope> — scope なしの Pod が存在しうる(ツールが登録されない)
  2. Scoperoot: PathBuf しか持たない — 書き込み許可/禁止の概念がない
  3. Scope なしの場合、Glob/Grep のデフォルト検索パスがない
  4. マニフェストで [scope] 省略時のフォールバックが定義されていない

方針

Scope の拡張

pub struct Scope {
    pwd: PathBuf,      // 作業ディレクトリ
    writable: bool,    // false = 読み取り専用 Pod
}
  • writable: true(デフォルト): Read/Write/Edit/Glob/Grep 全て使える
  • writable: false: Read/Glob/Grep のみ。Write/Edit はエラー
  • pwd は Glob/Grep のデフォルト検索パスとしても使われる

Pod で必須化

pub struct Pod<C, St> {
    scope: Scope,  // Option ではない
    // ...
}

マニフェスト

# 明示指定
[scope]
pwd = "./src"
writable = false   # 省略時 true

# [scope] 省略時 → マニフェストファイルの親ディレクトリが pwd、writable = true

Pod::new()(マニフェストなし構築)では Scope を引数で必須にする。

ScopedFs の変更

pub fn write(&self, path: &Path, content: &[u8]) -> Result<WriteOutcome, ToolsError> {
    if !self.inner.scope.writable() {
        return Err(ToolsError::ReadOnly);
    }
    if !self.inner.scope.contains(path) {
        return Err(ToolsError::OutOfScope(path.to_path_buf()));
    }
    // ...
}

Controller 統合

// 今: scope が Some のときだけツール登録
if let Some(scope) = scope_for_tools { ... }

// 後: 常にツール登録scope は必須)
let fs = tools::ScopedFs::new(pod.scope().clone());
let tracker = tools::ReadTracker::new();
worker.register_tools(tools::builtin_tools(fs, tracker));

影響範囲

  • manifest::Scoperootpwdwritable フィールド追加
  • manifest::ScopeConfigrootpwdwritable の serde 対応
  • manifest::PodManifest — [scope] 省略時のフォールバック解決
  • Podscope: Option<Scope>scope: Scope
  • Pod::new(), Pod::restore(), Pod::from_manifest() — シグネチャ変更
  • ScopedFs — writable チェック追加
  • Controller — scope の Optional 分岐を削除
  • tools::error::ToolsErrorReadOnly variant 追加
  • Scope::containsrootpwd のリネーム