Imported from yonatangross/orchestkit (
src/skills/release-sync/SKILL.md). Install upstream withnpx skills add yonatangross/orchestkit --skill release-sync. Copyright stays with the author.
Release Content Sync
Sync the latest OrchestKit release to external knowledge systems.
CC ≥ 2.1.118 (M122): Sync triggers on the new
claude plugin tagannotated tag (in addition to plaingit tag). The tag's annotation embeds the plugin manifest version, which release-sync uses as the canonical source-of-truth for the version being synced. Seesrc/skills/chain-patterns/references/plugin-tag.md.
What This Does
- Reads the latest CHANGELOG entry, CLAUDE.md, and hook README
- Updates the OrchestKit NotebookLM KB notebook with fresh sources
- Ingests the release digest into HQ Knowledge Base (if available)
- Optionally generates a new podcast from the updated notebook
Prerequisites
- MCP servers:
notebooklm-mcpand/orhq-content - NotebookLM notebook ID stored in
.claude/release-sync-config.json
Step 1: Detect Version and Read Sources
# Read current version from CLAUDE.md
version = Grep(pattern="Current.*\\d+\\.\\d+\\.\\d+", path="CLAUDE.md")
# Read CHANGELOG — extract latest release section
changelog = Read("CHANGELOG.md", limit=80)
# Read hook architecture summary
hook_readme = Read("src/hooks/README.md", limit=100)
# Read CLAUDE.md for project overview
claude_md = Read("CLAUDE.md")
Step 2: Load Config
config = Read(".claude/release-sync-config.json")
# Expected format:
# {
# "notebooklm_notebook_id": "0a05e680-e33b-4d8c-94b2-5df26a1af329",
# "hq_kb_project": "orchestkit"
# }
If config doesn't exist, prompt user:
AskUserQuestion(questions=[{
"question": "NotebookLM notebook ID for OrchestKit KB?",
"header": "Configuration",
"options": [
{"label": "Use default", "description": "OrchestKit v7 — Complete KB (0a05e680...)"},
{"label": "I'll provide", "description": "Enter a custom notebook ID"}
]
}])
Step 2b: Choose Sync Targets
Ask for the four target values: notebooklm, hq_kb, slack, notes.
# Skip the form when targets are explicit:
# /ork:release-sync --targets=notebooklm,slack → skip, use those
#
# Otherwise ask. This used to prefer an ork-elicit MCP form and fall back to
# AskUserQuestion; the server was retired (EPIC C mechanism 11) because
# AskUserQuestion is the CC-native surface for this and a permanent MCP tool
# slot to restate it was the parallel mechanism. One path now.
#
# ALL targets default to False — OrchestKit is open-source and these targets
# (notebook IDs, HQ KB, Slack) are user-private infrastructure the plugin
# cannot assume is configured. The user explicitly opts in.
targets = {
"notebooklm": ask_yn("Push to NotebookLM?", default=False),
"hq_kb": ask_yn("Push to HQ KB?", default=False),
"slack": ask_yn("Announce in Slack?", default=False),
"notes": ""
}
Three AskUserQuestion round-trips. The rest of this skill reads targets["notebooklm"], targets["hq_kb"], targets["slack"], targets["notes"] regardless of source.
Privacy note: all targets are opt-in (default false). NotebookLM notebook IDs and HQ knowledge bases are user-private — the open-source plugin must not assume they exist or push to them implicitly.
Step 3: Update NotebookLM Sources
# Probe MCP availability
ToolSearch(query="select:mcp__notebooklm-mcp__source_add")
# Add release digest as new source
mcp__notebooklm-mcp__source_add(
notebook_id=config.notebooklm_notebook_id,
source_type="text",
title=f"Release {version} — {date}",
text=release_digest,
wait=True
)
Step 4: Ingest to HQ Knowledge Base (Optional)
# Probe HQ content MCP
ToolSearch(query="select:mcp__hq-content__knowledge_ingest")
# If available, ingest
mcp__hq-content__knowledge_ingest(
title=f"OrchestKit {version} Release Notes",
content=release_digest,
project="orchestkit",
content_type="release-notes"
)
Step 5: Generate Podcast (Optional)
AskUserQuestion(questions=[{
"question": "Generate a podcast from the updated notebook?",
"header": "Podcast",
"options": [
{"label": "Yes — deep dive", "description": "~10 min podcast covering all changes"},
{"label": "Yes — brief", "description": "~3 min summary"},
{"label": "No", "description": "Skip podcast generation"}
]
}])
if podcast_requested:
mcp__notebooklm-mcp__studio_create(
notebook_id=config.notebooklm_notebook_id,
artifact_type="audio",
audio_format=selected_format,
confirm=True
)
Output
Report what was synced:
Release Sync Complete — v{version}
NotebookLM: source added to {notebook_title}
HQ KB: ingested as release-notes/{version}
Podcast: generating (poll with studio_status)