[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6NNDF6W371DCD947K5YNBFV":3,"skill-same:01M6NNDF6W371DCD947K5YNBFV":77},{"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":25,"publishedAt":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":6,"ownerHtmlUrl":61,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":62,"install":63,"resources":76},"01M6NNDF6W371DCD947K5YNBFV","knowledge-graph",null,"Query the fleet knowledge graph before grep for cross-repo questions (what depends on X, where is Y enforced, what did the dependency graph look like on date D, what has any agent learned about Z). Covers the kg_* MCP tool surface, kg_context as the default entry point, point-in-time queries, publishing agent-fact episodes, and the revkg CLI equivalents. GAP-349.","revealui-studio\u002Frevskills","revealui-studio","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F338824821?v=4","01M6NNBRBPN7P6MK70FZQZ5RAQ","01M6NNBRG527YFDFHNYKTCDA4Y",2,"MIT","https:\u002F\u002Fgithub.com\u002Frevealui-studio\u002Frevskills\u002Fblob\u002Ftest\u002Fskills\u002Fknowledge-graph\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"graph","knowledge graph","knowledge","dependency graph","for","studio","learned","gap","as","time","query","default","queries","MCP","publishing","dependency","repo","tool","Bash","cli","2026-11-10 10:12:30",false,"---\nname: knowledge-graph\ndescription: Query the fleet knowledge graph before grep for cross-repo questions (what depends on X, where is Y enforced, what did the dependency graph look like on date D, what has any agent learned about Z). Covers the kg_* MCP tool surface, kg_context as the default entry point, point-in-time queries, publishing agent-fact episodes, and the revkg CLI equivalents. GAP-349.\nlicense: MIT\nallowed-tools: Bash, Read, Grep, Glob\nmetadata:\n  author: RevealUI Studio\n  version: \"0.2.0\"\n  website: https:\u002F\u002Frevealui.com\n---\n\n# Fleet Knowledge Graph\n\n## Relation to exhaustive audits\n\nFor multi-session **line-level** codebase audits, use the `exhaustive-audit`\nskill first (path inventory + coverage ledger). The graph maps relationships\nand history; it does **not** prove every file body was read. After inventory,\n`revkg scan` \u002F `kg_context` \u002F `kg_neighbors` are the right tools for system\nmaps and blast-radius views.\n\n## When to query the graph\n\nThe fleet knowledge graph is a bi-temporal, content-addressed graph of every\nrepo, package, file, exported symbol, dependency edge, db table, route,\nskill, rule, hook, gap, lane, ADR, and agent discovery in RevealFleet. It is\nsearchable by hybrid retrieval (vector + full-text + graph traversal) and\nevery fact carries provenance back to the episode that produced it.\n\n**Query-before-grep** for cross-repo or \"what depends on this\" questions:\n\n- \"What consumes `coordination_events` and what breaks if I rename it?\" A\n  traversal question. `grep` finds string matches; the graph finds edges.\n- \"Where is licensing enforced across the fleet?\" A cross-repo hybrid\n  search question. One query, not thirteen repo greps.\n- \"What did the dependency graph of `@revealui\u002Fai` look like on June 1?\" A\n  point-in-time question `grep` cannot answer at all.\n- \"What has any agent ever learned about the Electric proxy?\" A\n  provenance question over agent-fact episodes.\n\nPlain `grep`\u002F`Read` still wins for single-file, single-repo, \"show me this\nexact function body\" lookups. Reach for the graph when the question spans\nrepos, spans time, or asks about relationships rather than text.\n\n## The MCP tool surface\n\nSeven tools, all under `@revealui\u002Fmcp`'s `kg-server` factory\n(`createKnowledgeGraphServer`), wrapping `@revealui\u002Fknowledge-graph`'s\nsearch and ingest APIs. Studio attaches them with stdio\n`revealui-mcp knowledge-graph`. Hosted clients use the same names on\ngoverned `\u002Fapi\u002Fmcp` (no second MCP URL).\n\n| Tool | Use for |\n|---|---|\n| `kg_context` | **Default entry point.** Budgeted context assembly from an anchor node (see below). |\n| `kg_search` | Open-ended hybrid search (vector + FTS + BFS), returns nodes and facts with provenance. |\n| `kg_get_node` | Fetch one node plus its current facts by natural key. |\n| `kg_neighbors` | BFS neighbors of a node, current or point-in-time. |\n| `kg_path` | Shortest path between two nodes. |\n| `kg_at_time` | A node's facts as of a timestamp. |\n| `kg_add_episode` | The only write tool. Publish a durable episode (see below). |\n\nNatural keys are the graph's stable node identifiers, e.g.\n`revealui\u002Fpackages\u002Fai\u002Fsrc\u002Fllm\u002Fclient.ts#getClient` for a symbol, or\n`npm:zod` for an external dependency. `kg_search` finds a node's natural key\nfrom a free-text query when you don't already know it.\n\nExample calls (arguments shown as the tool's JSON input):\n\n```json\n{ \"tool\": \"kg_search\", \"arguments\": { \"query\": \"licensing enforcement\", \"limit\": 10 } }\n```\n\n```json\n{ \"tool\": \"kg_get_node\", \"arguments\": { \"naturalKey\": \"revealui\u002Fpackages\u002Fpaywall\u002Fsrc\u002Findex.ts#requireFeature\" } }\n```\n\n```json\n{ \"tool\": \"kg_neighbors\", \"arguments\": { \"naturalKey\": \"revealui\u002Fpackages\u002Fdb\u002Fsrc\u002Fschema\u002Fcoordination.ts\", \"depth\": 2 } }\n```\n\n## `kg_context`: the default entry point\n\nBefore starting nontrivial work on an unfamiliar file, package, or gap,\npull its context first instead of grepping around blind:\n\n```json\n{\n  \"tool\": \"kg_context\",\n  \"arguments\": {\n    \"naturalKey\": \"revealui\u002Fpackages\u002Fknowledge-graph\u002Fsrc\u002Fingest\u002Fengine.ts\",\n    \"depth\": 2,\n    \"charBudget\": 16000\n  }\n}\n```\n\nThis runs a BFS from the anchor node, reranks by node-distance and\nepisode-mentions, and packs node summaries plus edge facts (each carrying\nits provenance episode ids) into a text block capped at `charBudget`\ncharacters (default 16000; characters, not tokens). In product mode the\npacked string is `data.context` on the envelope (not the JSON root); the\nsame payload reports `truncated`, `charsUsed`, `nodeCount`, and\n`factCount` so you know whether the packed block is the whole neighborhood\nor a budgeted slice of it. Prefer this over `kg_search` when the question\nis \"what do I need to know before touching X.\" `kg_search` is for\nopen-ended queries where you don't yet have an anchor.\n\n## Point-in-time query recipes\n\nEvery read tool except `kg_get_node` accepts an optional `at` (ISO-8601\ntimestamp). Omit it for the current graph; pass it to see the graph as it\nwas at that moment. Edges are never deleted, only invalidated, so history\nis queryable, not reconstructed.\n\nRecipes:\n\n- **\"What did X depend on before this refactor landed?\"**\n  `kg_neighbors` with `naturalKey` set to the package\u002Ffile and `at` set to\n  a timestamp just before the refactor's merge commit.\n- **\"What were the current facts about this node on a given date?\"**\n  `kg_at_time` with that date.\n- **\"Did this edge exist yet when I started this session?\"**\n  `kg_search` with `at` set to the session start time, then check whether\n  the fact appears in `result.facts`.\n\nA timestamp with no matching state simply returns fewer or no results.\nThere is no error for \"too early,\" since `validAt`\u002F`invalidAt` windows are\nexact.\n\n## Publishing agent-fact episodes\n\n`kg_add_episode` is the only write tool. It is always additive (never a\nrescan) and Zod-validates `episodeType`, every node `kind`, and every edge\n`relation` against the graph's ontology enums server-side: invalid values\nare rejected before anything is written, and there is no path to raw SQL or\ntable names through this tool.\n\nUse it to durably record an end-of-session discovery instead of letting it\ndie in a handoff doc. This extends the `shared_facts` flow from the\n`multi-agent-memory` skill: a `shared_facts` row is session-scoped and\nephemeral, while a `kg_add_episode` call with `episodeType: \"agent-fact\"`\nbecomes a permanent, queryable graph fact with full provenance. Product\nmode stamps `source` and actor DID from the session principal — do not\npass `\"source\": \"claude-session\"`; the client field is ignored. See\n`multi-agent-memory` for the session order and the durable vs working vs session table.\nSession start names this graph first and does not auto-query it. `--memory` on\n`session adapter` is the opt-in read.\n\n```json\n{\n  \"tool\": \"kg_add_episode\",\n  \"arguments\": {\n    \"episodeType\": \"agent-fact\",\n    \"content\": \"the Electric proxy retries with exponential backoff on 5xx\",\n    \"classification\": \"workspace\",\n    \"nodes\": [\n      {\n        \"kind\": \"concept\",\n        \"name\": \"Electric proxy retry behavior\",\n        \"naturalKey\": \"concept:electric-proxy-retry-backoff\"\n      }\n    ],\n    \"edges\": [\n      {\n        \"source\": { \"kind\": \"concept\", \"naturalKey\": \"concept:electric-proxy-retry-backoff\" },\n        \"target\": { \"kind\": \"file\", \"naturalKey\": \"revealui\u002Fapps\u002Fadmin\u002Fsrc\u002Flib\u002Fapi\u002Felectric-proxy.ts\" },\n        \"relation\": \"documents\",\n        \"fact\": \"electric-proxy.ts retries with exponential backoff on 5xx\"\n      }\n    ]\n  }\n}\n```\n\n**Explicit invocation only.** Publishing an episode is a deliberate act at\nthe point a discovery is worth keeping. There is no hook that\nauto-publishes on session end or on every tool call. Call `kg_add_episode`\nyourself when you have something durable to say, the same way you would\ndecide to write a `shared_facts` row.\n\n## Launcher, identity, envelope\n\nStudio stdio: `revealui-mcp knowledge-graph`. Set `REVDEV_AGENT_ID` so the\nserver can load the hook identity\n(`REVDEV_HOOK_IDENTITY_DIR`, default\n`~\u002F.local\u002Fshare\u002Frevealui\u002Fhook-identities`). Missing principal → envelope\n`unavailable` \u002F `principal-missing`, one WARN per process, then proceed.\nDo not invent a session-named `source` to paper over it.\n\nHosted: same `kg_*` tools on `\u002Fapi\u002Fmcp` with a device token. Tenant is the\ncaller's `accountId`, not `studio-local`.\n\nEvery product-mode JSON body is an envelope:\n\n| `status` | Meaning |\n|---|---|\n| `ok` | `available: true`, `enforcement`, `deniedCount`, `data` |\n| `denied` | In-scope result set empty and `deniedCount > 0`. Not an empty success. |\n| `unavailable` | Graph down, timeout, or principal missing. Session continues. |\n\n`ok` with empty lists and `deniedCount: 0` means nothing exists. Treat\n`unavailable` as a WARN, not a silent empty graph.\n\nIf a discovery contradicts an existing edge, still just call\n`kg_add_episode` with the corrected fact. The ingest engine's entity\nresolution and re-scan diffing are for the deterministic scan path\n(`revkg scan`), not for episode ingestion, so a contradicting agent-fact\nepisode lands as new provenance alongside the old one rather than silently\noverwriting it. Note the contradiction in your `content` field so a human\nor a future Tier-2 LLM pass can reconcile it.\n\n## The `revkg` CLI equivalents\n\nEvery read-side MCP tool has a CLI counterpart for ad-hoc terminal use\n(connects to Neon via `POSTGRES_URL`\u002F`DATABASE_URL`, same as any other\nfleet script):\n\n```bash\nrevkg search \"licensing enforcement\" --limit 10\nrevkg node revealui\u002Fpackages\u002Fpaywall\u002Fsrc\u002Findex.ts#requireFeature\nrevkg neighbors revealui\u002Fpackages\u002Fdb\u002Fsrc\u002Fschema\u002Fcoordination.ts --depth 2\nrevkg at revealui\u002Fpackages\u002Fdb\u002Fsrc\u002Fschema\u002Fcoordination.ts 2026-06-01T00:00:00Z\nrevkg scan --repo revealui        # single repo, deterministic Tier-1 extractors\nrevkg scan --fleet                # every repo under the same parent directory\n```\n\nThere is no CLI write path equivalent to `kg_add_episode`: `revkg scan`\nonly ever runs the deterministic re-scan path (`applyScan`), never additive\nepisode ingestion. Publishing an agent-fact episode is an MCP-tool-only\n(or direct `ingestEpisode` API) action by design, since it is inherently an\nagent (or human) asserting something, not a scan discovering it.\n\n## Degradation behavior\n\nRead tools work with no pgvector extension and no embedding model running:\nthe vector search channel is skipped whenever no query embedding is\navailable, falling back to full-text search plus BFS traversal. Don't\nexpect a `kg_search` failure just because Ollama is down. Expect slightly\nlower recall on paraphrased queries, not an error.\n","# Fleet Knowledge Graph\n\n## Relation to exhaustive audits\n\nFor multi-session **line-level** codebase audits, use the `exhaustive-audit`\nskill first (path inventory + coverage ledger). The graph maps relationships\nand history; it does **not** prove every file body was read. After inventory,\n`revkg scan` \u002F `kg_context` \u002F `kg_neighbors` are the right tools for system\nmaps and blast-radius views.\n\n## When to query the graph\n\nThe fleet knowledge graph is a bi-temporal, content-addressed graph of every\nrepo, package, file, exported symbol, dependency edge, db table, route,\nskill, rule, hook, gap, lane, ADR, and agent discovery in RevealFleet. It is\nsearchable by hybrid retrieval (vector + full-text + graph traversal) and\nevery fact carries provenance back to the episode that produced it.\n\n**Query-before-grep** for cross-repo or \"what depends on this\" questions:\n\n- \"What consumes `coordination_events` and what breaks if I rename it?\" A\n  traversal question. `grep` finds string matches; the graph finds edges.\n- \"Where is licensing enforced across the fleet?\" A cross-repo hybrid\n  search question. One query, not thirteen repo greps.\n- \"What did the dependency graph of `@revealui\u002Fai` look like on June 1?\" A\n  point-in-time question `grep` cannot answer at all.\n- \"What has any agent ever learned about the Electric proxy?\" A\n  provenance question over agent-fact episodes.\n\nPlain `grep`\u002F`Read` still wins for single-file, single-repo, \"show me this\nexact function body\" lookups. Reach for the graph when the question spans\nrepos, spans time, or asks about relationships rather than text.\n\n## The MCP tool surface\n\nSeven tools, all under `@revealui\u002Fmcp`'s `kg-server` factory\n(`createKnowledgeGraphServer`), wrapping `@revealui\u002Fknowledge-graph`'s\nsearch and ingest APIs. Studio attaches them with stdio\n`revealui-mcp knowledge-graph`. Hosted clients use the same names on\ngoverned `\u002Fapi\u002Fmcp` (no second MCP URL).\n\n| Tool | Use for |\n|---|---|\n| `kg_context` | **Default entry point.** Budgeted context assembly from an anchor node (see below). |\n| `kg_search` | Open-ended hybrid search (vector + FTS + BFS), returns nodes and facts with provenance. |\n| `kg_get_node` | Fetch one node plus its current facts by natural key. |\n| `kg_neighbors` | BFS neighbors of a node, current or point-in-time. |\n| `kg_path` | Shortest path between two nodes. |\n| `kg_at_time` | A node's facts as of a timestamp. |\n| `kg_add_episode` | The only write tool. Publish a durable episode (see below). |\n\nNatural keys are the graph's stable node identifiers, e.g.\n`revealui\u002Fpackages\u002Fai\u002Fsrc\u002Fllm\u002Fclient.ts#getClient` for a symbol, or\n`npm:zod` for an external dependency. `kg_search` finds a node's natural key\nfrom a free-text query when you don't already know it.\n\nExample calls (arguments shown as the tool's JSON input):\n\n```json\n{ \"tool\": \"kg_search\", \"arguments\": { \"query\": \"licensing enforcement\", \"limit\": 10 } }\n```\n\n```json\n{ \"tool\": \"kg_get_node\", \"arguments\": { \"naturalKey\": \"revealui\u002Fpackages\u002Fpaywall\u002Fsrc\u002Findex.ts#requireFeature\" } }\n```\n\n```json\n{ \"tool\": \"kg_neighbors\", \"arguments\": { \"naturalKey\": \"revealui\u002Fpackages\u002Fdb\u002Fsrc\u002Fschema\u002Fcoordination.ts\", \"depth\": 2 } }\n```\n\n## `kg_context`: the default entry point\n\nBefore starting nontrivial work on an unfamiliar file, package, or gap,\npull its context first instead of grepping around blind:\n\n```json\n{\n  \"tool\": \"kg_context\",\n  \"arguments\": {\n    \"naturalKey\": \"revealui\u002Fpackages\u002Fknowledge-graph\u002Fsrc\u002Fingest\u002Fengine.ts\",\n    \"depth\": 2,\n    \"charBudget\": 16000\n  }\n}\n```\n\nThis runs a BFS from the anchor node, reranks by node-distance and\nepisode-mentions, and packs node summaries plus edge facts (each carrying\nits provenance episode ids) into a text block capped at `charBudget`\ncharacters (default 16000; characters, not tokens). In product mode the\npacked string is `data.context` on the envelope (not the JSON root); the\nsame payload reports `truncated`, `charsUsed`, `nodeCount`, and\n`factCount` so you know whether the packed block is the whole neighborhood\nor a budgeted slice of it. Prefer this over `kg_search` when the question\nis \"what do I need to know before touching X.\" `kg_search` is for\nopen-ended queries where you don't yet have an anchor.\n\n## Point-in-time query recipes\n\nEvery read tool except `kg_get_node` accepts an optional `at` (ISO-8601\ntimestamp). Omit it for the current graph; pass it to see the graph as it\nwas at that moment. Edges are never deleted, only invalidated, so history\nis queryable, not reconstructed.\n\nRecipes:\n\n- **\"What did X depend on before this refactor landed?\"**\n  `kg_neighbors` with `naturalKey` set to the package\u002Ffile and `at` set to\n  a timestamp just before the refactor's merge commit.\n- **\"What were the current facts about this node on a given date?\"**\n  `kg_at_time` with that date.\n- **\"Did this edge exist yet when I started this session?\"**\n  `kg_search` with `at` set to the session start time, then check whether\n  the fact appears in `result.facts`.\n\nA timestamp with no matching state simply returns fewer or no results.\nThere is no error for \"too early,\" since `validAt`\u002F`invalidAt` windows are\nexact.\n\n## Publishing agent-fact episodes\n\n`kg_add_episode` is the only write tool. It is always additive (never a\nrescan) and Zod-validates `episodeType`, every node `kind`, and every edge\n`relation` against the graph's ontology enums server-side: invalid values\nare rejected before anything is written, and there is no path to raw SQL or\ntable names through this tool.\n\nUse it to durably record an end-of-session discovery instead of letting it\ndie in a handoff doc. This extends the `shared_facts` flow from the\n`multi-agent-memory` skill: a `shared_facts` row is session-scoped and\nephemeral, while a `kg_add_episode` call with `episodeType: \"agent-fact\"`\nbecomes a permanent, queryable graph fact with full provenance. Product\nmode stamps `source` and actor DID from the session principal — do not\npass `\"source\": \"claude-session\"`; the client field is ignored. See\n`multi-agent-memory` for the session order and the durable vs working vs session table.\nSession start names this graph first and does not auto-query it. `--memory` on\n`session adapter` is the opt-in read.\n\n```json\n{\n  \"tool\": \"kg_add_episode\",\n  \"arguments\": {\n    \"episodeType\": \"agent-fact\",\n    \"content\": \"the Electric proxy retries with exponential backoff on 5xx\",\n    \"classification\": \"workspace\",\n    \"nodes\": [\n      {\n        \"kind\": \"concept\",\n        \"name\": \"Electric proxy retry behavior\",\n        \"naturalKey\": \"concept:electric-proxy-retry-backoff\"\n      }\n    ],\n    \"edges\": [\n      {\n        \"source\": { \"kind\": \"concept\", \"naturalKey\": \"concept:electric-proxy-retry-backoff\" },\n        \"target\": { \"kind\": \"file\", \"naturalKey\": \"revealui\u002Fapps\u002Fadmin\u002Fsrc\u002Flib\u002Fapi\u002Felectric-proxy.ts\" },\n        \"relation\": \"documents\",\n        \"fact\": \"electric-proxy.ts retries with exponential backoff on 5xx\"\n      }\n    ]\n  }\n}\n```\n\n**Explicit invocation only.** Publishing an episode is a deliberate act at\nthe point a discovery is worth keeping. There is no hook that\nauto-publishes on session end or on every tool call. Call `kg_add_episode`\nyourself when you have something durable to say, the same way you would\ndecide to write a `shared_facts` row.\n\n## Launcher, identity, envelope\n\nStudio stdio: `revealui-mcp knowledge-graph`. Set `REVDEV_AGENT_ID` so the\nserver can load the hook identity\n(`REVDEV_HOOK_IDENTITY_DIR`, default\n`~\u002F.local\u002Fshare\u002Frevealui\u002Fhook-identities`). Missing principal → envelope\n`unavailable` \u002F `principal-missing`, one WARN per process, then proceed.\nDo not invent a session-named `source` to paper over it.\n\nHosted: same `kg_*` tools on `\u002Fapi\u002Fmcp` with a device token. Tenant is the\ncaller's `accountId`, not `studio-local`.\n\nEvery product-mode JSON body is an envelope:\n\n| `status` | Meaning |\n|---|---|\n| `ok` | `available: true`, `enforcement`, `deniedCount`, `data` |\n| `denied` | In-scope result set empty and `deniedCount > 0`. Not an empty success. |\n| `unavailable` | Graph down, timeout, or principal missing. Session continues. |\n\n`ok` with empty lists and `deniedCount: 0` means nothing exists. Treat\n`unavailable` as a WARN, not a silent empty graph.\n\nIf a discovery contradicts an existing edge, still just call\n`kg_add_episode` with the corrected fact. The ingest engine's entity\nresolution and re-scan diffing are for the deterministic scan path\n(`revkg scan`), not for episode ingestion, so a contradicting agent-fact\nepisode lands as new provenance alongside the old one rather than silently\noverwriting it. Note the contradiction in your `content` field so a human\nor a future Tier-2 LLM pass can reconcile it.\n\n## The `revkg` CLI equivalents\n\nEvery read-side MCP tool has a CLI counterpart for ad-hoc terminal use\n(connects to Neon via `POSTGRES_URL`\u002F`DATABASE_URL`, same as any other\nfleet script):\n\n```bash\nrevkg search \"licensing enforcement\" --limit 10\nrevkg node revealui\u002Fpackages\u002Fpaywall\u002Fsrc\u002Findex.ts#requireFeature\nrevkg neighbors revealui\u002Fpackages\u002Fdb\u002Fsrc\u002Fschema\u002Fcoordination.ts --depth 2\nrevkg at revealui\u002Fpackages\u002Fdb\u002Fsrc\u002Fschema\u002Fcoordination.ts 2026-06-01T00:00:00Z\nrevkg scan --repo revealui        # single repo, deterministic Tier-1 extractors\nrevkg scan --fleet                # every repo under the same parent directory\n```\n\nThere is no CLI write path equivalent to `kg_add_episode`: `revkg scan`\nonly ever runs the deterministic re-scan path (`applyScan`), never additive\nepisode ingestion. Publishing an agent-fact episode is an MCP-tool-only\n(or direct `ingestEpisode` API) action by design, since it is inherently an\nagent (or human) asserting something, not a scan discovering it.\n\n## Degradation behavior\n\nRead tools work with no pgvector extension and no embedding model running:\nthe vector search channel is skipped whenever no query embedding is\navailable, falling back to full-text search plus BFS traversal. Don't\nexpect a `kg_search` failure just because Ollama is down. Expect slightly\nlower recall on paraphrased queries, not an error.\n",{"name":5,"license":14,"metadata":51,"description":7,"allowed-tools":55},{"author":52,"version":53,"website":54},"RevealUI Studio","0.2.0","https:\u002F\u002Frevealui.com","Bash, Read, Grep, Glob","test","2b46ce0cfb27f77a7b78cfb49b0b004e2072b7ba","skills\u002Fknowledge-graph",0,"https:\u002F\u002Fgithub.com\u002Frevealui-studio\u002Frevskills","https:\u002F\u002Fgithub.com\u002Frevealui-studio","2026-11-11 23:29:48",{"source":8,"skillName":5,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add revealui-studio\u002Frevskills --skill knowledge-graph",{"tool":69,"command":70},"bunx","bunx skills add revealui-studio\u002Frevskills --skill knowledge-graph",{"tool":72,"command":73},"pnpm","pnpm dlx skills add revealui-studio\u002Frevskills --skill knowledge-graph","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Frevealui-studio\u002Frevskills\u002Fblob\u002Ftest\u002Fskills\u002Fknowledge-graph\u002FSKILL.md",true,[],[78,100,112,126,153,190],{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":85,"publishedAt":46},"01M6NNN0QCBBPEW3V3C4SBETRZ","good-skill","A minimal valid skill fixture used to prove the skills-lint and plugin-lint validators accept well formed input. Covers frontmatter shape only.","https:\u002F\u002Fgithub.com\u002Frevealui-studio\u002Frevskills\u002Fblob\u002Ftest\u002Ftest\u002Ffixtures\u002Fskills\u002Fgood-skill\u002FSKILL.md",[84],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[86,87,88,89,90,91,92,93,94,95,96,97,98,99],"good","good skill","valid skill","valid","plugin","lint","only","shape","minimal","fixture","input","well formed","frontmatter","skill fixture",{"skillNo":101,"name":102,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":106,"publishedAt":46},"01M6NNMY4GWFD65V1Q2W5YC465","bad-skill-missing-field","https:\u002F\u002Fgithub.com\u002Frevealui-studio\u002Frevskills\u002Fblob\u002Ftest\u002Ftest\u002Ffixtures\u002Fskills\u002Fbad-skill-missing-field\u002FSKILL.md",[105],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[107,108,109,110,111],"bad","missing","missing field","bad skill missing field","bad skill",{"skillNo":113,"name":114,"nameZh":6,"description":115,"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":119,"publishedAt":46},"01M6NNMF7WN6C308H8CGJVRBCB","bad-skill-awk","Fixture skill whose fenced shell block violates lint-skill.awk. skills-lint must reject it.","https:\u002F\u002Fgithub.com\u002Frevealui-studio\u002Frevskills\u002Fblob\u002Ftest\u002Ftest\u002Ffixtures\u002Fskills\u002Fbad-skill-awk\u002FSKILL.md",[118],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[120,121,107,111,91,122,123,124,95,125],"bad skill awk","awk","shell","block","fixture skill","it",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":135,"publishedAt":46},"01M6NNMB2BYCM9J8GVW3TJ8YA7","yjs-collaboration","Yjs CRDT collaboration patterns for real-time and offline-first editing. Use when building collaborative documents, shared scratchpads, or multi-user editing. Covers Y.Doc, Y.Map, Y.Array, Y.Text, state encoding, structured patches, server-side document manipulation, and conflict-free merge semantics.","https:\u002F\u002Fgithub.com\u002Frevealui-studio\u002Frevskills\u002Fblob\u002Ftest\u002Fskills\u002Fyjs-collaboration\u002FSKILL.md",[132],{"categoryNo":133,"categoryName":134,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",[136,137,138,30,31,139,140,141,142,35,143,144,145,146,147,148,149,150,151,152],"yjs","yjs collaboration","collaboration","free","server-side","conflict","shared","map","patterns","read","server","doc","real-time","offline","documents","merge","text",{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":170,"publishedAt":46},"01M6NNM6VE7WE8ZAWQFS4AZE1P","vitest-testing","Vitest testing patterns for production TypeScript projects. Use when writing tests, fixing test failures, configuring coverage, mocking modules, debugging flaky tests, or setting up Vitest in a monorepo. Covers Vitest 3+, vi.mock, vi.fn, React Testing Library, PGlite in-memory PostgreSQL, pool forks, maxWorkers, and hookTimeout.","https:\u002F\u002Fgithub.com\u002Frevealui-studio\u002Frevskills\u002Fblob\u002Ftest\u002Fskills\u002Fvitest-testing\u002FSKILL.md",[159,162,165],{"categoryNo":160,"categoryName":161,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":163,"categoryName":164,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":166,"categoryName":167,"taxonomyType":168,"taxonomyTypeDesc":169},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[171,172,173,174,175,176,177,178,30,179,180,181,182,183,184,185,186,187,188,189],"vitest testing","testing","vitest","debugging","memory","writing","testing library","mock","react testing library","mocking","tests","react testing","modules","up","use","coverage","monorepo","projects","testing patterns",{"skillNo":191,"name":192,"nameZh":6,"description":193,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":194,"categories":195,"keywords":196,"publishedAt":46},"01M6NNKSJ6TJBVPDN3YJHK5B70","tailwind-v4","Tailwind CSS v4 patterns, CSS-first configuration, and v3 migration guide. Use when writing styles, configuring @theme variables, creating components with CVA, migrating from tailwind.config.js, or using container queries, dark mode, and new v4 utility syntax. Covers @import tailwindcss, custom properties, oklch colors, and clsx.","https:\u002F\u002Fgithub.com\u002Frevealui-studio\u002Frevskills\u002Fblob\u002Ftest\u002Fskills\u002Ftailwind-v4\u002FSKILL.md",[],[197,198,199,200,201,202,31,203,204,205,206,207,208,38,209,185,210,211,212,176],"tailwind v4","Tailwind","utility","dark","custom","mode","Variables","with","theme","import","dark mode","v3","container","components","tailwindcss","css"]