forgeo-cli 0.7.3__tar.gz → 0.9.0__tar.gz
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.
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/CHANGELOG.md +43 -1
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/PKG-INFO +40 -9
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/README.md +39 -8
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/docs/backlog.md +167 -8
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/docs/cli-reference.md +3 -2
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/docs/configuration.md +128 -4
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/docs/getting-started.md +7 -1
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/docs/index.md +5 -5
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/docs/web-console-api.md +8 -9
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/install.sh +1 -1
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/pyproject.toml +1 -1
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/__init__.py +1 -1
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/backlog.py +204 -187
- forgeo_cli-0.9.0/src/forgeo/backlog_github.py +640 -0
- forgeo_cli-0.9.0/src/forgeo/backlog_gitlab.py +617 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/backlog_http.py +2 -2
- forgeo_cli-0.9.0/src/forgeo/backlog_issue_base.py +183 -0
- forgeo_cli-0.9.0/src/forgeo/backlog_jira.py +973 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/central.py +8 -9
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/cli.py +6 -5
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/config.py +7 -7
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/daemon.py +1 -1
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/forgeo.py +13 -3
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/models.py +398 -10
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/paths.py +3 -3
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/validate.py +31 -17
- forgeo_cli-0.9.0/tests/test_backlog_github.py +259 -0
- forgeo_cli-0.9.0/tests/test_backlog_gitlab.py +237 -0
- forgeo_cli-0.9.0/tests/test_backlog_jira.py +455 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_install.py +14 -1
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_models.py +90 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/.github/workflows/ci.yml +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/.gitignore +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/CONTRIBUTING.md +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/LICENSE +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/config/nginx-forgeo.conf +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/docs/agent-contract.md +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/docs/img/console.png +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/docs/img/demo.gif +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/docs/img/logo.png +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/docs/img/og.png +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/docs/img/title.svg +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/forgeo.spec +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/mkdocs.yml +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/scripts/__init__.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/scripts/render_homebrew_formula.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/__main__.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/agent.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/daemon_control.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/git.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/instances.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/io.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/notify.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/oauth.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/runs.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/setup.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/update.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/web/central/central.css +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/web/central/central.js +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/web/central/index.html +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/web/central/instance.html +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/web/central/login.html +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/web/style.css +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/src/forgeo/web_common.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/conftest.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_agent.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_backlog.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_backlog_http.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_cli.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_daemon.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_factory.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_git.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_instances.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_io.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_oauth.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_paths.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_remote_backlog_cycle.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_render_homebrew.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_runs.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_setup.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_update.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_web.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_web_common.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/tests/test_web_lock.py +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/www/404.html +0 -0
- {forgeo_cli-0.7.3 → forgeo_cli-0.9.0}/www/index.html +0 -0
|
@@ -7,6 +7,46 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.9.0] - 2026-08-23
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- GitHub Issues and GitLab Issues task providers. Set `backlog_provider: github`
|
|
15
|
+
or `gitlab` and point `backlog:` at the API base URL
|
|
16
|
+
(`https://api.github.com` or `https://github.example.com/api/v3` for
|
|
17
|
+
Enterprise; `https://gitlab.com` or a self-hosted root for GitLab). Issue
|
|
18
|
+
numbers/`iid`s become Forgeo task ids, `open`/`opened` vs `closed` maps to
|
|
19
|
+
`OPEN`/`COMPLETED`, and `forgeo-running`/`forgeo-blocked`/`forgeo-failed`
|
|
20
|
+
labels (configurable via `label_prefix`) represent the remaining states.
|
|
21
|
+
Engine state — blocker and failure reasons, retry counters, claim time,
|
|
22
|
+
dependencies, and bounded agent output — is stored in a hidden
|
|
23
|
+
`<!-- forgeo: {...} -->` block inside the issue body/description, so the
|
|
24
|
+
visible text stays human-readable and no custom fields or issue properties
|
|
25
|
+
are required.
|
|
26
|
+
- `github` and `gitlab` config blocks: `repo` (`owner/repo` or project path/id),
|
|
27
|
+
`token_env` (PAT from an environment variable, never stored in the file),
|
|
28
|
+
`label_prefix`/`property_key`, pagination, timeouts, stale-claim recovery
|
|
29
|
+
via `claim_timeout_seconds`, and optional workflow/field mappings mirroring
|
|
30
|
+
the Jira provider.
|
|
31
|
+
- Shared issue-provider helpers extracted to `backlog_issue_base` and a new
|
|
32
|
+
`DocumentBacklogStore` / `IssueBacklogBase` split in `backlog.py`,
|
|
33
|
+
unifying claim, label, and engine-state handling across Jira, GitHub, and
|
|
34
|
+
GitLab. `forgeo validate` now checks any remote backlog with a
|
|
35
|
+
provider-specific message, and `config/forgeo.yaml`, the README, and the
|
|
36
|
+
backlog/configuration docs list and document all five providers
|
|
37
|
+
(`file`, `http`, `jira`, `github`, `gitlab`).
|
|
38
|
+
|
|
39
|
+
## [0.8.0] - 2026-08-21
|
|
40
|
+
|
|
41
|
+
### Added
|
|
42
|
+
|
|
43
|
+
- A Jira task provider selected with `backlog_provider: jira`, including Jira
|
|
44
|
+
Cloud cursor pagination, workflow-based claiming, optional custom-field
|
|
45
|
+
mappings, issue-property engine state, stale-claim recovery, and bearer or
|
|
46
|
+
basic authentication from environment variables.
|
|
47
|
+
- A provider-level claim hook so remote task sources can prevent duplicate
|
|
48
|
+
agent runs while preserving the existing JSON and HTTP backlog behavior.
|
|
49
|
+
|
|
10
50
|
## [0.7.3] - 2026-08-19
|
|
11
51
|
|
|
12
52
|
### Added
|
|
@@ -349,7 +389,9 @@ Initial release of the scheduled, agent-driven software forgeo.
|
|
|
349
389
|
overlapping-run skipping.
|
|
350
390
|
- Dogfooding docs removed; local configs kept out of the repository.
|
|
351
391
|
|
|
352
|
-
[Unreleased]: https://github.com/lucaGazzola/forgeo/compare/v0.
|
|
392
|
+
[Unreleased]: https://github.com/lucaGazzola/forgeo/compare/v0.9.0...HEAD
|
|
393
|
+
[0.9.0]: https://github.com/lucaGazzola/forgeo/compare/v0.8.0...v0.9.0
|
|
394
|
+
[0.8.0]: https://github.com/lucaGazzola/forgeo/compare/v0.7.3...v0.8.0
|
|
353
395
|
[0.7.3]: https://github.com/lucaGazzola/forgeo/compare/v0.7.2...v0.7.3
|
|
354
396
|
[0.7.2]: https://github.com/lucaGazzola/forgeo/compare/v0.7.1...v0.7.2
|
|
355
397
|
[0.7.1]: https://github.com/lucaGazzola/forgeo/compare/v0.7.0...v0.7.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: forgeo-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.0
|
|
4
4
|
Summary: A scheduled software forgeo: executes backlog tasks on main, refactors when idle, and writes BLOCKER.md when it needs human input.
|
|
5
5
|
Project-URL: Homepage, https://forgeo.org
|
|
6
6
|
Project-URL: Documentation, https://forgeo.org
|
|
@@ -121,6 +121,9 @@ configuration, start the daemon.
|
|
|
121
121
|
# Backlog format), created on first use:
|
|
122
122
|
# .forgeo/backlog.json
|
|
123
123
|
|
|
124
|
+
# Or: configure `backlog_provider: jira` / `github` / `gitlab` and set `backlog` to the provider base URL
|
|
125
|
+
# (see the backlog documentation for Jira/GitHub/GitLab).
|
|
126
|
+
|
|
124
127
|
# Or: add tasks from the web console once your forgeo is registered
|
|
125
128
|
# (first `forgeo start` registers it automatically):
|
|
126
129
|
forgeo web # dashboard at http://0.0.0.0:8790, or keep it on with `forgeo web -d`
|
|
@@ -167,6 +170,27 @@ shared host protect it with `forgeo web --token` (requires
|
|
|
167
170
|
`Authorization: Bearer <token>` on every `/api/*` route — see
|
|
168
171
|
[Web console & HTTP API](docs/web-console-api.md)).
|
|
169
172
|
|
|
173
|
+
### Running the agent in a container
|
|
174
|
+
|
|
175
|
+
By default Forgeo runs the agent directly on the host. To run it inside a
|
|
176
|
+
Docker container instead, set `agent_sandbox: docker` in `forgeo.yaml`:
|
|
177
|
+
|
|
178
|
+
```yaml
|
|
179
|
+
agent_sandbox: docker
|
|
180
|
+
agent_sandbox_image: your-image
|
|
181
|
+
agent_sandbox_network: none # default; set bridge/host to allow network
|
|
182
|
+
agent_sandbox_mounts: # optional, read-only, e.g. ~/.claude
|
|
183
|
+
- ~/.claude
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
The image must already contain the agent CLI your `agent_command` uses plus a
|
|
187
|
+
shell (nothing is installed at run time). Forgeo bind-mounts the repository
|
|
188
|
+
into the container at the same path, so the agent's edits land on your
|
|
189
|
+
checkout and are committed as usual; the task is passed through as
|
|
190
|
+
`FORGEO_TASK`. Networking is off by default (`none`) and nothing else is
|
|
191
|
+
visible inside the container unless you list it in `agent_sandbox_mounts`.
|
|
192
|
+
See the [Configuration](docs/configuration.md) docs for details.
|
|
193
|
+
|
|
170
194
|
### Multiple repositories (instances)
|
|
171
195
|
|
|
172
196
|
Run several factories at once, one per repository; each config is fully
|
|
@@ -186,14 +210,21 @@ and get one aggregate overview with the central dashboard, `forgeo web`.
|
|
|
186
210
|
| All CLI commands | [CLI reference](docs/cli-reference.md) |
|
|
187
211
|
| Web dashboard & HTTP API | [Web console & HTTP API](docs/web-console-api.md) |
|
|
188
212
|
|
|
189
|
-
Everything is stored in plain files: the backlog, `forgeo.log`, and
|
|
190
|
-
`BLOCKER.md` whenever a decision is pending.
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
213
|
+
Everything is stored in plain files: the local backlog, `forgeo.log`, and
|
|
214
|
+
`BLOCKER.md` whenever a decision is pending. Backlog providers (see
|
|
215
|
+
[Backlog format](docs/backlog.md)):
|
|
216
|
+
|
|
217
|
+
- [JSON file](docs/backlog.md#a-json-file-backlog)
|
|
218
|
+
- [HTTP endpoint](docs/backlog.md#a-backlog-over-http)
|
|
219
|
+
- [Jira](docs/backlog.md#a-jira-backlog)
|
|
220
|
+
- [GitHub](docs/backlog.md#a-github-backlog)
|
|
221
|
+
- [GitLab](docs/backlog.md#a-gitlab-backlog)
|
|
222
|
+
|
|
223
|
+
File and HTTP backlogs exchange the complete task document; Jira/GitHub/GitLab issues are read and transitioned
|
|
224
|
+
individually with workflow state and engine metadata stored on the issue. A *file* backlog is snapshotted (rotating
|
|
225
|
+
`backlog.json.bak` files) before every agent run and on daemon startup, and
|
|
226
|
+
restored automatically if it is ever found corrupt — a bad write never loses
|
|
227
|
+
your tasks.
|
|
197
228
|
|
|
198
229
|
## Develop
|
|
199
230
|
|
|
@@ -67,6 +67,9 @@ configuration, start the daemon.
|
|
|
67
67
|
# Backlog format), created on first use:
|
|
68
68
|
# .forgeo/backlog.json
|
|
69
69
|
|
|
70
|
+
# Or: configure `backlog_provider: jira` / `github` / `gitlab` and set `backlog` to the provider base URL
|
|
71
|
+
# (see the backlog documentation for Jira/GitHub/GitLab).
|
|
72
|
+
|
|
70
73
|
# Or: add tasks from the web console once your forgeo is registered
|
|
71
74
|
# (first `forgeo start` registers it automatically):
|
|
72
75
|
forgeo web # dashboard at http://0.0.0.0:8790, or keep it on with `forgeo web -d`
|
|
@@ -113,6 +116,27 @@ shared host protect it with `forgeo web --token` (requires
|
|
|
113
116
|
`Authorization: Bearer <token>` on every `/api/*` route — see
|
|
114
117
|
[Web console & HTTP API](docs/web-console-api.md)).
|
|
115
118
|
|
|
119
|
+
### Running the agent in a container
|
|
120
|
+
|
|
121
|
+
By default Forgeo runs the agent directly on the host. To run it inside a
|
|
122
|
+
Docker container instead, set `agent_sandbox: docker` in `forgeo.yaml`:
|
|
123
|
+
|
|
124
|
+
```yaml
|
|
125
|
+
agent_sandbox: docker
|
|
126
|
+
agent_sandbox_image: your-image
|
|
127
|
+
agent_sandbox_network: none # default; set bridge/host to allow network
|
|
128
|
+
agent_sandbox_mounts: # optional, read-only, e.g. ~/.claude
|
|
129
|
+
- ~/.claude
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
The image must already contain the agent CLI your `agent_command` uses plus a
|
|
133
|
+
shell (nothing is installed at run time). Forgeo bind-mounts the repository
|
|
134
|
+
into the container at the same path, so the agent's edits land on your
|
|
135
|
+
checkout and are committed as usual; the task is passed through as
|
|
136
|
+
`FORGEO_TASK`. Networking is off by default (`none`) and nothing else is
|
|
137
|
+
visible inside the container unless you list it in `agent_sandbox_mounts`.
|
|
138
|
+
See the [Configuration](docs/configuration.md) docs for details.
|
|
139
|
+
|
|
116
140
|
### Multiple repositories (instances)
|
|
117
141
|
|
|
118
142
|
Run several factories at once, one per repository; each config is fully
|
|
@@ -132,14 +156,21 @@ and get one aggregate overview with the central dashboard, `forgeo web`.
|
|
|
132
156
|
| All CLI commands | [CLI reference](docs/cli-reference.md) |
|
|
133
157
|
| Web dashboard & HTTP API | [Web console & HTTP API](docs/web-console-api.md) |
|
|
134
158
|
|
|
135
|
-
Everything is stored in plain files: the backlog, `forgeo.log`, and
|
|
136
|
-
`BLOCKER.md` whenever a decision is pending.
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
159
|
+
Everything is stored in plain files: the local backlog, `forgeo.log`, and
|
|
160
|
+
`BLOCKER.md` whenever a decision is pending. Backlog providers (see
|
|
161
|
+
[Backlog format](docs/backlog.md)):
|
|
162
|
+
|
|
163
|
+
- [JSON file](docs/backlog.md#a-json-file-backlog)
|
|
164
|
+
- [HTTP endpoint](docs/backlog.md#a-backlog-over-http)
|
|
165
|
+
- [Jira](docs/backlog.md#a-jira-backlog)
|
|
166
|
+
- [GitHub](docs/backlog.md#a-github-backlog)
|
|
167
|
+
- [GitLab](docs/backlog.md#a-gitlab-backlog)
|
|
168
|
+
|
|
169
|
+
File and HTTP backlogs exchange the complete task document; Jira/GitHub/GitLab issues are read and transitioned
|
|
170
|
+
individually with workflow state and engine metadata stored on the issue. A *file* backlog is snapshotted (rotating
|
|
171
|
+
`backlog.json.bak` files) before every agent run and on daemon startup, and
|
|
172
|
+
restored automatically if it is ever found corrupt — a bad write never loses
|
|
173
|
+
your tasks.
|
|
143
174
|
|
|
144
175
|
## Develop
|
|
145
176
|
|
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
# Backlog format
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
- [JSON file](#a-json-file-backlog)
|
|
4
|
+
- [HTTP endpoint](#a-backlog-over-http)
|
|
5
|
+
- [Jira](#a-jira-backlog)
|
|
6
|
+
- [GitHub](#a-github-backlog)
|
|
7
|
+
- [GitLab](#a-gitlab-backlog)
|
|
8
|
+
|
|
9
|
+
The backlog is a **plain JSON document** — a list of tasks Forgeo works through
|
|
10
|
+
one by one.
|
|
11
|
+
|
|
12
|
+
## A JSON file backlog
|
|
13
|
+
|
|
14
|
+
By default the backlog is a file you edit by hand, living wherever `backlog:`
|
|
15
|
+
points in [forgeo.yaml](configuration.md) — `backlog.json` at the project root,
|
|
16
|
+
or `.forgeo/backlog.json` when generated by `forgeo init`. Keep it outside the
|
|
17
|
+
repository if you can so the agent never touches it. It can also be
|
|
18
|
+
[served over HTTP](#a-backlog-over-http) by another application, in which case
|
|
19
|
+
the document below is exactly what that endpoint exchanges with Forgeo, or it
|
|
20
|
+
can be sourced directly from [Jira](#a-jira-backlog),
|
|
21
|
+
[GitHub](#a-github-backlog) or [GitLab](#a-gitlab-backlog).
|
|
10
22
|
|
|
11
23
|
```json
|
|
12
24
|
{
|
|
@@ -287,7 +299,7 @@ favor of an older valid one; when no snapshot exists, the forgeo falls back to
|
|
|
287
299
|
an empty store exactly as before. A missing backlog is a no-op — no snapshot
|
|
288
300
|
is created for a file that does not exist.
|
|
289
301
|
|
|
290
|
-
This whole section is about a backlog *file*. A backlog
|
|
302
|
+
This whole section is about a backlog *file*. A remote backlog is owned by the
|
|
291
303
|
application serving it, which keeps its own history, so Forgeo neither
|
|
292
304
|
snapshots nor repairs it — see below.
|
|
293
305
|
|
|
@@ -349,3 +361,150 @@ There is no backlog file for Forgeo's own runtime files to sit beside, so
|
|
|
349
361
|
`runs.jsonl` go into `state_dir`, which defaults to the directory holding
|
|
350
362
|
`forgeo.yaml`. No snapshots are written: the document belongs to the remote
|
|
351
363
|
application, so rolling it back is that application's job, not Forgeo's.
|
|
364
|
+
|
|
365
|
+
## A Jira backlog
|
|
366
|
+
|
|
367
|
+
Set `backlog_provider: jira` and point `backlog:` at the Jira base URL:
|
|
368
|
+
|
|
369
|
+
```yaml
|
|
370
|
+
backlog_provider: jira
|
|
371
|
+
backlog: https://jira.example.com
|
|
372
|
+
|
|
373
|
+
jira:
|
|
374
|
+
jql: 'project = APP AND labels = forgeo'
|
|
375
|
+
project_key: APP
|
|
376
|
+
auth:
|
|
377
|
+
scheme: basic
|
|
378
|
+
username_env: JIRA_USER
|
|
379
|
+
token_env: JIRA_TOKEN
|
|
380
|
+
workflow:
|
|
381
|
+
open_statuses: ["10000", "10001"]
|
|
382
|
+
open_status: "10000"
|
|
383
|
+
running_status: "3"
|
|
384
|
+
completed_status: "10002"
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
The JQL is the provider's scope. It should include open, running, blocked and
|
|
388
|
+
completed issues so Forgeo can see dependencies and render the dashboard
|
|
389
|
+
correctly. Jira status references can be names or ids; ids are more stable.
|
|
390
|
+
|
|
391
|
+
### Mapping and lifecycle
|
|
392
|
+
|
|
393
|
+
- Jira issue keys are Forgeo task ids.
|
|
394
|
+
- `summary`, `description`, `created` and `updated` map to the corresponding task fields.
|
|
395
|
+
- `open_statuses` identifies issues eligible for picking.
|
|
396
|
+
- `running_status` is applied before the agent starts, preventing a second worker from claiming the same issue.
|
|
397
|
+
- `completed_status` is applied after a successful commit.
|
|
398
|
+
- `blocked_status` is optional; the `forgeo-blocked` label is always applied when the agent needs human input.
|
|
399
|
+
- `failed_status` is optional; without it, the `forgeo-failed` label represents a failed task while the issue returns to the configured open status.
|
|
400
|
+
|
|
401
|
+
Forgeo stores blocker reasons, failure reasons, retry counters, claim time and
|
|
402
|
+
bounded agent output in the Jira issue property named `forgeo` by default.
|
|
403
|
+
Set `jira.property_key` to change it. Optional Jira custom fields can carry
|
|
404
|
+
`acceptance_criteria`, `dependencies`, `files_to_modify`, per-task agent
|
|
405
|
+
settings, `run_at`, and `retries_left`. If no custom `run_at` field is
|
|
406
|
+
configured, Jira's native `duedate` is used at midnight UTC:
|
|
407
|
+
|
|
408
|
+
```yaml
|
|
409
|
+
jira:
|
|
410
|
+
fields:
|
|
411
|
+
acceptance_criteria: customfield_10042
|
|
412
|
+
dependencies: customfield_10043
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
Dependencies may also be inferred from Jira issue links whose link type is
|
|
416
|
+
`blocks`. The issue that is blocked is treated as depending on the issue that
|
|
417
|
+
blocks it.
|
|
418
|
+
|
|
419
|
+
### Authentication
|
|
420
|
+
|
|
421
|
+
Jira credentials are never stored directly in `forgeo.yaml`:
|
|
422
|
+
|
|
423
|
+
- `basic` uses `username` or `username_env` plus an API token named by `token_env`.
|
|
424
|
+
- `bearer` uses a personal-access token named by `token_env`.
|
|
425
|
+
|
|
426
|
+
The client uses Jira REST API v3 by default, including Jira Cloud's
|
|
427
|
+
`/search/jql` endpoint and cursor pagination via `nextPageToken`. Set
|
|
428
|
+
`jira.api_version: 2` for Jira installations that expose the older offset-based
|
|
429
|
+
search endpoint and v2 comment/description format.
|
|
430
|
+
|
|
431
|
+
### Runtime behavior
|
|
432
|
+
|
|
433
|
+
The daemon reads Jira with paginated JQL searches. A task is claimed by
|
|
434
|
+
rechecking it and transitioning it to `running_status` before the agent runs.
|
|
435
|
+
If a process dies while holding a claim, a later cycle releases claims older
|
|
436
|
+
than `claim_timeout_seconds` and returns them to the configured open status.
|
|
437
|
+
An unavailable Jira endpoint fails the cycle; it is never treated as an empty
|
|
438
|
+
backlog.
|
|
439
|
+
|
|
440
|
+
## A GitHub backlog
|
|
441
|
+
|
|
442
|
+
Set `backlog_provider: github` and point `backlog:` at the GitHub API base URL:
|
|
443
|
+
|
|
444
|
+
```yaml
|
|
445
|
+
backlog_provider: github
|
|
446
|
+
backlog: https://api.github.com
|
|
447
|
+
|
|
448
|
+
github:
|
|
449
|
+
repo: owner/repo
|
|
450
|
+
token_env: GITHUB_TOKEN
|
|
451
|
+
label_prefix: forgeo
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
Use `https://api.github.com` for github.com or `https://github.example.com/api/v3` for Enterprise.
|
|
455
|
+
|
|
456
|
+
### Mapping and lifecycle
|
|
457
|
+
|
|
458
|
+
- GitHub issue numbers are Forgeo task ids.
|
|
459
|
+
- `title`, `body` (visible part), `created_at` and `updated_at` map to task fields.
|
|
460
|
+
- `state` `open` maps to `OPEN`; `closed` maps to `COMPLETED`.
|
|
461
|
+
- Labels `forgeo-running`, `forgeo-blocked`, `forgeo-failed` (prefix configurable via `label_prefix`) represent running, blocked, and failed tasks. An open issue carrying `forgeo-running` is considered claimed and filtered from picking.
|
|
462
|
+
- Closing an issue completes its task; reopening it moves the task back to `OPEN`.
|
|
463
|
+
|
|
464
|
+
Forgeo stores blocker reasons, failure reasons, retry counters, claim time, dependencies, and bounded agent output in a hidden JSON block inside the issue body: `<!-- forgeo: {...} -->`. The visible body remains human-readable; the hidden block is stripped on read and merged on write. No GitHub issue property or custom field is required. Set `github.property_key` only for symmetry; the marker key is `forgeo` by default.
|
|
465
|
+
|
|
466
|
+
Dependencies are persisted via the hidden block's `dependencies` list; no GitHub issue links are required.
|
|
467
|
+
|
|
468
|
+
### Authentication
|
|
469
|
+
|
|
470
|
+
GitHub credentials are never stored in `forgeo.yaml`:
|
|
471
|
+
|
|
472
|
+
- `token_env` names the environment variable holding a personal-access token (classic or fine-grained). The token is sent as `Authorization: Bearer <token>`.
|
|
473
|
+
|
|
474
|
+
### Runtime behavior
|
|
475
|
+
|
|
476
|
+
The daemon lists GitHub issues with paginated `GET /repos/{owner}/{repo}/issues?state=all`. A task is claimed by adding the `forgeo-running` label and persisting `claimed_at` in the hidden block. If a process dies while holding a claim, a later cycle releases claims older than `claim_timeout_seconds` and removes the running label. An unavailable GitHub endpoint fails the cycle.
|
|
477
|
+
|
|
478
|
+
## A GitLab backlog
|
|
479
|
+
|
|
480
|
+
Set `backlog_provider: gitlab` and point `backlog:` at the GitLab base URL:
|
|
481
|
+
|
|
482
|
+
```yaml
|
|
483
|
+
backlog_provider: gitlab
|
|
484
|
+
backlog: https://gitlab.example.com
|
|
485
|
+
|
|
486
|
+
gitlab:
|
|
487
|
+
repo: group/project # or numeric project id
|
|
488
|
+
token_env: GITLAB_TOKEN
|
|
489
|
+
label_prefix: forgeo
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
GitLab base URL is the instance root (e.g. `https://gitlab.com`); the client appends `/api/v4`.
|
|
493
|
+
|
|
494
|
+
### Mapping and lifecycle
|
|
495
|
+
|
|
496
|
+
- GitLab issue `iid`s are Forgeo task ids.
|
|
497
|
+
- `title`, `description` (visible part), `created_at` and `updated_at` map to task fields.
|
|
498
|
+
- `state` `opened` maps to `OPEN`; `closed` maps to `COMPLETED`.
|
|
499
|
+
- Labels `forgeo-running`, `forgeo-blocked`, `forgeo-failed` represent running, blocked, and failed tasks, like GitHub. An `opened` issue with `forgeo-running` is filtered as claimed.
|
|
500
|
+
- Closing/reopening via `state_event` transitions the task to `COMPLETED`/`OPEN`.
|
|
501
|
+
|
|
502
|
+
Forgeo stores engine state the same way as GitHub: a hidden `<!-- forgeo: {...} -->` block inside `description`. Dependencies and other task attributes are kept there; no GitLab custom fields are required.
|
|
503
|
+
|
|
504
|
+
### Authentication
|
|
505
|
+
|
|
506
|
+
- `token_env` names the environment variable holding a personal-access token. Sent as `PRIVATE-TOKEN` and `Authorization: Bearer`.
|
|
507
|
+
|
|
508
|
+
### Runtime behavior
|
|
509
|
+
|
|
510
|
+
Paginated `GET /api/v4/projects/:id/issues?state=all`. Claiming adds `forgeo-running` and `claimed_at`; stale claims older than `claim_timeout_seconds` are released. An unavailable GitLab endpoint fails the cycle.
|
|
@@ -184,8 +184,9 @@ It validates, reporting **all** problems at once:
|
|
|
184
184
|
would refuse as dirty — make an initial commit first
|
|
185
185
|
(`git add -A && git commit -m "Initial commit"`);
|
|
186
186
|
- the remote resolves when `remote` is set (`git remote get-url`);
|
|
187
|
-
- the backlog parses and every task is valid (a missing backlog is fine:
|
|
188
|
-
is treated as empty on the first cycle
|
|
187
|
+
- the backlog parses and every task is valid (a missing file backlog is fine:
|
|
188
|
+
it is treated as empty on the first cycle; HTTP and Jira providers are
|
|
189
|
+
contacted read-only and must answer);
|
|
189
190
|
- the run lock state (`backlog.lock`); a held lock is a warning, since
|
|
190
191
|
`forgeo start`/`forgeo once` will refuse to run until it is released.
|
|
191
192
|
|
|
@@ -22,9 +22,13 @@ paths), so `forgeo restart` is still used for those.
|
|
|
22
22
|
| <span style="white-space: nowrap">`interval_minutes`</span> | `60` | How often Forgeo runs (≥ 1). |
|
|
23
23
|
| <span style="white-space: nowrap">`branch`</span> | `main` | The single branch everything is committed to. |
|
|
24
24
|
| <span style="white-space: nowrap">`remote`</span> | — | Remote to push to (e.g. `origin`); omit to only commit locally. |
|
|
25
|
-
| <span style="white-space: nowrap">`backlog`</span> | `backlog.json` | The task backlog: the path of a JSON file
|
|
26
|
-
| <span style="white-space: nowrap">`
|
|
27
|
-
| <span style="white-space: nowrap">`
|
|
25
|
+
| <span style="white-space: nowrap">`backlog`</span> | `backlog.json` | The task backlog: the path of a JSON file, an HTTP endpoint serving the same document, or a base URL for `jira`/`github`/`gitlab` providers. |
|
|
26
|
+
| <span style="white-space: nowrap">`backlog_provider`</span> | `auto` | `auto` infers file/HTTP from `backlog`, or `jira`/`github`/`gitlab` when the corresponding block is present; explicitly choose `file`, `http`, `jira`, `github`, or `gitlab`. |
|
|
27
|
+
| <span style="white-space: nowrap">`state_dir`</span> | — | Directory for Forgeo's runtime files (locks, run history, daemon state). Remote backlogs default this to the directory of `forgeo.yaml`. |
|
|
28
|
+
| <span style="white-space: nowrap">`backlog_auth`</span> | — | OAuth2 client credentials for a backlog URL that requires them (see [below](#backlog_auth)). Only for `http` provider. |
|
|
29
|
+
| <span style="white-space: nowrap">`jira`</span> | — | Jira REST, workflow, authentication, and custom-field settings. Required when `backlog_provider: jira`. |
|
|
30
|
+
| <span style="white-space: nowrap">`github`</span> | — | GitHub REST settings. Required when `backlog_provider: github`. |
|
|
31
|
+
| <span style="white-space: nowrap">`gitlab`</span> | — | GitLab REST settings. Required when `backlog_provider: gitlab`. |
|
|
28
32
|
| <span style="white-space: nowrap">`blocker_file`</span> | `BLOCKER.md` | Where `BLOCKER.md` is written. Keep it outside the repo so it is never committed. |
|
|
29
33
|
| <span style="white-space: nowrap">`agent_command`</span> | — | The coding agent: any shell command (string) or argv list. **Required.** |
|
|
30
34
|
| <span style="white-space: nowrap">`agent_timeout_seconds`</span> | — | Optional: kill the agent after this many seconds (`null` = never). |
|
|
@@ -67,6 +71,126 @@ refactor_prompt: >
|
|
|
67
71
|
behavior, run the test suite, and apply safe changes.
|
|
68
72
|
```
|
|
69
73
|
|
|
74
|
+
## Jira backlog
|
|
75
|
+
|
|
76
|
+
Forgeo can read and update Jira issues directly. Set `backlog_provider: jira`
|
|
77
|
+
and make `backlog` the Jira base URL. Jira issue keys become task ids. The JQL
|
|
78
|
+
should include every lifecycle state that should be visible to Forgeo; do not
|
|
79
|
+
filter it to only `To Do`, or completed and blocked issues will disappear from
|
|
80
|
+
the dashboard and dependency checks.
|
|
81
|
+
|
|
82
|
+
```yaml
|
|
83
|
+
backlog_provider: jira
|
|
84
|
+
backlog: https://jira.example.com
|
|
85
|
+
state_dir: .forgeo
|
|
86
|
+
|
|
87
|
+
jira:
|
|
88
|
+
jql: 'project = APP AND labels = forgeo'
|
|
89
|
+
project_key: APP # Needed for task creation from the web UI.
|
|
90
|
+
issue_type: Task
|
|
91
|
+
auth:
|
|
92
|
+
scheme: basic # Jira Cloud; use bearer for a Server/DC PAT.
|
|
93
|
+
username_env: JIRA_USER
|
|
94
|
+
token_env: JIRA_TOKEN
|
|
95
|
+
workflow:
|
|
96
|
+
open_statuses: ["10000", "10001"]
|
|
97
|
+
open_status: "10000"
|
|
98
|
+
running_status: "3"
|
|
99
|
+
completed_status: "10002"
|
|
100
|
+
blocked_status: null # Optional Jira workflow transition.
|
|
101
|
+
failed_status: null # Failed is represented by a Forgeo label.
|
|
102
|
+
fields:
|
|
103
|
+
acceptance_criteria: customfield_10042
|
|
104
|
+
dependencies: customfield_10043
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Status values may be names, but stable Jira status ids are preferred. Forgeo
|
|
108
|
+
adds `forgeo-running`, `forgeo-blocked`, and `forgeo-failed` labels as needed.
|
|
109
|
+
Engine-managed details (`blocker_reason`, failure details, retry counters and
|
|
110
|
+
the bounded agent response) are stored in a Jira issue property, whose key is
|
|
111
|
+
`forgeo` by default. A Jira workflow does not need a custom `FAILED` status.
|
|
112
|
+
|
|
113
|
+
Before starting the daemon, set the configured environment variables and run:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
export JIRA_USER='automation@example.com'
|
|
117
|
+
export JIRA_TOKEN='...'
|
|
118
|
+
forgeo validate
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Forgeo transitions an issue to `running_status` before invoking the agent and
|
|
122
|
+
releases stale claims after `claim_timeout_seconds` (one day by default). The
|
|
123
|
+
web console can create, edit, reopen, and delete Jira issues when the required
|
|
124
|
+
project and custom-field mappings are configured; Jira remains the source of
|
|
125
|
+
truth for human changes.
|
|
126
|
+
|
|
127
|
+
### Jira settings
|
|
128
|
+
|
|
129
|
+
| Key | Default | Meaning |
|
|
130
|
+
| --- | --- | --- |
|
|
131
|
+
| `jira.jql` | — | Required JQL scope. Include all lifecycle states that Forgeo must see. |
|
|
132
|
+
| `jira.auth` | — | Required credentials. Use `basic` with a username and API-token environment variable, or `bearer` with a token environment variable. |
|
|
133
|
+
| `jira.project_key` | — | Jira project key used when the web console creates issues. |
|
|
134
|
+
| `jira.issue_type` | `Task` | Jira issue type name used for creation. |
|
|
135
|
+
| `jira.api_version` | `3` | API version. v3 uses Jira Cloud's cursor-based `/search/jql`; v2 uses offset-based search. |
|
|
136
|
+
| `jira.page_size` | `50` | Issues requested per search page, from 1 to 100. |
|
|
137
|
+
| `jira.max_issues` | `1000` | Maximum issues read from one JQL search. |
|
|
138
|
+
| `jira.timeout_seconds` | `30` | Timeout for each Jira REST request. |
|
|
139
|
+
| `jira.claim_timeout_seconds` | `86400` | Age after which an abandoned running claim is released. |
|
|
140
|
+
| `jira.label_prefix` | `forgeo` | Prefix for the running, blocked, and failed labels. |
|
|
141
|
+
| `jira.property_key` | `forgeo` | Jira issue-property key holding Forgeo engine state. |
|
|
142
|
+
| `jira.workflow` | defaults | Status ids or names for open, running, blocked, completed, and failed transitions. |
|
|
143
|
+
| `jira.fields` | — | Optional custom-field ids for task attributes such as acceptance criteria and dependencies. |
|
|
144
|
+
|
|
145
|
+
### GitHub backlog
|
|
146
|
+
|
|
147
|
+
Forgeo can read and update GitHub issues directly. Set `backlog_provider: github` and make `backlog` the GitHub API base URL. Issue numbers become task ids. Labels and a hidden JSON block in the issue body hold Forgeo's engine state.
|
|
148
|
+
|
|
149
|
+
```yaml
|
|
150
|
+
backlog_provider: github
|
|
151
|
+
backlog: https://api.github.com
|
|
152
|
+
github:
|
|
153
|
+
repo: owner/repo
|
|
154
|
+
token_env: GITHUB_TOKEN
|
|
155
|
+
label_prefix: forgeo
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
| Key | Default | Meaning |
|
|
159
|
+
| --- | --- | --- |
|
|
160
|
+
| `github.repo` | — | Required owner/repo. |
|
|
161
|
+
| `github.auth` | — | Required PAT env var `token_env`. |
|
|
162
|
+
| `github.label_prefix` | `forgeo` | Prefix for running/blocked/failed labels. |
|
|
163
|
+
| `github.property_key` | `forgeo` | Marker key for hidden body block (symmetry). |
|
|
164
|
+
| `github.page_size` | `30` | Issues per page. |
|
|
165
|
+
| `github.max_issues` | `1000` | Max issues read. |
|
|
166
|
+
| `github.timeout_seconds` | `30` | HTTP timeout. |
|
|
167
|
+
| `github.claim_timeout_seconds` | `86400` | Stale claim timeout. |
|
|
168
|
+
| `github.workflow` | defaults | State/label mapping. |
|
|
169
|
+
| `github.fields` | — | Optional field mappings. |
|
|
170
|
+
|
|
171
|
+
### GitLab backlog
|
|
172
|
+
|
|
173
|
+
```yaml
|
|
174
|
+
backlog_provider: gitlab
|
|
175
|
+
backlog: https://gitlab.example.com
|
|
176
|
+
gitlab:
|
|
177
|
+
repo: group/project
|
|
178
|
+
token_env: GITLAB_TOKEN
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
| Key | Default | Meaning |
|
|
182
|
+
| --- | --- | --- |
|
|
183
|
+
| `gitlab.repo` | — | Required project path or numeric id. |
|
|
184
|
+
| `gitlab.auth` | — | Required PAT env var `token_env`. |
|
|
185
|
+
| `gitlab.label_prefix` | `forgeo` | Prefix for labels. |
|
|
186
|
+
| `gitlab.property_key` | `forgeo` | Marker key. |
|
|
187
|
+
| `gitlab.page_size` | `30` | Issues per page. |
|
|
188
|
+
| `gitlab.max_issues` | `1000` | Max issues. |
|
|
189
|
+
| `gitlab.timeout_seconds` | `30` | HTTP timeout. |
|
|
190
|
+
| `gitlab.claim_timeout_seconds` | `86400` | Stale claim timeout. |
|
|
191
|
+
| `gitlab.workflow` | defaults | State mapping. |
|
|
192
|
+
| `gitlab.fields` | — | Optional field mappings. |
|
|
193
|
+
|
|
70
194
|
## Key details
|
|
71
195
|
|
|
72
196
|
### `backlog_auth`
|
|
@@ -385,7 +509,7 @@ Each registered instance is fully independent: every instance owns its own
|
|
|
385
509
|
**backlog**, **logs** (`log_file`), **run history** (`runs.jsonl`), **locks**
|
|
386
510
|
(`backlog.lock` and the per-iteration `backlog.run`), and a
|
|
387
511
|
**`backlog.state.json`** with its live state. Those runtime files sit next to
|
|
388
|
-
the backlog file, or — when the backlog is
|
|
512
|
+
the backlog file, or — when the backlog is remote — in `state_dir`, which
|
|
389
513
|
defaults to the directory of that instance's `forgeo.yaml`. Because relative
|
|
390
514
|
paths resolve against each config file's own directory, two configs in
|
|
391
515
|
different directories can never share state.
|
|
@@ -82,7 +82,13 @@ the file configured as `backlog:` in your `forgeo.yaml` — by default
|
|
|
82
82
|
`.forgeo/backlog.json`. Once Forgeo is running you can also add tasks
|
|
83
83
|
from the [web console](web-console-api.md) — no file editing needed. (If your
|
|
84
84
|
tasks already live in another application, `backlog:` also accepts an
|
|
85
|
-
[HTTP endpoint](backlog.md#a-backlog-over-http)
|
|
85
|
+
[HTTP endpoint](backlog.md#a-backlog-over-http) or a [Jira source](backlog.md#a-jira-backlog)
|
|
86
|
+
instead of a file.)
|
|
87
|
+
|
|
88
|
+
For Jira, set `backlog_provider: jira`, point `backlog:` at the Jira base URL,
|
|
89
|
+
configure `jira.jql` and the workflow mappings, export the credentials named in
|
|
90
|
+
`jira.auth`, and run `forgeo validate` before starting the daemon. See [Jira
|
|
91
|
+
backlogs](backlog.md#a-jira-backlog) for the complete configuration.
|
|
86
92
|
|
|
87
93
|
```json
|
|
88
94
|
{
|
|
@@ -36,12 +36,12 @@ Forgeo is deliberately single-purpose:
|
|
|
36
36
|
## Where state lives
|
|
37
37
|
|
|
38
38
|
- `forgeo.yaml` — the config (see [Configuration](configuration.md)).
|
|
39
|
-
- `backlog.json` (configurable) — the task backlog, a file
|
|
40
|
-
|
|
39
|
+
- `backlog.json` (configurable) — the task backlog, a file, an HTTP endpoint,
|
|
40
|
+
or Jira (see [Backlog format](backlog.md)).
|
|
41
41
|
- `backlog.json.bak`, `backlog.json.bak.1`, ... — rotating snapshots of a
|
|
42
42
|
*file* backlog, written before every agent run and on daemon startup so a
|
|
43
43
|
bad write can always be rolled back (see [Backlog format](backlog.md)). A
|
|
44
|
-
|
|
44
|
+
remote backlog is owned by its provider and is never snapshotted locally.
|
|
45
45
|
- `BLOCKER.md` (configurable) — written when a human decision is needed; keep
|
|
46
46
|
it outside the repo so it is never committed.
|
|
47
47
|
- `forgeo.log` — rotating daemon log (5 MB × 3), also served over HTTP.
|
|
@@ -58,8 +58,8 @@ Forgeo is deliberately single-purpose:
|
|
|
58
58
|
token (`forgeo web --token`): when present, every `/api/*` route requires
|
|
59
59
|
`Authorization: Bearer <token>`; with no file the dashboard stays open.
|
|
60
60
|
|
|
61
|
-
The runtime files above sit next to the backlog file; with a backlog
|
|
62
|
-
go in `state_dir`, which defaults to the directory holding `forgeo.yaml`.
|
|
61
|
+
The runtime files above sit next to the backlog file; with a remote backlog
|
|
62
|
+
they go in `state_dir`, which defaults to the directory holding `forgeo.yaml`.
|
|
63
63
|
|
|
64
64
|
## Next steps
|
|
65
65
|
|
|
@@ -6,9 +6,9 @@ just schedules cycles and writes its live state to `daemon.state.json`. The
|
|
|
6
6
|
dashboard reads every registered instance's data straight from its files
|
|
7
7
|
(`backlog.json`, `runs.jsonl`, `forgeo.log`, `BLOCKER.md`,
|
|
8
8
|
`daemon.state.json`), so it works whether or not each instance's daemon is
|
|
9
|
-
running.
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
running. HTTP and Jira backlogs are fetched from their providers instead, and
|
|
10
|
+
a remote source that cannot be reached answers `502` rather than showing an
|
|
11
|
+
empty board.
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
14
|
forgeo web # default 0.0.0.0:8790, foreground
|
|
@@ -153,10 +153,9 @@ curl http://127.0.0.1:8790/api/instances
|
|
|
153
153
|
```
|
|
154
154
|
|
|
155
155
|
Each row also carries `backlog_error`: `null` normally, and the reason when
|
|
156
|
-
that instance's backlog could not be read
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
whole listing.
|
|
156
|
+
that instance's remote backlog could not be read. Its counts are zero in that
|
|
157
|
+
case — the row reports a backlog it could not reach, not an empty one. One
|
|
158
|
+
unreachable provider never fails the whole listing.
|
|
160
159
|
|
|
161
160
|
### `GET /api/instances/<name>/tasks`
|
|
162
161
|
|
|
@@ -189,8 +188,8 @@ curl http://127.0.0.1:8790/api/instances/my-repo/tasks
|
|
|
189
188
|
]
|
|
190
189
|
```
|
|
191
190
|
|
|
192
|
-
A backlog
|
|
193
|
-
|
|
191
|
+
A remote backlog is fetched on each request; when the provider is unreachable
|
|
192
|
+
the response is `502` with the reason in `error`.
|
|
194
193
|
|
|
195
194
|
### `GET /api/instances/<name>/tasks/{id}`
|
|
196
195
|
|