* feat(ci): add dual-model AI review orchestrator Fetches the PR diff, runs Claude Sonnet 4.6 and GPT-5.3-Codex in parallel, merges both reviews with Haiku 4.5 and posts the result as an inline PR review. Dependency-free, Node 20+. Supports DRY_RUN=1. * feat(ci): add ai-review tuning config Calibration threshold (minor), ignore globs for lockfiles and Payload-generated artifacts, AGENTS.md as review guidelines. * ci: add /ai-review comment-triggered workflow Collaborator-gated, review-only pilot. Before first use: add ANTHROPIC_API_KEY and OPENAI_API_KEY repo secrets; triggers only once merged to the default branch (develop). * chore(ci): update ai-review models and pricing Use claude-opus-4-8 / gpt-5.4; add their $/MTok prices and warn on models with no configured price so their cost is not silently counted as $0. * feat(ci): guide reviewers on dependency versions Tell reviewers not to flag or downgrade dependency versions newer than their knowledge cutoff, while still checking cross-package version coherence. * feat(ci): gather AGENTS.md guidelines per touched dir Prefer AGENTS.md as the guideline source and collect the root file plus any AGENTS.md in a directory the diff touches, instead of only the first match. * feat(ci): add SKIP_GUIDELINES env var When SKIP_GUIDELINES is truthy, run reviewers without loading any guideline files. * style(ci): reflow codexReview fetch call * fix(ci): run ai-review from default branch, not PR head Checking out the PR head SHA ran the PR author's review.mjs and config with the job's write token and secrets. Check out the default branch instead; the diff is fetched via the GitHub API by PR number, so PR changes are still reviewed while reviewer code/config stay trusted. * chore(ci): drop unavailable /ai-review --fix prompt The auto-fix feature is not implemented; remove its mention from the posted review body and the workflow header. * chore(ci): update ai models used for ai-review worflow * fix(ci): skip traversal paths when collecting AGENTS.md PR filenames are untrusted; ignore absolute paths and .. segments. * docs(ci): document ai-review config replace semantics Config keys fully replace defaults, lists are not merged; restate the default ignore patterns in the pilot config so none are lost. * fix(ci): surface unreviewable files, pack past over-budget ones Track files GitHub returns without a patch and files over the token budget; warn on the PR instead of dropping them silently. Use continue, not break, so small files after a large one still get reviewed. * fix(ci): sanitize inline comment line anchors Anchor inline comments only on valid line numbers and list the rest in the summary body; one bad anchor rejected the whole review. Compute the non-critical count directly. * feat(ci): degrade gracefully when a review provider fails Synthesize with the OpenAI reviewer model when Anthropic is down, fall back to a local merge if synthesis itself fails, and note the failed model in the PR comment. * fix(ci): fail fast on missing env vars Validate GITHUB_TOKEN, REPO, PR_NUMBER and at least one API key at startup; a single missing key still degrades to one reviewer. * fix(ci): unquote scalar config values Quoted values like min_severity_to_post: 'minor' kept their quotes and silently fell back to the major threshold. * fix(ci): try direct JSON parse before brace extraction Brace-slicing on prose-wrapped output could produce malformed JSON and silently drop an entire review. * chore(ci): log which guideline files are used Warn explicitly when none of the configured files exist instead of silently reviewing without guidelines. * chore(ci): drop ineffective prompt caching The system prompt is far below the minimum cacheable prefix and the call is one-shot, so cache_control never did anything. * fix(ci): detect truncated GitHub file listings Compare the PR's changed_files count with the files API results (capped at 3,000) and warn on the PR when files are unlisted. * fix(ci): pack smallest files first, report only packed files Smallest-first packing fits the most files into the token budget, and the returned file list (used for guideline collection) now reflects what the reviewers actually saw. * fix(ci): anchor inline comments only to reviewed diff lines One out-of-diff line anchor made GitHub reject the whole review. Parse hunks per file and demote issues outside them to the summary body; the fallback flat list now keeps line numbers and suggested fixes. * fix(ci): neutralize @mentions in posted model output Model text derives from untrusted PR content; a zero-width space after @ stops crafted diffs from pinging arbitrary users or teams. * style(ci): apply prettier formatting, prune redundant comments
logos-co
pnpm + Turborepo monorepo for the Logos website and its content CMS.
apps/web— public Next.js 16 site (Tailwind v4,next-intl, static export)apps/cms— Payload CMS 3.x admin (Postgres-backed; edits ship as GitHub PRs)packages/content— content schemas, loaders forcontent/**, GitHub mutation helperspackages/ui— shared React primitives and SVG icons (<LogosMark />, etc.)packages/tokens— design tokenspackages/types— shared types incl. Payload-generatedpackages/config— shared ESLint / TypeScript / Prettier configcontent/**— production source of truth (pages, press, circles, builders-hub, site)
Apps are entrypoints only. Shared logic lives in packages. The web app reads content/** at build time and never calls GitHub at request time.
Requirements
Node 24, pnpm 11.1.0.
Quick start
pnpm install
pnpm dev # web → http://localhost:3000, cms → http://localhost:3001
Payload Admin: http://localhost:3001/admin.
apps/cms requires PAYLOAD_SECRET and DATABASE_URL (Postgres). Copy apps/cms/.env.example to apps/cms/.env and fill it in. See docs/deployment.md for the full env matrix.
Workspace package builds
Apps consume internal packages (@acid-info/logos-ui, @acid-info/logos-content, etc.) through their compiled dist/ outputs declared in each package's exports map. Turborepo's dev task declares dependsOn: ["^build"], so pnpm dev builds upstream packages before starting the app servers.
If a dist/ directory goes missing (e.g. after git clean -fdx or manually removing node_modules) and an app is started directly without going through pnpm dev, you may see errors like:
Module not found: Can't resolve '@acid-info/logos-ui/client'
Rebuild the affected workspace package to fix it:
pnpm --filter @acid-info/logos-ui build
Or run pnpm build once at the repo root to compile every package.
Common scripts
pnpm build # web static export + cms build
pnpm test # vitest (apps/web)
pnpm lint # eslint --max-warnings 0
pnpm check-types # next typegen + tsc --noEmit
pnpm generate-types # regenerate packages/types/src/payload.ts from Payload schema
Branch model
develop— default branch + staging. CMS-generated content PRs target thismaster— production (created when production deploys spin up)
Direct pushes to either are blocked by branch protection.
Documentation
- AGENTS.md — conventions and rules for AI agents working in this repo
- docs/deployment.md — env vars, Vercel dev/staging, self-hosted production
- docs/cms-github-content-plan.md — schema + GitHub workflow design
- docs/web-pages.md — per-page web requirements (Figma references)
- docs/components.md — shared component specs
- docs/seo.md — SEO and metadata expectations
- docs/code-quality-followups.md — known gaps awaiting decisions