# AGENTS.md — Timmy Tower World Development conventions and workflows for agents and contributors. ## One-time setup ```bash make install ``` This activates git hooks that run `typecheck` and `lint` before every commit and push. ## Quality checks ```bash pnpm run typecheck # TypeScript type-checking (tsc --build across all packages) pnpm run lint # ESLint across all TypeScript source files make check # Run both in sequence (same as CI) ``` ## Pushing to Gitea All pushes go through the bore tunnel helper script (see replit.md for full docs): ```bash bash scripts/push-to-gitea.sh [PORT] ``` - First call after bore starts: pass the port once — it's saved for the session - Subsequent calls: no argument needed, reads from `.bore-port` - Bore port changes every restart — pass the new port to update Set `GITEA_TOKEN` or write the token to `.gitea-credentials` (gitignored). Never commit credentials. ## Branch and PR conventions - **Never push directly to `main`** — Gitea enforces branch protection - Every change lives on a feature branch: `feat/`, `fix/`, `chore/` - Open a PR on Gitea and squash-merge after review - CI runs `pnpm typecheck && pnpm lint` on every PR automatically ## Testing Executor agents should follow this three-step workflow when implementing or verifying any change: **1. Fetch the test plan before starting** ```bash curl /api/testkit/plan ``` Returns `TIMMY_TEST_PLAN.md` — full architecture notes, route descriptions, and expected behaviour for all 24 tests. Read this first so you understand what each endpoint is supposed to do before touching the code. **2. Run the full test suite after implementing** ```bash curl -s /api/testkit | bash ``` The server returns a self-contained bash script with the base URL already baked in. Requirements: `curl`, `bash`, `jq` — nothing else. All 24 tests must pass (FAIL=0) before submitting. **3. Fill in and submit the report** ```bash curl /api/testkit/report ``` Returns just the report template section ready to copy and fill in. Attach the completed report to your PR or task output. Where `` is the running server URL, e.g. `http://localhost:8080` locally or the Replit dev URL in CI. ## Stub mode The API server starts without Lightning or AI credentials: - **LNbits stub**: invoices are simulated in-memory. Mark paid via `POST /api/dev/stub/pay/:hash` - **AI stub**: Anthropic credentials absent → canned AI responses. Set `AI_INTEGRATIONS_ANTHROPIC_API_KEY` for real AI ## Workspace structure ``` artifacts/api-server/ — Express 5 API server (@workspace/api-server) lib/db/ — Drizzle ORM schema + PostgreSQL client (@workspace/db) lib/api-spec/ — OpenAPI spec + Orval codegen lib/api-zod/ — Generated Zod schemas (do not edit by hand) lib/api-client-react/ — Generated React Query hooks (do not edit by hand) scripts/ — Utility scripts (@workspace/scripts) ``` ## Running the API server ```bash pnpm --filter @workspace/api-server run dev ``` ## Gitea repos | Repo | Purpose | |---|---| | `replit/token-gated-economy` | This repo — TypeScript API | | `perplexity/the-matrix` | Three.js 3D world frontend |