[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69BTVF2EGFP9RDPPKWMS3V6":3,"skill-same:01M69BTVF2EGFP9RDPPKWMS3V6":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},"01M69BTVF2EGFP9RDPPKWMS3V6","shadow-frog-update",null,"Update the shadow knowledge base after code changes and from conversational insights. Detects what changed via git diff, refreshes per-file shadows, captures knowledge shared by the user during the session, and updates cross-cutting discoveries. Invoke manually with \u002Fshadow-frog-update; the preToolUse hook will remind the agent when the shadow is behind HEAD.","microsoft\u002FShadowFrog","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69BTFDNCFRDGPJVWET4C0RN",33,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FShadowFrog\u002Fblob\u002Fmain\u002Fskills\u002Fshadow-frog-update\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"update","shadow frog update","shadow frog","Shadow","changes","updates","insights","with","via","head","shared","knowledge base","base","diff","session","remind","knowledge","file","git","code","2026-11-10 10:12:30",false,"---\nname: shadow-frog-update\ndescription: >-\n  Update the shadow knowledge base after code changes and from conversational\n  insights. Detects what changed via git diff, refreshes per-file shadows,\n  captures knowledge shared by the user during the session, and updates\n  cross-cutting discoveries. Invoke manually with \u002Fshadow-frog-update; the\n  preToolUse hook will remind the agent when the shadow is behind HEAD.\n---\n\n# ShadowFrog Update\n\nUpdates `.shadow\u002F` from two sources: code changes (git diff) and conversational\nknowledge (what the user said during the session). Prerequisite: `.shadow\u002F` exists.\n\n## Triggers\n\n1. Hook reminder: `preToolUse` injects a staleness warning when\n   `.shadow\u002F_meta\u002Fstate.json#last_commit` differs from HEAD. The hook\n   only reminds — it does NOT auto-run update.\n2. Manual: user invokes `\u002Fshadow-frog-update`\n\n## Phase 1: Detect Changes\n\n```bash\n# Read last_commit defensively: it may be missing, or the literal \"none\"\n# when init ran without git (e.g. inside a container). `git diff none HEAD`\n# would abort with \"fatal: bad revision 'none'\", and a missing key would\n# make $LAST_COMMIT empty so `git diff HEAD` silently reports the wrong set.\nLAST_COMMIT=$(python3 -c \"import json,sys; print(json.load(sys.stdin).get('last_commit','none'))\" \u003C .shadow\u002F_meta\u002Fstate.json 2>\u002Fdev\u002Fnull || echo \"none\")\nif git rev-parse --verify \"$LAST_COMMIT\" >\u002Fdev\u002Fnull 2>&1; then\n    git diff --name-only \"$LAST_COMMIT\" HEAD   # committed changes since last update\nelse\n    echo \"WARNING: state.json has no usable last_commit — falling back to a full re-scan.\"\nfi\ngit diff --name-only HEAD                       # uncommitted changes\ngit diff --name-only --cached                   # staged changes\n```\n\nCategorize: modified, added, deleted, renamed.\n\n## Phase 2: Update Per-File Shadows (Symbol-Level)\n\nUse the **same extraction interface as init**, rather than inventing a separate\nsymbol scanner. From the project root:\n\n```powershell\npython .github\\skills\\shadow-frog-init\\shadow-init.py --symbols-only\n# Claude Code: use .claude\\skills\\shadow-frog-init\\shadow-init.py instead.\n```\n\nThis prints JSON without changing `.shadow\u002F`. It inherits the optional\n`symbol_backend` configuration from `_meta\u002Fstate.json` (absent means regex).\nFor Astred, run `python install-astred.py` (Linux: `python3`) from the\nShadowFrog checkout once; setup defaults to latest stable, with optional\n`--version \u003Cexact-version>`. The executable is discovered from per-user setup\nconfiguration. `SHADOWFROG_ASTRED_COMMAND` or `--astred-command` override it;\ndo not store its path in shared metadata. Unchanged Python files reuse\n`_meta\u002Fsymbols.json`; changed Python files are batched through the pinned backend.\nC\u002FC++ uses the recorded build-derived Astred project (or `--astred-project`).\nNative projects are always reparsed, even without source diffs, because headers\ncan change declarations in unchanged translation units. Keep the configured\ncompiler environment, includes, defines, and forced headers available; setup\nalone does not generate an OS build project. Other languages explicitly use\nregex. **Stop on extraction failure**; a failed inventory does\nnot mean that all symbols disappeared. Use each record's `qualified_name` for\n`file::symbol` references and `heading` for Markdown headings.\n\nWhen adopting Astred, upgrading its release\u002Fnormalizer, or changing the native\nproject\u002Fcompile settings, first run\n`--preview-migration --symbol-backend astred` with the intended executable.\nTreat all affected shadow files as changed, even without a source diff.\nAlso compare freshly extracted native symbols for unchanged source files\nafter header changes; source hashes alone are insufficient.\nReview scope-change candidates; do not assume same-leaf names prove identity.\nPreserve unmatched\u002Fambiguous sections and their discoveries as history until\nresolved. Apply only confirmed mappings, updating `Also involves:` and `_cross\u002F`\n`**Refs**:` consistently, without changing trust metadata or citation scores.\nNever use `--reset` to migrate. This is a reviewed agent workflow, not an\nautomatic knowledge-rewriting command.\n\nFor each changed file, update its shadow at the symbol level:\n\n| Symbol change | Action |\n|---------------|--------|\n| Added | Add the appropriate `##`\u002F`###` heading |\n| Removed | Mark the section `REMOVED`; keep discoveries for history |\n| Renamed | Move discoveries to the updated heading |\n| Modified | Check whether discoveries still hold |\n\nOnly mark `source: user` discoveries stale if the symbol is completely removed.\n\nLightweight update (auto\u002Fhook): re-extract symbols, update headings, flag stale.\nDeep update (manual\u002Fdream): read diffs, generate new discoveries, verify existing ones.\n\n## Phase 3: Capture Conversational Knowledge\n\nWhen the user shares knowledge during the session, write it immediately.\nDo not batch for later.\n\nCapture warnings, gotchas, design intent, history, deprecations, contracts,\nand conventions. Representative examples:\n\n| Signal | Example | Category |\n|--------|---------|----------|\n| Warning | \"Don't change the retry logic, it's subtle\" | warning |\n| Design intent | \"We use this pattern because the API is unreliable\" | intent |\n| Convention | \"Always use the helper in utils.py, not raw SQL\" | convention |\n\nWrite as:\n```markdown\n- \u003Cuser's words, as close to verbatim as possible>\n  _(verified, source: user, citation_score: 0)_\n```\n\nFor knowledge emerging from collaborative work (debugging, refactoring, test failures):\n```markdown\n- \u003Cwhat was discovered and how>\n  _(verified, source: interaction, citation_score: 0)_\n```\n\nAnchor to the specific `file::symbol`. `source: user` and `source: interaction`\nare always `verified`.\n\n### Auto-Placement\n\nUsers will not specify where to store their knowledge. You must find the\ncorrect location. Procedure:\n\n1. Parse the user's statement for code references — file names, function names,\n   class names, module names, variable names, error messages, CLI flags.\n2. If the knowledge is a **project-wide preference or convention** with no code\n   references (e.g., \"always use snake_case\", \"no backward compatibility\",\n   \"prefer small PRs\") → write to `_prefs.md`.\n3. If explicit references found → look up those `file::symbol` paths in\n   `_index.md` and the corresponding shadow files.\n4. If no explicit references → use context:\n   - What file is the user currently viewing or editing?\n   - What files were recently modified in this session?\n   - Search shadow files: `grep -rl \"\u003Ckeyword>\" .shadow\u002F --include=\"*.md\"`\n5. If multiple candidate locations → pick the most specific symbol that the\n   knowledge applies to. Prefer a single `file::symbol` over file-level.\n6. If the knowledge spans 3+ files → create a `_cross\u002F\u003Cslug>.md`\n   entry and add back-pointers to each involved file's `## Cross-References`.\n   For 2-file discoveries, use per-file entries with `Also involves:` instead.\n7. If no matching location exists (e.g., the user mentions a concept not yet in\n   the shadow) → place at the file-level `## File-Level` section of the most\n   relevant file, or create a new `_cross\u002F` entry for repo-wide knowledge.\n\nNever ask the user \"where should I put this?\" — always resolve placement yourself.\n\n## Phase 4: Extract Session Insights\n\nAt session end or manual trigger, review the session for:\n1. Files modified and why\n2. Patterns revealed by the changes\n3. Unrecorded conversational knowledge (user statements not yet shadowed)\n4. Cross-cutting discoveries (create in `_cross\u002F\u003Cslug>.md` if 3+ files involved)\n\n## Phase 5: Handle Structural Changes\n\nAdded files:\n1. Check `.shadow\u002F.shadowignore` — skip if the file matches an ignore pattern\n2. Create `.shadow\u002F\u003Cpath>\u002F\u003Cfile>.md` with symbol-organized template\n3. Add `## Cross-References` section\n4. Add to `_index.md`\n\nDeleted files:\n1. Add `ORPHANED` marker to shadow header\n2. Keep shadow (discoveries explain history)\n3. Mark `[REMOVED]` on any `_cross\u002F` refs pointing to this file\n4. Update `_index.md`\n\nRenamed files:\n1. Move `.shadow\u002F\u003Cold>.md` to `.shadow\u002F\u003Cnew>.md`\n2. Update all `_cross\u002F` `**Refs**:` entries (old path → new path)\n3. Update all `Also involves:` in other per-file shadows\n4. Update `_index.md`\n5. Preserve all discoveries\n\n## Phase 6: Verify and Dedup\n\nFollow the dedup and writing rules in `\u002Fshadow-frog` — read before\nwrite, merge or update existing entries, fix bad format in place.\n\n**Verify exploration discoveries** using the observe-based or do-based\nmethods in `\u002Fshadow-frog` § Verification. `source: user` and\n`source: interaction` → always `verified`; only re-verify if the\nunderlying code changes.\n\n## Phase 7: Verify Reference Integrity\n\nCheck the five core invariants (full 7-invariant set in `\u002Fshadow-frog`):\n- Every `_cross\u002F\u003Cslug>.md` ref has a back-pointer in per-file `## Cross-References`\n- Every `## Cross-References` entry has a corresponding `_cross\u002F\u003Cslug>.md`\n- No duplicate cross-cutting filenames\n- All `Also involves:` use `file::symbol` notation\n- No duplicate discoveries (same behavioral claim at same symbol)\n\nRepair any violations before proceeding.\n\n## Phase 8: Update Metadata\n\nPreserve `dream_cycles_completed` from the existing state — only `dream-reconcile.py` increments it.\nAlso preserve optional `symbol_backend` metadata. After a successful update,\nsave the validated extraction inventory (without its optional `migration`\nsection) to `_meta\u002Fsymbols.json`; refresh `fallback_languages` from that report.\nFor a reviewed backend\u002Fversion migration,\nadopt the report's `symbol_backend` only after all affected headings and\nreferences are reconciled. Never publish new backend metadata or replace a\ngood cache after a failed extraction or incomplete migration.\n\n```json\n{\n  \"version\": 1,\n  \"initialized_at\": \"\u003Cpreserved>\",\n  \"last_update_at\": \"\u003Cnow ISO>\",\n  \"last_commit\": \"\u003Cfull 40-char HEAD SHA>\",\n  \"last_update_type\": \"init|auto|manual|dream|meditate\",\n  \"total_files\": N,\n  \"total_symbols\": N,\n  \"total_discoveries\": N,\n  \"dream_cycles_completed\": \u003Cpreserved>\n}\n```\n\nRefresh `_index.md` with current counts.\n\n## Discovery Writing Rules\n\nSee `\u002Fshadow-frog` § Discovery Format for the verbatim per-file,\ncross-cutting, and preference formats. Rules to keep in mind during\nupdate sessions:\n\n- Start new claims\u002Fpreferences with `citation_score: 0`; preserve the score\n  when updating the same knowledge. Citation-only edits do not add discoveries.\n- Record deliberately consulted existing entries once per task using the core\n  `shadow-cite.py` helper, not a retrieval requirement or a second hidden store.\n- Be behavioral: \"silently returns None on expired tokens\" not \"handles token expiration\"\n- `source: user` and `source: interaction` → always `verified`, use user's own words\n- `source: exploration` → mark `uncertain` unless verified by code reading or tests\n- If 3+ files involved → create in `_cross\u002F\u003Cslug>.md` instead, add back-pointers\n- If project-wide preference with no file reference → write to `_prefs.md`\n- Slug naming: kebab-case derived from title (e.g., \"Token expiry config split\" → `token-expiry-config-split.md`)\n","# ShadowFrog Update\n\nUpdates `.shadow\u002F` from two sources: code changes (git diff) and conversational\nknowledge (what the user said during the session). Prerequisite: `.shadow\u002F` exists.\n\n## Triggers\n\n1. Hook reminder: `preToolUse` injects a staleness warning when\n   `.shadow\u002F_meta\u002Fstate.json#last_commit` differs from HEAD. The hook\n   only reminds — it does NOT auto-run update.\n2. Manual: user invokes `\u002Fshadow-frog-update`\n\n## Phase 1: Detect Changes\n\n```bash\n# Read last_commit defensively: it may be missing, or the literal \"none\"\n# when init ran without git (e.g. inside a container). `git diff none HEAD`\n# would abort with \"fatal: bad revision 'none'\", and a missing key would\n# make $LAST_COMMIT empty so `git diff HEAD` silently reports the wrong set.\nLAST_COMMIT=$(python3 -c \"import json,sys; print(json.load(sys.stdin).get('last_commit','none'))\" \u003C .shadow\u002F_meta\u002Fstate.json 2>\u002Fdev\u002Fnull || echo \"none\")\nif git rev-parse --verify \"$LAST_COMMIT\" >\u002Fdev\u002Fnull 2>&1; then\n    git diff --name-only \"$LAST_COMMIT\" HEAD   # committed changes since last update\nelse\n    echo \"WARNING: state.json has no usable last_commit — falling back to a full re-scan.\"\nfi\ngit diff --name-only HEAD                       # uncommitted changes\ngit diff --name-only --cached                   # staged changes\n```\n\nCategorize: modified, added, deleted, renamed.\n\n## Phase 2: Update Per-File Shadows (Symbol-Level)\n\nUse the **same extraction interface as init**, rather than inventing a separate\nsymbol scanner. From the project root:\n\n```powershell\npython .github\\skills\\shadow-frog-init\\shadow-init.py --symbols-only\n# Claude Code: use .claude\\skills\\shadow-frog-init\\shadow-init.py instead.\n```\n\nThis prints JSON without changing `.shadow\u002F`. It inherits the optional\n`symbol_backend` configuration from `_meta\u002Fstate.json` (absent means regex).\nFor Astred, run `python install-astred.py` (Linux: `python3`) from the\nShadowFrog checkout once; setup defaults to latest stable, with optional\n`--version \u003Cexact-version>`. The executable is discovered from per-user setup\nconfiguration. `SHADOWFROG_ASTRED_COMMAND` or `--astred-command` override it;\ndo not store its path in shared metadata. Unchanged Python files reuse\n`_meta\u002Fsymbols.json`; changed Python files are batched through the pinned backend.\nC\u002FC++ uses the recorded build-derived Astred project (or `--astred-project`).\nNative projects are always reparsed, even without source diffs, because headers\ncan change declarations in unchanged translation units. Keep the configured\ncompiler environment, includes, defines, and forced headers available; setup\nalone does not generate an OS build project. Other languages explicitly use\nregex. **Stop on extraction failure**; a failed inventory does\nnot mean that all symbols disappeared. Use each record's `qualified_name` for\n`file::symbol` references and `heading` for Markdown headings.\n\nWhen adopting Astred, upgrading its release\u002Fnormalizer, or changing the native\nproject\u002Fcompile settings, first run\n`--preview-migration --symbol-backend astred` with the intended executable.\nTreat all affected shadow files as changed, even without a source diff.\nAlso compare freshly extracted native symbols for unchanged source files\nafter header changes; source hashes alone are insufficient.\nReview scope-change candidates; do not assume same-leaf names prove identity.\nPreserve unmatched\u002Fambiguous sections and their discoveries as history until\nresolved. Apply only confirmed mappings, updating `Also involves:` and `_cross\u002F`\n`**Refs**:` consistently, without changing trust metadata or citation scores.\nNever use `--reset` to migrate. This is a reviewed agent workflow, not an\nautomatic knowledge-rewriting command.\n\nFor each changed file, update its shadow at the symbol level:\n\n| Symbol change | Action |\n|---------------|--------|\n| Added | Add the appropriate `##`\u002F`###` heading |\n| Removed | Mark the section `REMOVED`; keep discoveries for history |\n| Renamed | Move discoveries to the updated heading |\n| Modified | Check whether discoveries still hold |\n\nOnly mark `source: user` discoveries stale if the symbol is completely removed.\n\nLightweight update (auto\u002Fhook): re-extract symbols, update headings, flag stale.\nDeep update (manual\u002Fdream): read diffs, generate new discoveries, verify existing ones.\n\n## Phase 3: Capture Conversational Knowledge\n\nWhen the user shares knowledge during the session, write it immediately.\nDo not batch for later.\n\nCapture warnings, gotchas, design intent, history, deprecations, contracts,\nand conventions. Representative examples:\n\n| Signal | Example | Category |\n|--------|---------|----------|\n| Warning | \"Don't change the retry logic, it's subtle\" | warning |\n| Design intent | \"We use this pattern because the API is unreliable\" | intent |\n| Convention | \"Always use the helper in utils.py, not raw SQL\" | convention |\n\nWrite as:\n```markdown\n- \u003Cuser's words, as close to verbatim as possible>\n  _(verified, source: user, citation_score: 0)_\n```\n\nFor knowledge emerging from collaborative work (debugging, refactoring, test failures):\n```markdown\n- \u003Cwhat was discovered and how>\n  _(verified, source: interaction, citation_score: 0)_\n```\n\nAnchor to the specific `file::symbol`. `source: user` and `source: interaction`\nare always `verified`.\n\n### Auto-Placement\n\nUsers will not specify where to store their knowledge. You must find the\ncorrect location. Procedure:\n\n1. Parse the user's statement for code references — file names, function names,\n   class names, module names, variable names, error messages, CLI flags.\n2. If the knowledge is a **project-wide preference or convention** with no code\n   references (e.g., \"always use snake_case\", \"no backward compatibility\",\n   \"prefer small PRs\") → write to `_prefs.md`.\n3. If explicit references found → look up those `file::symbol` paths in\n   `_index.md` and the corresponding shadow files.\n4. If no explicit references → use context:\n   - What file is the user currently viewing or editing?\n   - What files were recently modified in this session?\n   - Search shadow files: `grep -rl \"\u003Ckeyword>\" .shadow\u002F --include=\"*.md\"`\n5. If multiple candidate locations → pick the most specific symbol that the\n   knowledge applies to. Prefer a single `file::symbol` over file-level.\n6. If the knowledge spans 3+ files → create a `_cross\u002F\u003Cslug>.md`\n   entry and add back-pointers to each involved file's `## Cross-References`.\n   For 2-file discoveries, use per-file entries with `Also involves:` instead.\n7. If no matching location exists (e.g., the user mentions a concept not yet in\n   the shadow) → place at the file-level `## File-Level` section of the most\n   relevant file, or create a new `_cross\u002F` entry for repo-wide knowledge.\n\nNever ask the user \"where should I put this?\" — always resolve placement yourself.\n\n## Phase 4: Extract Session Insights\n\nAt session end or manual trigger, review the session for:\n1. Files modified and why\n2. Patterns revealed by the changes\n3. Unrecorded conversational knowledge (user statements not yet shadowed)\n4. Cross-cutting discoveries (create in `_cross\u002F\u003Cslug>.md` if 3+ files involved)\n\n## Phase 5: Handle Structural Changes\n\nAdded files:\n1. Check `.shadow\u002F.shadowignore` — skip if the file matches an ignore pattern\n2. Create `.shadow\u002F\u003Cpath>\u002F\u003Cfile>.md` with symbol-organized template\n3. Add `## Cross-References` section\n4. Add to `_index.md`\n\nDeleted files:\n1. Add `ORPHANED` marker to shadow header\n2. Keep shadow (discoveries explain history)\n3. Mark `[REMOVED]` on any `_cross\u002F` refs pointing to this file\n4. Update `_index.md`\n\nRenamed files:\n1. Move `.shadow\u002F\u003Cold>.md` to `.shadow\u002F\u003Cnew>.md`\n2. Update all `_cross\u002F` `**Refs**:` entries (old path → new path)\n3. Update all `Also involves:` in other per-file shadows\n4. Update `_index.md`\n5. Preserve all discoveries\n\n## Phase 6: Verify and Dedup\n\nFollow the dedup and writing rules in `\u002Fshadow-frog` — read before\nwrite, merge or update existing entries, fix bad format in place.\n\n**Verify exploration discoveries** using the observe-based or do-based\nmethods in `\u002Fshadow-frog` § Verification. `source: user` and\n`source: interaction` → always `verified`; only re-verify if the\nunderlying code changes.\n\n## Phase 7: Verify Reference Integrity\n\nCheck the five core invariants (full 7-invariant set in `\u002Fshadow-frog`):\n- Every `_cross\u002F\u003Cslug>.md` ref has a back-pointer in per-file `## Cross-References`\n- Every `## Cross-References` entry has a corresponding `_cross\u002F\u003Cslug>.md`\n- No duplicate cross-cutting filenames\n- All `Also involves:` use `file::symbol` notation\n- No duplicate discoveries (same behavioral claim at same symbol)\n\nRepair any violations before proceeding.\n\n## Phase 8: Update Metadata\n\nPreserve `dream_cycles_completed` from the existing state — only `dream-reconcile.py` increments it.\nAlso preserve optional `symbol_backend` metadata. After a successful update,\nsave the validated extraction inventory (without its optional `migration`\nsection) to `_meta\u002Fsymbols.json`; refresh `fallback_languages` from that report.\nFor a reviewed backend\u002Fversion migration,\nadopt the report's `symbol_backend` only after all affected headings and\nreferences are reconciled. Never publish new backend metadata or replace a\ngood cache after a failed extraction or incomplete migration.\n\n```json\n{\n  \"version\": 1,\n  \"initialized_at\": \"\u003Cpreserved>\",\n  \"last_update_at\": \"\u003Cnow ISO>\",\n  \"last_commit\": \"\u003Cfull 40-char HEAD SHA>\",\n  \"last_update_type\": \"init|auto|manual|dream|meditate\",\n  \"total_files\": N,\n  \"total_symbols\": N,\n  \"total_discoveries\": N,\n  \"dream_cycles_completed\": \u003Cpreserved>\n}\n```\n\nRefresh `_index.md` with current counts.\n\n## Discovery Writing Rules\n\nSee `\u002Fshadow-frog` § Discovery Format for the verbatim per-file,\ncross-cutting, and preference formats. Rules to keep in mind during\nupdate sessions:\n\n- Start new claims\u002Fpreferences with `citation_score: 0`; preserve the score\n  when updating the same knowledge. Citation-only edits do not add discoveries.\n- Record deliberately consulted existing entries once per task using the core\n  `shadow-cite.py` helper, not a retrieval requirement or a second hidden store.\n- Be behavioral: \"silently returns None on expired tokens\" not \"handles token expiration\"\n- `source: user` and `source: interaction` → always `verified`, use user's own words\n- `source: exploration` → mark `uncertain` unless verified by code reading or tests\n- If 3+ files involved → create in `_cross\u002F\u003Cslug>.md` instead, add back-pointers\n- If project-wide preference with no file reference → write to `_prefs.md`\n- Slug naming: kebab-case derived from title (e.g., \"Token expiry config split\" → `token-expiry-config-split.md`)\n",{"name":5,"description":7},"main","73b1ae349b0f6145755490be033dcc21d07c22c2","skills\u002Fshadow-frog-update",9,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FShadowFrog","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-05 10:56:08",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add microsoft\u002FShadowFrog --skill shadow-frog-update",{"tool":59,"command":60},"bunx","bunx skills add microsoft\u002FShadowFrog --skill shadow-frog-update",{"tool":62,"command":63},"pnpm","pnpm dlx skills add microsoft\u002FShadowFrog --skill shadow-frog-update","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FShadowFrog\u002Fblob\u002Fmain\u002Fskills\u002Fshadow-frog-update\u002FSKILL.md",true,[],[68,88,98,111,119,134],{"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},"01M69BTYQ2DPDT4ZDMD52GJVEJ","shadow-frog","Use a shadow knowledge base to understand any codebase. The .shadow\u002F directory mirrors the source tree with markdown files containing behavioral insights — known bugs, edge cases, implicit contracts, and user preferences. Always check the shadow before editing, debugging, or investigating code. When the user shares important context, write it to the shadow immediately. Invoke shadow-frog-init to create it, shadow-frog-update to refresh it, shadow-frog-dream for autonomous experiments, shadow-frog-nap for lightweight feature-task ideation, shadow-frog-meditate for shadow hygiene, or shadow-frog-viewer for user-facing browsing and visualization.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FShadowFrog\u002Fblob\u002Fmain\u002Fskills\u002Fshadow-frog\u002FSKILL.md",[],[22,21,75,19,76,77,78,79,80,81,82,38,83,84,35,85,86,87,30,25],"nap","init","experiments","directory","debugging","create","meditate","visualization","markdown","dream","write","autonomous","files",{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":39},"01M69BTX451Y89BYJ36DEYJQPA","shadow-frog-viewer","Help users browse and visualize the shadow knowledge base: overview, search for files or symbols or text, view preferences, or see recent discoveries. Invoke when the user wants to see what's in the shadow, get an overview, or find specific knowledge.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FShadowFrog\u002Fblob\u002Fmain\u002Fskills\u002Fshadow-frog-viewer\u002FSKILL.md",[],[95,96,97],"shadow frog viewer","help","visualize",{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":39},"01M69BTS58A2NGMMP9V5SH1FVE","shadow-frog-nap","Generate grounded software feature-task briefs with a small, bounded ideation budget instead of implementing every idea. Read focused source and optional shadow\u002Fdream evidence, grow or resume a persistent proposal tree, and obtain independent shortlist judgments. Run only decision-changing probes of existing behavior. Use mode=coherent to connect each child to its parent's findings or design while encouraging diverse siblings. Use for lightweight ideation, nap runs, or preparing SWE implementation tasks; use shadow-frog-dream for full implementation-backed experiments.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FShadowFrog\u002Fblob\u002Fmain\u002Fskills\u002Fshadow-frog-nap\u002FSKILL.md",[],[75,105,106,107,108,109,77,110],"shadow frog nap","run","generate","connect","tasks","design",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":117,"publishedAt":39},"01M69BTQ4VYJ5TEYGJ0JT6AYYS","shadow-frog-meditate","Clean and consolidate the shadow knowledge base. Scans all shadow files for duplicate discoveries (same claim, different wording), near-duplicates (one extends another), and conflicting entries (contradicting claims). Merges duplicates, resolves conflicts by investigating the code, and asks the user only when resolution is unclear. Invoke periodically to keep the shadow focused and free of noise.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FShadowFrog\u002Fblob\u002Fmain\u002Fskills\u002Fshadow-frog-meditate\u002FSKILL.md",[],[118,38],"shadow frog meditate",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":39},"01M69BTN77C5G6REERWK8G4FB6","shadow-frog-init","Initialize a shadow knowledge base for any codebase. Creates a .shadow\u002F directory that mirrors the source tree with markdown files for AI-discovered insights. Run this once per repo before using other shadow-frog skills. Refuses to overwrite an existing .shadow\u002F unless --reset is passed.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FShadowFrog\u002Fblob\u002Fmain\u002Fskills\u002Fshadow-frog-init\u002FSKILL.md",[],[22,76,126,21,127,78,106,83,35,128,87,31,30,129,26,25,130,131,132,133],"shadow frog init","repo","initialize","reset","tree","for","codebase","Existing",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":145,"publishedAt":39},"01M69BTHHMPCWRRG66A846XZ06","shadow-frog-dream","Run autonomous experimentation while the user is AFK. Uses 6 investigation categories (investigation, bug hunting, feature design, refactoring, optimization, security audit) to systematically discover non-obvious behaviors. Every task is an experiment — implement in worktrees, commit to persistent dream branches, and push to the configured remote. Dreams compound across sessions: future experiments branch from prior dream branches, building a tree of progressively deeper work. Invoke when the user is AFK or asks for a dream run. Use mode=coherent to ground each child in its parent while encouraging diverse siblings, challenges, and alternatives.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002FShadowFrog\u002Fblob\u002Fmain\u002Fskills\u002Fshadow-frog-dream\u002FSKILL.md",[140],{"categoryNo":141,"categoryName":142,"taxonomyType":143,"taxonomyTypeDesc":144},"01JBSEEDCAT000000000000015","视觉设计","SCENARIO","使用场景",[146,110,147,148,77,149,150,151,152,153,106],"shadow frog dream","security","implement","sessions","commit","validate","setup","cleanup"]