From 038498e13a8a66312f396c4ae65511998a43b8cc Mon Sep 17 00:00:00 2001 From: OceanLi <122793010+ohdearquant@users.noreply.github.com> Date: Mon, 25 May 2026 03:02:17 -0400 Subject: [PATCH 1/2] chore(marketplace): polish kg + gtd + memory plugins to match v0.2.2 verb surface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Audited all three marketplace plugins against the actual pack handler registrations and fixed every stale example, count, and arg reference. KG plugin (14 files touched): - Fixed 10 P0 broken examples: positional query() → keyword, missing kind= on update/delete, placeholder batches, unsupported filter/status/tags - Added 3 new SKILL.md files for ADR-046 verbs: propose, review, withdraw - Updated all stale counts: 6→8 entity kinds, 13→15 edge relations, 11→14 verbs GTD plugin: bumped version, added start?/end? to assign docs, listed process and plan skills in README. Memory plugin: bumped version, documented parameter aliases (importance/salience, decay_factor/decay, source_id/source). All three plugin.json versions bumped to 0.2.2. New tooling: - marketplace/_validators/check_examples.py: stdlib-only validator (234 examples checked, 0 invalid) - marketplace/INSTALL.md: installation and verification guide Co-Authored-By: Claude Opus 4.6 --- _summary.md | 94 ++++++ marketplace/INSTALL.md | 124 ++++++++ marketplace/_validators/check_examples.py | 296 ++++++++++++++++++ marketplace/gtd/.claude-plugin/plugin.json | 2 +- marketplace/gtd/README.md | 4 +- marketplace/kg/.claude-plugin/plugin.json | 2 +- marketplace/kg/README.md | 40 ++- marketplace/kg/agents/expander.md | 1 - marketplace/kg/agents/librarian.md | 6 +- marketplace/kg/agents/researcher.md | 12 +- marketplace/kg/skills/connect/SKILL.md | 4 +- marketplace/kg/skills/digest/SKILL.md | 12 +- marketplace/kg/skills/expand/SKILL.md | 8 +- marketplace/kg/skills/explore/SKILL.md | 6 +- marketplace/kg/skills/polish/SKILL.md | 10 +- marketplace/kg/skills/propose/SKILL.md | 54 ++++ marketplace/kg/skills/review/SKILL.md | 70 +++++ marketplace/kg/skills/withdraw/SKILL.md | 45 +++ marketplace/memory/.claude-plugin/plugin.json | 2 +- marketplace/memory/README.md | 4 +- 20 files changed, 746 insertions(+), 50 deletions(-) create mode 100644 _summary.md create mode 100644 marketplace/INSTALL.md create mode 100644 marketplace/_validators/check_examples.py create mode 100644 marketplace/kg/skills/propose/SKILL.md create mode 100644 marketplace/kg/skills/review/SKILL.md create mode 100644 marketplace/kg/skills/withdraw/SKILL.md diff --git a/_summary.md b/_summary.md new file mode 100644 index 00000000..332ed9ba --- /dev/null +++ b/_summary.md @@ -0,0 +1,94 @@ +# Plugin Polish — v0.2.2 Summary + +Play: `plugin-polish` | Branch: `v022-polish-plugin-polish` | Status: **DONE** + +--- + +## Verb Inventory by Pack + +### KG pack — 14 verbs +`create`, `get`, `list`, `update`, `delete`, `merge`, `search`, `link`, `neighbors`, `traverse`, `query`, `propose`, `review`, `withdraw` + +### GTD pack — 5 verbs +`assign`, `next`, `complete`, `tasks`, `transition` + +### Memory pack — 2 verbs +`remember`, `recall` + +--- + +## SKILL.md Files — Added / Rewritten / Deleted + +### Added (3) +| File | Description | +| ---- | ----------- | +| `marketplace/kg/skills/propose/SKILL.md` | New skill for ADR-046 propose verb | +| `marketplace/kg/skills/review/SKILL.md` | New skill for ADR-046 review verb | +| `marketplace/kg/skills/withdraw/SKILL.md` | New skill for ADR-046 withdraw verb | + +### Modified (14 tracked files) +| File | Changes | +| ---- | ------- | +| `marketplace/kg/.claude-plugin/plugin.json` | Version 0.1.1 → 0.2.2 | +| `marketplace/kg/README.md` | +3 verbs in verb table, +3 skills in skill table, entity kinds 6→8, relations 13→15 | +| `marketplace/kg/skills/connect/SKILL.md` | "13 relations"→"15 relations", "6 kinds"→"8 kinds" | +| `marketplace/kg/skills/digest/SKILL.md` | Fixed placeholder batch with real args; entity/relation counts updated | +| `marketplace/kg/skills/expand/SKILL.md` | Fixed placeholder batch with real args; fixed batch get syntax; fixed list arg; "6 kinds, 13 relations"→"8 kinds, 15 relations" | +| `marketplace/kg/skills/explore/SKILL.md` | Fixed positional `query("MATCH...")` → `query(query="MATCH...")`; 13→15 relations | +| `marketplace/kg/skills/polish/SKILL.md` | Removed `v0.1` version ref; added `kind="edge"` to update/delete edge calls | +| `marketplace/kg/agents/researcher.md` | 13→15 relations + added derived_from/precedes categories; fixed 2 positional `query()` calls; fixed `update` missing `kind="entity"` | +| `marketplace/kg/agents/librarian.md` | Fixed `filter={}` → flat kwargs; fixed `tags=[...]` → `properties={"tags":[...]}` top-level; 13→15 relations | +| `marketplace/kg/agents/expander.md` | Removed unsupported `status="done"` arg from `complete()` | +| `marketplace/gtd/.claude-plugin/plugin.json` | Version 0.1.0 → 0.2.2 | +| `marketplace/gtd/README.md` | Added `start?` and `end?` to `assign` signature; added `process` and `plan` to skills list | +| `marketplace/memory/.claude-plugin/plugin.json` | Version 0.1.0 → 0.2.2 | +| `marketplace/memory/README.md` | Added `importance?/salience?`, `decay_factor?/decay?`, `source_id?/source?` aliases to `remember`; added `config?` to `recall` | + +### Deleted (0) + +--- + +## New Tooling (untracked new files) + +| File | Purpose | +| ---- | ------- | +| `marketplace/_validators/check_examples.py` | Stdlib-only validator — scans all SKILL.md + agent .md files, validates verb names and keyword-arg discipline | +| `marketplace/INSTALL.md` | Step-by-step install guide with smoke tests and troubleshooting | + +--- + +## Plugin Version Bumps + +| Plugin | Before | After | +| ------ | ------ | ----- | +| kg | 0.1.1 | 0.2.2 | +| gtd | 0.1.0 | 0.2.2 | +| memory | 0.1.0 | 0.2.2 | + +--- + +## Example Validator Stats + +``` +checked=234 valid=234 invalid=0 skipped=1 +``` + +22 files scanned (16 SKILL.md + 6 agent .md). All examples valid. + +--- + +## Gate Results + +| Gate | Command | Result | +| ---- | ------- | ------ | +| G1 — example validator | `uv run python marketplace/_validators/check_examples.py` | PASS — checked=234 invalid=0 | +| G2 — broken links | `grep -r "khive.ai" marketplace/` | PASS — 0 matches | +| G3 — plugin versions | `cat marketplace/*/\.claude-plugin/plugin.json \| grep version` | PASS — all three at 0.2.2 | +| G4 — deno fmt | N/A — no .ts/.json files outside manifests | SKIP — not applicable | +| G5 — SKILL.md coverage | skill dirs match README tables | PASS — kg:9, gtd:5, memory:2 | + +--- + +## Status: DONE + +All gates pass. No commit made — pending critic review. diff --git a/marketplace/INSTALL.md b/marketplace/INSTALL.md new file mode 100644 index 00000000..bee52300 --- /dev/null +++ b/marketplace/INSTALL.md @@ -0,0 +1,124 @@ +# khive Marketplace Plugin Installation + +This document covers how to install the `kg`, `gtd`, and `memory` plugins for Claude Code +and verify they are wired correctly to a running `khive-mcp` server. + +## Version compatibility + +| Plugin | Version | khive-mcp | +| ------ | ------- | --------- | +| kg | 0.2.2 | ≥ 0.2.2 | +| gtd | 0.2.2 | ≥ 0.2.2 | +| memory | 0.2.2 | ≥ 0.2.2 | + +## Step 1 — Install khive-mcp + +```bash +cargo install khive-mcp +``` + +Verify: + +```bash +khive-mcp --version +``` + +## Step 2 — Register the MCP server in Claude Code + +### Option A: project-scoped `.mcp.json` + +Create or update `.mcp.json` in your project root: + +```json +{ + "mcpServers": { + "khive": { + "command": "khive-mcp", + "args": ["--pack", "kg", "--pack", "gtd", "--pack", "memory"] + } + } +} +``` + +### Option B: per-session CLI registration + +```bash +# KG only +claude mcp add --transport stdio khive -- khive-mcp --pack kg + +# GTD only +claude mcp add --transport stdio khive -- khive-mcp --pack gtd + +# Memory only +claude mcp add --transport stdio khive -- khive-mcp --pack memory + +# All three packs (recommended for kg-agent swarms) +claude mcp add --transport stdio khive -- khive-mcp --pack kg --pack gtd --pack memory +``` + +## Step 3 — Install the plugins + +```bash +# From the repo root +claude plugin install marketplace/kg +claude plugin install marketplace/gtd +claude plugin install marketplace/memory +``` + +Or manually copy each plugin directory into `~/.claude/plugins/`: + +```bash +cp -r marketplace/kg ~/.claude/plugins/kg +cp -r marketplace/gtd ~/.claude/plugins/gtd +cp -r marketplace/memory ~/.claude/plugins/memory +``` + +## Step 4 — Verify installation + +Start a Claude Code session and confirm the MCP server responds. + +### KG pack smoke tests + +```text +request(ops="create(kind=\"entity\", entity_kind=\"concept\", name=\"test-install\")") +request(ops="search(kind=\"entity\", query=\"test-install\")") +request(ops="delete(kind=\"entity\", id=\"\")") +``` + +### GTD pack smoke tests + +```text +request(ops="assign(title=\"install-test task\", priority=\"p3\")") +request(ops="next(limit=3)") +request(ops="complete(id=\"\")") +``` + +### Memory pack smoke tests + +```text +request(ops="remember(content=\"install verification note\", memory_type=\"episodic\", importance=0.1)") +request(ops="recall(query=\"install verification\", limit=1)") +``` + +## Step 5 — Run the example validator + +```bash +uv run python marketplace/_validators/check_examples.py +``` + +All examples should report `invalid=0`. + +## Troubleshooting + +| Symptom | Fix | +| ------- | --- | +| `khive-mcp: command not found` | Run `cargo install khive-mcp` or add `~/.cargo/bin` to `PATH` | +| MCP tool not appearing in Claude | Check `.mcp.json` is in the project root; restart Claude Code | +| `Unknown verb` error | Confirm `--pack` flag includes the right pack for the verb | +| `Pack not loaded` error | Verify `khive-mcp --version` matches the plugin version | + +## Links + +- Repository: +- ADR-020 (request DSL): +- Releases: diff --git a/marketplace/_validators/check_examples.py b/marketplace/_validators/check_examples.py new file mode 100644 index 00000000..bd44ce70 --- /dev/null +++ b/marketplace/_validators/check_examples.py @@ -0,0 +1,296 @@ +#!/usr/bin/env python3 +"""Validate khive verb examples in marketplace SKILL.md files. + +Usage: + uv run python marketplace/_validators/check_examples.py + python marketplace/_validators/check_examples.py + +Exit 0 if all examples valid, 1 if any are invalid. +""" + +import re +import sys +from pathlib import Path + +# --------------------------------------------------------------------------- +# Known public verb surfaces +# --------------------------------------------------------------------------- + +KG_VERBS = frozenset({ + "create", "get", "list", "update", "delete", "merge", + "search", "link", "neighbors", "traverse", "query", + "propose", "review", "withdraw", +}) + +GTD_VERBS = frozenset({ + "assign", "next", "complete", "tasks", "transition", +}) + +MEMORY_VERBS = frozenset({ + "remember", "recall", +}) + +ALL_VERBS = KG_VERBS | GTD_VERBS | MEMORY_VERBS + +# Regex that matches the start of a verb call line +_VERB_RE = re.compile( + r"^(?:request|\[)?(" + "|".join(sorted(ALL_VERBS)) + r")\s*\(" +) +_REQUEST_RE = re.compile(r"^request\s*\(") + +# Detect placeholder-only calls: verb(...) or [..., ...] +_PLACEHOLDER_RE = re.compile(r"\(\s*\.\.\.\s*\)") +_TRAILING_ELLIPSIS_RE = re.compile(r"\.\.\.\s*\]?\s*$") + + +# --------------------------------------------------------------------------- +# Extraction helpers +# --------------------------------------------------------------------------- + +def extract_code_blocks(text: str) -> list[tuple[str, str, int]]: + """Return [(lang, block_content, start_line_1indexed), ...].""" + blocks = [] + pattern = re.compile(r"^```(\w*)\n(.*?)^```", re.MULTILINE | re.DOTALL) + for m in pattern.finditer(text): + lang = m.group(1).lower() + content = m.group(2) + start_line = text[: m.start()].count("\n") + 1 + blocks.append((lang, content, start_line)) + return blocks + + +def should_skip_block(lang: str, content: str) -> bool: + """True if the block should be excluded from validation entirely.""" + if lang in ("json", "bash", "sh"): + return True + # Skip blocks that are purely table-formatted verb signatures + stripped = content.strip() + if stripped.startswith("|") or "| Verb" in stripped: + return True + return False + + +def _join_continuation_lines(text: str) -> str: + """Join lines that are clearly continuing a previous call (indented or mid-list).""" + lines = text.split("\n") + joined: list[str] = [] + buf = "" + for line in lines: + stripped = line.strip() + if not stripped: + if buf: + joined.append(buf) + buf = "" + continue + if buf: + # continuation if current line doesn't start a new verb/request call + if _REQUEST_RE.match(stripped) or _VERB_RE.match(stripped): + joined.append(buf) + buf = stripped + else: + buf += " " + stripped + else: + buf = stripped + if buf: + joined.append(buf) + return "\n".join(joined) + + +def extract_verb_calls(block_content: str) -> list[tuple[int, str]]: + """Return [(offset_line, call_text), ...] for verb-like lines in a block.""" + content = _join_continuation_lines(block_content) + calls = [] + for i, line in enumerate(content.split("\n")): + stripped = line.strip() + if not stripped or stripped.startswith("#"): + continue + if _REQUEST_RE.match(stripped) or _VERB_RE.match(stripped): + calls.append((i, stripped)) + return calls + + +# --------------------------------------------------------------------------- +# Validation +# --------------------------------------------------------------------------- + +def validate_call(call_text: str) -> tuple[bool, str | None]: + """Validate one call line. Returns (ok, error_msg).""" + # Skip placeholder calls + if _PLACEHOLDER_RE.search(call_text): + return True, None # placeholder; skip silently + if _TRAILING_ELLIPSIS_RE.search(call_text): + return True, None # incomplete example; skip silently + + # --- request(ops="...") wrapper --- + if _REQUEST_RE.match(call_text): + # Extract ops value (handle single or double wrapped ops) + ops_m = re.search(r'ops\s*=\s*"(.*)"', call_text) + if not ops_m: + # Could be multiline collapsed — just check the call structure exists + if "ops=" not in call_text and 'ops =' not in call_text: + return False, 'request() missing ops= argument' + return True, None + inner = ops_m.group(1) + # Unescape inner content + inner_unescaped = inner.replace('\\"', '"') + # Validate inner verb(s) + # Handle batch: starts with [ + if inner_unescaped.strip().startswith("["): + return _validate_batch(inner_unescaped, call_text) + return _validate_single_inner(inner_unescaped, call_text) + + # --- direct verb call (inner example) --- + m = _VERB_RE.match(call_text) + if m: + verb = m.group(1) + # Extract args portion + paren_pos = call_text.index("(") + args_text = call_text[paren_pos + 1 :] + return _validate_verb_args(verb, args_text, call_text) + + # Shouldn't reach here given our extraction filter + return True, None + + +def _validate_batch(inner: str, original: str) -> tuple[bool, str | None]: + """Validate a batch call string like [verb1(...), verb2(...)].""" + # Extract individual verb calls from within the brackets + stripped = inner.strip().lstrip("[").rstrip("]").strip() + # Split on top-level commas (simple approach: find verb( patterns) + verb_starts = [m.start() for m in re.finditer( + r"\b(" + "|".join(sorted(ALL_VERBS)) + r")\s*\(", stripped + )] + if not verb_starts: + return True, None # No recognisable verbs in batch; skip + for i, start in enumerate(verb_starts): + end = verb_starts[i + 1] if i + 1 < len(verb_starts) else len(stripped) + segment = stripped[start:end].strip().rstrip(", ") + m = re.match(r"([a-z_]+)\s*\(", segment) + if not m: + continue + verb = m.group(1) + if verb not in ALL_VERBS: + return False, f"Unknown verb in batch: {verb!r} in: {original[:80]}" + paren_pos = segment.index("(") + args = segment[paren_pos + 1 :] + ok, err = _validate_verb_args(verb, args, segment) + if not ok: + return False, err + return True, None + + +def _validate_single_inner(inner: str, original: str) -> tuple[bool, str | None]: + """Validate a single inner verb call string (unescaped).""" + inner = inner.strip() + m = re.match(r"([a-z_]+)\s*\(", inner) + if not m: + return True, None # Can't parse — skip + verb = m.group(1) + if verb not in ALL_VERBS: + return False, f"Unknown verb: {verb!r} in: {original[:80]}" + paren_pos = inner.index("(") + args = inner[paren_pos + 1 :] + return _validate_verb_args(verb, args, inner) + + +def _validate_verb_args(verb: str, args_text: str, original: str) -> tuple[bool, str | None]: + """Check that the first argument looks like a keyword arg, not positional.""" + args_stripped = args_text.strip().lstrip("(").rstrip(")").strip() + if not args_stripped: + return True, None # No args — fine for verbs like next() + # Skip if placeholder content + if _PLACEHOLDER_RE.search(args_stripped): + return True, None + + # First arg token check: positional if starts with " or ' or digit + # but NOT if the outer call is already unescaped (has real quotes) + first_char = args_stripped[0] + if first_char in ('"', "'") or first_char.isdigit(): + # Exception: request(ops="...") — already handled upstream + return False, ( + f"Positional arg in {verb}(): " + f"first arg starts with {args_stripped[:30]!r} — " + f"use keyword args: {verb}(arg_name=value, ...)" + ) + return True, None + + +# --------------------------------------------------------------------------- +# File scanning +# --------------------------------------------------------------------------- + +def scan_file(path: Path, marketplace_root: Path) -> tuple[int, int, int, list[str]]: + """Scan one file. Returns (checked, valid, skipped, [error_lines]).""" + text = path.read_text(encoding="utf-8") + rel = path.relative_to(marketplace_root) + errors = [] + checked = 0 + valid = 0 + skipped = 0 + + for lang, content, block_start in extract_code_blocks(text): + if should_skip_block(lang, content): + skipped += 1 + continue + calls = extract_verb_calls(content) + for offset, call_text in calls: + # Skip pure placeholder calls before counting + if _PLACEHOLDER_RE.search(call_text) or _TRAILING_ELLIPSIS_RE.search(call_text): + skipped += 1 + continue + line_num = block_start + offset + 1 + checked += 1 + ok, err = validate_call(call_text) + if ok: + valid += 1 + else: + errors.append(f" {rel}:{line_num}: {err}") + errors.append(f" text: {call_text[:120]}") + + return checked, valid, skipped, errors + + +def main() -> int: + here = Path(__file__).parent + marketplace_root = here.parent + + skill_files = sorted(marketplace_root.glob("*/skills/**/SKILL.md")) + agent_files = sorted(marketplace_root.glob("kg/agents/*.md")) + all_files = skill_files + agent_files + + if not all_files: + print(f"No SKILL.md files found under {marketplace_root}") + return 1 + + total_checked = 0 + total_valid = 0 + total_skipped = 0 + all_errors: list[str] = [] + + for path in all_files: + checked, valid_, skipped, errors = scan_file(path, marketplace_root) + total_checked += checked + total_valid += valid_ + total_skipped += skipped + if errors: + all_errors.append(f"\n[FAIL] {path.relative_to(marketplace_root)}") + all_errors.extend(errors) + elif checked > 0: + print(f" ok {path.relative_to(marketplace_root)} ({checked} examples)") + else: + print(f" -- {path.relative_to(marketplace_root)} (no extractable examples)") + + print() + print(f"checked={total_checked} valid={total_valid} invalid={total_checked - total_valid} skipped={total_skipped}") + + if all_errors: + print("\nFAILURES:") + print("\n".join(all_errors)) + return 1 + + print("\nAll examples valid.") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/marketplace/gtd/.claude-plugin/plugin.json b/marketplace/gtd/.claude-plugin/plugin.json index 81e5eb12..629ab411 100644 --- a/marketplace/gtd/.claude-plugin/plugin.json +++ b/marketplace/gtd/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "gtd", "description": "GTD-style task lifecycle for AI agents — assign, next, complete, transition. Tasks live alongside your knowledge graph; `search(kind=\"note\", ...)` surfaces them like any other note.", - "version": "0.1.0", + "version": "0.2.2", "author": { "name": "Ocean (HaiyangLi)", "url": "https://github.com/ohdearquant" diff --git a/marketplace/gtd/README.md b/marketplace/gtd/README.md index 80fac89d..8dbdde3c 100644 --- a/marketplace/gtd/README.md +++ b/marketplace/gtd/README.md @@ -10,7 +10,7 @@ All verbs are dispatched through the single MCP `request` tool ([ADR-020](https: | Verb | What it does | | -------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | -| `assign(title, priority?, status?, assignee?, due?, depends_on?, tags?, description?)` | Create a task. Defaults to `status=inbox`, priority salience 0.5. | +| `assign(title, priority?, status?, assignee?, due?, start?, end?, depends_on?, tags?, description?)` | Create a task. Defaults to `status=inbox`, priority salience 0.5. | | `next(limit?, assignee?)` | Actionable tasks (status in `{next, active}`), priority-sorted. | | `complete(id, result?)` | Mark done. Records `completed_at` and validates the transition. | | `tasks(status?, assignee?, priority?, limit?, offset?)` | Filtered listing. | @@ -21,7 +21,9 @@ Statuses accept canonical names _or_ aliases: `in_progress → active`, `todo ## Skills - **capture** — drop ideas / commitments into `inbox` cleanly. +- **process** — clarify inbox items into next, waiting, someday, done, or cancelled. - **today** — review actionable work and pick what to do now. +- **plan** — choose realistic weekly commitments and defer stale work. - **review** — weekly sweep: triage inbox, defer / cancel stale items. ## Prerequisites diff --git a/marketplace/kg/.claude-plugin/plugin.json b/marketplace/kg/.claude-plugin/plugin.json index dfb59cce..d8c5672b 100644 --- a/marketplace/kg/.claude-plugin/plugin.json +++ b/marketplace/kg/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "kg", "description": "Persistent knowledge graph for AI agents — typed entities, closed edge ontology, hybrid search, GQL queries.", - "version": "0.1.1", + "version": "0.2.2", "author": { "name": "Ocean (HaiyangLi)", "url": "https://github.com/ohdearquant" diff --git a/marketplace/kg/README.md b/marketplace/kg/README.md index 07f6f106..50b78bb1 100644 --- a/marketplace/kg/README.md +++ b/marketplace/kg/README.md @@ -41,7 +41,7 @@ Or add to your project's `.mcp.json`: ## What You Get -### 1 MCP tool (`request`), 11 verbs inside it +### 1 MCP tool (`request`), 14 verbs inside it The MCP server exposes a single tool, `request`, that takes the verb call as a string: @@ -55,7 +55,7 @@ request(ops="[search(kind=\"entity\", query=\"LoRA\"), neighbors(node_id=\"\ | `create` | Create entities or notes | | `get` | Fetch any record by UUID (or 8-char prefix) | | `list` | Browse with filters | -| `update` | Patch entity/edge fields | +| `update` | Patch entity, note, or edge fields | | `delete` | Soft or hard delete | | `merge` | Deduplicate two entities | | `search` | Hybrid FTS5 + vector search | @@ -63,17 +63,23 @@ request(ops="[search(kind=\"entity\", query=\"LoRA\"), neighbors(node_id=\"\ | `neighbors` | Immediate graph neighbors | | `traverse` | Multi-hop BFS | | `query` | GQL/SPARQL pattern matching | - -### 6 Skills (workflow-shaped, not verb docs) - -| Skill | Command | What it does | -| ------- | ------------- | ------------------------------------------------------------------------------------------------ | -| digest | `/kg:digest` | Ingest material into the graph — extract entities, link them, verify density | -| explore | `/kg:explore` | Discover what the graph knows about a topic — traverse, narrate, surface gaps | -| connect | `/kg:connect` | Wire a new concept into existing knowledge — find relations, reach density | -| polish | `/kg:polish` | Audit and fix — orphans, low-degree nodes, duplicates, stale edges | -| gap | `/kg:gap` | Strategic-gap survey — researched-but-unbuilt, decision debt, frontier ranking for planning | -| expand | `/kg:expand` | Self-expansion — take a gap and grow the graph to close it (promote / bridge / extend / resolve) | +| `propose` | Create an event-sourced change proposal | +| `review` | Review a proposal | +| `withdraw` | Withdraw an open proposal | + +### 9 Skills (workflow-shaped, not verb docs) + +| Skill | Command | What it does | +| -------- | -------------- | ------------------------------------------------------------------------------------------------ | +| digest | `/kg:digest` | Ingest material into the graph — extract entities, link them, verify density | +| explore | `/kg:explore` | Discover what the graph knows about a topic — traverse, narrate, surface gaps | +| connect | `/kg:connect` | Wire a new concept into existing knowledge — find relations, reach density | +| polish | `/kg:polish` | Audit and fix — orphans, low-degree nodes, duplicates, stale edges | +| gap | `/kg:gap` | Strategic-gap survey — researched-but-unbuilt, decision debt, frontier ranking for planning | +| expand | `/kg:expand` | Self-expansion — take a gap and grow the graph to close it (promote / bridge / extend / resolve) | +| propose | `/kg:propose` | Draft event-sourced KG changes for review | +| review | `/kg:review` | Approve, reject, comment on, or request changes for proposals | +| withdraw | `/kg:withdraw` | Withdraw an open proposal with rationale | ### 6 Agents (specialized + a generic backstop) @@ -122,11 +128,11 @@ to keep the swarm moving; no central orchestrator required. ## Schema -**6 entity kinds**: concept, document, dataset, project, person, org +**8 entity kinds**: concept, document, dataset, project, person, org, artifact, service -**13 edge relations**: contains, part_of, instance_of, extends, variant_of, -introduced_by, supersedes, depends_on, enables, implements, competes_with, -composed_with, annotates +**15 edge relations**: contains, part_of, instance_of, extends, variant_of, +introduced_by, supersedes, derived_from, precedes, depends_on, enables, +implements, competes_with, composed_with, annotates **5 note kinds**: observation, insight, question, decision, reference diff --git a/marketplace/kg/agents/expander.md b/marketplace/kg/agents/expander.md index e5d9db57..ee8306e4 100644 --- a/marketplace/kg/agents/expander.md +++ b/marketplace/kg/agents/expander.md @@ -116,7 +116,6 @@ If you filed a `question` note instead of expanding: ``` complete(id="", - status="done", result="Cannot expand without external input. Question note filed: . Reason: <…>") ``` diff --git a/marketplace/kg/agents/librarian.md b/marketplace/kg/agents/librarian.md index c4154aad..98f416a2 100644 --- a/marketplace/kg/agents/librarian.md +++ b/marketplace/kg/agents/librarian.md @@ -68,7 +68,7 @@ For each agent's queue: Then check `question` notes: ``` -list(kind="note", filter={"note_kind": "question"}, limit=50) +list(kind="note", note_kind="question", limit=50) ``` Filter for notes older than 7 days. Each is a research-direction the swarm couldn't @@ -79,7 +79,7 @@ autonomously resolve. Group by tag / domain to surface patterns. ## Taxonomy questions When gap-analyst queues a `kg:meta + taxonomy` task, the gap requires a relation -that doesn't exist in the closed 13-relation set. Librarian's job: +that doesn't exist in the closed 15-relation set. Librarian's job: 1. Read the gap analyst's report and the affected entities. 2. Determine whether the missing relation is genuine or whether the gap can be @@ -115,7 +115,7 @@ the swarm: ``` create(kind="note", note_kind="decision", content="Recommend running 3 parallel polisher agents to drain backlog. Current depth 50, normal depth <10.", - tags=["library:recommendation"]) + properties={"tags": ["library:recommendation"]}) ``` --- diff --git a/marketplace/kg/agents/researcher.md b/marketplace/kg/agents/researcher.md index e3b268a7..3e8008bd 100644 --- a/marketplace/kg/agents/researcher.md +++ b/marketplace/kg/agents/researcher.md @@ -55,10 +55,12 @@ Do not begin external research until you've exhausted what's already in the grap ### Edge creation rules -Use only these 13 relations (no others — the parser rejects unknown relations): +Use only these 15 relations (no others — the parser rejects unknown relations): - Structure: `contains`, `part_of`, `instance_of` - Derivation: `extends`, `variant_of`, `introduced_by`, `supersedes` +- Provenance: `derived_from` +- Temporal: `precedes` - Dependency: `depends_on`, `enables` - Implementation: `implements` - Lateral: `competes_with`, `composed_with` @@ -106,8 +108,8 @@ Never store findings ONLY as notes. If a concept is worth naming, it's an entity "What does entity X connect to?" → neighbors(node_id=X, direction="both") "What builds on X? (lineage)" → traverse(roots=[X], direction="in", relations=["extends","variant_of"]) "What does X depend on?" → traverse(roots=[X], direction="out", relations=["depends_on"]) -"All concepts in domain Y" → query("MATCH (a:concept) WHERE a.domain='Y' RETURN a.name, a.id LIMIT 50") -"Implementations of concept X" → query("MATCH (p:project)-[:implements]->(c:concept) WHERE c.name='X' RETURN p.name, c.name LIMIT 20") +"All concepts in domain Y" → query(query="MATCH (a:concept) WHERE a.domain='Y' RETURN a.name, a.id LIMIT 50") +"Implementations of concept X" → query(query="MATCH (p:project)-[:implements]->(c:concept) WHERE c.name='X' RETURN p.name, c.name LIMIT 20") "What concepts did paper P introduce?"→ neighbors(node_id=paper_id, direction="in", relations=["introduced_by"]) "Previously observed/decided on X" → search(kind="note", query=X) ``` @@ -134,7 +136,7 @@ Mandatory verification before reporting: 3. **Update status** if research changed maturity: ```python - update(id=, properties={"status": "researched"}) + update(kind="entity", id="", properties={"status": "researched"}) ``` 4. **Decision note** if a choice was made: @@ -172,7 +174,7 @@ Density: 47 edges / 11 entities = 4.3 (was 3.8 before) - Do not search externally for things already in the graph — check the graph first - Do not create entities without edges — orphans degrade graph quality immediately -- Do not use ad-hoc edge relations (`uses`, `related_to`, `references`) — map to the 13 or don't link +- Do not use ad-hoc edge relations (`uses`, `related_to`, `references`) — map to the 15 or don't link - Do not reverse `introduced_by` — direction is concept → paper/person, never paper → person - Do not use entity names as strings in `source_id`/`target_id` — always use IDs from prior responses - Do not use `traverse` when `neighbors` suffices — use the cheapest retrieval that answers the question diff --git a/marketplace/kg/skills/connect/SKILL.md b/marketplace/kg/skills/connect/SKILL.md index 97864fee..2979654d 100644 --- a/marketplace/kg/skills/connect/SKILL.md +++ b/marketplace/kg/skills/connect/SKILL.md @@ -33,7 +33,7 @@ create(kind="entity", entity_kind="", name="", description="", properties={...}) ``` -Pick from 6 kinds: `concept`, `document`, `dataset`, `project`, `person`, `org`. +Pick from 8 kinds: `concept`, `document`, `dataset`, `project`, `person`, `org`, `artifact`, `service`. ### 3. Find what it connects to @@ -72,7 +72,7 @@ link(source_id="", target_id="", relation="", weight=<0.4-1. | `implements` | code → concept | "lattice-inference implements GQA" | | `depends_on` | consumer → dependency | "quantization depends_on calibration data" | -If the relationship doesn't fit any of the 13 relations, it's probably a **property** on the entity (e.g., "published in 2021" → `properties.year: "2021"`, not an edge). +If the relationship doesn't fit any of the 15 relations, it's probably a **property** on the entity (e.g., "published in 2021" → `properties.year: "2021"`, not an edge). ### 5. Verify density diff --git a/marketplace/kg/skills/digest/SKILL.md b/marketplace/kg/skills/digest/SKILL.md index d2a09b70..aab6d2fc 100644 --- a/marketplace/kg/skills/digest/SKILL.md +++ b/marketplace/kg/skills/digest/SKILL.md @@ -11,7 +11,7 @@ The MCP server exposes one tool — `request` — that takes the verb call as a ```text request(ops="create(kind=\"entity\", entity_kind=\"concept\", name=\"LoRA\")") -request(ops="[create(...), create(...), link(...)]") # parallel batch +request(ops="[create(kind=\"entity\", entity_kind=\"concept\", name=\"LoRA\"), create(kind=\"entity\", entity_kind=\"document\", name=\"LoRA paper\"), link(source_id=\"\", target_id=\"\", relation=\"introduced_by\")]") # parallel batch ``` The verb examples in this skill show the inner call. Wrap each one as `request(ops="…")`. @@ -36,7 +36,7 @@ create(kind="entity", entity_kind="", name="", properties={"domain": "...", "type": "...", "year": "..."}) ``` -**6 entity kinds** (closed — pick the best fit, don't invent): +**8 entity kinds** (closed — pick the best fit, don't invent): | Kind | Use for | | ---------- | ------------------------------------------------------------ | @@ -46,6 +46,8 @@ create(kind="entity", entity_kind="", name="", | `project` | Codebases, libraries, tools, frameworks | | `person` | Researchers, engineers, authors | | `org` | Labs, companies, institutions | +| `artifact` | Generated files, model artifacts, build outputs | +| `service` | Long-running services, APIs, deployed systems | **Naming**: short canonical name people actually say. `LoRA` not `Low-Rank Adaptation of Large Language Models`. Full titles go in `properties`. @@ -57,7 +59,7 @@ For each relationship you identified in the material: link(source_id="", target_id="", relation="", weight=<0.4-1.0>) ``` -**13 relations** (closed — map to these, don't invent): +**15 relations** (closed — map to these, don't invent): | Category | Relation | Direction | When | | -------------- | --------------- | ---------------------- | ------------------------- | @@ -68,6 +70,8 @@ link(source_id="", target_id="", relation="", weight=<0.4-1. | Derivation | `variant_of` | variant → original | Modified version | | Derivation | `introduced_by` | concept → paper/person | First described in | | Derivation | `supersedes` | new → old | Replaces entirely | +| Provenance | `derived_from` | derived → source | Data/artifact lineage | +| Temporal | `precedes` | earlier → later | Ordering over time | | Dependency | `depends_on` | consumer → dep | Hard requirement | | Dependency | `enables` | prerequisite → outcome | Makes possible | | Implementation | `implements` | code → concept | Code realizes algorithm | @@ -115,5 +119,5 @@ Material exhausted. Every entity above minimum density. No orphans (0-edge nodes If a tool returns an error, read the message — it lists valid values. Common cases: - Invalid `entity_kind` or `note_kind` → the error says which values are valid -- Invalid `relation` → use only the 13 above +- Invalid `relation` → use only the 15 above - ID not found → check the UUID; use `search` to find the correct one diff --git a/marketplace/kg/skills/expand/SKILL.md b/marketplace/kg/skills/expand/SKILL.md index 0e122676..feba6f59 100644 --- a/marketplace/kg/skills/expand/SKILL.md +++ b/marketplace/kg/skills/expand/SKILL.md @@ -21,7 +21,7 @@ The MCP server exposes one tool — `request` — that takes the verb call as a ```text request(ops="create(kind=\"entity\", entity_kind=\"concept\", name=\"…\")") -request(ops="[create(...), link(...), link(...)]") # parallel batch +request(ops="[create(kind=\"entity\", entity_kind=\"project\", name=\"lora-tools\"), link(source_id=\"\", target_id=\"\", relation=\"implements\"), link(source_id=\"\", target_id=\"\", relation=\"depends_on\")]") # parallel batch ``` The verb examples below show the inner call. Wrap each one as `request(ops="…")`. @@ -165,7 +165,7 @@ Workflow: 1. For each member, pull description + properties: ``` -[get(id=""), get(id=""), ...] +request(ops="[get(id=\"\"), get(id=\"\")]") ``` 2. Identify the comparison axes that matter (drawn from descriptions, properties, @@ -182,7 +182,7 @@ Workflow: ``` create(kind="note", note_kind="decision", content="Comparison of . Axes: . Recommended: . Assumptions: .", - annotates=[]) + annotates=["", ""]) ``` 4. If the recommendation is strong (cited by an existing ADR or backed by @@ -230,7 +230,7 @@ State for the record: 3. **Every new entity needs a citation.** A description sentence sourced from an existing entity, a paper, an ADR, or a code reference. No source = no create. File a question note instead. -4. **Do not create entities outside the closed taxonomies.** 6 kinds, 13 +4. **Do not create entities outside the closed taxonomies.** 8 kinds, 15 relations, 5 note kinds. If your expansion needs a new kind, that is an ADR, not a skill invocation — stop and surface to a human. 5. **Re-read the source after expansion** to verify you didn't drift. A diff --git a/marketplace/kg/skills/explore/SKILL.md b/marketplace/kg/skills/explore/SKILL.md index 8c305f3d..20d80164 100644 --- a/marketplace/kg/skills/explore/SKILL.md +++ b/marketplace/kg/skills/explore/SKILL.md @@ -55,7 +55,7 @@ Common traversal patterns: For complex structural queries, use GQL: ``` -query("MATCH (a:concept)-[:extends]->(b:concept) WHERE b.name = 'LoRA' RETURN a.name, a.id LIMIT 20") +query(query="MATCH (a:concept)-[:extends]->(b:concept) WHERE b.name = 'LoRA' RETURN a.name, a.id LIMIT 20") ``` **GQL constraints** (the parser is limited): @@ -64,7 +64,7 @@ query("MATCH (a:concept)-[:extends]->(b:concept) WHERE b.name = 'LoRA' RETURN a. - For JSON properties: use `a.domain`, `a.type` etc. (accessed via json_extract internally) - `RETURN a.properties` gets the full JSON blob - NOT supported: `WHERE NOT`, `COUNT`, `ORDER BY`, `[*..N]` variable-length without min -- Relations in patterns: use the 13 canonical relation names +- Relations in patterns: use the 15 canonical relation names ### 4. Narrate @@ -93,7 +93,7 @@ Report gaps as actionable next steps (e.g., "X exists but has no `introduced_by` | Find by content/similarity | `search(kind="entity\|note", query="...")` | | Immediate connections | `neighbors(node_id, direction, relations)` | | Multi-hop reachability | `traverse(roots, max_depth, direction, relations)` | -| Structural patterns | `query("MATCH ... RETURN ...")` | +| Structural patterns | `query(query="MATCH ... RETURN ...")` | | Browse a category | `list(kind="entity", entity_kind="concept", limit=50)` | ## Stop condition diff --git a/marketplace/kg/skills/polish/SKILL.md b/marketplace/kg/skills/polish/SKILL.md index e7061041..dcd47bde 100644 --- a/marketplace/kg/skills/polish/SKILL.md +++ b/marketplace/kg/skills/polish/SKILL.md @@ -52,8 +52,8 @@ If two entities refer to the same real-world thing (e.g., "LoRA" and "Low-Rank A merge(into_id="", from_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). +`merge` deduplicates entities. Properties combine, tags union, edges rewire to the kept +entity, and the duplicate is removed. Both IDs must refer to entities. For duplicate **notes** — use supersession instead: @@ -102,9 +102,9 @@ Check for: Fix with: ``` -update(id="", relation="") -update(id="", weight=1.0) -delete(id="") # if the edge is just wrong +update(kind="edge", id="", relation="") +update(kind="edge", id="", weight=1.0) +delete(kind="edge", id="") # if the edge is just wrong ``` ### 6. Report diff --git a/marketplace/kg/skills/propose/SKILL.md b/marketplace/kg/skills/propose/SKILL.md new file mode 100644 index 00000000..d2a71c54 --- /dev/null +++ b/marketplace/kg/skills/propose/SKILL.md @@ -0,0 +1,54 @@ +--- +description: Draft event-sourced knowledge graph changes for proposal review before mutation. +--- + +# Propose + +Use `propose` when a KG change should be reviewed before it is applied. The verb creates an open proposal; it does not directly mutate entities, notes, or edges. + +The MCP server exposes one tool, `request`, that takes the verb call as a string: + +```text +request(ops="propose(title=\"Add implementation edge\", description=\"Project X implements concept Y based on reviewed source evidence.\", changeset={\"kind\":\"add_edge\",\"source\":\"00000000-0000-0000-0000-000000000001\",\"target\":\"00000000-0000-0000-0000-000000000002\",\"relation\":\"implements\",\"weight\":0.8}, reviewers=[\"critic\"])") +``` + +Required args: `title`, `description`, `changeset`. +Optional args: `reviewers`, `expiry`, `parent_id`, `namespace`. + +Valid `changeset.kind` values: `add_entity`, `update_entity`, `add_edge`, `add_note`, `merge_entities`, `supersede_entity`, `compound`. + +## Workflow + +### 1. Draft the proposal + +Identify the specific change and its rationale before calling `propose`. The description should cite the source evidence that justifies the change. + +```text +request(ops="propose(title=\"Add LoRA extends Attention edge\", description=\"LoRA is a parameter-efficient variant that extends the standard attention mechanism. Source: Hu et al. 2021 (LoRA paper, entity id: ).\", changeset={\"kind\":\"add_edge\",\"source\":\"\",\"target\":\"\",\"relation\":\"extends\",\"weight\":0.9})") +``` + +### 2. Add reviewers (optional) + +Pass `reviewers` as a list of agent names or identities who should assess the proposal. If omitted, any agent with access may review. + +```text +request(ops="propose(title=\"Merge duplicate FlashAttention entities\", description=\"Two entities represent the same concept: ids and . Keeping — it has higher edge count and more complete properties.\", changeset={\"kind\":\"merge_entities\",\"into_id\":\"\",\"from_id\":\"\"}, reviewers=[\"polisher\", \"researcher\"])") +``` + +### 3. Check proposal status + +After submission, retrieve the proposal with `get`: + +```text +request(ops="get(id=\"\")") +``` + +Or list open proposals: + +```text +request(ops="list(kind=\"proposal\", status=\"open\")") +``` + +## Stop condition + +Proposal is open and assigned to reviewers. Do not apply the change manually — wait for `review` approval. If the proposal is rejected, revise the `changeset` or description based on reviewer feedback and re-propose. diff --git a/marketplace/kg/skills/review/SKILL.md b/marketplace/kg/skills/review/SKILL.md new file mode 100644 index 00000000..f8f3cfd9 --- /dev/null +++ b/marketplace/kg/skills/review/SKILL.md @@ -0,0 +1,70 @@ +--- +description: Review an open knowledge graph proposal by approving, rejecting, commenting, or requesting changes. +--- + +# Review + +Use `review` after reading the proposal and checking the requested changes against source evidence. + +The MCP server exposes one tool, `request`, that takes the verb call as a string: + +```text +request(ops="review(proposal_id=\"00000000-0000-0000-0000-000000000001\", decision=\"approve\", comment=\"Change matches the cited evidence.\")") +``` + +Required args: `proposal_id`, `decision`. +Optional args: `comment`, `namespace`. + +Valid `decision` values: `approve`, `reject`, `comment`, `request_changes`, `requestchanges`. + +## Workflow + +### 1. Read the proposal + +Retrieve the proposal before deciding: + +```text +request(ops="get(id=\"\")") +``` + +Inspect `changeset.kind` and the source IDs. Verify the cited entities exist and the relationship is correct. + +### 2. Verify source evidence + +For an `add_edge` proposal, check both endpoints: + +```text +request(ops="[get(id=\"\"), get(id=\"\")]") +``` + +For a `merge_entities` proposal, compare descriptions and edge counts before approving. + +### 3. Decide + +**Approve** — evidence supports the change, relation and direction are correct: + +```text +request(ops="review(proposal_id=\"\", decision=\"approve\", comment=\"Source entity id confirms the introduced_by direction.\")") +``` + +**Reject** — change is incorrect or cannot be verified: + +```text +request(ops="review(proposal_id=\"\", decision=\"reject\", comment=\"Direction is reversed. introduced_by should go concept → paper, not paper → concept.\")") +``` + +**Request changes** — proposal has the right intent but needs a corrected changeset: + +```text +request(ops="review(proposal_id=\"\", decision=\"request_changes\", comment=\"Weight should be 0.9 (definitional), not 0.4. Resubmit with corrected weight.\")") +``` + +**Comment** — add context without blocking or approving: + +```text +request(ops="review(proposal_id=\"\", decision=\"comment\", comment=\"Related proposal also touches this entity — coordinate.\")") +``` + +## Stop condition + +Decision recorded. If approved, the runtime applies the changeset. If rejected or change-requested, the proposer must resubmit. Do not manually apply rejected changes. diff --git a/marketplace/kg/skills/withdraw/SKILL.md b/marketplace/kg/skills/withdraw/SKILL.md new file mode 100644 index 00000000..56e88e5b --- /dev/null +++ b/marketplace/kg/skills/withdraw/SKILL.md @@ -0,0 +1,45 @@ +--- +description: Withdraw an open knowledge graph proposal with a short rationale. +--- + +# Withdraw + +Use `withdraw` when an open proposal is obsolete, duplicated, or should no longer be reviewed. + +The MCP server exposes one tool, `request`, that takes the verb call as a string: + +```text +request(ops="withdraw(proposal_id=\"00000000-0000-0000-0000-000000000001\", rationale=\"Superseded by a narrower proposal.\")") +``` + +Required args: `proposal_id`. +Optional args: `rationale`, `namespace`. + +## When to withdraw + +- The changeset was superseded by a better proposal +- Source evidence no longer supports the change +- The entities involved were merged or deleted before the proposal was reviewed +- The proposer identifies an error in the original changeset + +## Workflow + +### 1. Confirm the proposal is open + +```text +request(ops="get(id=\"\")") +``` + +Only open proposals can be withdrawn. Approved or rejected proposals are immutable records. + +### 2. Withdraw with rationale + +```text +request(ops="withdraw(proposal_id=\"\", rationale=\"Duplicate of proposal which is already approved.\")") +``` + +The `rationale` is stored with the proposal record so reviewers understand why it was closed without a decision. + +## Stop condition + +Proposal status is `withdrawn`. No further action needed. If you need a replacement change, open a new proposal via `propose`. diff --git a/marketplace/memory/.claude-plugin/plugin.json b/marketplace/memory/.claude-plugin/plugin.json index 58d05b16..4e915c05 100644 --- a/marketplace/memory/.claude-plugin/plugin.json +++ b/marketplace/memory/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "memory", "description": "Persistent agent memory for khive — remember durable context and recall it with decay-aware ranking.", - "version": "0.1.0", + "version": "0.2.2", "author": { "name": "Ocean (HaiyangLi)", "url": "https://github.com/ohdearquant" diff --git a/marketplace/memory/README.md b/marketplace/memory/README.md index d288bce0..b5c2f159 100644 --- a/marketplace/memory/README.md +++ b/marketplace/memory/README.md @@ -10,8 +10,8 @@ All verbs are dispatched through the single MCP `request` tool ([ADR-020](https: | Verb | What it does | | ---- | ------------ | -| `remember(content, memory_type?, importance?, decay_factor?, source_id?, namespace?, tags?)` | Store a memory note with salience and decay metadata. | -| `recall(query, limit?, memory_type?, min_score?, min_salience?, namespace?)` | Search memory notes only, then rank by relevance, importance, and recency. | +| `remember(content, memory_type?, importance?/salience?, decay_factor?/decay?, source_id?/source?, namespace?, tags?)` | Store a memory note with salience and decay metadata. | +| `recall(query, limit?, memory_type?, min_score?, min_salience?, config?, namespace?)` | Search memory notes only, then rank by relevance, importance, and recency. | Memory types: From 7bb0316c75e5ad746053b10e257c2689e98223be Mon Sep 17 00:00:00 2001 From: OceanLi <122793010+ohdearquant@users.noreply.github.com> Date: Mon, 25 May 2026 11:30:23 -0400 Subject: [PATCH 2/2] chore: remove stray show-framework artifact from slice --- _summary.md | 94 ----------------------------------------------------- 1 file changed, 94 deletions(-) delete mode 100644 _summary.md diff --git a/_summary.md b/_summary.md deleted file mode 100644 index 332ed9ba..00000000 --- a/_summary.md +++ /dev/null @@ -1,94 +0,0 @@ -# Plugin Polish — v0.2.2 Summary - -Play: `plugin-polish` | Branch: `v022-polish-plugin-polish` | Status: **DONE** - ---- - -## Verb Inventory by Pack - -### KG pack — 14 verbs -`create`, `get`, `list`, `update`, `delete`, `merge`, `search`, `link`, `neighbors`, `traverse`, `query`, `propose`, `review`, `withdraw` - -### GTD pack — 5 verbs -`assign`, `next`, `complete`, `tasks`, `transition` - -### Memory pack — 2 verbs -`remember`, `recall` - ---- - -## SKILL.md Files — Added / Rewritten / Deleted - -### Added (3) -| File | Description | -| ---- | ----------- | -| `marketplace/kg/skills/propose/SKILL.md` | New skill for ADR-046 propose verb | -| `marketplace/kg/skills/review/SKILL.md` | New skill for ADR-046 review verb | -| `marketplace/kg/skills/withdraw/SKILL.md` | New skill for ADR-046 withdraw verb | - -### Modified (14 tracked files) -| File | Changes | -| ---- | ------- | -| `marketplace/kg/.claude-plugin/plugin.json` | Version 0.1.1 → 0.2.2 | -| `marketplace/kg/README.md` | +3 verbs in verb table, +3 skills in skill table, entity kinds 6→8, relations 13→15 | -| `marketplace/kg/skills/connect/SKILL.md` | "13 relations"→"15 relations", "6 kinds"→"8 kinds" | -| `marketplace/kg/skills/digest/SKILL.md` | Fixed placeholder batch with real args; entity/relation counts updated | -| `marketplace/kg/skills/expand/SKILL.md` | Fixed placeholder batch with real args; fixed batch get syntax; fixed list arg; "6 kinds, 13 relations"→"8 kinds, 15 relations" | -| `marketplace/kg/skills/explore/SKILL.md` | Fixed positional `query("MATCH...")` → `query(query="MATCH...")`; 13→15 relations | -| `marketplace/kg/skills/polish/SKILL.md` | Removed `v0.1` version ref; added `kind="edge"` to update/delete edge calls | -| `marketplace/kg/agents/researcher.md` | 13→15 relations + added derived_from/precedes categories; fixed 2 positional `query()` calls; fixed `update` missing `kind="entity"` | -| `marketplace/kg/agents/librarian.md` | Fixed `filter={}` → flat kwargs; fixed `tags=[...]` → `properties={"tags":[...]}` top-level; 13→15 relations | -| `marketplace/kg/agents/expander.md` | Removed unsupported `status="done"` arg from `complete()` | -| `marketplace/gtd/.claude-plugin/plugin.json` | Version 0.1.0 → 0.2.2 | -| `marketplace/gtd/README.md` | Added `start?` and `end?` to `assign` signature; added `process` and `plan` to skills list | -| `marketplace/memory/.claude-plugin/plugin.json` | Version 0.1.0 → 0.2.2 | -| `marketplace/memory/README.md` | Added `importance?/salience?`, `decay_factor?/decay?`, `source_id?/source?` aliases to `remember`; added `config?` to `recall` | - -### Deleted (0) - ---- - -## New Tooling (untracked new files) - -| File | Purpose | -| ---- | ------- | -| `marketplace/_validators/check_examples.py` | Stdlib-only validator — scans all SKILL.md + agent .md files, validates verb names and keyword-arg discipline | -| `marketplace/INSTALL.md` | Step-by-step install guide with smoke tests and troubleshooting | - ---- - -## Plugin Version Bumps - -| Plugin | Before | After | -| ------ | ------ | ----- | -| kg | 0.1.1 | 0.2.2 | -| gtd | 0.1.0 | 0.2.2 | -| memory | 0.1.0 | 0.2.2 | - ---- - -## Example Validator Stats - -``` -checked=234 valid=234 invalid=0 skipped=1 -``` - -22 files scanned (16 SKILL.md + 6 agent .md). All examples valid. - ---- - -## Gate Results - -| Gate | Command | Result | -| ---- | ------- | ------ | -| G1 — example validator | `uv run python marketplace/_validators/check_examples.py` | PASS — checked=234 invalid=0 | -| G2 — broken links | `grep -r "khive.ai" marketplace/` | PASS — 0 matches | -| G3 — plugin versions | `cat marketplace/*/\.claude-plugin/plugin.json \| grep version` | PASS — all three at 0.2.2 | -| G4 — deno fmt | N/A — no .ts/.json files outside manifests | SKIP — not applicable | -| G5 — SKILL.md coverage | skill dirs match README tables | PASS — kg:9, gtd:5, memory:2 | - ---- - -## Status: DONE - -All gates pass. No commit made — pending critic review.