@compr/contextengine-mcp 1.9.44

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 (54) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +200 -0
  3. package/dist/agents.d.ts +127 -0
  4. package/dist/agents.d.ts.map +1 -0
  5. package/dist/agents.js +1162 -0
  6. package/dist/agents.js.map +1 -0
  7. package/dist/cache.d.ts +15 -0
  8. package/dist/cache.d.ts.map +1 -0
  9. package/dist/cache.js +117 -0
  10. package/dist/cache.js.map +1 -0
  11. package/dist/cli.d.ts +10 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +227 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/code-chunker.d.ts +12 -0
  16. package/dist/code-chunker.d.ts.map +1 -0
  17. package/dist/code-chunker.js +263 -0
  18. package/dist/code-chunker.js.map +1 -0
  19. package/dist/collectors.d.ts +63 -0
  20. package/dist/collectors.d.ts.map +1 -0
  21. package/dist/collectors.js +617 -0
  22. package/dist/collectors.js.map +1 -0
  23. package/dist/config.d.ts +59 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +213 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/embeddings.d.ts +31 -0
  28. package/dist/embeddings.d.ts.map +1 -0
  29. package/dist/embeddings.js +91 -0
  30. package/dist/embeddings.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +557 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/ingest.d.ts +23 -0
  36. package/dist/ingest.d.ts.map +1 -0
  37. package/dist/ingest.js +79 -0
  38. package/dist/ingest.js.map +1 -0
  39. package/dist/search.d.ts +11 -0
  40. package/dist/search.d.ts.map +1 -0
  41. package/dist/search.js +58 -0
  42. package/dist/search.js.map +1 -0
  43. package/dist/sessions.d.ts +46 -0
  44. package/dist/sessions.d.ts.map +1 -0
  45. package/dist/sessions.js +143 -0
  46. package/dist/sessions.js.map +1 -0
  47. package/dist/test-sessions.d.ts +2 -0
  48. package/dist/test-sessions.d.ts.map +1 -0
  49. package/dist/test-sessions.js.map +1 -0
  50. package/dist/test.d.ts +2 -0
  51. package/dist/test.d.ts.map +1 -0
  52. package/dist/test.js +52 -0
  53. package/dist/test.js.map +1 -0
  54. package/package.json +58 -0
package/dist/ingest.js ADDED
@@ -0,0 +1,79 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { basename } from "path";
3
+ /**
4
+ * Parse a markdown file into chunks, splitting on headings.
5
+ * Each chunk captures the heading hierarchy for context.
6
+ */
7
+ function parseMarkdown(filePath, sourceName) {
8
+ const text = readFileSync(filePath, "utf-8");
9
+ const lines = text.split("\n");
10
+ const chunks = [];
11
+ // Track heading hierarchy
12
+ const headingStack = [];
13
+ let currentContent = [];
14
+ let chunkStartLine = 1;
15
+ for (let i = 0; i < lines.length; i++) {
16
+ const line = lines[i];
17
+ const headingMatch = line.match(/^(#{1,6})\s+(.+)/);
18
+ if (headingMatch) {
19
+ // Flush previous chunk
20
+ if (currentContent.length > 0) {
21
+ const content = currentContent.join("\n").trim();
22
+ if (content.length > 0) {
23
+ chunks.push({
24
+ source: sourceName,
25
+ section: headingStack.join(" > ") || basename(filePath),
26
+ content,
27
+ lineStart: chunkStartLine,
28
+ lineEnd: i, // line before this heading
29
+ });
30
+ }
31
+ }
32
+ const level = headingMatch[1].length;
33
+ const title = headingMatch[2].trim();
34
+ // Pop headings at same or deeper level
35
+ while (headingStack.length >= level) {
36
+ headingStack.pop();
37
+ }
38
+ headingStack.push(`${"#".repeat(level)} ${title}`);
39
+ currentContent = [];
40
+ chunkStartLine = i + 1; // 1-based
41
+ }
42
+ else {
43
+ currentContent.push(line);
44
+ }
45
+ }
46
+ // Flush last chunk
47
+ if (currentContent.length > 0) {
48
+ const content = currentContent.join("\n").trim();
49
+ if (content.length > 0) {
50
+ chunks.push({
51
+ source: sourceName,
52
+ section: headingStack.join(" > ") || basename(filePath),
53
+ content,
54
+ lineStart: chunkStartLine,
55
+ lineEnd: lines.length,
56
+ });
57
+ }
58
+ }
59
+ return chunks;
60
+ }
61
+ /**
62
+ * Ingest all configured knowledge sources into chunks.
63
+ * Skips files that don't exist (with a warning to stderr).
64
+ */
65
+ export function ingestSources(sources) {
66
+ const allChunks = [];
67
+ for (const source of sources) {
68
+ if (!existsSync(source.path)) {
69
+ console.error(`[ContextEngine] ⚠ Skipping missing: ${source.path}`);
70
+ continue;
71
+ }
72
+ const chunks = parseMarkdown(source.path, source.name);
73
+ allChunks.push(...chunks);
74
+ console.error(`[ContextEngine] ✅ Indexed: ${source.name} (${chunks.length} chunks)`);
75
+ }
76
+ console.error(`[ContextEngine] 📦 Total: ${allChunks.length} chunks from ${sources.length} sources`);
77
+ return allChunks;
78
+ }
79
+ //# sourceMappingURL=ingest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../src/ingest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Chunk } from "./ingest.js";
2
+ export interface SearchResult {
3
+ chunk: Chunk;
4
+ score: number;
5
+ }
6
+ /**
7
+ * Search chunks by keyword relevance.
8
+ * Returns top-k results sorted by score descending.
9
+ */
10
+ export declare function searchChunks(chunks: Chunk[], query: string, topK?: number): SearchResult[];
11
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAkDpC,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAW,GAChB,YAAY,EAAE,CAehB"}
package/dist/search.js ADDED
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Simple TF-IDF-ish keyword search over chunks.
3
+ * Fast, zero-dependency — good enough for v1.
4
+ * Will be replaced by vector embeddings in step 3.
5
+ */
6
+ /** Normalize and tokenize a string */
7
+ function tokenize(text) {
8
+ return text
9
+ .toLowerCase()
10
+ .replace(/[^a-z0-9\s_\-./]/g, " ")
11
+ .split(/\s+/)
12
+ .filter((t) => t.length > 1);
13
+ }
14
+ /** Score a chunk against a query using term overlap */
15
+ function scoreChunk(chunk, queryTokens) {
16
+ const contentLower = (chunk.content + " " + chunk.section).toLowerCase();
17
+ let score = 0;
18
+ for (const token of queryTokens) {
19
+ // Exact word boundary match scores higher
20
+ const regex = new RegExp(`\\b${escapeRegex(token)}\\b`, "gi");
21
+ const matches = contentLower.match(regex);
22
+ if (matches) {
23
+ score += matches.length * 2;
24
+ }
25
+ // Partial/substring match
26
+ else if (contentLower.includes(token)) {
27
+ score += 1;
28
+ }
29
+ }
30
+ // Bonus for matching multiple distinct query terms
31
+ const distinctMatches = queryTokens.filter((t) => contentLower.includes(t)).length;
32
+ if (distinctMatches > 1) {
33
+ score += distinctMatches * 3;
34
+ }
35
+ return score;
36
+ }
37
+ function escapeRegex(s) {
38
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
39
+ }
40
+ /**
41
+ * Search chunks by keyword relevance.
42
+ * Returns top-k results sorted by score descending.
43
+ */
44
+ export function searchChunks(chunks, query, topK = 10) {
45
+ const queryTokens = tokenize(query);
46
+ if (queryTokens.length === 0)
47
+ return [];
48
+ const scored = [];
49
+ for (const chunk of chunks) {
50
+ const score = scoreChunk(chunk, queryTokens);
51
+ if (score > 0) {
52
+ scored.push({ chunk, score });
53
+ }
54
+ }
55
+ scored.sort((a, b) => b.score - a.score);
56
+ return scored.slice(0, topK);
57
+ }
58
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,sCAAsC;AACtC,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC;SACjC,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,uDAAuD;AACvD,SAAS,UAAU,CAAC,KAAY,EAAE,WAAqB;IACrD,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IACzE,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,0CAA0C;QAC1C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9B,CAAC;QACD,0BAA0B;aACrB,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/C,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CACzB,CAAC,MAAM,CAAC;IACT,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,IAAI,eAAe,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAOD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAe,EACf,KAAa,EACb,OAAe,EAAE;IAEjB,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC7C,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,46 @@
1
+ export interface SessionEntry {
2
+ key: string;
3
+ value: string;
4
+ timestamp: string;
5
+ }
6
+ export interface Session {
7
+ name: string;
8
+ created: string;
9
+ updated: string;
10
+ entries: SessionEntry[];
11
+ }
12
+ /**
13
+ * Save or update a key-value pair in a named session.
14
+ */
15
+ export declare function saveSession(name: string, key: string, value: string): Session;
16
+ /**
17
+ * Load a session by name.
18
+ */
19
+ export declare function loadSession(name: string): Session | null;
20
+ /**
21
+ * List all saved sessions.
22
+ */
23
+ export declare function listSessions(): Array<{
24
+ name: string;
25
+ entries: number;
26
+ created: string;
27
+ updated: string;
28
+ }>;
29
+ /**
30
+ * Delete a session.
31
+ */
32
+ export declare function deleteSession(name: string): boolean;
33
+ /**
34
+ * Format a session for display.
35
+ */
36
+ export declare function formatSession(session: Session): string;
37
+ /**
38
+ * Format session list for display.
39
+ */
40
+ export declare function formatSessionList(sessions: Array<{
41
+ name: string;
42
+ entries: number;
43
+ created: string;
44
+ updated: string;
45
+ }>): string;
46
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAcD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAwB7E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CASxD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAyBzG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOnD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAiBtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAiB9H"}
@@ -0,0 +1,143 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, unlinkSync } from "fs";
2
+ import { join } from "path";
3
+ import { homedir } from "os";
4
+ /**
5
+ * Session Persistence — save/restore conversation context between sessions.
6
+ *
7
+ * Sessions are saved as JSON files in ~/.contextengine/sessions/.
8
+ * Each session has a name, timestamp, and key-value data store.
9
+ *
10
+ * Use cases:
11
+ * - AI agent saves decisions/context at end of session → picks up next time
12
+ * - Track what was discussed, changed, or planned across sessions
13
+ * - Store project-specific notes that persist between agent restarts
14
+ */
15
+ const SESSIONS_DIR = join(homedir(), ".contextengine", "sessions");
16
+ function ensureDir() {
17
+ if (!existsSync(SESSIONS_DIR)) {
18
+ mkdirSync(SESSIONS_DIR, { recursive: true });
19
+ }
20
+ }
21
+ function sessionPath(name) {
22
+ // Sanitize name for filesystem
23
+ const safe = name.replace(/[^a-zA-Z0-9_\-\.]/g, "_").substring(0, 100);
24
+ return join(SESSIONS_DIR, `${safe}.json`);
25
+ }
26
+ /**
27
+ * Save or update a key-value pair in a named session.
28
+ */
29
+ export function saveSession(name, key, value) {
30
+ ensureDir();
31
+ const path = sessionPath(name);
32
+ const now = new Date().toISOString();
33
+ let session;
34
+ if (existsSync(path)) {
35
+ session = JSON.parse(readFileSync(path, "utf-8"));
36
+ session.updated = now;
37
+ }
38
+ else {
39
+ session = { name, created: now, updated: now, entries: [] };
40
+ }
41
+ // Update existing key or add new one
42
+ const existing = session.entries.find((e) => e.key === key);
43
+ if (existing) {
44
+ existing.value = value;
45
+ existing.timestamp = now;
46
+ }
47
+ else {
48
+ session.entries.push({ key, value, timestamp: now });
49
+ }
50
+ writeFileSync(path, JSON.stringify(session, null, 2));
51
+ return session;
52
+ }
53
+ /**
54
+ * Load a session by name.
55
+ */
56
+ export function loadSession(name) {
57
+ const path = sessionPath(name);
58
+ if (!existsSync(path))
59
+ return null;
60
+ try {
61
+ return JSON.parse(readFileSync(path, "utf-8"));
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ /**
68
+ * List all saved sessions.
69
+ */
70
+ export function listSessions() {
71
+ ensureDir();
72
+ try {
73
+ return readdirSync(SESSIONS_DIR)
74
+ .filter((f) => f.endsWith(".json"))
75
+ .map((f) => {
76
+ try {
77
+ const session = JSON.parse(readFileSync(join(SESSIONS_DIR, f), "utf-8"));
78
+ return {
79
+ name: session.name,
80
+ entries: session.entries.length,
81
+ created: session.created,
82
+ updated: session.updated,
83
+ };
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ })
89
+ .filter(Boolean);
90
+ }
91
+ catch {
92
+ return [];
93
+ }
94
+ }
95
+ /**
96
+ * Delete a session.
97
+ */
98
+ export function deleteSession(name) {
99
+ const path = sessionPath(name);
100
+ if (existsSync(path)) {
101
+ unlinkSync(path);
102
+ return true;
103
+ }
104
+ return false;
105
+ }
106
+ /**
107
+ * Format a session for display.
108
+ */
109
+ export function formatSession(session) {
110
+ const lines = [];
111
+ lines.push(`# Session: ${session.name}`);
112
+ lines.push(`Created: ${session.created}`);
113
+ lines.push(`Updated: ${session.updated}`);
114
+ lines.push(`Entries: ${session.entries.length}`);
115
+ lines.push("");
116
+ for (const entry of session.entries) {
117
+ lines.push(`## ${entry.key}`);
118
+ lines.push(`_Updated: ${entry.timestamp}_`);
119
+ lines.push("");
120
+ lines.push(entry.value);
121
+ lines.push("");
122
+ }
123
+ return lines.join("\n");
124
+ }
125
+ /**
126
+ * Format session list for display.
127
+ */
128
+ export function formatSessionList(sessions) {
129
+ if (sessions.length === 0) {
130
+ return "No saved sessions. Use `save_session` to create one.";
131
+ }
132
+ const lines = [];
133
+ lines.push("# 📋 Saved Sessions\n");
134
+ lines.push("| Session | Entries | Created | Last Updated |");
135
+ lines.push("|---------|---------|---------|-------------|");
136
+ for (const s of sessions) {
137
+ const created = s.created.split("T")[0];
138
+ const updated = s.updated.split("T")[0];
139
+ lines.push(`| ${s.name} | ${s.entries} | ${created} | ${updated} |`);
140
+ }
141
+ return lines.join("\n");
142
+ }
143
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test-sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-sessions.d.ts","sourceRoot":"","sources":["../src/test-sessions.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-sessions.js","sourceRoot":"","sources":["../src/test-sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAExH,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAC5B,WAAW,CAAC,cAAc,EAAE,SAAS,EAAE,qCAAqC,CAAC,CAAC;AAC9E,WAAW,CAAC,cAAc,EAAE,WAAW,EAAE,yDAAyD,CAAC,CAAC;AACpG,WAAW,CAAC,cAAc,EAAE,cAAc,EAAE,+BAA+B,CAAC,CAAC;AAC7E,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAE/B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC9B,MAAM,CAAC,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;AACtC,IAAI,CAAC;IAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAErC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;AAE/C,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;AAC7C,WAAW,CAAC,cAAc,EAAE,SAAS,EAAE,0DAA0D,CAAC,CAAC;AACnG,MAAM,EAAE,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;AACvC,IAAI,EAAE,EAAE,CAAC;IACP,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;AAC1E,CAAC;AAED,WAAW,CAAC,eAAe,EAAE,QAAQ,EAAE,2BAA2B,CAAC,CAAC;AAEpE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAC3C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;AAE/C,aAAa,CAAC,cAAc,CAAC,CAAC;AAC9B,aAAa,CAAC,eAAe,CAAC,CAAC;AAC/B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACjC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC"}
package/dist/test.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":""}
package/dist/test.js ADDED
@@ -0,0 +1,52 @@
1
+ import { loadSources } from "./config.js";
2
+ import { ingestSources } from "./ingest.js";
3
+ import { searchChunks } from "./search.js";
4
+ import { initEmbeddings, embedChunks, vectorSearch, } from "./embeddings.js";
5
+ async function test() {
6
+ // 1. Ingest
7
+ const sources = loadSources();
8
+ const chunks = ingestSources(sources);
9
+ // 2. Keyword search
10
+ console.log("\n=== KEYWORD SEARCH: 'Docker deployment PHP nginx' ===\n");
11
+ const kwResults = searchChunks(chunks, "Docker deployment PHP nginx", 3);
12
+ kwResults.forEach((r, i) => {
13
+ console.log(`--- Result ${i + 1} (score: ${r.score}) ---`);
14
+ console.log(`Source: ${r.chunk.source}`);
15
+ console.log(`Section: ${r.chunk.section}`);
16
+ console.log(`Lines: ${r.chunk.lineStart}-${r.chunk.lineEnd}`);
17
+ console.log(r.chunk.content.slice(0, 150));
18
+ console.log();
19
+ });
20
+ // 3. Embeddings
21
+ console.log("=== LOADING EMBEDDINGS ===\n");
22
+ const ready = await initEmbeddings();
23
+ if (!ready) {
24
+ console.log("Embeddings not available — done.");
25
+ return;
26
+ }
27
+ console.log(`Embedding ${chunks.length} chunks...`);
28
+ const embedded = await embedChunks(chunks);
29
+ console.log(`Embedded ${embedded.length} chunks\n`);
30
+ // 4. Semantic search
31
+ console.log("=== SEMANTIC SEARCH: 'how to deploy to production server' ===\n");
32
+ const semResults = await vectorSearch("how to deploy to production server", embedded, 3);
33
+ semResults.forEach((r, i) => {
34
+ console.log(`--- Result ${i + 1} (score: ${r.score.toFixed(4)}) ---`);
35
+ console.log(`Source: ${r.chunk.source}`);
36
+ console.log(`Section: ${r.chunk.section}`);
37
+ console.log(r.chunk.content.slice(0, 150));
38
+ console.log();
39
+ });
40
+ // 5. Second semantic test — different query
41
+ console.log("=== SEMANTIC SEARCH: 'email queue worker supervisor' ===\n");
42
+ const semResults2 = await vectorSearch("email queue worker supervisor", embedded, 3);
43
+ semResults2.forEach((r, i) => {
44
+ console.log(`--- Result ${i + 1} (score: ${r.score.toFixed(4)}) ---`);
45
+ console.log(`Source: ${r.chunk.source}`);
46
+ console.log(`Section: ${r.chunk.section}`);
47
+ console.log(r.chunk.content.slice(0, 150));
48
+ console.log();
49
+ });
50
+ }
51
+ test().catch(console.error);
52
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@compr/contextengine-mcp",
3
+ "version": "1.9.44",
4
+ "description": "MCP server that turns your project documentation into a queryable knowledge base for AI coding agents",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "contextengine-mcp": "dist/cli.js",
9
+ "contextengine": "dist/cli.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc --watch",
14
+ "start": "node dist/index.js",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "keywords": [
18
+ "mcp",
19
+ "model-context-protocol",
20
+ "copilot",
21
+ "claude",
22
+ "cursor",
23
+ "ai",
24
+ "knowledge-base",
25
+ "documentation",
26
+ "context",
27
+ "rag",
28
+ "search",
29
+ "developer-tools"
30
+ ],
31
+ "author": "FASTPROD",
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/FASTPROD/ContextEngine.git"
36
+ },
37
+ "homepage": "https://github.com/FASTPROD/ContextEngine#readme",
38
+ "bugs": {
39
+ "url": "https://github.com/FASTPROD/ContextEngine/issues"
40
+ },
41
+ "engines": {
42
+ "node": ">=18.0.0"
43
+ },
44
+ "files": [
45
+ "dist/",
46
+ "LICENSE",
47
+ "README.md"
48
+ ],
49
+ "dependencies": {
50
+ "@huggingface/transformers": "^3.8.1",
51
+ "@modelcontextprotocol/sdk": "^1.26.0",
52
+ "zod": "^4.3.6"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^25.2.3",
56
+ "typescript": "^5.9.3"
57
+ }
58
+ }