Build a pipeline manifest mapping scripts to inputs, outputs, and paper figures/tables. Optionally add structured headers to scripts.
Build and maintain a pipeline.md that maps every script in a research project to its inputs, outputs, and the paper figures/tables it feeds. Optionally add structured headers to scripts that lack them.
code-archaeology)code-review agent instead (this skill maps structure, not quality)Ask the user which mode to run:
| Mode | What it does | Writes to |
|------|-------------|-----------|
| Scan (default) | Read-only. Scans scripts, builds pipeline.md | pipeline.md only |
| Add headers | Scan + insert structured headers into scripts that lack them | pipeline.md + script files |
In Add headers mode, show the proposed header for each script and get confirmation before writing. Never overwrite an existing structured header — only add to scripts that lack one.
Every research script should begin with a structured header block. The format adapts to the language:
# ============================================================================
# PURPOSE: [One sentence describing what this script does]
# INPUTS: [Comma-separated list of input files, relative to project root]
# OUTPUTS: [Comma-separated list of output files, relative to project root]
# DEPENDS: [Scripts that must run before this one, or "none"]
# PAPER: [Figure/table references this feeds, e.g. "Figure 2, Table 1", or "none"]
# ============================================================================
# ============================================================================
# PURPOSE: [One sentence describing what this script does]
# INPUTS: [Comma-separated list of input files, relative to project root]
# OUTPUTS: [Comma-separated list of output files, relative to project root]
# DEPENDS: [Scripts that must run before this one, or "none"]
# PAPER: [Figure/table references this feeds, e.g. "Figure 2, Table 1", or "none"]
# ============================================================================
* ============================================================================
* PURPOSE: [One sentence describing what this script does]
* INPUTS: [Comma-separated list of input files, relative to project root]
* OUTPUTS: [Comma-separated list of output files, relative to project root]
* DEPENDS: [Scripts that must run before this one, or "none"]
* PAPER: [Figure/table references this feeds, e.g. "Figure 2, Table 1", or "none"]
* ============================================================================
# ============================================================================
# PURPOSE: [One sentence describing what this script does]
# INPUTS: [Comma-separated list of input files, relative to project root]
# OUTPUTS: [Comma-separated list of output files, relative to project root]
# DEPENDS: [Scripts that must run before this one, or "none"]
# PAPER: [Figure/table references this feeds, e.g. "Figure 2, Table 1", or "none"]
# ============================================================================
| Field | What it contains | How to populate |
|-------|-----------------|-----------------|
| PURPOSE | One sentence. What does this script do? | Read the script and summarise |
| INPUTS | Files this script reads. Paths relative to project root. | Grep for read, load, import, open, use patterns |
| OUTPUTS | Files this script writes. Paths relative to project root. | Grep for write, save, export, ggsave, savefig, sink patterns |
| DEPENDS | Other scripts that must run first (their outputs are this script's inputs). | Trace input files back to the scripts that produce them |
| PAPER | Which figures, tables, or sections in the paper use this script's output. | Match output filenames against \includegraphics, \input, \include in .tex files |
Scan the project for research scripts:
code/**/*.{py,R,r,do,jl,m}
src/**/*.{py,R,r,do,jl,m}
scripts/**/*.{py,R,r,do,jl,m}
Exclude:
__pycache__/, .venv/, renv/, node_modules/test_*.py, *_test.R)setup.py, conftest.py)Sort by filename (numerical prefixes like 01_, 02_ determine natural order).
For each script:
Check for existing header. Look for the PURPOSE: / INPUTS: / OUTPUTS: / DEPENDS: / PAPER: pattern in the first 20 lines.
If header exists: Parse it directly. Trust the header as ground truth.
If no header: Read the full script and infer:
pd.read_csv, read.csv, readRDS, load, use, open, import delimited, fread, arrow::read_parquet, readr::read_*)to_csv, write.csv, saveRDS, save, ggsave, plt.savefig, export, sink, write_parquet, fwrite, outsheet, estout)\includegraphics{...} and \input{...} in .tex filesFrom the extracted information, construct:
data/raw/.Scan all .tex files in paper/ for:
\includegraphics{path} — figures\input{path} — tables or sub-documents\include{path} — chaptersMatch these paths to script outputs. Build a reverse map: for each figure/table in the paper, which script(s) produce it?
Write pipeline.md to the project root using the format below.
For scripts missing structured headers:
# Pipeline Manifest
> Auto-generated by `pipeline-manifest` on YYYY-MM-DD.
> Manually edit the PAPER column and any inferred values that are wrong.
> Re-run `pipeline-manifest` to refresh after adding or modifying scripts.
## Pipeline Table
| # | Script | Purpose | Inputs | Outputs | Depends | Paper |
|---|--------|---------|--------|---------|---------|-------|
| 1 | `code/01_clean.R` | Clean raw survey data | `data/raw/survey.csv` | `data/processed/survey_clean.rds` | none | -- |
| 2 | `code/02_merge.R` | Merge survey with admin data | `data/processed/survey_clean.rds`, `data/raw/admin.csv` | `data/processed/merged.rds` | `01_clean.R` | -- |
| 3 | `code/03_analysis.R` | Run main regressions | `data/processed/merged.rds` | `results/main_results.rds`, `paper/figures/fig_coef.pdf` | `02_merge.R` | Figure 2 |
| 4 | `code/04_robustness.py` | Robustness checks | `data/processed/merged.rds` | `results/robustness.csv`, `paper/figures/fig_robust.pdf` | `02_merge.R` | Figure 3, Table A1 |
## Figure & Table Manifest
| Paper Reference | Producing Script | Output File |
|----------------|-----------------|-------------|
| Figure 2 | `code/03_analysis.R` | `paper/figures/fig_coef.pdf` |
| Figure 3 | `code/04_robustness.py` | `paper/figures/fig_robust.pdf` |
| Table A1 | `code/04_robustness.py` | `results/robustness.csv` |
## Dependency Graph
data/raw/survey.csv ─┐ ├─> 01_clean.R ─> data/processed/survey_clean.rds ─┐ data/raw/admin.csv ──┘ ├─> 02_merge.R ─> data/processed/merged.rds ─┬─> 03_analysis.R │ └─> 04_robustness.py
## Diagnostics
### Orphan Scripts
Scripts whose outputs are not consumed by any other script or the paper.
### Missing Inputs
Files referenced as inputs but not produced by any script and not found in `data/raw/`.
### Execution Order
Recommended order based on dependency resolution:
1. `code/01_clean.R`
2. `code/02_merge.R`
3. `code/03_analysis.R`
4. `code/04_robustness.py` (can run in parallel with step 3)
If pipeline.md already exists:
code-review agent — Quality review for individual scripts (checks header presence in Category 2: Script Structure)code-archaeology — For understanding unfamiliar code before building the manifestpre-submission-report — Pipeline manifest helps verify the replication package is completeinit-project-research — New projects can run pipeline-manifest once scripts existSearch for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer