Skip to content

Commit f089a39

Browse files
authored
Merge pull request #251 from launchapp-dev/release/v0.6.0
release: v0.6.0 — config_source plugin + approval/HITL gating + provider runtime
2 parents f7cb091 + c204c55 commit f089a39

116 files changed

Lines changed: 8458 additions & 7359 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,35 @@ All notable changes to this project will be documented in this file.
44

55
## [Unreleased]
66

7+
## [0.6.0] - 2026-06-20
8+
9+
**v0.6 — config sourcing is a plugin, and approval is protocol-layer infrastructure.**
10+
The first minor: two load-bearing, intentionally breaking changes.
11+
12+
- **config_source plugin role (the YAML-is-a-plugin thesis).** The kernel no
13+
longer parses `.animus/*.yaml` in its runtime load path. The base
14+
`WorkflowConfig` (and the agent-runtime config derived from it) is sourced
15+
**exclusively** by an installed `config_source` plugin; the daemon now
16+
*requires* one (`RequiredRole::ConfigSource` in `daemon_default`). The YAML
17+
parser still ships in `orchestrator-config` as a library that the reference
18+
plugin `launchapp-dev/animus-config-yaml` links. The kernel keeps the
19+
compiler (pack overlays + validate + state-machine derivation). New
20+
`animus-config-protocol` crate (`config/load|validate|changed`, `ConfigModel`,
21+
`CacheToken`). The config_source plugin is spawned with the daemon's full env
22+
forwarded so non-secret `${VAR}` interpolation still resolves.
23+
**BREAKING:** a daemon without a config_source plugin fails preflight —
24+
`animus plugin install launchapp-dev/animus-config-yaml` (or
25+
`animus plugin install-defaults`) before upgrading.
26+
- **Approval infrastructure + LLM auto-approve.** `ApprovalPolicy` gains an
27+
`llm` mode (plus `evaluator_model` / `evaluator_instructions`) alongside
28+
`ask` (manual) / `allow` (approve-everything) / `deny`. In `llm` mode a judge
29+
model reads the gated tool call and returns allow/deny; it also auto-answers
30+
`animus.agent.ask` questions (flat + structured) from context, recorded in the
31+
unified inbox. The judge runs as a one-shot provider session with no MCP
32+
(cannot recurse); any failure falls back to manual escalation (never silently
33+
allows). Provider plugins own per-tool-call interception (claude natively via
34+
`--permission-prompt-tool`; others route through `request_approval`). See
35+
`docs/architecture/RFC-v0.6-approval-protocol.md`.
736
## [0.5.23] - 2026-06-21
837

938
**`oai-runner` routes to the agentic multi-step provider; robust reasoning-model result capture.**

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ but write new features against the scoped runtime root.
128128
- Workflow YAML supports `${VAR}` env-var interpolation for non-secret config (URLs, team IDs, feature flags), with `${VAR:-default}` and `${VAR:?error}` fallback shapes; substitution happens before YAML parsing, and unset required vars fail with file path + line number. API keys and other credentials belong in the OS keychain via `animus secret set <KEY>` (preferred, v0.5.8+) — failing that, the daemon's process environment (legacy). The `${VAR}` interpolator and the plugin-spawn path both check keychain entries for the current `repo-scope` when the env var is unset, with explicit parent-process env winning on collision. See `docs/reference/secrets.md` and `docs/reference/configuration.md#secrets-vs-non-secret-config`.
129129
- Workflow YAML also carries three daemon-affecting top-level blocks: `schedules:` (cron-driven workflow dispatch), `triggers:` (file watchers, webhooks, GitHub webhooks, trigger plugins), and `daemon:`. All three compile from `crates/orchestrator-config/src/workflow_config/types.rs` (`WorkflowSchedule`, `WorkflowTrigger`, `DaemonConfig`). The `daemon:` block today only consumes `auto_run_ready`, `active_hours`, `phase_routing`, and `mcp` from YAML; `pool_size`/`interval_secs` round-trip but are read from `~/.animus/<repo-scope>/daemon/pm-config.json` or CLI flags instead, and `max_task_retries`/`retry_cooldown_secs` are currently no-ops. The daemon git/merge policy keys (`auto_merge`, `auto_pr`, `auto_commit_before_merge`, `auto_prune_worktrees`) and their CLI/MCP flags were deleted in v0.5.x — merge/PR behavior lives in workflow `post_success.merge`, executed by the workflow runner plugin (the in-kernel `GitProvider`/`BuiltinGitProvider` trait and `FileServiceHub::git_provider()` were deleted in the same change). Authoring reference: `docs/reference/workflow-yaml.md#schedules`, `#triggers`, `#daemon`.
130130
- Plugin kill-switches: `ANIMUS_DAEMON_DISABLE_TRIGGERS=1` skips the trigger plugin supervisor on daemon start (and interrupts in-progress restart backoff); `ANIMUS_DAEMON_DISABLE_SUBJECT_PLUGINS=1` skips subject plugin discovery entirely. `ANIMUS_PROVIDER_DISABLE_PLUGIN` was removed in v0.4.12 — there is no in-tree provider fallback anymore; `SessionBackendResolver` now hard-errors with an actionable install command when a requested provider plugin is missing. Both active kill-switches require a daemon restart to take effect. Documented in `docs/reference/configuration.md#plugin-kill-switches`.
131-
- Plugin preflight: as of v0.4.12 the daemon refuses to start when required-role plugins are missing. As of the v0.5 P2 Wave C fold-in, `workflow_runner` and `queue` join the required-role set alongside `at_least_one_provider`, `subject_kind:task`, and `subject_kind:requirement`. The v0.5 reference impls are `launchapp-dev/animus-workflow-runner-default` (v0.4.0+) and `launchapp-dev/animus-queue-default` (v0.2.0+). Use `animus plugin install-defaults` ahead of time or pass `animus daemon start --auto-install` to install recommended defaults on the fly. `--skip-preflight` is the dev escape hatch (no in-tree fallback runs in production; the daemon will fail at the first plugin RPC if the plugin really is missing). Run `animus daemon preflight` for a standalone report. The in-tree workflow runner BINARY was deleted in the v0.5.1 round-4 fold-in and the `workflow-runner-v2` LIB CRATE was deleted in the v0.5.1 round-5 fold-in — its modules now live out-of-tree as `launchapp-dev/animus-runtime-shared` v0.1.0 (path-deped locally until that repo is published). The daemon scheduler resolves the workflow_runner binary via kind-based plugin discovery (`orchestrator_plugin_host::discover_by_kind("workflow_runner")`) with binary-name fallback for back-compat.
131+
- Plugin preflight: as of v0.4.12 the daemon refuses to start when required-role plugins are missing. As of the v0.5 P2 Wave C fold-in, `workflow_runner` and `queue` join the required-role set alongside `at_least_one_provider`, `subject_kind:task`, and `subject_kind:requirement`. The v0.5 reference impls are `launchapp-dev/animus-workflow-runner-default` (v0.4.0+) and `launchapp-dev/animus-queue-default` (v0.2.0+). Use `animus plugin install-defaults` ahead of time or pass `animus daemon start --auto-install` to install recommended defaults on the fly. `--skip-preflight` is the dev escape hatch (no in-tree fallback runs in production; the daemon will fail at the first plugin RPC if the plugin really is missing). Run `animus daemon preflight` for a standalone report. The in-tree workflow runner BINARY was deleted in the v0.5.1 round-4 fold-in and the `workflow-runner-v2` LIB CRATE was deleted in the v0.5.1 round-5 fold-in — its modules now live out-of-tree as `launchapp-dev/animus-runtime-shared` v0.1.0 (path-deped locally until that repo is published). The daemon scheduler resolves the workflow_runner binary via kind-based plugin discovery (`orchestrator_plugin_host::discover_by_kind("workflow_runner")`) with binary-name fallback for back-compat. As of v0.6, `config_source` is a **required** `RequiredRole` in `daemon_default()`: the kernel sources its base `WorkflowConfig` (workflows/agents/phases/schedules/triggers/daemon) EXCLUSIVELY from an installed `config_source` plugin — the in-tree YAML LOAD path was removed from `load_workflow_config_with_metadata`. The YAML PARSER survives as a library (`compile_yaml_workflow_files` + `collect_project_yaml_workflow_sources` + the `yaml_*` modules) consumed by the out-of-tree `launchapp-dev/animus-config-yaml` plugin (which path-deps `orchestrator-config`) and by tests; it is NOT called by the kernel's runtime load path. The kernel stays the COMPILER (pack-overlay merge + `validate_workflow_config_with_project_root` + state-machine derivation); only base acquisition moved to the plugin. The reference impl is `launchapp-dev/animus-config-yaml` (reads `.animus/workflows.yaml` + `.animus/workflows/*.yaml`), installed by `animus plugin install-defaults`. With no `config_source` plugin installed, `load_workflow_config*` returns an actionable "no config_source plugin installed" error and the daemon refuses to start. `load_agent_runtime_config*` derives entirely from the plugin-sourced `WorkflowConfig` (no separate in-tree YAML reader). Tests inject a synthetic base via the `orchestrator-config` `test-utils` feature seam (`config_source_client::install_yaml_config_source_base`).
132132
- Prefer narrow verification over full-workspace rebuilds while iterating.
133133

134134
## Implementation Landmarks

Cargo.lock

Lines changed: 18 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
[workspace]
22
members = [
33
"crates/animus-plugin-protocol",
4+
"crates/animus-config-protocol",
45
"crates/animus-plugin-runtime",
56
"crates/protocol",
67
"crates/orchestrator-daemon-runtime",
@@ -27,6 +28,7 @@ categories = ["command-line-utilities", "development-tools"]
2728

2829
[workspace.dependencies]
2930
animus-plugin-protocol = { path = "crates/animus-plugin-protocol" }
31+
animus-config-protocol = { path = "crates/animus-config-protocol" }
3032
animus-provider-protocol = { git = "https://github.com/launchapp-dev/animus-protocol", tag = "v0.1.13" }
3133
animus-session-backend = { git = "https://github.com/launchapp-dev/animus-protocol", tag = "v0.1.13" }
3234
animus-subject-protocol = { git = "https://github.com/launchapp-dev/animus-protocol", tag = "v0.5.7" }

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939

4040
Open a fresh **Claude Code** (or **Codex** / **OpenCode** / **Cursor**) session and paste this. The agent installs the Animus CLI, clones `animus-skills`, runs the setup script, and adds the project section to `CLAUDE.md` / `AGENTS.md`. You'll be running workflows in about a minute.
4141

42-
> Install Animus + Animus Skills: run **`curl -fsSL https://raw.githubusercontent.com/launchapp-dev/animus-cli/main/scripts/install.sh | bash`** to install the `animus` CLI (currently `v0.5.23` in this repo), then **`animus plugin install-defaults`** to pull in the provider + subject + workflow_runner + queue plugins the daemon needs (one-time setup, idempotent; add `--include-recommended` for the web UI and extra providers). Then **`git clone --single-branch --depth 1 https://github.com/launchapp-dev/animus-skills.git ~/.claude/skills/animus-skills && cd ~/.claude/skills/animus-skills && ./setup`** to link the skills and write `.mcp.json`. Add an "Animus" section to CLAUDE.md (or AGENTS.md for Codex) listing the slash commands: `/animus-setup`, `/animus-getting-started`, `/animus-mcp-setup`, `/animus-workflow-authoring`, `/animus-pack-authoring`, `/animus-skill-authoring`, `/animus-troubleshooting`. Restart the agent so the new `animus` MCP server is picked up. From a project root, run `animus init --walkthrough` to scaffold `.animus/`, install packs, and optionally start the daemon.
42+
> Install Animus + Animus Skills: run **`curl -fsSL https://raw.githubusercontent.com/launchapp-dev/animus-cli/main/scripts/install.sh | bash`** to install the `animus` CLI (currently `v0.6.0` in this repo), then **`animus plugin install-defaults`** to pull in the provider + subject + workflow_runner + queue plugins the daemon needs (one-time setup, idempotent; add `--include-recommended` for the web UI and extra providers). Then **`git clone --single-branch --depth 1 https://github.com/launchapp-dev/animus-skills.git ~/.claude/skills/animus-skills && cd ~/.claude/skills/animus-skills && ./setup`** to link the skills and write `.mcp.json`. Add an "Animus" section to CLAUDE.md (or AGENTS.md for Codex) listing the slash commands: `/animus-setup`, `/animus-getting-started`, `/animus-mcp-setup`, `/animus-workflow-authoring`, `/animus-pack-authoring`, `/animus-skill-authoring`, `/animus-troubleshooting`. Restart the agent so the new `animus` MCP server is picked up. From a project root, run `animus init --walkthrough` to scaffold `.animus/`, install packs, and optionally start the daemon.
4343

4444
For Codex CLI, swap the clone path to `~/.codex/skills/animus-skills` and edit `AGENTS.md` instead of `CLAUDE.md`.
4545

@@ -59,7 +59,7 @@ The second command is **required in v0.4.12 and later** (and expanded in **v0.5*
5959

6060
```bash
6161
# Specific version
62-
ANIMUS_VERSION=v0.5.23 curl -fsSL https://raw.githubusercontent.com/launchapp-dev/animus-cli/main/scripts/install.sh | bash
62+
ANIMUS_VERSION=v0.6.0 curl -fsSL https://raw.githubusercontent.com/launchapp-dev/animus-cli/main/scripts/install.sh | bash
6363

6464
# Custom directory
6565
ANIMUS_INSTALL_DIR=/usr/local/bin curl -fsSL https://raw.githubusercontent.com/launchapp-dev/animus-cli/main/scripts/install.sh | bash

_v06bin/animus

25.5 MB
Binary file not shown.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
[package]
2+
name = "animus-config-protocol"
3+
version = "0.1.0"
4+
edition = "2021"
5+
description = "Wire types for the Animus `config_source` plugin role (JSON-RPC 2.0). Defines the canonical config model envelope a config source returns and the kernel compiles."
6+
7+
[dependencies]
8+
serde = { version = "1", features = ["derive"] }
9+
serde_json = "1"
10+
serde_yaml = "0.9"
11+
schemars = "1.0"
12+
anyhow = "1.0"
13+
sha2 = "0.10"
14+
protocol = { workspace = true }
15+
16+
[dev-dependencies]
17+
tempfile = "3"
18+
19+
[[bin]]
20+
name = "animus-config-protocol-export-schema"
21+
path = "src/bin/export_schema.rs"
22+
23+
[lints]
24+
workspace = true

0 commit comments

Comments
 (0)