[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71G8339FX52V423KQ8BKGNP":3,"skill-same:01M71G8339FX52V423KQ8BKGNP":62},{"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":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":6,"ownerHtmlUrl":46,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":47,"install":48,"resources":61},"01M71G8339FX52V423KQ8BKGNP","update-docs",null,"Update project documentation to reflect code changes. Trigger after implementing features, fixing bugs, or modifying architecture. Scans git diff, maps changes to docs, and updates them.","maThiaslI152\u002FOwlynnV2","maThiaslI152","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F194800114?v=4","01M71G7XM62JBZ1M6KBTKEDKMQ","01M71G7XMVFW6YM2ZFHECBP4S1",1,"MIT","https:\u002F\u002Fgithub.com\u002FmaThiaslI152\u002FOwlynnV2\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fupdate-docs\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"update","docs","update docs","changes","trigger","diff","bugs","project documentation","git","features","reflect","documentation","maps","architecture","code","updates","implementing","project","2026-11-10 10:12:30",false,"---\nname: update-docs\ndescription: Update project documentation to reflect code changes. Trigger after implementing features, fixing bugs, or modifying architecture. Scans git diff, maps changes to docs, and updates them.\n---\n\n# Update Documentation\n\nKeep documentation in sync with code changes. Run this after any significant code modification.\n\n## Workflow\n\n### Step 1: Identify Changes\n\nRun `git diff --name-only HEAD` and `git diff --stat` to find what changed. If there are no uncommitted changes, compare against the last commit: `git diff --name-only HEAD~1`.\n\nGroup changed files by area:\n\n| Changed path | Doc area to check |\n|---|---|\n| `src\u002Fagent\u002Fnodes\u002F*.py` | `docs\u002Farchitecture\u002F`, `docs\u002Fdevelopment\u002F`, `AGENTS.md` |\n| `src\u002Fagent\u002Frouting\u002F*.py` | `docs\u002Fdevelopment\u002FEXTENDING_AGENT.md`, `docs\u002Farchitecture\u002Foverview.md` |\n| `src\u002Ftools\u002F*.py` | `docs\u002Ffeatures\u002FTOOLS.md`, `AGENTS.md` task routing table |\n| `src\u002Fapi\u002Froutes\u002F*.py` | `docs\u002FAPI_REFERENCE.md`, `docs\u002Fdevelopment\u002FCHAT_PROTOCOL.md` |\n| `src\u002Fapi\u002Fws\u002F*.py` | `docs\u002Fdevelopment\u002FCHAT_PROTOCOL.md` |\n| `src\u002Fmemory\u002F*.py` | `docs\u002Ffeatures\u002FMEMORY.md` |\n| `src\u002Fconfig\u002F*.py` or `defaults.yaml` | `docs\u002Farchitecture\u002Foverview.md`, relevant feature docs |\n| `src\u002Fpdf\u002F*.py` | `docs\u002Fguides\u002Fdev-startup.md` |\n| `frontend-v2\u002Fsrc\u002F**\u002F*.tsx` | `docs\u002Farchitecture\u002Foverview.md`, relevant feature docs |\n| `docker-compose.yml` | `docs\u002Fguides\u002Fdev-startup.md`, `docs\u002Farchitecture\u002Foverview.md` |\n| `scripts\u002F*.sh` or `scripts\u002F*.py` | `docs\u002Fstandards\u002FEVALUATION.md`, `docs\u002Fguides\u002Fdev-startup.md` |\n| `.agents\u002Fskills\u002F*\u002FSKILL.md` | `AGENTS.md` skills section |\n| `src\u002Fagent\u002Fhitl\u002F*.py` | `docs\u002FHITL.md` |\n| `src\u002Fmemory\u002Fsemantic_cache.py` | `docs\u002Ffeatures\u002FSEMANTIC_CACHE.md` |\n| `src\u002Fagent\u002Fcore\u002Fgraph.py` | `docs\u002Farchitecture\u002FPOSTGRES_MEMORY_LIFECYCLE.md` |\n\n### Step 2: Find Referencing Docs\n\nFor each changed file, search the `docs\u002F` directory and `AGENTS.md` for references to that file path. Use grep:\n\n```\ngrep -rl \"path\u002Fto\u002Fchanged\u002Ffile\" docs\u002F AGENTS.md\n```\n\nAlso check if the changed module is mentioned in:\n- `docs\u002FINDEX.md` (machine manifest)\n- `docs\u002FREADME.md` or `docs\u002FINDEX.md` (navigation)\n- Any `CHANGELOG.md` in `docs\u002Fchanges\u002F`\n\n### Step 3: Read and Update Each Doc\n\nFor each doc that references changed code:\n\n1. **Read the doc** to understand its structure and conventions\n2. **Verify accuracy** — does the doc still describe the code correctly?\n3. **Update stale content**:\n   - Function signatures that changed\n   - File paths that moved\n   - New parameters or config options\n   - Removed features or deprecated code\n   - New tools, nodes, or modules\n4. **Update timestamps** — find the `last_updated:` field in frontmatter or `Last updated` line and set it to today's date (`YYYY-MM-DD`)\n5. **Preserve style** — match the existing doc's formatting, heading levels, and conventions\n\n### Step 4: Update AGENTS.md Task Routing Table\n\nIf the change adds a new module, tool, or feature area:\n\n1. Check if a row already exists in the \"Task routing\" table in `AGENTS.md`\n2. If not, add a row following the existing format: `| I want to… | Read | Edit |`\n3. If the row exists but the \"Edit\" column is stale, update it\n\n### Step 5: Update docs\u002FINDEX.md\n\nIf any doc's `last_updated` changed:\n\n1. Read `docs\u002FINDEX.md`\n2. Find the matching entry in the YAML manifest\n3. Update its `last_updated` field\n4. Bump the `manifest.version` if entries were added\u002Fremoved\n5. Update `manifest.generated` timestamp\n\n### Step 6: Create Changelog Entry (if significant)\n\nIf the change is a user-facing feature or a breaking change:\n\n1. Create `docs\u002Fchanges\u002F\u003Cfeature-name>\u002FCHANGELOG.md` following the existing pattern\n2. Use format: `## \u003Cdate> — \u003Csummary>` with sections for What, Why, Files\n\n## Rules\n\n- **Never delete docs** — only update or add. If a doc is fully obsolete, mark it with `status: deprecated` in frontmatter.\n- **Never add comments** to code files — only update `.md` files.\n- **Preserve frontmatter** — keep all YAML frontmatter fields, only update `last_updated`.\n- **Use today's date** for all timestamps, format: `YYYY-MM-DD`.\n- **Be surgical** — only modify the lines that are stale. Don't rewrite entire sections.\n- **Check before editing** — always read the file first to understand its structure.\n\n## Quick Reference: Common Updates\n\n### New tool added\n1. `docs\u002Ffeatures\u002FTOOLS.md` — add to appropriate toolbox section\n2. `AGENTS.md` — update task routing if it maps to a new \"I want to…\" row\n3. `src\u002Fagent\u002Fnodes\u002Fsecurity_proxy.py` — check if it needs to be in `SENSITIVE_TOOLS` or `SAFE_TOOLS`\n\n### New config option in defaults.yaml\n1. Find the feature doc that covers this config area\n2. Add the option to the relevant config table or section\n3. Document the env var override if applicable\n\n### New API endpoint\n1. `docs\u002FAPI_REFERENCE.md` or create if needed\n2. `docs\u002Fdevelopment\u002FCHAT_PROTOCOL.md` if it's a WebSocket event\n3. `AGENTS.md` if it changes task routing\n\n### New node in agent graph\n1. `docs\u002Farchitecture\u002Foverview.md` — add to module table\n2. `docs\u002Fdevelopment\u002FEXTENDING_AGENT.md` if it changes routing\n3. `AGENTS.md` task routing table\n\n### Security-related change\n1. `docs\u002FHITL.md` if it affects approval flow\n2. `docs\u002Farchitecture\u002FCLOUD-LLM-ARCHITECTURE.md` if it affects cloud calls\n3. Any feature doc that references the changed security mechanism\n","# Update Documentation\n\nKeep documentation in sync with code changes. Run this after any significant code modification.\n\n## Workflow\n\n### Step 1: Identify Changes\n\nRun `git diff --name-only HEAD` and `git diff --stat` to find what changed. If there are no uncommitted changes, compare against the last commit: `git diff --name-only HEAD~1`.\n\nGroup changed files by area:\n\n| Changed path | Doc area to check |\n|---|---|\n| `src\u002Fagent\u002Fnodes\u002F*.py` | `docs\u002Farchitecture\u002F`, `docs\u002Fdevelopment\u002F`, `AGENTS.md` |\n| `src\u002Fagent\u002Frouting\u002F*.py` | `docs\u002Fdevelopment\u002FEXTENDING_AGENT.md`, `docs\u002Farchitecture\u002Foverview.md` |\n| `src\u002Ftools\u002F*.py` | `docs\u002Ffeatures\u002FTOOLS.md`, `AGENTS.md` task routing table |\n| `src\u002Fapi\u002Froutes\u002F*.py` | `docs\u002FAPI_REFERENCE.md`, `docs\u002Fdevelopment\u002FCHAT_PROTOCOL.md` |\n| `src\u002Fapi\u002Fws\u002F*.py` | `docs\u002Fdevelopment\u002FCHAT_PROTOCOL.md` |\n| `src\u002Fmemory\u002F*.py` | `docs\u002Ffeatures\u002FMEMORY.md` |\n| `src\u002Fconfig\u002F*.py` or `defaults.yaml` | `docs\u002Farchitecture\u002Foverview.md`, relevant feature docs |\n| `src\u002Fpdf\u002F*.py` | `docs\u002Fguides\u002Fdev-startup.md` |\n| `frontend-v2\u002Fsrc\u002F**\u002F*.tsx` | `docs\u002Farchitecture\u002Foverview.md`, relevant feature docs |\n| `docker-compose.yml` | `docs\u002Fguides\u002Fdev-startup.md`, `docs\u002Farchitecture\u002Foverview.md` |\n| `scripts\u002F*.sh` or `scripts\u002F*.py` | `docs\u002Fstandards\u002FEVALUATION.md`, `docs\u002Fguides\u002Fdev-startup.md` |\n| `.agents\u002Fskills\u002F*\u002FSKILL.md` | `AGENTS.md` skills section |\n| `src\u002Fagent\u002Fhitl\u002F*.py` | `docs\u002FHITL.md` |\n| `src\u002Fmemory\u002Fsemantic_cache.py` | `docs\u002Ffeatures\u002FSEMANTIC_CACHE.md` |\n| `src\u002Fagent\u002Fcore\u002Fgraph.py` | `docs\u002Farchitecture\u002FPOSTGRES_MEMORY_LIFECYCLE.md` |\n\n### Step 2: Find Referencing Docs\n\nFor each changed file, search the `docs\u002F` directory and `AGENTS.md` for references to that file path. Use grep:\n\n```\ngrep -rl \"path\u002Fto\u002Fchanged\u002Ffile\" docs\u002F AGENTS.md\n```\n\nAlso check if the changed module is mentioned in:\n- `docs\u002FINDEX.md` (machine manifest)\n- `docs\u002FREADME.md` or `docs\u002FINDEX.md` (navigation)\n- Any `CHANGELOG.md` in `docs\u002Fchanges\u002F`\n\n### Step 3: Read and Update Each Doc\n\nFor each doc that references changed code:\n\n1. **Read the doc** to understand its structure and conventions\n2. **Verify accuracy** — does the doc still describe the code correctly?\n3. **Update stale content**:\n   - Function signatures that changed\n   - File paths that moved\n   - New parameters or config options\n   - Removed features or deprecated code\n   - New tools, nodes, or modules\n4. **Update timestamps** — find the `last_updated:` field in frontmatter or `Last updated` line and set it to today's date (`YYYY-MM-DD`)\n5. **Preserve style** — match the existing doc's formatting, heading levels, and conventions\n\n### Step 4: Update AGENTS.md Task Routing Table\n\nIf the change adds a new module, tool, or feature area:\n\n1. Check if a row already exists in the \"Task routing\" table in `AGENTS.md`\n2. If not, add a row following the existing format: `| I want to… | Read | Edit |`\n3. If the row exists but the \"Edit\" column is stale, update it\n\n### Step 5: Update docs\u002FINDEX.md\n\nIf any doc's `last_updated` changed:\n\n1. Read `docs\u002FINDEX.md`\n2. Find the matching entry in the YAML manifest\n3. Update its `last_updated` field\n4. Bump the `manifest.version` if entries were added\u002Fremoved\n5. Update `manifest.generated` timestamp\n\n### Step 6: Create Changelog Entry (if significant)\n\nIf the change is a user-facing feature or a breaking change:\n\n1. Create `docs\u002Fchanges\u002F\u003Cfeature-name>\u002FCHANGELOG.md` following the existing pattern\n2. Use format: `## \u003Cdate> — \u003Csummary>` with sections for What, Why, Files\n\n## Rules\n\n- **Never delete docs** — only update or add. If a doc is fully obsolete, mark it with `status: deprecated` in frontmatter.\n- **Never add comments** to code files — only update `.md` files.\n- **Preserve frontmatter** — keep all YAML frontmatter fields, only update `last_updated`.\n- **Use today's date** for all timestamps, format: `YYYY-MM-DD`.\n- **Be surgical** — only modify the lines that are stale. Don't rewrite entire sections.\n- **Check before editing** — always read the file first to understand its structure.\n\n## Quick Reference: Common Updates\n\n### New tool added\n1. `docs\u002Ffeatures\u002FTOOLS.md` — add to appropriate toolbox section\n2. `AGENTS.md` — update task routing if it maps to a new \"I want to…\" row\n3. `src\u002Fagent\u002Fnodes\u002Fsecurity_proxy.py` — check if it needs to be in `SENSITIVE_TOOLS` or `SAFE_TOOLS`\n\n### New config option in defaults.yaml\n1. Find the feature doc that covers this config area\n2. Add the option to the relevant config table or section\n3. Document the env var override if applicable\n\n### New API endpoint\n1. `docs\u002FAPI_REFERENCE.md` or create if needed\n2. `docs\u002Fdevelopment\u002FCHAT_PROTOCOL.md` if it's a WebSocket event\n3. `AGENTS.md` if it changes task routing\n\n### New node in agent graph\n1. `docs\u002Farchitecture\u002Foverview.md` — add to module table\n2. `docs\u002Fdevelopment\u002FEXTENDING_AGENT.md` if it changes routing\n3. `AGENTS.md` task routing table\n\n### Security-related change\n1. `docs\u002FHITL.md` if it affects approval flow\n2. `docs\u002Farchitecture\u002FCLOUD-LLM-ARCHITECTURE.md` if it affects cloud calls\n3. Any feature doc that references the changed security mechanism\n",{"name":5,"description":7},"main","b66b26cd1c7581bf8af8f0781b92bd072318b1c9",".agents\u002Fskills\u002Fupdate-docs",0,"https:\u002F\u002Fgithub.com\u002FmaThiaslI152\u002FOwlynnV2","https:\u002F\u002Fgithub.com\u002FmaThiaslI152","2026-09-08 12:27:42",{"source":8,"skillName":5,"commands":49,"prompt":59,"zipAvailable":60},[50,53,56],{"tool":51,"command":52},"npx","npx skills add maThiaslI152\u002FOwlynnV2 --skill update-docs",{"tool":54,"command":55},"bunx","bunx skills add maThiaslI152\u002FOwlynnV2 --skill update-docs",{"tool":57,"command":58},"pnpm","pnpm dlx skills add maThiaslI152\u002FOwlynnV2 --skill update-docs","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FmaThiaslI152\u002FOwlynnV2\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fupdate-docs\u002FSKILL.md",true,[],[63,77,87,103,113,127],{"skillNo":64,"name":65,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":69,"publishedAt":36},"01M71G8QVFENJMT5Q4EHR7Y6G4","weather_lookup","Procedural skill synthesized from user workflow","https:\u002F\u002Fgithub.com\u002FmaThiaslI152\u002FOwlynnV2\u002Fblob\u002Fmain\u002Fskills\u002Fweather_lookup\u002FSKILL.md",[],[70,71,72,73,74,75,76],"weather lookup","weather","lookup","general","workflow","procedural","user",{"skillNo":78,"name":79,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":82,"publishedAt":36},"01M71G8P5WSK13A308EPFPYV8K","reprompt_on_no_tools","https:\u002F\u002Fgithub.com\u002FmaThiaslI152\u002FOwlynnV2\u002Fblob\u002Fmain\u002Fskills\u002Freprompt_on_no_tools\u002FSKILL.md",[],[83,84,85,86,75,76,74],"reprompt on no tools","no tools","Tools","productivity",{"skillNo":88,"name":89,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":97,"publishedAt":36},"01M71G8M5FQQ8PVXYNVJDWP1A5","prioritize_official_gov_sources_over_aggregators","https:\u002F\u002Fgithub.com\u002FmaThiaslI152\u002FOwlynnV2\u002Fblob\u002Fmain\u002Fskills\u002Fprioritize_official_gov_sources_over_aggregators\u002FSKILL.md",[92],{"categoryNo":93,"categoryName":94,"taxonomyType":95,"taxonomyTypeDesc":96},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",[98,99,100,101,75,74,76,102],"official","prioritize official gov sources over aggregators","prioritize","sources","research",{"skillNo":104,"name":105,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":108,"publishedAt":36},"01M71G8JTC4NPQ5Q67QS243M5Y","matplotlib_horizontal_bar","https:\u002F\u002Fgithub.com\u002FmaThiaslI152\u002FOwlynnV2\u002Fblob\u002Fmain\u002Fskills\u002Fmatplotlib_horizontal_bar\u002FSKILL.md",[],[109,110,111,112,75,74,76],"matplotlib","bar","matplotlib horizontal bar","data",{"skillNo":114,"name":115,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":123,"publishedAt":36},"01M71G8H910CPXZQ4ACKV8M0Y3","live-data-lookup","https:\u002F\u002Fgithub.com\u002FmaThiaslI152\u002FOwlynnV2\u002Fblob\u002Fmain\u002Fskills\u002Flive-data-lookup\u002FSKILL.md",[118],{"categoryNo":119,"categoryName":120,"taxonomyType":121,"taxonomyTypeDesc":122},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[124,125,72,126,112,102,75,74,76],"data lookup","live data lookup","live",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":140,"publishedAt":36},"01M71G8FNE5SQSCY5E4RG4QH2H","html_comparison_chart","Offline Chart.js HTML bar\u002Fline\u002Fpie charts for pre-known comparison data","https:\u002F\u002Fgithub.com\u002FmaThiaslI152\u002FOwlynnV2\u002Fblob\u002Fmain\u002Fskills\u002Fhtml_comparison_chart\u002FSKILL.md",[133,136,139],{"categoryNo":134,"categoryName":135,"taxonomyType":95,"taxonomyTypeDesc":96},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":137,"categoryName":138,"taxonomyType":95,"taxonomyTypeDesc":96},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":119,"categoryName":120,"taxonomyType":121,"taxonomyTypeDesc":122},[141,142,143,144,145,146,147,148,149,112,150,110,151],"comparison","chart","html","html comparison chart","js","Charts","for","line","price","offline","bar chart"]