[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71S80EZAXVA495BD6B4D795":3,"skill-same:01M71S80EZAXVA495BD6B4D795":119},{"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":18,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":66,"commitSha":67,"skillDirectory":68,"forksCount":69,"repositoryHtmlUrl":70,"repositoryHomepageUrl":71,"ownerHtmlUrl":72,"ownerBlogUrl":73,"ownerDescription":74,"updatedAt":75,"install":76,"resources":88},"01M71S80EZAXVA495BD6B4D795","cleanup",null,"Clean up after completed or abandoned orc sessions — removes workspace state, registry entry, git worktree, and optionally the merged branch. Destructive; always previews and asks first. Workspace-aware.","HigorAlves\u002Forc","HigorAlves","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F11262976?v=4","01M71S79EZEMHZ8PQSV0XQJHYY","Higor Alves","01M71S79FKKTCHCN1EDR8DSTWQ",7,"MIT","https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Fcodex\u002Forc\u002Fcontent\u002Fskills\u002Fcleanup\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"parse","docker compose","dry","clean","log","up","auto","edit","write","read","question","ask","branch","gh pr","git worktree","Bash","worktree","git","run","2026-11-10 13:02:02",false,"---\nname: cleanup\ndescription: Clean up after completed or abandoned orc sessions — removes workspace state, registry entry, git worktree, and optionally the merged branch. Destructive; always previews and asks first. Workspace-aware.\nargument-hint: \"[--auto[=guided|full]] [--dry-run] [--all-completed] [--per-repo] [--down-volumes] [\u003Csession-id-or-branch>]\"\ndisable-model-invocation: true\nallowed-tools:\n  - Bash(orc-state:*)\n  - Read\n  - Write\n  - Edit\n  - Glob\n  - Grep\n  - the available user-question tool (or ask in chat)\n  - Bash(git worktree:*)\n  - Bash(git branch:*)\n  - Bash(git rev-parse:*)\n  - Bash(git status:*)\n  - Bash(git log:*)\n  - Bash(gh pr view:*)\n  - Bash(rm -rf .orc:*)\n  - Bash(jq:*)\n  - Bash(orc-workspace-detect:*)\n  - Bash(orc-docker-env:*)\n  - Bash(docker compose:*)\n  - Bash(kill:*)\n  - Bash(ps:*)\n---\n\n# $orc-cleanup\n\nClose the loop on finished orc work: remove the workspace state, the worktree and, when safe, the local feature branch.\n\n## Arguments\n\n- `--auto[=guided|full]` — autopilot level for this run; overrides `interaction_policy`. Ladder and hard-outward exemption: `orc-gates` §6.\n- `\u003Csession-id-or-branch>` — optional. Clean exactly one session, by `sessionId` (`orc-state sessions`, schema `orc-state-protocol`) or branch name, sanitized or raw.\n- `--all-completed` — clean every session whose `status` is `completed` or `abandoned`. Every safety check still applies per session.\n- `--dry-run` — print what would happen; change nothing. Recommended for the first run.\n- `--per-repo` — workspace mode: clean each linked repo as its PR merges. Use only when abandoning some repos (rare).\n- `--down-volumes` — also remove a torn-down environment's named volumes. Default keeps them: the next boot reuses DB data.\n\nNOTE: at `guided` or `full`, the standard plan (state dir, clean worktree, merged branch) auto-applies after printing. Anomalies still gate at every level: partial workspace merges, unmerged branches, a dirty worktree.\n\n## Preconditions\n\n> **🛑 Destructive run**\n>\n> P6 removes state directories, worktrees and local branches. The P5 preview gate is mandatory; `--dry-run` never applies.\n\n- Running from inside a candidate worktree stops the run in P1: `cd` to the main repo first.\n- In workspace mode, an open linked PR refuses the run unless `--per-repo` or the session is `abandoned`.\n- Typical moments: a shipped PR merged; `$orc-status` shows stale `completed` sessions; an abandoned feature (mark the session `abandoned` first).\n\n## Phases\n\nModules live beside this file under `references\u002F` (ADR 0008 pilot). Entering a phase, Read exactly its module, per the `orc-phases` protocol.\n\n| Phase | Module | Skipped when |\n|---|---|---|\n| 0 Detect context | resident, below | never |\n| 1 Guard: not inside a candidate | `orc-cleanup\u002FP1` | never |\n| 2 Read the registry | `orc-cleanup\u002FP2` | never |\n| 3 Build the candidate list | `orc-cleanup\u002FP3` | never |\n| 4 Inspect each candidate | `orc-cleanup\u002FP4` | never |\n| 5 Preview the plan, then confirm | `orc-cleanup\u002FP5` | never; `--dry-run` stops here |\n| 6 Apply with safety gates | `orc-cleanup\u002FP6` | `--dry-run`, Cancel |\n| 7 Report | `orc-cleanup\u002FP7` | `--dry-run` |\n\n### Phase 0 — Detect context\n\nRun `orc-workspace-detect --banner` in the working repository and read its output before continuing.\n\n1. Read the banner above; it exports `ORC_*` vars. Do not re-run detection.\n2. In workspace mode, note the registry for P2: `${ORC_STATE_DIR}\u002Forc.json`.\n3. In workspace mode, before P4, fetch the merge state of each candidate's linked PRs.\n4. If any linked PR is not `MERGED`, refuse and list the open PRs.\n\n```bash\nfor url in $(jq -r '.sessions[] | select(.sessionId == \"'$ID'\") | .linkedPRs[].url' \"$ORC_STATE_DIR\u002Forc.json\"); do\n  gh pr view \"$url\" --json state -q .state\ndone\n```\n\nNOTE: workspace sessions carry `scope: \"workspace\"` and a `repos` array. After a refusal the user either waits, passes `--per-repo` to clean only the merged repos, or marks the session `abandoned` to bypass the merge check.\n\n## Iron rules\n\n- Never pass `--force` to `git worktree remove`. A dirty worktree holds user work: skip it and say so.\n- Never run `git branch -D`. Only `-d`, which refuses unmerged branches. The user runs `-D` by hand.\n- Never delete while running from inside a candidate. Refuse and name where to `cd`.\n- `.orc\u002Forc.json` updates are atomic: Read, modify in memory, Write the whole file. Never partial.\n- `--dry-run` always prints the plan and exits, even after a confirming answer in the gate.\n- A stack member at position N is deletable only when positions 1..N-1 are all `MERGED`. `--per-repo` bypasses, with consent.\n- Never `docker compose down` a project without the `orc-` prefix. Orphans appear in the preview; the user opts into each one.\n- Named volumes survive by default; only `--down-volumes` removes them. DB data is user work.\n\n## Output\n\n- `.orc\u002Forc.json` with the cleaned entries removed.\n- `.orc\u002F\u003Cbranch>\u002F` directories removed.\n- Worktrees removed where clean; local branches deleted where merged.\n- A plain fenced summary (P7) with everything left undone and why.\n","# $orc-cleanup\n\nClose the loop on finished orc work: remove the workspace state, the worktree and, when safe, the local feature branch.\n\n## Arguments\n\n- `--auto[=guided|full]` — autopilot level for this run; overrides `interaction_policy`. Ladder and hard-outward exemption: `orc-gates` §6.\n- `\u003Csession-id-or-branch>` — optional. Clean exactly one session, by `sessionId` (`orc-state sessions`, schema `orc-state-protocol`) or branch name, sanitized or raw.\n- `--all-completed` — clean every session whose `status` is `completed` or `abandoned`. Every safety check still applies per session.\n- `--dry-run` — print what would happen; change nothing. Recommended for the first run.\n- `--per-repo` — workspace mode: clean each linked repo as its PR merges. Use only when abandoning some repos (rare).\n- `--down-volumes` — also remove a torn-down environment's named volumes. Default keeps them: the next boot reuses DB data.\n\nNOTE: at `guided` or `full`, the standard plan (state dir, clean worktree, merged branch) auto-applies after printing. Anomalies still gate at every level: partial workspace merges, unmerged branches, a dirty worktree.\n\n## Preconditions\n\n> **🛑 Destructive run**\n>\n> P6 removes state directories, worktrees and local branches. The P5 preview gate is mandatory; `--dry-run` never applies.\n\n- Running from inside a candidate worktree stops the run in P1: `cd` to the main repo first.\n- In workspace mode, an open linked PR refuses the run unless `--per-repo` or the session is `abandoned`.\n- Typical moments: a shipped PR merged; `$orc-status` shows stale `completed` sessions; an abandoned feature (mark the session `abandoned` first).\n\n## Phases\n\nModules live beside this file under `references\u002F` (ADR 0008 pilot). Entering a phase, Read exactly its module, per the `orc-phases` protocol.\n\n| Phase | Module | Skipped when |\n|---|---|---|\n| 0 Detect context | resident, below | never |\n| 1 Guard: not inside a candidate | `orc-cleanup\u002FP1` | never |\n| 2 Read the registry | `orc-cleanup\u002FP2` | never |\n| 3 Build the candidate list | `orc-cleanup\u002FP3` | never |\n| 4 Inspect each candidate | `orc-cleanup\u002FP4` | never |\n| 5 Preview the plan, then confirm | `orc-cleanup\u002FP5` | never; `--dry-run` stops here |\n| 6 Apply with safety gates | `orc-cleanup\u002FP6` | `--dry-run`, Cancel |\n| 7 Report | `orc-cleanup\u002FP7` | `--dry-run` |\n\n### Phase 0 — Detect context\n\nRun `orc-workspace-detect --banner` in the working repository and read its output before continuing.\n\n1. Read the banner above; it exports `ORC_*` vars. Do not re-run detection.\n2. In workspace mode, note the registry for P2: `${ORC_STATE_DIR}\u002Forc.json`.\n3. In workspace mode, before P4, fetch the merge state of each candidate's linked PRs.\n4. If any linked PR is not `MERGED`, refuse and list the open PRs.\n\n```bash\nfor url in $(jq -r '.sessions[] | select(.sessionId == \"'$ID'\") | .linkedPRs[].url' \"$ORC_STATE_DIR\u002Forc.json\"); do\n  gh pr view \"$url\" --json state -q .state\ndone\n```\n\nNOTE: workspace sessions carry `scope: \"workspace\"` and a `repos` array. After a refusal the user either waits, passes `--per-repo` to clean only the merged repos, or marks the session `abandoned` to bypass the merge check.\n\n## Iron rules\n\n- Never pass `--force` to `git worktree remove`. A dirty worktree holds user work: skip it and say so.\n- Never run `git branch -D`. Only `-d`, which refuses unmerged branches. The user runs `-D` by hand.\n- Never delete while running from inside a candidate. Refuse and name where to `cd`.\n- `.orc\u002Forc.json` updates are atomic: Read, modify in memory, Write the whole file. Never partial.\n- `--dry-run` always prints the plan and exits, even after a confirming answer in the gate.\n- A stack member at position N is deletable only when positions 1..N-1 are all `MERGED`. `--per-repo` bypasses, with consent.\n- Never `docker compose down` a project without the `orc-` prefix. Orphans appear in the preview; the user opts into each one.\n- Named volumes survive by default; only `--down-volumes` removes them. DB data is user work.\n\n## Output\n\n- `.orc\u002Forc.json` with the cleaned entries removed.\n- `.orc\u002F\u003Cbranch>\u002F` directories removed.\n- Worktrees removed where clean; local branches deleted where merged.\n- A plain fenced summary (P7) with everything left undone and why.\n",{"name":5,"description":7,"allowed-tools":43,"argument-hint":64,"disable-model-invocation":65},[44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63],"Bash(orc-state:*)","Read","Write","Edit","Glob","Grep","the available user-question tool (or ask in chat)","Bash(git worktree:*)","Bash(git branch:*)","Bash(git rev-parse:*)","Bash(git status:*)","Bash(git log:*)","Bash(gh pr view:*)","Bash(rm -rf .orc:*)","Bash(jq:*)","Bash(orc-workspace-detect:*)","Bash(orc-docker-env:*)","Bash(docker compose:*)","Bash(kill:*)","Bash(ps:*)","[--auto[=guided|full]] [--dry-run] [--all-completed] [--per-repo] [--down-volumes] [\u003Csession-id-or-branch>]",true,"main","7522fd7266944e30052204c2f6df287d8b5516be","codex\u002Forc\u002Fcontent\u002Fskills\u002Fcleanup",0,"https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc","https:\u002F\u002Forc.novacstack.com\u002F","https:\u002F\u002Fgithub.com\u002FHigorAlves","higoralves.dev","Software Engineering","2026-11-07 07:26:38",{"source":8,"skillName":5,"commands":77,"prompt":87,"zipAvailable":65},[78,81,84],{"tool":79,"command":80},"npx","npx skills add HigorAlves\u002Forc --skill cleanup",{"tool":82,"command":83},"bunx","bunx skills add HigorAlves\u002Forc --skill cleanup",{"tool":85,"command":86},"pnpm","pnpm dlx skills add HigorAlves\u002Forc --skill cleanup","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Fcodex\u002Forc\u002Fcontent\u002Fskills\u002Fcleanup\u002FSKILL.md",[89,95,99,103,107,111,115],{"path":90,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":93,"sourceHtmlUrl":94},"references\u002FPHASE-1-GUARD.md","REFERENCE","参考文档",506,"https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Fcodex\u002Forc\u002Fcontent\u002Fskills\u002Fcleanup\u002Freferences\u002FPHASE-1-GUARD.md",{"path":96,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":97,"sourceHtmlUrl":98},"references\u002FPHASE-2-REGISTRY.md",399,"https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Fcodex\u002Forc\u002Fcontent\u002Fskills\u002Fcleanup\u002Freferences\u002FPHASE-2-REGISTRY.md",{"path":100,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":101,"sourceHtmlUrl":102},"references\u002FPHASE-3-CANDIDATES.md",825,"https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Fcodex\u002Forc\u002Fcontent\u002Fskills\u002Fcleanup\u002Freferences\u002FPHASE-3-CANDIDATES.md",{"path":104,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":105,"sourceHtmlUrl":106},"references\u002FPHASE-4-INSPECT.md",2534,"https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Fcodex\u002Forc\u002Fcontent\u002Fskills\u002Fcleanup\u002Freferences\u002FPHASE-4-INSPECT.md",{"path":108,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":109,"sourceHtmlUrl":110},"references\u002FPHASE-5-PLAN.md",2366,"https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Fcodex\u002Forc\u002Fcontent\u002Fskills\u002Fcleanup\u002Freferences\u002FPHASE-5-PLAN.md",{"path":112,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":113,"sourceHtmlUrl":114},"references\u002FPHASE-6-APPLY.md",2842,"https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Fcodex\u002Forc\u002Fcontent\u002Fskills\u002Fcleanup\u002Freferences\u002FPHASE-6-APPLY.md",{"path":116,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":117,"sourceHtmlUrl":118},"references\u002FPHASE-7-REPORT.md",671,"https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Fcodex\u002Forc\u002Fcontent\u002Fskills\u002Fcleanup\u002Freferences\u002FPHASE-7-REPORT.md",[120,159,185,204,225,245],{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":139,"publishedAt":38},"01M71SW40F9TAAEDKBYYBCM814","writing-plans","Write a comprehensive implementation plan of bite-sized TDD tasks that an engineer with zero codebase context could execute — exact files, code, tests, and verification steps","https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Forc\u002Fskills\u002Fwriting-plans\u002FSKILL.md",[126,131,136],{"categoryNo":127,"categoryName":128,"taxonomyType":129,"taxonomyTypeDesc":130},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":132,"categoryName":133,"taxonomyType":134,"taxonomyTypeDesc":135},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":137,"categoryName":138,"taxonomyType":134,"taxonomyTypeDesc":135},"01JBSEEDCAT000000000000036","内容创作者",[140,141,142,143,144,145,146,147,148,149,150,151,152,27,153,154,155,156,157,158],"writing","writing plans","plans","engineer","superpowers","implementation plan","files","when","you","code","tasks","verification","plan","steps","context","ZeRO","for","tests","use",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":170,"publishedAt":38},"01M71SW15KHE4MHJW9NEXV65X2","writing-for-agents","orc's doctrine layer for writing any document an agent consumes — skills, AGENTS.md\u002FCLAUDE.md, reference docs","https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Forc\u002Fskills\u002Fwriting-for-agents\u002FSKILL.md",[165,166,169],{"categoryNo":127,"categoryName":128,"taxonomyType":129,"taxonomyTypeDesc":130},{"categoryNo":167,"categoryName":168,"taxonomyType":129,"taxonomyTypeDesc":130},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":137,"categoryName":138,"taxonomyType":134,"taxonomyTypeDesc":135},[171,140,156,172,147,173,174,175,176,177,178,179,158,180,181,182,183,184],"writing for agents","matt pocock","inline","tuning","a skill","layer","doctrine","push","editing","document","github","https","reference","docs",{"skillNo":186,"name":187,"nameZh":6,"description":188,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":189,"categories":190,"keywords":192,"publishedAt":38},"01M71SVYQKXT743HHHWGHT3G13","workspace-mode","Use when cwd is a parent dir holding multiple sibling git repos — defines repo auto-detection, --repos\u002F--repo\u002F--all-repos\u002F--this-repo precedence, per-repo dispatch, and linked-PR mechanics.","https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Forc\u002Fskills\u002Fworkspace-mode\u002FSKILL.md",[191],{"categoryNo":167,"categoryName":168,"taxonomyType":129,"taxonomyTypeDesc":130},[193,194,195,196,25,147,197,36,198,199,158,200,201,202,203],"workspace mode","mode","workspace","mechanics","repos","pr","repo","dispatch","auto-detection","detection","parent",{"skillNo":205,"name":206,"nameZh":6,"description":207,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":208,"categories":209,"keywords":211,"publishedAt":38},"01M71SVVP3BXS06G9395P2K0RH","wizard","Generate an interactive bash wizard walking a human through work only they can perform — credentials, secrets, one-off migrations","https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Forc\u002Fskills\u002Fwizard\u002FSKILL.md",[210],{"categoryNo":167,"categoryName":168,"taxonomyType":129,"taxonomyTypeDesc":130},[206,212,213,214,215,172,147,34,216,217,218,219,220,153,221,222,156,158,223,224],"condition","never","provisioning infrastructure","only","work","credentials","generate","human","secrets","infrastructure","do","one","interactive",{"skillNo":226,"name":227,"nameZh":6,"description":228,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":229,"categories":230,"keywords":231,"publishedAt":38},"01M71SVT4AR6NKAM5B077E7QSJ","wait-what","Stop and re-pitch — the last message did not land; say it again simply, in the project's own vocabulary.","https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Forc\u002Fskills\u002Fwait-what\u002FSKILL.md",[],[232,233,234,235,236,172,237,238,239,240,181,182,241,242,243,244],"wait what","wait","project","re","true","pitch","last","say","message","land","it","stop","vocabulary",{"skillNo":246,"name":247,"nameZh":6,"description":248,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":249,"categories":250,"keywords":255,"publishedAt":38},"01M71SVQVYRA9QBQ6G8MWR8G6F","vitest","Vitest fast unit testing framework powered by Vite with Jest-compatible API","https:\u002F\u002Fgithub.com\u002FHigorAlves\u002Forc\u002Fblob\u002Fmain\u002Forc\u002Fskills\u002Fvitest\u002FSKILL.md",[251,254],{"categoryNo":252,"categoryName":253,"taxonomyType":129,"taxonomyTypeDesc":130},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":132,"categoryName":133,"taxonomyType":134,"taxonomyTypeDesc":135},[247,256,257,258,259,260,140,147,261,262,263,264,265,266,267,268,269,270,157,271],"coverage","unit","testing","testing framework","generated","api","jest","2026","at","scripts","unit testing","antfu","framework","vite","mocking","dev"]