[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71MVGP02E5QF3RG8TAZNH93":3,"skill-same:01M71MVGP02E5QF3RG8TAZNH93":72},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":56,"ownerDescription":6,"updatedAt":57,"install":58,"resources":71},"01M71MVGP02E5QF3RG8TAZNH93","testing-gate",null,"Required verification per change type for ApplyPack (pure module → unit test, fetcher → smoke run, schema → hand-written migration, dashboard → rebuild + screenshot). Read before implementing any feature and before every commit.","applypack\u002Fapplypack","applypack","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F323661273?v=4","01M71MTCGWDKJ7EXW015KCSM5Z","ApplyPack","01M71MTCHJ3VRWDNDAEAARMD1Q",32,"MIT","https:\u002F\u002Fgithub.com\u002Fapplypack\u002Fapplypack\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftesting-gate\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"testing gate","gate","testing","fetcher","unit test","for","implementing","hand","unit","module","feature","rebuild","smoke","read","screenshot","verification","run","commit","change","dashboard","2026-11-10 10:56:23",false,"---\nname: testing-gate\ndescription: Required verification per change type for ApplyPack (pure module → unit test, fetcher → smoke run, schema → hand-written migration, dashboard → rebuild + screenshot). Read before implementing any feature and before every commit.\n---\n\n# Testing Gate\n\nVerification ships in the same commit as the behaviour. The repo has two\nkinds of code and they are verified differently — see CLAUDE.md \"Testing\".\n\n## Required verification by change type\n\n| Change | Required |\n|---|---|\n| Pure logic (filter, text-utils, parsers, mappers, format helpers) | `*.test.ts` next to the source, `node:test` + `assert\u002Fstrict` |\n| New fetcher \u002F ATS source | Pure `mapXFeed` mapper + unit test; then `npm run fetch:once` smoke against the real endpoint (or `docker compose exec app node dist\u002Fscripts\u002Ffetch-once.js`) |\n| Classifier prompt or parser | Parser test (`parsePrefilterResponse`, `parseClaudeCodeOutput` pattern); smoke one real classification via the once-script |\n| AI provider | `ai-provider-parse.test.ts` for output parsing; one live `complete()` smoke per provider before commit |\n| Prisma schema | Hand-written migration under `prisma\u002Fmigrations\u002F` (CLAUDE.md gotcha 7 — host `migrate dev` P1010s); `npx prisma format` after the edit — CI runs `prisma format --check` and a new field that widens a column realigns the whole block; verify with `docker compose build app && up -d app` and read init logs |\n| Settings toggle | Column → `settings.ts` getter\u002Fsetter → page → route, all in one commit; click it in the dashboard |\n| Dashboard page \u002F primitive | `npm run lint:types`; `docker compose build web && up -d web`; curl every route for 200; screenshot at 1200px, 768px and 375px with the playwright plugin; browser console has 0 errors |\n| Telegram formatting | `notifier.test.ts` for escaping; `npm run test:telegram` for a real send |\n\n## Commands\n\n```\nnpm run lint:types                 # every commit\nnpm test                           # every commit (pure modules only)\nnpx prisma format --check          # after any schema edit (CI gates on it)\nnpm run build                      # before a web\u002Fapp container rebuild\nAPPLYPACK_DATA_DIR=\u002Ftmp\u002Fap WEB_PORT=4848 APPLYPACK_NO_OPEN=1 npm start   # the local install, on a scratch data folder\ndocker compose build web && docker compose up -d web   # dashboard changes\ndocker compose build app && docker compose up -d app   # worker changes\ndocker compose logs -f app         # watch a tick\n```\n\nThere is no e2e suite and no axe run — modules that touch Prisma or the\nAnthropic SDK are verified by smoke runs and by using the dashboard.\n\n## Honesty rule\n\nNever weaken or skip a failing test to go green. A failing test is\ninformation: fix the code or fix the wrong expectation, and say which in\nthe commit body. Report a skipped smoke run as skipped.\n","# Testing Gate\n\nVerification ships in the same commit as the behaviour. The repo has two\nkinds of code and they are verified differently — see CLAUDE.md \"Testing\".\n\n## Required verification by change type\n\n| Change | Required |\n|---|---|\n| Pure logic (filter, text-utils, parsers, mappers, format helpers) | `*.test.ts` next to the source, `node:test` + `assert\u002Fstrict` |\n| New fetcher \u002F ATS source | Pure `mapXFeed` mapper + unit test; then `npm run fetch:once` smoke against the real endpoint (or `docker compose exec app node dist\u002Fscripts\u002Ffetch-once.js`) |\n| Classifier prompt or parser | Parser test (`parsePrefilterResponse`, `parseClaudeCodeOutput` pattern); smoke one real classification via the once-script |\n| AI provider | `ai-provider-parse.test.ts` for output parsing; one live `complete()` smoke per provider before commit |\n| Prisma schema | Hand-written migration under `prisma\u002Fmigrations\u002F` (CLAUDE.md gotcha 7 — host `migrate dev` P1010s); `npx prisma format` after the edit — CI runs `prisma format --check` and a new field that widens a column realigns the whole block; verify with `docker compose build app && up -d app` and read init logs |\n| Settings toggle | Column → `settings.ts` getter\u002Fsetter → page → route, all in one commit; click it in the dashboard |\n| Dashboard page \u002F primitive | `npm run lint:types`; `docker compose build web && up -d web`; curl every route for 200; screenshot at 1200px, 768px and 375px with the playwright plugin; browser console has 0 errors |\n| Telegram formatting | `notifier.test.ts` for escaping; `npm run test:telegram` for a real send |\n\n## Commands\n\n```\nnpm run lint:types                 # every commit\nnpm test                           # every commit (pure modules only)\nnpx prisma format --check          # after any schema edit (CI gates on it)\nnpm run build                      # before a web\u002Fapp container rebuild\nAPPLYPACK_DATA_DIR=\u002Ftmp\u002Fap WEB_PORT=4848 APPLYPACK_NO_OPEN=1 npm start   # the local install, on a scratch data folder\ndocker compose build web && docker compose up -d web   # dashboard changes\ndocker compose build app && docker compose up -d app   # worker changes\ndocker compose logs -f app         # watch a tick\n```\n\nThere is no e2e suite and no axe run — modules that touch Prisma or the\nAnthropic SDK are verified by smoke runs and by using the dashboard.\n\n## Honesty rule\n\nNever weaken or skip a failing test to go green. A failing test is\ninformation: fix the code or fix the wrong expectation, and say which in\nthe commit body. Report a skipped smoke run as skipped.\n",{"name":5,"description":7},"main","bb5ed6f9e0ddbf410b1e9a4559f500f246c1677c",".claude\u002Fskills\u002Ftesting-gate",11,"https:\u002F\u002Fgithub.com\u002Fapplypack\u002Fapplypack","https:\u002F\u002Fapplypack.dev","https:\u002F\u002Fgithub.com\u002Fapplypack","https:\u002F\u002Fwww.applypack.dev\u002F","2026-11-10 00:46:54",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add applypack\u002Fapplypack --skill testing-gate",{"tool":64,"command":65},"bunx","bunx skills add applypack\u002Fapplypack --skill testing-gate",{"tool":67,"command":68},"pnpm","pnpm dlx skills add applypack\u002Fapplypack --skill testing-gate","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fapplypack\u002Fapplypack\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftesting-gate\u002FSKILL.md",true,[],[73,97,122,149,166,190],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":44},"01M71MVP13VV4T7N1D9019K27P","wizard","Generate an interactive bash wizard that walks a human through steps only they can perform. Use when provisioning infrastructure, setting up credentials or CI secrets, walking an unfamiliar third-party dashboard, or running a one-off migration or cutover. Don't invoke this for steps the agent can perform itself.","https:\u002F\u002Fgithub.com\u002Fapplypack\u002Fapplypack\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwizard\u002FSKILL.md",[],[75,80,81,82,83,84,85,86,87,43,88,89,90,91,92,93,94,29,95,96],"up","ci","provisioning infrastructure","only","invoke","when","Bash","credentials","generate","human","secrets","steps","infrastructure","running","setting","use","one",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":108,"publishedAt":44},"01M71MVKNGWANA0EEWE4GXNFPY","ui-review","Senior UI\u002FUX review of an ApplyPack dashboard page, screenshot, or primitive. Use when asked to critique, audit, or find improvements in the dashboard. Produces prioritized findings, never code.","https:\u002F\u002Fgithub.com\u002Fapplypack\u002Fapplypack\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fui-review\u002FSKILL.md",[103],{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[109,110,111,112,85,113,114,43,115,116,117,118,38,119,120,95,121],"review","ui","ui review","never","code","ui\u002Fux","critique","senior","audit","ux","ux review","page","find",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":134,"publishedAt":44},"01M71MVESMK8EWKVQ3G5EHBS1C","stop-slop","Remove AI writing patterns from prose. Use when drafting, editing, or reviewing text to eliminate predictable AI tells.","https:\u002F\u002Fgithub.com\u002Fapplypack\u002Fapplypack\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fstop-slop\u002FSKILL.md",[128,131],{"categoryNo":129,"categoryName":130,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":132,"categoryName":133,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000036","内容创作者",[135,136,137,29,138,139,140,95,85,141,142,143,144,145,146,147,148],"slop","stop slop","stop","remove","editing","writing","drafting","text","https","ai tells","drafts","prose","patterns","content",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":44},"01M71MVCHADA18SPKG8G4VFN35","resolving-merge-conflicts","Use when you need to resolve an in-progress git merge\u002Frebase conflict.","https:\u002F\u002Fgithub.com\u002Fapplypack\u002Fapplypack\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fresolving-merge-conflicts\u002FSKILL.md",[],[156,157,158,159,160,95,85,161,162,163,164,165],"merge conflicts","conflicts","resolving merge conflicts","merge","conflict","git merge","you","progress","git","rebase",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":170,"categories":171,"keywords":172,"publishedAt":44},"01M71MVA895X32BXCMNXH8K1N6","release-discipline","Tag and GitHub-release rules for this repository — when a merge gets a version tag, how releases stay in parity with tags, and the release-notes format. Read after every PR merge, before tagging, and at the start of a new stage (parity check).","https:\u002F\u002Fgithub.com\u002Fapplypack\u002Fapplypack\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Frelease-discipline\u002FSKILL.md",[],[173,174,175,176,177,178,85,179,180,181,182,159,183,37,184,185,186,187,188,189],"release discipline","discipline","release","release-notes","pr merge","new","notes","releases","how","tagging","at","repository","notes format","start","parity","parity check","pr",{"skillNo":191,"name":192,"nameZh":6,"description":193,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":194,"categories":195,"keywords":199,"publishedAt":44},"01M71MV8G1QFG0TR0TRBBVMTG5","improve-codebase-architecture","Scan a codebase for deepening opportunities, present them as a visual HTML report, then grill through whichever one you pick.","https:\u002F\u002Fgithub.com\u002Fapplypack\u002Fapplypack\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fimprove-codebase-architecture\u002FSKILL.md",[196],{"categoryNo":197,"categoryName":198,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[200,201,202,203,204,29,205,206,207,208,162,209,96,210,211,212,213,214],"improve","architecture","improve codebase architecture","codebase","as","scan","pick","html report","true","visual","grill","report","deepening","present","html"]