This commit implements the complete M1 milestone (Config & Permissions) including: - New permissions crate with Tool, Action, Mode, and PermissionManager - Three permission modes: Plan (read-only default), AcceptEdits, Code - Pattern matching for permission rules (exact match and prefix with *) - Integration with config-agent for mode-based permission management - CLI integration with --mode flag to override configured mode - Permission checks for Read, Glob, and Grep operations - Comprehensive test suite (10 tests in permissions, 4 in config, 4 in CLI) Also fixes: - Fixed failing test in tools-fs (glob pattern issue) - Improved glob_list() root extraction to handle patterns like "/*.txt" All 21 workspace tests passing. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
48 lines
1.5 KiB
Rust
48 lines
1.5 KiB
Rust
use config_agent::{load_settings, Settings};
|
|
use permissions::{Mode, PermissionDecision, Tool};
|
|
use std::{env, fs};
|
|
|
|
#[test]
|
|
fn precedence_env_overrides_files() {
|
|
let tmp = tempfile::tempdir().unwrap();
|
|
let project_file = tmp.path().join(".owlen.toml");
|
|
fs::write(&project_file, r#"model="local-model""#).unwrap();
|
|
|
|
unsafe { env::set_var("OWLEN_MODEL", "env-model"); }
|
|
let s = load_settings(Some(tmp.path().to_str().unwrap())).unwrap();
|
|
assert_eq!(s.model, "env-model");
|
|
}
|
|
|
|
#[test]
|
|
fn default_mode_is_plan() {
|
|
let s = Settings::default();
|
|
assert_eq!(s.mode, "plan");
|
|
}
|
|
|
|
#[test]
|
|
fn settings_create_permission_manager_with_plan_mode() {
|
|
let s = Settings::default();
|
|
let mgr = s.create_permission_manager();
|
|
|
|
// Plan mode should allow read operations
|
|
assert_eq!(mgr.check(Tool::Read, None), PermissionDecision::Allow);
|
|
|
|
// Plan mode should ask for write operations
|
|
assert_eq!(mgr.check(Tool::Write, None), PermissionDecision::Ask);
|
|
}
|
|
|
|
#[test]
|
|
fn settings_parse_mode_from_config() {
|
|
let tmp = tempfile::tempdir().unwrap();
|
|
let project_file = tmp.path().join(".owlen.toml");
|
|
fs::write(&project_file, r#"mode="code""#).unwrap();
|
|
|
|
let s = load_settings(Some(tmp.path().to_str().unwrap())).unwrap();
|
|
assert_eq!(s.mode, "code");
|
|
assert_eq!(s.get_mode(), Mode::Code);
|
|
|
|
let mgr = s.create_permission_manager();
|
|
// Code mode should allow everything
|
|
assert_eq!(mgr.check(Tool::Write, None), PermissionDecision::Allow);
|
|
assert_eq!(mgr.check(Tool::Bash, None), PermissionDecision::Allow);
|
|
} |