[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CRAVCZKWF0F3VVA5FWG9P7":3,"skill-same:01M6CRAVCZKWF0F3VVA5FWG9P7":65},{"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":22,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":50,"install":51,"resources":64},"01M6CRAVCZKWF0F3VVA5FWG9P7","fo-shared",null,"Shared conventions for every frontend-ohmyhotel-plugin agent and skill — config lookup, state and evidence files, locks, reporting format. Preloaded into agents through their `skills:` frontmatter; not meant to be invoked by hand.","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-shared\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"fo shared","shared","frontend","config","plugin","state","reporting","lookup","format","evidence","files","conventions","false","hand","for","frontmatter","2026-11-10 10:12:30",false,"---\nname: fo-shared\ndescription: Shared conventions for every frontend-ohmyhotel-plugin agent and skill — config lookup, state and evidence files, locks, reporting format. Preloaded into agents through their `skills:` frontmatter; not meant to be invoked by hand.\nuser-invocable: false\n---\n\n# Shared conventions (frontend-ohmyhotel-plugin)\n\nThese rules apply to every `fo-*` skill and every agent of this plugin. Agents receive this skill\nthrough `skills: [fo-shared]`; the plugin root `CLAUDE.md` is maintainer notes and is not loaded into\nany agent's context, so nothing here may be assumed to exist anywhere else.\n\n## Where facts come from\n\n| Fact | Source | Not from |\n|---|---|---|\n| Paths, apps, languages, viewports, rule-list locations | `.claude\u002Ffrontend-ohmyhotel-plugin.json` in the product repo (written by `fo-init`) | this plugin's templates |\n| What a screen does | the spec snapshot under `apps[].answerKeys.spec.dir\u002F\u003Cnn>-\u003Cscreen>\u002F` | memory of a previous screen |\n| Development and CTO decisions (WebView contract, external URLs, request conventions, token handling, hosts, payment) | the product repo's `rules.adrDir` and `rules.rulesDir` (`*.json` lists have fixed shapes, see `${CLAUDE_PLUGIN_ROOT}\u002Ftemplates\u002Frule-lists.md`) | this plugin |\n| How to build and verify | this plugin's skills, agents and templates | — |\n\nThe product repo's `CLAUDE.md` reaches every agent automatically; it points at `docs\u002Frules\u002F`. If a\nrule you need is missing there, report the gap in your result instead of inventing the rule — the\nrule files are owned by the repo and change by PR.\n\n## Files the pipeline writes\n\n| File | Owner | Purpose |\n|---|---|---|\n| `.claude\u002Ffrontend-ohmyhotel\u002F\u003Capp>\u002F\u003Cscreen>\u002Fgeneration-state.json` | `fo-gen-run` workflow | stage checklist: `stage`, `status`, `treeHash`, `startedAt`, `finishedAt`, `evidence[]` |\n| `.claude\u002Ffrontend-ohmyhotel\u002F\u003Capp>\u002F\u003Cscreen>\u002F*.lock` | the skill that starts a run | one writer per screen; contents `{ \"command\", \"startedAt\", \"runId\" }` |\n| `.claude\u002Ffrontend-ohmyhotel\u002F\u003Capp>\u002Fapp.lock` | `foundation-generator`, `integration-generator`, `fo-extract` | guards app-wide files (harness, i18n resources, route table, MSW aggregate, packages); held only around the write |\n| `\u003Cgates.evidenceDir>\u002F\u003Capp>\u002F\u003Cscreen>\u002F\u003Cgate>.json` | gates (`verify`, `visual`, `e2e`, `contract`, `seo`, `review`) and the two manual gates (`designerReview`, `planningAcceptance`, recorded by a person with `fo-evidence --gate … --result pass` and a payload naming reviewer\u002Fticket) | committed evidence written by `fo-evidence`: payload + `treeHash` (from `fo-screen-hash`), `recordedAt`, `result` |\n| `\u003Cgates.evidenceDir>\u002F\u003Capp>\u002Fprogress.json` | `fo-evidence` (gate results) and `fo-progress-set` (everything else) — **never edited directly**; both hold the same file lock and replace atomically, because every screen shares the file | screen × gate matrix read by `fo-progress` and `fo-cutover` |\n| `\u003CscreensDir>\u002F\u003Cscreen>\u002F\u003CScreen>.spec.md` | `fo-plan`, updated by `fo-gen` | the five-block implementation spec (template `screen-spec.md`) |\n\nEvidence is produced by running the command and recording what happened. It is not a place for a\njudgement such as \"looks complete\"; if a gate did not run, the file says so (`\"exitCode\": null`,\n`\"skipped\": \"\u003Creason>\"`).\n\nTree hash: `fo-screen-hash --app \u003Capp> --screen \u003Cscreen>` (on `PATH` while the plugin is enabled) is the\none definition of what a screen's evidence covers — the screen folder minus `\u003CScreen>.spec.md`, the\nplan's route modules, ui-kit gap files and package additions. The gates' own Playwright specs\n(`e2e\u002F**`, laid out as `${CLAUDE_PLUGIN_ROOT}\u002Ftemplates\u002Fe2e-playwright.md` § The e2e tree fixes it) are **not** in it: the\nvisual\u002Fe2e\u002Fseo gates write them, and hashing them would stale every\nearlier gate each time a later one runs. Every producer and consumer uses it; nothing hashes its own\npath list. A `pass` with no computable hash is refused by `fo-evidence` (manual gates excepted). A record whose `treeHash` equals the current value may be reused; otherwise it is\nstale and the gate runs again.\n\n## Locks\n\nA skill that will write to a screen takes `\u003Cscreen>\u002F\u003Ccommand>.lock` before reading state and releases\nit in its final step, including when the run fails. A workflow started by the skill runs under the\nskill's lock; agents inside it take no screen lock. The one lock an agent does take is `app.lock`,\nbriefly, around a write to an app-wide file — two screens generated at the same time would otherwise\nboth see the file as absent. Finding a lock whose `runId` is still live means\nanother run owns the screen — report that and stop; do not delete it.\n\n## Scope\n\nDeliver what the plan or the prompt asks for. If something adjacent needs work, say so in one sentence\nin the result and continue; do not widen or narrow the task on your own. Do not start subagents; the\nworkflow decides fan-out.\n\n## Reporting\n\nReturn the result first, then the evidence (file:line or command output), then what is still open.\nAgents started from a workflow return data (the workflow passes a `schema`); the final text is not a\nmessage to a person. Reviewers report every finding with `severity` (`critical` | `warning` |\n`suggestion`) and `confidence` (`high` | `medium` | `low`); the workflow's merge stage filters and\nclusters, so do not pre-filter to \"clear\" findings.\n\n## Done when\n\nAn orchestrating skill is finished when the workflow has returned, the state and evidence files are\nwritten, the lock is released, and the result names the next command. Presenting a plan, a stage\nresult or a finding list is not completion unless the skill's own contract ends there (`fo-plan`,\n`fo-review` end at an approval question by design).\n","# Shared conventions (frontend-ohmyhotel-plugin)\n\nThese rules apply to every `fo-*` skill and every agent of this plugin. Agents receive this skill\nthrough `skills: [fo-shared]`; the plugin root `CLAUDE.md` is maintainer notes and is not loaded into\nany agent's context, so nothing here may be assumed to exist anywhere else.\n\n## Where facts come from\n\n| Fact | Source | Not from |\n|---|---|---|\n| Paths, apps, languages, viewports, rule-list locations | `.claude\u002Ffrontend-ohmyhotel-plugin.json` in the product repo (written by `fo-init`) | this plugin's templates |\n| What a screen does | the spec snapshot under `apps[].answerKeys.spec.dir\u002F\u003Cnn>-\u003Cscreen>\u002F` | memory of a previous screen |\n| Development and CTO decisions (WebView contract, external URLs, request conventions, token handling, hosts, payment) | the product repo's `rules.adrDir` and `rules.rulesDir` (`*.json` lists have fixed shapes, see `${CLAUDE_PLUGIN_ROOT}\u002Ftemplates\u002Frule-lists.md`) | this plugin |\n| How to build and verify | this plugin's skills, agents and templates | — |\n\nThe product repo's `CLAUDE.md` reaches every agent automatically; it points at `docs\u002Frules\u002F`. If a\nrule you need is missing there, report the gap in your result instead of inventing the rule — the\nrule files are owned by the repo and change by PR.\n\n## Files the pipeline writes\n\n| File | Owner | Purpose |\n|---|---|---|\n| `.claude\u002Ffrontend-ohmyhotel\u002F\u003Capp>\u002F\u003Cscreen>\u002Fgeneration-state.json` | `fo-gen-run` workflow | stage checklist: `stage`, `status`, `treeHash`, `startedAt`, `finishedAt`, `evidence[]` |\n| `.claude\u002Ffrontend-ohmyhotel\u002F\u003Capp>\u002F\u003Cscreen>\u002F*.lock` | the skill that starts a run | one writer per screen; contents `{ \"command\", \"startedAt\", \"runId\" }` |\n| `.claude\u002Ffrontend-ohmyhotel\u002F\u003Capp>\u002Fapp.lock` | `foundation-generator`, `integration-generator`, `fo-extract` | guards app-wide files (harness, i18n resources, route table, MSW aggregate, packages); held only around the write |\n| `\u003Cgates.evidenceDir>\u002F\u003Capp>\u002F\u003Cscreen>\u002F\u003Cgate>.json` | gates (`verify`, `visual`, `e2e`, `contract`, `seo`, `review`) and the two manual gates (`designerReview`, `planningAcceptance`, recorded by a person with `fo-evidence --gate … --result pass` and a payload naming reviewer\u002Fticket) | committed evidence written by `fo-evidence`: payload + `treeHash` (from `fo-screen-hash`), `recordedAt`, `result` |\n| `\u003Cgates.evidenceDir>\u002F\u003Capp>\u002Fprogress.json` | `fo-evidence` (gate results) and `fo-progress-set` (everything else) — **never edited directly**; both hold the same file lock and replace atomically, because every screen shares the file | screen × gate matrix read by `fo-progress` and `fo-cutover` |\n| `\u003CscreensDir>\u002F\u003Cscreen>\u002F\u003CScreen>.spec.md` | `fo-plan`, updated by `fo-gen` | the five-block implementation spec (template `screen-spec.md`) |\n\nEvidence is produced by running the command and recording what happened. It is not a place for a\njudgement such as \"looks complete\"; if a gate did not run, the file says so (`\"exitCode\": null`,\n`\"skipped\": \"\u003Creason>\"`).\n\nTree hash: `fo-screen-hash --app \u003Capp> --screen \u003Cscreen>` (on `PATH` while the plugin is enabled) is the\none definition of what a screen's evidence covers — the screen folder minus `\u003CScreen>.spec.md`, the\nplan's route modules, ui-kit gap files and package additions. The gates' own Playwright specs\n(`e2e\u002F**`, laid out as `${CLAUDE_PLUGIN_ROOT}\u002Ftemplates\u002Fe2e-playwright.md` § The e2e tree fixes it) are **not** in it: the\nvisual\u002Fe2e\u002Fseo gates write them, and hashing them would stale every\nearlier gate each time a later one runs. Every producer and consumer uses it; nothing hashes its own\npath list. A `pass` with no computable hash is refused by `fo-evidence` (manual gates excepted). A record whose `treeHash` equals the current value may be reused; otherwise it is\nstale and the gate runs again.\n\n## Locks\n\nA skill that will write to a screen takes `\u003Cscreen>\u002F\u003Ccommand>.lock` before reading state and releases\nit in its final step, including when the run fails. A workflow started by the skill runs under the\nskill's lock; agents inside it take no screen lock. The one lock an agent does take is `app.lock`,\nbriefly, around a write to an app-wide file — two screens generated at the same time would otherwise\nboth see the file as absent. Finding a lock whose `runId` is still live means\nanother run owns the screen — report that and stop; do not delete it.\n\n## Scope\n\nDeliver what the plan or the prompt asks for. If something adjacent needs work, say so in one sentence\nin the result and continue; do not widen or narrow the task on your own. Do not start subagents; the\nworkflow decides fan-out.\n\n## Reporting\n\nReturn the result first, then the evidence (file:line or command output), then what is still open.\nAgents started from a workflow return data (the workflow passes a `schema`); the final text is not a\nmessage to a person. Reviewers report every finding with `severity` (`critical` | `warning` |\n`suggestion`) and `confidence` (`high` | `medium` | `low`); the workflow's merge stage filters and\nclusters, so do not pre-filter to \"clear\" findings.\n\n## Done when\n\nAn orchestrating skill is finished when the workflow has returned, the state and evidence files are\nwritten, the lock is released, and the result names the next command. Presenting a plan, a stage\nresult or a finding list is not completion unless the skill's own contract ends there (`fo-plan`,\n`fo-review` end at an approval question by design).\n",{"name":5,"description":7,"user-invocable":40},"main","64e41a7f9c83f3469e662235cfcba152764ceb92","frontend-ohmyhotel-plugin\u002Fskills\u002Ffo-shared",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":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add ohmyhotelco\u002Fhare-cc-plugins --skill fo-shared",{"tool":57,"command":58},"bunx","bunx skills add ohmyhotelco\u002Fhare-cc-plugins --skill fo-shared",{"tool":60,"command":61},"pnpm","pnpm dlx skills add ohmyhotelco\u002Fhare-cc-plugins --skill fo-shared","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fohmyhotelco\u002Fhare-cc-plugins\u002Fblob\u002Fmain\u002Ffrontend-ohmyhotel-plugin\u002Fskills\u002Ffo-shared\u002FSKILL.md",true,[],[66,83,103,127,149,170],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":39},"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",[],[24,73,28,74,27,75,37,76,77,78,79,34,35,38,80,81,36,82],"hp shared","stack","how","report","code conventions","commands","how to","file","code","check",{"skillNo":84,"name":85,"nameZh":6,"description":86,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":93,"publishedAt":39},"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",[89,90],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":91,"categoryName":92,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",[24,94,37,95,77,25,96,97,33,35,81,36,98,82,99,28,27,100,101,102],"fe shared","mode","design","design principles","react","router","principles","command","build",{"skillNo":104,"name":105,"nameZh":6,"description":106,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":115,"publishedAt":39},"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",[109,112],{"categoryNo":110,"categoryName":111,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":113,"categoryName":114,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[24,116,117,33,35,118,119,36,74,120,38,121,122,123,37,124,125,28,27,126],"spring","be spring shared","commit","architecture","coding standards","coding","standards","tech","Rules","cqrs","naming",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":39},"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",[],[134,135,136,137,138,139,140,141,142,143,144,145,80,146,147,148],"pp","pp translate","translate","feature","name","editing","read","spec","write","edit","sync","use","language","true","changes",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":156,"publishedAt":39},"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",[155],{"categoryNo":113,"categoryName":114,"taxonomyType":20,"taxonomyTypeDesc":21},[157,134,158,144,159,160,137,161,162,163,164,145,165,166,167,168,169,138,140,147],"pp sync stitch","stitch","projects","get","project","re","local","MCP","Bash","id","wireframes","website","screen",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":177,"publishedAt":39},"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",[176],{"categoryNo":113,"categoryName":114,"taxonomyType":20,"taxonomyTypeDesc":21},[134,178,144,179,137,162,180,181,164,145,182,138,140,142,143,183,147],"notion","pp sync notion","search","manual","specification","grep"]