Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/MIGRATION-PLAYBOOK.md
Original file line number Diff line number Diff line change
Expand Up @@ -847,7 +847,7 @@ point every consuming skill's `file:` link and `setup-deps.mjs` fingerprint at t
byte-drift CI gate are needed — there is only one committed copy, so nothing can drift. The
invariant that **replaces** the byte-drift gate is delivery-by-version: editing the shared source
obligates a plugin `version` bump, since the version is the update cache key. (`knowledge`'s
`repo-analysis` + `video-digestion`, shared by its `youtube` and `course-digest` skills, is the
`repo-analysis` + `video-digestion`, shared by its `youtube-digest` and `course-digest` skills, is the
reference instance.) Reach for the cross-plugin shape above only once a *second plugin* genuinely
needs the same source.

Expand Down
2 changes: 1 addition & 1 deletion docs/knowledge-integration-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ emitted below.

## The problem

Ingest skills (`book-distill`, `youtube`, `course-digest`) produce durable, concept-organized artifacts
Ingest skills (`book-distill`, `youtube-digest`, `course-digest`) produce durable, concept-organized artifacts
that each carry repo-applicability recommendations. Today those recommendations are read by a human and
applied by memory — nothing codifies the analyze-here → fit-into-a-target step, and the corpus is
decoupled from any one product repo (it lives in `melodic-software/knowledge-corpus`). The apply
Expand Down
2 changes: 1 addition & 1 deletion plugins/knowledge/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "knowledge",
"version": "0.5.6",
"version": "0.6.0",
"description": "Ingest external knowledge into durable, synthesized artifacts. Ships a book-distillation pipeline (PDF/EPUB into concept-organized, author-attributed skill reference files), a YouTube pipeline (watch, transcript, link harvest, and repo-applicability synthesis), and a course-digest pipeline (extract and synthesize online video courses — Dometrain, Teachable — into repo-applicable recommendations), plus a re-runnable setup action; a configurable library directory governs where synthesized artifacts land in the consuming repo.",
"author": {
"name": "Melodic Software",
Expand Down
12 changes: 12 additions & 0 deletions plugins/knowledge/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,18 @@ All notable changes to the `knowledge` plugin are recorded here. The `version` i
`.claude-plugin/plugin.json` is the delivery vehicle — a consumer receives a change
only after that version increases.

## 0.6.0

### Changed

- **BREAKING: `youtube` skill renamed to `youtube-digest`.** Invoke as
`/knowledge:youtube-digest` (previously `/knowledge:youtube`). Sibling skills follow a
source+operation grammar (`book-distill`, `course-digest`); the platform noun alone named
the source but not the operation. Triggers are unchanged — "youtube", "watch this YouTube
video", and youtube.com/youtu.be URLs still route to the skill. In-flight watch slices are
unaffected (`.work/<watch-epic>/...` layout is unchanged); resume with
`/knowledge:youtube-digest resume <video-slug>`.

## 0.5.6

### Added
Expand Down
4 changes: 2 additions & 2 deletions plugins/knowledge/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ concept-organized, author-attributed **skill reference files**; a re-runnable
| Skill | Invoke | What it does |
|---|---|---|
| `book-distill` | `/knowledge:book-distill` | Turns a technical book (PDF/EPUB) into concept-organized, author-attributed skill reference files through a structured, multi-session read-write pipeline, updating the target skill's routing table. |
| `youtube` | `/knowledge:youtube` | Watches a single public YouTube video (transcript + visual frames), harvests reference links, drives external research, and synthesizes a prioritized repo-applicability menu. Actions: `watch`, `queue`, `transcript`, `resume`. |
| `youtube-digest` | `/knowledge:youtube-digest` | Watches a single public YouTube video (transcript + visual frames), harvests reference links, drives external research, and synthesizes a prioritized repo-applicability menu. Actions: `watch`, `queue`, `transcript`, `resume`. |
| `setup` | `/knowledge:setup` | Validates `library_dir` against the repository's artifact convention and routes personal option changes through Claude Code's plugin configuration prompt. |

## What book-distill produces
Expand Down Expand Up @@ -50,7 +50,7 @@ any instructions injected through its text.

## Revisit condition

`youtube` ships as a skill inside this plugin rather than a standalone plugin
`youtube-digest` ships as a skill inside this plugin rather than a standalone plugin
because a separate plugin cannot reach this one's vendored `video-digestion`
package — plugins are isolated, with no sibling reach-outs. Extract a standalone
`youtube` plugin once that package is independently distributable, or a consumer
Expand Down
4 changes: 2 additions & 2 deletions plugins/knowledge/skills/course-digest/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: course-digest
description: "Extract and synthesize online video courses into repo-applicable recommendations via browser automation (Playwright + claude-in-chrome), transcript extraction, frame analysis, and LLM synthesis. Use when: 'course digest', 'digest this course', 'analyze course', 'Dometrain', 'watch this course for me', 'course takeaways', 'extract from course', 'summarize course', user shares a Dometrain/Pluralsight/Udemy course URL, or wants course patterns applied to their codebase. Single public YouTube videos → use /knowledge:youtube. Actions: full pipeline (default), extract (phases 1-2 only), analyze (phases 3-5 only), status (list all digested courses), resume <slug> (continue extraction), continue <slug> (resume from saved session state)."
description: "Extract and synthesize online video courses into repo-applicable recommendations via browser automation (Playwright + claude-in-chrome), transcript extraction, frame analysis, and LLM synthesis. Use when: 'course digest', 'digest this course', 'analyze course', 'Dometrain', 'watch this course for me', 'course takeaways', 'extract from course', 'summarize course', user shares a Dometrain/Pluralsight/Udemy course URL, or wants course patterns applied to their codebase. Single public YouTube videos → use /knowledge:youtube-digest. Actions: full pipeline (default), extract (phases 1-2 only), analyze (phases 3-5 only), status (list all digested courses), resume <slug> (continue extraction), continue <slug> (resume from saved session state)."
argument-hint: "[action] [url|slug] (e.g., /knowledge:course-digest <url>, /knowledge:course-digest extract <url>, /knowledge:course-digest resume <slug>, /knowledge:course-digest status)"
user-invocable: true
disable-model-invocation: false
Expand Down Expand Up @@ -135,7 +135,7 @@ Adapters are thin composition layers — delegate to shared `lib/players/` and `
|---|---|---|---|
| `dometrain.com` | Dometrain | `adapters/dometrain.js` | [reference/adapters/dometrain.md](reference/adapters/dometrain.md) |
| `*.teachable.com`, `courses.*.tech` | Teachable (Hotmart video) | `adapters/teachable.js` | [reference/adapters/teachable.md](reference/adapters/teachable.md) |
| Single public YouTube videos | — | use /knowledge:youtube | — |
| Single public YouTube videos | — | use /knowledge:youtube-digest | — |
| `pluralsight.com` | Pluralsight | (future) | — |
| `udemy.com` | Udemy | (future) | — |

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ All course data lives under the invoking project's `library_dir` seam (or `${CLA

## Platform naming

Use platform's lowercase brand name: `dometrain`, `pluralsight`, `udemy`, `manning`, `oreilly`. Single public YouTube videos use `/knowledge:youtube` and its own slice layout — not this course data tree.
Use platform's lowercase brand name: `dometrain`, `pluralsight`, `udemy`, `manning`, `oreilly`. Single public YouTube videos use `/knowledge:youtube-digest` and its own slice layout — not this course data tree.

## Slug naming

Expand Down
6 changes: 3 additions & 3 deletions plugins/knowledge/skills/course-digest/evals/evals.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@
},
{
"id": 2,
"name": "youtube-url-routes-to-youtube-skill",
"name": "youtube-url-routes-to-youtube-digest-skill",
"prompt": "Can you digest this for me? https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"expected_output": "The skill declines to run the course pipeline and routes the user to /knowledge:youtube, because a single public YouTube video is out of scope for course-digest (which targets multi-lesson course platforms like Dometrain/Teachable).",
"expected_output": "The skill declines to run the course pipeline and routes the user to /knowledge:youtube-digest, because a single public YouTube video is out of scope for course-digest (which targets multi-lesson course platforms like Dometrain/Teachable).",
"files": [],
"expectations": [
"Recognizes the URL is a single public YouTube video, not a supported course-platform URL",
"Routes the user to `/knowledge:youtube` instead of running the course-digest pipeline",
"Routes the user to `/knowledge:youtube-digest` instead of running the course-digest pipeline",
"Does NOT begin Phase 1 discovery or launch extraction for the YouTube URL"
]
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ const browsersPath = process.env.PLAYWRIGHT_BROWSERS_PATH || path.join(data, "ms
function computeStamp() {
const hash = createHash("sha256");
const files = ["package.json"];
// Vendored libs are shared plugin-wide (both youtube and course-digest consume
// Vendored libs are shared plugin-wide (both youtube-digest and course-digest consume
// them), so they live at the plugin root, not under this skill.
const vendorRoot = path.join(here, "..", "..", "..", "vendor");
if (fs.existsSync(vendorRoot)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ Run JavaScript to detect video delivery system:
}
```

**YouTube iframes:** when the player detect shows `youtube: true` or iframe hostnames include YouTube, stop — single public YouTube videos are handled by `/knowledge:youtube`, not course-digest adapters.
**YouTube iframes:** when the player detect shows `youtube: true` or iframe hostnames include YouTube, stop — single public YouTube videos are handled by `/knowledge:youtube-digest`, not course-digest adapters.

**Critical distinction**: video player may be inside a **cross-origin iframe**. If so, parent page's JS cannot access player's DOM or API. This fundamentally changes extraction strategy.

Expand Down Expand Up @@ -218,7 +218,7 @@ Some platforms expose transcripts via API:

- **Teachable**: `/api/v2/hotmart/private_video?attachment_id={id}` — returns video metadata (video_id, duration, signature) but NOT transcripts
- **Wistia Data API**: has a captions endpoint but requires the account owner's API token — unusable for third-party courses
- **Single public YouTube videos**: use `/knowledge:youtube` (`transcript` / `watch` actions) — caption acquisition via yt-dlp is `/knowledge:youtube`'s concern, not course adapters
- **Single public YouTube videos**: use `/knowledge:youtube-digest` (`transcript` / `watch` actions) — caption acquisition via yt-dlp is `/knowledge:youtube-digest`'s concern, not course adapters

### 3.5 Fallback: audio extraction + Whisper

Expand Down
Loading
Loading