[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CRARGJB61VB14R3BA2EPWJ":3,"skill-same:01M6CRARGJB61VB14R3BA2EPWJ":76},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":27,"publishedAt":48,"linkOnly":49,"markdownContent":50,"markdownBody":51,"frontMatter":52,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":6,"ownerHtmlUrl":61,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":62,"install":63,"resources":75},"01M6CRARGJB61VB14R3BA2EPWJ","fo-seo",null,"SEO gate for one generated screen — checks head meta against the meta template, canonical and hreflang, sitemap\u002Frobots host rules, structured data and slug lists against the SEO spec snapshot (config.seo.specRef), one agent per aspect in parallel, and writes docs\u002Fgates\u002F\u003Capp>\u002F\u003Cscreen>\u002Fseo.json. Use after fo-contract on indexable screens.","ohmyhotelco\u002Fhare-cc-plugins","ohmyhotelco","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F258133233?v=4","01M6CR4HP2N9F9ZWNX1KRHQ2W1","01M6CR4HSJC5J80RVQMD5K9QRN",2,"MIT","https:\u002F\u002Fgithub.com\u002Fohmyhotelco\u002Fhare-cc-plugins\u002Fblob\u002Fmain\u002Ffrontend-ohmyhotel-plugin\u002Fskills\u002Ffo-seo\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000019","营销推广","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000035","市场营销","PROFESSION","适用职业",[28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],"fo seo","seo","id","gates","-app","host","contract","true","for","links","app","Bash","workflow","Rules","use","generated","only","structured data","Meta","parallel","2026-11-10 10:12:30",false,"---\nname: fo-seo\ndescription: SEO gate for one generated screen — checks head meta against the meta template, canonical and hreflang, sitemap\u002Frobots host rules, structured data and slug lists against the SEO spec snapshot (config.seo.specRef), one agent per aspect in parallel, and writes docs\u002Fgates\u002F\u003Capp>\u002F\u003Cscreen>\u002Fseo.json. Use after fo-contract on indexable screens.\nargument-hint: \"--app \u003Cname> --screen \u003Cid> [--only head,links,sitemap,structuredData,slugs]\"\nuser-invocable: true\nallowed-tools: Read, Write, Edit, Glob, Grep, Bash, Workflow\n---\n\n# fo-seo — SEO gate\n\nPolicy source: the SEO reference under `config.seo.specRef` (integrated spec, meta template, slug\nlists) plus the screen's spec; hosts from `config.seo`. The plugin checks; the SEO owner decides\nconflicts between the two specs (they are recorded in the plan's `scope.conflicts`).\n\nConventions: `${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Ffo-shared\u002FSKILL.md`.\n\n## Step 0 — Preconditions\n\nConfig (`seo` block present; absent → `fo-init` again), `--app`\u002F`--screen`, plan. A screen whose\nroutes are all `noindex`\u002Fmember-only → record `skipped` evidence with that reason and stop.\n`gates.verify.result` `pass` with a current tree hash. `config.seo.specRef` exists. Lock `seo.lock`.\n\nAspects: `head`, `links`, `sitemap`, `structuredData`, `slugs` — the last only for screens the slug\nlist covers (city landing, search); `--only` narrows.\n\n## Step 1 — Dev server, run, wait\n\nThe probes need the app running with mocks. Start it in the background before the workflow and stop\nit after, with the log under the repo root (the command itself runs from `\u003Capp.dir>`):\n`ROOT=$(git rev-parse --show-toplevel); mkdir -p \"$ROOT\u002F.claude\u002Ffrontend-ohmyhotel\u002F\u003Capp>\"; (cd \u003Capp.dir> && npx react-router dev --port \u003CdevPort> > \"$ROOT\u002F.claude\u002Ffrontend-ohmyhotel\u002F\u003Capp>\u002Fdev.log\" 2>&1 &)`;\nwait until `curl -s -o \u002Fdev\u002Fnull -w '%{http_code}' http:\u002F\u002Flocalhost:\u003CdevPort>\u002F` returns 200 (up to\n60 s; otherwise record the gate as `not-run` with that reason). Pass `serverUrl: \"http:\u002F\u002Flocalhost:\u003CdevPort>\"`\nin the workflow args; kill the server process in Step 2.\n\n`Workflow` with `name: \"frontend-ohmyhotel-plugin:fo-seo-run\"` and\n`args: { app, screen, config, planFile, specDir, serverUrl, outDir: \"\u003CevidenceDir>\u002F\u003Capp>\u002F\u003Cscreen>\u002Fseo\", aspects }`.\nWait for the task notification.\n\n## Step 2 — Evidence\n\n```bash\nfo-evidence --app \u003Capp> --screen \u003Cscreen> --gate seo --result \u003Cpass|fail|skipped|not-run> --from \u003Cresult json> $(for f in \u003Capp.dir>\u002Fe2e\u002Fseo\u002F\u003Cscreen>.*.spec.ts; do [ -e \"$f\" ] && printf -- '--spec-path %s ' \"$f\"; done)\n```\n\nSet the `seo` row in block 5 of `\u003CScreen>.spec.md`. Release the lock.\n\n## Step 3 — Report and next\n\nPer aspect: result, routes × languages checked, findings (critical first). Findings that trace to a\nconflict already recorded in the plan are shown under that conflict, not as new defects. Suggested\ncommit `gate(\u003Cscreen>): seo \u003Cresult>`. Next:\n\n- pass or skipped → the two manual gates, recorded with the same tool so `fo-progress` and `fo-cutover` see them:\n  `echo '{\"reviewer\":\"\u003Cname>\",\"note\":\"\u003Cwhere>\"}' | fo-evidence --app \u003Capp> --screen \u003Cscreen> --gate designerReview --result pass`\n  and `… --gate planningAcceptance --result pass` (payload: `{\"ticket\":\"OMH-…\",\"comment\":\"\u003Cid>\"}`); then `fo-progress`\n- findings → `\u002Ffrontend-ohmyhotel-plugin:fo-fix … --from seo`, then `fo-verify` and `fo-seo` again\n- a conflict → the SEO owner's decision goes into `docs\u002Fadr\u002F`; the plan's conflict entry is closed by `fo-plan`\n\nDone when the evidence and tracker are written, the lock is released and the next command is named.\n","# fo-seo — SEO gate\n\nPolicy source: the SEO reference under `config.seo.specRef` (integrated spec, meta template, slug\nlists) plus the screen's spec; hosts from `config.seo`. The plugin checks; the SEO owner decides\nconflicts between the two specs (they are recorded in the plan's `scope.conflicts`).\n\nConventions: `${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Ffo-shared\u002FSKILL.md`.\n\n## Step 0 — Preconditions\n\nConfig (`seo` block present; absent → `fo-init` again), `--app`\u002F`--screen`, plan. A screen whose\nroutes are all `noindex`\u002Fmember-only → record `skipped` evidence with that reason and stop.\n`gates.verify.result` `pass` with a current tree hash. `config.seo.specRef` exists. Lock `seo.lock`.\n\nAspects: `head`, `links`, `sitemap`, `structuredData`, `slugs` — the last only for screens the slug\nlist covers (city landing, search); `--only` narrows.\n\n## Step 1 — Dev server, run, wait\n\nThe probes need the app running with mocks. Start it in the background before the workflow and stop\nit after, with the log under the repo root (the command itself runs from `\u003Capp.dir>`):\n`ROOT=$(git rev-parse --show-toplevel); mkdir -p \"$ROOT\u002F.claude\u002Ffrontend-ohmyhotel\u002F\u003Capp>\"; (cd \u003Capp.dir> && npx react-router dev --port \u003CdevPort> > \"$ROOT\u002F.claude\u002Ffrontend-ohmyhotel\u002F\u003Capp>\u002Fdev.log\" 2>&1 &)`;\nwait until `curl -s -o \u002Fdev\u002Fnull -w '%{http_code}' http:\u002F\u002Flocalhost:\u003CdevPort>\u002F` returns 200 (up to\n60 s; otherwise record the gate as `not-run` with that reason). Pass `serverUrl: \"http:\u002F\u002Flocalhost:\u003CdevPort>\"`\nin the workflow args; kill the server process in Step 2.\n\n`Workflow` with `name: \"frontend-ohmyhotel-plugin:fo-seo-run\"` and\n`args: { app, screen, config, planFile, specDir, serverUrl, outDir: \"\u003CevidenceDir>\u002F\u003Capp>\u002F\u003Cscreen>\u002Fseo\", aspects }`.\nWait for the task notification.\n\n## Step 2 — Evidence\n\n```bash\nfo-evidence --app \u003Capp> --screen \u003Cscreen> --gate seo --result \u003Cpass|fail|skipped|not-run> --from \u003Cresult json> $(for f in \u003Capp.dir>\u002Fe2e\u002Fseo\u002F\u003Cscreen>.*.spec.ts; do [ -e \"$f\" ] && printf -- '--spec-path %s ' \"$f\"; done)\n```\n\nSet the `seo` row in block 5 of `\u003CScreen>.spec.md`. Release the lock.\n\n## Step 3 — Report and next\n\nPer aspect: result, routes × languages checked, findings (critical first). Findings that trace to a\nconflict already recorded in the plan are shown under that conflict, not as new defects. Suggested\ncommit `gate(\u003Cscreen>): seo \u003Cresult>`. Next:\n\n- pass or skipped → the two manual gates, recorded with the same tool so `fo-progress` and `fo-cutover` see them:\n  `echo '{\"reviewer\":\"\u003Cname>\",\"note\":\"\u003Cwhere>\"}' | fo-evidence --app \u003Capp> --screen \u003Cscreen> --gate designerReview --result pass`\n  and `… --gate planningAcceptance --result pass` (payload: `{\"ticket\":\"OMH-…\",\"comment\":\"\u003Cid>\"}`); then `fo-progress`\n- findings → `\u002Ffrontend-ohmyhotel-plugin:fo-fix … --from seo`, then `fo-verify` and `fo-seo` again\n- a conflict → the SEO owner's decision goes into `docs\u002Fadr\u002F`; the plan's conflict entry is closed by `fo-plan`\n\nDone when the evidence and tracker are written, the lock is released and the next command is named.\n",{"name":5,"description":7,"allowed-tools":53,"argument-hint":54,"user-invocable":55},"Read, Write, Edit, Glob, Grep, Bash, Workflow","--app \u003Cname> --screen \u003Cid> [--only head,links,sitemap,structuredData,slugs]",true,"main","64e41a7f9c83f3469e662235cfcba152764ceb92","frontend-ohmyhotel-plugin\u002Fskills\u002Ffo-seo",0,"https:\u002F\u002Fgithub.com\u002Fohmyhotelco\u002Fhare-cc-plugins","https:\u002F\u002Fgithub.com\u002Fohmyhotelco","2026-11-13 16:34:32",{"source":8,"skillName":5,"commands":64,"prompt":74,"zipAvailable":55},[65,68,71],{"tool":66,"command":67},"npx","npx skills add ohmyhotelco\u002Fhare-cc-plugins --skill fo-seo",{"tool":69,"command":70},"bunx","bunx skills add ohmyhotelco\u002Fhare-cc-plugins --skill fo-seo",{"tool":72,"command":73},"pnpm","pnpm dlx skills add ohmyhotelco\u002Fhare-cc-plugins --skill fo-seo","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fohmyhotelco\u002Fhare-cc-plugins\u002Fblob\u002Fmain\u002Ffrontend-ohmyhotel-plugin\u002Fskills\u002Ffo-seo\u002FSKILL.md",[],[77,101,125,148,168,187],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":48},"01M6M5QVXQNQMJBP1JZP9T440T","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.","https:\u002F\u002Fgithub.com\u002Fohmyhotelco\u002Fhare-cc-plugins\u002Fblob\u002Fmain\u002Fhomepage-plugin\u002Fskills\u002Fhp-shared\u002FSKILL.md",[],[84,85,86,87,88,89,36,90,91,92,93,94,95,96,97,98,99,100],"shared","hp shared","state","stack","plugin","how","report","code conventions","commands","how to","conventions","false","frontmatter","file","code","hand","check",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":113,"publishedAt":48},"01M6M5PZTN1M0G4AHJV08VF1HV","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.","https:\u002F\u002Fgithub.com\u002Fohmyhotelco\u002Fhare-cc-plugins\u002Fblob\u002Fmain\u002Ffrontend-react-plugin\u002Fskills\u002Ffe-shared\u002FSKILL.md",[107,110],{"categoryNo":108,"categoryName":109,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":111,"categoryName":112,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",[84,114,36,115,91,116,117,118,119,95,98,99,120,100,121,86,88,122,123,124],"fe shared","mode","frontend","design","design principles","files","react","router","principles","command","build",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":137,"publishedAt":48},"01M6M5GAW7ZZ3580DVCMH51SFQ","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.","https:\u002F\u002Fgithub.com\u002Fohmyhotelco\u002Fhare-cc-plugins\u002Fblob\u002Fmain\u002Fbackend-springboot-plugin\u002Fskills\u002Fbe-spring-shared\u002FSKILL.md",[131,134],{"categoryNo":132,"categoryName":133,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":135,"categoryName":136,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[84,138,139,119,95,140,141,99,87,142,96,143,144,145,36,41,146,86,88,147],"spring","be spring shared","commit","architecture","coding standards","coding","standards","tech","cqrs","naming",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":154,"publishedAt":48},"01M6FNV58QMW8K71SA9FGTXMF4","pp-translate","Use after directly editing the working language spec to sync changes to other supported languages.","https:\u002F\u002Fgithub.com\u002Fohmyhotelco\u002Fhare-cc-plugins\u002Fblob\u002Fmain\u002Fplanning-plugin\u002Fskills\u002Fpp-translate\u002FSKILL.md",[],[155,156,157,158,159,160,161,162,163,164,165,42,97,166,35,167],"pp","pp translate","translate","feature","name","editing","read","spec","write","edit","sync","language","changes",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":175,"publishedAt":48},"01M6FNV0PGRKR2MW0AEPS6XP0Q","pp-sync-stitch","Use when wireframes were manually edited on the Stitch website and need to be re-fetched to the local project.","https:\u002F\u002Fgithub.com\u002Fohmyhotelco\u002Fhare-cc-plugins\u002Fblob\u002Fmain\u002Fplanning-plugin\u002Fskills\u002Fpp-sync-stitch\u002FSKILL.md",[174],{"categoryNo":135,"categoryName":136,"taxonomyType":20,"taxonomyTypeDesc":21},[176,155,177,165,178,179,158,180,181,182,183,42,39,30,184,185,186,159,161,35],"pp sync stitch","stitch","projects","get","project","re","local","MCP","wireframes","website","screen",{"skillNo":188,"name":189,"nameZh":6,"description":190,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":191,"categories":192,"keywords":194,"publishedAt":48},"01M6FNTWW2KHS9XRAR72X33G0B","pp-sync-notion","Use when a specification needs to be published or re-synced to Notion after finalization or manual edits.","https:\u002F\u002Fgithub.com\u002Fohmyhotelco\u002Fhare-cc-plugins\u002Fblob\u002Fmain\u002Fplanning-plugin\u002Fskills\u002Fpp-sync-notion\u002FSKILL.md",[193],{"categoryNo":135,"categoryName":136,"taxonomyType":20,"taxonomyTypeDesc":21},[155,195,165,196,158,181,197,198,183,42,199,159,161,163,164,200,35],"notion","pp sync notion","search","manual","specification","grep"]