forgeo-cli 0.3.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.3.0/.github/workflows/ci.yml +116 -0
- forgeo_cli-0.3.0/.gitignore +33 -0
- forgeo_cli-0.3.0/CHANGELOG.md +114 -0
- forgeo_cli-0.3.0/CONTRIBUTING.md +120 -0
- forgeo_cli-0.3.0/LICENSE +21 -0
- forgeo_cli-0.3.0/PKG-INFO +146 -0
- forgeo_cli-0.3.0/README.md +92 -0
- forgeo_cli-0.3.0/config/nginx-forgeo.conf +40 -0
- forgeo_cli-0.3.0/docs/agent-contract.md +110 -0
- forgeo_cli-0.3.0/docs/backlog.md +113 -0
- forgeo_cli-0.3.0/docs/cli-reference.md +211 -0
- forgeo_cli-0.3.0/docs/configuration.md +195 -0
- forgeo_cli-0.3.0/docs/getting-started.md +154 -0
- forgeo_cli-0.3.0/docs/img/console.png +0 -0
- forgeo_cli-0.3.0/docs/img/logo.png +0 -0
- forgeo_cli-0.3.0/docs/img/title.svg +3 -0
- forgeo_cli-0.3.0/docs/index.md +102 -0
- forgeo_cli-0.3.0/docs/web-console-api.md +275 -0
- forgeo_cli-0.3.0/forgeo.spec +44 -0
- forgeo_cli-0.3.0/install.sh +139 -0
- forgeo_cli-0.3.0/mkdocs.yml +48 -0
- forgeo_cli-0.3.0/pyproject.toml +76 -0
- forgeo_cli-0.3.0/src/forgeo/__init__.py +10 -0
- forgeo_cli-0.3.0/src/forgeo/__main__.py +6 -0
- forgeo_cli-0.3.0/src/forgeo/agent.py +332 -0
- forgeo_cli-0.3.0/src/forgeo/backlog.py +206 -0
- forgeo_cli-0.3.0/src/forgeo/central.py +620 -0
- forgeo_cli-0.3.0/src/forgeo/cli.py +759 -0
- forgeo_cli-0.3.0/src/forgeo/config.py +36 -0
- forgeo_cli-0.3.0/src/forgeo/daemon.py +209 -0
- forgeo_cli-0.3.0/src/forgeo/forgeo.py +446 -0
- forgeo_cli-0.3.0/src/forgeo/git.py +100 -0
- forgeo_cli-0.3.0/src/forgeo/instances.py +187 -0
- forgeo_cli-0.3.0/src/forgeo/io.py +30 -0
- forgeo_cli-0.3.0/src/forgeo/models.py +252 -0
- forgeo_cli-0.3.0/src/forgeo/notify.py +77 -0
- forgeo_cli-0.3.0/src/forgeo/runs.py +73 -0
- forgeo_cli-0.3.0/src/forgeo/setup.py +185 -0
- forgeo_cli-0.3.0/src/forgeo/web/central/central.css +380 -0
- forgeo_cli-0.3.0/src/forgeo/web/central/central.js +780 -0
- forgeo_cli-0.3.0/src/forgeo/web/central/index.html +41 -0
- forgeo_cli-0.3.0/src/forgeo/web/central/instance.html +189 -0
- forgeo_cli-0.3.0/src/forgeo/web/style.css +656 -0
- forgeo_cli-0.3.0/src/forgeo/web_common.py +92 -0
- forgeo_cli-0.3.0/tests/conftest.py +122 -0
- forgeo_cli-0.3.0/tests/test_agent.py +344 -0
- forgeo_cli-0.3.0/tests/test_backlog.py +225 -0
- forgeo_cli-0.3.0/tests/test_cli.py +968 -0
- forgeo_cli-0.3.0/tests/test_daemon.py +162 -0
- forgeo_cli-0.3.0/tests/test_factory.py +316 -0
- forgeo_cli-0.3.0/tests/test_git.py +53 -0
- forgeo_cli-0.3.0/tests/test_install.py +332 -0
- forgeo_cli-0.3.0/tests/test_instances.py +256 -0
- forgeo_cli-0.3.0/tests/test_io.py +47 -0
- forgeo_cli-0.3.0/tests/test_models.py +127 -0
- forgeo_cli-0.3.0/tests/test_runs.py +216 -0
- forgeo_cli-0.3.0/tests/test_setup.py +165 -0
- forgeo_cli-0.3.0/tests/test_web.py +781 -0
- forgeo_cli-0.3.0/www/404.html +29 -0
- forgeo_cli-0.3.0/www/index.html +398 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
tags:
|
|
7
|
+
- "v*"
|
|
8
|
+
pull_request:
|
|
9
|
+
branches: [main]
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
strategy:
|
|
15
|
+
matrix:
|
|
16
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
- uses: actions/setup-python@v5
|
|
20
|
+
with:
|
|
21
|
+
python-version: ${{ matrix.python-version }}
|
|
22
|
+
- name: Install package
|
|
23
|
+
run: pip install -e ".[dev]"
|
|
24
|
+
- name: Lint with ruff
|
|
25
|
+
run: ruff check src tests
|
|
26
|
+
- name: Type check with mypy
|
|
27
|
+
run: python -m mypy src/forgeo
|
|
28
|
+
- name: Test with pytest
|
|
29
|
+
run: python -m pytest
|
|
30
|
+
|
|
31
|
+
build-binaries:
|
|
32
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
33
|
+
runs-on: ${{ matrix.os }}
|
|
34
|
+
strategy:
|
|
35
|
+
fail-fast: false
|
|
36
|
+
matrix:
|
|
37
|
+
include:
|
|
38
|
+
- os: ubuntu-latest
|
|
39
|
+
asset: forgeo-linux-amd64
|
|
40
|
+
binary: dist/forgeo
|
|
41
|
+
- os: macos-15-intel
|
|
42
|
+
asset: forgeo-darwin-amd64
|
|
43
|
+
binary: dist/forgeo
|
|
44
|
+
- os: macos-latest
|
|
45
|
+
asset: forgeo-darwin-arm64
|
|
46
|
+
binary: dist/forgeo
|
|
47
|
+
- os: windows-latest
|
|
48
|
+
asset: forgeo-windows-amd64.exe
|
|
49
|
+
binary: dist/forgeo.exe
|
|
50
|
+
permissions:
|
|
51
|
+
contents: read
|
|
52
|
+
steps:
|
|
53
|
+
- uses: actions/checkout@v4
|
|
54
|
+
- uses: actions/setup-python@v5
|
|
55
|
+
with:
|
|
56
|
+
python-version: "3.11"
|
|
57
|
+
- name: Install package and PyInstaller
|
|
58
|
+
run: python -m pip install --upgrade pip pyinstaller .
|
|
59
|
+
- name: Build standalone binary
|
|
60
|
+
run: pyinstaller forgeo.spec
|
|
61
|
+
- name: Rename binary to release asset name
|
|
62
|
+
shell: bash
|
|
63
|
+
run: |
|
|
64
|
+
mkdir -p release-assets
|
|
65
|
+
cp "${{ matrix.binary }}" "release-assets/${{ matrix.asset }}"
|
|
66
|
+
- name: Upload binary artifact
|
|
67
|
+
uses: actions/upload-artifact@v4
|
|
68
|
+
with:
|
|
69
|
+
name: ${{ matrix.asset }}
|
|
70
|
+
path: release-assets/${{ matrix.asset }}
|
|
71
|
+
if-no-files-found: error
|
|
72
|
+
|
|
73
|
+
release:
|
|
74
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
75
|
+
needs: build-binaries
|
|
76
|
+
runs-on: ubuntu-latest
|
|
77
|
+
permissions:
|
|
78
|
+
contents: write
|
|
79
|
+
steps:
|
|
80
|
+
- uses: actions/checkout@v4
|
|
81
|
+
- uses: actions/setup-python@v5
|
|
82
|
+
with:
|
|
83
|
+
python-version: "3.11"
|
|
84
|
+
- name: Install build
|
|
85
|
+
run: python -m pip install --upgrade build
|
|
86
|
+
- name: Build wheel and sdist
|
|
87
|
+
run: python -m build
|
|
88
|
+
- name: Download binary artifacts
|
|
89
|
+
uses: actions/download-artifact@v4
|
|
90
|
+
with:
|
|
91
|
+
path: binaries
|
|
92
|
+
merge-multiple: true
|
|
93
|
+
- name: Publish GitHub Release
|
|
94
|
+
uses: softprops/action-gh-release@v2
|
|
95
|
+
with:
|
|
96
|
+
files: |
|
|
97
|
+
dist/*.whl
|
|
98
|
+
dist/*.tar.gz
|
|
99
|
+
binaries/*
|
|
100
|
+
|
|
101
|
+
publish-pypi:
|
|
102
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
103
|
+
runs-on: ubuntu-latest
|
|
104
|
+
permissions:
|
|
105
|
+
id-token: write
|
|
106
|
+
steps:
|
|
107
|
+
- uses: actions/checkout@v4
|
|
108
|
+
- uses: actions/setup-python@v5
|
|
109
|
+
with:
|
|
110
|
+
python-version: "3.11"
|
|
111
|
+
- name: Build wheel and sdist
|
|
112
|
+
run: |
|
|
113
|
+
python -m pip install --upgrade build
|
|
114
|
+
python -m build
|
|
115
|
+
- name: Publish to PyPI
|
|
116
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
.venv/
|
|
6
|
+
venv/
|
|
7
|
+
|
|
8
|
+
# Forgeo runtime artifacts
|
|
9
|
+
.forgeo/
|
|
10
|
+
BLOCKER.md
|
|
11
|
+
forgeo.log
|
|
12
|
+
*.lock
|
|
13
|
+
forgeo.yaml
|
|
14
|
+
|
|
15
|
+
# Tooling
|
|
16
|
+
.pytest_cache/
|
|
17
|
+
.coverage
|
|
18
|
+
htmlcov/
|
|
19
|
+
.ruff_cache/
|
|
20
|
+
.idea/
|
|
21
|
+
|
|
22
|
+
# Docs build output
|
|
23
|
+
site/
|
|
24
|
+
|
|
25
|
+
# Build artifacts
|
|
26
|
+
build/
|
|
27
|
+
dist/
|
|
28
|
+
|
|
29
|
+
# AI assistant context
|
|
30
|
+
CONTEXT.md
|
|
31
|
+
|
|
32
|
+
# Local deploy script (server-specific paths)
|
|
33
|
+
scripts/deploy-docs.sh
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `forgeo web [--host HOST] [--port PORT]` — a standalone central dashboard
|
|
13
|
+
(default `0.0.0.0:8790`, foreground like `forgeo start`) that aggregates
|
|
14
|
+
every registered instance. It reads each instance's data straight from its
|
|
15
|
+
files (`backlog.json`, `runs.jsonl`, `forgeo.log`, `BLOCKER.md`), so it
|
|
16
|
+
works whether or not that instance's daemon is running. Home page at `/`,
|
|
17
|
+
per-instance pages at `/instances/<name>/` (kanban backlog plus logs,
|
|
18
|
+
runs, blocker and config tabs), and a per-instance API under
|
|
19
|
+
`/api/instances/<name>/`.
|
|
20
|
+
- Shared web-server helpers (`forgeo.web_common`) used by the central
|
|
21
|
+
dashboard.
|
|
22
|
+
- Task editing in the web console: the task detail modal gained an **Edit**
|
|
23
|
+
mode (Save/Cancel), backed by a new `PATCH
|
|
24
|
+
/api/instances/<name>/tasks/<id>` endpoint and `JSONBacklog.update_task`.
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- **The embedded per-daemon web server is gone.** `forgeo start` no longer
|
|
29
|
+
binds any port (`web_host`/`web_port` config keys are removed). The daemon
|
|
30
|
+
instead writes its live state (pid, started at, last outcome, next run) to
|
|
31
|
+
`daemon.state.json` next to the backlog after every cycle.
|
|
32
|
+
- The central dashboard (`forgeo web`) is now the **only** web interface:
|
|
33
|
+
it reads the daemon state files for accurate status, and it gained the
|
|
34
|
+
instance backlog's write endpoints, `POST
|
|
35
|
+
/api/instances/<name>/tasks` (with the web form on each instance page) and
|
|
36
|
+
`PATCH /api/instances/<name>/tasks/<id>`, so no feature was lost.
|
|
37
|
+
- `forgeo.web_common` docstring/API updated; `forgeo.server` module
|
|
38
|
+
removed.
|
|
39
|
+
|
|
40
|
+
## [0.2.1] - 2026-08-05
|
|
41
|
+
|
|
42
|
+
### Added
|
|
43
|
+
|
|
44
|
+
- `web_host` config option: the web dashboard/API bind address. Default
|
|
45
|
+
`127.0.0.1` (unchanged behavior); set `0.0.0.0` to reach it from other
|
|
46
|
+
hosts on the local network.
|
|
47
|
+
- `install.sh` now prefers a prebuilt standalone binary downloaded from the
|
|
48
|
+
matching GitHub Release for the host OS/arch — **no Python required**.
|
|
49
|
+
The pipx/pip fallback remains, used only when no prebuilt binary matches
|
|
50
|
+
the platform and a Python >= 3.11 is available.
|
|
51
|
+
- Tag-triggered CI builds single-file executables with PyInstaller on
|
|
52
|
+
Linux (amd64), macOS (amd64/arm64), and Windows (amd64) and attaches them
|
|
53
|
+
to the GitHub Release (`forgeo.spec`).
|
|
54
|
+
- Installer tests cover the binary-download path and the pipx/pip fallback
|
|
55
|
+
with stubs (no network).
|
|
56
|
+
|
|
57
|
+
## [0.2.0] - 2026-08-04
|
|
58
|
+
|
|
59
|
+
### Added
|
|
60
|
+
|
|
61
|
+
- `CHANGELOG.md` in Keep a Changelog format, with the `0.1.0` history
|
|
62
|
+
backfilled.
|
|
63
|
+
- Tag-triggered CI job that builds the wheel and sdist and attaches them to a
|
|
64
|
+
GitHub Release.
|
|
65
|
+
- Release steps documented in `CONTRIBUTING.md`.
|
|
66
|
+
- Web console frontend in `src/forgeo/web/`: a self-contained
|
|
67
|
+
HTML/CSS/JS dashboard (no framework, no build step, no external assets)
|
|
68
|
+
served at `/` showing the backlog grouped by status and daemon status,
|
|
69
|
+
auto-refreshing every 30 seconds.
|
|
70
|
+
- `install.sh` is now hosted on the project's own server and served from
|
|
71
|
+
<https://forgeo.org/install.sh>; README and docs use it in the one-liner.
|
|
72
|
+
|
|
73
|
+
## [0.1.0] - 2026-08-03
|
|
74
|
+
|
|
75
|
+
Initial release of the scheduled, agent-driven software forgeo.
|
|
76
|
+
|
|
77
|
+
### Added
|
|
78
|
+
|
|
79
|
+
- `forgeo start` persistent daemon: every `interval_minutes` it picks the
|
|
80
|
+
oldest `OPEN` task, runs it through the configured agent command, and commits
|
|
81
|
+
and pushes the result directly on `main`.
|
|
82
|
+
- Refactoring mode: when the backlog is empty, runs the agent with the
|
|
83
|
+
configured `refactor_prompt`.
|
|
84
|
+
- Blocker flow: an agent exiting with `blocked_exit_code` commits partial work,
|
|
85
|
+
writes `BLOCKER.md`, and pauses Forgeo until the task is reopened.
|
|
86
|
+
- Guided first-time setup: `forgeo init` wizard.
|
|
87
|
+
- `forgeo once` command to run a single cycle and exit.
|
|
88
|
+
- `forgeo status`, `forgeo stop`, and `forgeo restart` commands.
|
|
89
|
+
- `--auto` flag for the agent command for unattended runs.
|
|
90
|
+
- Local web dashboard and HTTP API served by the daemon.
|
|
91
|
+
- Durable run history recorded to `runs.jsonl` and exposed through the API.
|
|
92
|
+
- Telegram notification when a task is marked `BLOCKED`.
|
|
93
|
+
- Curl-to-bash one-liner installer (`install.sh`), pipx-first.
|
|
94
|
+
- MkDocs documentation website, published at <https://forgeo.org/>.
|
|
95
|
+
- GitHub Actions CI running `pytest`, `ruff`, and `mypy` on Python 3.11-3.13.
|
|
96
|
+
- Optional Docker sandbox for agent execution.
|
|
97
|
+
- Per-task `agent_command` override for cheap/expensive model routing.
|
|
98
|
+
- Project renamed to Forgeo, with MIT `LICENSE` and `CONTRIBUTING.md`.
|
|
99
|
+
|
|
100
|
+
### Changed
|
|
101
|
+
|
|
102
|
+
- Project slimmed down to a single-purpose scheduled worker; the interactive
|
|
103
|
+
backlog generator utility was removed.
|
|
104
|
+
- Duplicated commit/blocker handling unified between task and refactor runs.
|
|
105
|
+
- Agent stdout/stderr streamed into run logs instead of buffered.
|
|
106
|
+
- Corrupt backlog files preserved instead of silently discarded.
|
|
107
|
+
- Git command timeout made configurable; agent timeout made optional with
|
|
108
|
+
overlapping-run skipping.
|
|
109
|
+
- Dogfooding docs removed; local configs kept out of the repository.
|
|
110
|
+
|
|
111
|
+
[Unreleased]: https://github.com/lucaGazzola/forgeo/compare/v0.2.1...HEAD
|
|
112
|
+
[0.2.1]: https://github.com/lucaGazzola/forgeo/compare/v0.2.0...v0.2.1
|
|
113
|
+
[0.2.0]: https://github.com/lucaGazzola/forgeo/compare/v0.1.0...v0.2.0
|
|
114
|
+
[0.1.0]: https://github.com/lucaGazzola/forgeo/releases/tag/v0.1.0
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Contributing to Forgeo
|
|
2
|
+
|
|
3
|
+
Thanks for contributing! This project is an agent-driven software forgeo.
|
|
4
|
+
|
|
5
|
+
## Development setup
|
|
6
|
+
|
|
7
|
+
Requires Python 3.11+.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
python -m venv .venv && source .venv/bin/activate
|
|
11
|
+
pip install -e ".[dev]"
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
`.[dev]` installs the package plus the toolchain: `pytest`, `ruff`, and
|
|
15
|
+
`mypy`.
|
|
16
|
+
|
|
17
|
+
## Quality gates
|
|
18
|
+
|
|
19
|
+
Run all three before opening a PR. CI enforces the same gates.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pytest # the test suite (tests/)
|
|
23
|
+
ruff check # linting (src, tests)
|
|
24
|
+
mypy src/forgeo # type checking
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The full suite should pass and `ruff check` and `mypy src/forgeo` should be
|
|
28
|
+
clean.
|
|
29
|
+
|
|
30
|
+
## Writing a backlog task
|
|
31
|
+
|
|
32
|
+
Backlog tasks are how Forgeo receives work. Tasks are JSON objects
|
|
33
|
+
in the backlog file (see [docs/backlog.md](docs/backlog.md) for the full
|
|
34
|
+
schema). A good task has three things:
|
|
35
|
+
|
|
36
|
+
- **`id`** — a unique identifier, e.g. `TASK-001`. Duplicate ids are rejected.
|
|
37
|
+
- **`description`** — a self-contained specification handed to the agent. State
|
|
38
|
+
the current behavior, the desired behavior, and where the change lives. The
|
|
39
|
+
agent does not have your mental context, so spell it out.
|
|
40
|
+
- **`acceptance_criteria`** — a list of concrete, verifiable outcomes. The
|
|
41
|
+
forgeo renders these into the agent's `FORGEO_TASK` instruction, so write
|
|
42
|
+
them as checks the agent can confirm itself (e.g. "`pytest` passes", "the
|
|
43
|
+
`--help` output lists `once`").
|
|
44
|
+
|
|
45
|
+
Example:
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"id": "TASK-002",
|
|
50
|
+
"title": "Add `forgeo once` command to run a single cycle",
|
|
51
|
+
"description": "The CLI only offers `forgeo start` (the persistent daemon). Add a `once` subcommand that runs exactly one cycle and exits.",
|
|
52
|
+
"acceptance_criteria": [
|
|
53
|
+
"`forgeo once --config forgeo.yaml` runs one cycle and exits 0",
|
|
54
|
+
"`forgeo --help` lists `once`",
|
|
55
|
+
"Tests cover the new command"
|
|
56
|
+
],
|
|
57
|
+
"status": "OPEN",
|
|
58
|
+
"created_at": "2026-07-31T20:01:00Z"
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Keep the description scoped to one task, keep acceptance criteria minimal and
|
|
63
|
+
testable, and never commit the backlog file — it is gitignored.
|
|
64
|
+
|
|
65
|
+
## Pull-request process
|
|
66
|
+
|
|
67
|
+
Human contributions use the normal GitHub flow:
|
|
68
|
+
|
|
69
|
+
1. Create a feature branch off `main`: `git checkout -b feat/my-change`.
|
|
70
|
+
2. Make your change and commit it with a concise, descriptive message.
|
|
71
|
+
3. Run the [quality gates](#quality-gates) and fix any failures.
|
|
72
|
+
4. Push the branch and open a pull request against `main`.
|
|
73
|
+
5. CI runs `pytest`, `ruff check`, and `mypy src/forgeo` on the PR — it must
|
|
74
|
+
be green.
|
|
75
|
+
6. Address review feedback; keep the branch rebased on `main` if it drifts.
|
|
76
|
+
7. Once approved and green, merge. Follow-up work is welcome as a new PR or as
|
|
77
|
+
a backlog task for Forgeo.
|
|
78
|
+
|
|
79
|
+
## Releasing
|
|
80
|
+
|
|
81
|
+
Releases are cut from `main` and published as GitHub Releases. Tagging the
|
|
82
|
+
repo triggers CI, which builds the wheel, sdist, **and prebuilt standalone
|
|
83
|
+
binaries** and attaches them to the release — there is no PyPI publishing yet,
|
|
84
|
+
and `install.sh` downloads the matching prebuilt binary from the release
|
|
85
|
+
(`pipx`/`pip` fallback only when no binary matches the platform).
|
|
86
|
+
|
|
87
|
+
> Patch and minor releases **must** include the built binaries, otherwise the
|
|
88
|
+
> `install.sh` binary path (the default, no-Python install) breaks. The CI
|
|
89
|
+
> `build-binaries` job builds them automatically on any `v*` tag, but make
|
|
90
|
+
> sure the release actually carries them — the `forgeo-<os>-<arch>` assets
|
|
91
|
+
> listed below are what the installer downloads.
|
|
92
|
+
|
|
93
|
+
1. Confirm the [quality gates](#quality-gates) are green on `main`.
|
|
94
|
+
2. Bump the version in `pyproject.toml` (`version = "x.y.z"`) and in
|
|
95
|
+
`src/forgeo/__init__.py`, following
|
|
96
|
+
[Semantic Versioning](https://semver.org/).
|
|
97
|
+
3. Update the `VERSION=` at the top of `install.sh` to the new `x.y.z` so the
|
|
98
|
+
installer downloads the new release's binaries.
|
|
99
|
+
4. Update `CHANGELOG.md`: move the entries from `## [Unreleased]` under a new
|
|
100
|
+
`## [x.y.z] - <date>` section, add the compare links at the bottom, and
|
|
101
|
+
leave a fresh `## [Unreleased]` heading.
|
|
102
|
+
5. Commit the bump and changelog update, e.g. `git commit -m "Release x.y.z"`.
|
|
103
|
+
6. Tag and push the tag — the `build-binaries` and `release` jobs in
|
|
104
|
+
`.github/workflows/ci.yml` build the wheel, sdist, and PyInstaller binaries
|
|
105
|
+
for Linux (amd64), macOS (amd64/arm64), and Windows (amd64) and attach them
|
|
106
|
+
to a GitHub Release:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
git tag vx.y.z
|
|
110
|
+
git push origin vx.y.z
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
7. Confirm the release and its artifacts (wheel, sdist, and the
|
|
114
|
+
`forgeo-linux-amd64`, `forgeo-darwin-amd64`, `forgeo-darwin-arm64`,
|
|
115
|
+
`forgeo-windows-amd64.exe` binaries) are listed under
|
|
116
|
+
<https://github.com/lucaGazzola/forgeo/releases>.
|
|
117
|
+
|
|
118
|
+
## License
|
|
119
|
+
|
|
120
|
+
This project is MIT-licensed; see [LICENSE](LICENSE).
|
forgeo_cli-0.3.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Software Forgeo Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: forgeo-cli
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: A scheduled software forgeo: executes backlog tasks on main, refactors when idle, and writes BLOCKER.md when it needs human input.
|
|
5
|
+
Project-URL: Homepage, https://forgeo.org
|
|
6
|
+
Project-URL: Documentation, https://forgeo.org
|
|
7
|
+
Project-URL: Repository, https://github.com/lucaGazzola/forgeo
|
|
8
|
+
Project-URL: Issues, https://github.com/lucaGazzola/forgeo/issues
|
|
9
|
+
Author: Forgeo Contributors
|
|
10
|
+
License: MIT License
|
|
11
|
+
|
|
12
|
+
Copyright (c) 2026 Software Forgeo Contributors
|
|
13
|
+
|
|
14
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
15
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
16
|
+
in the Software without restriction, including without limitation the rights
|
|
17
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
18
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
19
|
+
furnished to do so, subject to the following conditions:
|
|
20
|
+
|
|
21
|
+
The above copyright notice and this permission notice shall be included in all
|
|
22
|
+
copies or substantial portions of the Software.
|
|
23
|
+
|
|
24
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
25
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
26
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
27
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
28
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
29
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
30
|
+
SOFTWARE.
|
|
31
|
+
License-File: LICENSE
|
|
32
|
+
Keywords: agents,ai,automation,backlog,orchestration,scheduler
|
|
33
|
+
Classifier: Development Status :: 3 - Alpha
|
|
34
|
+
Classifier: Intended Audience :: Developers
|
|
35
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
36
|
+
Classifier: Programming Language :: Python :: 3
|
|
37
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
38
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
39
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
40
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
41
|
+
Requires-Python: >=3.11
|
|
42
|
+
Requires-Dist: pydantic>=2.5
|
|
43
|
+
Requires-Dist: pyyaml>=6.0
|
|
44
|
+
Requires-Dist: rich>=13.7
|
|
45
|
+
Provides-Extra: dev
|
|
46
|
+
Requires-Dist: mypy>=1.8; extra == 'dev'
|
|
47
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
48
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
49
|
+
Requires-Dist: ruff>=0.5; extra == 'dev'
|
|
50
|
+
Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
|
|
51
|
+
Provides-Extra: docs
|
|
52
|
+
Requires-Dist: mkdocs-material>=9.5; extra == 'docs'
|
|
53
|
+
Description-Content-Type: text/markdown
|
|
54
|
+
|
|
55
|
+
<div align="center">
|
|
56
|
+
<img src="docs/img/logo.png" alt="Forgeo logo" width="128">
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<div align="center">
|
|
60
|
+
<img src="docs/img/title.svg" alt="Forgeo" width="128">
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
[](https://github.com/lucaGazzola/forgeo/actions/workflows/ci.yml)
|
|
65
|
+
[](https://opensource.org/licenses/MIT)
|
|
66
|
+
|
|
67
|
+
**Forgeo is an autonomous software forgeo for people with ideas, not teams.**
|
|
68
|
+
You have a product idea — an app, a website, an internal automation — but no
|
|
69
|
+
developers on staff. With Forgeo you don't need any: you write down what needs
|
|
70
|
+
to be built as a simple list of tasks, and an AI coding agent works through the
|
|
71
|
+
list on its own, writing the code and committing it to your repository. No
|
|
72
|
+
branches, no pull requests, no developer to hire.
|
|
73
|
+
|
|
74
|
+
All you need is basic comfort with a terminal, a git repository, and any coding
|
|
75
|
+
agent CLI — Claude Code, aider, opencode, or your own script. Forgeo works with
|
|
76
|
+
all of them.
|
|
77
|
+
|
|
78
|
+
Forgeo decides what to do next on its own: while tasks are left it implements
|
|
79
|
+
the oldest one and commits the result, and when the backlog is empty it reviews
|
|
80
|
+
the codebase and cleans it up. It only interrupts you when a decision is
|
|
81
|
+
genuinely yours to make — everything else happens autonomously.
|
|
82
|
+
|
|
83
|
+
## Quickstart
|
|
84
|
+
|
|
85
|
+
Requires a git repository (no Python needed — the one-liner downloads a
|
|
86
|
+
prebuilt binary for your OS, or `pipx install forgeo-cli` works too). The full
|
|
87
|
+
walkthrough is in [Getting started](docs/getting-started.md).
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# 1. Install
|
|
91
|
+
curl -fsSL https://forgeo.org/install.sh | bash
|
|
92
|
+
|
|
93
|
+
# 2. Create your Forgeo (guided wizard, run from your project root)
|
|
94
|
+
forgeo init
|
|
95
|
+
|
|
96
|
+
# 3. Start Forgeo
|
|
97
|
+
forgeo start # run forever: every interval_minutes, implement the oldest OPEN task
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
`forgeo init` writes `forgeo.yaml` and a `.forgeo/` folder for the backlog
|
|
101
|
+
and logs, gitignored for you. Fill the backlog with plain JSON tasks (see
|
|
102
|
+
[Backlog format](docs/backlog.md)) — or add them from the web console while
|
|
103
|
+
it runs — and Forgeo does the rest. The daemon binds no ports; open the
|
|
104
|
+
dashboard with `forgeo web` (default <http://0.0.0.0:8790>):
|
|
105
|
+
|
|
106
|
+

|
|
107
|
+
|
|
108
|
+
One-off commands: `forgeo once` (single cycle), `forgeo status` (summary),
|
|
109
|
+
`forgeo stop`, `forgeo restart` — every command is in the
|
|
110
|
+
[CLI reference](docs/cli-reference.md).
|
|
111
|
+
|
|
112
|
+
You can run several factories at once, one per repository — each config is
|
|
113
|
+
fully independent (own backlog, logs, locks). Register each `forgeo.yaml`
|
|
114
|
+
in the instance registry with `forgeo instance add NAME --config PATH`,
|
|
115
|
+
manage any of them by name with `forgeo start/status/stop --name NAME`,
|
|
116
|
+
list them all with `forgeo list`, and get one aggregate overview with the
|
|
117
|
+
central dashboard, `forgeo web`.
|
|
118
|
+
|
|
119
|
+
## Documentation
|
|
120
|
+
|
|
121
|
+
| Topic | Where |
|
|
122
|
+
| --- | --- |
|
|
123
|
+
| Install, init, first cycle | [Getting started](docs/getting-started.md) |
|
|
124
|
+
| Every `forgeo.yaml` key | [Configuration](docs/configuration.md) |
|
|
125
|
+
| Task schema and statuses | [Backlog format](docs/backlog.md) |
|
|
126
|
+
| How the agent is invoked (env, exit codes, timeouts) | [Agent contract](docs/agent-contract.md) |
|
|
127
|
+
| All CLI commands | [CLI reference](docs/cli-reference.md) |
|
|
128
|
+
| Web dashboard & HTTP API | [Web console & HTTP API](docs/web-console-api.md) |
|
|
129
|
+
|
|
130
|
+
Everything is stored in plain files: the backlog, `forgeo.log`, and
|
|
131
|
+
`BLOCKER.md` whenever a decision is pending.
|
|
132
|
+
|
|
133
|
+
## Develop
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
pip install -e ".[dev]"
|
|
137
|
+
pytest
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for the development setup, quality
|
|
141
|
+
gates (`pytest`, `ruff check`, `mypy src/forgeo`), and the pull-request
|
|
142
|
+
process.
|
|
143
|
+
|
|
144
|
+
## License
|
|
145
|
+
|
|
146
|
+
MIT — see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img src="docs/img/logo.png" alt="Forgeo logo" width="128">
|
|
3
|
+
</div>
|
|
4
|
+
|
|
5
|
+
<div align="center">
|
|
6
|
+
<img src="docs/img/title.svg" alt="Forgeo" width="128">
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
[](https://github.com/lucaGazzola/forgeo/actions/workflows/ci.yml)
|
|
11
|
+
[](https://opensource.org/licenses/MIT)
|
|
12
|
+
|
|
13
|
+
**Forgeo is an autonomous software forgeo for people with ideas, not teams.**
|
|
14
|
+
You have a product idea — an app, a website, an internal automation — but no
|
|
15
|
+
developers on staff. With Forgeo you don't need any: you write down what needs
|
|
16
|
+
to be built as a simple list of tasks, and an AI coding agent works through the
|
|
17
|
+
list on its own, writing the code and committing it to your repository. No
|
|
18
|
+
branches, no pull requests, no developer to hire.
|
|
19
|
+
|
|
20
|
+
All you need is basic comfort with a terminal, a git repository, and any coding
|
|
21
|
+
agent CLI — Claude Code, aider, opencode, or your own script. Forgeo works with
|
|
22
|
+
all of them.
|
|
23
|
+
|
|
24
|
+
Forgeo decides what to do next on its own: while tasks are left it implements
|
|
25
|
+
the oldest one and commits the result, and when the backlog is empty it reviews
|
|
26
|
+
the codebase and cleans it up. It only interrupts you when a decision is
|
|
27
|
+
genuinely yours to make — everything else happens autonomously.
|
|
28
|
+
|
|
29
|
+
## Quickstart
|
|
30
|
+
|
|
31
|
+
Requires a git repository (no Python needed — the one-liner downloads a
|
|
32
|
+
prebuilt binary for your OS, or `pipx install forgeo-cli` works too). The full
|
|
33
|
+
walkthrough is in [Getting started](docs/getting-started.md).
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# 1. Install
|
|
37
|
+
curl -fsSL https://forgeo.org/install.sh | bash
|
|
38
|
+
|
|
39
|
+
# 2. Create your Forgeo (guided wizard, run from your project root)
|
|
40
|
+
forgeo init
|
|
41
|
+
|
|
42
|
+
# 3. Start Forgeo
|
|
43
|
+
forgeo start # run forever: every interval_minutes, implement the oldest OPEN task
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
`forgeo init` writes `forgeo.yaml` and a `.forgeo/` folder for the backlog
|
|
47
|
+
and logs, gitignored for you. Fill the backlog with plain JSON tasks (see
|
|
48
|
+
[Backlog format](docs/backlog.md)) — or add them from the web console while
|
|
49
|
+
it runs — and Forgeo does the rest. The daemon binds no ports; open the
|
|
50
|
+
dashboard with `forgeo web` (default <http://0.0.0.0:8790>):
|
|
51
|
+
|
|
52
|
+

|
|
53
|
+
|
|
54
|
+
One-off commands: `forgeo once` (single cycle), `forgeo status` (summary),
|
|
55
|
+
`forgeo stop`, `forgeo restart` — every command is in the
|
|
56
|
+
[CLI reference](docs/cli-reference.md).
|
|
57
|
+
|
|
58
|
+
You can run several factories at once, one per repository — each config is
|
|
59
|
+
fully independent (own backlog, logs, locks). Register each `forgeo.yaml`
|
|
60
|
+
in the instance registry with `forgeo instance add NAME --config PATH`,
|
|
61
|
+
manage any of them by name with `forgeo start/status/stop --name NAME`,
|
|
62
|
+
list them all with `forgeo list`, and get one aggregate overview with the
|
|
63
|
+
central dashboard, `forgeo web`.
|
|
64
|
+
|
|
65
|
+
## Documentation
|
|
66
|
+
|
|
67
|
+
| Topic | Where |
|
|
68
|
+
| --- | --- |
|
|
69
|
+
| Install, init, first cycle | [Getting started](docs/getting-started.md) |
|
|
70
|
+
| Every `forgeo.yaml` key | [Configuration](docs/configuration.md) |
|
|
71
|
+
| Task schema and statuses | [Backlog format](docs/backlog.md) |
|
|
72
|
+
| How the agent is invoked (env, exit codes, timeouts) | [Agent contract](docs/agent-contract.md) |
|
|
73
|
+
| All CLI commands | [CLI reference](docs/cli-reference.md) |
|
|
74
|
+
| Web dashboard & HTTP API | [Web console & HTTP API](docs/web-console-api.md) |
|
|
75
|
+
|
|
76
|
+
Everything is stored in plain files: the backlog, `forgeo.log`, and
|
|
77
|
+
`BLOCKER.md` whenever a decision is pending.
|
|
78
|
+
|
|
79
|
+
## Develop
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
pip install -e ".[dev]"
|
|
83
|
+
pytest
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for the development setup, quality
|
|
87
|
+
gates (`pytest`, `ruff check`, `mypy src/forgeo`), and the pull-request
|
|
88
|
+
process.
|
|
89
|
+
|
|
90
|
+
## License
|
|
91
|
+
|
|
92
|
+
MIT — see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Serves the Forgeo website (/var/www/forgeo) for the public domain
|
|
2
|
+
# forgeo.org: the landing page at the root, the MkDocs documentation
|
|
3
|
+
# under /docs/. TLS is terminated by Nginx Proxy Manager (running on the
|
|
4
|
+
# owner's LAN) which fronts this server; this nginx serves plain HTTP
|
|
5
|
+
# on port 8080 so NPM can proxy to it as the backend.
|
|
6
|
+
server {
|
|
7
|
+
listen 8080;
|
|
8
|
+
listen [::]:8080;
|
|
9
|
+
|
|
10
|
+
server_name _;
|
|
11
|
+
|
|
12
|
+
root /var/www/forgeo;
|
|
13
|
+
index index.html;
|
|
14
|
+
|
|
15
|
+
error_page 404 /404.html;
|
|
16
|
+
|
|
17
|
+
location / {
|
|
18
|
+
try_files $uri $uri/ /404.html;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
# install.sh is served as plain text; it is a .sh file with no
|
|
22
|
+
# default nginx mime type, so it would otherwise go out as
|
|
23
|
+
# application/octet-stream.
|
|
24
|
+
location = /install.sh {
|
|
25
|
+
default_type text/plain;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
# Hashed assets of the landing page and the MkDocs theme are
|
|
29
|
+
# immutable; static images (console.png, logo) are long-lived too.
|
|
30
|
+
location ~ ^/(assets|docs/assets)/ {
|
|
31
|
+
try_files $uri =404;
|
|
32
|
+
expires 7d;
|
|
33
|
+
add_header Cache-Control "public";
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
location /img/ {
|
|
37
|
+
expires 7d;
|
|
38
|
+
add_header Cache-Control "public";
|
|
39
|
+
}
|
|
40
|
+
}
|