iusztinpaul/ai-research-os-workshop/research

Claude Code and agent skill by iusztinpaul/ai-research-os-workshop

Trust tier 3
  • community
Source check pending

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/research

SKILL.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.

ModeTriggerPipelineExpected runtime
queryExisting research dir + user asks a question, wants context loaded, filters sources, or drills into a topic/sourceRead-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
appendUser 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
deepUser 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
initNo matching research dir exists and the user wants a new research topicCreate 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:

  1. Compute the candidate topic_slug from the user's words (kebab-case).
  2. Locate a matching research dir by explicit path, topic slug, or scanning

working-dir/research-*/index.yaml for a semantic topic match.

  1. 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?"

  1. 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.
  1. 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.

  1. 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 to
discover 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_selected and why it was selected
  • research_dir to read/write
  • sources_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 run
  • expected_runtime: a rough range from the table above
  • outputs_to_write: raw files, wiki source pages, overview/synthesis updates,

index.yaml, index.md, log.md

  • skip_policy: sources already in index.yaml are 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/ and wiki/ directly under the research dir, no memory/ wrapper). If it's older (v1 with raw at root, or v3 with a memory/ wrapper), migrate it to v4 first - or instruct the user to - before ingesting.
  • Read existing index.yaml for append and deep modes. If index.yaml is missing but index.md and wiki/ 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. The original_path set 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 created timestamp for append and deep modes; pass it as --existing-created to build_index_yaml.py in Step 6.7. On these modes also pass the prior index via --existing-index so 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.md for topic, source list, scores, origins, and raw/source-page links.
  • Read wiki/overview.md / wiki/synthesis.md for synthesized answers.
  • Do not save Q&A, regenerate index.md, append to log.md, or mutate wiki files in fallback mode.
  • Tell the user once: "index.yaml is missing, so I answered from index.md + wiki fallback. Restore/regenerate index.yaml before append/deep ingest."

Parse and understand:

  • topic, input_summary, total_sources, total_wiki_pages
  • sources[] — 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:

  1. Layer 1 — `summary` in index.yaml. Always available, ~2–3 sentences. The default — never go deeper unless there's a reason.
  2. 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.
  3. Layer 2 — `uri_highlights`. Optional. Exists only when the source carries manually user-curated highlights (typically Readwise-synced). Never LLM-extracted.
  4. 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 only
  • wiki → 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 null
  • full → 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

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
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/iusztinpaul/ai-research-os-workshop/research/badge)](https://verified-skill.com/skills/iusztinpaul/ai-research-os-workshop/research)

Something wrong with this skill or its page? Tell us.