Files
settled-reach/.claude/rules/tea-cli.md
T
jpmschweitzerandClaude Opus 5 338644b409 refactor(tooling): T-1286 — generate, pr and dev become reach domains
Twelve scripts retired, three domains registered. `reach` now covers nine.

generate: `generate-brands` and `generate-corporations` were the second and
third copies of the same 24-line build-if-missing-then-exec bash `tooling/atlas`
carried, so they collapsed into `core.process.cargo_binary` rather than being
ported. `import_economics` shelled out to the first of those, so it now calls
that helper — `generated_brands.toml` comes back byte-identical, and the stamp
registry swaps the retired wrapper for `core/process.py`.

pr: `watchlist-diff` derives its watched set from `generator_sources.py` instead
of restating it, so it cannot drift from the stamp check.

dev: the environment scripts split decision from performing, per D-263's
guarded-exec rule. `godot_plan()` and `worktree_plan()` decide what would
happen; `install_godot()`, `install_rust()` and `setup_worktree()` do it.
`tooling/test_environment.py` pins the version pin, both override precedences,
the already-current skip, the platform refusal and both worktree refusals —
none of them performed. `make setup` now installs reach first, since the
targets that install rust and godot are reach verbs.

Two live bugs found while porting:

- The clerk read its decision index from `decisions/README.md`, a path that
  stopped existing when the DQR tree moved to `governance/`. Every clerk agent
  has been grepping blind; its prompt pointed at the same dead directory.
- The conformance exec-check matched any `x.system()` regardless of receiver,
  so `platform.system()` read as `os.system()`. Narrowed and re-proved against
  a real mutant.

`process.run` gains `input=`, `timeout=` and a `ProcessTimeout` subclass so a
killed run stays distinguishable from a verdict. The pre-push hook no longer
merges the clerk's stderr into its stdout — under streaming the last merged
line is a JSONL event, which would read as an unrecognised verdict and block.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 17:00:46 +02:00

3.0 KiB

Gitea Access (tea CLI)

Never access the Gitea API directly — use the tea CLI with all required flags to bypass interactive mode.

Always pass --login schweitz --repo jpmschweitzer/settled-reach --output simple to avoid TTY prompts.

# List open PRs
tea pr list --login schweitz --repo jpmschweitzer/settled-reach --state open --output simple

# View a PR with comments
tea pr --login schweitz --repo jpmschweitzer/settled-reach --comments -o simple <PR_NUMBER>

# Post a comment on a PR (or issue) — use @filepath for long comments
reach pr comment <NUMBER> @/tmp/review.md
reach pr comment <NUMBER> "short inline comment"

# Approve a PR
tea pr approve --login schweitz --repo jpmschweitzer/settled-reach <PR_NUMBER>

# List issues
tea issue list --login schweitz --repo jpmschweitzer/settled-reach --state open --output simple

Key rules

  • All flags must be explicit — omitting --login or --repo triggers interactive prompts that crash in Claude Code (no TTY). One exception: tea pr create must OMIT --repo — see Pull requests below.
  • Use --output simple for machine-readable output (no table borders)
  • For comments, use reach pr comment <number> @/tmp/file.md for long comments (write to file first, then pass @filepath). Short inline strings also work: reach pr comment <number> "body". The @filepath form avoids $() subshells which break permission matching.
  • tea pr reject does not work on your own PRs — use tea comment instead
  • Run tea from the main checkout, never a linked worktree — its go-git can't read a worktree's .git file and errors with "local/remote repository required". tea pr close/comment take explicit --login/--repo so cwd barely matters for them, but tea pr create resolves the repo from the local checkout's remote (see below) — that is why it must run from the main repo.
  • Never delete protected branches: main, maintenance, server, client, copy, audio, visual, ci are protected on Gitea. Do not use tea pr clean, git push --delete, or git branch -D on these branches.

Pull requests

Use tea (Gitea CLI), not gh (GitHub CLI). The remote is Gitea at https://git.schweitz.net (the .internal vhost was retired in the 2026-07 proxy migration; AdGuard hairpins the .net name to the LAN).

tea pr create is the one command that must omit --repo: an explicit --repo <slug> makes tea skip local-repo setup, but pr create unconditionally needs the local repo handle (it checks whether the head branch is pushed) and dies with local repository required — the flag causes the failure it suggests fixing. Run it from the main checkout and let tea infer the repo from origin's URL. (This inference is also why the login's ssh_host in ~/.config/tea/config.yml must match the remote host — currently git.schweitz.net.)

tea pr create \
  --login schweitz \
  --title "feat(scope): short description" \
  --description "PR body here" \
  --base main \
  --head branch-name