Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .flow/registry/plugins.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"schema_version": 1,
"generated_at": "2026-06-12T17:08:48.501401Z",
"registry_hash": "sha256:4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945",
"plugins": []
}
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,4 @@ jobs:
- run: cargo fmt --all --check
- run: cargo clippy --all-targets --all-features -- -D warnings
- run: cargo test --all
- run: cargo run -- registry scan --check
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
/target/
/.flow/
/.flow/*
!/.flow/registry/
!/.flow/registry/plugins.json
/logs/
/.repolens/
/flowrun-codex-ready/
Expand Down
66 changes: 66 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ rusqlite = { version = "0.37", features = ["bundled"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
serde_yaml = "0.9"
sha2 = "0.10"
thiserror = "2"
tokio = { version = "1", features = ["full"] }
tracing = "0.1"
Expand Down
33 changes: 32 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ logs/
<run_id>/<step_name>/step.metadata.json
```

The `.flow/` directory is ignored by Git.
The `.flow/` directory is ignored by Git except `.flow/registry/plugins.json`, which is generated and versioned as the local plugin contract.

## CLI Commands

Expand Down Expand Up @@ -332,6 +332,37 @@ flow plugin test "unused-command" .\plugin-output.json
flow plugin test "powershell -NoProfile -File .\plugin.ps1" .\plugin-input.json
```

### Registry

The registry is the generated local plugin contract shared with validation, UI, MCP and `runflow-agent`.

```powershell
flow registry scan
flow registry scan --check
flow registry list plugins
flow registry inspect <plugin_name>
flow registry export --for-agent
```

V1 scans `plugins/*/plugin.yml` and writes `.flow/registry/plugins.json`. The file is generated, committed, and checked in CI with `flow registry scan --check`. Empty registries are valid and contain `plugins: []`.

Plugin workflows keep the explicit syntax:

```yaml
steps:
- name: check
type: plugin
run:
command: python
args: ["plugins/my_plugin/run.py"]
plugin_id: my_plugin
input: {}
```

`flow validate` rejects plugin steps whose `plugin_id` is registered but whose command does not reference the registered `entrypoint`.

See `docs/registry.md` for the development workflow and contract.

### Packages

Build a package from a workflow:
Expand Down
Loading
Loading