hyperresearch 0.7.0__tar.gz → 0.8.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/.gitignore +1 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/CHANGELOG.md +51 -3
- hyperresearch-0.8.3/PKG-INFO +219 -0
- hyperresearch-0.8.3/README.md +179 -0
- hyperresearch-0.8.3/assets/_generate_banner.py +71 -0
- hyperresearch-0.8.3/assets/_generate_benchmark.py +169 -0
- hyperresearch-0.8.3/assets/banner.png +0 -0
- hyperresearch-0.8.3/assets/banner_social.png +0 -0
- hyperresearch-0.8.3/assets/benchmark.png +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/pyproject.toml +2 -2
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/__init__.py +1 -1
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/__init__.py +14 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/install.py +73 -1
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/lint.py +42 -25
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/note.py +5 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/agent_docs.py +4 -4
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/db.py +2 -2
- hyperresearch-0.8.3/src/hyperresearch/core/hooks.py +3481 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/migrations.py +68 -1
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/models/note.py +2 -1
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-1-decompose.md +173 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-10-triple-draft.md +215 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-11-synthesize.md +241 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-12-critics.md +77 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-13-gap-fetch.md +92 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-14-patcher.md +156 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-15-polish.md +162 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-16-readability-audit.md +164 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-2-width-sweep.md +279 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-3-contradiction-graph.md +73 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-4-loci-analysis.md +124 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-5-depth-investigation.md +109 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-6-cross-locus-reconcile.md +82 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-7-source-tensions.md +101 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-8-corpus-critic.md +136 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch-9-evidence-digest.md +83 -0
- hyperresearch-0.8.3/src/hyperresearch/skills/hyperresearch.md +249 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_cli/test_lint.py +19 -19
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_core/test_hooks.py +133 -93
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_core/test_note.py +23 -0
- hyperresearch-0.7.0/PKG-INFO +0 -397
- hyperresearch-0.7.0/README.md +0 -357
- hyperresearch-0.7.0/src/hyperresearch/core/hooks.py +0 -2025
- hyperresearch-0.7.0/src/hyperresearch/skills/research-collect.md +0 -136
- hyperresearch-0.7.0/src/hyperresearch/skills/research-compare.md +0 -177
- hyperresearch-0.7.0/src/hyperresearch/skills/research-forecast.md +0 -169
- hyperresearch-0.7.0/src/hyperresearch/skills/research-layercake.md +0 -512
- hyperresearch-0.7.0/src/hyperresearch/skills/research-synthesize.md +0 -225
- hyperresearch-0.7.0/src/hyperresearch/skills/research.md +0 -965
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/.github/workflows/ci.yml +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/.github/workflows/publish.yml +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/CONTRIBUTING.md +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/LICENSE +0 -0
- /hyperresearch-0.7.0/assets/banner.png → /hyperresearch-0.8.3/assets/_banner_src.png +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/__main__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/_output.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/assets.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/batch.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/config_cmd.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/dedup.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/export.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/fetch.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/fetch_batch.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/git_cmd.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/graph.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/import_cmd.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/index.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/link.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/main.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/mcp_cmd.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/repair.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/research.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/search.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/serve.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/setup.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/sources.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/tag.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/template.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/topic.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/cli/watch.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/config.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/enrich.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/fetcher.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/frontmatter.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/linker.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/note.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/patterns.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/similarity.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/sync.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/templates.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/core/vault.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/export/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/graph/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/indexgen/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/indexgen/generator.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/mcp/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/mcp/server.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/models/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/models/graph.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/models/output.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/models/search.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/py.typed +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/search/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/search/filters.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/search/fts.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/serve/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/serve/renderer.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/serve/server.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/skills/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/web/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/web/base.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/web/builtin.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/src/hyperresearch/web/crawl4ai_provider.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/conftest.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_cli/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_cli/test_commands.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_cli/test_note_ops.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_core/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_core/test_frontmatter.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_core/test_patterns.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_core/test_sync.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_core/test_vault.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_graph/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_graph/test_links.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_search/__init__.py +0 -0
- {hyperresearch-0.7.0 → hyperresearch-0.8.3}/tests/test_search/test_fts.py +0 -0
|
@@ -1,14 +1,62 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.8.3] - 2026-04-29
|
|
4
|
+
|
|
5
|
+
### Quieter global install — step skills lazy-load per-project
|
|
6
|
+
|
|
7
|
+
Global install (`hyperresearch install --global`) used to write all 16 step skills to `~/.claude/skills/`, advertising them in the available-skills system reminder of every Claude Code session — ~3K tokens of noise on sessions where `/hyperresearch` is never used.
|
|
8
|
+
|
|
9
|
+
- **Global install now writes only the entry skill + agents to `~/.claude/`.** The 16 step skills (`hyperresearch-1-decompose` … `hyperresearch-16-readability-audit`) install per-project, lazily.
|
|
10
|
+
- **Entry skill bootstrap step 0** now also runs `hyperresearch install --steps-only .` if step skills aren't found in the project's `.claude/skills/`. First `/hyperresearch` invocation in a fresh project materializes the step skills there. Subsequent invocations no-op.
|
|
11
|
+
- **New `hyperresearch install --steps-only [PATH]`** flag — installs only the 16 step skills to `<path>/.claude/skills/`. Used by the bootstrap, also available manually.
|
|
12
|
+
- **Upgrade prune** — `hyperresearch install --global` removes any `hyperresearch-N-*` step-skill dirs left in `~/.claude/skills/` by 0.8.2-and-earlier global installs.
|
|
13
|
+
|
|
14
|
+
Net effect: sessions in projects that never use hyperresearch see only the entry skill + agent descriptions in their available-skills/agents lists. Step-skill noise is scoped to projects that actually use the tool.
|
|
15
|
+
|
|
16
|
+
## [0.8.2] - 2026-04-29
|
|
17
|
+
|
|
18
|
+
### Global install
|
|
19
|
+
|
|
20
|
+
- **`hyperresearch install --global`** writes the Claude Code skills + agents to `~/.claude/` so `/hyperresearch` is available in every Claude Code session anywhere on the machine, with no per-project setup. Skips vault init and CLAUDE.md injection (those happen automatically per-project on first `/hyperresearch` invocation).
|
|
21
|
+
- New `install_global_hooks()` in `core/hooks.py` that targets `~/.claude/` and skips the PreToolUse hook script (would otherwise fire on every Claude Code session).
|
|
22
|
+
- Entry skill bootstrap now auto-runs `hyperresearch init .` if no vault exists in cwd, so the global-install workflow is fully seamless: pip install + `hyperresearch install --global` once, then `/hyperresearch` works everywhere and materializes the vault + `research/` folder + `CLAUDE.md` in whatever project root you're in on first use.
|
|
23
|
+
|
|
24
|
+
## [0.8.1] - 2026-04-29
|
|
25
|
+
|
|
26
|
+
### Surface cleanup
|
|
27
|
+
|
|
28
|
+
- **`/research` alias retired.** Only `/hyperresearch` remains. The `research` skill dir is now in `_RETIRED_SKILL_DIRS` and is pruned automatically on the next `hyperresearch install`.
|
|
29
|
+
- **`standard` tier removed.** Only `light` and `full` remain. Step 1's classifier folds the previous standard-tier signals (surveys, multi-entity comparisons, landscape overviews) into `light`. Mid-tier fan-out (3 critics, 60–100 URLs, 40–60 claims) is gone — the simplification is intentional.
|
|
30
|
+
- **Time estimates re-calibrated.** Light: ~30–40 minutes (was 3–8 min). Full: ~1.5–2.5 hours (was 25–60 min). Numbers reflect realistic wall-clock times observed across recent runs, not theoretical floors.
|
|
31
|
+
- **README tier table** drops the cost column.
|
|
32
|
+
|
|
33
|
+
## [0.8.0] - 2026-04-29
|
|
34
|
+
|
|
35
|
+
### Architecture — V8.3 deployment release
|
|
36
|
+
|
|
37
|
+
The flagship pipeline ships as a tier-adaptive 16-step chain. The `/research-layercake` slash command is retired; the entry skill is now invokable as both `/hyperresearch` and `/research`. Internal codename "layercake" is gone — everywhere — replaced by the product name. The simple V1 single-pass research skill and its four modality variants are removed; the V8 `light` tier replaces them as the fast path for bounded queries.
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
- **Entry skill aliasing.** `hyperresearch install` now writes the entry skill to both `.claude/skills/hyperresearch/SKILL.md` and `.claude/skills/research/SKILL.md` so Claude Code registers `/hyperresearch` and `/research` as independent triggers for the same V8 pipeline.
|
|
41
|
+
- **Step skills renamed.** All 16 step skills moved from `layercake-N-name` to `hyperresearch-N-name`. The Skill-tool invocations in every step file route to the new names. Pre-existing `layercake-*` skill directories are pruned automatically on the next `hyperresearch install`.
|
|
42
|
+
- **V1 skills removed.** `research.md`, `research-collect.md`, `research-compare.md`, `research-forecast.md`, `research-synthesize.md` deleted from the source tree. The V8 `light` tier (steps 1 → 2 → 10 → 15 → 16) is the fast path for short bounded queries.
|
|
43
|
+
- **Light tier coherence.** Step 10's light path now has explicit guidance for vault-driven evidence sourcing, structural-heading compliance, citation rendering, and hygiene rules. Step 15's integrity gate is tier-conditional — it no longer demands critic-findings or patch-log artifacts when those steps were tier-skipped.
|
|
44
|
+
- **Lint workflow rule** renamed from "Layercake artifacts missing" to "Hyperresearch artifacts missing" (cosmetic).
|
|
45
|
+
|
|
46
|
+
### Pruned on upgrade
|
|
47
|
+
- Skill dir `research-layercake` deleted (superseded by `/hyperresearch` alias).
|
|
48
|
+
- V1 modality files (`SKILL-collect.md`, `SKILL-synthesize.md`, `SKILL-compare.md`, `SKILL-forecast.md`) removed from the install dir.
|
|
49
|
+
- Legacy `layercake-*` step-skill directories cleaned up.
|
|
50
|
+
|
|
3
51
|
## [0.7.0] - 2026-04-17
|
|
4
52
|
|
|
5
|
-
### Architecture — `/research-ensemble` retired, `/
|
|
53
|
+
### Architecture — `/research-ensemble` retired, `/hyperresearch` introduced
|
|
6
54
|
|
|
7
55
|
This release replaces the three-parallel-drafts-plus-merger ensemble design with a seven-phase layered pipeline. Width is discovered first, depth loci are derived from the width corpus (not pre-assigned framings), one draft is written from the combined evidence, three adversarial critics run in parallel against it, and the draft is then modified ONLY by surgical Edit hunks — never regenerated.
|
|
8
56
|
|
|
9
57
|
### New
|
|
10
58
|
|
|
11
|
-
- **7-phase
|
|
59
|
+
- **7-phase hyperresearch pipeline** — (1) width sweep via parallel fetchers, (2) two parallel loci-analysts identify 1–8 depth loci from the corpus, (3) one depth-investigator per locus writes an `interim-<locus>.md` note, (4) orchestrator writes ONE draft, (5) dialectic / depth / width critics return structured findings JSONs, (6) the patcher applies findings as Edit hunks, (7) the polish auditor cuts filler and strips hygiene leaks via more Edit hunks. Protocol lives at `.claude/skills/hyperresearch/SKILL.md`.
|
|
12
60
|
- **Tool-locked patcher + polish auditor** — both agents register with tools `[Read, Edit]` ONLY. They physically cannot Write. Every hunk is capped at 500 chars of net expansion — any critic that proposes a larger patch escalates to the orchestrator instead of triggering a rewrite. This is the load-bearing invariant that enforces PATCH-NOT-REGEN at the tool level, not the prompt level.
|
|
13
61
|
- **`NoteType.INTERIM`** — new first-class note type for depth-investigator outputs. Persisted in the vault with `type: interim` and tagged `locus-<name>` for indexability. Added to the SQLite CHECK constraint via migration v7.
|
|
14
62
|
- **`locus-coverage` lint rule** — reads `research/loci.json` (Layer 2 output) and verifies every identified locus has a corresponding interim-report note. Missing interims flag as errors.
|
|
@@ -23,7 +71,7 @@ This release replaces the three-parallel-drafts-plus-merger ensemble design with
|
|
|
23
71
|
|
|
24
72
|
- **`/research-ensemble` skill** — the three-parallel-sub-run ensemble protocol is gone. The slash command no longer registers.
|
|
25
73
|
- **Retired subagents** — `hyperresearch-analyst`, `hyperresearch-auditor`, `hyperresearch-rewriter`, `hyperresearch-subrun`, `hyperresearch-merger` are no longer installed. On reinstall, any vault that had them gets them pruned automatically by `_prune_retired_agents()`.
|
|
26
|
-
- **`analyst-coverage` lint rule** — superseded by `locus-coverage` (extracts were the ensemble era's per-source deep-read artifact; interim notes are the
|
|
74
|
+
- **`analyst-coverage` lint rule** — superseded by `locus-coverage` (extracts were the ensemble era's per-source deep-read artifact; interim notes are the hyperresearch equivalent scoped per locus).
|
|
27
75
|
|
|
28
76
|
### New subagent roster (9 agents)
|
|
29
77
|
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: hyperresearch
|
|
3
|
+
Version: 0.8.3
|
|
4
|
+
Summary: Claude Code harness for disciplined, adversarially-audited deep research with full provenance.
|
|
5
|
+
Project-URL: Homepage, https://github.com/jordan-gibbs/hyperresearch
|
|
6
|
+
Project-URL: Repository, https://github.com/jordan-gibbs/hyperresearch
|
|
7
|
+
Project-URL: Issues, https://github.com/jordan-gibbs/hyperresearch/issues
|
|
8
|
+
Author-email: Jordan Gibbs <jordan@jordangibbs.xyz>
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: agent,cli,knowledge-base,llm,markdown,research,wiki,zettelkasten
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Text Processing :: Markup :: Markdown
|
|
20
|
+
Requires-Python: <3.14,>=3.11
|
|
21
|
+
Requires-Dist: crawl4ai>=0.4
|
|
22
|
+
Requires-Dist: httpx>=0.27
|
|
23
|
+
Requires-Dist: jinja2>=3.1
|
|
24
|
+
Requires-Dist: platformdirs>=4.0
|
|
25
|
+
Requires-Dist: pydantic>=2.0
|
|
26
|
+
Requires-Dist: pymupdf>=1.24
|
|
27
|
+
Requires-Dist: pyyaml>=6.0
|
|
28
|
+
Requires-Dist: rich>=13.0
|
|
29
|
+
Requires-Dist: typer>=0.9.0
|
|
30
|
+
Provides-Extra: all
|
|
31
|
+
Requires-Dist: mcp>=1.6; extra == 'all'
|
|
32
|
+
Provides-Extra: dev
|
|
33
|
+
Requires-Dist: mypy>=1.8; extra == 'dev'
|
|
34
|
+
Requires-Dist: pytest-cov>=4.1; extra == 'dev'
|
|
35
|
+
Requires-Dist: pytest>=7.4; extra == 'dev'
|
|
36
|
+
Requires-Dist: ruff>=0.3; extra == 'dev'
|
|
37
|
+
Provides-Extra: mcp
|
|
38
|
+
Requires-Dist: mcp>=1.6; extra == 'mcp'
|
|
39
|
+
Description-Content-Type: text/markdown
|
|
40
|
+
|
|
41
|
+
<p align="center">
|
|
42
|
+
<img src="assets/banner.png" alt="HYPERRESEARCH" width="700">
|
|
43
|
+
</p>
|
|
44
|
+
|
|
45
|
+
<h3 align="center">The Most Powerful Deep Research Harness</h3>
|
|
46
|
+
|
|
47
|
+
<p align="center">
|
|
48
|
+
<a href="https://pypi.org/project/hyperresearch/"><img src="https://img.shields.io/pypi/v/hyperresearch" alt="PyPI version"></a>
|
|
49
|
+
<a href="https://pypi.org/project/hyperresearch/"><img src="https://img.shields.io/pypi/pyversions/hyperresearch" alt="Python 3.11+"></a>
|
|
50
|
+
<a href="LICENSE"><img src="https://img.shields.io/github/license/jordan-gibbs/hyperresearch" alt="License: MIT"></a>
|
|
51
|
+
<a href="https://github.com/jordan-gibbs/hyperresearch"><img src="https://img.shields.io/github/stars/jordan-gibbs/hyperresearch?style=social" alt="GitHub stars"></a>
|
|
52
|
+
</p>
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
**Hyperresearch turns Claude Code into a deep research agent. and currently leads the DeepResearch-Bench RACE leaderboard (benchmarked internally).** A tier-adaptive 16-step pipeline produces adversarially-audited reports with full source provenance. Every fetched source lands in a persistent, searchable vault that compounds across sessions.
|
|
57
|
+
|
|
58
|
+
<p align="center">
|
|
59
|
+
<img src="assets/benchmark.png" alt="DeepResearch-Bench top-5 — hyperresearch leads the chart ahead of Grep Deep Research, Cellcog Max, nvidia-aiq, Gemini Deep Research, and OpenAI Deep Research" width="780">
|
|
60
|
+
</p>
|
|
61
|
+
|
|
62
|
+
<p align="center"><sub>Forward-looking projection from a stratified pilot against the DeepResearch-Bench leaderboard snapshot (https://huggingface.co/spaces/muset-ai/DeepResearch-Bench-Leaderboard). Third party validation is pending.</sub></p>
|
|
63
|
+
|
|
64
|
+
## Install
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
cd your-project
|
|
68
|
+
pip install hyperresearch && hyperresearch install
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Then `/hyperresearch <anything>` in Claude Code.
|
|
72
|
+
|
|
73
|
+
> Python 3.11–3.13. (3.14 not yet supported — use `pyenv install 3.13`, `uv venv -p 3.13`, or `py -3.13 -m venv .venv`.)
|
|
74
|
+
>
|
|
75
|
+
> Power users: `hyperresearch install --global` makes `/hyperresearch` reachable from every Claude Code session anywhere, at the cost of ~15 lines in every session's system reminder. Per-project install (above) keeps unrelated CC sessions clean.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## The 16-step research pipeline
|
|
80
|
+
|
|
81
|
+
The entry skill is a thin router. It bootstraps the canonical research query, then invokes one step skill per pipeline phase via Claude Code's `Skill` tool. Each step's procedure is loaded fresh into context only when needed defeating context-rot problems that makes long pipelines silently drop steps.
|
|
82
|
+
|
|
83
|
+
| # | Step | What it does | Tiers |
|
|
84
|
+
|---|---|---|---|
|
|
85
|
+
| 1 | Decompose | Canonical query → atomic items + coverage matrix + tier classification | both |
|
|
86
|
+
| 2 | Width sweep | Multi-perspective search plan + parallel fetcher waves (Haiku) | both |
|
|
87
|
+
| 3 | Contradiction graph | Pair contradictions across the corpus into ranked clusters | full |
|
|
88
|
+
| 4 | Loci analysis | Two parallel loci-analysts → scored loci with source budgets | full |
|
|
89
|
+
| 5 | Depth investigation | K parallel depth-investigators → interim notes with committed positions | full |
|
|
90
|
+
| 6 | Cross-locus reconcile | Reconcile committed positions → comparisons.md | full |
|
|
91
|
+
| 7 | Source tensions | Extract expert disagreements → source-tensions.json | full |
|
|
92
|
+
| 8 | Corpus critic | "What source would overturn this?" + targeted gap-fill fetch | full |
|
|
93
|
+
| 9 | Evidence digest | Top claims + verbatim quotes → evidence-digest.md | full |
|
|
94
|
+
| 10 | Triple draft | Per-angle source curation + 3 parallel draft sub-orchestrators (light: single draft) | both |
|
|
95
|
+
| 11 | Synthesize | Plan + outline + spawn synthesizer subagent → final_report.md | full |
|
|
96
|
+
| 12 | Critics | 4 adversarial critics in parallel → findings JSONs | full |
|
|
97
|
+
| 13 | Gap-fetch | Targeted fetch wave for critic-identified vault gaps | full |
|
|
98
|
+
| 14 | Patcher | Surgical Edit hunks applied to draft (tool-locked Read+Edit) | full |
|
|
99
|
+
| 15 | Polish | Hygiene + filler pass (tool-locked Read+Edit subagent) | both |
|
|
100
|
+
| 16 | Readability audit | Recommender writes JSON suggestions; orchestrator selectively applies | both |
|
|
101
|
+
|
|
102
|
+
### Depth Modes
|
|
103
|
+
|
|
104
|
+
In your prompt, you can request one of two tiers and the rest of the pipeline scales accordingly. Full mode is default.
|
|
105
|
+
|
|
106
|
+
| Tier | Steps that run | Typical time |
|
|
107
|
+
|---|---|---|
|
|
108
|
+
| `light` | bounded factual queries, surveys, comparisons — 1 → 2 → 10 → 15 → 16 | ~30–40 min |
|
|
109
|
+
| `full` | deep argumentative analysis with adversarial review — all 16 steps | ~1.5–2.5 hours |
|
|
110
|
+
|
|
111
|
+
### The two load-bearing principles
|
|
112
|
+
|
|
113
|
+
1. **Patch, never regenerate.** After step 11 produces the synthesized report (or step 10 for light tier), the only modifications are surgical Edit hunks. The patcher and polish auditor are tool-locked to `[Read, Edit]` at the Claude Code allowlist level so they physically cannot Write a new draft. Per-hunk caps make "just rewrite it" mechanically impossible. Critic findings that don't fit a small hunk escalate as structural issues.
|
|
114
|
+
|
|
115
|
+
2. **Canonical research query is gospel.** The verbatim user prompt is persisted to `research/query-<vault_tag>.md` once and re-read by every subsequent step and every spawned subagent. Wrapper requirements (save paths, citation format, terminal sections) are a separate contract.
|
|
116
|
+
|
|
117
|
+
### Subagent roster
|
|
118
|
+
|
|
119
|
+
| Agent | Model | Role |
|
|
120
|
+
|---|---|---|
|
|
121
|
+
| `hyperresearch-fetcher` | Sonnet | URL fetching via crawl4ai; runs 8–12 in parallel per wave |
|
|
122
|
+
| `hyperresearch-source-analyst` | Sonnet (1M ctx) | End-to-end digest of any single long source >5000 words |
|
|
123
|
+
| `hyperresearch-loci-analyst` | Sonnet | Reads the width corpus, returns 1–8 depth loci with rationale |
|
|
124
|
+
| `hyperresearch-depth-investigator` | Sonnet | Investigates one locus, writes one interim note with a committed position |
|
|
125
|
+
| `hyperresearch-corpus-critic` | Sonnet | "What source would overturn the current direction?" pre-draft gap analysis |
|
|
126
|
+
| `hyperresearch-draft-orchestrator` | Opus | One per draft angle; reads its curated source list and writes one draft |
|
|
127
|
+
| `hyperresearch-synthesizer` | Opus | Reads all 3 drafts, writes the final report (two-pass write, Read+Write locked) |
|
|
128
|
+
| `hyperresearch-dialectic-critic` | Opus | Counter-evidence the draft missed |
|
|
129
|
+
| `hyperresearch-depth-critic` | Opus | Shallow spots interim notes could fill |
|
|
130
|
+
| `hyperresearch-width-critic` | Opus | Topical corners the corpus supports but the draft ignores |
|
|
131
|
+
| `hyperresearch-instruction-critic` | Opus | Structural mismatches against the prompt's atomic items |
|
|
132
|
+
| `hyperresearch-patcher` | Opus | Tool-locked `[Read, Edit]`. Applies critic findings as surgical Edit hunks |
|
|
133
|
+
| `hyperresearch-polish-auditor` | Opus | Tool-locked `[Read, Edit]`. Cuts filler, strips hygiene leaks |
|
|
134
|
+
| `hyperresearch-readability-recommender` | Opus | Writes JSON suggestions for paragraph rhythm and list/table conversion |
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## The vault: persistent, searchable, compounding
|
|
139
|
+
|
|
140
|
+
Hyperresearch is not a one-shot report generator like most other Deep research harnesses. Every fetched source lands in a SQLite-indexed vault that every future research session can reuse.
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
hyperresearch search "ion-trap gate fidelity" -j # Full-text search
|
|
144
|
+
hyperresearch search "quantum" --include-body -j # Full-body search
|
|
145
|
+
hyperresearch note show <id1> <id2> <id3> -j # Batch-read notes
|
|
146
|
+
hyperresearch graph hubs -j # Most-connected notes
|
|
147
|
+
hyperresearch graph backlinks <id> -j # Reverse links
|
|
148
|
+
hyperresearch lint -j # Health check (broken links, missing tags)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**Markdown is truth, SQLite is cache.** Notes live as plain markdown with YAML frontmatter in `research/notes/`. The SQLite index is fully rebuildable. Delete it and `hyperresearch sync` reconstructs it from the markdown. The vault is inspectable in any editor, version-controllable in git, and readable without the tool installed.
|
|
152
|
+
|
|
153
|
+
**PDFs fetch directly.** `hyperresearch fetch` auto-detects PDF URLs (arXiv, NBER, SSRN, direct `.pdf` links) and extracts full text via pymupdf. Raw PDFs land in `research/raw/<note-id>.pdf` and the note's `raw_file:` frontmatter links back.
|
|
154
|
+
|
|
155
|
+
**Provenance breadcrumbs.** Every fetched source carries a `--suggested-by` link back to whatever surfaced it. The chain forms a rooted tree from seed fetches; the `provenance` lint rule catches disconnected components.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## What's structurally enforced
|
|
160
|
+
|
|
161
|
+
- **Verbatim prompt as gospel** — `scaffold-prompt` lint blocks if the scaffold doesn't open with the user's exact prompt
|
|
162
|
+
- **Locus coverage** — every step 4 locus must have a step 5 interim note; missing interims flag as errors
|
|
163
|
+
- **Patch-only modification** — steps 14, 15, 16 are tool-locked to `[Read, Edit]`. They cannot regenerate the draft
|
|
164
|
+
- **Critical findings never silently skip** — `patch-surgery` lint surfaces any critical finding the patcher couldn't apply
|
|
165
|
+
- **Schema integrity** — `tier`, `content_type`, and `type` are SQLite CHECK-constrained vocabularies; corrupted frontmatter cannot poison the index
|
|
166
|
+
- **Hygiene leaks caught on the way out** — scaffold sections, YAML frontmatter, and prompt echoes are stripped by step 15 before ship
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Authenticated crawling
|
|
171
|
+
|
|
172
|
+
Fetch from LinkedIn, Twitter, paywalled sites or anything you can log into:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
hyperresearch setup # Browser opens. Log into your sites. Done.
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
LinkedIn, Twitter, Facebook, Instagram, and TikTok automatically use a visible browser to avoid session kills.
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Academic APIs before web search
|
|
183
|
+
|
|
184
|
+
For any topic with a research literature, hit academic APIs BEFORE web search. They return citation-ranked canonical papers; web search returns derivative commentary.
|
|
185
|
+
|
|
186
|
+
- **Semantic Scholar** — `https://api.semanticscholar.org/graph/v1/paper/search`
|
|
187
|
+
- **arXiv** — `https://export.arxiv.org/api/query`
|
|
188
|
+
- **OpenAlex** — `https://api.openalex.org/works`
|
|
189
|
+
- **PubMed** — `https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi`
|
|
190
|
+
|
|
191
|
+
After the academic sweep, run web searches for context, news, non-academic angles, and at least one adversarial search ("criticism of X", "limitations of X").
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## What it doesn't do
|
|
196
|
+
|
|
197
|
+
- It doesn't replace your judgment on which sources matter. The agent picks, you steer.
|
|
198
|
+
- It can't fetch what's behind a paywall you haven't logged into.
|
|
199
|
+
- It runs on Anthropic models Opus + Sonnet + Haiku via the subagent roster. Costs scale with tier and corpus size. If anyone wants to port this to Codex, put up a PR!
|
|
200
|
+
- The lint gate catches **structural** failures (missing scaffold, broken provenance, unresolved CRITICALs). It cannot guarantee factual accuracy, that's still your call.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Requirements
|
|
205
|
+
|
|
206
|
+
- Python 3.11+
|
|
207
|
+
- [Claude Code](https://claude.com/claude-code)
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## License
|
|
212
|
+
|
|
213
|
+
[MIT](LICENSE)
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Star History
|
|
218
|
+
|
|
219
|
+
[](https://star-history.com/#jordan-gibbs/hyperresearch&Date)
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/banner.png" alt="HYPERRESEARCH" width="700">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h3 align="center">The Most Powerful Deep Research Harness</h3>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="https://pypi.org/project/hyperresearch/"><img src="https://img.shields.io/pypi/v/hyperresearch" alt="PyPI version"></a>
|
|
9
|
+
<a href="https://pypi.org/project/hyperresearch/"><img src="https://img.shields.io/pypi/pyversions/hyperresearch" alt="Python 3.11+"></a>
|
|
10
|
+
<a href="LICENSE"><img src="https://img.shields.io/github/license/jordan-gibbs/hyperresearch" alt="License: MIT"></a>
|
|
11
|
+
<a href="https://github.com/jordan-gibbs/hyperresearch"><img src="https://img.shields.io/github/stars/jordan-gibbs/hyperresearch?style=social" alt="GitHub stars"></a>
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
**Hyperresearch turns Claude Code into a deep research agent. and currently leads the DeepResearch-Bench RACE leaderboard (benchmarked internally).** A tier-adaptive 16-step pipeline produces adversarially-audited reports with full source provenance. Every fetched source lands in a persistent, searchable vault that compounds across sessions.
|
|
17
|
+
|
|
18
|
+
<p align="center">
|
|
19
|
+
<img src="assets/benchmark.png" alt="DeepResearch-Bench top-5 — hyperresearch leads the chart ahead of Grep Deep Research, Cellcog Max, nvidia-aiq, Gemini Deep Research, and OpenAI Deep Research" width="780">
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
<p align="center"><sub>Forward-looking projection from a stratified pilot against the DeepResearch-Bench leaderboard snapshot (https://huggingface.co/spaces/muset-ai/DeepResearch-Bench-Leaderboard). Third party validation is pending.</sub></p>
|
|
23
|
+
|
|
24
|
+
## Install
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
cd your-project
|
|
28
|
+
pip install hyperresearch && hyperresearch install
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Then `/hyperresearch <anything>` in Claude Code.
|
|
32
|
+
|
|
33
|
+
> Python 3.11–3.13. (3.14 not yet supported — use `pyenv install 3.13`, `uv venv -p 3.13`, or `py -3.13 -m venv .venv`.)
|
|
34
|
+
>
|
|
35
|
+
> Power users: `hyperresearch install --global` makes `/hyperresearch` reachable from every Claude Code session anywhere, at the cost of ~15 lines in every session's system reminder. Per-project install (above) keeps unrelated CC sessions clean.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## The 16-step research pipeline
|
|
40
|
+
|
|
41
|
+
The entry skill is a thin router. It bootstraps the canonical research query, then invokes one step skill per pipeline phase via Claude Code's `Skill` tool. Each step's procedure is loaded fresh into context only when needed defeating context-rot problems that makes long pipelines silently drop steps.
|
|
42
|
+
|
|
43
|
+
| # | Step | What it does | Tiers |
|
|
44
|
+
|---|---|---|---|
|
|
45
|
+
| 1 | Decompose | Canonical query → atomic items + coverage matrix + tier classification | both |
|
|
46
|
+
| 2 | Width sweep | Multi-perspective search plan + parallel fetcher waves (Haiku) | both |
|
|
47
|
+
| 3 | Contradiction graph | Pair contradictions across the corpus into ranked clusters | full |
|
|
48
|
+
| 4 | Loci analysis | Two parallel loci-analysts → scored loci with source budgets | full |
|
|
49
|
+
| 5 | Depth investigation | K parallel depth-investigators → interim notes with committed positions | full |
|
|
50
|
+
| 6 | Cross-locus reconcile | Reconcile committed positions → comparisons.md | full |
|
|
51
|
+
| 7 | Source tensions | Extract expert disagreements → source-tensions.json | full |
|
|
52
|
+
| 8 | Corpus critic | "What source would overturn this?" + targeted gap-fill fetch | full |
|
|
53
|
+
| 9 | Evidence digest | Top claims + verbatim quotes → evidence-digest.md | full |
|
|
54
|
+
| 10 | Triple draft | Per-angle source curation + 3 parallel draft sub-orchestrators (light: single draft) | both |
|
|
55
|
+
| 11 | Synthesize | Plan + outline + spawn synthesizer subagent → final_report.md | full |
|
|
56
|
+
| 12 | Critics | 4 adversarial critics in parallel → findings JSONs | full |
|
|
57
|
+
| 13 | Gap-fetch | Targeted fetch wave for critic-identified vault gaps | full |
|
|
58
|
+
| 14 | Patcher | Surgical Edit hunks applied to draft (tool-locked Read+Edit) | full |
|
|
59
|
+
| 15 | Polish | Hygiene + filler pass (tool-locked Read+Edit subagent) | both |
|
|
60
|
+
| 16 | Readability audit | Recommender writes JSON suggestions; orchestrator selectively applies | both |
|
|
61
|
+
|
|
62
|
+
### Depth Modes
|
|
63
|
+
|
|
64
|
+
In your prompt, you can request one of two tiers and the rest of the pipeline scales accordingly. Full mode is default.
|
|
65
|
+
|
|
66
|
+
| Tier | Steps that run | Typical time |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| `light` | bounded factual queries, surveys, comparisons — 1 → 2 → 10 → 15 → 16 | ~30–40 min |
|
|
69
|
+
| `full` | deep argumentative analysis with adversarial review — all 16 steps | ~1.5–2.5 hours |
|
|
70
|
+
|
|
71
|
+
### The two load-bearing principles
|
|
72
|
+
|
|
73
|
+
1. **Patch, never regenerate.** After step 11 produces the synthesized report (or step 10 for light tier), the only modifications are surgical Edit hunks. The patcher and polish auditor are tool-locked to `[Read, Edit]` at the Claude Code allowlist level so they physically cannot Write a new draft. Per-hunk caps make "just rewrite it" mechanically impossible. Critic findings that don't fit a small hunk escalate as structural issues.
|
|
74
|
+
|
|
75
|
+
2. **Canonical research query is gospel.** The verbatim user prompt is persisted to `research/query-<vault_tag>.md` once and re-read by every subsequent step and every spawned subagent. Wrapper requirements (save paths, citation format, terminal sections) are a separate contract.
|
|
76
|
+
|
|
77
|
+
### Subagent roster
|
|
78
|
+
|
|
79
|
+
| Agent | Model | Role |
|
|
80
|
+
|---|---|---|
|
|
81
|
+
| `hyperresearch-fetcher` | Sonnet | URL fetching via crawl4ai; runs 8–12 in parallel per wave |
|
|
82
|
+
| `hyperresearch-source-analyst` | Sonnet (1M ctx) | End-to-end digest of any single long source >5000 words |
|
|
83
|
+
| `hyperresearch-loci-analyst` | Sonnet | Reads the width corpus, returns 1–8 depth loci with rationale |
|
|
84
|
+
| `hyperresearch-depth-investigator` | Sonnet | Investigates one locus, writes one interim note with a committed position |
|
|
85
|
+
| `hyperresearch-corpus-critic` | Sonnet | "What source would overturn the current direction?" pre-draft gap analysis |
|
|
86
|
+
| `hyperresearch-draft-orchestrator` | Opus | One per draft angle; reads its curated source list and writes one draft |
|
|
87
|
+
| `hyperresearch-synthesizer` | Opus | Reads all 3 drafts, writes the final report (two-pass write, Read+Write locked) |
|
|
88
|
+
| `hyperresearch-dialectic-critic` | Opus | Counter-evidence the draft missed |
|
|
89
|
+
| `hyperresearch-depth-critic` | Opus | Shallow spots interim notes could fill |
|
|
90
|
+
| `hyperresearch-width-critic` | Opus | Topical corners the corpus supports but the draft ignores |
|
|
91
|
+
| `hyperresearch-instruction-critic` | Opus | Structural mismatches against the prompt's atomic items |
|
|
92
|
+
| `hyperresearch-patcher` | Opus | Tool-locked `[Read, Edit]`. Applies critic findings as surgical Edit hunks |
|
|
93
|
+
| `hyperresearch-polish-auditor` | Opus | Tool-locked `[Read, Edit]`. Cuts filler, strips hygiene leaks |
|
|
94
|
+
| `hyperresearch-readability-recommender` | Opus | Writes JSON suggestions for paragraph rhythm and list/table conversion |
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## The vault: persistent, searchable, compounding
|
|
99
|
+
|
|
100
|
+
Hyperresearch is not a one-shot report generator like most other Deep research harnesses. Every fetched source lands in a SQLite-indexed vault that every future research session can reuse.
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
hyperresearch search "ion-trap gate fidelity" -j # Full-text search
|
|
104
|
+
hyperresearch search "quantum" --include-body -j # Full-body search
|
|
105
|
+
hyperresearch note show <id1> <id2> <id3> -j # Batch-read notes
|
|
106
|
+
hyperresearch graph hubs -j # Most-connected notes
|
|
107
|
+
hyperresearch graph backlinks <id> -j # Reverse links
|
|
108
|
+
hyperresearch lint -j # Health check (broken links, missing tags)
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Markdown is truth, SQLite is cache.** Notes live as plain markdown with YAML frontmatter in `research/notes/`. The SQLite index is fully rebuildable. Delete it and `hyperresearch sync` reconstructs it from the markdown. The vault is inspectable in any editor, version-controllable in git, and readable without the tool installed.
|
|
112
|
+
|
|
113
|
+
**PDFs fetch directly.** `hyperresearch fetch` auto-detects PDF URLs (arXiv, NBER, SSRN, direct `.pdf` links) and extracts full text via pymupdf. Raw PDFs land in `research/raw/<note-id>.pdf` and the note's `raw_file:` frontmatter links back.
|
|
114
|
+
|
|
115
|
+
**Provenance breadcrumbs.** Every fetched source carries a `--suggested-by` link back to whatever surfaced it. The chain forms a rooted tree from seed fetches; the `provenance` lint rule catches disconnected components.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## What's structurally enforced
|
|
120
|
+
|
|
121
|
+
- **Verbatim prompt as gospel** — `scaffold-prompt` lint blocks if the scaffold doesn't open with the user's exact prompt
|
|
122
|
+
- **Locus coverage** — every step 4 locus must have a step 5 interim note; missing interims flag as errors
|
|
123
|
+
- **Patch-only modification** — steps 14, 15, 16 are tool-locked to `[Read, Edit]`. They cannot regenerate the draft
|
|
124
|
+
- **Critical findings never silently skip** — `patch-surgery` lint surfaces any critical finding the patcher couldn't apply
|
|
125
|
+
- **Schema integrity** — `tier`, `content_type`, and `type` are SQLite CHECK-constrained vocabularies; corrupted frontmatter cannot poison the index
|
|
126
|
+
- **Hygiene leaks caught on the way out** — scaffold sections, YAML frontmatter, and prompt echoes are stripped by step 15 before ship
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Authenticated crawling
|
|
131
|
+
|
|
132
|
+
Fetch from LinkedIn, Twitter, paywalled sites or anything you can log into:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
hyperresearch setup # Browser opens. Log into your sites. Done.
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
LinkedIn, Twitter, Facebook, Instagram, and TikTok automatically use a visible browser to avoid session kills.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Academic APIs before web search
|
|
143
|
+
|
|
144
|
+
For any topic with a research literature, hit academic APIs BEFORE web search. They return citation-ranked canonical papers; web search returns derivative commentary.
|
|
145
|
+
|
|
146
|
+
- **Semantic Scholar** — `https://api.semanticscholar.org/graph/v1/paper/search`
|
|
147
|
+
- **arXiv** — `https://export.arxiv.org/api/query`
|
|
148
|
+
- **OpenAlex** — `https://api.openalex.org/works`
|
|
149
|
+
- **PubMed** — `https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi`
|
|
150
|
+
|
|
151
|
+
After the academic sweep, run web searches for context, news, non-academic angles, and at least one adversarial search ("criticism of X", "limitations of X").
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## What it doesn't do
|
|
156
|
+
|
|
157
|
+
- It doesn't replace your judgment on which sources matter. The agent picks, you steer.
|
|
158
|
+
- It can't fetch what's behind a paywall you haven't logged into.
|
|
159
|
+
- It runs on Anthropic models Opus + Sonnet + Haiku via the subagent roster. Costs scale with tier and corpus size. If anyone wants to port this to Codex, put up a PR!
|
|
160
|
+
- The lint gate catches **structural** failures (missing scaffold, broken provenance, unresolved CRITICALs). It cannot guarantee factual accuracy, that's still your call.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Requirements
|
|
165
|
+
|
|
166
|
+
- Python 3.11+
|
|
167
|
+
- [Claude Code](https://claude.com/claude-code)
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## License
|
|
172
|
+
|
|
173
|
+
[MIT](LICENSE)
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Star History
|
|
178
|
+
|
|
179
|
+
[](https://star-history.com/#jordan-gibbs/hyperresearch&Date)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""Generate banner.png (README inline) and banner_social.png (GitHub social preview).
|
|
2
|
+
|
|
3
|
+
Source: assets/_banner_src.png — the pixel-art HYPERRESEARCH wordmark at its
|
|
4
|
+
authored 584x250 resolution. Both output files are derived from it; never
|
|
5
|
+
edit the outputs directly.
|
|
6
|
+
|
|
7
|
+
- banner.png — 3x nearest-neighbor upscale of the source (1752x750). The
|
|
8
|
+
README references this and renders it at width=700, so the browser
|
|
9
|
+
downscales (crisp) instead of upscaling (blurry).
|
|
10
|
+
- banner_social.png — wordmark on a 1280x640 dark canvas matching the
|
|
11
|
+
benchmark chart's background, wordmark filling 92% of the canvas width.
|
|
12
|
+
Upload at repo Settings → Social preview.
|
|
13
|
+
|
|
14
|
+
Re-run when the source wordmark changes:
|
|
15
|
+
python assets/_generate_banner.py
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
from PIL import Image
|
|
21
|
+
|
|
22
|
+
ASSETS = Path(__file__).parent
|
|
23
|
+
SRC = ASSETS / "_banner_src.png"
|
|
24
|
+
README_OUT = ASSETS / "banner.png"
|
|
25
|
+
SOCIAL_OUT = ASSETS / "banner_social.png"
|
|
26
|
+
|
|
27
|
+
# Match the chart's dark background so README header + chart + social
|
|
28
|
+
# preview share one visual treatment.
|
|
29
|
+
BG = (14, 17, 22, 255) # #0E1116
|
|
30
|
+
SOCIAL_W, SOCIAL_H = 1280, 640
|
|
31
|
+
README_SCALE = 3 # 584x250 → 1752x750
|
|
32
|
+
|
|
33
|
+
src = Image.open(SRC).convert("RGBA")
|
|
34
|
+
|
|
35
|
+
# --- README banner: pure 3x nearest-neighbor upscale, no canvas -----------
|
|
36
|
+
readme_img = src.resize(
|
|
37
|
+
(src.width * README_SCALE, src.height * README_SCALE),
|
|
38
|
+
Image.NEAREST,
|
|
39
|
+
)
|
|
40
|
+
readme_img.convert("RGB").save(README_OUT, "PNG", optimize=True)
|
|
41
|
+
print(f"wrote {README_OUT.name} ({readme_img.width}x{readme_img.height})")
|
|
42
|
+
|
|
43
|
+
# --- Social preview: wordmark on dark canvas at GitHub's required 1280x640
|
|
44
|
+
# Start from the same source, upscale 2x for a base, then resize to fit.
|
|
45
|
+
social_word = src.resize((src.width * 2, src.height * 2), Image.NEAREST)
|
|
46
|
+
|
|
47
|
+
# Wordmark should DOMINATE the social card. Fill ~92% width.
|
|
48
|
+
max_w = int(SOCIAL_W * 0.92)
|
|
49
|
+
if social_word.width != max_w:
|
|
50
|
+
ratio = max_w / social_word.width
|
|
51
|
+
social_word = social_word.resize(
|
|
52
|
+
(max_w, int(social_word.height * ratio)),
|
|
53
|
+
Image.NEAREST,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
# Defensive height cap (source aspect 2.34:1 means width typically constrains)
|
|
57
|
+
max_h = int(SOCIAL_H * 0.88)
|
|
58
|
+
if social_word.height > max_h:
|
|
59
|
+
ratio = max_h / social_word.height
|
|
60
|
+
social_word = social_word.resize(
|
|
61
|
+
(int(social_word.width * ratio), max_h),
|
|
62
|
+
Image.NEAREST,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# Compose onto target canvas, centered
|
|
66
|
+
canvas = Image.new("RGBA", (SOCIAL_W, SOCIAL_H), BG)
|
|
67
|
+
x = (SOCIAL_W - social_word.width) // 2
|
|
68
|
+
y = (SOCIAL_H - social_word.height) // 2
|
|
69
|
+
canvas.paste(social_word, (x, y), social_word)
|
|
70
|
+
canvas.convert("RGB").save(SOCIAL_OUT, "PNG", optimize=True)
|
|
71
|
+
print(f"wrote {SOCIAL_OUT.name} ({SOCIAL_W}x{SOCIAL_H})")
|