Help us improve
Share bugs, ideas, or general feedback.
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'.
npx claudepluginhub mikeprasad/aria-knowledge --plugin aria-knowledgeHow 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.
Folds a meeting transcript or notes into structured intake with participants, topics, action items, and decisions. Accepts ~~docs MCP URLs or pasted text.
Synthesizes resolved Slack thread markdown into typed Meta/ memory entries (decisions, exceptions, workflows). Invoke /synth-thread-to-sop <thread-md-file> for one-time decisions, deviations, or procedures.
Pulls external context into your second brain from Linear, repositories, or any content (PDFs, images, code, text). Useful for importing project tickets, codebases, or arbitrary data.
Share bugs, ideas, or general feedback.
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).