# Irclaw Research Team

> Irclaw Research Team

- Skill: `ryanmaclean/irclaw-research-team` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ryanmaclean/irclaw-research-team`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ryanmaclean/irclaw-research-team/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Research & Search
- Author: ryanmaclean (https://skillmd.com/u/ryanmaclean)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ryanmaclean/irclaw-research-team

---


# irclaw Research Team

## Overview

Spawn N parallel `claude` workers in Zellij panes. Each agent owns one research domain, fetches URLs, optionally parses docs via liteparse, and writes findings to `research/<domain>.md`. You watch them live and ctrl-c any runaway pane.

## Quick Start

```bash
# Launch 4 research agents in a new Zellij tab
nu ~/.claude/skills/zellij-team/zellij-team.nu \
  --files [research/tasks/deep-dive-gastown.md \
           research/tasks/deep-dive-elixir.md \
           research/tasks/deep-dive-llm.md \
           research/tasks/deep-dive-pipeline.md]
```

Task files live in `research/tasks/`. Each is a self-contained prompt with context, URLs, and output path.

## liteparse Pipeline

liteparse does NOT fetch URLs itself — pipe curl output in:

```bash
# Parse a remote PDF
curl -sL "https://example.com/doc.pdf" -o /tmp/doc.pdf
npx @llamaindex/liteparse /tmp/doc.pdf --output json > research/doc.json

# Parse an HTML page (save first)
curl -sL "https://example.com/page" -o /tmp/page.html
npx @llamaindex/liteparse /tmp/page.html --output json > research/page.json
```

## Ollama Headless Query (no UI needed)

```bash
# Query local Ollama directly — skip vibecode-webgui for agent use
curl -s http://localhost:11434/api/generate \
  -d '{"model":"llama3","prompt":"Summarize: <paste content>","stream":false}' \
  | jq -r .response
```

For fleet nodes: Ollama runs on each node at `localhost:11434`. No central coordinator needed for per-node research.

## Full Nushell Pipeline

```nu
# curl → liteparse → ollama → append to research file
def research-url [url: string, output_file: string, model: string = "llama3"] {
    let tmp = $"/tmp/(random chars -l 8).html"
    ^curl -sL $url -o $tmp
    let parsed = (^npx @llamaindex/liteparse $tmp --output json | from json)
    let text = ($parsed.pages | each { |p| $p.text } | str join "\n")
    let summary = (^curl -s http://localhost:11434/api/generate
        -d ($'{"model":"($model)","prompt":"Summarize for technical research: ($text | str substring 0..3000)","stream":false}')
        | from json | get response)
    $"\n## ($url)\n($summary)\n" | save --append $output_file
    rm $tmp
}
```

## Task File Format

Each file in `research/tasks/` follows this template:

```markdown
Working dir: /path/to/project

Context: [what's already known — point to existing research/*.md]

URLs to fetch:
1. https://... — what to extract
2. https://... — what to extract

Output: Append findings to research/<domain>.md under ## Deep Dive

Key questions:
- Question 1?
- Question 2?
```

## Research Output Structure

```
research/
  tasks/           ← agent task prompts (input)
  gastown-irclaw.md
  elixir-beam.md
  llm-ollama-webllm.md
  datadog-fleet.md
  tools-vibecode-liteparse.md
  pipeline-design.md
  SUMMARY.md       ← synthesized by leader after all agents complete
```

## Zellij Controls

| Action | Key |
|--------|-----|
| Switch panes | `Alt+arrow` |
| Kill one agent | `ctrl-c` in pane |
| Zoom pane | `ctrl-p z` |
| Switch tabs | `Alt+[` / `Alt+]` |
| Detach session | `ctrl-p d` |

## Fleet Distribution

Skills live at `~/.claude/skills/` on each node. Ansible playbook to sync:

```bash
ansible-playbook -i ansible/inventory ansible/sync-skills.yml
```

## Key Constraints

- **liteparse needs a local file** — always curl first
- **irclaw is private** — skip `github.com/irclaw-labs/irclaw`, use local ansible playbooks for context
- **Ollama port** — always `localhost:11434`, not a fleet-wide coordinator
- **ARM64 nodes** — liteparse runs fine via npx on aarch64; no binary issues

