[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C273RHB4MJDVVR5WDZGX6S":3,"skill-same:01M6C273RHB4MJDVVR5WDZGX6S":64},{"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":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":46,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":49,"install":50,"resources":63},"01M6C273RHB4MJDVVR5WDZGX6S","keychain-kill",null,"Diagnose and clear macOS SecurityAgent keychain prompts caused by a headless\u002Fbackground process (launchd, cron, isolated tmux agents). Scoped: terminates only prompts whose parent chain descends from the current session, never a machine-wide pattern kill. Slash command: \u002Fkeychain_kill.","jleechanorg\u002Fjleechan-skills","jleechanorg","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F221404966?v=4","01M6C1VJ99XG950X1DWPEBCBGX","01M6C1VJDK5YVDNT3362RT5WSB",6,"MIT","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fkeychain-kill\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"keychain","keychain kill","kill","prompts","wide","clear","pattern","process","tmux agents","only","machine","scoped","session","diagnose","chain","headless","never","launchd","user","command","2026-11-10 10:12:30",false,"---\nname: keychain-kill\ndescription: \"Diagnose and clear macOS SecurityAgent keychain prompts caused by a headless\u002Fbackground process (launchd, cron, isolated tmux agents). Scoped: terminates only prompts whose parent chain descends from the current session, never a machine-wide pattern kill. Slash command: \u002Fkeychain_kill.\"\nscope: user\n---\n\n# macOS Keychain Kill & Headless Keyring Troubleshooting\n\nDiagnose why macOS `SecurityAgent` prompts are appearing for a headless process, terminate only the prompts this session caused, and fix the underlying keyring-access cause with a credential the worker owns.\n\n## 1. Scoped Dismissal (diagnose, then kill only your own)\n\nWhen a headless process triggers keychain lookups, macOS launches `SecurityAgent` to request password entry from the user. If the process is backgrounded, it hangs recursively.\n\n### Scope the kill to the prompts THIS session caused\n\n`SecurityAgent` is a shared system agent. A blind `pkill -9 -f SecurityAgent` (the previous\ninstruction here) kills **every** pending authentication request on the machine, including\nanother agent's, another user process's, or the operator's own password prompt mid-typing.\nThat is why this step is no longer \"run it first\".\n\nDiagnose before killing, then terminate only what this session caused:\n\n```bash\n# 1. Who is asking? List candidate authentication agents; Step 2 checks lineage.\nps -Ao pid,ppid,stat,etime,args | grep -Ei '[S]ecurityAgent|[U]niversalAccessAuthWarn'\n\n# 2. Only proceed if an authentication agent's parent chain descends from THIS\n#    session (the tmux\u002Flaunchd\u002Fagent process you are working on). Replace\n#    \u003Csession-pid>. This prints only matching executable names, with PID, PPID,\n#    and the full command line from the same process snapshot.\nps -Ao pid=,ppid=,args= | awk -v root=\"\u003Csession-pid>\" '\n  { ppid[$1]=$2; executable[$1]=$3; line[$1]=$0 }\n  END { for (p in ppid) { q=p; n=0\n          while (q!=\"\" && q!=0 && n\u003C40) {\n            if (q==root) {\n              name=executable[p]\n              sub(\u002F^.*\\\u002F\u002F, \"\", name)\n              sub(\u002F^\\[\u002F, \"\", name); sub(\u002F\\]$\u002F, \"\", name)\n              if (p!=root && (name==\"SecurityAgent\" || name==\"universalAccessAuthWarn\")) {\n                print line[p]\n              }\n              break\n            }\n            q=ppid[q]; n++\n          }\n        }\n  }'\n\n# 3. For a candidate PID, record its start time, PPID, executable, and full\n#    command line. Immediately before signaling, re-read those fields and\n#    re-trace its current parent chain to this session. If any identity field\n#    differs from the recorded candidate, or its lineage no longer reaches this\n#    session, stop. Send TERM only to that confirmed PID.\nps -p \u003Cpid> -o pid= -o ppid= -o lstart= -o comm= -o args=\nkill -TERM \u003Cpid>\n\n# 4. Wait briefly, then read the same identity fields again. If that exact\n#    process has exited, stop. If the PID is absent or now identifies another\n#    process, stop. A successful TERM command only means the signal was sent.\nsleep 1\nps -p \u003Cpid> -o pid= -o ppid= -o lstart= -o comm= -o args=\n\n# 5. Only if the same process still exists, revalidate its identity and current\n#    parent chain immediately before signaling. Then use KILL on that PID.\nps -p \u003Cpid> -o pid= -o ppid= -o lstart= -o comm= -o args=\nkill -KILL \u003Cpid>\n```\n\n`universalAccessAuthWarn` follows the same rule: identify, confirm, then kill the specific PIDs.\n\nIf you cannot establish that the agent descends from this session, **do not kill it** — report\nthe prompt and let the operator dismiss it. Killing an unrelated auth dialog loses whatever\nthey were authenticating.\n\nRecord in your response which PIDs you terminated and how you established the lineage.\n\n## 2. Root Cause & Architectural Permanent Fix\n\nHeadless background agents (e.g. running under tmux or `ai.hermes.prod` launchd daemons) operate in separate security sessions where the user's main login keychain (`$HOME\u002FLibrary\u002FKeychains\u002Flogin.keychain-db`) is locked. When SCM tools (`gh`, `git`, or `claude` authentication modules) attempt to check credentials, they query the locked login keychain, triggering the OS prompt.\n\n### Bypassing Keychain Lookups inside Background Workers\n\nThe permanent solution requires isolating background SCM operations from the locked GUI login keychain:\n\n1. **Give the worker its own credentials instead of the operator's keychain.**\n   The durable fix is for the background process to authenticate with a credential it owns:\n   a service account, a token in the process environment, or\n   `git config credential.helper` pointing at a store that is not the GUI login keychain.\n   For `gh`, use an already-provisioned `GH_TOKEN` or `GITHUB_TOKEN` in the worker's\n   process environment for headless use. Do not use `gh auth login --with-token` as a\n   workaround: `gh auth login` stores tokens in the system credential store by default,\n   which can trigger the same prompt. See the\n   [GitHub CLI authentication guidance](https:\u002F\u002Fcli.github.com\u002Fmanual\u002Fgh_auth_login).\n   Then no `SecurityAgent` prompt is generated in the first place.\n\n   > **Do not** create a password-less keychain and make it the default\n   > (`security create-keychain -p \"\"` + `security default-keychain -s`). That recipe was\n   > previously recommended here and has been **removed**: a keychain with an empty\n   > password whose contents are unlocked on demand is not a credential boundary. It\n   > weakens every later lookup on the machine, persists after this task ends, and is\n   > invisible to the operator. A per-session keychain is only acceptable when it is\n   > created with a real secret supplied out-of-band and is scoped to the worker's own\n   > config, never set as the system default.\n\n2. **CLI Storage Bypasses (`--bare`)**:\n   Pass `--bare` to processes that support it, so they do not write or read secure local\n   storage they do not need. This is a per-invocation choice; do not make it a global default\n   that hides a credential problem from the next run.\n\n3. **Workspace trust is a decision, not a config line.**\n   Do not pre-populate `trustedFolders.json` to silence trust prompts. That removes a\n   security confirmation the operator is meant to see, and it applies to every future\n   worktree — including untrusted ones. Report the prompt and let the operator trust the\n   folder. If a workflow clones many worktrees unattended, propose an explicit, reviewed\n   allowlist of paths instead of blanket trust.\n\n## 3. Diagnostic Procedures\n\nIf keychain prompts continue to appear, perform the following checks:\n\n1. **Find Active Security Agents**:\n   Verify if a lingering SecurityAgent process is currently active:\n   ```bash\n   ps aux | grep -i SecurityAgent | grep -v \"grep\"\n   ```\n2. **Verify CLI Health & Non-Canonical Processes**:\n   Run `ao doctor` to ensure all active background workers inherit the canonical compiled environment. Terminate outdated processes carrying old environment configurations:\n   ```bash\n   ao doctor --fix\n   ```\n\n## Output\n\nReport which PIDs you terminated and the lineage evidence for each. If you could not establish lineage, say so and leave the prompt alone. If prompts recur, walk the diagnostics above, then propose a worker-owned credential — never a password-less keychain and never blanket workspace trust.\n","# macOS Keychain Kill & Headless Keyring Troubleshooting\n\nDiagnose why macOS `SecurityAgent` prompts are appearing for a headless process, terminate only the prompts this session caused, and fix the underlying keyring-access cause with a credential the worker owns.\n\n## 1. Scoped Dismissal (diagnose, then kill only your own)\n\nWhen a headless process triggers keychain lookups, macOS launches `SecurityAgent` to request password entry from the user. If the process is backgrounded, it hangs recursively.\n\n### Scope the kill to the prompts THIS session caused\n\n`SecurityAgent` is a shared system agent. A blind `pkill -9 -f SecurityAgent` (the previous\ninstruction here) kills **every** pending authentication request on the machine, including\nanother agent's, another user process's, or the operator's own password prompt mid-typing.\nThat is why this step is no longer \"run it first\".\n\nDiagnose before killing, then terminate only what this session caused:\n\n```bash\n# 1. Who is asking? List candidate authentication agents; Step 2 checks lineage.\nps -Ao pid,ppid,stat,etime,args | grep -Ei '[S]ecurityAgent|[U]niversalAccessAuthWarn'\n\n# 2. Only proceed if an authentication agent's parent chain descends from THIS\n#    session (the tmux\u002Flaunchd\u002Fagent process you are working on). Replace\n#    \u003Csession-pid>. This prints only matching executable names, with PID, PPID,\n#    and the full command line from the same process snapshot.\nps -Ao pid=,ppid=,args= | awk -v root=\"\u003Csession-pid>\" '\n  { ppid[$1]=$2; executable[$1]=$3; line[$1]=$0 }\n  END { for (p in ppid) { q=p; n=0\n          while (q!=\"\" && q!=0 && n\u003C40) {\n            if (q==root) {\n              name=executable[p]\n              sub(\u002F^.*\\\u002F\u002F, \"\", name)\n              sub(\u002F^\\[\u002F, \"\", name); sub(\u002F\\]$\u002F, \"\", name)\n              if (p!=root && (name==\"SecurityAgent\" || name==\"universalAccessAuthWarn\")) {\n                print line[p]\n              }\n              break\n            }\n            q=ppid[q]; n++\n          }\n        }\n  }'\n\n# 3. For a candidate PID, record its start time, PPID, executable, and full\n#    command line. Immediately before signaling, re-read those fields and\n#    re-trace its current parent chain to this session. If any identity field\n#    differs from the recorded candidate, or its lineage no longer reaches this\n#    session, stop. Send TERM only to that confirmed PID.\nps -p \u003Cpid> -o pid= -o ppid= -o lstart= -o comm= -o args=\nkill -TERM \u003Cpid>\n\n# 4. Wait briefly, then read the same identity fields again. If that exact\n#    process has exited, stop. If the PID is absent or now identifies another\n#    process, stop. A successful TERM command only means the signal was sent.\nsleep 1\nps -p \u003Cpid> -o pid= -o ppid= -o lstart= -o comm= -o args=\n\n# 5. Only if the same process still exists, revalidate its identity and current\n#    parent chain immediately before signaling. Then use KILL on that PID.\nps -p \u003Cpid> -o pid= -o ppid= -o lstart= -o comm= -o args=\nkill -KILL \u003Cpid>\n```\n\n`universalAccessAuthWarn` follows the same rule: identify, confirm, then kill the specific PIDs.\n\nIf you cannot establish that the agent descends from this session, **do not kill it** — report\nthe prompt and let the operator dismiss it. Killing an unrelated auth dialog loses whatever\nthey were authenticating.\n\nRecord in your response which PIDs you terminated and how you established the lineage.\n\n## 2. Root Cause & Architectural Permanent Fix\n\nHeadless background agents (e.g. running under tmux or `ai.hermes.prod` launchd daemons) operate in separate security sessions where the user's main login keychain (`$HOME\u002FLibrary\u002FKeychains\u002Flogin.keychain-db`) is locked. When SCM tools (`gh`, `git`, or `claude` authentication modules) attempt to check credentials, they query the locked login keychain, triggering the OS prompt.\n\n### Bypassing Keychain Lookups inside Background Workers\n\nThe permanent solution requires isolating background SCM operations from the locked GUI login keychain:\n\n1. **Give the worker its own credentials instead of the operator's keychain.**\n   The durable fix is for the background process to authenticate with a credential it owns:\n   a service account, a token in the process environment, or\n   `git config credential.helper` pointing at a store that is not the GUI login keychain.\n   For `gh`, use an already-provisioned `GH_TOKEN` or `GITHUB_TOKEN` in the worker's\n   process environment for headless use. Do not use `gh auth login --with-token` as a\n   workaround: `gh auth login` stores tokens in the system credential store by default,\n   which can trigger the same prompt. See the\n   [GitHub CLI authentication guidance](https:\u002F\u002Fcli.github.com\u002Fmanual\u002Fgh_auth_login).\n   Then no `SecurityAgent` prompt is generated in the first place.\n\n   > **Do not** create a password-less keychain and make it the default\n   > (`security create-keychain -p \"\"` + `security default-keychain -s`). That recipe was\n   > previously recommended here and has been **removed**: a keychain with an empty\n   > password whose contents are unlocked on demand is not a credential boundary. It\n   > weakens every later lookup on the machine, persists after this task ends, and is\n   > invisible to the operator. A per-session keychain is only acceptable when it is\n   > created with a real secret supplied out-of-band and is scoped to the worker's own\n   > config, never set as the system default.\n\n2. **CLI Storage Bypasses (`--bare`)**:\n   Pass `--bare` to processes that support it, so they do not write or read secure local\n   storage they do not need. This is a per-invocation choice; do not make it a global default\n   that hides a credential problem from the next run.\n\n3. **Workspace trust is a decision, not a config line.**\n   Do not pre-populate `trustedFolders.json` to silence trust prompts. That removes a\n   security confirmation the operator is meant to see, and it applies to every future\n   worktree — including untrusted ones. Report the prompt and let the operator trust the\n   folder. If a workflow clones many worktrees unattended, propose an explicit, reviewed\n   allowlist of paths instead of blanket trust.\n\n## 3. Diagnostic Procedures\n\nIf keychain prompts continue to appear, perform the following checks:\n\n1. **Find Active Security Agents**:\n   Verify if a lingering SecurityAgent process is currently active:\n   ```bash\n   ps aux | grep -i SecurityAgent | grep -v \"grep\"\n   ```\n2. **Verify CLI Health & Non-Canonical Processes**:\n   Run `ao doctor` to ensure all active background workers inherit the canonical compiled environment. Terminate outdated processes carrying old environment configurations:\n   ```bash\n   ao doctor --fix\n   ```\n\n## Output\n\nReport which PIDs you terminated and the lineage evidence for each. If you could not establish lineage, say so and leave the prompt alone. If prompts recur, walk the diagnostics above, then propose a worker-owned credential — never a password-less keychain and never blanket workspace trust.\n",{"name":5,"scope":36,"description":7},"main","8144f00ebafc4306264c63239e4b9fa42e48a90e",".claude\u002Fskills\u002Fkeychain-kill",0,"https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills","https:\u002F\u002Fgithub.com\u002Fjleechanorg","2026-11-12 14:45:07",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add jleechanorg\u002Fjleechan-skills --skill keychain-kill",{"tool":56,"command":57},"bunx","bunx skills add jleechanorg\u002Fjleechan-skills --skill keychain-kill",{"tool":59,"command":60},"pnpm","pnpm dlx skills add jleechanorg\u002Fjleechan-skills --skill keychain-kill","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fkeychain-kill\u002FSKILL.md",true,[],[65,82,104,118,132,148],{"skillNo":66,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":38},"01M716Y5MTJ6GYJZ2ATXCJK8G4","instinct","Use when the user invokes \u002Finstinct or \u002Fin, or asks to \"message Instinct\", \"ask Instinct\", \"tell Instinct\", \"check Instinct\", or read replies from the configured peer assistant. iMessage first, WhatsApp Web as fallback.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Finstinct\u002FSKILL.md",[],[67,36,72,73,74,75,76,77,78,79,80,81],"when","replies","check","use","identity","whatsapp","gmail","read","message","ask",{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":93,"publishedAt":38},"01M716Y4HF7FVVMJSA2CCVN5VF","hr","Compatibility alias for history-resume; produce the same fresh-state, provenance-aware resume briefing.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhr\u002FSKILL.md",[88],{"categoryNo":89,"categoryName":90,"taxonomyType":91,"taxonomyTypeDesc":92},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[84,94,95,96,97,98,99,100,101,102,103],"resume","compatibility","provenance","for","history","produce","alias","briefing","state","fresh",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":111,"publishedAt":38},"01M716Y1FFNFKFJYYKF8HQA6T8","history-resume","Resume briefing for the current repository branch or worktree using fresh state and admitted history sources.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fhistory-resume\u002FSKILL.md",[110],{"categoryNo":89,"categoryName":90,"taxonomyType":91,"taxonomyTypeDesc":92},[98,94,112,113,36,114,101,115,97,116,117,102,103],"history resume","branch","analysis","repository","worktree","sources",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":38},"01M716XWXJ8EPHK4RH9T14TR85","grok","Alias for the canonical grokbot browser conversation workflow; \u002Fgrok talks to the Grok bot the same way \u002Fdot talks to Dot.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgrok\u002FSKILL.md",[],[120,125,126,127,97,128,100,129,130,131],"dot","bot","workflow","canonical","conversation","browser","grokbot",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":138,"publishedAt":38},"01M70N9Q07DTE0EW5KFXMMMSJ0","codexa-bench","Compare `codexa` and normal `codex` on a fair split of comparable work by default; use `--strict` for duplicate runs of the exact same task.","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fcodexa-bench\u002FSKILL.md",[],[139,140,141,75,142,97,143,144,145,146,147],"codexa bench","work","split","default","duplicate","task","compare","normal","codex",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":152,"licenseFileUrl":153,"sourceHtmlUrl":154,"categories":155,"keywords":167,"publishedAt":38},"01M6C24S2X60SP8BBFGAEKPEGW","frontend-design","Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML\u002FCSS layouts, or when styling\u002Fbeautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-design\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fjleechanorg\u002Fjleechan-skills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffrontend-design\u002FSKILL.md",[156,161,164],{"categoryNo":157,"categoryName":158,"taxonomyType":159,"taxonomyTypeDesc":160},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",{"categoryNo":162,"categoryName":163,"taxonomyType":159,"taxonomyTypeDesc":160},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":165,"categoryName":166,"taxonomyType":91,"taxonomyTypeDesc":92},"01JBSEEDCAT000000000000032","设计师",[168,169,170,75,171,172,173,36,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,72,192],"frontend","design","frontend design","generic","ui design","react","html","components","code","artifacts","ui","aesthetics","Production","web components","landing","applications","quality","web","css","create","examples","with","react components","web ui","pages"]