[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MWGDGS2J2NAD2KDPMTN9V9":3,"skill-same:01M6MWGDGS2J2NAD2KDPMTN9V9":92},{"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":17,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":59,"commitSha":60,"skillDirectory":61,"forksCount":62,"repositoryHtmlUrl":63,"repositoryHomepageUrl":6,"ownerHtmlUrl":64,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":65,"install":66,"resources":79},"01M6MWGDGS2J2NAD2KDPMTN9V9","freeze",null,"Restrict file edits to a specific directory for the session. Blocks Edit and\nWrite outside the allowed path. Use when debugging to prevent accidentally\n\"fixing\" unrelated code, or when you want to scope changes to one module.\nUse when asked to \"freeze\", \"restrict edits\", \"only edit this folder\",\nor \"lock down edits\". (gstack)","forbotsake\u002Fforbotsake","forbotsake","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F273708741?v=4","01M6MW9A04DY7WQBA8YF96SVJE","01M6MW9A47HYRVBBQ642740E75",5,"MIT","https:\u002F\u002Fgithub.com\u002Fforbotsake\u002Fforbotsake\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgstack\u002Ffreeze\u002FSKILL.md",[],[5,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"only","down","changes","for","lock","you","scope","module","gstack","unrelated","debugging","use","session","command","check","Bash","boundary","file","code","2026-11-10 10:12:30",false,"---\nname: freeze\nversion: 0.1.0\ndescription: |\n  Restrict file edits to a specific directory for the session. Blocks Edit and\n  Write outside the allowed path. Use when debugging to prevent accidentally\n  \"fixing\" unrelated code, or when you want to scope changes to one module.\n  Use when asked to \"freeze\", \"restrict edits\", \"only edit this folder\",\n  or \"lock down edits\". (gstack)\nallowed-tools:\n  - Bash\n  - Read\n  - AskUserQuestion\nhooks:\n  PreToolUse:\n    - matcher: \"Edit\"\n      hooks:\n        - type: command\n          command: \"bash ${CLAUDE_SKILL_DIR}\u002Fbin\u002Fcheck-freeze.sh\"\n          statusMessage: \"Checking freeze boundary...\"\n    - matcher: \"Write\"\n      hooks:\n        - type: command\n          command: \"bash ${CLAUDE_SKILL_DIR}\u002Fbin\u002Fcheck-freeze.sh\"\n          statusMessage: \"Checking freeze boundary...\"\n---\n\u003C!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->\n\u003C!-- Regenerate: bun run gen:skill-docs -->\n\n# \u002Ffreeze — Restrict Edits to a Directory\n\nLock file edits to a specific directory. Any Edit or Write operation targeting\na file outside the allowed path will be **blocked** (not just warned).\n\n```bash\nmkdir -p ~\u002F.gstack\u002Fanalytics\necho '{\"skill\":\"freeze\",\"ts\":\"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'\",\"repo\":\"'$(basename \"$(git rev-parse --show-toplevel 2>\u002Fdev\u002Fnull)\" 2>\u002Fdev\u002Fnull || echo \"unknown\")'\"}'  >> ~\u002F.gstack\u002Fanalytics\u002Fskill-usage.jsonl 2>\u002Fdev\u002Fnull || true\n```\n\n## Setup\n\nAsk the user which directory to restrict edits to. Use AskUserQuestion:\n\n- Question: \"Which directory should I restrict edits to? Files outside this path will be blocked from editing.\"\n- Text input (not multiple choice) — the user types a path.\n\nOnce the user provides a directory path:\n\n1. Resolve it to an absolute path:\n```bash\nFREEZE_DIR=$(cd \"\u003Cuser-provided-path>\" 2>\u002Fdev\u002Fnull && pwd)\necho \"$FREEZE_DIR\"\n```\n\n2. Ensure trailing slash and save to the freeze state file:\n```bash\nFREEZE_DIR=\"${FREEZE_DIR%\u002F}\u002F\"\nSTATE_DIR=\"${CLAUDE_PLUGIN_DATA:-$HOME\u002F.gstack}\"\nmkdir -p \"$STATE_DIR\"\necho \"$FREEZE_DIR\" > \"$STATE_DIR\u002Ffreeze-dir.txt\"\necho \"Freeze boundary set: $FREEZE_DIR\"\n```\n\nTell the user: \"Edits are now restricted to `\u003Cpath>\u002F`. Any Edit or Write\noutside this directory will be blocked. To change the boundary, run `\u002Ffreeze`\nagain. To remove it, run `\u002Funfreeze` or end the session.\"\n\n## How it works\n\nThe hook reads `file_path` from the Edit\u002FWrite tool input JSON, then checks\nwhether the path starts with the freeze directory. If not, it returns\n`permissionDecision: \"deny\"` to block the operation.\n\nThe freeze boundary persists for the session via the state file. The hook\nscript reads it on every Edit\u002FWrite invocation.\n\n## Notes\n\n- The trailing `\u002F` on the freeze directory prevents `\u002Fsrc` from matching `\u002Fsrc-old`\n- Freeze applies to Edit and Write tools only — Read, Bash, Glob, Grep are unaffected\n- This prevents accidental edits, not a security boundary — Bash commands like `sed` can still modify files outside the boundary\n- To deactivate, run `\u002Funfreeze` or end the conversation\n","\u003C!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->\n\u003C!-- Regenerate: bun run gen:skill-docs -->\n\n# \u002Ffreeze — Restrict Edits to a Directory\n\nLock file edits to a specific directory. Any Edit or Write operation targeting\na file outside the allowed path will be **blocked** (not just warned).\n\n```bash\nmkdir -p ~\u002F.gstack\u002Fanalytics\necho '{\"skill\":\"freeze\",\"ts\":\"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'\",\"repo\":\"'$(basename \"$(git rev-parse --show-toplevel 2>\u002Fdev\u002Fnull)\" 2>\u002Fdev\u002Fnull || echo \"unknown\")'\"}'  >> ~\u002F.gstack\u002Fanalytics\u002Fskill-usage.jsonl 2>\u002Fdev\u002Fnull || true\n```\n\n## Setup\n\nAsk the user which directory to restrict edits to. Use AskUserQuestion:\n\n- Question: \"Which directory should I restrict edits to? Files outside this path will be blocked from editing.\"\n- Text input (not multiple choice) — the user types a path.\n\nOnce the user provides a directory path:\n\n1. Resolve it to an absolute path:\n```bash\nFREEZE_DIR=$(cd \"\u003Cuser-provided-path>\" 2>\u002Fdev\u002Fnull && pwd)\necho \"$FREEZE_DIR\"\n```\n\n2. Ensure trailing slash and save to the freeze state file:\n```bash\nFREEZE_DIR=\"${FREEZE_DIR%\u002F}\u002F\"\nSTATE_DIR=\"${CLAUDE_PLUGIN_DATA:-$HOME\u002F.gstack}\"\nmkdir -p \"$STATE_DIR\"\necho \"$FREEZE_DIR\" > \"$STATE_DIR\u002Ffreeze-dir.txt\"\necho \"Freeze boundary set: $FREEZE_DIR\"\n```\n\nTell the user: \"Edits are now restricted to `\u003Cpath>\u002F`. Any Edit or Write\noutside this directory will be blocked. To change the boundary, run `\u002Ffreeze`\nagain. To remove it, run `\u002Funfreeze` or end the session.\"\n\n## How it works\n\nThe hook reads `file_path` from the Edit\u002FWrite tool input JSON, then checks\nwhether the path starts with the freeze directory. If not, it returns\n`permissionDecision: \"deny\"` to block the operation.\n\nThe freeze boundary persists for the session via the state file. The hook\nscript reads it on every Edit\u002FWrite invocation.\n\n## Notes\n\n- The trailing `\u002F` on the freeze directory prevents `\u002Fsrc` from matching `\u002Fsrc-old`\n- Freeze applies to Edit and Write tools only — Read, Bash, Glob, Grep are unaffected\n- This prevents accidental edits, not a security boundary — Bash commands like `sed` can still modify files outside the boundary\n- To deactivate, run `\u002Funfreeze` or end the conversation\n",{"name":5,"hooks":42,"version":54,"description":55,"allowed-tools":56},{"PreToolUse":43},[44,50],{"hooks":45,"matcher":49},[46],{"type":31,"command":47,"statusMessage":48},"bash ${CLAUDE_SKILL_DIR}\u002Fbin\u002Fcheck-freeze.sh","Checking freeze boundary...","Edit",{"hooks":51,"matcher":53},[52],{"type":31,"command":47,"statusMessage":48},"Write","0.1.0","Restrict file edits to a specific directory for the session. Blocks Edit and\nWrite outside the allowed path. Use when debugging to prevent accidentally\n\"fixing\" unrelated code, or when you want to scope changes to one module.\nUse when asked to \"freeze\", \"restrict edits\", \"only edit this folder\",\nor \"lock down edits\". (gstack)\n",[33,57,58],"Read","AskUserQuestion","main","d91f0c567548c80403f85619693a405ed65d2b60",".claude\u002Fskills\u002Fgstack\u002Ffreeze",1,"https:\u002F\u002Fgithub.com\u002Fforbotsake\u002Fforbotsake","https:\u002F\u002Fgithub.com\u002Fforbotsake","2026-08-17 21:39:59",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add forbotsake\u002Fforbotsake --skill freeze",{"tool":72,"command":73},"bunx","bunx skills add forbotsake\u002Fforbotsake --skill freeze",{"tool":75,"command":76},"pnpm","pnpm dlx skills add forbotsake\u002Fforbotsake --skill freeze","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fforbotsake\u002Fforbotsake\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgstack\u002Ffreeze\u002FSKILL.md",true,[80,86],{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"bin\u002Fcheck-freeze.sh","SCRIPT","脚本",2689,"https:\u002F\u002Fgithub.com\u002Fforbotsake\u002Fforbotsake\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgstack\u002Ffreeze\u002Fbin\u002Fcheck-freeze.sh",{"path":87,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":90,"sourceHtmlUrl":91},"SKILL.md.tmpl","OTHER","其他",2916,"https:\u002F\u002Fgithub.com\u002Fforbotsake\u002Fforbotsake\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgstack\u002Ffreeze\u002FSKILL.md.tmpl",[93,113,139,168,191,225],{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":37},"01M6MWS487CZVEME2DWGT48C58","forbotsake-upgrade","Upgrade forbotsake to the latest version. Detects install type (git clone\nvs vendored), runs the upgrade, and shows what's new.\nUse when: \"upgrade forbotsake\", \"update forbotsake\", \"get latest version\",\n\"forbotsake update\".","https:\u002F\u002Fgithub.com\u002Fforbotsake\u002Fforbotsake\u002Fblob\u002Fmain\u002Fforbotsake-upgrade\u002FSKILL.md",[],[100,101,9,102,103,33,104,105,106,29,107,108,109,110,111,112],"upgrade","forbotsake upgrade","update","git","read","write","install","version","git clone","get","type","latest","clone",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":124,"publishedAt":37},"01M6MWRZ7XD9Q73JTRBQ0N8682","forbotsake-spy","Stage 3: RESEARCH (competitors). Analyzes 3-5 competitors to find messaging whitespace\nand positioning gaps. Produces competitor-analysis.md with a messaging matrix showing\nwhat each competitor says, what's missing, and where you can win.\nUse when: \"competitor analysis\", \"competitive research\", \"what are others doing\",\n\"market landscape\", \"who am I competing with\", \"spy on competitors\",\n\"messaging whitespace\", \"differentiation research\".\nProactively invoke when the user mentions competitors or asks how to differentiate.","https:\u002F\u002Fgithub.com\u002Fforbotsake\u002Fforbotsake\u002Fblob\u002Fmain\u002Fforbotsake-spy\u002FSKILL.md",[119],{"categoryNo":120,"categoryName":121,"taxonomyType":122,"taxonomyTypeDesc":123},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",[125,9,126,127,128,33,129,104,105,130,29,131,132,133,134,135,136,23,137,138],"forbotsake spy","messaging","analysis","how","competitors","edit","positioning","landscape","missing","how to","differentiation","competitive","websearch","matrix",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":154,"publishedAt":37},"01M6MWRPHXWYB38V08BZM8SSRE","forbotsake-sharpen","Stage 4.5: SHARPEN. Takes a specific outreach target (person or organization) and\nproduces a deep execution plan with contextual research, relationship mapping,\nangle selection, and a multi-touch sequence. Reads your founder profile and strategy\nto leverage warm paths and unfair advantages.\nUse when: \"refine this plan\", \"go deeper on this\", \"sharpen execution\",\n\"how do I approach [person]\", \"outreach to [person]\", \"target [person\u002Forg]\",\n\"approach [person]\", \"engage [org]\".\nProactively invoke when the user mentions approaching a specific person or\norganization as part of their marketing strategy.\nRequires: strategy.md (from \u002Fforbotsake-marketing-start).","https:\u002F\u002Fgithub.com\u002Fforbotsake\u002Fforbotsake\u002Fblob\u002Fmain\u002Fforbotsake-sharpen\u002FSKILL.md",[145,148,149],{"categoryNo":146,"categoryName":147,"taxonomyType":122,"taxonomyTypeDesc":123},"01JBSEEDCAT000000000000019","营销推广",{"categoryNo":120,"categoryName":121,"taxonomyType":122,"taxonomyTypeDesc":123},{"categoryNo":150,"categoryName":151,"taxonomyType":152,"taxonomyTypeDesc":153},"01JBSEEDCAT000000000000035","市场营销","PROFESSION","适用职业",[155,156,9,157,128,33,158,104,105,130,159,160,161,162,163,164,165,166,137,167],"sharpen","forbotsake sharpen","start","plan","selection","relationship","organization","refine","deeper","deep","leverage","paths","sequence",{"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":176,"publishedAt":37},"01M6MWRHXHECX1N4WNHBJJQKER","forbotsake-retro","Stage 9: MEASURE. Reviews what you published, analyzes performance data,\nand produces a retro report with evidence-based recommendations.\nTells you what to double down on, what to drop, and what to try next.\nUse when: \"what worked\", \"marketing retro\", \"measure results\", \"review performance\",\n\"which content performed best\", \"should I keep doing this\".\nProactively invoke one week after \u002Fforbotsake-publish was last run.","https:\u002F\u002Fgithub.com\u002Fforbotsake\u002Fforbotsake\u002Fblob\u002Fmain\u002Fforbotsake-retro\u002FSKILL.md",[174,175],{"categoryNo":146,"categoryName":147,"taxonomyType":122,"taxonomyTypeDesc":123},{"categoryNo":150,"categoryName":151,"taxonomyType":152,"taxonomyTypeDesc":153},[177,178,9,179,180,181,182,183,33,184,104,105,130,185,186,187,23,188,189,190],"retro","forbotsake retro","review","performance","run","publish","data","marketing","next","drop","recommendations","reviews","which","what worked",{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":195,"categories":196,"keywords":209,"publishedAt":37},"01M6MWRB8GN0AZTEVTQD1GBA8K","forbotsake-publish","Stage 8: SHIP. Two modes: POST (auto-post via Claude for Chrome) or COPY\n(format for copy-paste). Handles X\u002FTwitter threads, LinkedIn posts, blog posts,\nand more. Logs everything for retrospective analysis.\nFor auto-posting, the user needs the Claude for Chrome extension installed.\nWithout it, the skill falls back to COPY mode automatically.\nUse when: \"publish this\", \"format for twitter\", \"post to X\", \"ship this content\",\n\"format for blog\", \"send this email\", \"ready to publish\", \"auto-post\",\n\"post this to X\", \"publish to LinkedIn\".\nProactively invoke when the user has content in content\u002F and says they want to ship it.","https:\u002F\u002Fgithub.com\u002Fforbotsake\u002Fforbotsake\u002Fblob\u002Fmain\u002Fforbotsake-publish\u002FSKILL.md",[197,200,203,206],{"categoryNo":198,"categoryName":199,"taxonomyType":122,"taxonomyTypeDesc":123},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":201,"categoryName":202,"taxonomyType":122,"taxonomyTypeDesc":123},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":204,"categoryName":205,"taxonomyType":122,"taxonomyTypeDesc":123},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":207,"categoryName":208,"taxonomyType":152,"taxonomyTypeDesc":153},"01JBSEEDCAT000000000000036","内容创作者",[182,210,9,211,212,213,214,215,216,104,105,130,217,218,219,220,221,222,223,224],"forbotsake publish","MCP","image","create","logs","ship","text","context","auto","ready","chrome extension","posts","paste","mode","send",{"skillNo":226,"name":227,"nameZh":6,"description":228,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":229,"categories":230,"keywords":233,"publishedAt":37},"01M6MWR5K98QN9BDH4179Y47F0","forbotsake-marketing-start","The starting point for marketing your product. Reads your codebase to understand\nwhat you built, asks 5 hard questions about positioning, audience, and channels,\nthen produces strategy.md with your marketing strategy and first concrete move.\nUse when: \"how should I market this\", \"go-to-market\", \"GTM\", \"positioning\",\n\"I don't know how to sell this\", \"help me market\", \"marketing strategy\".\nProactively invoke when the user asks about marketing, growth, or getting users\nand no strategy.md exists yet.","https:\u002F\u002Fgithub.com\u002Fforbotsake\u002Fforbotsake\u002Fblob\u002Fmain\u002Fforbotsake-marketing-start\u002FSKILL.md",[231,232],{"categoryNo":146,"categoryName":147,"taxonomyType":122,"taxonomyTypeDesc":123},{"categoryNo":150,"categoryName":151,"taxonomyType":152,"taxonomyTypeDesc":153},[157,184,234,9,235,236,128,33,104,105,130,237,131,238,134,239,240,23,137,21],"forbotsake marketing start","go","product","me","gtm","go-to-market","move"]