# devarea Workspace management repo for TTG: use it to clone the whole workspace in its category-folder structure, and to verify that the clone list is in sync with the Gitea server (`git.teletypegames.org`). ## Quick start On a fresh machine: ```sh mkdir TTG && cd TTG git clone ssh://git@git.teletypegames.org:2222/tools/devarea cd devarea make setup # install tea + clone all repos + check ``` Repos are cloned into the parent directory of the devarea checkout (the workspace root). To use a different target: `make clone ROOT=/path/to/workspace`. ## Make targets | Target | What it does | |---|---| | `make help` | List available targets (default) | | `make tea` | Install tea (Gitea CLI) via Homebrew if missing, and verify the login | | `make clone` | Clone all repos based on `scripts/repos.list`; existing ones are skipped | | `make check` | Compare the clone list against the server (`tea repo list --output json`) | | `make setup` | All three in one: tea + clone + check | ## Scripts All scripts live under `scripts/` and can also be run standalone: - **`install-tea.sh`** — installs tea and verifies the login. Without a login it prints the setup command (`tea login add --name ttg --url https://git.teletypegames.org`). - **`clone-repos.sh [target-dir]`** — clones every line of `repos.list` into the given structure. Idempotent: existing clones are skipped. - **`check-repos.sh`** — checks in both directions: repos that exist on the server but are missing from the list (**MISSING**), and repos listed as Gitea repos but absent from the server (**STALE**). Exits with 1 on any hit, so it is CI-friendly. It pages through the server list: Gitea caps a page at 50 items whatever `--limit` asks for, and before this was fixed (2026-08-18, at 51 repos) the check quietly compared against the first 50 and reported a real repo as STALE. ## Data files - **`scripts/repos.list`** — the repos to clone, one per line in `|` form. New repo on the server → add it here (`make check` will complain if it is missing). Non-Gitea repos (GitHub) may also appear; the check skips those. - **`scripts/repos.ignore`** — repos that exist on the server but are intentionally not cloned (`/`); the check does not report these as missing. ## Workspace structure Every folder is a Gitea org, one to one — that is the rule since 2026-08-16, and it is why a repo's path in `repos.list` is simply `/`: ``` TTG/ ├── devarea/ # this repo — has to sit here, clone-repos.sh clones into its parent ├── bbs/ # BBS servers and showcases ├── build/ # CI toolchains and builder images (*-tools) ├── demos/ # one per engine: shows a platform, not a product ├── engines/ # own engines and libraries other repos depend on ├── games/ # catalog products ├── infra/ # the server environment itself (nginx, backups) ├── services/ # what runs on our server (public site, wiki, bots) ├── stores/ # store engines and the stores built on them ├── tools/ # what one person installs and runs for themselves ├── media/ # reference images and documents — not git repos └── memory/ # working agreements the assistants read (not a git repo) ``` Two exceptions to the one-to-one rule: `devarea` itself, which stays at the workspace root because `clone-repos.sh` clones into its parent directory, and `media/` + `memory/`, which are not repos at all. `repos.ignore` lists the server-side repos that are deliberately not cloned. The org taxonomy — what each org is for, and why a repo belongs to one rather than another — is in [REPO_REFACT.md](REPO_REFACT.md). ## Estate documentation These describe the estate as a whole, which is why they live here rather than in any single repo: - **[WIKI_CONNECTION.md](WIKI_CONNECTION.md)** — which repo is documented by which wiki page, and which Gitea org each repo belongs to. - **[REPO_REFACT.md](REPO_REFACT.md)** — the Gitea org structure: what each org is for and what it contains. - **[ECOSYSTEM_PLAN.md](ECOSYSTEM_PLAN.md)** — what we have per org towards a complete game development lifecycle, and what is still missing. - **[MORE_STORES.md](MORE_STORES.md)** — which further host platforms could get a store like the Batocera one, measured against what the catalog actually ships. The `ttg-ops` plugin in `ttg-marketplace` reads these rather than carrying its own copy of the rules.