create-academic-research 0.1.17 → 0.1.18
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.
- package/README.md +35 -1
- package/dist/src/cli.js +64 -2
- package/dist/src/project.js +138 -2
- package/package.json +1 -1
- package/template/AGENTS.md +23 -2
- package/template/README.md +33 -0
- package/template/_gitignore +6 -0
- package/template/analysis_outputs/claim-audit.md +7 -0
- package/template/artifacts/artifact-checklist.md +54 -2
- package/template/artifacts/badge-evidence-ledger.csv +1 -0
- package/template/docs/agent/mcp-client-setup.md +9 -8
- package/template/docs/agent/mcp-setup.md +12 -0
- package/template/docs/agent/output-contracts.md +49 -5
- package/template/docs/agent/project-quality.md +80 -0
- package/template/docs/agent/repo-migration-playbook.md +20 -0
- package/template/docs/getting-started.md +31 -6
- package/template/docs/reproducibility/commands.md +12 -0
- package/template/experiments/campaigns/autonomous-campaign-template.md +68 -0
- package/template/experiments/campaigns/frontier-results.tsv +1 -0
- package/template/package.json +2 -1
- package/template/reports/paper/sota-survey.tex +29 -0
- package/template/repro_outputs/COMMANDS.md +4 -0
- package/template/repro_outputs/LOG.md +6 -0
- package/template/repro_outputs/PATCHES.md +7 -0
- package/template/repro_outputs/SUMMARY.md +21 -0
- package/template/repro_outputs/status.json +9 -0
- package/template/sota/citation-chasing-log.csv +1 -0
- package/template/sota/literature-matrix.csv +1 -1
- package/template/sota/paper-syntheses/.gitkeep +1 -0
- package/template/sota/reading-log.csv +1 -0
- package/template/sota/search-strategy.md +29 -0
- package/template/sources/markdown-linear/.gitkeep +1 -0
- package/template/tests/test_project_structure.py +18 -0
package/README.md
CHANGED
|
@@ -41,7 +41,7 @@ npx --yes github:VincenzoImp/create-academic-research my-project
|
|
|
41
41
|
| Sources | PDFs, derived Markdown, metadata, BibTeX, conversion ledger, source ledger. |
|
|
42
42
|
| Literature Review | Search strategy, screening decisions, literature matrix, SOTA synthesis, gaps, PRISMA flow. |
|
|
43
43
|
| Agent Memory | `AGENTS.md`, capability profile, MCP setup docs, generated MCP snippets, wiki index/log/templates. |
|
|
44
|
-
| Reproducibility | Python package scaffold, tests, experiment registry, output folders, artifact checklist. |
|
|
44
|
+
| Reproducibility | Python package scaffold, tests, experiment registry, autonomous campaign ledgers, output folders, artifact checklist. |
|
|
45
45
|
| Skills | Project-local installation flow for `VincenzoImp/academic-research-skills`. |
|
|
46
46
|
| MCP | Conservative default records for scholarly discovery plus documented optional integrations. |
|
|
47
47
|
|
|
@@ -117,6 +117,7 @@ npm run doctor
|
|
|
117
117
|
npm run update
|
|
118
118
|
npm run update -- --apply
|
|
119
119
|
npm run setup -- --env-file .env.local
|
|
120
|
+
npm run workflow:literature
|
|
120
121
|
npm run rename -- --title "New Title" --slug new-title --package new_title
|
|
121
122
|
npm run agents:list
|
|
122
123
|
npm run skills:presets
|
|
@@ -174,6 +175,23 @@ Safe migrations are tracked in `.academic-research/managed-files.json`. The
|
|
|
174
175
|
manifest stores non-secret checksums for generator-owned files. If a file was
|
|
175
176
|
edited locally, update reports `skip` instead of overwriting it.
|
|
176
177
|
|
|
178
|
+
### Migration 0.1.17 -> 0.1.18
|
|
179
|
+
|
|
180
|
+
Projects created with `0.1.17` can migrate in place:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
npm run update
|
|
184
|
+
npm run update -- --apply
|
|
185
|
+
npm run doctor
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
The migration adds the project-quality contract, badge evidence ledger, SOTA
|
|
189
|
+
reading and citation-chasing ledgers, paper synthesis folders, linear reading
|
|
190
|
+
copies, autonomous experiment campaign files, claim-audit and reproduction
|
|
191
|
+
templates, and `workflow:literature`. Locally edited managed files are skipped;
|
|
192
|
+
new research record templates are created as user-owned where the project is
|
|
193
|
+
expected to fill them over time.
|
|
194
|
+
|
|
177
195
|
`academic-research init` initializes an existing repository without overwriting
|
|
178
196
|
existing files. It adds the research contract, merges lifecycle package scripts,
|
|
179
197
|
and preserves existing README, `.gitignore`, and custom package scripts.
|
|
@@ -216,6 +234,11 @@ MCP commands are split by side-effect:
|
|
|
216
234
|
| `mcp doctor` | Validate enabled MCP records, generated snippets, required env vars, and documented manual prerequisites. Pass `--env-file .env.local` to read explicit local secrets. |
|
|
217
235
|
| `mcp probe` | Opt-in runtime check. Local stdio servers get a JSON-RPC handshake; remote endpoints are reported as configured without a network probe. |
|
|
218
236
|
|
|
237
|
+
Workflow commands are scenario-level shortcuts over skills and MCP records.
|
|
238
|
+
Use `npm run workflow:literature` when starting a serious SOTA, survey, or
|
|
239
|
+
related-work pass: it selects a practical literature stack with arXiv, DBLP,
|
|
240
|
+
Semantic Scholar, and OpenAlex remote graph search, then prints the next checks.
|
|
241
|
+
|
|
219
242
|
## Companion Skills
|
|
220
243
|
|
|
221
244
|
The generated project works best with:
|
|
@@ -269,6 +292,17 @@ a generated safe dotenv-loading wrapper after `mcp setup`.
|
|
|
269
292
|
Crossref and broad paper-search aggregators are kept as fallback/manual entries
|
|
270
293
|
until a project explicitly needs them.
|
|
271
294
|
|
|
295
|
+
For SOTA work, the recommended low-friction path is:
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
npm run workflow:literature
|
|
299
|
+
npm run skills:install -- --preset literature
|
|
300
|
+
npm run mcp:status
|
|
301
|
+
npm run mcp:smoke -- --env-file .env.local
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
Then use `$sota-literature-review` with a declared review scale and seed set.
|
|
305
|
+
|
|
272
306
|
Codex automatic registration supports custom remote endpoints when the URL is
|
|
273
307
|
stored in project config with `--url`. If the endpoint URL is kept private via
|
|
274
308
|
`--url-env`, Codex automatic registration is not available because the Codex CLI
|
package/dist/src/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { basename, delimiter, dirname, join, resolve } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { assertKnownMcpServers, clientAddMcpServer, clientRemoveMcpServer, disableMcpServers, doctorMcpServers, enableMcpServers, DEFAULT_AGENT, getMcpLifecycleStatus, installMcpTools, installSkillIds, installSkills, formatMcpDotenv, listInstalledSkills, listMcpEnvironmentEntries, mergeMcpEnvironment, mcpToolCommandTexts, probeMcpServers, readCapabilities, readMcpEnvironmentFile, removeSkills, resolveMcpServerForState, setupMcpServer, uninstallMcpTools, updateSkills } from "./capabilities.js";
|
|
4
|
+
import { assertKnownMcpServers, clientAddMcpServer, clientRemoveMcpServer, disableMcpServers, doctorMcpServers, enableMcpServers, DEFAULT_AGENT, getMcpLifecycleStatus, installMcpTools, installSkillIds, installSkills, formatMcpDotenv, listInstalledSkills, listMcpEnvironmentEntries, mergeMcpEnvironment, mcpToolCommandTexts, probeMcpServers, readCapabilities, readMcpEnvironmentFile, removeSkills, resolveMcpServerForState, setupMcpServer, uninstallMcpTools, updateSkills, writeCapabilities } from "./capabilities.js";
|
|
5
5
|
import { createProject, doctorProject, initProject, renameProject, updateProject } from "./project.js";
|
|
6
6
|
import { askCreateOptions } from "./prompts.js";
|
|
7
7
|
import { AGENT_STACK, mcpModeLabel, mcpRecommendedMode, mcpServerModeKeys, mcpSupportedModeLabels, presetMcpServers, resolveMcpServer } from "./stack.js";
|
|
@@ -20,6 +20,7 @@ const CREATE_FLAGS = flagSchema([
|
|
|
20
20
|
], ["title", "slug", "package", "preset", "profile", "agent"]);
|
|
21
21
|
const ROOT_FLAGS = flagSchema(["help"], ["root"]);
|
|
22
22
|
const SETUP_FLAGS = flagSchema(["help"], ["root", "env-file"]);
|
|
23
|
+
const WORKFLOW_FLAGS = flagSchema(["help"], ["root", "agent", "env-file"]);
|
|
23
24
|
const UPDATE_FLAGS = flagSchema(["help", "dry-run", "apply"], ["root"]);
|
|
24
25
|
const INIT_FLAGS = flagSchema(["help", "install-skills"], ["root", "title", "slug", "package", "preset", "profile", "agent"]);
|
|
25
26
|
const RENAME_FLAGS = flagSchema(["help"], ["root", "title", "slug", "package"]);
|
|
@@ -130,6 +131,8 @@ async function lifecycleMain(argv) {
|
|
|
130
131
|
return skillsCommand(argv.slice(1));
|
|
131
132
|
if (command === "mcp")
|
|
132
133
|
return mcpCommand(argv.slice(1));
|
|
134
|
+
if (command === "workflow")
|
|
135
|
+
return workflowCommand(argv.slice(1));
|
|
133
136
|
printLifecycleHelp();
|
|
134
137
|
return command === "help" ? 0 : 1;
|
|
135
138
|
}
|
|
@@ -624,6 +627,49 @@ async function mcpCommand(argv) {
|
|
|
624
627
|
}
|
|
625
628
|
throw new Error(`unknown mcp command: ${subcommand}`);
|
|
626
629
|
}
|
|
630
|
+
async function workflowCommand(argv) {
|
|
631
|
+
const subcommand = argv[0] ?? "help";
|
|
632
|
+
const parsed = parseFlags(argv.slice(1), WORKFLOW_FLAGS);
|
|
633
|
+
if (subcommand === "help" || subcommand === "--help" || subcommand === "-h" || flagBool(parsed.flags, "help")) {
|
|
634
|
+
printWorkflowHelp();
|
|
635
|
+
return 0;
|
|
636
|
+
}
|
|
637
|
+
if (subcommand !== "literature")
|
|
638
|
+
throw new Error(`unknown workflow command: ${subcommand}`);
|
|
639
|
+
assertNoArguments(parsed.positionals, "workflow literature");
|
|
640
|
+
const root = resolve(flagString(parsed.flags, "root") ?? ".");
|
|
641
|
+
const state = await readCapabilities(root);
|
|
642
|
+
const agent = flagString(parsed.flags, "agent") ?? state.agent;
|
|
643
|
+
const literatureServers = ["arxiv", "dblp", "semantic-scholar", "openalex"];
|
|
644
|
+
await writeCapabilities(root, {
|
|
645
|
+
...state,
|
|
646
|
+
agent,
|
|
647
|
+
preset: "literature",
|
|
648
|
+
mcp_servers: literatureServers,
|
|
649
|
+
mcp_server_modes: {
|
|
650
|
+
...state.mcp_server_modes,
|
|
651
|
+
openalex: "remote"
|
|
652
|
+
},
|
|
653
|
+
mcp_server_remote: state.mcp_server_remote
|
|
654
|
+
});
|
|
655
|
+
const env = await mcpCommandEnvironment(root, parsed.flags);
|
|
656
|
+
const lifecycle = await getMcpLifecycleStatus(root, { env });
|
|
657
|
+
const selected = lifecycle.servers.filter((server) => server.selected);
|
|
658
|
+
console.log("Literature Workflow");
|
|
659
|
+
console.log(`root\t${root}`);
|
|
660
|
+
console.log("preset\tliterature");
|
|
661
|
+
console.log(`mcp_selected\t${literatureServers.join(",")}`);
|
|
662
|
+
for (const item of selected) {
|
|
663
|
+
console.log(`mcp\t${item.id}\t${item.mode}\t${item.state}\t${friendlyNext(item.next)}`);
|
|
664
|
+
}
|
|
665
|
+
console.log("");
|
|
666
|
+
console.log("Next Commands");
|
|
667
|
+
console.log("npm run skills:install -- --preset literature");
|
|
668
|
+
console.log("npm run mcp:status");
|
|
669
|
+
console.log("npm run mcp:smoke -- --env-file .env.local");
|
|
670
|
+
console.log("Use $sota-literature-review with a declared scale, seed set, and citation-chasing budget.");
|
|
671
|
+
return 0;
|
|
672
|
+
}
|
|
627
673
|
async function mcpClientCommand(parsed) {
|
|
628
674
|
const action = parsed.positionals[0];
|
|
629
675
|
const server = parsed.positionals[1];
|
|
@@ -947,7 +993,7 @@ function printMissingTargetHelp() {
|
|
|
947
993
|
}
|
|
948
994
|
function printLifecycleHelp() {
|
|
949
995
|
console.log([
|
|
950
|
-
"Usage: academic-research <doctor|update|init|setup|rename|agents|skills|mcp>",
|
|
996
|
+
"Usage: academic-research <doctor|update|init|setup|rename|agents|skills|mcp|workflow>",
|
|
951
997
|
"",
|
|
952
998
|
"Manage a generated academic research repository after creation.",
|
|
953
999
|
"",
|
|
@@ -956,6 +1002,22 @@ function printLifecycleHelp() {
|
|
|
956
1002
|
" -v, --version Show package version."
|
|
957
1003
|
].join("\n"));
|
|
958
1004
|
}
|
|
1005
|
+
function printWorkflowHelp() {
|
|
1006
|
+
console.log([
|
|
1007
|
+
"Usage: academic-research workflow <literature> [options]",
|
|
1008
|
+
"",
|
|
1009
|
+
"Prepare scenario-level research workflows without manually stitching every skill and MCP command.",
|
|
1010
|
+
"",
|
|
1011
|
+
"Workflows:",
|
|
1012
|
+
" literature Configure the practical SOTA stack for arXiv, DBLP, Semantic Scholar citation graph, and OpenAlex graph search.",
|
|
1013
|
+
"",
|
|
1014
|
+
"Options:",
|
|
1015
|
+
" --root <path> Project root. Default: current directory.",
|
|
1016
|
+
" --agent <id> Agent target for generated MCP snippets.",
|
|
1017
|
+
" --env-file <path> Read local env values for readiness reporting.",
|
|
1018
|
+
" -h, --help Show this help."
|
|
1019
|
+
].join("\n"));
|
|
1020
|
+
}
|
|
959
1021
|
function printUpdateHelp() {
|
|
960
1022
|
console.log([
|
|
961
1023
|
"Usage: academic-research update [options]",
|
package/dist/src/project.js
CHANGED
|
@@ -49,6 +49,16 @@ const REQUIRED_CSV_COLUMNS = {
|
|
|
49
49
|
"expected_fix",
|
|
50
50
|
"checked_on"
|
|
51
51
|
],
|
|
52
|
+
"artifacts/badge-evidence-ledger.csv": [
|
|
53
|
+
"badge_target",
|
|
54
|
+
"evidence_id",
|
|
55
|
+
"evidence_path",
|
|
56
|
+
"claim_or_result_id",
|
|
57
|
+
"artifact_component",
|
|
58
|
+
"command_or_procedure",
|
|
59
|
+
"validation_status",
|
|
60
|
+
"checked_on"
|
|
61
|
+
],
|
|
52
62
|
"sota/literature-matrix.csv": [
|
|
53
63
|
"source_id",
|
|
54
64
|
"title",
|
|
@@ -62,10 +72,38 @@ const REQUIRED_CSV_COLUMNS = {
|
|
|
62
72
|
"metric_or_result",
|
|
63
73
|
"limitations",
|
|
64
74
|
"relevance",
|
|
75
|
+
"full_text_status",
|
|
76
|
+
"reading_status",
|
|
77
|
+
"synthesis_path",
|
|
65
78
|
"citation_count_or_signal",
|
|
66
|
-
"identifiers"
|
|
79
|
+
"identifiers",
|
|
80
|
+
"bib_key",
|
|
81
|
+
"role"
|
|
67
82
|
],
|
|
68
83
|
"sota/screening-decisions.csv": ["stage", "source_id", "title", "decision", "reason", "screened_by", "date"],
|
|
84
|
+
"sota/reading-log.csv": [
|
|
85
|
+
"source_id",
|
|
86
|
+
"role",
|
|
87
|
+
"reading_copy_path",
|
|
88
|
+
"start_location",
|
|
89
|
+
"end_location",
|
|
90
|
+
"status",
|
|
91
|
+
"reader",
|
|
92
|
+
"started_on",
|
|
93
|
+
"completed_on"
|
|
94
|
+
],
|
|
95
|
+
"sota/citation-chasing-log.csv": [
|
|
96
|
+
"round",
|
|
97
|
+
"seed_source_id",
|
|
98
|
+
"direction",
|
|
99
|
+
"tool_or_database",
|
|
100
|
+
"query_or_graph_call",
|
|
101
|
+
"found_count",
|
|
102
|
+
"new_after_dedup",
|
|
103
|
+
"promoted_to_seed_count",
|
|
104
|
+
"screening_status",
|
|
105
|
+
"date"
|
|
106
|
+
],
|
|
69
107
|
"experiments/registry.csv": [
|
|
70
108
|
"run_id",
|
|
71
109
|
"date",
|
|
@@ -83,6 +121,16 @@ const REQUIRED_CSV_COLUMNS = {
|
|
|
83
121
|
"record_path"
|
|
84
122
|
]
|
|
85
123
|
};
|
|
124
|
+
const REQUIRED_TSV_COLUMNS = {
|
|
125
|
+
"experiments/campaigns/frontier-results.tsv": [
|
|
126
|
+
"run_id",
|
|
127
|
+
"git_commit",
|
|
128
|
+
"metric_value",
|
|
129
|
+
"resource_value",
|
|
130
|
+
"status",
|
|
131
|
+
"description"
|
|
132
|
+
]
|
|
133
|
+
};
|
|
86
134
|
export async function createProject(options) {
|
|
87
135
|
const target = resolve(options.target);
|
|
88
136
|
if (await isNonEmptyDirectory(target)) {
|
|
@@ -188,10 +236,28 @@ export async function doctorProject(root) {
|
|
|
188
236
|
"docs/agent/capability-profile.md",
|
|
189
237
|
"docs/agent/mcp-setup.md",
|
|
190
238
|
"docs/agent/mcp-client-setup.md",
|
|
239
|
+
"docs/agent/output-contracts.md",
|
|
240
|
+
"docs/agent/project-quality.md",
|
|
241
|
+
"docs/agent/repo-migration-playbook.md",
|
|
191
242
|
"docs/agent/generated",
|
|
243
|
+
"docs/reproducibility/commands.md",
|
|
192
244
|
"scripts/README.md",
|
|
245
|
+
"analysis_outputs/claim-audit.md",
|
|
246
|
+
"artifacts/badge-evidence-ledger.csv",
|
|
247
|
+
"experiments/campaigns/autonomous-campaign-template.md",
|
|
248
|
+
"experiments/campaigns/frontier-results.tsv",
|
|
249
|
+
"repro_outputs/SUMMARY.md",
|
|
250
|
+
"repro_outputs/COMMANDS.md",
|
|
251
|
+
"repro_outputs/LOG.md",
|
|
252
|
+
"repro_outputs/PATCHES.md",
|
|
253
|
+
"repro_outputs/status.json",
|
|
254
|
+
"sources/markdown-linear",
|
|
193
255
|
"sources/source-ledger.csv",
|
|
256
|
+
"sota/reading-log.csv",
|
|
257
|
+
"sota/citation-chasing-log.csv",
|
|
194
258
|
"sota/literature-matrix.csv",
|
|
259
|
+
"sota/paper-syntheses",
|
|
260
|
+
"reports/paper/sota-survey.tex",
|
|
195
261
|
"wiki/index.md",
|
|
196
262
|
"wiki/log.md",
|
|
197
263
|
"wiki/templates/source-page.md",
|
|
@@ -304,6 +370,9 @@ export async function doctorProject(root) {
|
|
|
304
370
|
for (const [relative, requiredColumns] of Object.entries(REQUIRED_CSV_COLUMNS)) {
|
|
305
371
|
await validateCsvHeader(target, relative, requiredColumns, errors);
|
|
306
372
|
}
|
|
373
|
+
for (const [relative, requiredColumns] of Object.entries(REQUIRED_TSV_COLUMNS)) {
|
|
374
|
+
await validateDelimitedHeader(target, relative, requiredColumns, "\t", errors);
|
|
375
|
+
}
|
|
307
376
|
return { ok: errors.length === 0, errors, warnings };
|
|
308
377
|
}
|
|
309
378
|
async function personalizeInitializedProject(root, { title, slug, packageName, profile }, created) {
|
|
@@ -429,6 +498,69 @@ async function managedFileSpecs(root) {
|
|
|
429
498
|
{ path: ".env.example", policy: "managed", content: formatMcpDotenv(Object.keys(AGENT_STACK.mcp_servers)) },
|
|
430
499
|
{ path: "configs/agent-stack.yaml", policy: "managed", content: YAML.stringify(AGENT_STACK) },
|
|
431
500
|
{ path: "docs/getting-started.md", policy: "managed", content: await templateText("docs/getting-started.md") },
|
|
501
|
+
{
|
|
502
|
+
path: "docs/agent/output-contracts.md",
|
|
503
|
+
policy: "managed",
|
|
504
|
+
content: await templateText("docs/agent/output-contracts.md")
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
path: "docs/agent/project-quality.md",
|
|
508
|
+
policy: "managed",
|
|
509
|
+
content: await templateText("docs/agent/project-quality.md")
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
path: "docs/agent/repo-migration-playbook.md",
|
|
513
|
+
policy: "user-owned",
|
|
514
|
+
content: await templateText("docs/agent/repo-migration-playbook.md")
|
|
515
|
+
},
|
|
516
|
+
{
|
|
517
|
+
path: "docs/reproducibility/commands.md",
|
|
518
|
+
policy: "user-owned",
|
|
519
|
+
content: await templateText("docs/reproducibility/commands.md")
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
path: "analysis_outputs/claim-audit.md",
|
|
523
|
+
policy: "user-owned",
|
|
524
|
+
content: await templateText("analysis_outputs/claim-audit.md")
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
path: "sources/markdown-linear/.gitkeep",
|
|
528
|
+
policy: "managed",
|
|
529
|
+
content: await templateText("sources/markdown-linear/.gitkeep")
|
|
530
|
+
},
|
|
531
|
+
{ path: "sota/reading-log.csv", policy: "managed", content: await templateText("sota/reading-log.csv") },
|
|
532
|
+
{
|
|
533
|
+
path: "sota/citation-chasing-log.csv",
|
|
534
|
+
policy: "managed",
|
|
535
|
+
content: await templateText("sota/citation-chasing-log.csv")
|
|
536
|
+
},
|
|
537
|
+
{
|
|
538
|
+
path: "sota/paper-syntheses/.gitkeep",
|
|
539
|
+
policy: "managed",
|
|
540
|
+
content: await templateText("sota/paper-syntheses/.gitkeep")
|
|
541
|
+
},
|
|
542
|
+
{ path: "reports/paper/sota-survey.tex", policy: "managed", content: await templateText("reports/paper/sota-survey.tex") },
|
|
543
|
+
{ path: "artifacts/artifact-checklist.md", policy: "managed", content: await templateText("artifacts/artifact-checklist.md") },
|
|
544
|
+
{
|
|
545
|
+
path: "artifacts/badge-evidence-ledger.csv",
|
|
546
|
+
policy: "managed",
|
|
547
|
+
content: await templateText("artifacts/badge-evidence-ledger.csv")
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
path: "experiments/campaigns/autonomous-campaign-template.md",
|
|
551
|
+
policy: "managed",
|
|
552
|
+
content: await templateText("experiments/campaigns/autonomous-campaign-template.md")
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
path: "experiments/campaigns/frontier-results.tsv",
|
|
556
|
+
policy: "managed",
|
|
557
|
+
content: await templateText("experiments/campaigns/frontier-results.tsv")
|
|
558
|
+
},
|
|
559
|
+
{ path: "repro_outputs/SUMMARY.md", policy: "user-owned", content: await templateText("repro_outputs/SUMMARY.md") },
|
|
560
|
+
{ path: "repro_outputs/COMMANDS.md", policy: "user-owned", content: await templateText("repro_outputs/COMMANDS.md") },
|
|
561
|
+
{ path: "repro_outputs/LOG.md", policy: "user-owned", content: await templateText("repro_outputs/LOG.md") },
|
|
562
|
+
{ path: "repro_outputs/PATCHES.md", policy: "user-owned", content: await templateText("repro_outputs/PATCHES.md") },
|
|
563
|
+
{ path: "repro_outputs/status.json", policy: "user-owned", content: await templateText("repro_outputs/status.json") },
|
|
432
564
|
{
|
|
433
565
|
path: "docs/agent/mcp-client-setup.md",
|
|
434
566
|
policy: "managed",
|
|
@@ -470,6 +602,7 @@ function generatedLifecycleScripts(packageSpec) {
|
|
|
470
602
|
doctor: `${command} doctor`,
|
|
471
603
|
update: `${latestCommand} update`,
|
|
472
604
|
setup: `${command} setup`,
|
|
605
|
+
"workflow:literature": `${command} workflow literature`,
|
|
473
606
|
rename: `${command} rename`,
|
|
474
607
|
"agents:list": `${command} agents list`,
|
|
475
608
|
"skills:install": `${command} skills install`,
|
|
@@ -955,11 +1088,14 @@ function toPosix(value) {
|
|
|
955
1088
|
return value.split(/[\\/]/).join("/");
|
|
956
1089
|
}
|
|
957
1090
|
async function validateCsvHeader(root, relative, requiredColumns, errors) {
|
|
1091
|
+
await validateDelimitedHeader(root, relative, requiredColumns, ",", errors);
|
|
1092
|
+
}
|
|
1093
|
+
async function validateDelimitedHeader(root, relative, requiredColumns, delimiter, errors) {
|
|
958
1094
|
const path = join(root, relative);
|
|
959
1095
|
if (!(await exists(path)))
|
|
960
1096
|
return;
|
|
961
1097
|
const header = (await readFile(path, "utf8")).split(/\r?\n/, 1)[0] ?? "";
|
|
962
|
-
const columns = new Set(header.split(
|
|
1098
|
+
const columns = new Set(header.split(delimiter).map((column) => column.trim()).filter(Boolean));
|
|
963
1099
|
for (const column of requiredColumns) {
|
|
964
1100
|
if (!columns.has(column))
|
|
965
1101
|
errors.push(`${relative} missing column ${column}`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-academic-research",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.18",
|
|
4
4
|
"description": "Scaffold agent-ready academic research repositories with SOTA, source ledgers, wiki memory, MCP setup, and project-local skills.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
package/template/AGENTS.md
CHANGED
|
@@ -20,8 +20,9 @@ scholarly record.
|
|
|
20
20
|
2. `configs/default.yaml`
|
|
21
21
|
3. `configs/capabilities.yaml`
|
|
22
22
|
4. `docs/agent/capability-profile.md`
|
|
23
|
-
5. `docs/agent/
|
|
24
|
-
6. `
|
|
23
|
+
5. `docs/agent/project-quality.md`
|
|
24
|
+
6. `docs/agent/research-program.md`
|
|
25
|
+
7. `wiki/index.md`
|
|
25
26
|
|
|
26
27
|
## Standard Workflow
|
|
27
28
|
|
|
@@ -31,6 +32,14 @@ scholarly record.
|
|
|
31
32
|
4. Add tests or validation for code and structural changes.
|
|
32
33
|
5. Update `wiki/log.md` and affected wiki/docs pages before finishing.
|
|
33
34
|
|
|
35
|
+
## Project Quality
|
|
36
|
+
|
|
37
|
+
- Keep every user request inside the project quality contract in `docs/agent/project-quality.md`.
|
|
38
|
+
- Put each artifact in its correct work zone: exploratory, debug, analysis, reproduction, final output, report, source, or release.
|
|
39
|
+
- Promote outputs only when inputs, command/procedure, validation, limitations, and linked claims are recorded.
|
|
40
|
+
- Update `artifacts/badge-evidence-ledger.csv` whenever a task creates evidence for artifact availability, functionality, reusability, reproduction, or replication.
|
|
41
|
+
- The user guides the research direction; agents preserve internal order, provenance, and validation discipline.
|
|
42
|
+
|
|
34
43
|
## Memory Contract
|
|
35
44
|
|
|
36
45
|
- `wiki/log.md` is chronological and append-only.
|
|
@@ -45,9 +54,21 @@ scholarly record.
|
|
|
45
54
|
|
|
46
55
|
- Native PDFs and reports go in `sources/pdfs/`.
|
|
47
56
|
- Derived Markdown goes in `sources/markdown/`.
|
|
57
|
+
- Linear reading copies go in `sources/markdown-linear/`.
|
|
48
58
|
- Metadata goes in `sources/metadata/`.
|
|
49
59
|
- Bibliography records go in `sources/bib/references.bib`.
|
|
50
60
|
- Citation issues go in `sources/bib/citation-audit.csv`.
|
|
51
61
|
- SOTA records go in `sota/`.
|
|
62
|
+
- Core/supporting paper syntheses go in `sota/paper-syntheses/`.
|
|
63
|
+
- Full-text reading progress goes in `sota/reading-log.csv`.
|
|
64
|
+
- Citation graph expansion goes in `sota/citation-chasing-log.csv`.
|
|
52
65
|
- Curated experiment records go in `experiments/`.
|
|
53
66
|
- Repeatable command entrypoints go in `scripts/`.
|
|
67
|
+
|
|
68
|
+
## SOTA Discipline
|
|
69
|
+
|
|
70
|
+
- Run `npm run workflow:literature` before serious SOTA, survey, or related-work work.
|
|
71
|
+
- Declare the review scale: quick-scan, focused-sota, or full-survey.
|
|
72
|
+
- Use citation chasing in both directions from seeds; record rounds and stopping conditions.
|
|
73
|
+
- Do not use abstract-only records for durable claims.
|
|
74
|
+
- For core/supporting papers, acquire full text, read linearly, create a per-paper synthesis, normalize the BibTeX entry, then cite.
|
package/template/README.md
CHANGED
|
@@ -40,8 +40,10 @@ npm run update
|
|
|
40
40
|
- `sota/`: search strategy, screening, literature matrix, synthesis, and gaps.
|
|
41
41
|
- `wiki/`: LLM-maintained durable research memory.
|
|
42
42
|
- `docs/agent/`: active agent workflows, capability profile, and MCP setup.
|
|
43
|
+
- `docs/agent/project-quality.md`: cross-project quality, hygiene, and badge-readiness contract.
|
|
43
44
|
- `docs/methodology/`: research design, evaluation plan, and validity threats.
|
|
44
45
|
- `experiments/`: curated experiment registry and run records.
|
|
46
|
+
- `experiments/campaigns/`: autonomous campaign templates and frontier result ledgers.
|
|
45
47
|
- `scripts/`: thin repeatable entrypoints that call reusable code in `src/`.
|
|
46
48
|
- `notebooks/`: optional exploratory and narrative notebooks.
|
|
47
49
|
- `outputs/`: final figures, tables, models, and paper-supporting derived assets.
|
|
@@ -63,6 +65,7 @@ npm run skills:list
|
|
|
63
65
|
npm run skills:status
|
|
64
66
|
npm run update
|
|
65
67
|
npm run setup
|
|
68
|
+
npm run workflow:literature
|
|
66
69
|
npm run mcp:dotenv
|
|
67
70
|
npm run mcp:list
|
|
68
71
|
npm run mcp:modes
|
|
@@ -104,6 +107,22 @@ npm exec --yes --package=create-academic-research@latest -- academic-research up
|
|
|
104
107
|
npm exec --yes --package=create-academic-research@latest -- academic-research update --root . --apply
|
|
105
108
|
```
|
|
106
109
|
|
|
110
|
+
### Migration 0.1.17 -> 0.1.18
|
|
111
|
+
|
|
112
|
+
Projects created with `0.1.17` can migrate in place:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
npm run update
|
|
116
|
+
npm run update -- --apply
|
|
117
|
+
npm run doctor
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The migration adds the project-quality contract, badge evidence ledger, SOTA
|
|
121
|
+
reading and citation-chasing ledgers, paper synthesis folders, linear reading
|
|
122
|
+
copies, autonomous experiment campaign files, claim-audit and reproduction
|
|
123
|
+
templates, and `workflow:literature`. Locally edited managed files are skipped;
|
|
124
|
+
new research record templates are created for the project to fill over time.
|
|
125
|
+
|
|
107
126
|
`.env.example` is the committed MCP environment reference. Regenerate it with
|
|
108
127
|
`npm run mcp:dotenv`. Copy it to `.env.local`, your shell profile, or your MCP
|
|
109
128
|
client secret store when secrets are needed. Filled `.env` files are ignored by
|
|
@@ -137,3 +156,17 @@ and Overleaf should be enabled only after reading `docs/agent/mcp-setup.md` and
|
|
|
137
156
|
checking their prerequisites with `mcp env`.
|
|
138
157
|
|
|
139
158
|
See `docs/getting-started.md` for the recommended first session workflow.
|
|
159
|
+
|
|
160
|
+
For a serious SOTA or survey, start with:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
npm run workflow:literature
|
|
164
|
+
npm run skills:install -- --preset literature
|
|
165
|
+
npm run mcp:status
|
|
166
|
+
npm run mcp:smoke -- --env-file .env.local
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
This configures arXiv, DBLP, Semantic Scholar, and OpenAlex remote graph search
|
|
170
|
+
as the practical citation-discovery stack. MCP output still becomes evidence
|
|
171
|
+
only after source ingestion, full-text reading, bibliography normalization, and
|
|
172
|
+
claim audit.
|
package/template/_gitignore
CHANGED
|
@@ -30,12 +30,18 @@ outputs/**
|
|
|
30
30
|
analysis_outputs/**
|
|
31
31
|
!analysis_outputs/
|
|
32
32
|
!analysis_outputs/.gitkeep
|
|
33
|
+
!analysis_outputs/claim-audit.md
|
|
33
34
|
debug_outputs/**
|
|
34
35
|
!debug_outputs/
|
|
35
36
|
!debug_outputs/.gitkeep
|
|
36
37
|
repro_outputs/**
|
|
37
38
|
!repro_outputs/
|
|
38
39
|
!repro_outputs/.gitkeep
|
|
40
|
+
!repro_outputs/COMMANDS.md
|
|
41
|
+
!repro_outputs/LOG.md
|
|
42
|
+
!repro_outputs/PATCHES.md
|
|
43
|
+
!repro_outputs/SUMMARY.md
|
|
44
|
+
!repro_outputs/status.json
|
|
39
45
|
train_outputs/**
|
|
40
46
|
!train_outputs/
|
|
41
47
|
!train_outputs/.gitkeep
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Claim Audit
|
|
2
|
+
|
|
3
|
+
Use this file for claim-by-claim verification notes before promoting text into
|
|
4
|
+
papers, reports, README claims, or durable wiki synthesis.
|
|
5
|
+
|
|
6
|
+
| claim_id | claim | class | cited_source | evidence_path | support_span | verdict | fix |
|
|
7
|
+
|---|---|---|---|---|---|---|---|
|
|
@@ -1,7 +1,59 @@
|
|
|
1
1
|
# Artifact Checklist
|
|
2
2
|
|
|
3
|
+
# ACM Artifact Review And Badging
|
|
4
|
+
|
|
5
|
+
Use this file to prepare for ACM artifact review and related open-science
|
|
6
|
+
expectations. Badge families are independent: availability, artifact
|
|
7
|
+
evaluation, and result validation.
|
|
8
|
+
|
|
9
|
+
## Artifact Scope
|
|
10
|
+
|
|
3
11
|
- Code release scope:
|
|
4
12
|
- Data release scope:
|
|
5
|
-
-
|
|
13
|
+
- Model/checkpoint scope:
|
|
14
|
+
- Paper claims supported:
|
|
15
|
+
- Excluded private or restricted material:
|
|
16
|
+
|
|
17
|
+
## Artifacts Available
|
|
18
|
+
|
|
19
|
+
- Archival repository:
|
|
20
|
+
- DOI or stable identifier:
|
|
6
21
|
- License:
|
|
7
|
-
-
|
|
22
|
+
- Citation:
|
|
23
|
+
- Public access restrictions:
|
|
24
|
+
- Version/tag matching the paper:
|
|
25
|
+
|
|
26
|
+
## Artifacts Evaluated: Functional
|
|
27
|
+
|
|
28
|
+
- Install command:
|
|
29
|
+
- Smoke test:
|
|
30
|
+
- Expected smoke-test output:
|
|
31
|
+
- Hardware and OS:
|
|
32
|
+
- Runtime:
|
|
33
|
+
- Required data:
|
|
34
|
+
- Known limitations:
|
|
35
|
+
|
|
36
|
+
## Artifacts Evaluated: Reusable
|
|
37
|
+
|
|
38
|
+
- Documented structure:
|
|
39
|
+
- Configuration files:
|
|
40
|
+
- Small example dataset or synthetic fixture:
|
|
41
|
+
- Extension points:
|
|
42
|
+
- Parameter/seed documentation:
|
|
43
|
+
- Maintenance notes:
|
|
44
|
+
|
|
45
|
+
## Results Validated
|
|
46
|
+
|
|
47
|
+
- Results Reproduced by same artifact:
|
|
48
|
+
- Results Replicated by independent artifact:
|
|
49
|
+
- Full reproduction command:
|
|
50
|
+
- Expected outputs:
|
|
51
|
+
- Comparison tolerance:
|
|
52
|
+
- Result-to-claim mapping:
|
|
53
|
+
|
|
54
|
+
## Governance
|
|
55
|
+
|
|
56
|
+
- Ethics/license constraints:
|
|
57
|
+
- Sensitive data handling:
|
|
58
|
+
- External dependency risks:
|
|
59
|
+
- Credentials excluded from release:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
badge_target,evidence_id,evidence_path,claim_or_result_id,artifact_component,command_or_procedure,validation_status,checked_on,notes
|
|
@@ -97,14 +97,15 @@ snippet, a supported client registration path, and the next setup action.
|
|
|
97
97
|
|
|
98
98
|
## Workflow
|
|
99
99
|
|
|
100
|
-
1.
|
|
101
|
-
2.
|
|
102
|
-
3.
|
|
103
|
-
4.
|
|
104
|
-
5. Run `npm run mcp:
|
|
105
|
-
6.
|
|
100
|
+
1. For SOTA or survey work, run `npm run workflow:literature` before manual MCP selection.
|
|
101
|
+
2. Enable only the MCP servers needed for the current research task.
|
|
102
|
+
3. Inspect prerequisites with `npm run mcp:env -- <server>`.
|
|
103
|
+
4. Put required secrets in the MCP client secret store, shell, or `.env.local`.
|
|
104
|
+
5. Run `npm run mcp:smoke -- --env-file .env.local`.
|
|
105
|
+
6. Run `npm run mcp:status`.
|
|
106
|
+
7. Register the selected server with the active client, or load the generated
|
|
106
107
|
snippet manually.
|
|
107
|
-
|
|
108
|
+
8. Run `npm run mcp:probe -- <server>` only when you want to start
|
|
108
109
|
the server and verify a real stdio handshake.
|
|
109
|
-
|
|
110
|
+
9. Treat MCP output as retrieval metadata until it is ingested into repository
|
|
110
111
|
source records.
|
|
@@ -19,6 +19,18 @@ local app, and manual setup.
|
|
|
19
19
|
Use `npm run mcp:status -- --verbose` when you need technical mode names,
|
|
20
20
|
snippet state, client registration state, and probe details.
|
|
21
21
|
|
|
22
|
+
For literature review work, prefer the scenario command before manual MCP
|
|
23
|
+
selection:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm run workflow:literature
|
|
27
|
+
npm run mcp:status
|
|
28
|
+
npm run mcp:smoke -- --env-file .env.local
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
This selects arXiv, DBLP, Semantic Scholar, and OpenAlex remote graph search as
|
|
32
|
+
the default SOTA discovery stack.
|
|
33
|
+
|
|
22
34
|
`configs/capabilities.yaml` records intended project capability state.
|
|
23
35
|
`docs/agent/capability-lock.json` records non-secret observed setup facts for
|
|
24
36
|
MCP setup/client/probe actions and project-local skill operations. The scaffold
|
|
@@ -1,8 +1,52 @@
|
|
|
1
1
|
# Output Contracts
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
Use this file with `docs/agent/project-quality.md` before writing generated or
|
|
4
|
+
derived material. The Project Quality Contract decides when an output can move
|
|
5
|
+
from exploratory work to trusted project evidence.
|
|
6
|
+
|
|
7
|
+
## Trust Levels
|
|
8
|
+
|
|
9
|
+
- `explore_outputs/`: exploratory variants, early hypotheses, and caveated runs.
|
|
10
|
+
- `debug_outputs/`: diagnosis artifacts for failures, data issues, or scientific bugs.
|
|
11
|
+
- `analysis_outputs/`: analysis reports, audits, intermediate tables, and draft figures.
|
|
12
|
+
- `repro_outputs/`: trusted reproduction evidence for external or internal results.
|
|
13
|
+
- `train_outputs/`: trusted training run evidence when model training is part of the research.
|
|
8
14
|
- `outputs/`: curated paper-facing figures, tables, models, and exportable derived assets.
|
|
15
|
+
|
|
16
|
+
## Research Records
|
|
17
|
+
|
|
18
|
+
- `sources/`: immutable source evidence, metadata, derived Markdown, and BibTeX.
|
|
19
|
+
- `sources/markdown-linear/`: cover-to-cover reading copies for core/supporting papers.
|
|
20
|
+
- `sota/`: search strategies, screening, literature matrix, syntheses, gaps, and logs.
|
|
21
|
+
- `sota/paper-syntheses/`: structured full-text syntheses for core/supporting papers.
|
|
22
|
+
- `sota/reading-log.csv`: full-text reading progress.
|
|
23
|
+
- `sota/citation-chasing-log.csv`: backward/forward citation expansion rounds.
|
|
24
|
+
- `experiments/`: curated experiment registry and human-readable run records.
|
|
25
|
+
- `experiments/campaigns/`: autonomous or overnight campaign plans and frontier ledgers.
|
|
26
|
+
- `experiments/campaigns/frontier-results.tsv`: machine-readable frontier ledger for `keep`, `discard`, and `crash` campaign outcomes.
|
|
27
|
+
- `reports/paper/sota-survey.tex`: survey-scale LaTeX draft when the task asks for a SOTA chapter or survey.
|
|
28
|
+
- `artifacts/badge-evidence-ledger.csv`: badge evidence paths, linked claims/results, procedures, and validation status.
|
|
29
|
+
|
|
30
|
+
## Promotion Rules
|
|
31
|
+
|
|
32
|
+
Do not promote an output into `outputs/`, `repro_outputs/`, `train_outputs/`,
|
|
33
|
+
`reports/`, or `artifacts/` until it names:
|
|
34
|
+
|
|
35
|
+
- input sources, datasets, or run records
|
|
36
|
+
- command, script, notebook, or manual procedure
|
|
37
|
+
- environment or dependency notes
|
|
38
|
+
- expected output or validation criterion
|
|
39
|
+
- linked claim, research question, experiment, source, or artifact checklist row
|
|
40
|
+
- known limitations
|
|
41
|
+
|
|
42
|
+
If any item is missing, keep the material in `explore_outputs/`,
|
|
43
|
+
`analysis_outputs/`, or `debug_outputs/` and record the gap in the relevant
|
|
44
|
+
wiki page, ledger, or checklist.
|
|
45
|
+
|
|
46
|
+
## Badge Evidence
|
|
47
|
+
|
|
48
|
+
When an output supports artifact availability, functionality, reusability,
|
|
49
|
+
reproduction, or replication, update both:
|
|
50
|
+
|
|
51
|
+
- `artifacts/artifact-checklist.md`
|
|
52
|
+
- `artifacts/badge-evidence-ledger.csv`
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Project Quality Contract
|
|
2
|
+
|
|
3
|
+
This repository should stay usable for an entire academic research project, not
|
|
4
|
+
only for the current task. Every agent action should leave durable state,
|
|
5
|
+
evidence, and outputs in the right place.
|
|
6
|
+
|
|
7
|
+
## Request Intake
|
|
8
|
+
|
|
9
|
+
Before acting, classify the user's request:
|
|
10
|
+
|
|
11
|
+
- idea, question, or positioning
|
|
12
|
+
- source, PDF, bibliography, or SOTA work
|
|
13
|
+
- experiment, reproduction, analysis, or artifact work
|
|
14
|
+
- manuscript, LaTeX, review, rebuttal, or venue work
|
|
15
|
+
- project maintenance, MCP, skills, or repository hygiene
|
|
16
|
+
|
|
17
|
+
Route through the narrowest matching skill. If multiple workflows are involved,
|
|
18
|
+
update the durable records for each workflow instead of relying on chat history.
|
|
19
|
+
|
|
20
|
+
## Clean Work Zones
|
|
21
|
+
|
|
22
|
+
- `sources/`: immutable source evidence and derived reading copies.
|
|
23
|
+
- `sota/`: search protocol, screening, matrix, syntheses, gaps, and citation-chasing logs.
|
|
24
|
+
- `experiments/`: curated run registry and human-readable experiment records.
|
|
25
|
+
- `experiments/campaigns/`: bounded autonomous campaign plans and frontier ledgers.
|
|
26
|
+
- `explore_outputs/`: exploratory work that is not trusted evidence.
|
|
27
|
+
- `debug_outputs/`: diagnostic artifacts.
|
|
28
|
+
- `analysis_outputs/`: analysis reports and audit outputs.
|
|
29
|
+
- `repro_outputs/`: trusted reproduction evidence.
|
|
30
|
+
- `outputs/`: final paper-facing tables, figures, models, and exports.
|
|
31
|
+
- `reports/`: proposal, manuscript, slides, reviews, rebuttal, and LaTeX.
|
|
32
|
+
- `artifacts/`: release package, badge evidence, public artifact preparation.
|
|
33
|
+
- `wiki/`: durable project memory, claims, decisions, contradictions, questions.
|
|
34
|
+
|
|
35
|
+
Do not mix exploratory, trusted, raw, and final outputs. Promote artifacts only
|
|
36
|
+
when provenance, command, input, and validation are recorded.
|
|
37
|
+
|
|
38
|
+
## Trusted Outputs
|
|
39
|
+
|
|
40
|
+
An output becomes trusted only when it has:
|
|
41
|
+
|
|
42
|
+
- input sources or datasets
|
|
43
|
+
- command, script, notebook, or manual procedure
|
|
44
|
+
- environment or dependency notes
|
|
45
|
+
- expected output or validation criterion
|
|
46
|
+
- linked claim, research question, experiment, or source record
|
|
47
|
+
- known limitations
|
|
48
|
+
|
|
49
|
+
If any of these are missing, keep the output in `explore_outputs/`,
|
|
50
|
+
`analysis_outputs/`, or `debug_outputs/` and record the gap.
|
|
51
|
+
|
|
52
|
+
## Project Hygiene Gate
|
|
53
|
+
|
|
54
|
+
Before finishing a task:
|
|
55
|
+
|
|
56
|
+
- update the relevant ledger, matrix, wiki page, or checklist
|
|
57
|
+
- keep raw sources immutable
|
|
58
|
+
- keep reusable logic in `src/` and thin commands in `scripts/`
|
|
59
|
+
- keep generated caches, secrets, private data, and bulky outputs out of git
|
|
60
|
+
- reconcile bibliography keys, source IDs, run IDs, and claim IDs
|
|
61
|
+
- mark unresolved questions in `wiki/open_questions.md`
|
|
62
|
+
- append durable changes to `wiki/log.md`
|
|
63
|
+
- run the smallest meaningful validation command
|
|
64
|
+
|
|
65
|
+
## Badge Readiness
|
|
66
|
+
|
|
67
|
+
Badge evidence should accumulate throughout the project. When a task affects
|
|
68
|
+
code, data, benchmarks, models, experiments, reproduction, or release material,
|
|
69
|
+
update `artifacts/badge-evidence-ledger.csv` and `artifacts/artifact-checklist.md`.
|
|
70
|
+
|
|
71
|
+
Map work to these targets:
|
|
72
|
+
|
|
73
|
+
- Artifacts Available
|
|
74
|
+
- Artifacts Evaluated: Functional
|
|
75
|
+
- Artifacts Evaluated: Reusable
|
|
76
|
+
- Results Reproduced
|
|
77
|
+
- Results Replicated
|
|
78
|
+
|
|
79
|
+
Do not wait for submission week to recover install commands, expected outputs,
|
|
80
|
+
data access notes, or result-to-claim mappings.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Repo Migration Playbook
|
|
2
|
+
|
|
3
|
+
Use this playbook when migrating an existing archive, notebook pile, external
|
|
4
|
+
research repository, or ad hoc project into this scaffold.
|
|
5
|
+
|
|
6
|
+
## Source Inventory
|
|
7
|
+
|
|
8
|
+
| source_path | type | destination | preserve_as_raw | notes |
|
|
9
|
+
|---|---|---|---|---|
|
|
10
|
+
|
|
11
|
+
## Migration Plan
|
|
12
|
+
|
|
13
|
+
| step | action | target_path | validation | status |
|
|
14
|
+
|---|---|---|---|---|
|
|
15
|
+
|
|
16
|
+
## Decisions
|
|
17
|
+
|
|
18
|
+
Record structure decisions, skipped files, incompatible assumptions, and
|
|
19
|
+
follow-up checks here. Keep original evidence immutable until provenance is
|
|
20
|
+
recorded.
|
|
@@ -29,6 +29,10 @@ npm exec --yes --package=create-academic-research@latest -- academic-research up
|
|
|
29
29
|
npm exec --yes --package=create-academic-research@latest -- academic-research update --root . --apply
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
+
Read `docs/agent/project-quality.md` before substantive work. It defines where
|
|
33
|
+
each class of source, SOTA record, experiment, analysis, LaTeX file, artifact,
|
|
34
|
+
and final output belongs.
|
|
35
|
+
|
|
32
36
|
## 2. Install Project-Local Skills
|
|
33
37
|
|
|
34
38
|
Install the default academic research skill package:
|
|
@@ -66,13 +70,30 @@ npm run mcp:smoke -- --env-file .env.local
|
|
|
66
70
|
npm run mcp:probe -- arxiv --timeout-ms 5000
|
|
67
71
|
```
|
|
68
72
|
|
|
69
|
-
## 4.
|
|
73
|
+
## 4. Prepare The Literature Workflow
|
|
74
|
+
|
|
75
|
+
For SOTA, survey, or related-work tasks, configure the practical citation graph
|
|
76
|
+
stack before broad searching:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
npm run workflow:literature
|
|
80
|
+
npm run skills:install -- --preset literature
|
|
81
|
+
npm run mcp:status
|
|
82
|
+
npm run mcp:smoke -- --env-file .env.local
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
This selects arXiv, DBLP, Semantic Scholar, and OpenAlex remote graph search.
|
|
86
|
+
Use `$sota-literature-review` with a declared scale: `quick-scan`,
|
|
87
|
+
`focused-sota`, or `full-survey`.
|
|
88
|
+
|
|
89
|
+
## 5. Start Source Work
|
|
70
90
|
|
|
71
91
|
Put source originals and metadata in the source layer before synthesis.
|
|
72
92
|
|
|
73
93
|
```text
|
|
74
94
|
sources/pdfs/ native PDFs
|
|
75
95
|
sources/markdown/ derived Markdown
|
|
96
|
+
sources/markdown-linear/ cover-to-cover reading copies
|
|
76
97
|
sources/metadata/ downloaded metadata or query exports
|
|
77
98
|
sources/bib/ BibTeX and citation audits
|
|
78
99
|
```
|
|
@@ -80,16 +101,20 @@ sources/bib/ BibTeX and citation audits
|
|
|
80
101
|
Update `sources/source-ledger.csv` whenever a paper, report, dataset, or web
|
|
81
102
|
source becomes evidence for the project.
|
|
82
103
|
|
|
83
|
-
##
|
|
104
|
+
## 6. Build The First SOTA Pass
|
|
84
105
|
|
|
85
106
|
Use `sota/search-strategy.md` to record search terms, databases, dates, and
|
|
86
|
-
inclusion criteria.
|
|
87
|
-
|
|
107
|
+
inclusion criteria. Record full-text reading in `sota/reading-log.csv` and
|
|
108
|
+
citation expansion in `sota/citation-chasing-log.csv`. Put screened sources in
|
|
109
|
+
`sota/literature-matrix.csv`, create per-paper syntheses in
|
|
110
|
+
`sota/paper-syntheses/`, then summarize stable conclusions in
|
|
111
|
+
`sota/synthesis.md`.
|
|
88
112
|
|
|
89
113
|
Do not treat MCP output as final evidence until the relevant source has been
|
|
90
|
-
ingested, deduplicated, and tied to a source
|
|
114
|
+
ingested, deduplicated, read in full when core/supporting, and tied to a source
|
|
115
|
+
record and bibliography key.
|
|
91
116
|
|
|
92
|
-
##
|
|
117
|
+
## 7. Keep Durable Memory Current
|
|
93
118
|
|
|
94
119
|
Update the wiki when project knowledge changes:
|
|
95
120
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Reproducibility Commands
|
|
2
|
+
|
|
3
|
+
Record commands that a reviewer or future researcher can run without relying on
|
|
4
|
+
chat history.
|
|
5
|
+
|
|
6
|
+
| command_id | purpose | command | working_dir | inputs | expected_output | last_checked |
|
|
7
|
+
|---|---|---|---|---|---|---|
|
|
8
|
+
|
|
9
|
+
## Environment Notes
|
|
10
|
+
|
|
11
|
+
Record dependency files, hardware assumptions, external services, data access
|
|
12
|
+
steps, and known runtime limits here.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Autonomous Experiment Campaign
|
|
2
|
+
|
|
3
|
+
Use this template for bounded autonomous or overnight experiment loops. The goal
|
|
4
|
+
is to let an agent iterate without losing scientific comparability.
|
|
5
|
+
|
|
6
|
+
## Research Question
|
|
7
|
+
|
|
8
|
+
<fill: question or optimization target>
|
|
9
|
+
|
|
10
|
+
## Mutability Envelope
|
|
11
|
+
|
|
12
|
+
- Editable files or modules:
|
|
13
|
+
- Read-only files or modules:
|
|
14
|
+
- Allowed dependency changes:
|
|
15
|
+
- Forbidden changes:
|
|
16
|
+
|
|
17
|
+
## Frozen Harness
|
|
18
|
+
|
|
19
|
+
- Dataset and split:
|
|
20
|
+
- Evaluation script or function:
|
|
21
|
+
- Metric and direction:
|
|
22
|
+
- Resource measure:
|
|
23
|
+
- Time or compute budget:
|
|
24
|
+
- Hardware or runtime constraints:
|
|
25
|
+
|
|
26
|
+
## Baseline Run
|
|
27
|
+
|
|
28
|
+
- Baseline commit:
|
|
29
|
+
- Command:
|
|
30
|
+
- Metric value:
|
|
31
|
+
- Resource value:
|
|
32
|
+
- Output path:
|
|
33
|
+
|
|
34
|
+
## Frontier Tracking
|
|
35
|
+
|
|
36
|
+
Record every candidate in `experiments/campaigns/frontier-results.tsv`.
|
|
37
|
+
|
|
38
|
+
Statuses: keep, discard, crash.
|
|
39
|
+
|
|
40
|
+
- `keep`: candidate improves the agreed metric or simplifies without degrading.
|
|
41
|
+
- `discard`: candidate runs but does not improve enough to keep.
|
|
42
|
+
- `crash`: candidate fails, times out, or exceeds resource limits.
|
|
43
|
+
|
|
44
|
+
Keep `explore_outputs/` for raw exploratory logs, `debug_outputs/` for crash
|
|
45
|
+
diagnosis, and promote only trusted evidence to `train_outputs/`,
|
|
46
|
+
`repro_outputs/`, or `outputs/`.
|
|
47
|
+
|
|
48
|
+
## Loop Procedure
|
|
49
|
+
|
|
50
|
+
1. Check git state and current best result.
|
|
51
|
+
2. Make one candidate change inside the mutability envelope.
|
|
52
|
+
3. Commit or otherwise snapshot the candidate before running.
|
|
53
|
+
4. Run the exact command with bounded output capture.
|
|
54
|
+
5. Extract metric, resource value, runtime, and status.
|
|
55
|
+
6. Append the result to `frontier-results.tsv`.
|
|
56
|
+
7. Keep, discard, or diagnose according to the campaign policy.
|
|
57
|
+
8. Stop only at the declared stop condition or when scientific meaning changes.
|
|
58
|
+
|
|
59
|
+
## Stop Conditions
|
|
60
|
+
|
|
61
|
+
- Maximum runs:
|
|
62
|
+
- Maximum wall-clock time:
|
|
63
|
+
- Minimum meaningful improvement:
|
|
64
|
+
- Human approval required when:
|
|
65
|
+
|
|
66
|
+
## Notes
|
|
67
|
+
|
|
68
|
+
<fill: interpretation, surprising findings, or next hypotheses>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
run_id git_commit metric_value resource_value status description
|
package/template/package.json
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"doctor": "npm exec --yes --package=create-academic-research@latest -- academic-research doctor",
|
|
7
7
|
"update": "npm exec --yes --package=create-academic-research@latest -- academic-research update",
|
|
8
8
|
"setup": "npm exec --yes --package=create-academic-research@latest -- academic-research setup",
|
|
9
|
+
"workflow:literature": "npm exec --yes --package=create-academic-research@latest -- academic-research workflow literature",
|
|
9
10
|
"rename": "npm exec --yes --package=create-academic-research@latest -- academic-research rename",
|
|
10
11
|
"agents:list": "npm exec --yes --package=create-academic-research@latest -- academic-research agents list",
|
|
11
12
|
"skills:install": "npm exec --yes --package=create-academic-research@latest -- academic-research skills install",
|
|
@@ -35,6 +36,6 @@
|
|
|
35
36
|
"mcp:probe": "npm exec --yes --package=create-academic-research@latest -- academic-research mcp probe"
|
|
36
37
|
},
|
|
37
38
|
"devDependencies": {
|
|
38
|
-
"create-academic-research": "0.1.
|
|
39
|
+
"create-academic-research": "0.1.18"
|
|
39
40
|
}
|
|
40
41
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
\section{State of the Art}
|
|
2
|
+
\label{sec:sota}
|
|
3
|
+
|
|
4
|
+
\subsection{Search Protocol}
|
|
5
|
+
\label{sec:sota-search-protocol}
|
|
6
|
+
Describe the review scale, seed sources, databases, exact queries, date ranges,
|
|
7
|
+
filters, citation-chasing depth, inclusion criteria, exclusion criteria, and
|
|
8
|
+
known blind spots recorded in \texttt{sota/search-strategy.md}.
|
|
9
|
+
|
|
10
|
+
\subsection{Methodological Families}
|
|
11
|
+
\label{sec:sota-method-families}
|
|
12
|
+
Synthesize methods by family. Cite only entries present in
|
|
13
|
+
\texttt{sources/bib/references.bib} and \texttt{sota/literature-matrix.csv}.
|
|
14
|
+
|
|
15
|
+
\subsection{Evidence And Findings}
|
|
16
|
+
\label{sec:sota-findings}
|
|
17
|
+
Report established findings, contested findings, datasets, metrics, baselines,
|
|
18
|
+
and limitations. Do not promote abstract-only or unaudited claims.
|
|
19
|
+
|
|
20
|
+
\subsection{Implications For This Project}
|
|
21
|
+
\label{sec:sota-project-implications}
|
|
22
|
+
Connect the literature to the current research idea, nearest prior work,
|
|
23
|
+
publishable deltas, failure conditions, and evidence still needed.
|
|
24
|
+
|
|
25
|
+
\subsection{Open Directions}
|
|
26
|
+
\label{sec:sota-open-directions}
|
|
27
|
+
List research directions derived from \texttt{sota/gaps.md}. Each direction
|
|
28
|
+
should name the supporting evidence, nearest prior work, method, risk, and
|
|
29
|
+
artifact or evaluation requirement.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Reproduction Summary
|
|
2
|
+
|
|
3
|
+
Use this summary for trusted reproduction attempts only. Exploratory debugging
|
|
4
|
+
belongs in `debug_outputs/` or `explore_outputs/`.
|
|
5
|
+
|
|
6
|
+
## Target
|
|
7
|
+
|
|
8
|
+
- Artifact:
|
|
9
|
+
- Paper or claim:
|
|
10
|
+
- Repository or dataset:
|
|
11
|
+
|
|
12
|
+
## Status
|
|
13
|
+
|
|
14
|
+
- Overall status: not-started
|
|
15
|
+
- Last checked:
|
|
16
|
+
- Main blocker:
|
|
17
|
+
|
|
18
|
+
## Result Mapping
|
|
19
|
+
|
|
20
|
+
| claim_or_result_id | command_id | observed_output | verdict | notes |
|
|
21
|
+
|---|---|---|---|---|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
round,seed_source_id,direction,tool_or_database,query_or_graph_call,found_count,new_after_dedup,promoted_to_seed_count,screening_status,date,notes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
source_id,title,authors,year,venue,method,dataset_or_sample,task_or_problem,key_claim,metric_or_result,limitations,relevance,citation_count_or_signal,identifiers,notes
|
|
1
|
+
source_id,bib_key,role,title,authors,year,venue,method,dataset_or_sample,task_or_problem,key_claim,metric_or_result,limitations,relevance,full_text_status,reading_status,synthesis_path,citation_count_or_signal,identifiers,notes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
source_id,role,reading_copy_path,start_location,end_location,status,reader,started_on,completed_on,notes
|
|
@@ -4,11 +4,40 @@
|
|
|
4
4
|
|
|
5
5
|
<fill: research question or review objective>
|
|
6
6
|
|
|
7
|
+
## Review Scale
|
|
8
|
+
|
|
9
|
+
- Scale: quick-scan | focused-sota | full-survey
|
|
10
|
+
- Target included papers:
|
|
11
|
+
- Core paper budget:
|
|
12
|
+
- Supporting paper budget:
|
|
13
|
+
- Citation-chasing hop budget:
|
|
14
|
+
- Stopping rule:
|
|
15
|
+
|
|
16
|
+
## Seed Set
|
|
17
|
+
|
|
18
|
+
| Seed ID | Source | Why It Is A Seed | Initial Role | Expansion Status |
|
|
19
|
+
|---|---|---|---|---|
|
|
20
|
+
|
|
21
|
+
## Concepts And Keywords
|
|
22
|
+
|
|
23
|
+
| Concept | Synonyms | Exclusion Terms | Notes |
|
|
24
|
+
|---|---|---|---|
|
|
25
|
+
|
|
7
26
|
## Sources Queried
|
|
8
27
|
|
|
9
28
|
| Source | Query | Date | Filters | Results | Notes |
|
|
10
29
|
|---|---|---:|---|---:|---|
|
|
11
30
|
|
|
31
|
+
## Citation Chasing
|
|
32
|
+
|
|
33
|
+
Record rounds in `sota/citation-chasing-log.csv`. Include backward references,
|
|
34
|
+
forward citations, promoted seeds, and saturation notes.
|
|
35
|
+
|
|
12
36
|
## Screening Notes
|
|
13
37
|
|
|
14
38
|
<fill: screening workflow, ambiguity, or reviewer notes>
|
|
39
|
+
|
|
40
|
+
## Blind Spots
|
|
41
|
+
|
|
42
|
+
<fill: databases not searched, inaccessible full text, language limits, venue
|
|
43
|
+
limits, missing citation graph coverage, or unresolved metadata issues>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -8,18 +8,36 @@ def test_core_research_structure_exists() -> None:
|
|
|
8
8
|
"configs/default.yaml",
|
|
9
9
|
"configs/capabilities.yaml",
|
|
10
10
|
"docs/agent/capability-profile.md",
|
|
11
|
+
"docs/agent/output-contracts.md",
|
|
12
|
+
"docs/agent/project-quality.md",
|
|
13
|
+
"docs/agent/repo-migration-playbook.md",
|
|
14
|
+
"docs/reproducibility/commands.md",
|
|
11
15
|
"scripts/README.md",
|
|
12
16
|
"notebooks/README.md",
|
|
13
17
|
"outputs/figures",
|
|
14
18
|
"outputs/tables",
|
|
15
19
|
"data/raw",
|
|
16
20
|
"analysis_outputs",
|
|
21
|
+
"analysis_outputs/claim-audit.md",
|
|
17
22
|
"artifacts/cache",
|
|
18
23
|
"artifacts/data",
|
|
19
24
|
"artifacts/models",
|
|
20
25
|
"artifacts/releases",
|
|
26
|
+
"artifacts/badge-evidence-ledger.csv",
|
|
27
|
+
"experiments/campaigns/autonomous-campaign-template.md",
|
|
28
|
+
"experiments/campaigns/frontier-results.tsv",
|
|
29
|
+
"repro_outputs/SUMMARY.md",
|
|
30
|
+
"repro_outputs/COMMANDS.md",
|
|
31
|
+
"repro_outputs/LOG.md",
|
|
32
|
+
"repro_outputs/PATCHES.md",
|
|
33
|
+
"repro_outputs/status.json",
|
|
34
|
+
"sources/markdown-linear",
|
|
21
35
|
"sources/source-ledger.csv",
|
|
36
|
+
"sota/reading-log.csv",
|
|
37
|
+
"sota/citation-chasing-log.csv",
|
|
22
38
|
"sota/literature-matrix.csv",
|
|
39
|
+
"sota/paper-syntheses",
|
|
40
|
+
"reports/paper/sota-survey.tex",
|
|
23
41
|
"wiki/index.md",
|
|
24
42
|
"wiki/log.md",
|
|
25
43
|
"wiki/templates/source-page.md",
|