Help us improve
Share bugs, ideas, or general feedback.
From kg
Audits graph health and fixes issues — orphans, low-degree nodes, duplicates, stale edges. Reports before/after density.
npx claudepluginhub ohdearquant/khive --plugin kgHow this skill is triggered — by the user, by Claude, or both
Slash command
/kg:polishThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Your graph needs maintenance. This skill audits health, identifies issues, and fixes them.
Audits knowledge graph for orphan nodes, missing cross-references, stale claims, unresolved contradictions, low-confidence clusters, and code-knowledge gaps. Outputs health report with auto-fixes.
Wires new concepts into a knowledge graph: searches for related entities, creates typed links (extends, depends_on, etc.), and checks minimum connection density.
Analyzes a vault's wikilink structure as a directed graph, computing PageRank, betweenness, orphan detection, cluster analysis, and missing-link discovery. Use for vault health and connection insights.
Share bugs, ideas, or general feedback.
Your graph needs maintenance. This skill audits health, identifies issues, and fixes them.
list(kind="entity", entity_kind="concept", limit=50)
list(kind="entity", entity_kind="project", limit=20)
For every entity listed:
neighbors(node_id="<entity-id>", direction="both")
Classify:
Search for entities with similar names:
search(kind="entity", query="<entity name>")
If two entities refer to the same real-world thing (e.g., "LoRA" and "Low-Rank Adaptation"):
merge(into_id="<keep-id>", from_id="<remove-id>")
merge is entity-only in v0.1. Properties combine, tags union, edges rewire to the kept
entity, the other is removed. Both must be entities (not notes).
For duplicate notes — use supersession instead:
create(kind="note", note_kind="<kind>", content="<better version>",
annotates=["<target-entities>"])
link(source_id="<new-note-id>", target_id="<old-note-id>", relation="supersedes")
Supersession does NOT transfer annotations. The new note must explicitly declare its own
annotates. The old note stays in the store but is excluded from search(kind="note").
For each orphan or under-linked entity, think about:
instance_ofextendsintroduced_bycompetes_withimplementsCreate the appropriate links. If you can't determine the relationship from context, search for clues:
search(kind="note", query="<entity name>")
search(kind="entity", query="<broader category>")
List edges from high-value entities:
list(kind="edge", source_id="<entity-id>")
list(kind="edge", target_id="<entity-id>")
Check for:
introduced_by going paper → concept (should be concept → paper)extends used where instance_of fits betterFix with:
update(id="<edge-id>", relation="<correct-relation>")
update(id="<edge-id>", weight=1.0)
delete(id="<edge-id>") # if the edge is just wrong
Summarize:
| Entity kind | Minimum edges | Required relationship types |
|---|---|---|
concept | 4 | At least one parent (instance_of or extends), introduced_by if source exists, competes_with if alternatives exist |
project | 3 | implements (what concept), structural (contains/part_of), depends_on |
document | 2 | introduced_by edges FROM concepts it introduced |
person | 1 | introduced_by from their work |
org | 1 | contains or structural relationship |
Supersession keeps the old record and marks it superseded — it never deletes, copies, or
transfers data. "Show only current" is a query concern handled by the search filter, not
by data mutation. If you want to actually remove something, the verb is delete.
No orphans. All entities at or above minimum density. No obvious duplicates. Stale edges corrected. Report filed.