relay-flow 0.2.0-alpha → 0.2.1-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -6
- package/cmd/relay-flow/commands_test.go +519 -15
- package/cmd/relay-flow/main.go +331 -119
- package/cmd/relay-flow/scenario_test.go +209 -34
- package/cmd/relay-flow/serve.go +1 -0
- package/examples/default-story-workflow.yaml +88 -0
- package/internal/execution/goworkflows/activities.go +65 -65
- package/internal/execution/goworkflows/engine.go +41 -8
- package/internal/execution/goworkflows/engine_test.go +73 -13
- package/internal/execution/goworkflows/fakes_test.go +13 -21
- package/internal/execution/goworkflows/interpreter.go +16 -8
- package/internal/execution/goworkflows/node_runtime_integration_test.go +12 -6
- package/internal/execution/goworkflows/node_runtime_test.go +45 -21
- package/internal/execution/goworkflows/recovery_test.go +5 -5
- package/internal/execution/goworkflows/retry_log_test.go +11 -11
- package/internal/harness/contract_test.go +5 -0
- package/internal/paths/paths.go +18 -16
- package/internal/repo/repo.go +13 -0
- package/internal/repo/service_test.go +4 -4
- package/internal/router/router.go +3 -2
- package/internal/router/router_test.go +87 -0
- package/internal/run/manager.go +14 -1
- package/internal/run/run_manager_test.go +21 -1
- package/internal/runner/contract_test.go +64 -26
- package/internal/runner/orca/orca.go +30 -54
- package/internal/runner/orca/orca_test.go +143 -4
- package/internal/runner/orca/orcacli/orcacli.go +5 -0
- package/internal/runner/orca/orcacli/orcacli_test.go +3 -0
- package/internal/runner/orca/orcacli/testdata/strict-orca.sh +2 -0
- package/internal/runner/runner.go +15 -8
- package/internal/task/auth_test.go +48 -0
- package/internal/task/contract_test.go +2 -0
- package/internal/task/factory.go +16 -0
- package/internal/task/jira/auth.go +183 -0
- package/internal/task/jira/auth_test.go +107 -0
- package/internal/task/jira/effects_test.go +39 -0
- package/internal/task/jira/filters_test.go +36 -16
- package/internal/task/jira/helpers_test.go +29 -19
- package/internal/task/jira/jira.go +92 -61
- package/internal/task/jira/normalize.go +32 -14
- package/internal/task/jira/rest/adf.go +128 -0
- package/internal/task/jira/rest/client.go +573 -0
- package/internal/task/jira/rest/client_test.go +381 -0
- package/internal/task/jira/transition_defaults_test.go +18 -16
- package/internal/task/jira/validation_test.go +1 -1
- package/internal/workflow/workflow.go +9 -6
- package/internal/workflow/workflow_test.go +14 -12
- package/package.json +2 -1
- package/internal/task/jira/acli/acli.go +0 -306
- package/internal/task/jira/acli/acli_test.go +0 -208
- package/internal/task/jira/acli/testdata/acli_comments.json +0 -55
- package/internal/task/jira/acli/testdata/search_invalid_assignee.txt +0 -1
- package/internal/task/jira/acli/testdata/search_invalid_status.txt +0 -1
- package/internal/task/jira/acli/testdata/search_success.json +0 -1
- /package/internal/task/jira/testdata/{acli_search.json → jira_search_issues.json} +0 -0
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ This is a ground-up rewrite. The previous per-workflow, in-memory daemon is gone
|
|
|
14
14
|
|---|---|
|
|
15
15
|
| [opencode](https://opencode.ai) | Agents run in opencode sessions (harness) |
|
|
16
16
|
| [Orca](https://github.com/Necmttn/orca) CLI + app | Worktrees + terminals (runner) |
|
|
17
|
-
|
|
|
17
|
+
| Jira API token | Jira REST API v3 access (task system) |
|
|
18
18
|
| Go 1.24+ | Build the CLI |
|
|
19
19
|
|
|
20
20
|
### Install
|
|
@@ -32,20 +32,22 @@ OpenCode plugin: add `"relay-flow-plugin"` to the `plugin` array in your repo's
|
|
|
32
32
|
}
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
The plugin is the report-path half of the harness contract: it parses the agent's structured report, applies the agent/HITL nudge policy, and delivers `{runId, node, reportId, report}` via `relay-flow report` with retry.
|
|
35
|
+
The plugin is the report-path half of the harness contract: it registers each emitted harness session with `{runId, node, sessionId}`, parses the agent's structured report, applies the agent/HITL nudge policy, and delivers `{runId, node, reportId, report}` via `relay-flow report` with retry. `reportId` comes from the harness session/message identity; `nodeVisitID` is internal and is never part of either plugin payload.
|
|
36
36
|
|
|
37
37
|
### One-time machine setup
|
|
38
38
|
|
|
39
39
|
```sh
|
|
40
40
|
relay-flow init
|
|
41
|
+
relay-flow task auth
|
|
41
42
|
```
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
`init` only selects the task system, runner, and harness (singleton options are automatic), writes machine config, and initializes SQLite. `task auth` delegates authentication to that selected task plug-in. Jira prompts for its site, email, and masked API token, validates `/myself`, and owns the system-wide `credentials.yaml`; for scripts, pass `task auth --site`, `--email`, and `--token`. A normal init rerun refuses existing state. `relay-flow init --force` updates safe stopped instances while preserving durable and repo state.
|
|
44
45
|
|
|
45
46
|
The full machine layout is fixed under `~/.relay-flow` (0700):
|
|
46
47
|
|
|
47
48
|
```
|
|
48
49
|
config.yaml 0600 machine config
|
|
50
|
+
credentials.yaml 0600 selected task plug-in credentials
|
|
49
51
|
state.db 0600 durable execution (SQLite)
|
|
50
52
|
server.sock 0600 CLI ↔ server
|
|
51
53
|
server.lock 0600 single-process flock
|
|
@@ -60,7 +62,11 @@ workflows/<name>.yaml 0644 submitted workflow definitions
|
|
|
60
62
|
relay-flow repo register
|
|
61
63
|
```
|
|
62
64
|
|
|
63
|
-
|
|
65
|
+
Shows a multi-select titled `Select repositories`; use Space to select Orca repos and Enter to confirm. Enter the Jira project once. Each repo is registered sequentially with its Orca name/path and a Jira component derived from that repo name. Earlier registrations remain if a later one fails.
|
|
66
|
+
|
|
67
|
+
Each Jira poll uses REST v3 enhanced search and requests linked-issue status with the candidate fields. Tickets with any unfinished inward `Blocks` issue are filtered before routing; no per-ticket blocker lookup is made.
|
|
68
|
+
|
|
69
|
+
For scripts, use `relay-flow repo register --name <name> --path <path> --set project=<project>`. Component is always derived from `--name` and cannot be overridden. Registration is rejected while another repo already holds the same canonical task scope.
|
|
64
70
|
|
|
65
71
|
### Submit a workflow
|
|
66
72
|
|
|
@@ -70,14 +76,19 @@ relay-flow workflow submit --file <path>
|
|
|
70
76
|
|
|
71
77
|
Workflows live at `~/.relay-flow/workflows/<name>.yaml` after submit. Replacement and removal are rejected while any run of that workflow is active.
|
|
72
78
|
|
|
79
|
+
Use [`examples/default-story-workflow.yaml`](examples/default-story-workflow.yaml) as a fully annotated starting point. Replace its repo name and uncomment only the optional fields you need.
|
|
80
|
+
|
|
73
81
|
### Run
|
|
74
82
|
|
|
75
83
|
```sh
|
|
76
84
|
relay-flow serve # normal start; requires an initialized database
|
|
85
|
+
relay-flow serve --background # detached; returns after the server is ready
|
|
77
86
|
relay-flow serve --recover # explicit destructive rebuild from the task system
|
|
78
87
|
relay-flow stop
|
|
79
88
|
```
|
|
80
89
|
|
|
90
|
+
`--background` preserves `--debug` and `--recover`, logs to `~/.relay-flow/server.log`, and remains stoppable with `relay-flow stop`. Plain `serve` remains foreground and blocking.
|
|
91
|
+
|
|
81
92
|
`serve --recover` treats ALL SQLite execution state as gone, closes surviving run-owned terminals (preserving worktrees and code), resets Jira parent+mailbox state, and starts every labeled parent in a fresh deterministic run from `start` with fresh `nodeVisitID`s. Recovery never runs automatically; database loss is never inferred.
|
|
82
93
|
|
|
83
94
|
---
|
|
@@ -165,7 +176,7 @@ FEEDBACK
|
|
|
165
176
|
|
|
166
177
|
`None` is the literal marker for an intentionally empty section. When `NEXT STEP` is `end`, every FEEDBACK field must be `None` and no feedback comment is written.
|
|
167
178
|
|
|
168
|
-
The plugin delivers
|
|
179
|
+
The plugin delivers `{runId, node, reportId, report}` as one JSON object via `relay-flow report` stdin with the shared backoff (initial 2s, factor 2, jitter 0.2, max 5m) until acknowledged. It derives `reportId` from the harness session/message identity. Duplicate/stale reports are acked safely with no repeated graph effects. Invalid agent output is nudged; invalid HITL output stays silent.
|
|
169
180
|
|
|
170
181
|
---
|
|
171
182
|
|
|
@@ -183,7 +194,8 @@ The plugin delivers the report as one JSON object via `relay-flow report` stdin
|
|
|
183
194
|
- `runID` is deterministic from `repo/workflow/ticket`.
|
|
184
195
|
- `nodeVisitID` is generated once per node entry as a durable replay-safe side effect; it changes on revisit and on fresh runs after `--recover`.
|
|
185
196
|
- Terminal titles are stable `<ticket>:<node>` — they never carry `nodeVisitID`, workflow, or agent.
|
|
186
|
-
-
|
|
197
|
+
- Runtime registration is exactly `{runId, node, sessionId}`; normal execution persists that session ID and uses it to resume the harness session.
|
|
198
|
+
- Reports are exactly `{runId, node, reportId, report}`; `reportId` is derived from harness session/message identity and `nodeVisitID` stays internal.
|
|
187
199
|
|
|
188
200
|
### Poll cycle
|
|
189
201
|
|