/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.
Doc mode shipped in v0.3.0 (parity with aria-knowledge v2.17.0 — same intake-doc.md template, same intake/docs/ subfolder convention, same body structure).
Runtime Gate (per ADR-094)
Canonical resolution: This is the Claude Cowork variant — namespaced-only. When both plugin-claude-code and plugin-claude-cowork are loaded in the same session (most common in Claude Desktop), bare /intake resolves to aria-knowledge's variant — Code is the canonical owner of all 24 dual-port skills per ADR-094 §Part 1. To reach this skill, use the namespaced form: /aria-cowork:intake. Do NOT match bare /intake — that belongs to aria-knowledge.
Before Step 0: Check whether the Bash tool is available in this session. If Bash IS available (you are running in Claude Code or another runtime with shell access), surface the following notification and wait for explicit user confirmation:
⚠️ Runtime mismatch — you invoked aria-cowork's /intake from a runtime with shell access.
This variant uses persistent-grant attached-folder scans and ~~docs MCPs (typically only in Cowork) — but you appear to be in Claude Code, where local file scans via Bash + WebFetch ARE available and the aria-knowledge canonical uses them directly. For the Code-native variant, use /intake (the aria-knowledge canonical).
Use/intakeinstead? (y/n)
Wait for an explicit reply:
y/yes— Use theSkilltool to invokeintake(the bare-slash canonical, which routes to aria-knowledge when both ports are loaded) with the same arguments the user provided to this invocation. Do not proceed with this skill's steps; the aria-knowledge 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-cowork) 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 NOT available (normal Cowork runtime), proceed to Step 0.
Step 0: Resolve config + Mode detection
The default knowledge folder is ~/Projects/knowledge/ (expand ~ to your home directory's absolute path). Read <knowledge_folder>/aria-config.md and extract knowledge_folder. If aria-config.md doesn't exist, stop: "aria-cowork is not configured. Run /aria-setup to get started."
Use <knowledge_folder> for all file operations during this session. The absolute knowledge_folder from config is for reference (so aria-knowledge in Code reaches the same folder); during a Cowork session, the sandbox path resolves to the same files.
Mode detection: If the first argument matches doc (case-insensitive), this is a doc-mode capture. Set mode = doc; the remaining arguments (if any) are the source URL, file path, or title. Jump to "Doc Mode Steps" below. Otherwise set mode = bulk and proceed to Step 1.
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 cowork v0.3.0 / aria-knowledge v2.17.0 frontmatter optional-fields rule)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 (mirrors aria-knowledge's v2.17.0 template byte-faithfully). - 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 reaction — leave as a single-line placeholder ("{Your reaction — 1-3 sentences. This section is yours, not the doc's.}") for the user to fill, since "reaction" is the user's voice not Claude's.
Step D4: Preview
Show the populated entry before writing. Format:
## Doc Intake Preview
**Target:** <knowledge_folder>/intake/docs/{YYYY-MM-DD}-{slug}.md
[full populated entry: frontmatter + body]
---
Save to intake/docs/?
- `yes` — write the file as shown
- `edit {section}` — revise a specific section (claims / keeping / contested / action / reaction / tags / hints / title / slug)
- `skip` — abort, write nothing
Wait for explicit response. Allow multiple `edi