From aria-knowledge
Captures a chat or email thread from connected ~~chat (Slack, Teams) or ~~email (Gmail, MS365) MCPs and saves it to intake/clippings/ for later review. Invoke via /clip-thread, 'clip this thread', or 'save this Slack thread'.
How this skill is triggered — by the user, by Claude, or both
Slash command
/aria-knowledge:clip-thread <thread-url-or-id> [tags]<thread-url-or-id> [tags]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Save a chat thread or email conversation to `intake/clippings/{YYYY-MM-DD}-{slug}.md` for review and promotion. Unlike `/clip` (URL/snippet) or `/intake` (bulk/doc-anchored), `/clip-thread` is shaped specifically for *threaded* conversations — Slack threads, Teams channel discussions, Gmail conversation chains, MS365 email threads.
Save a chat thread or email conversation to intake/clippings/{YYYY-MM-DD}-{slug}.md for review and promotion. Unlike /clip (URL/snippet) or /intake (bulk/doc-anchored), /clip-thread is shaped specifically for threaded conversations — Slack threads, Teams channel discussions, Gmail conversation chains, MS365 email threads.
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 /clip-thread 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:clip-thread.
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
/clip-threadfrom a non-Code runtime.This skill requires connected ~~chat / ~~email MCPs, which are typically only present in Cowork. The Cowork-native variant has working MCP access. Use
/aria-cowork:clip-thread.Use
/aria-cowork:clip-threadinstead? (y/n)
Wait for an explicit reply:
y / yes — Use the Skill tool to invoke aria-cowork:clip-thread with 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.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.
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."
Verify {knowledge_folder}/intake/clippings/ exists. If not, stop: "Clippings directory not found. Run /setup to repair the knowledge folder structure."
Check Claude's available tool list for ~~chat and ~~email MCPs. The skill needs at least ONE of these connected to proceed.
~~chat (slack, ms365): if connected, available for Slack threads or Teams channel messages.~~email (gmail, ms365): if connected, available for Gmail or MS365 email threads.If NEITHER category has a connected MCP, output the standard fallback notice and stop:
No required MCPs connected for
/clip-thread. Connect one of: Slack, Microsoft 365 Teams (for ~~chat) or Gmail, Microsoft 365 Outlook (for ~~email) via Claude Code's MCP config (or Cowork Settings → Connectors). See CONNECTORS.md. Skipping this run.
Per ADR-015, the runtime tool list IS the probe — no explicit API call needed.
The user provides one of:
https://<workspace>.slack.com/archives/<channel>/<message-ts> or thread permalinkhttps://teams.microsoft.com/l/message/...https://mail.google.com/mail/u/0/#inbox/<thread-id> or just the thread IDOptionally followed by tags (e.g., slack #engineering, email customer-feedback).
Source-type detection:
| Input shape | Routes to |
|---|---|
Contains slack.com/archives/ | ~~chat (slack) |
Contains teams.microsoft.com | ~~chat (ms365) |
Contains mail.google.com or matches Gmail thread-ID pattern | ~~email (gmail) |
| Outlook-shaped ID | ~~email (ms365) |
| Ambiguous | Ask user which category to route through |
If the detected category's MCP is NOT connected, output the category-specific fallback notice and stop:
This thread looks like a [Slack thread / Gmail thread / etc.] but the
~~chat/
Call the appropriate MCP tool to retrieve the thread:
conversations.replies (or equivalent) tool with the channel + thread_ts derived from the URL. Retrieve all messages in the thread.messages.get for each message in the thread (or threads.get if exposed).For each message in the thread, gather:
Limit: if the thread has more than 50 messages, fetch the first 50 + note the truncation in the clipping. The user can run /clip-thread again with a refined identifier for the tail.
Slug-ify the thread for the filename: use the first message's first ~6 significant words, lowercased, hyphen-separated, ASCII-only.
Generate the date stamp as YYYY-MM-DD (local time).
Filename: intake/clippings/{date}-{slug}.md
If a file with that name already exists, append -2, -3, etc. to deduplicate.
Body template:
---
source: <thread-url-or-id>
source_type: <slack|teams|gmail|ms365>
date: <YYYY-MM-DD>
participants: [<list of unique authors>]
message_count: <N>
tags: [<from input args, plus auto-detected like 'slack' or 'email'>]
---
# <thread topic — extracted from first message's first line or the channel name>
## Context
- **Source:** <source URL or "Slack thread in #channel" / "Gmail thread with N replies">
- **Participants:** <N authors>: <list>
- **Spans:** <first-message-date> → <last-message-date>
- **Message count:** <N> (or "<N> of <total> — truncated at 50")
## Thread
<for each message:>
### <Author> — <timestamp>
<message body, lightly cleaned (remove Slack/MS markup if obvious, preserve markdown)>
<reactions if present: e.g., "Reactions: 👍 ×3, 🎉 ×1">
<attachment notes if present: e.g., "[attachment: deploy-logs.txt (45KB)]">
---
## Reaction
<intentionally left empty — the user's reaction / why this is worth keeping. /audit-knowledge surfaces this for review at next audit pass.>
Write the composed clipping to {knowledge_folder}/intake/clippings/{date}-{slug}.md.
Report to user:
Clipped <N> messages from <source-type> thread to intake/clippings/<date>-<slug>.md.
- Participants: <list, max 5 + "and N more" if truncated>
- Spans: <date range>
- Tags: <from input>
Next: review at next /audit-knowledge run. Add a reaction in the "## Reaction" section if you want to lock in the why-it-matters context now.
intake/clippings/ until /audit-knowledge routes them. This skill is intake-only.[REDACTED] in the body and add a redactions: true field to frontmatter. Surface in the report./intake bulk mode./audit-knowledge — clippings written here are routed at next audit per the standard intake-disposition vocabulary (Accept → tracker / roadmap / todo / adr / plan / bundle / rule, or Reject / Defer).## Reaction section is the user's voice slot. /clip-thread never fills it (the same precedent /intake doc set in v2.17.0).npx claudepluginhub mikeprasad/aria-knowledge --plugin aria-knowledgeFolds a meeting transcript or notes into structured intake with participants, topics, action items, and decisions. Accepts ~~docs MCP URLs or pasted text.
Reads a resolved Slack thread markdown export and classifies it as a decision, exception, or workflow, then writes a typed memory entry to Meta/.
Pulls external context (Linear tickets, repos, or any content) into the second brain. Handles PDFs, images, code, conversations, docs, or raw text.