Imported from dominic-codespoti/fitness-tracker-site (
AGENTS.md). Install upstream withnpx skills add dominic-codespoti/fitness-tracker-site. Copyright stays with the author.
AGENTS.md
Reality Check
- This repo is an Astro 3 static marketing/content site for Workout Quest. The
README.mdis describing the React Native product being marketed, not this repository's implementation details. - Trust
package.json,astro.config.mjs, andsrc/for how this repo is built and run. - Production deploys via Vercel Git integration (project
workout-quest, production branchmain): pushing tomainauto-deploys. Build runsnpm run build(astro build && node scripts/generate-sitemap.js); Vercel usesyarn.lockwhen present.vercel.jsonholds the 301 redirects and cache headers. - Minimum supported Node version is
>=18.14.1(package.json).
Commands
- Dev server:
yarn dev - Production build:
yarn build - Lint:
yarn lint:eslint - Format:
yarn format - SEO/build checks:
yarn validate-seo,yarn check-canonicals,yarn audit-frontmatter - Content helpers that modify posts in place:
yarn generate-excerpts;node scripts/fix-frontmatter.js - If you need a focused verification pass for content/SEO changes, use:
yarn build && yarn validate-seo && yarn check-canonicals && yarn audit-frontmatter
Build Output Gotchas
- The custom SEO scripts read built HTML from
.vercel/output/static, not fromdist/and not from source files. - Run
yarn buildbeforevalidate-seo,check-canonicals, orregen-sitemap, otherwise they fail with "No built HTML files found". scripts/generate-sitemap.jswrites sitemap files directly into.vercel/output/static.src/utils/tasks.mjspatches the builtrobots.txtafter Astro build to append/update the sitemap URL. Editpublic/robots.txtas the source of truth, not the built file.
Config That Drives Routing/SEO
- Site-wide metadata, canonical base URL, trailing slash behavior, analytics, and blog settings all come from
src/config.yaml, loaded throughsrc/utils/config.ts. astro.config.mjsusesSITE.site,SITE.base, andSITE.trailingSlashfrom that YAML. If URLs or canonical behavior change, updatesrc/config.yamlfirst.- The
~/*import alias points tosrc/*(tsconfig.json,astro.config.mjs).
Content Model
- Blog content lives in
src/content/post/*.mdx; schema is enforced insrc/content/config.ts. - Posts are loaded through
src/utils/blog.ts; drafts are excluded there. - Blog list routes live under
src/pages/[...blog]/, but individual post URLs currently come fromapps.blog.post.permalinkinsrc/config.yaml, which is set to/%slug%. Do not assume posts live under/blog/.... audit-frontmatter.jsexpects canonical URLs to matchhttps://site/<slug>for posts and flags descriptions shorter than 50 chars.generate-excerpts.jswrites a top-levelexcerptinto post frontmatter when metadata/description is too short.
Key Entry Points
- Home page:
src/pages/index.astro - Shared page shell:
src/layouts/PageLayout.astro->src/layouts/Layout.astro - Header/footer nav links:
src/navigation.js - Blog routing and pagination:
src/utils/blog.tsplussrc/pages/[...blog]/...
Style Constraints Worth Remembering
- Formatting is Prettier with
singleQuote: true, semicolons, andprintWidth: 120(.prettierrc.js). - ESLint covers
.astro,.ts, and.js; TypeScript unused args prefixed with_are intentionally ignored (.eslintrc.js).
OpenSEO (SEO Research)
- OpenSEO MCP is configured in
.omp/mcp.json(openseo, streamable HTTP athttps://app.openseo.so/mcp). It requires OAuth: run/mcp reloadthen/mcp reauth openseo(or restart the session) and sign in once. Tools mount asmcp__openseo_*(e.g.research_keywords,get_keyword_metrics,get_serp_results,list_projects). - SEO workflow skills live in
.agents/skills/(8 skills:seo-project-setup,seo-coach,seo-audit,keyword-research,keyword-clustering,competitive-landscape,competitor-analysis,link-prospecting). Read them viaskill://<name>; they complement the localyarn validate-seoscripts, which only check built HTML. - Reinstall/update skills with
npx skills add every-app/open-seo -s '*' -a agents -y --copyfrom the repo root.
Content Agent
.omp/agents/content-writer.mddefines the repo's reusable content-writing agent (frontmatter contract, heading rules, internal linking, fact verification, voice). Dispatch it via the task tool withagent: "content-writer"— it is rediscovered per spawn, so new definitions work without a restart. It will follow the same frontmatter bands the validator enforces (title ≤45 raw / rendered ≤60, excerpt 70-155).