[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CS44T7A23T8PRVEF61ERED":3,"skill-same:01M6CS44T7A23T8PRVEF61ERED":67},{"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":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":50,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M6CS44T7A23T8PRVEF61ERED","browser-use",null,"Read before first use of the browser tool in a session. Covers browser selection workflow (list → pick → connect), when to use headless vs operator browser, how to guide the OPERATOR to expose their browser with `ghost browsers serve`, tab management, element refs, and web_fetch session sharing.","mrtolkien\u002FGHOST","mrtolkien","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F8489650?v=4","01M6CS32Q934XBQQE8BDV5Z6W2","Tolki","01M6CS32VBCD47F5E27WF9W6FC",5,"MIT","https:\u002F\u002Fgithub.com\u002Fmrtolkien\u002FGHOST\u002Fblob\u002Fmain\u002Fassets\u002Fskills\u002Fbrowser-use\u002Fskill.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"use","browser","browser use","pick","selection","guide","session","fetch","management","list","read","workflow","tool","ghost","how","first","sharing","operator","connect","web","2026-11-10 10:12:30",false,"---\nname: browser-use\ndescription:\n  Read before first use of the browser tool in a session. Covers browser selection\n  workflow (list → pick → connect), when to use headless vs operator browser, how to\n  guide the OPERATOR to expose their browser with `ghost browsers serve`, tab\n  management, element refs, and web_fetch session sharing.\n---\n\n# Browser Use\n\nThe `browser` tool lets you control web browsers via Chrome DevTools Protocol (CDP). You\ncan manage multiple browsers (headless sidecar, operator's Chrome, remote instances) and\nmultiple tabs per browser.\n\n## Browser Selection (do this first)\n\nEvery browser session starts with picking the right browser.\n\n### 1. List configured browsers\n\nUse the `browsers` action to see what's already registered. This shows configured\nbrowsers and their connection status — it does not scan the network.\n\n### 2. Pick the right browser\n\n| Task                                                                    | Browser    |\n| ----------------------------------------------------------------------- | ---------- |\n| Autonomous web scraping, reading public pages                           | `headless` |\n| Anything the OPERATOR needs to see or interact with (auth, demos, etc.) | `operator` |\n| Login-gated sites where you have credentials                            | Either     |\n| OAuth, SSO, CAPTCHA, MFA, or \"log in for me\"                            | `operator` |\n\nIf a suitable browser is listed, `connect` to it by name and proceed.\n\n### 3. If no suitable browser exists\n\n- **Need headless**: use `discover` to scan for CDP endpoints on localhost and Tailscale\n  peers. If found, `connect` to it.\n- **Need operator browser**: guide the OPERATOR through setup (see below). Do not use\n  `discover` hoping to find it — if it's not in the list, it's not set up.\n\n### When to ask vs assume\n\n- One browser configured, task doesn't require operator visibility → just use it.\n- Multiple browsers, task could go either way → ask which one.\n- Task clearly requires one type (\"show me\" → operator, \"scrape this\" → headless) → pick\n  it without asking.\n\n## Setting Up the OPERATOR's Browser\n\nWhen the task requires a browser the OPERATOR can see and interact with (auth flows,\ndemos, supervised browsing), guide them through this setup.\n\n### On the OPERATOR's machine\n\nTell the OPERATOR to run:\n\n```\nghost browsers serve\n```\n\nThis command finds a Chromium-based browser, starts it with a dedicated profile\n(`~\u002F.config\u002Fghost\u002Fbrowser-profile`), and creates a TCP relay on their Tailscale IP so\nthe GHOST machine can reach it. It prints the exact `ghost browsers add` command to run\non the GHOST machine.\n\nThe dedicated profile is separate from the OPERATOR's daily browser. This matters\nbecause CDP is unauthenticated — anything that can reach the port gets full browser\ncontrol. A dedicated profile keeps real passwords and sessions safe.\n\nThe profile is persistent — logins, cookies, and site data survive across restarts. The\nOPERATOR only needs to log in to services once.\n\nDo not tell the OPERATOR to use `--remote-debugging-address` directly — Chrome's\nhandling of that flag is unreliable across platforms. `ghost browsers serve` handles\nremote access correctly via a relay.\n\nOptions: `--port \u003CN>` (default 9222), `--bind \u003Cip>` (auto-detected), `--browser \u003Cpath>`,\n`--profile \u003Cdir>`.\n\n### On the GHOST machine\n\nAfter `ghost browsers serve` prints the connection info, the OPERATOR runs on the GHOST\nmachine:\n\n```\nghost browsers add operator ws:\u002F\u002F\u003Ctailscale-ip>:9222\nghost config reload\n```\n\nThe browser is now available by name across reboots.\n\n### Auth workflow\n\n1. Ask the OPERATOR to run `ghost browsers serve` on their machine.\n2. Wait for them to add the browser on the GHOST machine and reload config.\n3. `connect` to `\"operator\"` by name.\n4. Navigate to the login page. Use `snapshot` so the OPERATOR can see where you are.\n5. Hand off — ask the OPERATOR to complete auth in their browser window. Poll with\n   `snapshot` until you see the post-login page.\n6. Work in their authenticated session — navigate, fill forms, extract data.\n7. When done, `disconnect`. The OPERATOR can stop `ghost browsers serve` or leave it\n   running (the profile persists).\n\nFor username\u002Fpassword auth without OAuth\u002FMFA, ask the OPERATOR what they prefer — give\nyou the credentials to log in yourself, or do it in their visible browser.\n\n## Tab Management\n\n### Actions\n\n- `open` — open a new tab (optionally with a URL). Becomes the active tab. Returns a\n  snapshot.\n- `focus` — switch to a tab by ID. Returns a snapshot with fresh element refs.\n- `close` — close a tab by ID.\n- `tabs` — list open tabs in the active browser.\n\n### Active tab\n\nAll interaction actions (navigate, snapshot, click, type, etc.) operate on the **active\ntab**. `open` and `focus` change which tab is active.\n\n### Tab limit\n\nMaximum 5 tabs per browser. Close tabs you're done with first.\n\n### Element refs\n\nElement refs (e1, e2, ...) belong to the tab that produced them. When you `focus` a\ndifferent tab, the old refs are invalid — you get fresh refs from the auto-snapshot.\n\nNever use refs from a snapshot of Tab A to interact with Tab B. Always use refs from the\nmost recent snapshot.\n\n## Interaction Patterns\n\n### Comparing two pages\n\n```\n1. navigate to first page → snapshot → read content\n2. open second page → snapshot → read content\n3. focus tab 1 to go back → snapshot → compare\n```\n\n### Following links without losing context\n\n```\n1. snapshot current page, note the ref for the link\n2. open new tab (the link URL) instead of clicking\n3. When done, close the new tab and focus back\n```\n\nOr just click — if the link opens in a new tab (target=\\_blank), it's auto-detected and\nbecomes the active tab.\n\n### Form filling across pages\n\n```\n1. Tab 1: source page with data\n2. Tab 2: form to fill\n3. Read from tab 1, focus tab 2, fill fields\n```\n\n## web_fetch and Browser Sessions\n\n`web_fetch` and the browser tool **share the same Chrome session** when both point at\nthe same browser. This means:\n\n- Log in to a site via the browser tool (navigate, fill credentials, click submit)\n- Then use `web_fetch` to read pages on that site — it sees the authenticated cookies\n- Much faster than snapshot for reading long content-heavy pages\n\nThis works because `web_fetch` routes HTML pages through Crawl4AI, which connects to the\nsame Chrome instance via CDP and shares its cookie jar.\n\n| Scenario                                        | Tool               |\n| ----------------------------------------------- | ------------------ |\n| Simple page read (no auth)                      | `web_fetch`        |\n| Login-gated page (after logging in via browser) | `web_fetch`        |\n| Interactive work (forms, clicks, JS-heavy)      | `browser`          |\n| Need to see page structure\u002Felements             | `browser` snapshot |\n\n## Tool Actions Reference\n\n### Browser management\n\n| Action       | Parameters        | Returns                                      |\n| ------------ | ----------------- | -------------------------------------------- |\n| `browsers`   | —                 | List of configured browsers (no scan)        |\n| `connect`    | `name`, `cdp_url` | Connect + set active                         |\n| `disconnect` | `name`            | Disconnect browser                           |\n| `discover`   | —                 | Scan localhost + Tailscale for CDP endpoints |\n\n### Tab management\n\n| Action  | Parameters | Returns                 |\n| ------- | ---------- | ----------------------- |\n| `tabs`  | —          | Tab list                |\n| `open`  | `url?`     | Snapshot of new tab     |\n| `focus` | `tab`      | Snapshot of focused tab |\n| `close` | `tab`      | Confirmation            |\n\n### Interaction (operates on active tab)\n\n| Action       | Key parameters                   |\n| ------------ | -------------------------------- |\n| `navigate`   | `url`                            |\n| `snapshot`   | `offset?`                        |\n| `click`      | `ref`                            |\n| `type`       | `ref`, `text`                    |\n| `scroll`     | `direction`, `ref?`              |\n| `screenshot` | —                                |\n| `press`      | `key`                            |\n| `hover`      | `ref`                            |\n| `select`     | `ref`, `value`                   |\n| `fill`       | `fields` (array of {ref, value}) |\n| `wait`       | `ref?`, `timeout?`               |\n| `evaluate`   | `expression`                     |\n| `drag`       | `ref`, `target_ref`              |\n| `upload`     | `ref`, `path`                    |\n| `resize`     | `width`, `height`                |\n","# Browser Use\n\nThe `browser` tool lets you control web browsers via Chrome DevTools Protocol (CDP). You\ncan manage multiple browsers (headless sidecar, operator's Chrome, remote instances) and\nmultiple tabs per browser.\n\n## Browser Selection (do this first)\n\nEvery browser session starts with picking the right browser.\n\n### 1. List configured browsers\n\nUse the `browsers` action to see what's already registered. This shows configured\nbrowsers and their connection status — it does not scan the network.\n\n### 2. Pick the right browser\n\n| Task                                                                    | Browser    |\n| ----------------------------------------------------------------------- | ---------- |\n| Autonomous web scraping, reading public pages                           | `headless` |\n| Anything the OPERATOR needs to see or interact with (auth, demos, etc.) | `operator` |\n| Login-gated sites where you have credentials                            | Either     |\n| OAuth, SSO, CAPTCHA, MFA, or \"log in for me\"                            | `operator` |\n\nIf a suitable browser is listed, `connect` to it by name and proceed.\n\n### 3. If no suitable browser exists\n\n- **Need headless**: use `discover` to scan for CDP endpoints on localhost and Tailscale\n  peers. If found, `connect` to it.\n- **Need operator browser**: guide the OPERATOR through setup (see below). Do not use\n  `discover` hoping to find it — if it's not in the list, it's not set up.\n\n### When to ask vs assume\n\n- One browser configured, task doesn't require operator visibility → just use it.\n- Multiple browsers, task could go either way → ask which one.\n- Task clearly requires one type (\"show me\" → operator, \"scrape this\" → headless) → pick\n  it without asking.\n\n## Setting Up the OPERATOR's Browser\n\nWhen the task requires a browser the OPERATOR can see and interact with (auth flows,\ndemos, supervised browsing), guide them through this setup.\n\n### On the OPERATOR's machine\n\nTell the OPERATOR to run:\n\n```\nghost browsers serve\n```\n\nThis command finds a Chromium-based browser, starts it with a dedicated profile\n(`~\u002F.config\u002Fghost\u002Fbrowser-profile`), and creates a TCP relay on their Tailscale IP so\nthe GHOST machine can reach it. It prints the exact `ghost browsers add` command to run\non the GHOST machine.\n\nThe dedicated profile is separate from the OPERATOR's daily browser. This matters\nbecause CDP is unauthenticated — anything that can reach the port gets full browser\ncontrol. A dedicated profile keeps real passwords and sessions safe.\n\nThe profile is persistent — logins, cookies, and site data survive across restarts. The\nOPERATOR only needs to log in to services once.\n\nDo not tell the OPERATOR to use `--remote-debugging-address` directly — Chrome's\nhandling of that flag is unreliable across platforms. `ghost browsers serve` handles\nremote access correctly via a relay.\n\nOptions: `--port \u003CN>` (default 9222), `--bind \u003Cip>` (auto-detected), `--browser \u003Cpath>`,\n`--profile \u003Cdir>`.\n\n### On the GHOST machine\n\nAfter `ghost browsers serve` prints the connection info, the OPERATOR runs on the GHOST\nmachine:\n\n```\nghost browsers add operator ws:\u002F\u002F\u003Ctailscale-ip>:9222\nghost config reload\n```\n\nThe browser is now available by name across reboots.\n\n### Auth workflow\n\n1. Ask the OPERATOR to run `ghost browsers serve` on their machine.\n2. Wait for them to add the browser on the GHOST machine and reload config.\n3. `connect` to `\"operator\"` by name.\n4. Navigate to the login page. Use `snapshot` so the OPERATOR can see where you are.\n5. Hand off — ask the OPERATOR to complete auth in their browser window. Poll with\n   `snapshot` until you see the post-login page.\n6. Work in their authenticated session — navigate, fill forms, extract data.\n7. When done, `disconnect`. The OPERATOR can stop `ghost browsers serve` or leave it\n   running (the profile persists).\n\nFor username\u002Fpassword auth without OAuth\u002FMFA, ask the OPERATOR what they prefer — give\nyou the credentials to log in yourself, or do it in their visible browser.\n\n## Tab Management\n\n### Actions\n\n- `open` — open a new tab (optionally with a URL). Becomes the active tab. Returns a\n  snapshot.\n- `focus` — switch to a tab by ID. Returns a snapshot with fresh element refs.\n- `close` — close a tab by ID.\n- `tabs` — list open tabs in the active browser.\n\n### Active tab\n\nAll interaction actions (navigate, snapshot, click, type, etc.) operate on the **active\ntab**. `open` and `focus` change which tab is active.\n\n### Tab limit\n\nMaximum 5 tabs per browser. Close tabs you're done with first.\n\n### Element refs\n\nElement refs (e1, e2, ...) belong to the tab that produced them. When you `focus` a\ndifferent tab, the old refs are invalid — you get fresh refs from the auto-snapshot.\n\nNever use refs from a snapshot of Tab A to interact with Tab B. Always use refs from the\nmost recent snapshot.\n\n## Interaction Patterns\n\n### Comparing two pages\n\n```\n1. navigate to first page → snapshot → read content\n2. open second page → snapshot → read content\n3. focus tab 1 to go back → snapshot → compare\n```\n\n### Following links without losing context\n\n```\n1. snapshot current page, note the ref for the link\n2. open new tab (the link URL) instead of clicking\n3. When done, close the new tab and focus back\n```\n\nOr just click — if the link opens in a new tab (target=\\_blank), it's auto-detected and\nbecomes the active tab.\n\n### Form filling across pages\n\n```\n1. Tab 1: source page with data\n2. Tab 2: form to fill\n3. Read from tab 1, focus tab 2, fill fields\n```\n\n## web_fetch and Browser Sessions\n\n`web_fetch` and the browser tool **share the same Chrome session** when both point at\nthe same browser. This means:\n\n- Log in to a site via the browser tool (navigate, fill credentials, click submit)\n- Then use `web_fetch` to read pages on that site — it sees the authenticated cookies\n- Much faster than snapshot for reading long content-heavy pages\n\nThis works because `web_fetch` routes HTML pages through Crawl4AI, which connects to the\nsame Chrome instance via CDP and shares its cookie jar.\n\n| Scenario                                        | Tool               |\n| ----------------------------------------------- | ------------------ |\n| Simple page read (no auth)                      | `web_fetch`        |\n| Login-gated page (after logging in via browser) | `web_fetch`        |\n| Interactive work (forms, clicks, JS-heavy)      | `browser`          |\n| Need to see page structure\u002Felements             | `browser` snapshot |\n\n## Tool Actions Reference\n\n### Browser management\n\n| Action       | Parameters        | Returns                                      |\n| ------------ | ----------------- | -------------------------------------------- |\n| `browsers`   | —                 | List of configured browsers (no scan)        |\n| `connect`    | `name`, `cdp_url` | Connect + set active                         |\n| `disconnect` | `name`            | Disconnect browser                           |\n| `discover`   | —                 | Scan localhost + Tailscale for CDP endpoints |\n\n### Tab management\n\n| Action  | Parameters | Returns                 |\n| ------- | ---------- | ----------------------- |\n| `tabs`  | —          | Tab list                |\n| `open`  | `url?`     | Snapshot of new tab     |\n| `focus` | `tab`      | Snapshot of focused tab |\n| `close` | `tab`      | Confirmation            |\n\n### Interaction (operates on active tab)\n\n| Action       | Key parameters                   |\n| ------------ | -------------------------------- |\n| `navigate`   | `url`                            |\n| `snapshot`   | `offset?`                        |\n| `click`      | `ref`                            |\n| `type`       | `ref`, `text`                    |\n| `scroll`     | `direction`, `ref?`              |\n| `screenshot` | —                                |\n| `press`      | `key`                            |\n| `hover`      | `ref`                            |\n| `select`     | `ref`, `value`                   |\n| `fill`       | `fields` (array of {ref, value}) |\n| `wait`       | `ref?`, `timeout?`               |\n| `evaluate`   | `expression`                     |\n| `drag`       | `ref`, `target_ref`              |\n| `upload`     | `ref`, `path`                    |\n| `resize`     | `width`, `height`                |\n",{"name":5,"description":7},"main","083d96429a2d05526f8a294b83c74f0336670def","assets\u002Fskills\u002Fbrowser-use",0,"https:\u002F\u002Fgithub.com\u002Fmrtolkien\u002FGHOST","https:\u002F\u002Fgithub.com\u002Fmrtolkien","https:\u002F\u002Fblog.tolki.dev","Data Engineer \u002F Esports \u002F Keyboards","2026-04-24 15:41:08",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add mrtolkien\u002FGHOST --skill browser-use",{"tool":59,"command":60},"bunx","bunx skills add mrtolkien\u002FGHOST --skill browser-use",{"tool":62,"command":63},"pnpm","pnpm dlx skills add mrtolkien\u002FGHOST --skill browser-use","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmrtolkien\u002FGHOST\u002Fblob\u002Fmain\u002Fassets\u002Fskills\u002Fbrowser-use\u002Fskill.md",true,[],[68,91,117,135,144,154],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":39},"01M6CS613RWD9CFJ3KFX47V1DS","system-management","Use when reading or changing GHOST configuration (providers, models, timing, compaction, services, any config.toml key), adding or switching LLM providers, answering questions about GHOST's own features or capabilities, a CLI tool is missing or \"not found\", services need starting\u002Fstopping\u002Fdebugging, updating GHOST to a newer version, managing the Nix shell environment, or troubleshooting GHOST setup.","https:\u002F\u002Fgithub.com\u002Fmrtolkien\u002FGHOST\u002Fblob\u002Fmain\u002Fassets\u002Fskills\u002Fsystem-management\u002Fskill.md",[],[75,27,76,77,78,79,80,81,82,83,84,85,32,31,86,87,19,88,89,90],"system management","system","shell","cli","nix","config","setup","debugging","capabilities","services","Providers","troubleshooting","environment","version","models","configuration",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":110,"publishedAt":39},"01M6CS5XTK2884R9HE15YR8YZM","writing-skills","Use when creating new skills, editing existing skills, or verifying skills work before deployment","https:\u002F\u002Fgithub.com\u002Fmrtolkien\u002FGHOST\u002Fblob\u002Fmain\u002Fassets\u002Fskills\u002Fsuperpowers\u002Fwriting-skills\u002Fskill.md",[97,102,105],{"categoryNo":98,"categoryName":99,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":103,"categoryName":104,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":106,"categoryName":107,"taxonomyType":108,"taxonomyTypeDesc":109},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[111,112,113,114,115,19,116],"writing skills","writing","coding","work","editing","deployment",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":125,"publishedAt":39},"01M6CS5V737R1DVB3TZEK0C6WT","writing-plans","Use when you have a spec or requirements for a multi-step task, before touching code. Write comprehensive implementation plans assuming the engineer has zero context for our codebase and questionable taste.","https:\u002F\u002Fgithub.com\u002Fmrtolkien\u002FGHOST\u002Fblob\u002Fmain\u002Fassets\u002Fskills\u002Fsuperpowers\u002Fwriting-plans\u002Fskill.md",[123,124],{"categoryNo":103,"categoryName":104,"taxonomyType":100,"taxonomyTypeDesc":101},{"categoryNo":106,"categoryName":107,"taxonomyType":108,"taxonomyTypeDesc":109},[126,112,127,128,129,113,130,131,19,132,133,134],"writing plans","spec","code","ZeRO","write","context","engineer","implementation","task",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":141,"publishedAt":39},"01M6CS5S5S0YY56686G5CQ0WMP","verification","Use when about to claim work is complete, fixed, or passing, before committing or creating PRs. Requires running verification commands and confirming output before making any success claims. Evidence before assertions, always.","https:\u002F\u002Fgithub.com\u002Fmrtolkien\u002FGHOST\u002Fblob\u002Fmain\u002Fassets\u002Fskills\u002Fsuperpowers\u002Fverification\u002Fskill.md",[],[137,113,114,19,142,143],"evidence","claim",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":151,"publishedAt":39},"01M6CS5PD2ZSFWYRDZSACNTAJY","tdd","Use when implementing any feature or bugfix, before writing implementation code. Write the test first. Watch it fail. Write minimal code to pass.","https:\u002F\u002Fgithub.com\u002Fmrtolkien\u002FGHOST\u002Fblob\u002Fmain\u002Fassets\u002Fskills\u002Fsuperpowers\u002Ftdd\u002Fskill.md",[150],{"categoryNo":98,"categoryName":99,"taxonomyType":100,"taxonomyTypeDesc":101},[146,112,128,34,113,130,19,152,133,153],"minimal","test",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":161,"publishedAt":39},"01M6CS5K5WE2SHF1YV8D9C4C77","systematic-debugging","Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes","https:\u002F\u002Fgithub.com\u002Fmrtolkien\u002FGHOST\u002Fblob\u002Fmain\u002Fassets\u002Fskills\u002Fsuperpowers\u002Fsystematic-debugging\u002Fskill.md",[160],{"categoryNo":98,"categoryName":99,"taxonomyType":100,"taxonomyTypeDesc":101},[162,82,163,19,113,153,164],"systematic debugging","behavior","bug"]