create-academic-research 0.1.1 → 0.1.3
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 +15 -10
- package/dist/src/capabilities.d.ts +1 -1
- package/dist/src/capabilities.js +5 -4
- package/dist/src/cli.js +10 -5
- package/dist/src/project.js +1 -1
- package/dist/src/stack.js +4 -4
- package/package.json +1 -1
- package/template/README.md +5 -4
- package/template/configs/capabilities.yaml +1 -1
- package/template/docs/agent/capability-profile.md +1 -1
- package/template/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,6 +14,9 @@ Equivalent explicit form:
|
|
|
14
14
|
npx create-academic-research@latest my-project
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
+
Prefer the explicit `@latest` form. Some npm/npx versions reuse an older
|
|
18
|
+
cached creator when the version is omitted.
|
|
19
|
+
|
|
17
20
|
From GitHub:
|
|
18
21
|
|
|
19
22
|
```bash
|
|
@@ -31,10 +34,10 @@ software engineering, databases, theory, robotics, IR, PL, graphics, and
|
|
|
31
34
|
adjacent interdisciplinary CS.
|
|
32
35
|
|
|
33
36
|
The generated repository is agent-neutral. By default the wizard records
|
|
34
|
-
`agent:
|
|
35
|
-
generic MCP snippets. Use `--agent <name>` only when you want to
|
|
36
|
-
specific target recognized by the `skills` CLI, such as `claude-code`,
|
|
37
|
-
`cursor`, `windsurf`, or another supported local loader.
|
|
37
|
+
`agent: universal`, installs one shared project-local `.agents/skills` copy,
|
|
38
|
+
and writes generic MCP snippets. Use `--agent <name>` only when you want to
|
|
39
|
+
force a specific target recognized by the `skills` CLI, such as `claude-code`,
|
|
40
|
+
`codex`, `cursor`, `windsurf`, or another supported local loader.
|
|
38
41
|
|
|
39
42
|
## Default Experience
|
|
40
43
|
|
|
@@ -112,10 +115,10 @@ MCP commands are split by side-effect:
|
|
|
112
115
|
| `mcp list` | List known MCP servers with enabled/available status. |
|
|
113
116
|
| `mcp enabled` | List only enabled MCP server ids. |
|
|
114
117
|
| `mcp available` | List the local MCP catalog. |
|
|
115
|
-
| `mcp commands` | Print external install commands without running them. |
|
|
118
|
+
| `mcp commands` | Print finite external install commands without running them. Runtime-only `uvx`/`npx` servers may have no install command. |
|
|
116
119
|
| `mcp enable` | Enable an MCP server in project records and generated snippets. |
|
|
117
120
|
| `mcp disable` | Remove an MCP server from project records and generated snippets. |
|
|
118
|
-
| `mcp install` | Run
|
|
121
|
+
| `mcp install` | Run finite external tool install commands for selected MCP servers. It must not launch stdio MCP servers. |
|
|
119
122
|
| `mcp uninstall` | Run the external uninstall command when one exists. |
|
|
120
123
|
| `mcp doctor` | Validate enabled MCP records and generated snippets. |
|
|
121
124
|
|
|
@@ -131,8 +134,10 @@ The create wizard can install that project-local package automatically.
|
|
|
131
134
|
Those skills are portable `SKILL.md` instructions, but they require an
|
|
132
135
|
agent/runtime that can load skills or include the relevant instructions in
|
|
133
136
|
context. They are not automatic capabilities of every raw model API.
|
|
134
|
-
Use `--agent <agent>` for explicit
|
|
135
|
-
|
|
137
|
+
Use `--agent <agent>` for explicit setup, for example `--agent codex` or
|
|
138
|
+
`--agent claude-code`.
|
|
139
|
+
Avoid `--agent auto` for unattended setup: the upstream `skills` CLI may expand
|
|
140
|
+
it to every agent it detects on the machine.
|
|
136
141
|
|
|
137
142
|
Preset intent:
|
|
138
143
|
|
|
@@ -161,8 +166,8 @@ Releases are tag-driven. Update `package.json` and `package-lock.json`, commit
|
|
|
161
166
|
the change, create `vX.Y.Z`, and push the tag:
|
|
162
167
|
|
|
163
168
|
```bash
|
|
164
|
-
git tag -a v0.1.
|
|
165
|
-
git push origin main v0.1.
|
|
169
|
+
git tag -a v0.1.3 -m "v0.1.3"
|
|
170
|
+
git push origin main v0.1.3
|
|
166
171
|
```
|
|
167
172
|
|
|
168
173
|
Once the GitHub repository is public, the release workflow validates the tag
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Runner } from "./runner.js";
|
|
2
2
|
import { type McpToolCommandKey } from "./stack.js";
|
|
3
|
-
export declare const DEFAULT_AGENT = "
|
|
3
|
+
export declare const DEFAULT_AGENT = "universal";
|
|
4
4
|
export interface CapabilityState {
|
|
5
5
|
agent: string;
|
|
6
6
|
preset: string;
|
package/dist/src/capabilities.js
CHANGED
|
@@ -3,7 +3,8 @@ import { join, relative } from "node:path";
|
|
|
3
3
|
import YAML from "yaml";
|
|
4
4
|
import { defaultRunner } from "./runner.js";
|
|
5
5
|
import { AGENT_STACK, presetMcpServers } from "./stack.js";
|
|
6
|
-
export const DEFAULT_AGENT = "
|
|
6
|
+
export const DEFAULT_AGENT = "universal";
|
|
7
|
+
const AUTO_AGENT = "auto";
|
|
7
8
|
export async function readCapabilities(root) {
|
|
8
9
|
try {
|
|
9
10
|
return readCapabilitiesFile(root);
|
|
@@ -293,7 +294,7 @@ async function writeCapabilityProfile(root, state) {
|
|
|
293
294
|
lines.push(`- \`${name}\` (${status}): ${server?.smoke_test ?? "Smoke-test before use."}`);
|
|
294
295
|
}
|
|
295
296
|
}
|
|
296
|
-
lines.push("", "## Rules", "", "- Skill installation is project-local by default.", "- Agent target `
|
|
297
|
+
lines.push("", "## Rules", "", "- Skill installation is project-local by default.", "- Agent target `universal` installs one shared project-local `.agents/skills` copy.", "- MCP enable/disable changes project records; install/uninstall changes external tools.", "- Keep API keys, tokens, cookies, and browser sessions out of git.", "- Cite repository source records, not raw MCP output alone.", "");
|
|
297
298
|
await writeFile(join(root, "docs/agent/capability-profile.md"), lines.join("\n"), "utf8");
|
|
298
299
|
}
|
|
299
300
|
async function appendCapabilityLog(root, state) {
|
|
@@ -307,7 +308,7 @@ function dedupe(values) {
|
|
|
307
308
|
}
|
|
308
309
|
function renderSkillCommand(command, agent) {
|
|
309
310
|
const normalized = normalizeAgent(agent);
|
|
310
|
-
const agentFlag = normalized ===
|
|
311
|
+
const agentFlag = normalized === AUTO_AGENT ? "" : `--agent '${normalized}'`;
|
|
311
312
|
return command.replaceAll("{agent_flag}", agentFlag).replaceAll("{agent}", normalized);
|
|
312
313
|
}
|
|
313
314
|
async function readCapabilitiesFile(root) {
|
|
@@ -402,7 +403,7 @@ function normalizeAgent(agent) {
|
|
|
402
403
|
}
|
|
403
404
|
function mcpSnippetFileName(agent) {
|
|
404
405
|
const normalized = normalizeAgent(agent);
|
|
405
|
-
return normalized === DEFAULT_AGENT ? "mcp.json" : `${normalized}-mcp.json`;
|
|
406
|
+
return normalized === DEFAULT_AGENT || normalized === AUTO_AGENT ? "mcp.json" : `${normalized}-mcp.json`;
|
|
406
407
|
}
|
|
407
408
|
async function removeInactiveMcpSnippets(outputDir, activeFile) {
|
|
408
409
|
const entries = await readdir(outputDir);
|
package/dist/src/cli.js
CHANGED
|
@@ -224,7 +224,7 @@ async function mcpCommand(argv) {
|
|
|
224
224
|
const enabled = new Set(state.mcp_servers ?? []);
|
|
225
225
|
for (const [name, server] of Object.entries(AGENT_STACK.mcp_servers)) {
|
|
226
226
|
const status = enabled.has(name) ? "enabled" : "available";
|
|
227
|
-
const installer = server.install_command
|
|
227
|
+
const installer = mcpInstallMode(server.install_command, server.command);
|
|
228
228
|
console.log(`${status}\t${name}\t${server.source_need}\t${installer}`);
|
|
229
229
|
}
|
|
230
230
|
return 0;
|
|
@@ -242,7 +242,7 @@ async function mcpCommand(argv) {
|
|
|
242
242
|
assertOnlyOptions(parsed.flags, "mcp available", []);
|
|
243
243
|
assertNoArguments(parsed.positionals, "mcp available");
|
|
244
244
|
for (const [name, server] of Object.entries(AGENT_STACK.mcp_servers)) {
|
|
245
|
-
const installer = server.install_command
|
|
245
|
+
const installer = mcpInstallMode(server.install_command, server.command);
|
|
246
246
|
console.log(`${name}\t${server.source_need}\t${installer}`);
|
|
247
247
|
}
|
|
248
248
|
return 0;
|
|
@@ -383,6 +383,11 @@ function assertOnlyOptions(flags, command, allowedOptions) {
|
|
|
383
383
|
throw new Error(`${command} does not accept ${unexpected.map((name) => `--${name}`).join(", ")}`);
|
|
384
384
|
}
|
|
385
385
|
}
|
|
386
|
+
function mcpInstallMode(installCommand, runtimeCommand) {
|
|
387
|
+
if (installCommand)
|
|
388
|
+
return installCommand;
|
|
389
|
+
return runtimeCommand ? "runtime-only" : "manual";
|
|
390
|
+
}
|
|
386
391
|
function printCreateHelp() {
|
|
387
392
|
console.log([
|
|
388
393
|
"Usage: create-academic-research <project-name> [options]",
|
|
@@ -396,10 +401,10 @@ function printCreateHelp() {
|
|
|
396
401
|
" --package <name> Python package name. Default: normalized project name.",
|
|
397
402
|
" --preset <name> Capability preset: minimal, default, enhanced, literature, writing, full.",
|
|
398
403
|
" --profile <name> Project profile metadata. Default: academic-general.",
|
|
399
|
-
" --agent <name> Agent target. Default:
|
|
404
|
+
" --agent <name> Agent target. Default: universal.",
|
|
400
405
|
" --install-skills Install project-local skills without prompting.",
|
|
401
406
|
" --no-install-skills Skip project-local skill installation.",
|
|
402
|
-
" --install-mcp-tools Run external MCP install commands after creation.",
|
|
407
|
+
" --install-mcp-tools Run finite external MCP install commands after creation.",
|
|
403
408
|
" -h, --help Show this help.",
|
|
404
409
|
" -v, --version Show package version."
|
|
405
410
|
].join("\n"));
|
|
@@ -441,7 +446,7 @@ function printMcpHelp() {
|
|
|
441
446
|
console.log([
|
|
442
447
|
"Usage: academic-research mcp <list|enabled|available|commands|enable|disable|install|uninstall|doctor> [servers...]",
|
|
443
448
|
"",
|
|
444
|
-
"Manage MCP records and
|
|
449
|
+
"Manage MCP records and finite external MCP tool installs.",
|
|
445
450
|
"",
|
|
446
451
|
"Options:",
|
|
447
452
|
" --root <path> Project root for project-state commands.",
|
package/dist/src/project.js
CHANGED
|
@@ -205,7 +205,7 @@ async function writeGeneratedPackageJson(root, { slug }) {
|
|
|
205
205
|
const path = join(root, "package.json");
|
|
206
206
|
const data = await readJson(path);
|
|
207
207
|
const existingSpec = data.devDependencies?.["create-academic-research"];
|
|
208
|
-
const packageSpec = process.env.CREATE_ACADEMIC_RESEARCH_PACKAGE_SPEC ?? existingSpec ?? "^0.1.
|
|
208
|
+
const packageSpec = process.env.CREATE_ACADEMIC_RESEARCH_PACKAGE_SPEC ?? existingSpec ?? "^0.1.3";
|
|
209
209
|
data.name = slug;
|
|
210
210
|
data.devDependencies = {
|
|
211
211
|
...(data.devDependencies ?? {}),
|
package/dist/src/stack.js
CHANGED
|
@@ -112,7 +112,7 @@ export const AGENT_STACK = {
|
|
|
112
112
|
"semantic-scholar": {
|
|
113
113
|
priority: "default",
|
|
114
114
|
source_need: "Semantic Scholar papers, citations, authors, and recommendations.",
|
|
115
|
-
install_command: "
|
|
115
|
+
install_command: "",
|
|
116
116
|
uninstall_command: "",
|
|
117
117
|
command: "uvx",
|
|
118
118
|
args: ["--from", "git+https://github.com/akapet00/semantic-scholar-mcp", "semantic-scholar-mcp"],
|
|
@@ -123,7 +123,7 @@ export const AGENT_STACK = {
|
|
|
123
123
|
openalex: {
|
|
124
124
|
priority: "default",
|
|
125
125
|
source_need: "OpenAlex broad scholarly graph.",
|
|
126
|
-
install_command: "
|
|
126
|
+
install_command: "",
|
|
127
127
|
uninstall_command: "",
|
|
128
128
|
command: "npx",
|
|
129
129
|
args: ["-y", "@cyanheads/openalex-mcp-server"],
|
|
@@ -145,7 +145,7 @@ export const AGENT_STACK = {
|
|
|
145
145
|
pubmed: {
|
|
146
146
|
priority: "domain-specific",
|
|
147
147
|
source_need: "PubMed and biomedical literature.",
|
|
148
|
-
install_command: "
|
|
148
|
+
install_command: "",
|
|
149
149
|
uninstall_command: "",
|
|
150
150
|
command: "npx",
|
|
151
151
|
args: ["-y", "@cyanheads/pubmed-mcp-server"],
|
|
@@ -156,7 +156,7 @@ export const AGENT_STACK = {
|
|
|
156
156
|
zotero: {
|
|
157
157
|
priority: "local-library",
|
|
158
158
|
source_need: "Zotero local library and attachments.",
|
|
159
|
-
install_command: "
|
|
159
|
+
install_command: "",
|
|
160
160
|
uninstall_command: "",
|
|
161
161
|
command: "uvx",
|
|
162
162
|
args: ["zoty", "mcp"],
|
package/package.json
CHANGED
package/template/README.md
CHANGED
|
@@ -16,7 +16,8 @@ actual discipline. The companion `academic-research-skills` package gives
|
|
|
16
16
|
first-class support to computer science research while keeping the repository
|
|
17
17
|
structure useful for broader academic work.
|
|
18
18
|
|
|
19
|
-
The repository is agent-neutral. Capability state uses `agent:
|
|
19
|
+
The repository is agent-neutral. Capability state uses `agent: universal` by
|
|
20
|
+
default, which installs one shared project-local `.agents/skills` copy unless a
|
|
20
21
|
specific agent target is selected with `--agent`.
|
|
21
22
|
|
|
22
23
|
## Quickstart
|
|
@@ -64,9 +65,9 @@ npx academic-research mcp install arxiv
|
|
|
64
65
|
|
|
65
66
|
`skills list` reports installed project-local skills. `skills presets` reports
|
|
66
67
|
available install presets. `mcp enable` changes project records. `mcp commands`
|
|
67
|
-
prints external install commands without running them. `mcp install`
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
prints finite external install commands without running them. `mcp install`
|
|
69
|
+
runs only finite tool installation commands; runtime-only `uvx`/`npx` MCP
|
|
70
|
+
servers may have no install step and are started later by the MCP client.
|
|
70
71
|
|
|
71
72
|
`default` installs the companion academic research skill package and keeps the
|
|
72
73
|
MCP records focused on core scholarly discovery. `enhanced` adds complementary
|