Skip to content
Open
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
13 changes: 7 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,13 +133,13 @@ More runnable examples (cron, timeout, scheduler scripts) live in

## The compose file

**Top-level fields:** `name`, `variables`, `agents`, `mcp_servers`, `volumes`, `network`.
**Top-level fields:** `name`, `env_file`, `variables`, `workspaces`, `agents`, `mcp_servers`, `volumes`, `network`.

**Common agent fields:** `provider`, `model`, `system_prompt`, `image`,
`driver`, `env` (scalars or `{ value, secret }`), `workspace`, `scheduler`,
`mcp_servers`, `skills`, and `volumes`.

Provision an agent's workspace from a local path (`provider: local`) or a Git
Provision an agent's workspace from a local path (`provider: file`) or a Git
repository (`provider: git`):

```yaml
Expand All @@ -148,12 +148,13 @@ agents:
workspace:
provider: git
url: https://github.com/example/repo.git
branch: main
ref: main
target: .
```

Scheduler scripts may be inline JavaScript or an explicit `{ url: ... }`
source using a local path, `file://`, `http://`, or `https://`. `config` and
`up` fetch URL sources locally and send an inline snapshot to the daemon. Use
Scheduler scripts may be inline JavaScript or a flat source mapping using
`provider: file`, `provider: http`, or `provider: git`. `config` and `up`
fetch mapped sources locally and send an inline snapshot to the daemon. Use
either `scheduler.script` or `scheduler.triggers` in one scheduler.

Add scheduled or event-driven runs. Use either `scheduler.triggers` **or** an
Expand Down
7 changes: 4 additions & 3 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,20 +98,21 @@ agent-compose down # 停止 sandbox、禁用 sche

## Compose 配置

**顶层字段:** `name`、`variables`、`agents`、`mcp_servers`、`volumes`、`network`。
**顶层字段:** `name`、`env_file`、`variables`、`workspaces`、`agents`、`mcp_servers`、`volumes`、`network`。

**agent 常用字段:** `provider`、`model`、`system_prompt`、`image`、`driver`、
`env`(scalar 或 `{ value, secret }`)、`workspace`、`scheduler`、`mcp_servers`、`skills`、`volumes`。

为 agent 从本地路径(`provider: local`)或 Git 仓库(`provider: git`)配置 workspace:
为 agent 从本地路径(`provider: file`)或 Git 仓库(`provider: git`)配置 workspace:

```yaml
agents:
reviewer:
workspace:
provider: git
url: https://github.com/example/repo.git
branch: main
ref: main
target: .
```

添加定时或事件驱动的 run。`scheduler.triggers` 与内联 `scheduler.script` 在同一 scheduler 中二选一:
Expand Down
4 changes: 2 additions & 2 deletions cmd/agent-compose/cli_daemon_lifecycle_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ func TestConfigCommandPrintsNormalizedYAMLWithoutStartingDaemon(t *testing.T) {
writeComposeFile(t, dir, `
workspaces:
default:
provider: local
provider: file
path: .
variables:
API_KEY:
Expand Down Expand Up @@ -190,7 +190,7 @@ variables:
secret: true
workspaces:
default:
provider: local
provider: file
path: .
agents:
reviewer:
Expand Down
2 changes: 1 addition & 1 deletion cmd/agent-compose/cli_project_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ agents:
name: cli-up-demo
workspaces:
default:
provider: local
provider: file
path: .
agents:
reviewer:
Expand Down
17 changes: 9 additions & 8 deletions cmd/agent-compose/cli_project_workflow_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ agents:
reviewer:
scheduler:
script:
provider: http
url: %s/scheduler.js
`, sourceServer.URL))
_, stderr, _, exitCode := executeCLICommand("up", "--file", composePath, "--host", daemon.URL)
Expand Down Expand Up @@ -95,7 +96,7 @@ func testCLIWorkspaceRegistryConfigAndApply(t *testing.T) {
name: workspace-default
workspaces:
repo-root:
provider: local
provider: file
path: .
agents:
reviewer:
Expand Down Expand Up @@ -126,7 +127,7 @@ agents:
if err := json.Unmarshal([]byte(stdout), &decoded); err != nil {
t.Fatalf("config json decode failed: %v\n%s", err, stdout)
}
if len(decoded.Workspaces) != 1 || decoded.Workspaces[0].Key != "repo-root" || decoded.Workspaces[0].Provider != "local" {
if len(decoded.Workspaces) != 1 || decoded.Workspaces[0].Key != "repo-root" || decoded.Workspaces[0].Provider != "file" {
t.Fatalf("decoded workspaces = %#v", decoded.Workspaces)
}
if len(decoded.Agents) != 1 || decoded.Agents[0].Workspace != nil {
Expand All @@ -148,12 +149,12 @@ agents:
name: workspace-reference
workspaces:
repo-root:
provider: local
provider: file
path: .
docs-repo:
provider: git
url: https://example.test/docs.git
path: docs
target: docs
agents:
reviewer:
provider: codex
Expand Down Expand Up @@ -186,7 +187,7 @@ agents:
if len(decoded.Workspaces) != 2 || decoded.Workspaces[0].Key != "docs-repo" || decoded.Workspaces[1].Key != "repo-root" {
t.Fatalf("decoded workspaces = %#v", decoded.Workspaces)
}
if len(decoded.Agents) != 1 || decoded.Agents[0].Workspace.Provider != "local" || decoded.Agents[0].Workspace.Path != "." || decoded.Agents[0].Workspace.Name != "" {
if len(decoded.Agents) != 1 || decoded.Agents[0].Workspace.Provider != "file" || decoded.Agents[0].Workspace.Path != "." || decoded.Agents[0].Workspace.Name != "" {
t.Fatalf("decoded agents = %#v", decoded.Agents)
}

Expand All @@ -205,7 +206,7 @@ agents:
name: workspace-ambiguous
workspaces:
repo-root:
provider: local
provider: file
path: .
docs-repo:
provider: git
Expand Down Expand Up @@ -257,7 +258,7 @@ agents:
name: workspace-missing-ref
workspaces:
repo-root:
provider: local
provider: file
path: .
agents:
reviewer:
Expand Down Expand Up @@ -464,7 +465,7 @@ func writeComposeFileNamed(t *testing.T, dir string, name string, content string
}
trimmed := strings.TrimSpace(content)
if strings.HasPrefix(name, "agent-compose.") && !strings.Contains(trimmed, "\nworkspaces:") && !strings.HasPrefix(trimmed, "workspaces:") {
content = "workspaces:\n default:\n provider: local\n path: .\n" + content
content = "workspaces:\n default:\n provider: file\n path: .\n" + content
}
path := filepath.Join(dir, name)
if err := os.WriteFile(path, []byte(content), 0o600); err != nil {
Expand Down
8 changes: 5 additions & 3 deletions cmd/agent-compose/cli_scheduler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ func TestConfigCommandExpandsSchedulerScriptURLs(t *testing.T) {
if err := os.WriteFile(path, []byte(script), 0o600); err != nil {
t.Fatal(err)
}
return "./scripts/scheduler.js"
return "provider: file\n path: ./scripts/scheduler.js"
}},
{name: "HTTP", location: func(string) string { return httpServer.URL + "/scheduler.js" }},
{name: "HTTP", location: func(string) string { return "provider: http\n url: " + httpServer.URL + "/scheduler.js" }},
} {
t.Run(tc.name, func(t *testing.T) {
dir := t.TempDir()
Expand All @@ -55,7 +55,7 @@ agents:
reviewer:
scheduler:
script:
url: %s
%s
`, tc.location(dir)))
stdout, stderr, runCount, err := executeCommand("config", "--file", composePath)
if err != nil || stderr != "" || runCount != 0 {
Expand Down Expand Up @@ -90,6 +90,7 @@ agents:
reviewer:
scheduler:
script:
provider: http
url: %s/scheduler.js
`, sourceServer.URL))
_, expected, err := loadResolvedNormalizedCompose(context.Background(), cliOptions{ComposeFile: composePath})
Expand Down Expand Up @@ -129,6 +130,7 @@ agents:
reviewer:
scheduler:
script:
provider: http
url: http://127.0.0.1:1/unreachable.js
`)
_, stderr, _, exitCode := executeCLICommand("down", "--file", composePath, "--host", daemon.URL, "--json")
Expand Down
5 changes: 3 additions & 2 deletions cmd/agent-compose/e2e_docker_scheduler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ scheduler.cron("hello-every-minute", "*/1 * * * *", async function() {
name: e2e-docker-script
workspaces:
default:
provider: local
provider: file
path: .
agents:
hello:
Expand All @@ -103,7 +103,8 @@ agents:
docker: {}
scheduler:
script:
url: ./scripts/hello-scheduler.js
provider: file
path: ./scripts/hello-scheduler.js
`, guestImage))

stdout, stderr, _, exitCode := executeCLICommand("up", "--file", composePath)
Expand Down
3 changes: 2 additions & 1 deletion docs/design/agent-compose_design.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,8 @@ workspaces:
default:
provider: git
url: https://github.com/org/repo.git
branch: main
ref: main
target: .

agents:
reviewer:
Expand Down
Loading
Loading