Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
5606ac6
docs(02-core-paper-tools): create phase plan (3 plans, 3 waves)
jerry609 Mar 14, 2026
0bc9523
docs: start milestone v1.1 Agent Orchestration Dashboard
jerry609 Mar 14, 2026
323a0e8
feat(02-01): add MCP audit helper and paper_search tool with TDD tests
jerry609 Mar 14, 2026
0bc1673
feat(02-01): register paper_search tool in MCP server with bootstrap …
jerry609 Mar 14, 2026
188f80f
docs(02-01): complete audit helper and paper_search plan
jerry609 Mar 14, 2026
25eee39
docs: complete v1.1 domain research (stack, features, architecture, p…
jerry609 Mar 14, 2026
9c7afec
test(02-02): add failing tests for paper_judge, paper_summarize, rele…
jerry609 Mar 14, 2026
f5e321a
feat(02-02): implement paper_judge, paper_summarize, relevance_assess…
jerry609 Mar 14, 2026
a561d64
feat(02-02): register paper_judge, paper_summarize, relevance_assess …
jerry609 Mar 14, 2026
54a9a71
docs: define milestone v1.1 requirements
jerry609 Mar 14, 2026
e79db51
docs(02-02): complete LLM-based paper tools plan
jerry609 Mar 14, 2026
fca92ef
test(02-03): add MCP tool integration tests for listing, schema, invo…
jerry609 Mar 14, 2026
9c99080
docs: create milestone v1.1 roadmap (5 phases)
jerry609 Mar 14, 2026
4a71a15
docs(07): research eventbus+sse phase domain
jerry609 Mar 14, 2026
d764bed
docs(07): add research and validation strategy
jerry609 Mar 14, 2026
25d4128
docs(07): create phase plan for EventBus + SSE Foundation
jerry609 Mar 14, 2026
f068ce0
docs: define v1.0 phases 3-6 requirements and roadmap
jerry609 Mar 14, 2026
3aafa52
docs(03): research remaining mcp tools phase domain
jerry609 Mar 14, 2026
535d5cb
docs(03): add research and validation strategy
jerry609 Mar 14, 2026
e24e236
docs(03): create phase plan for remaining MCP tools
jerry609 Mar 14, 2026
d990365
test(03-01): add failing tests for analyze_trends and check_scholar M…
jerry609 Mar 14, 2026
a9b126d
test(03-02): add failing tests for get_research_context, save_to_memo…
jerry609 Mar 14, 2026
202b8b1
feat(03-01): implement analyze_trends and check_scholar MCP tools
jerry609 Mar 14, 2026
640e1dd
feat(03-02): implement get_research_context, save_to_memory, export_t…
jerry609 Mar 14, 2026
17f9e68
docs(03-01): complete analyze_trends and check_scholar plan
jerry609 Mar 14, 2026
868d0bf
docs(03-02): complete get_research_context, save_to_memory, export_to…
jerry609 Mar 14, 2026
1abbdac
feat(03-03): register all 9 MCP tools in server.py
jerry609 Mar 14, 2026
d2e3cab
feat(03-03): extend integration tests to cover all 9 MCP tools
jerry609 Mar 14, 2026
9b847e2
docs(03-03): complete MCP server registration plan
jerry609 Mar 14, 2026
5c91b0f
docs(phase-03): complete phase execution
jerry609 Mar 14, 2026
a662c0a
docs(04): research MCP resources phase domain
jerry609 Mar 14, 2026
d45e4fb
docs(phase-04): add validation strategy
jerry609 Mar 14, 2026
95ee8bc
docs(04-mcp-resources): create phase plan
jerry609 Mar 14, 2026
70493f9
test(04-01): add failing tests for track resource impls
jerry609 Mar 14, 2026
1335959
feat(04-01): implement track metadata, papers, memory resources
jerry609 Mar 14, 2026
d9014fb
test(04-01): add failing tests for scholars resource
jerry609 Mar 14, 2026
eecb0bb
feat(04-01): implement scholars resource
jerry609 Mar 14, 2026
f2b50b5
docs(04-01): complete MCP resource modules plan
jerry609 Mar 14, 2026
a28f57d
feat(04-02): register 4 MCP resources in server.py
jerry609 Mar 14, 2026
337defb
feat(04-02): add TestMCPResourceListing integration tests
jerry609 Mar 14, 2026
dc30c4b
docs(04-02): complete MCP resource registration plan
jerry609 Mar 14, 2026
3b701e4
docs(phase-04): complete phase execution
jerry609 Mar 14, 2026
3257cc9
fix(mcp): align context and track metadata tools
jerry609 Mar 14, 2026
2be865c
fix(mcp): address review feedback on broker surfaces
jerry609 Mar 14, 2026
0e4cd11
docs(planning): align milestone state and protocol test notes
jerry609 Mar 14, 2026
df35290
fix(mcp): harden context and resource contracts
jerry609 Mar 14, 2026
4e303dc
test(research): align context route auth coverage
jerry609 Mar 14, 2026
1f1c076
fix(mcp): validate save_to_memory confidence
jerry609 Mar 14, 2026
185b796
docs: start milestone v2.0 PostgreSQL Migration & Data Layer Refactoring
jerry609 Mar 14, 2026
7ce1020
docs: add v2.0 milestone (PG migration + async + model refactoring) —…
jerry609 Mar 14, 2026
18fb34b
docs(05): research phase transport and entry point
jerry609 Mar 14, 2026
7054144
docs(phase-5): add validation strategy
jerry609 Mar 14, 2026
1f71014
docs(05-transport-entry-point): create phase plan
jerry609 Mar 14, 2026
69dc23f
docs: complete project research
jerry609 Mar 14, 2026
17ce36b
feat(05-01): add serve.py transport dispatch and update packaging
jerry609 Mar 14, 2026
c001b85
feat(05-01): add mcp serve subcommand to CLI
jerry609 Mar 14, 2026
3daf635
docs: define milestone v2.0 requirements (24 items)
jerry609 Mar 14, 2026
86b1ee1
docs(05-01): complete transport entry point plan
jerry609 Mar 14, 2026
5e0fc8d
docs: create milestone v2.0 roadmap (phases 12-17, 25 requirements)
jerry609 Mar 14, 2026
8a03938
docs(06): research agent skills phase domain
jerry609 Mar 14, 2026
dd16b0f
docs(phase-6): add validation strategy
jerry609 Mar 14, 2026
a9b7749
docs(06): create agent skills phase plan
jerry609 Mar 14, 2026
7f9d0d1
test(06-01): add failing structural tests for SKILL.md files
jerry609 Mar 14, 2026
4c08c60
feat(06-01): create four PaperBot agent skill files
jerry609 Mar 14, 2026
d5515c7
docs(06-01): complete agent-skills plan - four SKILL.md files + struc…
jerry609 Mar 14, 2026
8035f12
docs(phase-06): complete phase execution
jerry609 Mar 14, 2026
712dbc6
docs(07-eventbus-sse-foundation): create phase plan
jerry609 Mar 14, 2026
623b030
docs(12): capture phase context
jerry609 Mar 14, 2026
32b3243
docs(state): record phase 12 context session
jerry609 Mar 14, 2026
874ab1e
test(07-01): add failing tests for EventBusEventLog fan-out ring buffer
jerry609 Mar 14, 2026
f514ac5
feat(07-01): implement EventBusEventLog asyncio fan-out ring buffer
jerry609 Mar 14, 2026
07eb59d
docs(07-01): complete EventBusEventLog plan - fan-out ring buffer bac…
jerry609 Mar 14, 2026
a518e15
feat(07-02): create GET /api/events/stream SSE fan-out endpoint
jerry609 Mar 14, 2026
ce72081
feat(07-02): wire EventBusEventLog into main.py + real integration te…
jerry609 Mar 14, 2026
a3736d4
docs(07-02): complete SSE endpoint + wiring plan - 7/7 tests passing
jerry609 Mar 14, 2026
e70478b
docs(phase-07): complete phase execution
jerry609 Mar 14, 2026
dfdd126
fix(mcp): harden resource/tool contracts and expand test coverage
jerry609 Mar 14, 2026
3789a6a
docs: add verification and UAT reports for phases 3-5
jerry609 Mar 14, 2026
e0a1103
docs(phase-03): mark phase complete in roadmap
jerry609 Mar 14, 2026
3fbd006
docs: mark v1.0 MCP Server milestone complete (phases 1-6 all done)
jerry609 Mar 14, 2026
427c7e8
refactor(identity): retire legacy default user namespace
jerry609 Mar 14, 2026
b65aa80
fix(mcp): address review findings
jerry609 Mar 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 95 additions & 0 deletions .claude/skills/literature-review/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
---
name: literature-review
description: This skill should be used when the user asks to "do a literature review",
"survey papers on a topic", "search and summarize research on X", "find papers about
attention mechanisms", "systematic review of the literature", "what papers exist on Y",
or wants a multi-step workflow to search, filter by relevance, score quality, and
summarize academic papers using PaperBot MCP tools.
tools:
- paper_search
- relevance_assess
- paper_judge
- paper_summarize
- export_to_obsidian
- save_to_memory
---

# Literature Review Workflow

Conduct a systematic literature review: search, filter by relevance, judge quality,
summarize top papers, and save findings to memory.

## Workflow

### Step 1: Search for papers

Call `paper_search` with the research question or topic.

- Parameters: `query` (required), `max_results` (default 10; use 20–50 for broad surveys),
`sources` (optional; omit for all sources, or specify `["arxiv", "semantic_scholar"]`)
- Returns: list of paper dicts with `title`, `abstract`, `authors`, `year`, `venue`,
`arxiv_id`, `doi`

### Step 2: Filter by relevance

For each paper, call `relevance_assess` with `title`, `abstract`, and the same `query`.

- Parameters: `title`, `abstract`, `query`, `keywords` (optional comma-separated terms)
- Returns: dict with `score` (0–100) and `reason`
- Suggested threshold: discard papers with `score` below 40
- If `degraded=True`, token-overlap scoring is used (less accurate but functional)

### Step 3: Judge quality of relevant papers

For papers above the relevance threshold, call `paper_judge`.

- Parameters: `title`, `abstract`, `full_text` (optional), `rubric` (default `"default"`;
pass the research question for context-aware judging)
- Returns: dimension scores (1–5), `overall_score`, `recommendation`
(`must_read` / `worth_reading` / `skim` / `skip`)
- Prioritize papers with `must_read` and `worth_reading` recommendations

### Step 4: Summarize top papers

Call `paper_summarize` for papers recommended as `must_read` or `worth_reading`.

- Parameters: `title`, `abstract`
- Returns: dict with `summary` key (concise string)
- If `degraded=True`, generate a manual summary from the abstract text

### Step 5: Export to Obsidian (optional)

Call `export_to_obsidian` for papers to save as permanent Obsidian notes.

- Parameters: `title`, `abstract`, `authors` (list), `year`, `venue`, `arxiv_id`, `doi`
(provide whichever identifiers are available)
- Returns: dict with `markdown` key — YAML-frontmattered note ready to write to vault

### Step 6: Save synthesis to memory

Call `save_to_memory` with a synthesis of findings across all reviewed papers.

- Parameters: `content` (synthesis text), `kind` (`"note"` for general observations,
`"hypothesis"` for research directions), `user_id` (default `"default"`),
`scope_type` (`"global"` unless scoping to a specific research track),
`scope_id` (required if `scope_type="track"`), `confidence` (0.0–1.0)
- Returns: dict with `created` or `skipped` status

## Degraded Mode

`paper_judge`, `paper_summarize`, and `relevance_assess` require a configured LLM API key.
`paper_search` works without LLM and returns raw search results in all cases.

When any LLM-backed tool returns `degraded=True`:
- The response also contains an `error` key describing the issue
- Set `OPENAI_API_KEY` or `ANTHROPIC_API_KEY` and restart the MCP server
- In degraded mode, proceed with `paper_search` results only; skip Steps 2–4

## Notes

- For broad surveys (>30 papers), consider running `relevance_assess` in bulk before
`paper_judge` to reduce LLM calls
- Use `rubric="reproducibility"` in `paper_judge` if the review goal is identifying
reproducible papers for implementation
- The `export_to_obsidian` step is optional — skip it if the user has not set up an
Obsidian vault or does not need persistent notes
93 changes: 93 additions & 0 deletions .claude/skills/paper-reproduction/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
---
name: paper-reproduction
description: This skill should be used when the user asks to "reproduce a paper",
"implement paper code", "paper2code", "replicate research results", "run experiment
from paper", "implement the algorithm from this paper", or wants to locate, understand,
and plan implementation of a specific academic paper using PaperBot MCP tools.
tools:
- paper_search
- paper_judge
- paper_summarize
- export_to_obsidian
- save_to_memory
---

# Paper Reproduction Workflow

Reproduce or implement a paper: locate it, assess reproducibility, understand its
contributions, save an implementation plan, and export a paper note.

## Workflow

### Step 1: Find the paper

Call `paper_search` with the paper title, topic, or known identifier.

- Parameters: `query` (required; include ArXiv ID or DOI if known for direct lookup),
`max_results` (default 10; use 3–5 for a known paper to minimize noise)
- Returns: list of paper dicts with `title`, `abstract`, `authors`, `year`, `venue`,
`arxiv_id`, `doi`
- Select the most specific match if multiple results are returned

### Step 2: Judge reproducibility

Call `paper_judge` with `rubric="reproducibility"` to assess implementation feasibility.

- Parameters: `title`, `abstract`, `full_text` (optional; include if available for
richer analysis), `rubric="reproducibility"`
- Returns: dimension scores (1–5) including `rigor`, `clarity`, `novelty`, `reproducibility`,
`overall_score`, and `recommendation`
- Favorable signals: high `rigor` and `clarity` scores
- Unfavorable signals: low `clarity` score may indicate reproduction difficulty; low
`reproducibility` score indicates missing implementation details (pseudocode, datasets)

### Step 3: Summarize paper contributions

Call `paper_summarize` to extract key contributions, methods, and findings.

- Parameters: `title`, `abstract`
- Returns: dict with `summary` key (concise string covering contributions and approach)
- Use the summary to inform the implementation plan in Step 4

### Step 4: Save reproduction plan to memory

Call `save_to_memory` with an outline of the planned implementation steps.

- Parameters: `content` (implementation plan text), `kind` (`"project"` for structured
plans or `"decision"` for approach decisions), `user_id` (default `"default"`),
`scope_type` (`"global"` or `"track"` if this paper belongs to a research track),
`scope_id` (track ID if `scope_type="track"`), `confidence` (0.0–1.0)
- Include: key algorithms to implement, datasets needed, evaluation metrics, dependencies

### Step 5: Export paper note

Call `export_to_obsidian` to create a structured Obsidian note for the paper.

- Parameters: `title`, `abstract`, `authors` (list), `year`, `venue`, `arxiv_id`, `doi`
(provide all available identifiers)
- Returns: dict with `markdown` key — YAML-frontmattered note ready for Obsidian vault
- The note provides a permanent reference alongside the implementation

## Implementation Guidance

After completing the above workflow, proceed with code implementation using available
tools (Bash, Write, etc.). The Paper2Code pipeline in PaperBot
(`src/paperbot/repro/`) provides deeper multi-stage analysis (Planning → Blueprint →
Environment → Generation → Verification) for complex reproductions requiring the full
PaperBot backend.

For simpler reproductions:
1. Use the summary from Step 3 and the plan from Step 4 as starting context
2. Implement iteratively, checking against paper details in the Obsidian note
3. Store implementation decisions in memory with `kind="decision"` as the work progresses

## Degraded Mode

`paper_judge` and `paper_summarize` require a configured LLM API key.
`paper_search` works without LLM.

When LLM-backed tools return `degraded=True`:
- The response also contains an `error` key describing the issue
- Set `OPENAI_API_KEY` or `ANTHROPIC_API_KEY` and restart the MCP server
- In degraded mode, use `paper_search` to locate the paper and proceed to implementation
using the raw abstract and metadata; skip Steps 2 and 3
82 changes: 82 additions & 0 deletions .claude/skills/scholar-monitoring/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
---
name: scholar-monitoring
description: This skill should be used when the user asks to "monitor a scholar",
"check researcher activity", "track publications from author X", "follow author Y",
"scholar update for Z", "what has researcher X published recently", or wants to
retrieve and synthesize a researcher's recent publication activity using PaperBot
MCP tools.
tools:
- check_scholar
- analyze_trends
- save_to_memory
---

# Scholar Monitoring Workflow

Monitor a researcher's recent publication activity: fetch their profile and papers,
optionally analyze output trends, and save a monitoring note.

## Workflow

### Step 1: Check scholar activity

Call `check_scholar` with the researcher's name.

- Parameters: `scholar_name` (required; use the researcher's full name as commonly
published), `max_papers` (default 10; increase to 20–30 for career-wide coverage)
- Returns: dict with:
- `scholar`: profile dict with `name`, `hIndex`, `citationCount`, `affiliations`,
`paperCount`, `url`
- `recent_papers`: list of paper dicts (title, abstract, year, venue, citation count)
- `candidates`: list of top-3 candidate matches (inspect if the top result is wrong)
- If `degraded=True`, the scholar was not found on Semantic Scholar or the API is
unavailable

### Step 2: Analyze paper trends (optional)

If `recent_papers` is non-empty and the user wants thematic analysis, call `analyze_trends`.

- Parameters: `topic` (use the scholar's name or primary research area as the topic),
`papers` (the `recent_papers` list from Step 1)
- Returns: dict with `trend_analysis` (natural language narrative of the scholar's
research focus and evolution)
- Skip this step if the user only needs raw paper metadata (no LLM API key required
for Step 1 alone)

### Step 3: Save monitoring note

Call `save_to_memory` with a summary of the scholar's recent activity.

- Parameters: `content` (monitoring summary — include scholar name, hIndex,
recent paper titles, and trend analysis if available), `kind="note"`,
`user_id` (default `"default"`), `scope_type="global"`,
`confidence` (0.0–1.0; suggest 0.9 for factual publication data)
- Returns: dict with `created` or `skipped` status

## Note on Scholar Lookup

`check_scholar` searches Semantic Scholar by name. Common issues:

- **Name diacritics:** Names with accents (e.g., "Müller", "Bengio") may need the
ASCII variant ("Muller", "Yoshua Bengio") if exact-match fails
- **New researchers:** Very new researchers may have limited or no Semantic Scholar
records — check `paperCount` in the returned profile
- **Name ambiguity:** The `candidates` field in the response lists the top 3 matches;
inspect these if the top result appears to be the wrong person (wrong affiliation,
wrong research area)
- **Name format:** Use "First Last" format; middle names are generally not needed but
can help disambiguate common names

## Degraded Mode

`analyze_trends` (Step 2) requires a configured LLM API key. `check_scholar` (Step 1)
and `save_to_memory` (Step 3) do not require LLM.

When `analyze_trends` returns `degraded=True`:
- Set `OPENAI_API_KEY` or `ANTHROPIC_API_KEY` and restart the MCP server
- Skip Step 2 and proceed directly to Step 3 with a summary based on raw paper metadata

When `check_scholar` itself returns `degraded=True`:
- This indicates the scholar was not found or the Semantic Scholar API is unavailable
- Try an alternate name spelling or abbreviation
- Check `candidates` in the response for close matches
82 changes: 82 additions & 0 deletions .claude/skills/trend-analysis/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
---
name: trend-analysis
description: This skill should be used when the user asks to "analyze trends in a
research area", "what is trending in X", "research landscape for topic Y", "topic
trend analysis", "emerging themes in machine learning", "what are researchers working
on in Z", or wants to survey a field and identify emerging patterns across multiple
papers using PaperBot MCP tools.
tools:
- paper_search
- analyze_trends
- get_research_context
- save_to_memory
---

# Trend Analysis Workflow

Identify research trends across a topic by collecting papers, analyzing patterns, and
saving a synthesis of emerging themes.

## Workflow

### Step 1: Load research context (optional)

If a research track exists for the topic, call `get_research_context` to retrieve
existing memories and previously found papers.

- Parameters: `query` (the research topic), `user_id` (default `"default"`),
`track_id` (optional; pass if a specific track ID is known)
- Returns: dict with `papers` (list), `memories` (list), `stage` (workflow stage string)
- Use the existing memories as context when synthesizing results in Step 4
- Skip this step if no prior research context exists for the topic

### Step 2: Search for papers

Call `paper_search` with the topic. Use a broader corpus for trend analysis.

- Parameters: `query` (required), `max_results` (use 20–50 for trend analysis — a
larger corpus improves trend signal quality), `sources` (optional)
- Returns: list of paper dicts with `title`, `abstract`, `authors`, `year`, `venue`
- If `track_id` context was loaded in Step 1, merge the existing papers with new results
(deduplicate by `arxiv_id` or `doi`)

### Step 3: Analyze trends

Call `analyze_trends` with the topic and the list of papers from Step 2.

- Parameters: `topic` (the research area string), `papers` (list of paper dicts from
`paper_search`; pass the full list for best results)
- Returns: dict with `trend_analysis` (natural language narrative), `topic`, `paper_count`
- Check for `degraded=True` — `analyze_trends` requires a configured LLM API key

### Step 4: Save synthesis

Call `save_to_memory` with the trend analysis narrative and any additional observations.

- Parameters: `content` (the `trend_analysis` text from Step 3, optionally enhanced with
your own observations), `kind` (`"note"` for factual observations, `"hypothesis"` for
directional predictions), `user_id` (default `"default"`),
`scope_type` (`"global"` for broad field trends, `"track"` if scoping to a research area),
`scope_id` (track ID if `scope_type="track"`), `confidence` (0.0–1.0)
- Returns: dict with `created` or `skipped` status

## Degraded Mode

`analyze_trends` requires a configured LLM API key. `paper_search` and `get_research_context`
work without LLM.

When `analyze_trends` returns `degraded=True`:
- The response also contains an `error` key describing the issue
- Set `OPENAI_API_KEY` or `ANTHROPIC_API_KEY` and restart the MCP server
- In degraded mode, present the raw search results grouped by year or venue as a
manual trend signal; skip Step 3 or surface the paper list to the user directly

## Notes

- For fast trend snapshots, use `max_results=20` and skip Step 1
- For deep research landscape maps, use `max_results=50` and integrate prior context
from `get_research_context`
- When analyzing sub-field trends (e.g., "sparse attention mechanisms"), narrow the
query rather than broadening `max_results`
- Multiple calls with different `topic` variants (e.g., "mixture of experts" vs.
"sparse expert models") can be combined for a richer landscape view
Loading
Loading