@backendkit-labs/curator-codex-agent 0.2.0 → 1.0.1
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/dist/analyzer.d.ts +1 -17
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +80 -163
- package/dist/analyzer.js.map +1 -1
- package/dist/audit.d.ts +27 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +43 -0
- package/dist/audit.js.map +1 -0
- package/dist/checksum.d.ts +0 -22
- package/dist/checksum.d.ts.map +1 -1
- package/dist/checksum.js +14 -103
- package/dist/checksum.js.map +1 -1
- package/dist/documentation-curator.d.ts +1 -1
- package/dist/documentation-curator.d.ts.map +1 -1
- package/dist/documentation-curator.js +79 -95
- package/dist/documentation-curator.js.map +1 -1
- package/dist/index.d.ts +19 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -22
- package/dist/index.js.map +1 -1
- package/dist/knowledge/embedder-worker.d.ts +2 -0
- package/dist/knowledge/embedder-worker.d.ts.map +1 -0
- package/dist/knowledge/embedder-worker.js +55 -0
- package/dist/knowledge/embedder-worker.js.map +1 -0
- package/dist/knowledge/engine.d.ts +10 -56
- package/dist/knowledge/engine.d.ts.map +1 -1
- package/dist/knowledge/engine.js +42 -153
- package/dist/knowledge/engine.js.map +1 -1
- package/dist/knowledge/rag-provider.d.ts +14 -56
- package/dist/knowledge/rag-provider.d.ts.map +1 -1
- package/dist/knowledge/rag-provider.js +63 -154
- package/dist/knowledge/rag-provider.js.map +1 -1
- package/dist/knowledge/synthesis.d.ts +0 -10
- package/dist/knowledge/synthesis.d.ts.map +1 -1
- package/dist/knowledge/synthesis.js +32 -77
- package/dist/knowledge/synthesis.js.map +1 -1
- package/dist/knowledge/transformers-embedder.d.ts +61 -0
- package/dist/knowledge/transformers-embedder.d.ts.map +1 -0
- package/dist/knowledge/transformers-embedder.js +222 -0
- package/dist/knowledge/transformers-embedder.js.map +1 -0
- package/dist/pdf-reader.d.ts +11 -0
- package/dist/pdf-reader.d.ts.map +1 -0
- package/dist/pdf-reader.js +21 -0
- package/dist/pdf-reader.js.map +1 -0
- package/dist/project.d.ts +28 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +88 -0
- package/dist/project.js.map +1 -0
- package/dist/providers/anthropic-adapter.d.ts +2 -2
- package/dist/providers/anthropic-adapter.d.ts.map +1 -1
- package/dist/providers/anthropic-adapter.js +7 -13
- package/dist/providers/anthropic-adapter.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +13 -20
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai-adapter.d.ts +2 -2
- package/dist/providers/openai-adapter.d.ts.map +1 -1
- package/dist/providers/openai-adapter.js +7 -13
- package/dist/providers/openai-adapter.js.map +1 -1
- package/dist/providers/types.d.ts +8 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +1 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -3
- package/dist/types.js.map +1 -1
- package/dist/vault-dedup.d.ts +35 -0
- package/dist/vault-dedup.d.ts.map +1 -0
- package/dist/vault-dedup.js +130 -0
- package/dist/vault-dedup.js.map +1 -0
- package/package.json +45 -58
- package/AGENT.md +0 -187
- package/README.md +0 -475
- package/dist/api/config.d.ts +0 -57
- package/dist/api/config.d.ts.map +0 -1
- package/dist/api/config.js +0 -183
- package/dist/api/config.js.map +0 -1
- package/dist/api/http-server.d.ts +0 -24
- package/dist/api/http-server.d.ts.map +0 -1
- package/dist/api/http-server.js +0 -108
- package/dist/api/http-server.js.map +0 -1
- package/dist/api/routes.d.ts +0 -8
- package/dist/api/routes.d.ts.map +0 -1
- package/dist/api/routes.js +0 -382
- package/dist/api/routes.js.map +0 -1
- package/dist/api/security.d.ts +0 -107
- package/dist/api/security.d.ts.map +0 -1
- package/dist/api/security.js +0 -200
- package/dist/api/security.js.map +0 -1
- package/dist/http-server-main.d.ts +0 -28
- package/dist/http-server-main.d.ts.map +0 -1
- package/dist/http-server-main.js +0 -69
- package/dist/http-server-main.js.map +0 -1
- package/dist/server.d.ts +0 -33
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -640
- package/dist/server.js.map +0 -1
- package/dist/watcher.d.ts +0 -26
- package/dist/watcher.d.ts.map +0 -1
- package/dist/watcher.js +0 -168
- package/dist/watcher.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC5B;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAChG"}
|
package/dist/providers/types.js
CHANGED
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,GAAG,aAAa,CAAC;IACpF,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,iBAAiB,CAAC;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
|
package/dist/types.js
CHANGED
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normaliza una ruta de origen a una forma canónica estable:
|
|
3
|
+
* absoluta y con `/` como separador (evita problemas de comparación
|
|
4
|
+
* entre Windows y POSIX, y de escapes YAML al guardarla en frontmatter).
|
|
5
|
+
*/
|
|
6
|
+
export declare function normalizeSourcePath(p: string): string;
|
|
7
|
+
/** Extrae el valor de `source_path` del frontmatter de una nota, o null. */
|
|
8
|
+
export declare function readSourcePath(content: string): string | null;
|
|
9
|
+
/**
|
|
10
|
+
* Elimina del vault todas las notas previamente generadas desde el mismo
|
|
11
|
+
* archivo de origen (match por `source_path`). Devuelve cuántas borró.
|
|
12
|
+
*
|
|
13
|
+
* Permite re-curar un archivo sin acumular duplicados cuando el LLM genera
|
|
14
|
+
* un título distinto en cada corrida (el dedup por nombre de archivo fallaba
|
|
15
|
+
* porque el slug del título cambiaba).
|
|
16
|
+
*/
|
|
17
|
+
export declare function removeNotesForSource(vaultPath: string, sourcePath: string): Promise<number>;
|
|
18
|
+
export interface OrphanedNote {
|
|
19
|
+
/** Absolute path to the orphaned note file. */
|
|
20
|
+
notePath: string;
|
|
21
|
+
/** The source_path recorded in its frontmatter — the file that no longer exists. */
|
|
22
|
+
sourcePath: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Finds notes whose `source_path` frontmatter points at a file that no longer
|
|
26
|
+
* exists on disk. Read-only — never deletes anything.
|
|
27
|
+
*
|
|
28
|
+
* removeNotesForSource() only fires when a file gets *re-curated*; a file that's
|
|
29
|
+
* simply deleted from the repo is never re-curated again, so its old note is
|
|
30
|
+
* never automatically cleaned up. This is the check for that gap.
|
|
31
|
+
*/
|
|
32
|
+
export declare function findOrphanedNotes(vaultPath: string): Promise<OrphanedNote[]>;
|
|
33
|
+
/** Deletes the given note files by absolute path. Returns how many were actually removed. */
|
|
34
|
+
export declare function deleteNotes(notePaths: string[]): Promise<number>;
|
|
35
|
+
//# sourceMappingURL=vault-dedup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-dedup.d.ts","sourceRoot":"","sources":["../src/vault-dedup.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK7D;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqCjG;AAED,MAAM,WAAW,YAAY;IACzB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAoClF;AAED,6FAA6F;AAC7F,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAWtE"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Normaliza una ruta de origen a una forma canónica estable:
|
|
5
|
+
* absoluta y con `/` como separador (evita problemas de comparación
|
|
6
|
+
* entre Windows y POSIX, y de escapes YAML al guardarla en frontmatter).
|
|
7
|
+
*/
|
|
8
|
+
export function normalizeSourcePath(p) {
|
|
9
|
+
return path.resolve(p).replace(/\\/g, '/');
|
|
10
|
+
}
|
|
11
|
+
/** Extrae el valor de `source_path` del frontmatter de una nota, o null. */
|
|
12
|
+
export function readSourcePath(content) {
|
|
13
|
+
const fm = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
14
|
+
if (!fm)
|
|
15
|
+
return null;
|
|
16
|
+
const m = fm[1].match(/^source_path:\s*"?(.+?)"?\s*$/m);
|
|
17
|
+
return m ? m[1].trim() : null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Elimina del vault todas las notas previamente generadas desde el mismo
|
|
21
|
+
* archivo de origen (match por `source_path`). Devuelve cuántas borró.
|
|
22
|
+
*
|
|
23
|
+
* Permite re-curar un archivo sin acumular duplicados cuando el LLM genera
|
|
24
|
+
* un título distinto en cada corrida (el dedup por nombre de archivo fallaba
|
|
25
|
+
* porque el slug del título cambiaba).
|
|
26
|
+
*/
|
|
27
|
+
export async function removeNotesForSource(vaultPath, sourcePath) {
|
|
28
|
+
const target = normalizeSourcePath(sourcePath);
|
|
29
|
+
let removed = 0;
|
|
30
|
+
async function walk(dir) {
|
|
31
|
+
let entries;
|
|
32
|
+
try {
|
|
33
|
+
entries = await fs.readdir(dir, { withFileTypes: true, encoding: 'utf8' });
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
for (const entry of entries) {
|
|
39
|
+
const full = path.join(dir, entry.name);
|
|
40
|
+
if (entry.isDirectory()) {
|
|
41
|
+
if (!entry.name.startsWith('.'))
|
|
42
|
+
await walk(full);
|
|
43
|
+
}
|
|
44
|
+
else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
45
|
+
let content;
|
|
46
|
+
try {
|
|
47
|
+
content = await fs.readFile(full, 'utf-8');
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const sp = readSourcePath(content);
|
|
53
|
+
if (sp && normalizeSourcePath(sp) === target) {
|
|
54
|
+
try {
|
|
55
|
+
await fs.unlink(full);
|
|
56
|
+
removed++;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
/* ignore */
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
await walk(vaultPath);
|
|
66
|
+
return removed;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Finds notes whose `source_path` frontmatter points at a file that no longer
|
|
70
|
+
* exists on disk. Read-only — never deletes anything.
|
|
71
|
+
*
|
|
72
|
+
* removeNotesForSource() only fires when a file gets *re-curated*; a file that's
|
|
73
|
+
* simply deleted from the repo is never re-curated again, so its old note is
|
|
74
|
+
* never automatically cleaned up. This is the check for that gap.
|
|
75
|
+
*/
|
|
76
|
+
export async function findOrphanedNotes(vaultPath) {
|
|
77
|
+
const orphans = [];
|
|
78
|
+
async function walk(dir) {
|
|
79
|
+
let entries;
|
|
80
|
+
try {
|
|
81
|
+
entries = await fs.readdir(dir, { withFileTypes: true, encoding: 'utf8' });
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
for (const entry of entries) {
|
|
87
|
+
const full = path.join(dir, entry.name);
|
|
88
|
+
if (entry.isDirectory()) {
|
|
89
|
+
if (!entry.name.startsWith('.'))
|
|
90
|
+
await walk(full);
|
|
91
|
+
}
|
|
92
|
+
else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
93
|
+
let content;
|
|
94
|
+
try {
|
|
95
|
+
content = await fs.readFile(full, 'utf-8');
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const sp = readSourcePath(content);
|
|
101
|
+
// Notes without a source_path (hand-written, or curated from a URL rather
|
|
102
|
+
// than a local file) aren't in scope — there's no local file to check.
|
|
103
|
+
if (!sp)
|
|
104
|
+
continue;
|
|
105
|
+
const normalized = normalizeSourcePath(sp);
|
|
106
|
+
const exists = await fs.access(normalized).then(() => true).catch(() => false);
|
|
107
|
+
if (!exists) {
|
|
108
|
+
orphans.push({ notePath: full, sourcePath: normalized });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
await walk(vaultPath);
|
|
114
|
+
return orphans;
|
|
115
|
+
}
|
|
116
|
+
/** Deletes the given note files by absolute path. Returns how many were actually removed. */
|
|
117
|
+
export async function deleteNotes(notePaths) {
|
|
118
|
+
let removed = 0;
|
|
119
|
+
for (const p of notePaths) {
|
|
120
|
+
try {
|
|
121
|
+
await fs.unlink(p);
|
|
122
|
+
removed++;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
/* ignore */
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return removed;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=vault-dedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-dedup.js","sourceRoot":"","sources":["../src/vault-dedup.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,58 +1,45 @@
|
|
|
1
|
-
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
47
|
-
"dotenv": "^16.4.5",
|
|
48
|
-
"express": "^4.18.0",
|
|
49
|
-
"express-rate-limit": "^7.1.0",
|
|
50
|
-
"openai": "^4.0.0",
|
|
51
|
-
"winston": "^3.11.0",
|
|
52
|
-
"zod": "^3.25.0"
|
|
53
|
-
},
|
|
54
|
-
"devDependencies": {
|
|
55
|
-
"@types/node": "^20.0.0",
|
|
56
|
-
"typescript": "^5.4.0"
|
|
57
|
-
}
|
|
58
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@backendkit-labs/curator-codex-agent",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Codex Curator — intelligent source code and documentation analysis, vault deduplication, and RAG knowledge extraction, as a reusable library.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": { "types": "./dist/index.d.ts", "default": "./dist/index.js" }
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist/"
|
|
13
|
+
],
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/BackendKit-labs/backendkit-agents.git",
|
|
17
|
+
"directory": "packages/curator-codex-agent"
|
|
18
|
+
},
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=20.0.0"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc --noCheck",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"prepublishOnly": "npm run build"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@backendkit-labs/agent-enterprise": "^0.4.0",
|
|
33
|
+
"@backendkit-labs/infra": "^0.1.0",
|
|
34
|
+
"@anthropic-ai/sdk": "^0.55.0",
|
|
35
|
+
"@xenova/transformers": "^2.17.2",
|
|
36
|
+
"openai": "^4.0.0",
|
|
37
|
+
"pdf-parse": "^2.4.5",
|
|
38
|
+
"zod": "^3.25.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/node": "^20.0.0",
|
|
42
|
+
"@types/pdf-parse": "^1.1.5",
|
|
43
|
+
"typescript": "^5.4.0"
|
|
44
|
+
}
|
|
45
|
+
}
|
package/AGENT.md
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
# curator-codex-agent
|
|
2
|
-
|
|
3
|
-
**Unified Code + Documentation Curator**. Recursively analyzes both source code files AND documentation (.md, .txt), discovers associated files, and extracts structured knowledge into enterprise vaults using LLM reasoning.
|
|
4
|
-
|
|
5
|
-
## Quick Start
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
# Analyze entire project (code + docs)
|
|
9
|
-
CURATOR_INPUT_PATH=/project \
|
|
10
|
-
CURATOR_OUTPUT_PATH=/vault \
|
|
11
|
-
CURATOR_API_KEY=sk-... \
|
|
12
|
-
npm run watch-code
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Core Capabilities
|
|
16
|
-
|
|
17
|
-
1. **Unified Processing** — Analyzes both code (.ts, .js, .py, etc) AND docs (.md, .txt) in single pass
|
|
18
|
-
2. **Multi-language Code Analysis** — TypeScript, JavaScript, Python, Go, Rust, Java, C/C++, Kotlin, Swift
|
|
19
|
-
3. **Documentation Analysis** — Extracts policies, procedures, decisions, lessons from .md/.txt
|
|
20
|
-
4. **Smart Documentation Discovery** — Finds and combines associated .md files, README.md, project context
|
|
21
|
-
5. **Automatic Type Detection** — Routes files to appropriate analyzer (CodeAnalyzer or DocumentationCurator)
|
|
22
|
-
6. **Reasoning-based Extraction** — Uses deepseek-reasoner for deep understanding
|
|
23
|
-
7. **Change Detection** — Manifest-based tracking; only reanalyzes changed files
|
|
24
|
-
8. **Vault Integration** — Outputs semantic markdown notes with metadata
|
|
25
|
-
9. **MCP Server** — Runs as stdio or HTTP MCP server
|
|
26
|
-
|
|
27
|
-
## Key Features
|
|
28
|
-
|
|
29
|
-
- ✅ Recursive directory scanning
|
|
30
|
-
- ✅ Public API extraction (types, functions, classes, interfaces)
|
|
31
|
-
- ✅ Pattern & architecture detection
|
|
32
|
-
- ✅ Dependency mapping
|
|
33
|
-
- ✅ Documentation association (code.ts + code.md → combined analysis)
|
|
34
|
-
- ✅ Change tracking via SHA256 manifest
|
|
35
|
-
- ✅ Efficient reprocessing (skip unchanged files)
|
|
36
|
-
- ✅ Multi-provider support (DeepSeek, OpenAI, Anthropic, Ollama)
|
|
37
|
-
|
|
38
|
-
## Environment Variables
|
|
39
|
-
|
|
40
|
-
**Required:**
|
|
41
|
-
- `CURATOR_API_KEY` — LLM API key
|
|
42
|
-
- `CURATOR_OUTPUT_PATH` — Vault output directory
|
|
43
|
-
|
|
44
|
-
**Optional:**
|
|
45
|
-
- `CURATOR_INPUT_PATH` — Code directory to analyze once (default: watch mode)
|
|
46
|
-
- `CURATOR_PROVIDER` — LLM provider (default: deepseek)
|
|
47
|
-
- `CURATOR_MODEL` — Model ID (default: deepseek-reasoner)
|
|
48
|
-
- `CURATOR_PORT` — HTTP port for MCP (default: stdio transport)
|
|
49
|
-
|
|
50
|
-
See `.env.example` for all options.
|
|
51
|
-
|
|
52
|
-
## Architecture
|
|
53
|
-
|
|
54
|
-
```
|
|
55
|
-
CodeAnalyzer
|
|
56
|
-
├── findAssociatedDocs() — Discovers code.md, README.md, etc
|
|
57
|
-
├── analyzeFile() — Analyzes single file + combined docs
|
|
58
|
-
├── callLLM() — Sends to reasoning model
|
|
59
|
-
└── writeNote() — Outputs to vault
|
|
60
|
-
|
|
61
|
-
Manifest System
|
|
62
|
-
├── calculateFileHash() — SHA256 tracking
|
|
63
|
-
├── loadManifest() — Read .codex-manifest.json
|
|
64
|
-
├── hasFileChanged() — Detect changes
|
|
65
|
-
└── saveManifest() — Update tracking
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
## Vault Output
|
|
69
|
-
|
|
70
|
-
Generates markdown files with frontmatter per analyzed module:
|
|
71
|
-
|
|
72
|
-
```markdown
|
|
73
|
-
---
|
|
74
|
-
title: "AuthService: JWT-based Authentication"
|
|
75
|
-
area: general
|
|
76
|
-
tipo: componente
|
|
77
|
-
language: typescript
|
|
78
|
-
resumen: "NestJS service for JWT-based authentication..."
|
|
79
|
-
source_ref: "src/services/auth.service.ts"
|
|
80
|
-
sources_combined: ["src/services/auth.service.ts", "src/services/auth.service.md"]
|
|
81
|
-
depends_on: ["@nestjs/jwt", "@backendkit-labs/result"]
|
|
82
|
-
exports: ["AuthService", "login", "validateToken"]
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## Overview
|
|
86
|
-
...
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## Usage Modes
|
|
90
|
-
|
|
91
|
-
1. **Direct Analysis** (single run):
|
|
92
|
-
```bash
|
|
93
|
-
CURATOR_INPUT_PATH=/project npm run watch-code
|
|
94
|
-
# Analyzes once, exits
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
2. **Watch Mode** (continuous):
|
|
98
|
-
```bash
|
|
99
|
-
npm start
|
|
100
|
-
# Polls vault/incoming/ every 30s
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
3. **MCP Server**:
|
|
104
|
-
```bash
|
|
105
|
-
CURATOR_PORT=3101 npm start
|
|
106
|
-
# HTTP MCP server
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## Performance
|
|
110
|
-
|
|
111
|
-
- 3-8 seconds per file (reasoning model)
|
|
112
|
-
- Skipped files: < 100ms
|
|
113
|
-
- 500 files, 1st run: ~40-60 min
|
|
114
|
-
- 500 files, 2nd run (1% changed): ~2-3 min
|
|
115
|
-
|
|
116
|
-
## Integration
|
|
117
|
-
|
|
118
|
-
### Claude Desktop
|
|
119
|
-
Add to `claude_desktop_config.json`:
|
|
120
|
-
```json
|
|
121
|
-
{
|
|
122
|
-
"mcpServers": {
|
|
123
|
-
"codex": {
|
|
124
|
-
"command": "npx",
|
|
125
|
-
"args": ["-y", "@backendkit-labs/curator-codex-agent"],
|
|
126
|
-
"env": {"CURATOR_API_KEY": "sk-...", "CURATOR_OUTPUT_PATH": "/vault"}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### bk-agent
|
|
133
|
-
Register as MCP skill in bk-agent manifest.
|
|
134
|
-
|
|
135
|
-
### knowledge-agent
|
|
136
|
-
Query vault generated by curator-codex for RAG-powered code questions.
|
|
137
|
-
|
|
138
|
-
## Architecture
|
|
139
|
-
|
|
140
|
-
```
|
|
141
|
-
CodeAnalyzer
|
|
142
|
-
├── analyzeFile() — Dispatcher
|
|
143
|
-
├── analyzeCode() — Route to CodeAnalyzer
|
|
144
|
-
├── analyzeDocumentation() — Route to DocumentationCurator
|
|
145
|
-
├── isDocFile() — File type detection
|
|
146
|
-
└── findAssociatedDocs() — Discover code.md, README.md
|
|
147
|
-
|
|
148
|
-
DocumentationCurator (embedded)
|
|
149
|
-
├── curateFile()
|
|
150
|
-
├── curateText()
|
|
151
|
-
└── callLLM() — Extract policies, procedures
|
|
152
|
-
|
|
153
|
-
Manifest System
|
|
154
|
-
├── findAllFiles() — Find code + docs (recursive)
|
|
155
|
-
├── isCodeFile() — Detect .ts, .js, .py, etc
|
|
156
|
-
├── isDocFile() — Detect .md, .txt
|
|
157
|
-
└── Change tracking — .codex-manifest.json
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
## Comparison
|
|
161
|
-
|
|
162
|
-
| Feature | curator-agent | curator-codex-agent |
|
|
163
|
-
|---------|---|---|
|
|
164
|
-
| **Input** | .md, .txt docs only | Code + Docs (.ts, .js, .py, .md, .txt) |
|
|
165
|
-
| **Code Analysis** | ❌ No | ✅ Yes (extract APIs, components) |
|
|
166
|
-
| **Doc Analysis** | ✅ Yes | ✅ Yes (extract policies, procedures) |
|
|
167
|
-
| **File Detection** | Manual separation | Automatic file routing |
|
|
168
|
-
| **Associated Docs** | N/A | ✅ Finds code.md, README.md |
|
|
169
|
-
| **Use Case** | Docs-only projects | Projects with code + docs |
|
|
170
|
-
| **Workflow** | Sequential | Unified (one pass) |
|
|
171
|
-
|
|
172
|
-
## When to Use Each
|
|
173
|
-
|
|
174
|
-
| Scenario | Use |
|
|
175
|
-
|----------|-----|
|
|
176
|
-
| I have code + docs (mixed project) | **curator-codex-agent** ← unified |
|
|
177
|
-
| I ONLY have documentation files | curator-agent |
|
|
178
|
-
| I ONLY have code (no docs) | curator-codex-agent |
|
|
179
|
-
| I want code analysis only | curator-codex-agent (will skip .md) |
|
|
180
|
-
| I want docs analysis only | curator-agent |
|
|
181
|
-
|
|
182
|
-
## See Also
|
|
183
|
-
|
|
184
|
-
- **curator-agent** — Specialized documentation curator (if you prefer separate concerns)
|
|
185
|
-
- **bk-agent** — Multi-agent framework
|
|
186
|
-
- **knowledge-agent** — RAG retrieval on curated vaults
|
|
187
|
-
- **curator-codex-agent** ← **You are here** (unified code + doc curator)
|