Skip to content

Commit 3037a1d

Browse files
committed
0.1.9
1 parent 2f61ff0 commit 3037a1d

11 files changed

Lines changed: 784 additions & 892 deletions

File tree

.claude-plugin/marketplace.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"name": "docent",
1212
"source": "./plugins/docent",
1313
"description": "Docent AI analysis tools for Claude Code",
14-
"version": "0.1.8",
14+
"version": "0.1.9",
1515
"author": {
1616
"name": "TransluceAI"
1717
},
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
name: Plugin sanity
2+
3+
on:
4+
push:
5+
pull_request:
6+
workflow_dispatch:
7+
8+
permissions:
9+
contents: read
10+
11+
jobs:
12+
sanity:
13+
runs-on: ubuntu-latest
14+
steps:
15+
- uses: actions/checkout@v4
16+
17+
- uses: actions/setup-python@v5
18+
with:
19+
python-version: "3.12"
20+
21+
- name: Validate Claude Code plugin package
22+
run: |
23+
python - <<'PY'
24+
import json
25+
import re
26+
from pathlib import Path
27+
28+
root = Path.cwd()
29+
30+
def fail(message: str) -> None:
31+
raise SystemExit(message)
32+
33+
def load_json(path: Path) -> dict:
34+
try:
35+
return json.loads(path.read_text(encoding="utf-8"))
36+
except Exception as exc:
37+
fail(f"{path} is not valid JSON: {exc}")
38+
39+
marketplace = load_json(root / ".claude-plugin" / "marketplace.json")
40+
entries = marketplace.get("plugins")
41+
if not isinstance(entries, list):
42+
fail("marketplace plugins must be a list")
43+
44+
docent_entries = [entry for entry in entries if entry.get("name") == "docent"]
45+
if len(docent_entries) != 1:
46+
fail("marketplace must contain exactly one docent plugin entry")
47+
48+
entry = docent_entries[0]
49+
plugin_dir = root / entry.get("source", "")
50+
if not plugin_dir.is_dir():
51+
fail(f"marketplace source does not exist: {plugin_dir}")
52+
53+
manifest = load_json(plugin_dir / ".claude-plugin" / "plugin.json")
54+
if manifest.get("name") != "docent":
55+
fail("plugin manifest name must be docent")
56+
57+
version = manifest.get("version")
58+
if not isinstance(version, str) or not re.fullmatch(r"\d+\.\d+\.\d+", version):
59+
fail("plugin manifest version must be plain major.minor.patch")
60+
if entry.get("version") != version:
61+
fail("marketplace docent version must match plugin manifest version")
62+
63+
required_files = [
64+
".claude-plugin/plugin.json",
65+
".mcp.json",
66+
"skills/docent/SKILL.md",
67+
"skills/docent/analysis.md",
68+
"skills/docent/dql-reference.md",
69+
"skills/docent/ingestion-reference.md",
70+
"skills/docent/ingestion.md",
71+
"skills/docent/readings-reference.md",
72+
"skills/docent/report.md",
73+
]
74+
for rel_path in required_files:
75+
path = plugin_dir / rel_path
76+
if not path.is_file():
77+
fail(f"required plugin file is missing: {rel_path}")
78+
if path.suffix == ".md" and not path.read_text(encoding="utf-8").strip():
79+
fail(f"markdown file is empty: {rel_path}")
80+
81+
mcp = load_json(plugin_dir / ".mcp.json")
82+
server = mcp.get("mcpServers", {}).get("docent")
83+
if not isinstance(server, dict):
84+
fail(".mcp.json must define mcpServers.docent")
85+
if server.get("type") != "stdio" or server.get("command") != "uv":
86+
fail("docent MCP server must run as uv stdio")
87+
args = server.get("args")
88+
if not isinstance(args, list) or "--from" not in args:
89+
fail("docent MCP server args must include --from")
90+
package = args[args.index("--from") + 1]
91+
if package != "docent-python>=0.1.73":
92+
fail("docent MCP server must require docent-python>=0.1.73")
93+
94+
forbidden_names = {".mcp.local.json", "docent.env"}
95+
for path in plugin_dir.rglob("*"):
96+
if path.name in forbidden_names or path.name.startswith("docent.env."):
97+
fail(f"local credential/config file must not be published: {path}")
98+
99+
print("Claude Code plugin sanity checks passed")
100+
PY
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"name": "docent",
3-
"version": "0.1.8",
3+
"version": "0.1.9",
44
"description": "Docent AI analysis tools"
55
}

plugins/docent/.mcp.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"docent": {
44
"type": "stdio",
55
"command": "uv",
6-
"args": ["tool", "run", "--from", "docent-python", "docent-mcp"]
6+
"args": ["tool", "run", "--from", "docent-python>=0.1.73", "docent-mcp"]
77
}
88
}
99
}
Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,21 @@
11
---
22
name: docent
3-
description: Unified skill for the Docent AI platform. Includes instructions on how to analyze, report on, and ingest AI agent runs, as well as API references.
3+
description: Docent is a platform for analyzing AI agent behavior. Always load this skill before interacting with the Docent platform.
44
alwaysApply: true
55
---
66

77
# Docent
88

9-
This is the root skill for all Docent work. Use it whenever the user wants to analyze runs, ingest data, create or update reports, or look up how the Docent SDK works.
9+
This is the root skill for all Docent work. This file is just a table of contents. In most cases you should read one of the guides below before starting to work with docent. Choose the guide that best matches your task.
1010

11-
## Choose the right guide
12-
13-
- For analyzing or answering questions about agent runs, exploring collections: `./analysis.md`
11+
- For exploring a collection of agent runs, analyzing data, answering questions about agent behavior: `./analysis.md`
1412
- For ingestion workflows that convert local logs or eval traces into Docent data: `./ingestion.md`
1513
- If the user is asking to manipulate data in the platform through code or the command line, see the SDK reference.
1614

17-
## API references
15+
## Other available documentation
1816

1917
- For the Readings API (`client.read`, `client.query`, batching, prompts, clustering): `./readings-reference.md`
2018
- For DQL syntax, schemas, quirks, and example queries: `./dql-reference.md`
2119
- For the reports API: `./report.md` (only if the user explicitly asks for a report)
22-
- For ingestion-side data-model and conversion examples: the reference and pattern sections in `./ingestion.md`
20+
- For ingestion-side data-model and conversion examples: `./ingestion-reference.md`
2321
- SDK reference is available by visiting [our online documentation](https://docs.transluce.org/llms.txt)
24-
25-
Open only the sibling docs that match the user's task; do not load everything by default.

0 commit comments

Comments
 (0)