paper-manager 0.1.0 → 0.2.0
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 +85 -23
- package/dist/commands/config.js +15 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/config/init.d.ts +10 -0
- package/dist/config/init.js +53 -0
- package/dist/config/init.js.map +1 -0
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -1,38 +1,100 @@
|
|
|
1
|
-
#
|
|
1
|
+
# paper-manager
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/paper-manager)
|
|
4
|
+
[](https://github.com/EurFelux/paper-manager/blob/main/LICENSE)
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
A CLI tool for managing academic papers with knowledge base and vector search support.
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
- **oxlint** — Fast linter with type-aware rules (via `oxlint-tsgolint`)
|
|
9
|
-
- **oxfmt** — Fast formatter
|
|
8
|
+
## Installation
|
|
10
9
|
|
|
11
|
-
|
|
10
|
+
```bash
|
|
11
|
+
npm install -g paper-manager
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
pnpm install -g paper-manager
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
bun install -g paper-manager
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Quick Start
|
|
12
23
|
|
|
13
24
|
```bash
|
|
14
|
-
#
|
|
15
|
-
|
|
25
|
+
# Initialize data directory
|
|
26
|
+
paper config init --user
|
|
16
27
|
|
|
17
|
-
#
|
|
18
|
-
|
|
28
|
+
# Configure an embedding model
|
|
29
|
+
paper config set embeddingModels '{"openai-small":{"provider":"openai","model":"text-embedding-3-small","apiKey":"sk-...","dimensions":1536}}' --user
|
|
30
|
+
paper config set defaultEmbeddingModelId '"openai-small"' --user
|
|
19
31
|
|
|
20
|
-
#
|
|
21
|
-
|
|
32
|
+
# Create a knowledge base
|
|
33
|
+
paper kb create my-papers -d "My research papers"
|
|
22
34
|
|
|
23
|
-
#
|
|
24
|
-
|
|
35
|
+
# Add a paper
|
|
36
|
+
paper lit add <knowledge-base-id> ./paper.pdf
|
|
37
|
+
|
|
38
|
+
# Search across papers
|
|
39
|
+
paper kb query <knowledge-base-id> "attention mechanism"
|
|
25
40
|
```
|
|
26
41
|
|
|
27
|
-
##
|
|
42
|
+
## Commands
|
|
43
|
+
|
|
44
|
+
### Configuration (`paper config`)
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
paper config init [--user] # Initialize data directory structure
|
|
48
|
+
paper config get <key> [--user] # Get a config value
|
|
49
|
+
paper config set <key> <value> [--user] # Set a config value
|
|
50
|
+
paper config remove <key> [--user] # Remove a config key
|
|
51
|
+
paper config list [--user] # List all config
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Knowledge Base (`paper kb`)
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
paper kb create <name> -d <desc> [-e <model-id>] [--user] # Create a knowledge base
|
|
58
|
+
paper kb list [--all | --user] # List knowledge bases
|
|
59
|
+
paper kb remove <id> # Remove a knowledge base
|
|
60
|
+
paper kb query <id> <query-text> # Query a knowledge base
|
|
61
|
+
```
|
|
28
62
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
63
|
+
### Literature (`paper lit`)
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
paper lit add <kb-id> <pdf-path> # Add a literature from PDF
|
|
67
|
+
paper lit remove <kb-id> <id> # Remove a literature
|
|
68
|
+
paper lit update <kb-id> <id> [opts] # Update literature metadata
|
|
69
|
+
paper lit list <kb-id> # List literatures
|
|
70
|
+
paper lit show <kb-id> <id> # Show literature details
|
|
71
|
+
paper lit note list <lit-id> # List notes
|
|
72
|
+
paper lit note set <lit-id> <k> <v> # Set a note
|
|
73
|
+
paper lit note remove <lit-id> <key> # Remove a note
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Data Storage
|
|
77
|
+
|
|
78
|
+
- **User data**: `~/.paper-manager/` — global config, personal knowledge bases
|
|
79
|
+
- **Project data**: `./.paper-manager/` — project-specific knowledge bases
|
|
80
|
+
|
|
81
|
+
Project config takes priority over user config.
|
|
82
|
+
|
|
83
|
+
## Agent Skill
|
|
84
|
+
|
|
85
|
+
Install as a skill to let coding agent manage your papers (Powered by [vercel-labs/skills](https://github.com/vercel-labs/skills)):
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
npx skills add https://github.com/EurFelux/paper-manager
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
pnpx skills add https://github.com/EurFelux/paper-manager
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
bunx skills add https://github.com/EurFelux/paper-manager
|
|
97
|
+
```
|
|
36
98
|
|
|
37
99
|
## License
|
|
38
100
|
|
package/dist/commands/config.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { listConfig, loadMergedConfig, removeConfig, setConfig } from "../config/index.js";
|
|
3
|
+
import { initScope } from "../config/init.js";
|
|
3
4
|
export function createConfigCommand() {
|
|
4
5
|
const config = new Command("config").description("Manage configuration");
|
|
5
6
|
config
|
|
@@ -52,6 +53,20 @@ export function createConfigCommand() {
|
|
|
52
53
|
console.log(JSON.stringify(result, null, 2));
|
|
53
54
|
}
|
|
54
55
|
});
|
|
56
|
+
config
|
|
57
|
+
.command("init")
|
|
58
|
+
.description("Initialize data directory for current scope")
|
|
59
|
+
.option("--user", "Initialize user scope (~/.paper-manager)")
|
|
60
|
+
.action((options) => {
|
|
61
|
+
const scopeLabel = options.user ? "user" : "project";
|
|
62
|
+
const result = initScope({ user: options.user });
|
|
63
|
+
console.log(`Initializing ${scopeLabel} scope: ${result.baseDir}\n`);
|
|
64
|
+
for (const item of result.items) {
|
|
65
|
+
const icon = item.status === "created" ? "+" : "=";
|
|
66
|
+
console.log(` [${icon}] ${item.name} (${item.status})`);
|
|
67
|
+
}
|
|
68
|
+
console.log(`\nDone.`);
|
|
69
|
+
});
|
|
55
70
|
return config;
|
|
56
71
|
}
|
|
57
72
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { initializeDatabase, openDatabase } from "../db/index.js";
|
|
4
|
+
import { getPdfDir, getProjectDataDir, getUserDataDir, getVectorStoreDir, writeConfigFile, } from "./index.js";
|
|
5
|
+
export function initScope(options) {
|
|
6
|
+
const baseDir = options?.user ? getUserDataDir() : getProjectDataDir();
|
|
7
|
+
const items = [];
|
|
8
|
+
// 1. Base directory
|
|
9
|
+
if (fs.existsSync(baseDir)) {
|
|
10
|
+
items.push({ name: baseDir, status: "exists" });
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
fs.mkdirSync(baseDir, { recursive: true });
|
|
14
|
+
items.push({ name: baseDir, status: "created" });
|
|
15
|
+
}
|
|
16
|
+
// 2. config.json — create empty object if missing, preserve if exists
|
|
17
|
+
const configPath = path.join(baseDir, "config.json");
|
|
18
|
+
if (fs.existsSync(configPath)) {
|
|
19
|
+
items.push({ name: "config.json", status: "exists" });
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
writeConfigFile(configPath, {});
|
|
23
|
+
items.push({ name: "config.json", status: "created" });
|
|
24
|
+
}
|
|
25
|
+
// 3. papers.db — open, initialize tables, then close
|
|
26
|
+
// (avoid polluting the singleton cache; the lazy getter will re-open when needed)
|
|
27
|
+
const dbPath = path.join(baseDir, "papers.db");
|
|
28
|
+
const dbExisted = fs.existsSync(dbPath);
|
|
29
|
+
const db = openDatabase(dbPath);
|
|
30
|
+
initializeDatabase(db);
|
|
31
|
+
db.close();
|
|
32
|
+
items.push({ name: "papers.db", status: dbExisted ? "exists" : "created" });
|
|
33
|
+
// 4. pdfs/ directory
|
|
34
|
+
const pdfDir = getPdfDir(baseDir);
|
|
35
|
+
if (fs.existsSync(pdfDir)) {
|
|
36
|
+
items.push({ name: "pdfs/", status: "exists" });
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
fs.mkdirSync(pdfDir, { recursive: true });
|
|
40
|
+
items.push({ name: "pdfs/", status: "created" });
|
|
41
|
+
}
|
|
42
|
+
// 5. vector-stores/ directory
|
|
43
|
+
const vectorDir = getVectorStoreDir(baseDir);
|
|
44
|
+
if (fs.existsSync(vectorDir)) {
|
|
45
|
+
items.push({ name: "vector-stores/", status: "exists" });
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
fs.mkdirSync(vectorDir, { recursive: true });
|
|
49
|
+
items.push({ name: "vector-stores/", status: "created" });
|
|
50
|
+
}
|
|
51
|
+
return { baseDir, items };
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/config/init.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "paper-manager",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A paper management system.",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "EurFelux",
|
|
8
|
+
"homepage": "https://github.com/EurFelux/paper-manager",
|
|
9
|
+
"repository": {
|
|
10
|
+
"url": "https://github.com/EurFelux/paper-manager"
|
|
11
|
+
},
|
|
8
12
|
"bin": {
|
|
9
13
|
"paper": "dist/index.js"
|
|
10
14
|
},
|