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.
Files changed (60) hide show
  1. forgeo_cli-0.3.0/.github/workflows/ci.yml +116 -0
  2. forgeo_cli-0.3.0/.gitignore +33 -0
  3. forgeo_cli-0.3.0/CHANGELOG.md +114 -0
  4. forgeo_cli-0.3.0/CONTRIBUTING.md +120 -0
  5. forgeo_cli-0.3.0/LICENSE +21 -0
  6. forgeo_cli-0.3.0/PKG-INFO +146 -0
  7. forgeo_cli-0.3.0/README.md +92 -0
  8. forgeo_cli-0.3.0/config/nginx-forgeo.conf +40 -0
  9. forgeo_cli-0.3.0/docs/agent-contract.md +110 -0
  10. forgeo_cli-0.3.0/docs/backlog.md +113 -0
  11. forgeo_cli-0.3.0/docs/cli-reference.md +211 -0
  12. forgeo_cli-0.3.0/docs/configuration.md +195 -0
  13. forgeo_cli-0.3.0/docs/getting-started.md +154 -0
  14. forgeo_cli-0.3.0/docs/img/console.png +0 -0
  15. forgeo_cli-0.3.0/docs/img/logo.png +0 -0
  16. forgeo_cli-0.3.0/docs/img/title.svg +3 -0
  17. forgeo_cli-0.3.0/docs/index.md +102 -0
  18. forgeo_cli-0.3.0/docs/web-console-api.md +275 -0
  19. forgeo_cli-0.3.0/forgeo.spec +44 -0
  20. forgeo_cli-0.3.0/install.sh +139 -0
  21. forgeo_cli-0.3.0/mkdocs.yml +48 -0
  22. forgeo_cli-0.3.0/pyproject.toml +76 -0
  23. forgeo_cli-0.3.0/src/forgeo/__init__.py +10 -0
  24. forgeo_cli-0.3.0/src/forgeo/__main__.py +6 -0
  25. forgeo_cli-0.3.0/src/forgeo/agent.py +332 -0
  26. forgeo_cli-0.3.0/src/forgeo/backlog.py +206 -0
  27. forgeo_cli-0.3.0/src/forgeo/central.py +620 -0
  28. forgeo_cli-0.3.0/src/forgeo/cli.py +759 -0
  29. forgeo_cli-0.3.0/src/forgeo/config.py +36 -0
  30. forgeo_cli-0.3.0/src/forgeo/daemon.py +209 -0
  31. forgeo_cli-0.3.0/src/forgeo/forgeo.py +446 -0
  32. forgeo_cli-0.3.0/src/forgeo/git.py +100 -0
  33. forgeo_cli-0.3.0/src/forgeo/instances.py +187 -0
  34. forgeo_cli-0.3.0/src/forgeo/io.py +30 -0
  35. forgeo_cli-0.3.0/src/forgeo/models.py +252 -0
  36. forgeo_cli-0.3.0/src/forgeo/notify.py +77 -0
  37. forgeo_cli-0.3.0/src/forgeo/runs.py +73 -0
  38. forgeo_cli-0.3.0/src/forgeo/setup.py +185 -0
  39. forgeo_cli-0.3.0/src/forgeo/web/central/central.css +380 -0
  40. forgeo_cli-0.3.0/src/forgeo/web/central/central.js +780 -0
  41. forgeo_cli-0.3.0/src/forgeo/web/central/index.html +41 -0
  42. forgeo_cli-0.3.0/src/forgeo/web/central/instance.html +189 -0
  43. forgeo_cli-0.3.0/src/forgeo/web/style.css +656 -0
  44. forgeo_cli-0.3.0/src/forgeo/web_common.py +92 -0
  45. forgeo_cli-0.3.0/tests/conftest.py +122 -0
  46. forgeo_cli-0.3.0/tests/test_agent.py +344 -0
  47. forgeo_cli-0.3.0/tests/test_backlog.py +225 -0
  48. forgeo_cli-0.3.0/tests/test_cli.py +968 -0
  49. forgeo_cli-0.3.0/tests/test_daemon.py +162 -0
  50. forgeo_cli-0.3.0/tests/test_factory.py +316 -0
  51. forgeo_cli-0.3.0/tests/test_git.py +53 -0
  52. forgeo_cli-0.3.0/tests/test_install.py +332 -0
  53. forgeo_cli-0.3.0/tests/test_instances.py +256 -0
  54. forgeo_cli-0.3.0/tests/test_io.py +47 -0
  55. forgeo_cli-0.3.0/tests/test_models.py +127 -0
  56. forgeo_cli-0.3.0/tests/test_runs.py +216 -0
  57. forgeo_cli-0.3.0/tests/test_setup.py +165 -0
  58. forgeo_cli-0.3.0/tests/test_web.py +781 -0
  59. forgeo_cli-0.3.0/www/404.html +29 -0
  60. 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).
@@ -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
+ [![CI](https://github.com/lucaGazzola/forgeo/actions/workflows/ci.yml/badge.svg)](https://github.com/lucaGazzola/forgeo/actions/workflows/ci.yml)
65
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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
+ ![Forgeo web console](docs/img/console.png)
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
+ [![CI](https://github.com/lucaGazzola/forgeo/actions/workflows/ci.yml/badge.svg)](https://github.com/lucaGazzola/forgeo/actions/workflows/ci.yml)
11
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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
+ ![Forgeo web console](docs/img/console.png)
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
+ }