forgeo-cli 0.8.0__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.8.0 → forgeo_cli-0.9.0}/CHANGELOG.md +31 -1
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/PKG-INFO +14 -8
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/README.md +13 -7
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/docs/backlog.md +91 -7
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/docs/configuration.md +54 -3
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/install.sh +1 -1
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/pyproject.toml +1 -1
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/__init__.py +1 -1
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/backlog.py +148 -178
- 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.8.0 → 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.8.0 → forgeo_cli-0.9.0}/src/forgeo/backlog_jira.py +34 -151
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/forgeo.py +1 -1
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/models.py +220 -5
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/validate.py +28 -27
- 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.8.0 → forgeo_cli-0.9.0}/.github/workflows/ci.yml +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/.gitignore +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/CONTRIBUTING.md +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/LICENSE +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/config/nginx-forgeo.conf +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/docs/agent-contract.md +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/docs/cli-reference.md +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/docs/getting-started.md +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/docs/img/console.png +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/docs/img/demo.gif +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/docs/img/logo.png +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/docs/img/og.png +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/docs/img/title.svg +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/docs/index.md +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/docs/web-console-api.md +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/forgeo.spec +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/mkdocs.yml +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/scripts/__init__.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/scripts/render_homebrew_formula.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/__main__.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/agent.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/central.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/cli.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/config.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/daemon.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/daemon_control.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/git.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/instances.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/io.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/notify.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/oauth.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/paths.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/runs.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/setup.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/update.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/web/central/central.css +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/web/central/central.js +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/web/central/index.html +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/web/central/instance.html +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/web/central/login.html +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/web/style.css +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/src/forgeo/web_common.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/conftest.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_agent.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_backlog.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_backlog_http.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_backlog_jira.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_cli.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_daemon.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_factory.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_git.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_install.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_instances.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_io.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_models.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_oauth.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_paths.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_remote_backlog_cycle.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_render_homebrew.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_runs.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_setup.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_update.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_web.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_web_common.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/tests/test_web_lock.py +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/www/404.html +0 -0
- {forgeo_cli-0.8.0 → forgeo_cli-0.9.0}/www/index.html +0 -0
|
@@ -7,6 +7,35 @@ 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
|
+
|
|
10
39
|
## [0.8.0] - 2026-08-21
|
|
11
40
|
|
|
12
41
|
### Added
|
|
@@ -360,7 +389,8 @@ Initial release of the scheduled, agent-driven software forgeo.
|
|
|
360
389
|
overlapping-run skipping.
|
|
361
390
|
- Dogfooding docs removed; local configs kept out of the repository.
|
|
362
391
|
|
|
363
|
-
[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
|
|
364
394
|
[0.8.0]: https://github.com/lucaGazzola/forgeo/compare/v0.7.3...v0.8.0
|
|
365
395
|
[0.7.3]: https://github.com/lucaGazzola/forgeo/compare/v0.7.2...v0.7.3
|
|
366
396
|
[0.7.2]: https://github.com/lucaGazzola/forgeo/compare/v0.7.1...v0.7.2
|
|
@@ -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,8 +121,8 @@ 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` and set `backlog` to
|
|
125
|
-
# (see the
|
|
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
126
|
|
|
127
127
|
# Or: add tasks from the web console once your forgeo is registered
|
|
128
128
|
# (first `forgeo start` registers it automatically):
|
|
@@ -211,11 +211,17 @@ and get one aggregate overview with the central dashboard, `forgeo web`.
|
|
|
211
211
|
| Web dashboard & HTTP API | [Web console & HTTP API](docs/web-console-api.md) |
|
|
212
212
|
|
|
213
213
|
Everything is stored in plain files: the local backlog, `forgeo.log`, and
|
|
214
|
-
`BLOCKER.md` whenever a decision is pending.
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
[
|
|
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
|
|
219
225
|
`backlog.json.bak` files) before every agent run and on daemon startup, and
|
|
220
226
|
restored automatically if it is ever found corrupt — a bad write never loses
|
|
221
227
|
your tasks.
|
|
@@ -67,8 +67,8 @@ 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` and set `backlog` to
|
|
71
|
-
# (see the
|
|
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
72
|
|
|
73
73
|
# Or: add tasks from the web console once your forgeo is registered
|
|
74
74
|
# (first `forgeo start` registers it automatically):
|
|
@@ -157,11 +157,17 @@ and get one aggregate overview with the central dashboard, `forgeo web`.
|
|
|
157
157
|
| Web dashboard & HTTP API | [Web console & HTTP API](docs/web-console-api.md) |
|
|
158
158
|
|
|
159
159
|
Everything is stored in plain files: the local backlog, `forgeo.log`, and
|
|
160
|
-
`BLOCKER.md` whenever a decision is pending.
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
[
|
|
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
|
|
165
171
|
`backlog.json.bak` files) before every agent run and on daemon startup, and
|
|
166
172
|
restored automatically if it is ever found corrupt — a bad write never loses
|
|
167
173
|
your tasks.
|
|
@@ -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
|
{
|
|
@@ -424,3 +436,75 @@ If a process dies while holding a claim, a later cycle releases claims older
|
|
|
424
436
|
than `claim_timeout_seconds` and returns them to the configured open status.
|
|
425
437
|
An unavailable Jira endpoint fails the cycle; it is never treated as an empty
|
|
426
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.
|
|
@@ -22,11 +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, an HTTP endpoint serving the same document, or a
|
|
26
|
-
| <span style="white-space: nowrap">`backlog_provider`</span> | `auto` | `auto` infers file/HTTP from `backlog`, or
|
|
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
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)). |
|
|
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
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`. |
|
|
30
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. |
|
|
31
33
|
| <span style="white-space: nowrap">`agent_command`</span> | — | The coding agent: any shell command (string) or argv list. **Required.** |
|
|
32
34
|
| <span style="white-space: nowrap">`agent_timeout_seconds`</span> | — | Optional: kill the agent after this many seconds (`null` = never). |
|
|
@@ -140,6 +142,55 @@ truth for human changes.
|
|
|
140
142
|
| `jira.workflow` | defaults | Status ids or names for open, running, blocked, completed, and failed transitions. |
|
|
141
143
|
| `jira.fields` | — | Optional custom-field ids for task attributes such as acceptance criteria and dependencies. |
|
|
142
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
|
+
|
|
143
194
|
## Key details
|
|
144
195
|
|
|
145
196
|
### `backlog_auth`
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "forgeo-cli"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.9.0"
|
|
8
8
|
description = "A scheduled software forgeo: executes backlog tasks on main, refactors when idle, and writes BLOCKER.md when it needs human input."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|