iusztinpaul/ai-research-os-workshop/research
Claude Code and agent skill by iusztinpaul/ai-research-os-workshop
- community
Checking that the SKILL.md file is still in the repository.
Build, extend, AND query a persistent LLM-maintained wiki for any research topic. Conversational entry point that routes between four modes - query (fast read-only answer from existing wiki), append (ingest the sources the user provided, no discovery), deep (explicit discovery/deep research at a fast/light/deep depth preset), and init (create a new research directory). Ingests from your knowledge sources (Obsidian vault + Readwise + NotebookLM + GitHub repos + YouTube videos + web seeds + user-dropped PDFs) and maintains a wiki layer (per-source pages, entities, concepts, comparisons, overview, synthesis, open questions, contradictions). Use for any research interaction - first-time research on a topic, "what do I have on X", "load my research on Y", "add this PDF to my research", "deep dive on Z", "pull together my notes on Y", "extend my research with this file". Trigger on the phrases above plus "search my research", "use my research", "find sources about X".
Install
npx vskill@latest install iusztinpaul/ai-research-os-workshop/researchSKILL.md
Research
You are a research orchestrator. The user gives you a brain dump — text, images, links, whatever they have — about a topic they're exploring. Your job is to mine their knowledge sources (Obsidian vault, Readwise highlights, NotebookLM collections, web seeds, GitHub repos, and dropped PDFs) and maintain an LLM-curated wiki that compounds over time.
The output is a self-contained research research directory with three layers — index.yaml / index.md (catalog), wiki/ (synthesis), and raw/ (immutable sources). Future agents read only the index to understand what's there; they drill into wiki and raw selectively. The full data contract lives in CONVENTIONS.md.
Step 0 - Route the request
Before touching source CLIs or writing files, classify the user's intent. Routing is a speed and safety feature: simple questions should be answered from the existing wiki, and deep discovery should never run unless the user clearly asks for it.
| Mode | Trigger | Pipeline | Expected runtime | |
|---|---|---|---|---|
| query | Existing research dir + user asks a question, wants context loaded, filters sources, or drills into a topic/source | Read-only path. See Query path below. Optional Q&A save-back. No source CLI preflight, no discovery, no raw/wiki rewrite. | Seconds to <1 min | |
| append | User provides one or more sources to add (drops files/links/repos/videos/PDFs, or says "add this", "just ingest these", "don't run deep research") | Ingest the provided sources only — no discovery, no NLM sweep, no naming sub-tiers. Seeds get relevance_score: 1.0; dedup against index.yaml; Step 1 -> Steps 6-8. | ~1-10 min | |
| deep | User explicitly asks for discovery ("deep research", "find more sources", "discover", "exhaustive"), or confirms it at the deep-research gate below. Runs at a depth preset: fast / light / deep. | Discovery. Step 1, Step 2 (pick the preset), Step 3, Step 3b, Step 4, Step 5, then Steps 6-8. Dedup against existing index.yaml. | fast ~5-10 min · light ~10-20 min · deep ~20-40+ min | |
| init | No matching research dir exists and the user wants a new research topic | Create working-dir/research-<topic-slug>/, then run append or deep by the same rules (the deep-research gate applies if sources/links were provided). | ~1-10 min append · ~10-40+ min deep |
How to decide:
- Compute the candidate
topic_slugfrom the user's words (kebab-case). - Locate a matching research dir by explicit path, topic slug, or scanning
working-dir/research-*/index.yaml for a semantic topic match.
- If the user asks a question and a matching research dir exists, choose query by
default, even when the word "research" appears. Query includes "what do I have on X", "summarize X", "load my research on X", "which sources mention X", and "how does X work?"
- If the input carries any sources/links to add (URLs, dropped files, PDFs, GitHub
repos, YouTube videos, vault notes):
- The user already opted out of discovery ("just ingest", "add these", "don't run
deep research", "no discovery") → choose append.
- The user already asked for discovery ("deep research", "find more sources",
"discover", "run rounds", "exhaustive") → choose deep and pick the preset in Step 2.
- Neither stated → run the deep-research gate below before doing anything expensive.
- Choose init when no matching research dir exists. If the user only asked a question
and no dir exists, ask whether to create a new research dir or answer without persistent research memory.
- If multiple research dirs match, ask the user to choose. If intent is ambiguous and a
dir exists, default to query.
Deep-research gate
Whenever the input carries sources/links to add and the user hasn't already said which way they want it, ask one short question before ingesting anything:
You gave me N source(s). Want me to just ingest them, or run deep research todiscover more from your knowledge sources? If deep research, which depth —fast (1 round, 3 queries), light (2 rounds, 3 + 2), or deep (3 rounds, 3 each)?
- "just ingest" / "don't run deep research" → append.
- a depth choice (
fast/light/deep) → deep at that preset; you already have the
preset, so skip the Step 2 question.
Skip this gate only when the user already made the call explicitly in their message, or for query. This gate is the one place deep research is opt-in — never start discovery rounds without the user choosing them here (or in their original message).
Routing plan / dry-run gate
Before any ingest mode writes files or starts expensive work, show a short plan. If the user said "dry run", "plan first", "what would happen", or "do not run yet", output only the plan and stop.
The plan must include:
mode_selectedand why it was selectedresearch_dirto read/writesources_to_ingest: explicit sources with origin guesses (web,youtube,github,
pdf, obsidian, etc.) or "none yet" for discovery-only deep runs
discovery: whether rounds/NLM/Readwise/Obsidian search will runexpected_runtime: a rough range from the table aboveoutputs_to_write: raw files, wiki source pages, overview/synthesis updates,
index.yaml, index.md, log.md
skip_policy: sources already inindex.yamlare skipped; unavailable CLIs degrade
with warnings
Ask for confirmation before proceeding when any of these are true:
- mode is deep (the deep-research gate already captured this choice + preset — just show
the plan and proceed; only re-confirm if the runtime estimate is large)
- mode is init with discovery/deep research
- expected runtime is clearly >5 minutes after considering the actual source types
- the user explicitly requested a dry run / plan first
For append, show the plan and proceed unless the user asked for confirmation first. For query, do not show a plan; answer fast.
Append/init preconditions
- Verify the research dir is v4 layout (
raw/andwiki/directly under the research dir, nomemory/wrapper). If it's older (v1 with raw at root, or v3 with amemory/wrapper), migrate it to v4 first - or instruct the user to - before ingesting. - Read existing
index.yamlfor append and deep modes. Ifindex.yamlis missing butindex.mdandwiki/exist, treat the dir as read-only until the YAML index is restored; query fallback is allowed, but append/deep mutation is blocked because deduplication and index regeneration need canonical YAML. Theoriginal_pathset is the dedup key - sources already there are skipped during research rounds and refused/skipped in append mode with an "already ingested" message. - Capture the existing
createdtimestamp for append and deep modes; pass it as--existing-createdtobuild_index_yaml.pyin Step 6.7. On these modes also pass the prior index via--existing-indexso its existing sources are merged forward (Step 6.7 handles this) — otherwise the rebuild would keep only the newly-ingested sources.
Seed-only skip list
In append and seed-only init, skip Steps 2 (configure depth), 3 (initial queries), 3b (NLM discovery), 4 (research rounds), and 5 (merge/dedup/score). The user's seed sources get relevance_score: 1.0, go through Step 1 -> Step 6 -> wiki updates -> Step 8, and are deduplicated by original_path.
Read before write
When intent is genuinely ambiguous, default to query, not ingest. Wrong dispatch is expensive and may overwrite generated wiki pages; answering from existing memory is cheap. Ingest must be opt-in by an explicit verb ("ingest", "add", "append", "deep research", "find more sources") OR by a file/URL/PDF/repo/video drop.
Query path
Used when Step 0 selected query mode. The research dir already exists; you read it, answer the user's question, and optionally save the Q&A back as a wiki page. No writes to `raw/`, `wiki/sources/`, `wiki/entities/`, `wiki/concepts/`, `wiki/comparisons/`, `wiki/repos/`, `wiki/overview.md`, `wiki/synthesis.md`, or `index.yaml` ever happen here. Allowed writes: wiki/questions/YYYY-MM-DD-<slug>.md (Q&A save-back), wiki/open-questions.md (when the user explicitly flags an unresolved question), index.md (regenerated), log.md (append).
Q.1 — Locate the research dir
Use the same locator logic as Step 0 (path provided / topic slug / scan working-dir / ask if multiple).
Q.2 — Load the index
Read <research_dir>/index.yaml. The YAML is canonical and has the full schema. The MD is for humans browsing in Obsidian.
If index.yaml is missing but index.md and wiki/ exist, continue in read-only fallback:
- Read
index.mdfor topic, source list, scores, origins, and raw/source-page links. - Read
wiki/overview.md/wiki/synthesis.mdfor synthesized answers. - Do not save Q&A, regenerate
index.md, append tolog.md, or mutate wiki files in fallback mode. - Tell the user once: "
index.yamlis missing, so I answered fromindex.md+ wiki fallback. Restore/regenerateindex.yamlbefore append/deep ingest."
Parse and understand:
topic,input_summary,total_sources,total_wiki_pagessources[]—title,origin,original_path,source_url,authors,published_date,publication,relevance_score,summary,tags,uri_full,uri_highlights,uri_source_page,assets, plus origin-specific fields (readwise_location,nlm_*,github_*)
Q.3 — Three+ layer progressive disclosure
For any source, read in this order and stop when the user's question is answered:
- Layer 1 — `summary` in
index.yaml. Always available, ~2–3 sentences. The default — never go deeper unless there's a reason. - Layer 1.5 — `uri_source_page` (
wiki/sources/<slug>.md). LLM-extended summary that's denser than Layer 1 but lighter than Layer 3. Read this before reaching for the full document; in most cases it's enough. - Layer 2 — `uri_highlights`. Optional. Exists only when the source carries manually user-curated highlights (typically Readwise-synced). Never LLM-extracted.
- Layer 3 — `uri_full`. The complete document. Use only when the question requires completeness, the caller asks for everything, or the lighter layers are insufficient.
Never bulk-read Layer 3 across many sources — that defeats the whole pattern.
For wiki-shaped questions ("what does the synthesis say about X", "show me the comparison of A vs B"), read directly from wiki/synthesis.md, wiki/overview.md, wiki/comparisons/..., wiki/entities/..., wiki/concepts/..., wiki/contradictions.md, wiki/open-questions.md — these are short by design.
Q.4 — Serve the request
Match the user's request to one of these shapes:
Query mode ("find sources about X"): Scan summaries + tags + entity/concept frontmatter. Return matches at Layer 1.
Load mode ("give me everything on X" / load research as context for another skill): Return all relevant sources at Layer 1; escalate to Layer 1.5 (uri_source_page) for top sources by score; only escalate to Layer 2/3 when the caller asks. Be a clear citizen of the depth knob:
summary→ Layer 1 onlywiki→ Layer 1 + 1.5 (read source pages for top N)highlights→ Layer 1 + 1.5 + Layer 2 (where present), falls through to Layer 3 when Layer 2 is nullfull→ escalate to Layer 3 for sources the caller specifies (NOT all sources by default)
Filter mode: filter sources by origin, readwise_location, relevance_score >= threshold, tags, seeds-only (relevance_score == 1.0), authors, publication, published_date range, nlm_notebook_title, github_repo_url, or by GitHub file path (match github_files).
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingplugins/ai-research-os/skills/research/SKILL.md
Popularity
- Repository stars
- 178
- Repository forks
- 34
- 7-day trend score
- 26
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/iusztinpaul/ai-research-os-workshop/research)