/intake — Bulk Knowledge Import + Doc-Anchored Capture
Two modes:
- Bulk mode (default) — Scan files, directories, or URLs for knowledge-worthy content and stage findings to the existing backlogs (insights / decisions / extraction). Multi-source, category-based, dedup-aware. Same surface as prior /intake versions.
- Doc mode (
/intake doc) — Capture a single doc as a structured intake entry atintake/docs/{YYYY-MM-DD}-{slug}.mdwith a 5-section body: what the doc claims / worth keeping / contested or unclear / action implied / my reaction. For when you're reading something and want a thoughtful capture rather than a bulk scan.
Runtime Gate (per ADR-094)
Canonical resolution: This is the Claude Code variant. When both plugin-claude-code and plugin-claude-cowork are loaded in the same session (most common in Claude Desktop), bare /intake resolves to this skill — aria-knowledge (Code) is the canonical owner of all 24 dual-port skills per ADR-094 §Part 1. The Cowork variant is namespaced-only: /aria-cowork:intake.
Before Step 0: Check that the Bash tool is available in this session. If Bash is NOT available (you are running in Claude Cowork or another non-Code runtime), surface the following notification and wait for explicit user confirmation:
⚠️ Runtime mismatch — you invoked aria-knowledge's /intake from a non-Code runtime.
This variant scans local files/directories/globs via Bash + WebFetch, which Cowork can't access the same way. For the Cowork-native variant (file scan reads from attached folder; doc mode uses ~~docs MCPs; supports pasted content), use /aria-cowork:intake.
Use/aria-cowork:intakeinstead? (y/n)
Wait for an explicit reply:
y/yes— Use theSkilltool to invokearia-cowork:intakewith the same arguments the user provided to this invocation. Do not proceed with this skill's steps; the cowork variant takes over and runs to completion. This is the default-yes path — auto-redirect is the helpful action.n/no— Proceed with this (aria-knowledge) variant anyway despite the runtime mismatch. The user has explicitly opted in.- No response / any other reply — Treat as "do not proceed" and exit cleanly without running either variant.
This gate applies even when mode = auto per ADR-094 §Part 3. Auto mode's "implicit-yes on all gates" rule is suspended for the runtime-mismatch check — auto trusts that the user invoked the correct variant, and this gate enforces that precondition. All other auto-mode gates remain bypassed. The friction cost is now low: on y, the auto-redirect runs the correct variant with the original args.
If Bash is available, proceed to Step 0.
Step 0: Resolve Config + Mode Detection
Read ~/.claude/aria-knowledge.local.md and extract knowledge_folder. If the file doesn't exist, stop: "aria-knowledge is not configured. Run /setup to get started."
Use {knowledge_folder} as the base path for all file operations in subsequent steps.
Mode detection (first match wins):
- First arg
== extract(case-insensitive) →mode = extract. The remaining arg is ONE source (URL / file / dir / doc-URL); decompose it into backlog entries by running the bulk-scan logic (Step 1 onward) on that single source.extractis standalone — it does NOT combine withdoc/thread(no/intake extract doc …); a doc to decompose is just/intake extract <doc-url>(extract fetches it). If the arg afterextractis literallydocorthread, treat as malformed and prompt for clarification. - First arg
== doc→mode = doc. Jump to "Doc Mode Steps" (D1–D6), unchanged. - First arg
== thread→mode = thread. Jump to "Thread Mode Steps" (T1–T3) below. - (auto) Single arg whose host is a chat/email service (
slack.com,teams.microsoft.com,mail.google.com, outlook/office) →mode = thread(no keyword needed). - (auto) Single arg matching
^https?://OR free text (not an existing path) →mode = clip-whole. Jump to "Clip-Whole Steps" (C1–C3) below. - (auto) Args are existing file paths / directories / globs, OR multiple sources →
mode = bulk. Proceed to Step 1 (bulk scan, unchanged). - No args → ask: "What would you like to intake? (a URL, text, file/dir/glob; or
extract <src>to decompose,doc <src>for a reflection capture,thread <id>for a chat/email thread)".
The mental model: default = capture this whole; extract = decompose it; doc = reflect on it (5-section); thread = the one source that needs naming (or auto-detected from a chat URL). Note (behavior change from prior versions): a bare URL now CLIPS WHOLE — it no longer auto-mines into backlogs. To mine a single URL, use /intake extract <url> (or let /audit-knowledge Step 2f decompose the clipping later).
Doc Mode Steps (mode = doc only)
Doc mode runs steps D1 → D6 to completion and exits. Do not run any bulk-mode step (Step 1 onward) in doc mode.
Step D1: Acquire Doc Source
The source can be a URL, file path, or just a title (when capturing notes on a doc you read elsewhere).
- If args after
doccontain a URL: use assource_url; attempt WebFetch in D2 to extract title/author/content - If args after
doccontain a file path: use assource_path; Read in D2 - If args after
docare plain text (no URL/path detected): treat assource_title; no content fetch — user fills body manually in D3 - If no args after
doc: prompt: "What doc are you capturing? Paste a URL, file path, or title."
Step D2: Read or Note Doc Content
- URL source: WebFetch the URL. Extract title, author (if discoverable from byline/meta), and key content. Respect copyright — capture summary and key claims for downstream synthesis, not full page text.
- File path source: Read the file. If very large (>500 lines), use the same chunked-scan strategy as bulk mode (first 100, last 50, section headers, then targeted areas).
- Title-only source: No content fetch. User will fill body sections manually in D3.
Capture the following for D3:
source_title(from page title, file frontmatter, or user-provided string)source_url(if URL; else omit)source_author(if discoverable; else omit per #28a-5)captured_at(current ISO 8601 timestamp)read_at(defaults tocaptured_at— D4 preview lets user adjust if they read the doc earlier)- Summarized claims, candidate "worth keeping" items, and any contested or action-implied content noticed during the scan
Step D3: Populate Template
- Read
${CLAUDE_PLUGIN_ROOT}/template/intake/intake-doc.mdto load the body template. - Generate slug from
source_title: lowercase, hyphenated, alphanumeric only, max ~60 chars. Example:"The Bitter Lesson"→the-bitter-lesson. Ifsource_titleis empty, usedoc-{HHMMSS}as fallback. - Resolve target path:
{knowledge_folder}/intake/docs/{YYYY-MM-DD}-{slug}.md. If file already exists at that path, append-2,-3, etc. to slug until unique. - Fill the frontmatter using captured fields from D2. Omit
source_urlif absent; omitsource_authorif absent. Always populatecaptured_at,read_at,type: intake-doc. - Suggest 2-5 tags based on doc topic (cross-check existing
index.mdtags to prefer canonical names; new tags are fine but flag them). - Suggest 2-4
semantic-hints:free-form phrases that match how a future query might reach this doc (per the convention intemplate/README.md). - Pre-fill body sections from the D2 scan:
- What the doc claims — 2-4 sentence summary in your own words
- Worth keeping — bullet list of insights/quotes/data points worth durable storage; aim for 2-6 bullets
- Contested or unclear — populate if the scan surfaced anything debatable; leave empty (or omit the section) if nothing flagged
- Action implied — populate if the doc suggests a decision or next step relevant to ongoing work; omit if N/A
- **My