This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
name: ci
|
||||
on:
|
||||
push:
|
||||
branches: [main, develop]
|
||||
pull_request:
|
||||
branches: [main, develop]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: dtolnay/rust-toolchain@stable
|
||||
- run: cargo test --all-features
|
||||
- run: cargo build --release --features cli
|
||||
+40
-43
@@ -1,43 +1,40 @@
|
||||
[package]
|
||||
name = "dirigent_fermata"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
rust-version = "1.75"
|
||||
description = "Harness-agnostic policy gate for AI coding agents (.botignore + botignore.toml)"
|
||||
license = "MIT OR Apache-2.0"
|
||||
repository = "https://git.g4b.org/dirigence/fermata"
|
||||
readme = "README.md"
|
||||
keywords = ["ai", "agents", "security", "policy", "gitignore"]
|
||||
categories = ["command-line-utilities", "development-tools"]
|
||||
|
||||
[lib]
|
||||
path = "src/lib.rs"
|
||||
|
||||
[[bin]]
|
||||
name = "fermata"
|
||||
path = "src/bin/fermata.rs"
|
||||
required-features = ["cli"]
|
||||
|
||||
[dependencies]
|
||||
globset = "0.4"
|
||||
ignore = "0.4"
|
||||
walkdir = "2"
|
||||
toml = "0.8"
|
||||
regex = "1.10"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
thiserror = "2.0"
|
||||
clap = { version = "4.5", features = ["derive"], optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
tempfile = "3.10"
|
||||
assert_cmd = "2.0"
|
||||
predicates = "3.1"
|
||||
|
||||
[features]
|
||||
default = ["cli", "harness-claude"]
|
||||
cli = ["dep:clap"]
|
||||
harness-claude = []
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
[package]
|
||||
name = "dirigent_fermata"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
rust-version = "1.75"
|
||||
description = "Harness-agnostic policy gate for AI coding agents (.botignore + botignore.toml)"
|
||||
license = "MIT OR Apache-2.0"
|
||||
repository = "https://git.g4b.org/dirigence/fermata"
|
||||
readme = "README.md"
|
||||
keywords = ["ai", "agents", "security", "policy", "gitignore"]
|
||||
categories = ["command-line-utilities", "development-tools"]
|
||||
|
||||
[lib]
|
||||
path = "src/lib.rs"
|
||||
|
||||
[[bin]]
|
||||
name = "fermata"
|
||||
path = "src/bin/fermata.rs"
|
||||
required-features = ["cli"]
|
||||
|
||||
[dependencies]
|
||||
globset = "0.4"
|
||||
ignore = "0.4"
|
||||
walkdir = "2"
|
||||
toml = "0.8"
|
||||
regex = "1.10"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
thiserror = "2.0"
|
||||
clap = { version = "4.5", features = ["derive"], optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
tempfile = "3.10"
|
||||
assert_cmd = "2.0"
|
||||
predicates = "3.1"
|
||||
|
||||
[features]
|
||||
default = ["cli", "harness-claude"]
|
||||
cli = ["dep:clap"]
|
||||
harness-claude = []
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 𝄐 dirigent_fermata
|
||||
# 𝄐 fermata
|
||||
|
||||
**A fast, harness-agnostic policy gate for AI coding agents.**
|
||||
|
||||
@@ -44,14 +44,14 @@ Out of scope for v0.1: Codex / Gemini hook adapters, MCP server mode, audit log,
|
||||
|
||||
## Install
|
||||
|
||||
From source (this monorepo):
|
||||
|
||||
```bash
|
||||
cargo install --path crates/dirigent_fermata --features cli
|
||||
cargo install --git https://git.g4b.org/dirigence/fermata --features cli
|
||||
```
|
||||
|
||||
This installs the `fermata` binary into `~/.cargo/bin/`.
|
||||
|
||||
Requires a working [Rust toolchain](https://rustup.rs).
|
||||
|
||||
---
|
||||
|
||||
## Usage
|
||||
@@ -197,18 +197,31 @@ Decision: BLOCK — matched bash deny rule "cat .env*"
|
||||
|
||||
---
|
||||
|
||||
## Architecture
|
||||
## Harness support
|
||||
|
||||
Three concentric layers; nothing inner imports from anything outer:
|
||||
|
||||
- **`core/`** — harness-unaware, sync. Types, `.botignore` walker, `botignore.toml` parser, `Policy::check` / `check_command`, path extraction.
|
||||
- **`harness/`** — `HarnessAdapter` trait over a normalized `ToolCall`. Each adapter lives in its own submodule, feature-gated.
|
||||
- **`bin/fermata.rs`** — the only place `clap`, stdio, and exit codes appear.
|
||||
| Harness | v0.1 |
|
||||
|---------|------|
|
||||
| Claude Code (PreToolUse) | Supported — native JSON adapter |
|
||||
| Codex CLI | Planned |
|
||||
| Gemini CLI | Planned (via MCP server mode) |
|
||||
| Any shell-based hook | Supported — CLI exit codes |
|
||||
|
||||
---
|
||||
|
||||
## See also
|
||||
## About this repository
|
||||
|
||||
- `docs/tools/fermata.md` — Dirigent integration plan
|
||||
- `docs/workpad/brainstorm/fermata.md` — full product spec and field notes
|
||||
- `docs/architecture/crates.md` — crate dependency map
|
||||
This is a downstream mirror. Fermata is developed inside the upstream
|
||||
[Dirigent](https://git.g4b.org/dirigence/dirigent) monorepo and exported here
|
||||
for standalone distribution. Issues and pull requests are accepted on the
|
||||
`develop` branch, but the canonical development happens upstream.
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
Licensed under either of
|
||||
|
||||
- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE))
|
||||
- MIT License ([LICENSE-MIT](LICENSE-MIT))
|
||||
|
||||
at your option.
|
||||
|
||||
Reference in New Issue
Block a user