fo-seo
SEO gate for one generated screen — checks head meta against the meta template, canonical and hreflang, sitemap/robots host rules, structured data and slug lists against the SEO spec snapshot (config.seo.specRef), one agent per aspect in parallel, and writes docs/gates/<app>/<screen>/seo.json. Use after fo-contract on indexable screens.
- License 许可
- MIT
- 最近更新
- 2026-11-13
- Stars
- ★ 2
- Forks
- 0
01 前言 Front Matter
- name
- fo-seo
- description
- SEO gate for one generated screen — checks head meta against the meta template, canonical and hreflang, sitemap/robots host rules, structured data and slug lists against the SEO spec snapshot (config.seo.specRef), one agent per aspect in parallel, and writes docs/gates/<app>/<screen>/seo.json. Use after fo-contract on indexable screens.
- allowed-tools
- Read, Write, Edit, Glob, Grep, Bash, Workflow
- argument-hint
- --app <name> --screen <id> [--only head,links,sitemap,structuredData,slugs]
- user-invocable
- true
03 SKILL.md 正文
fo-seo — SEO gate
Policy source: the SEO reference under config.seo.specRef (integrated spec, meta template, slug
lists) plus the screen's spec; hosts from config.seo. The plugin checks; the SEO owner decides
conflicts between the two specs (they are recorded in the plan's scope.conflicts).
Conventions: ${CLAUDE_PLUGIN_ROOT}/skills/fo-shared/SKILL.md.
Step 0 — Preconditions
Config (seo block present; absent → fo-init again), --app/--screen, plan. A screen whose
routes are all noindex/member-only → record skipped evidence with that reason and stop.
gates.verify.result pass with a current tree hash. config.seo.specRef exists. Lock seo.lock.
Aspects: head, links, sitemap, structuredData, slugs — the last only for screens the slug
list covers (city landing, search); --only narrows.
Step 1 — Dev server, run, wait
The probes need the app running with mocks. Start it in the background before the workflow and stop
it after, with the log under the repo root (the command itself runs from <app.dir>):
ROOT=$(git rev-parse --show-toplevel); mkdir -p "$ROOT/.claude/frontend-ohmyhotel/<app>"; (cd <app.dir> && npx react-router dev --port <devPort> > "$ROOT/.claude/frontend-ohmyhotel/<app>/dev.log" 2>&1 &);
wait until curl -s -o /dev/null -w '%{http_code}' http://localhost:<devPort>/ returns 200 (up to
60 s; otherwise record the gate as not-run with that reason). Pass serverUrl: "http://localhost:<devPort>"
in the workflow args; kill the server process in Step 2.
Workflow with name: "frontend-ohmyhotel-plugin:fo-seo-run" and
args: { app, screen, config, planFile, specDir, serverUrl, outDir: "<evidenceDir>/<app>/<screen>/seo", aspects }.
Wait for the task notification.
Step 2 — Evidence
fo-evidence --app <app> --screen <screen> --gate seo --result <pass|fail|skipped|not-run> --from <result json> $(for f in <app.dir>/e2e/seo/<screen>.*.spec.ts; do [ -e "$f" ] && printf -- '--spec-path %s ' "$f"; done)
Set the seo row in block 5 of <Screen>.spec.md. Release the lock.
Step 3 — Report and next
Per aspect: result, routes × languages checked, findings (critical first). Findings that trace to a
conflict already recorded in the plan are shown under that conflict, not as new defects. Suggested
commit gate(<screen>): seo <result>. Next:
- pass or skipped → the two manual gates, recorded with the same tool so
fo-progressandfo-cutoversee them:echo '{"reviewer":"<name>","note":"<where>"}' | fo-evidence --app <app> --screen <screen> --gate designerReview --result passand… --gate planningAcceptance --result pass(payload:{"ticket":"OMH-…","comment":"<id>"}); thenfo-progress - findings →
/frontend-ohmyhotel-plugin:fo-fix … --from seo, thenfo-verifyandfo-seoagain - a conflict → the SEO owner's decision goes into
docs/adr/; the plan's conflict entry is closed byfo-plan
Done when the evidence and tracker are written, the lock is released and the next command is named.
04 同仓库更多 Skills
hp-shared
Shared conventions for every homepage-plugin agent and skill — stack, code conventions, state-file writes, check commands and how to report them. Preloaded into agents through their `skills:` frontmatter; not meant to be invoked by hand.
fe-shared
Shared conventions for every frontend-react-plugin agent and skill — code conventions, state files and locks, accepted deviations, design principles, build working directory, router-mode command matrix, TypeScript check. Preloaded into agents through their `skills:` frontmatter; not meant to be invoked by hand.
be-spring-shared
Shared conventions for every backend-springboot-plugin agent and skill — tech stack, CQRS architecture, naming, coding standards, TDD, commit and build rules, state files. Preloaded into agents through their `skills:` frontmatter; not meant to be invoked by hand.
pp-translate
Use after directly editing the working language spec to sync changes to other supported languages.
pp-sync-stitch
Use when wireframes were manually edited on the Stitch website and need to be re-fetched to the local project.
pp-sync-notion
Use when a specification needs to be published or re-synced to Notion after finalization or manual edits.