@backendkit-labs/curator-codex-agent 0.2.0 → 1.0.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.
Files changed (101) hide show
  1. package/dist/analyzer.d.ts +1 -17
  2. package/dist/analyzer.d.ts.map +1 -1
  3. package/dist/analyzer.js +80 -163
  4. package/dist/analyzer.js.map +1 -1
  5. package/dist/audit.d.ts +27 -0
  6. package/dist/audit.d.ts.map +1 -0
  7. package/dist/audit.js +43 -0
  8. package/dist/audit.js.map +1 -0
  9. package/dist/checksum.d.ts +0 -22
  10. package/dist/checksum.d.ts.map +1 -1
  11. package/dist/checksum.js +14 -103
  12. package/dist/checksum.js.map +1 -1
  13. package/dist/documentation-curator.d.ts +1 -1
  14. package/dist/documentation-curator.d.ts.map +1 -1
  15. package/dist/documentation-curator.js +79 -95
  16. package/dist/documentation-curator.js.map +1 -1
  17. package/dist/index.d.ts +19 -9
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +12 -22
  20. package/dist/index.js.map +1 -1
  21. package/dist/knowledge/embedder-worker.d.ts +2 -0
  22. package/dist/knowledge/embedder-worker.d.ts.map +1 -0
  23. package/dist/knowledge/embedder-worker.js +55 -0
  24. package/dist/knowledge/embedder-worker.js.map +1 -0
  25. package/dist/knowledge/engine.d.ts +10 -56
  26. package/dist/knowledge/engine.d.ts.map +1 -1
  27. package/dist/knowledge/engine.js +42 -153
  28. package/dist/knowledge/engine.js.map +1 -1
  29. package/dist/knowledge/rag-provider.d.ts +14 -56
  30. package/dist/knowledge/rag-provider.d.ts.map +1 -1
  31. package/dist/knowledge/rag-provider.js +63 -154
  32. package/dist/knowledge/rag-provider.js.map +1 -1
  33. package/dist/knowledge/synthesis.d.ts +0 -10
  34. package/dist/knowledge/synthesis.d.ts.map +1 -1
  35. package/dist/knowledge/synthesis.js +32 -77
  36. package/dist/knowledge/synthesis.js.map +1 -1
  37. package/dist/knowledge/transformers-embedder.d.ts +61 -0
  38. package/dist/knowledge/transformers-embedder.d.ts.map +1 -0
  39. package/dist/knowledge/transformers-embedder.js +222 -0
  40. package/dist/knowledge/transformers-embedder.js.map +1 -0
  41. package/dist/pdf-reader.d.ts +11 -0
  42. package/dist/pdf-reader.d.ts.map +1 -0
  43. package/dist/pdf-reader.js +21 -0
  44. package/dist/pdf-reader.js.map +1 -0
  45. package/dist/project.d.ts +28 -0
  46. package/dist/project.d.ts.map +1 -0
  47. package/dist/project.js +88 -0
  48. package/dist/project.js.map +1 -0
  49. package/dist/providers/anthropic-adapter.d.ts +2 -2
  50. package/dist/providers/anthropic-adapter.d.ts.map +1 -1
  51. package/dist/providers/anthropic-adapter.js +7 -13
  52. package/dist/providers/anthropic-adapter.js.map +1 -1
  53. package/dist/providers/index.d.ts +1 -1
  54. package/dist/providers/index.d.ts.map +1 -1
  55. package/dist/providers/index.js +13 -20
  56. package/dist/providers/index.js.map +1 -1
  57. package/dist/providers/openai-adapter.d.ts +2 -2
  58. package/dist/providers/openai-adapter.d.ts.map +1 -1
  59. package/dist/providers/openai-adapter.js +7 -13
  60. package/dist/providers/openai-adapter.js.map +1 -1
  61. package/dist/providers/types.d.ts +8 -1
  62. package/dist/providers/types.d.ts.map +1 -1
  63. package/dist/providers/types.js +1 -2
  64. package/dist/types.d.ts.map +1 -1
  65. package/dist/types.js +1 -3
  66. package/dist/types.js.map +1 -1
  67. package/dist/vault-dedup.d.ts +35 -0
  68. package/dist/vault-dedup.d.ts.map +1 -0
  69. package/dist/vault-dedup.js +130 -0
  70. package/dist/vault-dedup.js.map +1 -0
  71. package/package.json +43 -56
  72. package/AGENT.md +0 -187
  73. package/README.md +0 -475
  74. package/dist/api/config.d.ts +0 -57
  75. package/dist/api/config.d.ts.map +0 -1
  76. package/dist/api/config.js +0 -183
  77. package/dist/api/config.js.map +0 -1
  78. package/dist/api/http-server.d.ts +0 -24
  79. package/dist/api/http-server.d.ts.map +0 -1
  80. package/dist/api/http-server.js +0 -108
  81. package/dist/api/http-server.js.map +0 -1
  82. package/dist/api/routes.d.ts +0 -8
  83. package/dist/api/routes.d.ts.map +0 -1
  84. package/dist/api/routes.js +0 -382
  85. package/dist/api/routes.js.map +0 -1
  86. package/dist/api/security.d.ts +0 -107
  87. package/dist/api/security.d.ts.map +0 -1
  88. package/dist/api/security.js +0 -200
  89. package/dist/api/security.js.map +0 -1
  90. package/dist/http-server-main.d.ts +0 -28
  91. package/dist/http-server-main.d.ts.map +0 -1
  92. package/dist/http-server-main.js +0 -69
  93. package/dist/http-server-main.js.map +0 -1
  94. package/dist/server.d.ts +0 -33
  95. package/dist/server.d.ts.map +0 -1
  96. package/dist/server.js +0 -640
  97. package/dist/server.js.map +0 -1
  98. package/dist/watcher.d.ts +0 -26
  99. package/dist/watcher.d.ts.map +0 -1
  100. package/dist/watcher.js +0 -168
  101. 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;CACxE"}
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"}
@@ -1,3 +1,2 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};
3
2
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,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"}
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
@@ -1,4 +1,2 @@
1
- "use strict";
2
- // Code analysis types
3
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};
4
2
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,sBAAsB"}
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
1
  {
2
- "name": "@backendkit-labs/curator-codex-agent",
3
- "version": "0.2.0",
4
- "description": "Codex Curator — intelligent source code analysis and knowledge extraction into enterprise vaults using LLM reasoning.",
5
- "main": "dist/server.js",
6
- "bin": {
7
- "curator-codex-agent": "./dist/server.js",
8
- "curator-codex-watcher": "./dist/watcher.js",
9
- "curator-codex-http": "./dist/http-server-main.js"
10
- },
11
- "files": [
12
- "dist/",
13
- "AGENT.md"
14
- ],
15
- "repository": {
16
- "type": "git",
17
- "url": "git+https://github.com/BackendKit-labs/backendkit-agents.git",
18
- "directory": "packages/curator-codex-agent"
19
- },
20
- "publishConfig": {
21
- "access": "public"
22
- },
23
- "license": "MIT",
24
- "engines": {
25
- "node": ">=20.0.0"
26
- },
27
- "exports": {
28
- ".": "./dist/index.js",
29
- "./providers": "./dist/providers/index.js"
30
- },
31
- "scripts": {
32
- "build": "tsc --noCheck",
33
- "dev": "tsx src/analyzer.ts",
34
- "start": "node -r dotenv/config dist/server.js",
35
- "watch-code": "node -r dotenv/config dist/watcher.js",
36
- "http-server": "node -r dotenv/config dist/http-server-main.js",
37
- "http-dev": "tsx src/http-server-main.ts",
38
- "typecheck": "tsc --noEmit",
39
- "prepublishOnly": "npm run build"
40
- },
41
- "dependencies": {
42
- "@anthropic-ai/sdk": "^0.55.0",
43
- "@backendkit-labs/agent-core": "^0.20.2",
44
- "@backendkit-labs/agent-enterprise": "^0.3.6",
45
- "@backendkit-labs/console-animations": "^0.1.3",
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
- }
2
+ "name": "@backendkit-labs/curator-codex-agent",
3
+ "version": "1.0.0",
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": "*",
33
+ "@backendkit-labs/infra": "*",
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
+ }
58
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)