Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5d330c2ff4 |
@@ -1,75 +0,0 @@
|
|||||||
---
|
|
||||||
name: gitea
|
|
||||||
description: Use for every forge operation in this repo — read, create, comment on, label, close, or search an issue; create, review, merge, or check out a PR; and whenever `gh`, `issue://`, or `pr://` fails or a ticket number is ambiguous. This repo's forge is self-hosted Gitea driven by `tea`, not GitHub.
|
|
||||||
---
|
|
||||||
|
|
||||||
# Gitea, not GitHub
|
|
||||||
|
|
||||||
`origin` is the self-hosted Gitea instance `gitea.violetcrown.my.id`, repo
|
|
||||||
`sulthan/mangaBookmark`. Everything past plain git goes through
|
|
||||||
[`tea`](https://gitea.com/gitea/tea) (0.14.2 on this machine).
|
|
||||||
|
|
||||||
**`gh` is not installed**, so the harness's `issue://<n>` and `pr://<n>` URIs
|
|
||||||
error out (`GitHub CLI (gh) is not installed`, measured 2026-08-17). There is no
|
|
||||||
fallback to add — read tickets with `tea`.
|
|
||||||
|
|
||||||
`tea` infers the repo from `origin`; auth lives in `tea login`, never a
|
|
||||||
`GH_TOKEN`. Your Gitea username comes from `tea login list` — `tea` has no `@me`.
|
|
||||||
|
|
||||||
Flags are the environment's job: run `tea <command> --help` rather than trusting
|
|
||||||
a remembered flag. This file carries only what `--help` will not tell you.
|
|
||||||
|
|
||||||
## Commands
|
|
||||||
|
|
||||||
| Job | Command |
|
|
||||||
|---|---|
|
|
||||||
| Read | `tea issue <n> --comments` / `tea pr <n> --comments` — `--comments` is not optional |
|
|
||||||
| List | `tea issue list --state open\|closed\|all -o json --fields index,title,body,labels,state,author` |
|
|
||||||
| Search | `tea issue list -k "<keyword>" -L "<label>" -A "<author>"` (`-K all` also searches PRs) |
|
|
||||||
| Create | `tea issue create -t "..." -d "..."` (`-L`, `-a` optional) |
|
|
||||||
| Comment | `tea comment <n> "..."` |
|
|
||||||
| Label | `tea issue edit <n> --add-labels "..."` / `--remove-labels "..."` |
|
|
||||||
| Close | `tea issue close <n>` / `tea pr close <n>` |
|
|
||||||
| PR | `tea pr create --head <branch> --base main -t "..." -d "..."`, `tea pr checkout <n>`, `tea pr review <n>`, `tea pr merge <n>` |
|
|
||||||
|
|
||||||
## Traps
|
|
||||||
|
|
||||||
- **A bare read is a truncated read.** Without `--comments`, `tea issue <n>` and
|
|
||||||
`tea pr <n>` print the opening body and drop every comment silently — no
|
|
||||||
prompt, no marker, no hint that more exists (measured 2026-08-17: issue #123
|
|
||||||
prints 40 lines bare, 132 with `--comments`). The comments are where the
|
|
||||||
decisions live and the body is usually the stalest part of the ticket, so
|
|
||||||
**every read that exists to understand an issue or PR passes `--comments`**,
|
|
||||||
and understanding means body plus all comments plus whatever ticket they point
|
|
||||||
at. Comment count is `tea issue list --fields index,comments`, so a read that
|
|
||||||
shows fewer than that is incomplete. A PR's review comments are a second
|
|
||||||
stream: `tea pr review-comments <n>`.
|
|
||||||
- **One index space for issues and PRs.** A bare `#42` may be either: try
|
|
||||||
`tea pr 42`, fall back to `tea issue 42`. Say which one you found.
|
|
||||||
- **Output is rendered boxes**, not plain text. Anything you parse needs
|
|
||||||
`-o json`, plus `--fields` to keep the payload small. `tea pr create` prints
|
|
||||||
the PR URL on its last line.
|
|
||||||
- **`close` takes no `--comment`.** Comment with `tea comment <n>`, then close.
|
|
||||||
- **Gitea will not auto-create a label.** `tea labels list` first; missing one
|
|
||||||
gets `tea labels create --name "..." --color "#rrggbb"` before the `edit`.
|
|
||||||
- **Multi-line bodies go through a heredoc**, never inline escapes:
|
|
||||||
```bash
|
|
||||||
tea issue create -t "Title" -d "$(cat <<'EOF'
|
|
||||||
body line one
|
|
||||||
|
|
||||||
- acceptance criterion
|
|
||||||
EOF
|
|
||||||
)"
|
|
||||||
```
|
|
||||||
- **No sub-issue and no dependency command.** Gitea's API has issue
|
|
||||||
dependencies, `tea` does not expose them, so parentage and blocking live as
|
|
||||||
body lines — the shapes are in `docs/agents/issue-tracker.md`.
|
|
||||||
|
|
||||||
## Conventions this repo layers on top
|
|
||||||
|
|
||||||
Ticket bodies, wayfinding issues, and the PR-as-request-surface flag:
|
|
||||||
`docs/agents/issue-tracker.md`. Triage label strings: `docs/agents/triage-labels.md`.
|
|
||||||
A label named there still has to exist in the tracker before `--add-labels`.
|
|
||||||
|
|
||||||
Finish a forge action by stating the number you touched and its state after —
|
|
||||||
"commented and closed #71" — so the write is checkable without a second query.
|
|
||||||
@@ -11,7 +11,7 @@ to the tracker. You do not write the implementation — every line of ticket cod
|
|||||||
is written by a `ticket-implementer` subagent in its own git worktree. Reach for
|
is written by a `ticket-implementer` subagent in its own git worktree. Reach for
|
||||||
the editor yourself only for a merge conflict resolution.
|
the editor yourself only for a merge conflict resolution.
|
||||||
|
|
||||||
Ticket source and tracker conventions: `docs/agents/issue-tracker.md`. `tea` usage: skill `gitea`.
|
Ticket source and `tea` usage: `docs/agents/issue-tracker.md`.
|
||||||
|
|
||||||
## 1. Collect the tickets
|
## 1. Collect the tickets
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,14 @@ Smoke test: `curl` endpoints with `Authorization: Bearer <token>`; confirm `OPTI
|
|||||||
|
|
||||||
## Forge: Gitea, not GitHub
|
## Forge: Gitea, not GitHub
|
||||||
|
|
||||||
`origin` is self-hosted Gitea (`gitea.violetcrown.my.id`, repo `sulthan/mangaBookmark`), so **`gh` don't work here and the `issue://`/`pr://` URIs error out — drive the forge with `tea`.** How to run it — commands, traps, JSON output: skill `gitea`. Tracker conventions (ticket bodies, wayfinding, PR-as-request-surface flag): `docs/agents/issue-tracker.md`. Triage label strings: `docs/agents/triage-labels.md`.
|
`origin` is self-hosted Gitea instance (`gitea.violetcrown.my.id`, repo `sulthan/mangaBookmark`), so **`gh` don't work here — use `tea` (Gitea CLI) for anything past plain git.** `tea` infers the repo from `origin`; auth lives in `tea login`, not a `GH_TOKEN` env var. It prints rendered boxes rather than plain text, so pass `-o json` when parsing; a PR URL lands on the last line.
|
||||||
|
|
||||||
|
- PRs: `tea pr create --head <branch> --base main --title "..." --description "..."`, `tea pr list`, `tea pr <n>`, `tea pr checkout <n>`.
|
||||||
|
- Issues: `tea issue create --title "..." --description "..."` (`--labels`, `--assignees` optional), `tea issue <n> --comments`, `tea issue list --state open|closed|all -o json`, `tea issue close <n>`.
|
||||||
|
- Comments: `tea comment <n> "..."` — `tea issue close` takes no `--comment` flag.
|
||||||
|
- Labels: `tea issue edit <n> --add-labels "..."` / `--remove-labels "..."`. Gitea will **not** auto-create a label, so `tea labels create --name "..." --color "#rrggbb"` first.
|
||||||
|
- Triage vocabulary is `needs-triage`, `needs-info`, `ready-for-agent`, `ready-for-human`, `wontfix`.
|
||||||
|
- Gitea shares one index space across issues and PRs, so a bare `#42` may be either — try `tea pr 42`, fall back to `tea issue 42`.
|
||||||
|
|
||||||
## Design system
|
## Design system
|
||||||
|
|
||||||
|
|||||||
+3
-37
@@ -43,13 +43,6 @@ Readers: Progress, Favourite, Lifecycle bucket. Facts about the Series itself be
|
|||||||
to the Series, not here.
|
to the Series, not here.
|
||||||
_Avoid_: entry, item, record, subscription
|
_Avoid_: entry, item, record, subscription
|
||||||
|
|
||||||
**Orphan Series**:
|
|
||||||
A Series no Reader bookmarks. Removing a Bookmark never removes the Series, so the row
|
|
||||||
outlives every relationship to it: nothing reads it, no Poll visits it, and it still owns
|
|
||||||
a Cover. A state of the Series, not a Lifecycle bucket — it says how many Readers hold it,
|
|
||||||
never anything about a Reader.
|
|
||||||
_Avoid_: dangling, unused, dead series, stale
|
|
||||||
|
|
||||||
**Library**:
|
**Library**:
|
||||||
One of the two halves of the collection — manga or novel — selected by a Bookmark's
|
One of the two halves of the collection — manga or novel — selected by a Bookmark's
|
||||||
`kind`. The web UI and the userscripts each address exactly one Library at a time.
|
`kind`. The web UI and the userscripts each address exactly one Library at a time.
|
||||||
@@ -83,33 +76,6 @@ asked. Every Site has exactly one and no Lane can slow, block or borrow from ano
|
|||||||
a Reader never has one and never influences one.
|
a Reader never has one and never influences one.
|
||||||
_Avoid_: worker, queue, scheduler, batch, wave
|
_Avoid_: worker, queue, scheduler, batch, wave
|
||||||
|
|
||||||
**Lane Pass**:
|
|
||||||
One sweep of a Poll Lane over the Series due on its Site: what it found waiting, how many it
|
|
||||||
read, and whether it declined to work at all. A fact about the Lane rather than about any
|
|
||||||
Series — a pass that read nothing is still a pass, and one that declined carries the reason it
|
|
||||||
declined, since a Lane resting and a Lane stuck look identical from a count alone. Its record
|
|
||||||
outlives the process that made it: "the poller has done nothing for six hours" is only
|
|
||||||
answerable by something written down.
|
|
||||||
_Avoid_: run, cycle, tick, batch, poll history
|
|
||||||
|
|
||||||
**Forced Poll**:
|
|
||||||
A Poll the owner asks for by hand instead of waiting for the Series's turn. It jumps its
|
|
||||||
Lane's queue and ignores every waiting rule — the rest between Polls, a Sighting standing
|
|
||||||
in for a check, a Series only finished Readers hold — but never overrules a Site that is
|
|
||||||
refusing us, the Lane's spacing between fetches, or a Series with no page to fetch. Asked
|
|
||||||
for by marking the Series, never by commanding the poller, so it happens on the Lane's
|
|
||||||
next pass rather than at the moment of asking.
|
|
||||||
It also takes whatever Cover the Site publishes today: asking for one is asking to accept the
|
|
||||||
page as it now stands, so it is the only read after Acquisition that can replace a Cover.
|
|
||||||
_Avoid_: manual poll, refresh, retry, force refresh
|
|
||||||
|
|
||||||
**Paused Lane**:
|
|
||||||
A Poll Lane the owner has stopped for a bounded time. It makes no Polls until the pause
|
|
||||||
expires, so its Series stay due and unstamped exactly as they do when a Site cannot be
|
|
||||||
reached. Every pause carries an expiry — a Lane cannot be stopped indefinitely — and it
|
|
||||||
outlives a restart, being a fact about the Site rather than about the running process.
|
|
||||||
_Avoid_: disabled, off, stopped, suspended, kill switch (that is the deploy-time switch)
|
|
||||||
|
|
||||||
**Sighting**:
|
**Sighting**:
|
||||||
What a Reader's browser happened to see of a Series's Latest Chapter while that Reader
|
What a Reader's browser happened to see of a Series's Latest Chapter while that Reader
|
||||||
was on the page. It reports the same fact as a Poll but carries none of its authority:
|
was on the page. It reports the same fact as a Poll but carries none of its authority:
|
||||||
@@ -122,9 +88,9 @@ _Avoid_: client report, user poll, observation, claim
|
|||||||
The single read of a Series page made the moment the Series first exists, giving it
|
The single read of a Series page made the moment the Series first exists, giving it
|
||||||
both its Latest Chapter and its Cover without waiting for the Lane's pace. Distinct
|
both its Latest Chapter and its Cover without waiting for the Lane's pace. Distinct
|
||||||
from a Poll in the two ways that matter: a Reader is present — it is triggered by
|
from a Poll in the two ways that matter: a Reader is present — it is triggered by
|
||||||
their first Bookmark of that Series — and it establishes a Cover rather than refreshing
|
their first Bookmark of that Series — and it is the only read that establishes a
|
||||||
facts, which no Poll does unless the owner forces one. It happens once in a Series's
|
Cover rather than refreshing facts. It happens once in a Series's life; every later
|
||||||
life; every later read of the same page is a Poll.
|
read of the same page is a Poll.
|
||||||
_Avoid_: initial poll, first fetch, prefetch, warm-up
|
_Avoid_: initial poll, first fetch, prefetch, warm-up
|
||||||
|
|
||||||
**New Chapter**:
|
**New Chapter**:
|
||||||
|
|||||||
Reference in New Issue
Block a user