This commit implements the complete M5 milestone (Slash Commands) including: Slash Command Parser (tools-slash): - YAML frontmatter parsing with serde_yaml - Metadata extraction (description, author, tags, version) - Arbitrary frontmatter fields via flattened HashMap - Graceful fallback for commands without frontmatter Argument Substitution: - $ARGUMENTS - all arguments joined by space - $1, $2, $3, etc. - positional arguments - Unmatched placeholders remain unchanged - Empty arguments result in empty string for $ARGUMENTS File Reference Resolution: - @path syntax to include file contents inline - Regex-based matching for file references - Multiple file references supported - Clear error messages for missing files CLI Integration: - Added `slash` subcommand: `owlen slash <command> <args...>` - Loads commands from `.claude/commands/<name>.md` - Permission checks for SlashCommand tool - Automatic file reference resolution before output Command Structure: --- description: "Command description" author: "Author name" tags: - tag1 - tag2 --- Command body with $ARGUMENTS and @file.txt references Permission Enforcement: - Plan mode: SlashCommand allowed (utility tool) - All modes: SlashCommand respects permissions - File references respect filesystem permissions Testing: - 10 tests in tools-slash for parser functionality - Frontmatter parsing with complex YAML - Argument substitution (all variants) - File reference resolution (single and multiple) - Edge cases (no frontmatter, empty args, etc.) - 3 new tests in CLI for integration - slash_command_works (with args and frontmatter) - slash_command_file_refs (file inclusion) - slash_command_not_found (error handling) - All 56 workspace tests passing ✅ Dependencies Added: - serde_yaml 0.9 for YAML frontmatter parsing - regex 1.12 for file reference pattern matching M5 milestone complete! ✅ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
28 lines
835 B
TOML
28 lines
835 B
TOML
[package]
|
|
name = "owlen"
|
|
version = "0.1.0"
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
rust-version.workspace = true
|
|
|
|
[dependencies]
|
|
clap = { version = "4.5", features = ["derive"] }
|
|
tokio = { version = "1.39", features = ["macros", "rt-multi-thread"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
color-eyre = "0.6"
|
|
llm-ollama = { path = "../../llm/ollama" }
|
|
tools-fs = { path = "../../tools/fs" }
|
|
tools-bash = { path = "../../tools/bash" }
|
|
tools-slash = { path = "../../tools/slash" }
|
|
config-agent = { package = "config-agent", path = "../../platform/config" }
|
|
permissions = { path = "../../platform/permissions" }
|
|
futures-util = "0.3.31"
|
|
|
|
[dev-dependencies]
|
|
assert_cmd = "2.0"
|
|
predicates = "3.1"
|
|
httpmock = "0.7"
|
|
tokio = { version = "1.39", features = ["macros", "rt-multi-thread"] }
|
|
tempfile = "3.23.0"
|