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>
29 lines
1.0 KiB
Rust
29 lines
1.0 KiB
Rust
use tools_fs::{read_file, glob_list, grep};
|
|
use std::fs;
|
|
use tempfile::tempdir;
|
|
|
|
#[test]
|
|
fn read_and_glob_respect_gitignore() {
|
|
let dir = tempdir().unwrap();
|
|
let root = dir.path();
|
|
fs::write(root.join("a.txt"), "hello").unwrap();
|
|
fs::create_dir(root.join("secret")).unwrap();
|
|
fs::write(root.join("secret/secret.txt"), "token=123").unwrap();
|
|
fs::write(root.join(".gitignore"), "secret/\n").unwrap();
|
|
|
|
let pattern = format!("{}/**/*", root.display());
|
|
let files = glob_list(&pattern).unwrap();
|
|
assert!(files.iter().any(|p| p.ends_with("a.txt")));
|
|
assert!(!files.iter().any(|p| p.contains("secret.txt")));
|
|
assert_eq!(read_file(root.join("a.txt").to_str().unwrap()).unwrap(), "hello");
|
|
}
|
|
|
|
#[test]
|
|
fn grep_finds_lines() {
|
|
let dir = tempdir().unwrap();
|
|
let root = dir.path();
|
|
fs::write(root.join("a.rs"), "fn main() { println!(\"hello\"); }").unwrap();
|
|
|
|
let hits = grep(root.to_str().unwrap(), "hello").unwrap();
|
|
assert!(hits.iter().any(|(_p, _ln, text)| text.contains("hello")));
|
|
} |