{"owner":"openstatusHQ","repo":"openstatus","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["CLAUDE.md","AGENTS.md"],"skills":{"CLAUDE.md":"# CLAUDE.md\n\nRead `AGENTS.md` in this directory — it holds the conventions for this repo, and\nthe nested `AGENTS.md` files it links carry the package-specific ones.\n","AGENTS.md":"# AGENTS.md\n\nCross-cutting truth for openstatus. Package-scoped rules live in the nested\n`AGENTS.md` files listed at the bottom. Setup and how-to-run belong in READMEs —\nthis file never restates them.\n\n## Verify your change\n\n```sh\npnpm verify        # oxfmt + oxlint + doc refs + deno check. No database, seconds.\npnpm verify:test   # tests for packages affected by your diff. Needs a database.\n```\n\n`pnpm verify` must be green before you hand work back — it is what CI's `Check`\njob runs. For `verify:test`, start the local libSQL and seed it first; the steps\nare in `apps/dashboard/README.md`.\n\n## Toolchain\n\n`devbox.json` pins exact node, deno, bun, turso-cli and sqld versions; the CI\nworkflows pin the same node and deno. Never float one back to `@latest` or\n`v2.x` — `deno check` results differ by deno version, so a drifting pin makes\n`pnpm verify` disagree with CI for reasons unrelated to your change.\n\n## Architecture\n\n- **`packages/services`** owns every workspace-scoped mutation. tRPC routers,\n  Hono routes, MCP tools and jobs are thin adapters over it. Inline DB access in\n  a router is a defect — see `packages/services/AGENTS.md`.\n- **Turso (libSQL) holds application data**, through Drizzle in `packages/db`.\n  **Tinybird holds monitoring time-series**, through `packages/tinybird`. The two\n  are linked by id only: no cross-store transaction, no join across the boundary,\n  no referential integrity.\n- **Go is confined to the probing tier** (`apps/checker`, `apps/private-location`).\n  Product logic stays in TypeScript. Anything duplicated across that boundary —\n  assertion evaluation, region codes — must be changed on both sides in one PR.\n- **Shared UI comes from `@openstatus/ui`.** Do not fork a primitive into an app.\n\n## Tests\n\n- CI gives every DB-touching package its own database (the matrix in\n  `.github/workflows/test.yml`). Locally there is one shared libSQL, which is\n  why `verify:test` runs the affected packages one at a time. Cross-package\n  failures that vanish on a re-run of the single package are that sharing, not\n  your change — confirm with `turbo run test --filter=@openstatus/services`.\n- Suites mint their own workspace via `createTestWorkspace`\n  (`packages/db/src/test/factories.ts`). Never load a shared seeded workspace,\n  and never wipe a table globally — scope every cleanup to your own workspace id.\n- The `external_service` suites are not workspace-scoped; an aborted run leaves\n  rows that fail the *next* local run on a foreign key. Reseed to recover.\n- The `test` turbo task is deliberately uncached — results depend on database\n  state that is not in the input hash. Do not \"fix\" it.\n\n## Comment discipline\n\nDefault to no comments. Code and identifiers already say *what*. Write a comment\nonly when the *why* is not visible: a non-obvious invariant, a workaround for a\nspecific bug, a constraint imposed from outside the file, a `// safe because …`\nabove an unavoidable cast.\n\n- 1 short line where possible, 3 lines max. Never multi-paragraph JSDoc.\n- Strip: restatements of the code, the name of the caller, history (\"added for\n  X\"), PR or task context. That belongs in the commit message.\n- JSDoc on an exported symbol is fine when the signature alone is ambiguous —\n  one sentence, not a tutorial.\n\n## Type cast discipline\n\n`as unknown as X`, `as never` and `as any` are sometimes unavoidable at\nboundaries with external SDKs or at registry-style dispatch. When you need one:\n\n- **Centralize it in a named helper** whose name states the intent\n  (`asUIMessages`, `renderToolDraft`). Do not scatter the same cast.\n- **Comment the runtime guarantee** above the helper, so a future reader can\n  check whether it still holds.\n- A scattered `as never` is usually a missing helper.\n\n## Package context\n\n- `packages/services/AGENTS.md` — service verbs, audit log, scope enforcement\n- `packages/ui/AGENTS.md` — stock shadcn vs. the published blocks registry\n- `apps/dashboard/AGENTS.md` — Next.js runtimes, client boundary, UI verification\n- `apps/server/AGENTS.md` — Hono API, API-key scopes\n- `apps/status-page/AGENTS.md` — public surfaces and gated content\n- `apps/workflows/AGENTS.md` — Deno runtime constraints\n- `apps/checker/AGENTS.md` — Go probing tier\n- `apps/web/AGENTS.md` — marketing site, `.well-known`, search, content pages\n\n`docs/adr/` is frozen background on *why* some of these decisions were made. It\nis history, not current state; this file and its nested siblings are current\nstate. Do not add new ADRs.\n"},"files":{"CLAUDE.md":"# CLAUDE.md\n\nRead `AGENTS.md` in this directory — it holds the conventions for this repo, and\nthe nested `AGENTS.md` files it links carry the package-specific ones.\n","AGENTS.md":"# AGENTS.md\n\nCross-cutting truth for openstatus. Package-scoped rules live in the nested\n`AGENTS.md` files listed at the bottom. Setup and how-to-run belong in READMEs —\nthis file never restates them.\n\n## Verify your change\n\n```sh\npnpm verify        # oxfmt + oxlint + doc refs + deno check. No database, seconds.\npnpm verify:test   # tests for packages affected by your diff. Needs a database.\n```\n\n`pnpm verify` must be green before you hand work back — it is what CI's `Check`\njob runs. For `verify:test`, start the local libSQL and seed it first; the steps\nare in `apps/dashboard/README.md`.\n\n## Toolchain\n\n`devbox.json` pins exact node, deno, bun, turso-cli and sqld versions; the CI\nworkflows pin the same node and deno. Never float one back to `@latest` or\n`v2.x` — `deno check` results differ by deno version, so a drifting pin makes\n`pnpm verify` disagree with CI for reasons unrelated to your change.\n\n## Architecture\n\n- **`packages/services`** owns every workspace-scoped mutation. tRPC routers,\n  Hono routes, MCP tools and jobs are thin adapters over it. Inline DB access in\n  a router is a defect — see `packages/services/AGENTS.md`.\n- **Turso (libSQL) holds application data**, through Drizzle in `packages/db`.\n  **Tinybird holds monitoring time-series**, through `packages/tinybird`. The two\n  are linked by id only: no cross-store transaction, no join across the boundary,\n  no referential integrity.\n- **Go is confined to the probing tier** (`apps/checker`, `apps/private-location`).\n  Product logic stays in TypeScript. Anything duplicated across that boundary —\n  assertion evaluation, region codes — must be changed on both sides in one PR.\n- **Shared UI comes from `@openstatus/ui`.** Do not fork a primitive into an app.\n\n## Tests\n\n- CI gives every DB-touching package its own database (the matrix in\n  `.github/workflows/test.yml`). Locally there is one shared libSQL, which is\n  why `verify:test` runs the affected packages one at a time. Cross-package\n  failures that vanish on a re-run of the single package are that sharing, not\n  your change — confirm with `turbo run test --filter=@openstatus/services`.\n- Suites mint their own workspace via `createTestWorkspace`\n  (`packages/db/src/test/factories.ts`). Never load a shared seeded workspace,\n  and never wipe a table globally — scope every cleanup to your own workspace id.\n- The `external_service` suites are not workspace-scoped; an aborted run leaves\n  rows that fail the *next* local run on a foreign key. Reseed to recover.\n- The `test` turbo task is deliberately uncached — results depend on database\n  state that is not in the input hash. Do not \"fix\" it.\n\n## Comment discipline\n\nDefault to no comments. Code and identifiers already say *what*. Write a comment\nonly when the *why* is not visible: a non-obvious invariant, a workaround for a\nspecific bug, a constraint imposed from outside the file, a `// safe because …`\nabove an unavoidable cast.\n\n- 1 short line where possible, 3 lines max. Never multi-paragraph JSDoc.\n- Strip: restatements of the code, the name of the caller, history (\"added for\n  X\"), PR or task context. That belongs in the commit message.\n- JSDoc on an exported symbol is fine when the signature alone is ambiguous —\n  one sentence, not a tutorial.\n\n## Type cast discipline\n\n`as unknown as X`, `as never` and `as any` are sometimes unavoidable at\nboundaries with external SDKs or at registry-style dispatch. When you need one:\n\n- **Centralize it in a named helper** whose name states the intent\n  (`asUIMessages`, `renderToolDraft`). Do not scatter the same cast.\n- **Comment the runtime guarantee** above the helper, so a future reader can\n  check whether it still holds.\n- A scattered `as never` is usually a missing helper.\n\n## Package context\n\n- `packages/services/AGENTS.md` — service verbs, audit log, scope enforcement\n- `packages/ui/AGENTS.md` — stock shadcn vs. the published blocks registry\n- `apps/dashboard/AGENTS.md` — Next.js runtimes, client boundary, UI verification\n- `apps/server/AGENTS.md` — Hono API, API-key scopes\n- `apps/status-page/AGENTS.md` — public surfaces and gated content\n- `apps/workflows/AGENTS.md` — Deno runtime constraints\n- `apps/checker/AGENTS.md` — Go probing tier\n- `apps/web/AGENTS.md` — marketing site, `.well-known`, search, content pages\n\n`docs/adr/` is frozen background on *why* some of these decisions were made. It\nis history, not current state; this file and its nested siblings are current\nstate. Do not add new ADRs.\n"},"items":[{"name":"CLAUDE.md","path":"CLAUDE.md","title":"CLAUDE.md","content":"# CLAUDE.md\n\nRead `AGENTS.md` in this directory — it holds the conventions for this repo, and\nthe nested `AGENTS.md` files it links carry the package-specific ones.\n","category":"root","tokens":42},{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# AGENTS.md\n\nCross-cutting truth for openstatus. Package-scoped rules live in the nested\n`AGENTS.md` files listed at the bottom. Setup and how-to-run belong in READMEs —\nthis file never restates them.\n\n## Verify your change\n\n```sh\npnpm verify        # oxfmt + oxlint + doc refs + deno check. No database, seconds.\npnpm verify:test   # tests for packages affected by your diff. Needs a database.\n```\n\n`pnpm verify` must be green before you hand work back — it is what CI's `Check`\njob runs. For `verify:test`, start the local libSQL and seed it first; the steps\nare in `apps/dashboard/README.md`.\n\n## Toolchain\n\n`devbox.json` pins exact node, deno, bun, turso-cli and sqld versions; the CI\nworkflows pin the same node and deno. Never float one back to `@latest` or\n`v2.x` — `deno check` results differ by deno version, so a drifting pin makes\n`pnpm verify` disagree with CI for reasons unrelated to your change.\n\n## Architecture\n\n- **`packages/services`** owns every workspace-scoped mutation. tRPC routers,\n  Hono routes, MCP tools and jobs are thin adapters over it. Inline DB access in\n  a router is a defect — see `packages/services/AGENTS.md`.\n- **Turso (libSQL) holds application data**, through Drizzle in `packages/db`.\n  **Tinybird holds monitoring time-series**, through `packages/tinybird`. The two\n  are linked by id only: no cross-store transaction, no join across the boundary,\n  no referential integrity.\n- **Go is confined to the probing tier** (`apps/checker`, `apps/private-location`).\n  Product logic stays in TypeScript. Anything duplicated across that boundary —\n  assertion evaluation, region codes — must be changed on both sides in one PR.\n- **Shared UI comes from `@openstatus/ui`.** Do not fork a primitive into an app.\n\n## Tests\n\n- CI gives every DB-touching package its own database (the matrix in\n  `.github/workflows/test.yml`). Locally there is one shared libSQL, which is\n  why `verify:test` runs the affected packages one at a time. Cross-package\n  failures that vanish on a re-run of the single package are that sharing, not\n  your change — confirm with `turbo run test --filter=@openstatus/services`.\n- Suites mint their own workspace via `createTestWorkspace`\n  (`packages/db/src/test/factories.ts`). Never load a shared seeded workspace,\n  and never wipe a table globally — scope every cleanup to your own workspace id.\n- The `external_service` suites are not workspace-scoped; an aborted run leaves\n  rows that fail the *next* local run on a foreign key. Reseed to recover.\n- The `test` turbo task is deliberately uncached — results depend on database\n  state that is not in the input hash. Do not \"fix\" it.\n\n## Comment discipline\n\nDefault to no comments. Code and identifiers already say *what*. Write a comment\nonly when the *why* is not visible: a non-obvious invariant, a workaround for a\nspecific bug, a constraint imposed from outside the file, a `// safe because …`\nabove an unavoidable cast.\n\n- 1 short line where possible, 3 lines max. Never multi-paragraph JSDoc.\n- Strip: restatements of the code, the name of the caller, history (\"added for\n  X\"), PR or task context. That belongs in the commit message.\n- JSDoc on an exported symbol is fine when the signature alone is ambiguous —\n  one sentence, not a tutorial.\n\n## Type cast discipline\n\n`as unknown as X`, `as never` and `as any` are sometimes unavoidable at\nboundaries with external SDKs or at registry-style dispatch. When you need one:\n\n- **Centralize it in a named helper** whose name states the intent\n  (`asUIMessages`, `renderToolDraft`). Do not scatter the same cast.\n- **Comment the runtime guarantee** above the helper, so a future reader can\n  check whether it still holds.\n- A scattered `as never` is usually a missing helper.\n\n## Package context\n\n- `packages/services/AGENTS.md` — service verbs, audit log, scope enforcement\n- `packages/ui/AGENTS.md` — stock shadcn vs. the published blocks registry\n- `apps/dashboard/AGENTS.md` — Next.js runtimes, client boundary, UI verification\n- `apps/server/AGENTS.md` — Hono API, API-key scopes\n- `apps/status-page/AGENTS.md` — public surfaces and gated content\n- `apps/workflows/AGENTS.md` — Deno runtime constraints\n- `apps/checker/AGENTS.md` — Go probing tier\n- `apps/web/AGENTS.md` — marketing site, `.well-known`, search, content pages\n\n`docs/adr/` is frozen background on *why* some of these decisions were made. It\nis history, not current state; this file and its nested siblings are current\nstate. Do not add new ADRs.\n","category":"root","tokens":1121}]}