@phantomind/core 0.1.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 (265) hide show
  1. package/dist/adapters/aider.d.ts +12 -0
  2. package/dist/adapters/aider.d.ts.map +1 -0
  3. package/dist/adapters/aider.js +24 -0
  4. package/dist/adapters/aider.js.map +1 -0
  5. package/dist/adapters/base.d.ts +21 -0
  6. package/dist/adapters/base.d.ts.map +1 -0
  7. package/dist/adapters/base.js +83 -0
  8. package/dist/adapters/base.js.map +1 -0
  9. package/dist/adapters/claude-code.d.ts +12 -0
  10. package/dist/adapters/claude-code.d.ts.map +1 -0
  11. package/dist/adapters/claude-code.js +31 -0
  12. package/dist/adapters/claude-code.js.map +1 -0
  13. package/dist/adapters/cline.d.ts +12 -0
  14. package/dist/adapters/cline.d.ts.map +1 -0
  15. package/dist/adapters/cline.js +32 -0
  16. package/dist/adapters/cline.js.map +1 -0
  17. package/dist/adapters/codex.d.ts +18 -0
  18. package/dist/adapters/codex.d.ts.map +1 -0
  19. package/dist/adapters/codex.js +38 -0
  20. package/dist/adapters/codex.js.map +1 -0
  21. package/dist/adapters/continue.d.ts +12 -0
  22. package/dist/adapters/continue.d.ts.map +1 -0
  23. package/dist/adapters/continue.js +29 -0
  24. package/dist/adapters/continue.js.map +1 -0
  25. package/dist/adapters/copilot.d.ts +12 -0
  26. package/dist/adapters/copilot.d.ts.map +1 -0
  27. package/dist/adapters/copilot.js +31 -0
  28. package/dist/adapters/copilot.js.map +1 -0
  29. package/dist/adapters/cursor.d.ts +12 -0
  30. package/dist/adapters/cursor.d.ts.map +1 -0
  31. package/dist/adapters/cursor.js +34 -0
  32. package/dist/adapters/cursor.js.map +1 -0
  33. package/dist/adapters/index.d.ts +32 -0
  34. package/dist/adapters/index.d.ts.map +1 -0
  35. package/dist/adapters/index.js +64 -0
  36. package/dist/adapters/index.js.map +1 -0
  37. package/dist/adapters/windsurf.d.ts +12 -0
  38. package/dist/adapters/windsurf.d.ts.map +1 -0
  39. package/dist/adapters/windsurf.js +32 -0
  40. package/dist/adapters/windsurf.js.map +1 -0
  41. package/dist/adapters/zed.d.ts +12 -0
  42. package/dist/adapters/zed.d.ts.map +1 -0
  43. package/dist/adapters/zed.js +27 -0
  44. package/dist/adapters/zed.js.map +1 -0
  45. package/dist/agent/decomposer.d.ts +55 -0
  46. package/dist/agent/decomposer.d.ts.map +1 -0
  47. package/dist/agent/decomposer.js +172 -0
  48. package/dist/agent/decomposer.js.map +1 -0
  49. package/dist/agent/executor.d.ts +33 -0
  50. package/dist/agent/executor.d.ts.map +1 -0
  51. package/dist/agent/executor.js +260 -0
  52. package/dist/agent/executor.js.map +1 -0
  53. package/dist/agent/index.d.ts +8 -0
  54. package/dist/agent/index.d.ts.map +1 -0
  55. package/dist/agent/index.js +8 -0
  56. package/dist/agent/index.js.map +1 -0
  57. package/dist/agent/memory.d.ts +95 -0
  58. package/dist/agent/memory.d.ts.map +1 -0
  59. package/dist/agent/memory.js +211 -0
  60. package/dist/agent/memory.js.map +1 -0
  61. package/dist/agent/orchestrator.d.ts +54 -0
  62. package/dist/agent/orchestrator.d.ts.map +1 -0
  63. package/dist/agent/orchestrator.js +190 -0
  64. package/dist/agent/orchestrator.js.map +1 -0
  65. package/dist/agent/queue.d.ts +95 -0
  66. package/dist/agent/queue.d.ts.map +1 -0
  67. package/dist/agent/queue.js +231 -0
  68. package/dist/agent/queue.js.map +1 -0
  69. package/dist/agent/retry.d.ts +61 -0
  70. package/dist/agent/retry.d.ts.map +1 -0
  71. package/dist/agent/retry.js +162 -0
  72. package/dist/agent/retry.js.map +1 -0
  73. package/dist/agent/roles.d.ts +35 -0
  74. package/dist/agent/roles.d.ts.map +1 -0
  75. package/dist/agent/roles.js +269 -0
  76. package/dist/agent/roles.js.map +1 -0
  77. package/dist/cli/agent.d.ts +12 -0
  78. package/dist/cli/agent.d.ts.map +1 -0
  79. package/dist/cli/agent.js +85 -0
  80. package/dist/cli/agent.js.map +1 -0
  81. package/dist/cli/audit.d.ts +11 -0
  82. package/dist/cli/audit.d.ts.map +1 -0
  83. package/dist/cli/audit.js +63 -0
  84. package/dist/cli/audit.js.map +1 -0
  85. package/dist/cli/eval.d.ts +11 -0
  86. package/dist/cli/eval.d.ts.map +1 -0
  87. package/dist/cli/eval.js +79 -0
  88. package/dist/cli/eval.js.map +1 -0
  89. package/dist/cli/index.d.ts +9 -0
  90. package/dist/cli/index.d.ts.map +1 -0
  91. package/dist/cli/index.js +9 -0
  92. package/dist/cli/index.js.map +1 -0
  93. package/dist/cli/init.d.ts +13 -0
  94. package/dist/cli/init.d.ts.map +1 -0
  95. package/dist/cli/init.js +157 -0
  96. package/dist/cli/init.js.map +1 -0
  97. package/dist/cli/main.d.ts +7 -0
  98. package/dist/cli/main.d.ts.map +1 -0
  99. package/dist/cli/main.js +153 -0
  100. package/dist/cli/main.js.map +1 -0
  101. package/dist/cli/serve.d.ts +11 -0
  102. package/dist/cli/serve.d.ts.map +1 -0
  103. package/dist/cli/serve.js +23 -0
  104. package/dist/cli/serve.js.map +1 -0
  105. package/dist/cli/stats.d.ts +10 -0
  106. package/dist/cli/stats.d.ts.map +1 -0
  107. package/dist/cli/stats.js +68 -0
  108. package/dist/cli/stats.js.map +1 -0
  109. package/dist/cli/sync.d.ts +11 -0
  110. package/dist/cli/sync.d.ts.map +1 -0
  111. package/dist/cli/sync.js +49 -0
  112. package/dist/cli/sync.js.map +1 -0
  113. package/dist/cli/validate.d.ts +13 -0
  114. package/dist/cli/validate.d.ts.map +1 -0
  115. package/dist/cli/validate.js +125 -0
  116. package/dist/cli/validate.js.map +1 -0
  117. package/dist/config/index.d.ts +2 -0
  118. package/dist/config/index.d.ts.map +1 -0
  119. package/dist/config/index.js +2 -0
  120. package/dist/config/index.js.map +1 -0
  121. package/dist/config/loader.d.ts +25 -0
  122. package/dist/config/loader.d.ts.map +1 -0
  123. package/dist/config/loader.js +190 -0
  124. package/dist/config/loader.js.map +1 -0
  125. package/dist/context/embedder.d.ts +53 -0
  126. package/dist/context/embedder.d.ts.map +1 -0
  127. package/dist/context/embedder.js +235 -0
  128. package/dist/context/embedder.js.map +1 -0
  129. package/dist/context/engine.d.ts +82 -0
  130. package/dist/context/engine.d.ts.map +1 -0
  131. package/dist/context/engine.js +343 -0
  132. package/dist/context/engine.js.map +1 -0
  133. package/dist/context/index.d.ts +5 -0
  134. package/dist/context/index.d.ts.map +1 -0
  135. package/dist/context/index.js +5 -0
  136. package/dist/context/index.js.map +1 -0
  137. package/dist/context/learner.d.ts +44 -0
  138. package/dist/context/learner.d.ts.map +1 -0
  139. package/dist/context/learner.js +246 -0
  140. package/dist/context/learner.js.map +1 -0
  141. package/dist/context/versioning.d.ts +29 -0
  142. package/dist/context/versioning.d.ts.map +1 -0
  143. package/dist/context/versioning.js +81 -0
  144. package/dist/context/versioning.js.map +1 -0
  145. package/dist/index.d.ts +169 -0
  146. package/dist/index.d.ts.map +1 -0
  147. package/dist/index.js +285 -0
  148. package/dist/index.js.map +1 -0
  149. package/dist/mcp/index.d.ts +2 -0
  150. package/dist/mcp/index.d.ts.map +1 -0
  151. package/dist/mcp/index.js +2 -0
  152. package/dist/mcp/index.js.map +1 -0
  153. package/dist/mcp/server.d.ts +31 -0
  154. package/dist/mcp/server.d.ts.map +1 -0
  155. package/dist/mcp/server.js +334 -0
  156. package/dist/mcp/server.js.map +1 -0
  157. package/dist/observability/audit.d.ts +61 -0
  158. package/dist/observability/audit.d.ts.map +1 -0
  159. package/dist/observability/audit.js +168 -0
  160. package/dist/observability/audit.js.map +1 -0
  161. package/dist/observability/cost-tracker.d.ts +71 -0
  162. package/dist/observability/cost-tracker.d.ts.map +1 -0
  163. package/dist/observability/cost-tracker.js +206 -0
  164. package/dist/observability/cost-tracker.js.map +1 -0
  165. package/dist/observability/dashboard.d.ts +52 -0
  166. package/dist/observability/dashboard.d.ts.map +1 -0
  167. package/dist/observability/dashboard.js +134 -0
  168. package/dist/observability/dashboard.js.map +1 -0
  169. package/dist/observability/index.d.ts +4 -0
  170. package/dist/observability/index.d.ts.map +1 -0
  171. package/dist/observability/index.js +4 -0
  172. package/dist/observability/index.js.map +1 -0
  173. package/dist/providers/anthropic.d.ts +14 -0
  174. package/dist/providers/anthropic.d.ts.map +1 -0
  175. package/dist/providers/anthropic.js +99 -0
  176. package/dist/providers/anthropic.js.map +1 -0
  177. package/dist/providers/base.d.ts +52 -0
  178. package/dist/providers/base.d.ts.map +1 -0
  179. package/dist/providers/base.js +68 -0
  180. package/dist/providers/base.js.map +1 -0
  181. package/dist/providers/deepseek.d.ts +15 -0
  182. package/dist/providers/deepseek.d.ts.map +1 -0
  183. package/dist/providers/deepseek.js +99 -0
  184. package/dist/providers/deepseek.js.map +1 -0
  185. package/dist/providers/gemini.d.ts +15 -0
  186. package/dist/providers/gemini.d.ts.map +1 -0
  187. package/dist/providers/gemini.js +118 -0
  188. package/dist/providers/gemini.js.map +1 -0
  189. package/dist/providers/groq.d.ts +15 -0
  190. package/dist/providers/groq.d.ts.map +1 -0
  191. package/dist/providers/groq.js +101 -0
  192. package/dist/providers/groq.js.map +1 -0
  193. package/dist/providers/index.d.ts +11 -0
  194. package/dist/providers/index.d.ts.map +1 -0
  195. package/dist/providers/index.js +11 -0
  196. package/dist/providers/index.js.map +1 -0
  197. package/dist/providers/mistral.d.ts +15 -0
  198. package/dist/providers/mistral.d.ts.map +1 -0
  199. package/dist/providers/mistral.js +99 -0
  200. package/dist/providers/mistral.js.map +1 -0
  201. package/dist/providers/ollama.d.ts +14 -0
  202. package/dist/providers/ollama.d.ts.map +1 -0
  203. package/dist/providers/ollama.js +122 -0
  204. package/dist/providers/ollama.js.map +1 -0
  205. package/dist/providers/openai.d.ts +14 -0
  206. package/dist/providers/openai.d.ts.map +1 -0
  207. package/dist/providers/openai.js +80 -0
  208. package/dist/providers/openai.js.map +1 -0
  209. package/dist/providers/openrouter.d.ts +15 -0
  210. package/dist/providers/openrouter.d.ts.map +1 -0
  211. package/dist/providers/openrouter.js +101 -0
  212. package/dist/providers/openrouter.js.map +1 -0
  213. package/dist/providers/router.d.ts +51 -0
  214. package/dist/providers/router.d.ts.map +1 -0
  215. package/dist/providers/router.js +198 -0
  216. package/dist/providers/router.js.map +1 -0
  217. package/dist/quality/anomaly.d.ts +32 -0
  218. package/dist/quality/anomaly.d.ts.map +1 -0
  219. package/dist/quality/anomaly.js +126 -0
  220. package/dist/quality/anomaly.js.map +1 -0
  221. package/dist/quality/consistency.d.ts +26 -0
  222. package/dist/quality/consistency.d.ts.map +1 -0
  223. package/dist/quality/consistency.js +156 -0
  224. package/dist/quality/consistency.js.map +1 -0
  225. package/dist/quality/dual-verifier.d.ts +22 -0
  226. package/dist/quality/dual-verifier.d.ts.map +1 -0
  227. package/dist/quality/dual-verifier.js +137 -0
  228. package/dist/quality/dual-verifier.js.map +1 -0
  229. package/dist/quality/hallucination-guard.d.ts +57 -0
  230. package/dist/quality/hallucination-guard.d.ts.map +1 -0
  231. package/dist/quality/hallucination-guard.js +245 -0
  232. package/dist/quality/hallucination-guard.js.map +1 -0
  233. package/dist/quality/index.d.ts +7 -0
  234. package/dist/quality/index.d.ts.map +1 -0
  235. package/dist/quality/index.js +7 -0
  236. package/dist/quality/index.js.map +1 -0
  237. package/dist/quality/regression.d.ts +44 -0
  238. package/dist/quality/regression.d.ts.map +1 -0
  239. package/dist/quality/regression.js +181 -0
  240. package/dist/quality/regression.js.map +1 -0
  241. package/dist/quality/secret-scanner.d.ts +36 -0
  242. package/dist/quality/secret-scanner.d.ts.map +1 -0
  243. package/dist/quality/secret-scanner.js +187 -0
  244. package/dist/quality/secret-scanner.js.map +1 -0
  245. package/dist/schemas/index.d.ts +2 -0
  246. package/dist/schemas/index.d.ts.map +1 -0
  247. package/dist/schemas/index.js +2 -0
  248. package/dist/schemas/index.js.map +1 -0
  249. package/dist/schemas/registry.d.ts +72 -0
  250. package/dist/schemas/registry.d.ts.map +1 -0
  251. package/dist/schemas/registry.js +483 -0
  252. package/dist/schemas/registry.js.map +1 -0
  253. package/dist/templates/engine.d.ts +70 -0
  254. package/dist/templates/engine.d.ts.map +1 -0
  255. package/dist/templates/engine.js +71 -0
  256. package/dist/templates/engine.js.map +1 -0
  257. package/dist/templates/index.d.ts +2 -0
  258. package/dist/templates/index.d.ts.map +1 -0
  259. package/dist/templates/index.js +2 -0
  260. package/dist/templates/index.js.map +1 -0
  261. package/dist/types.d.ts +912 -0
  262. package/dist/types.d.ts.map +1 -0
  263. package/dist/types.js +75 -0
  264. package/dist/types.js.map +1 -0
  265. package/package.json +85 -0
package/dist/index.js ADDED
@@ -0,0 +1,285 @@
1
+ /**
2
+ * PhantomMindAI — Main Entry Point
3
+ * Universal AI Development Enhancement Layer
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { phantom } from '@phantomind/core';
8
+ *
9
+ * // Initialize
10
+ * await phantom.init();
11
+ *
12
+ * // Get context
13
+ * const ctx = await phantom.ctx();
14
+ *
15
+ * // Complete with auto-routing
16
+ * const response = await phantom.complete('Explain this code');
17
+ *
18
+ * // Run agent
19
+ * const result = await phantom.agent('refactor auth module');
20
+ *
21
+ * // Orchestrate multi-agent
22
+ * const orchestrated = await phantom.orchestrate(
23
+ * 'build user dashboard',
24
+ * ['architect', 'implementer', 'testWriter'],
25
+ * );
26
+ * ```
27
+ */
28
+ import { loadConfig } from './config/loader.js';
29
+ import { ContextEngine } from './context/engine.js';
30
+ import { CodebaseEmbedder } from './context/embedder.js';
31
+ import { ContextLearner } from './context/learner.js';
32
+ import { ProviderRouter } from './providers/router.js';
33
+ import { AgentExecutor } from './agent/executor.js';
34
+ import { AgentOrchestrator } from './agent/orchestrator.js';
35
+ import { TaskDecomposer } from './agent/decomposer.js';
36
+ import { RetryIntelligence } from './agent/retry.js';
37
+ import { TaskQueue } from './agent/queue.js';
38
+ import { AgentMemory } from './agent/memory.js';
39
+ import { SchemaRegistry } from './schemas/registry.js';
40
+ import { AuditTrail } from './observability/audit.js';
41
+ import { CostTracker } from './observability/cost-tracker.js';
42
+ import { AnalyticsDashboard } from './observability/dashboard.js';
43
+ import { SecretScanner } from './quality/secret-scanner.js';
44
+ import { HallucinationGuard } from './quality/hallucination-guard.js';
45
+ import { ConsistencyEnforcer } from './quality/consistency.js';
46
+ import { syncAllAdapters } from './adapters/index.js';
47
+ export class PhantomMind {
48
+ projectRoot;
49
+ config;
50
+ router;
51
+ contextEngine;
52
+ embedder;
53
+ learner;
54
+ schemaRegistry;
55
+ auditTrail;
56
+ costTracker;
57
+ memory;
58
+ queue;
59
+ initialized = false;
60
+ constructor(projectRoot) {
61
+ this.projectRoot = projectRoot ?? process.cwd();
62
+ }
63
+ /**
64
+ * Initialize PhantomMindAI
65
+ */
66
+ async init(configOverride) {
67
+ this.config = await loadConfig(this.projectRoot);
68
+ if (configOverride) {
69
+ Object.assign(this.config, configOverride);
70
+ }
71
+ this.router = new ProviderRouter(this.config.providers, this.config.budget ? {
72
+ maxCostPerDay: this.config.budget.maxCostPerDay,
73
+ warningAt: this.config.budget.warningAt,
74
+ fallbackOnBudget: this.config.budget.fallbackOnBudget,
75
+ } : undefined);
76
+ this.contextEngine = new ContextEngine(this.config, this.projectRoot);
77
+ this.embedder = new CodebaseEmbedder(this.projectRoot);
78
+ this.learner = new ContextLearner(this.projectRoot);
79
+ this.schemaRegistry = new SchemaRegistry(this.projectRoot);
80
+ this.auditTrail = new AuditTrail(this.projectRoot);
81
+ this.costTracker = new CostTracker(this.projectRoot, {
82
+ daily: this.config.budget?.maxCostPerDay,
83
+ });
84
+ this.memory = new AgentMemory(this.projectRoot);
85
+ this.queue = new TaskQueue({ maxConcurrent: 3 });
86
+ await this.schemaRegistry.loadCustomSchemas();
87
+ await this.auditTrail.init();
88
+ await this.costTracker.load();
89
+ await this.memory.load();
90
+ // Wire up audit logging for provider requests
91
+ this.router.on('provider:response', ({ provider, model, usage, duration }) => {
92
+ this.auditTrail.logProviderRequest(provider, model, usage.inputTokens, usage.outputTokens, usage.estimatedCost, duration, true);
93
+ this.costTracker.record(provider, model, usage);
94
+ });
95
+ this.initialized = true;
96
+ }
97
+ ensureInit() {
98
+ if (!this.initialized) {
99
+ throw new Error('PhantomMindAI not initialized. Call phantom.init() first.');
100
+ }
101
+ }
102
+ /**
103
+ * Get project context
104
+ */
105
+ async ctx(options) {
106
+ this.ensureInit();
107
+ return this.contextEngine.getProjectContext(options);
108
+ }
109
+ /**
110
+ * Complete a prompt with auto-routing
111
+ */
112
+ async complete(prompt, options) {
113
+ this.ensureInit();
114
+ const context = await this.contextEngine.getProjectContext({ maxTokens: 2000 });
115
+ const contextText = context.layers.map(l => l.content).join('\n\n');
116
+ return this.router.complete({
117
+ systemPrompt: `You are an AI assistant with deep knowledge of this project.\n\n${contextText}`,
118
+ prompt,
119
+ temperature: 0.7,
120
+ maxTokens: 2000,
121
+ ...options,
122
+ });
123
+ }
124
+ /**
125
+ * Complete with intelligent retry
126
+ */
127
+ async completeWithRetry(prompt, options) {
128
+ this.ensureInit();
129
+ const retry = new RetryIntelligence(this.router, this.contextEngine);
130
+ const result = await retry.execute({
131
+ prompt,
132
+ temperature: 0.7,
133
+ maxTokens: 2000,
134
+ ...options,
135
+ });
136
+ if (!result.success || !result.response) {
137
+ throw new Error(`Failed after ${result.attempts} attempts: ${result.error}`);
138
+ }
139
+ return result.response;
140
+ }
141
+ /**
142
+ * Run an agent task
143
+ */
144
+ async agent(task, options) {
145
+ this.ensureInit();
146
+ const executor = new AgentExecutor(this.router, this.contextEngine, this.projectRoot, {
147
+ role: options?.role ?? 'implementer',
148
+ maxSteps: options?.maxSteps ?? 30,
149
+ });
150
+ return executor.run(task);
151
+ }
152
+ /**
153
+ * Orchestrate multi-agent task
154
+ */
155
+ async orchestrate(task, roles) {
156
+ this.ensureInit();
157
+ const orchestrator = new AgentOrchestrator(this.router, this.contextEngine, this.projectRoot);
158
+ return orchestrator.orchestrate(task, roles);
159
+ }
160
+ /**
161
+ * Decompose a task
162
+ */
163
+ async decompose(task) {
164
+ this.ensureInit();
165
+ const decomposer = new TaskDecomposer(this.router, this.contextEngine);
166
+ return decomposer.decompose(task);
167
+ }
168
+ /**
169
+ * Queue a task
170
+ */
171
+ enqueue(task, options) {
172
+ this.ensureInit();
173
+ return this.queue.enqueue(task, options);
174
+ }
175
+ /**
176
+ * Semantic search across codebase
177
+ */
178
+ async search(query, limit = 10) {
179
+ this.ensureInit();
180
+ await this.embedder.build();
181
+ return this.embedder.search(query, limit);
182
+ }
183
+ /**
184
+ * Sync adapter configurations
185
+ */
186
+ async sync(targets, dryRun = false) {
187
+ this.ensureInit();
188
+ let syncConfig = this.config;
189
+ if (targets && targets.length > 0) {
190
+ syncConfig = { ...this.config, adapters: targets };
191
+ }
192
+ return syncAllAdapters(this.projectRoot, syncConfig, dryRun);
193
+ }
194
+ /**
195
+ * Validate code
196
+ */
197
+ async validate(content, filename) {
198
+ this.ensureInit();
199
+ const scanner = new SecretScanner();
200
+ const guard = new HallucinationGuard(this.projectRoot);
201
+ const secrets = scanner.scan(content, filename);
202
+ const hallucinations = await guard.check(content, filename);
203
+ return { secrets, hallucinations };
204
+ }
205
+ /**
206
+ * Check code consistency
207
+ */
208
+ async checkConsistency() {
209
+ this.ensureInit();
210
+ const enforcer = new ConsistencyEnforcer(this.projectRoot);
211
+ return enforcer.scan();
212
+ }
213
+ /**
214
+ * Get schema
215
+ */
216
+ schema(name) {
217
+ this.ensureInit();
218
+ return this.schemaRegistry.get(name);
219
+ }
220
+ /**
221
+ * Get cost report
222
+ */
223
+ costs(period) {
224
+ this.ensureInit();
225
+ return this.costTracker.getReport(period);
226
+ }
227
+ /**
228
+ * Get dashboard
229
+ */
230
+ dashboard() {
231
+ this.ensureInit();
232
+ return new AnalyticsDashboard(this.costTracker, this.auditTrail);
233
+ }
234
+ /**
235
+ * Learn project patterns
236
+ */
237
+ async learn() {
238
+ this.ensureInit();
239
+ await this.learner.learn();
240
+ return this.learner.generateSkillsContent();
241
+ }
242
+ /**
243
+ * Save state (costs, memory, etc.)
244
+ */
245
+ async save() {
246
+ this.ensureInit();
247
+ await this.costTracker.save();
248
+ await this.memory.save();
249
+ }
250
+ /**
251
+ * Access internals
252
+ */
253
+ get internals() {
254
+ this.ensureInit();
255
+ return {
256
+ router: this.router,
257
+ contextEngine: this.contextEngine,
258
+ embedder: this.embedder,
259
+ learner: this.learner,
260
+ schemaRegistry: this.schemaRegistry,
261
+ auditTrail: this.auditTrail,
262
+ costTracker: this.costTracker,
263
+ memory: this.memory,
264
+ queue: this.queue,
265
+ config: this.config,
266
+ };
267
+ }
268
+ }
269
+ /**
270
+ * Default phantom instance
271
+ */
272
+ export const phantom = new PhantomMind();
273
+ // Re-export everything
274
+ export * from './types.js';
275
+ export * from './config/index.js';
276
+ export * from './providers/index.js';
277
+ export * from './context/index.js';
278
+ export * from './adapters/index.js';
279
+ export * from './mcp/index.js';
280
+ export * from './agent/index.js';
281
+ export * from './quality/index.js';
282
+ export * from './schemas/index.js';
283
+ export * from './observability/index.js';
284
+ export * from './templates/index.js';
285
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { PhantomMCPServer, startMCPServer } from './server.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { PhantomMCPServer, startMCPServer } from './server.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * PhantomMindAI — MCP Server
3
+ * Model Context Protocol server with all project-aware tools.
4
+ */
5
+ export declare class PhantomMCPServer {
6
+ private server;
7
+ private contextEngine;
8
+ private embedder;
9
+ private projectRoot;
10
+ private config;
11
+ constructor();
12
+ private setupHandlers;
13
+ private handleGetProjectContext;
14
+ private handleGetRelevantContext;
15
+ private handleGetSchema;
16
+ private handleSearchCodebase;
17
+ private handleValidateOutput;
18
+ private handleGetExamples;
19
+ private handleGetPrd;
20
+ private handleGetDecisionLog;
21
+ private handleCheckConsistency;
22
+ /**
23
+ * Start the MCP server
24
+ */
25
+ start(): Promise<void>;
26
+ }
27
+ /**
28
+ * Start MCP server (entry point)
29
+ */
30
+ export declare function startMCPServer(): Promise<void>;
31
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,MAAM,CAAiB;;IAkB/B,OAAO,CAAC,aAAa;YAiJP,uBAAuB;YAevB,wBAAwB;YAkBxB,eAAe;YAyBf,oBAAoB;YAcpB,oBAAoB;YAyBpB,iBAAiB;YA0BjB,YAAY;YAUZ,oBAAoB;YA8BpB,sBAAsB;IAepC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAY7B;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAGpD"}
@@ -0,0 +1,334 @@
1
+ /**
2
+ * PhantomMindAI — MCP Server
3
+ * Model Context Protocol server with all project-aware tools.
4
+ */
5
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
7
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
8
+ import { ContextEngine } from '../context/engine.js';
9
+ import { CodebaseEmbedder } from '../context/embedder.js';
10
+ import { loadConfig, findProjectRoot } from '../config/index.js';
11
+ export class PhantomMCPServer {
12
+ server;
13
+ contextEngine;
14
+ embedder;
15
+ projectRoot;
16
+ config;
17
+ constructor() {
18
+ this.server = new Server({
19
+ name: 'phantomind',
20
+ version: '0.1.0',
21
+ }, {
22
+ capabilities: {
23
+ tools: {},
24
+ },
25
+ });
26
+ this.setupHandlers();
27
+ }
28
+ setupHandlers() {
29
+ // List tools
30
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
31
+ tools: [
32
+ {
33
+ name: 'get_project_context',
34
+ description: 'Get the full project context including architecture, conventions, and rules from PhantomMindAI. Returns SKILLS.md + RULES.md content, semantically ranked for the current file.',
35
+ inputSchema: {
36
+ type: 'object',
37
+ properties: {
38
+ file: { type: 'string', description: 'Current file path for relevance ranking' },
39
+ maxTokens: { type: 'number', description: 'Maximum tokens to return (default: 4000)' },
40
+ },
41
+ },
42
+ },
43
+ {
44
+ name: 'get_relevant_context',
45
+ description: 'Get semantically-ranked context relevant to the current file being edited. Prevents context overflow by only returning highly relevant sections.',
46
+ inputSchema: {
47
+ type: 'object',
48
+ properties: {
49
+ file: { type: 'string', description: 'Current file path' },
50
+ maxTokens: { type: 'number', description: 'Maximum tokens (default: 2000)' },
51
+ },
52
+ required: ['file'],
53
+ },
54
+ },
55
+ {
56
+ name: 'get_schema',
57
+ description: 'Get the output contract/schema for a specific task type from the project schema registry.',
58
+ inputSchema: {
59
+ type: 'object',
60
+ properties: {
61
+ name: { type: 'string', description: 'Schema name from registry' },
62
+ },
63
+ required: ['name'],
64
+ },
65
+ },
66
+ {
67
+ name: 'search_codebase',
68
+ description: 'Semantic search across project source files. Uses TF-IDF embeddings to find relevant code.',
69
+ inputSchema: {
70
+ type: 'object',
71
+ properties: {
72
+ query: { type: 'string', description: 'Search query' },
73
+ limit: { type: 'number', description: 'Maximum results (default: 5)' },
74
+ },
75
+ required: ['query'],
76
+ },
77
+ },
78
+ {
79
+ name: 'validate_output',
80
+ description: 'Validate generated code or content against project schema and conventions.',
81
+ inputSchema: {
82
+ type: 'object',
83
+ properties: {
84
+ content: { type: 'string', description: 'Content to validate' },
85
+ schema: { type: 'string', description: 'Schema name from registry' },
86
+ },
87
+ required: ['content', 'schema'],
88
+ },
89
+ },
90
+ {
91
+ name: 'get_examples',
92
+ description: 'Find relevant existing code examples from the project codebase.',
93
+ inputSchema: {
94
+ type: 'object',
95
+ properties: {
96
+ query: { type: 'string', description: 'What kind of code examples to find' },
97
+ limit: { type: 'number', description: 'Maximum examples (default: 3)' },
98
+ },
99
+ required: ['query'],
100
+ },
101
+ },
102
+ {
103
+ name: 'get_prd',
104
+ description: 'Return a relevant PRD (Product Requirements Document) section.',
105
+ inputSchema: {
106
+ type: 'object',
107
+ properties: {
108
+ name: { type: 'string', description: 'PRD name or feature name' },
109
+ },
110
+ required: ['name'],
111
+ },
112
+ },
113
+ {
114
+ name: 'get_decision_log',
115
+ description: 'Get past architectural decisions made by agents.',
116
+ inputSchema: {
117
+ type: 'object',
118
+ properties: {
119
+ file: { type: 'string', description: 'Filter by affected file' },
120
+ limit: { type: 'number', description: 'Maximum entries (default: 10)' },
121
+ },
122
+ },
123
+ },
124
+ {
125
+ name: 'check_consistency',
126
+ description: 'Find naming and pattern inconsistencies across the codebase.',
127
+ inputSchema: {
128
+ type: 'object',
129
+ properties: {
130
+ scope: { type: 'string', description: 'Scope of check: naming, pattern, architecture, all (default: all)' },
131
+ },
132
+ },
133
+ },
134
+ ],
135
+ }));
136
+ // Handle tool calls
137
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
138
+ const { name, arguments: args } = request.params;
139
+ try {
140
+ switch (name) {
141
+ case 'get_project_context':
142
+ return await this.handleGetProjectContext(args);
143
+ case 'get_relevant_context':
144
+ return await this.handleGetRelevantContext(args);
145
+ case 'get_schema':
146
+ return await this.handleGetSchema(args);
147
+ case 'search_codebase':
148
+ return await this.handleSearchCodebase(args);
149
+ case 'validate_output':
150
+ return await this.handleValidateOutput(args);
151
+ case 'get_examples':
152
+ return await this.handleGetExamples(args);
153
+ case 'get_prd':
154
+ return await this.handleGetPrd(args);
155
+ case 'get_decision_log':
156
+ return await this.handleGetDecisionLog(args);
157
+ case 'check_consistency':
158
+ return await this.handleCheckConsistency(args);
159
+ default:
160
+ return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
161
+ }
162
+ }
163
+ catch (error) {
164
+ return {
165
+ content: [{ type: 'text', text: `Error: ${error.message}` }],
166
+ isError: true,
167
+ };
168
+ }
169
+ });
170
+ }
171
+ async handleGetProjectContext(args) {
172
+ const result = await this.contextEngine.getProjectContext({
173
+ file: args?.file,
174
+ maxTokens: args?.maxTokens ?? 4000,
175
+ });
176
+ const content = result.layers.map(l => l.content).join('\n\n---\n\n');
177
+ return {
178
+ content: [{
179
+ type: 'text',
180
+ text: content || 'No project context found. Run `phantomind init` to set up.',
181
+ }],
182
+ };
183
+ }
184
+ async handleGetRelevantContext(args) {
185
+ const result = await this.contextEngine.getFileContext(args.file, args?.maxTokens ?? 2000);
186
+ const content = result.layers
187
+ .map(l => `[relevance: ${(l.relevanceScore * 100).toFixed(0)}%] ${l.type}\n${l.content}`)
188
+ .join('\n\n---\n\n');
189
+ return {
190
+ content: [{
191
+ type: 'text',
192
+ text: content || 'No relevant context found for this file.',
193
+ }],
194
+ };
195
+ }
196
+ async handleGetSchema(args) {
197
+ const { readFile } = await import('node:fs/promises');
198
+ const { join } = await import('node:path');
199
+ try {
200
+ const schemaContent = await readFile(join(this.projectRoot, this.config.context.schema), 'utf-8');
201
+ const schemas = JSON.parse(schemaContent);
202
+ const schema = schemas[args.name] ?? schemas;
203
+ return {
204
+ content: [{
205
+ type: 'text',
206
+ text: JSON.stringify(schema, null, 2),
207
+ }],
208
+ };
209
+ }
210
+ catch {
211
+ return {
212
+ content: [{ type: 'text', text: `Schema '${args.name}' not found.` }],
213
+ };
214
+ }
215
+ }
216
+ async handleSearchCodebase(args) {
217
+ const results = await this.embedder.search(args.query, args?.limit ?? 5);
218
+ if (results.length === 0) {
219
+ return { content: [{ type: 'text', text: 'No results found.' }] };
220
+ }
221
+ const text = results
222
+ .map((r, i) => `### Result ${i + 1}: ${r.path} (score: ${r.score.toFixed(3)})\n\`\`\`\n${r.snippet}\n\`\`\``)
223
+ .join('\n\n');
224
+ return { content: [{ type: 'text', text }] };
225
+ }
226
+ async handleValidateOutput(args) {
227
+ // Basic validation against project conventions
228
+ const context = await this.contextEngine.getProjectContext({ includeRules: true, maxTokens: 2000 });
229
+ const rulesLayer = context.layers.find(l => l.type === 'rules');
230
+ const issues = [];
231
+ // Check for common issues
232
+ if (args.content.includes('any')) {
233
+ issues.push('⚠️ Usage of `any` type detected — consider using specific types.');
234
+ }
235
+ if (args.content.match(/console\.(log|debug|warn)/)) {
236
+ issues.push('⚠️ Console statements detected — consider using proper logging.');
237
+ }
238
+ if (args.content.includes('TODO') || args.content.includes('FIXME')) {
239
+ issues.push('⚠️ TODO/FIXME comments detected — consider resolving before committing.');
240
+ }
241
+ const text = issues.length > 0
242
+ ? `Validation Report:\n${issues.join('\n')}`
243
+ : '✅ No issues detected.';
244
+ return { content: [{ type: 'text', text }] };
245
+ }
246
+ async handleGetExamples(args) {
247
+ const results = await this.embedder.search(args.query, args?.limit ?? 3);
248
+ if (results.length === 0) {
249
+ return { content: [{ type: 'text', text: 'No matching examples found.' }] };
250
+ }
251
+ const { readFile } = await import('node:fs/promises');
252
+ const { join } = await import('node:path');
253
+ const examples = await Promise.all(results.map(async (r) => {
254
+ try {
255
+ const content = await readFile(join(this.projectRoot, r.path), 'utf-8');
256
+ // Return first 100 lines
257
+ const lines = content.split('\n').slice(0, 100).join('\n');
258
+ return `### ${r.path}\n\`\`\`\n${lines}\n\`\`\``;
259
+ }
260
+ catch {
261
+ return `### ${r.path}\n(could not read file)`;
262
+ }
263
+ }));
264
+ return { content: [{ type: 'text', text: examples.join('\n\n') }] };
265
+ }
266
+ async handleGetPrd(args) {
267
+ const prd = await this.contextEngine.getPrdContext(args.name);
268
+ if (!prd) {
269
+ return { content: [{ type: 'text', text: `PRD '${args.name}' not found.` }] };
270
+ }
271
+ return { content: [{ type: 'text', text: prd.content }] };
272
+ }
273
+ async handleGetDecisionLog(args) {
274
+ const { readFile, readdir } = await import('node:fs/promises');
275
+ const { join } = await import('node:path');
276
+ try {
277
+ const decisionDir = join(this.projectRoot, this.config.context.decisions);
278
+ const files = await readdir(decisionDir);
279
+ const mdFiles = files.filter(f => f.endsWith('.md')).sort().reverse();
280
+ const limit = args?.limit ?? 10;
281
+ const entries = [];
282
+ for (const file of mdFiles.slice(0, limit)) {
283
+ const content = await readFile(join(decisionDir, file), 'utf-8');
284
+ if (args?.file && !content.includes(args.file))
285
+ continue;
286
+ entries.push(content);
287
+ }
288
+ return {
289
+ content: [{
290
+ type: 'text',
291
+ text: entries.length > 0 ? entries.join('\n\n---\n\n') : 'No decision log entries found.',
292
+ }],
293
+ };
294
+ }
295
+ catch {
296
+ return {
297
+ content: [{ type: 'text', text: 'No decision log directory found.' }],
298
+ };
299
+ }
300
+ }
301
+ async handleCheckConsistency(args) {
302
+ const sections = await this.contextEngine.searchContext('naming convention pattern', 10);
303
+ const scope = args?.scope ?? 'all';
304
+ const report = [
305
+ '# Consistency Check Report',
306
+ `Scope: ${scope}`,
307
+ `Timestamp: ${new Date().toISOString()}`,
308
+ '',
309
+ 'Run `phantomind check consistency` for a full detailed report.',
310
+ ];
311
+ return { content: [{ type: 'text', text: report.join('\n') }] };
312
+ }
313
+ /**
314
+ * Start the MCP server
315
+ */
316
+ async start() {
317
+ this.projectRoot = await findProjectRoot();
318
+ this.config = await loadConfig(this.projectRoot);
319
+ this.contextEngine = new ContextEngine(this.config, this.projectRoot);
320
+ this.embedder = new CodebaseEmbedder(this.projectRoot);
321
+ // Build embeddings in background
322
+ this.embedder.build().catch(() => { });
323
+ const transport = new StdioServerTransport();
324
+ await this.server.connect(transport);
325
+ }
326
+ }
327
+ /**
328
+ * Start MCP server (entry point)
329
+ */
330
+ export async function startMCPServer() {
331
+ const server = new PhantomMCPServer();
332
+ await server.start();
333
+ }
334
+ //# sourceMappingURL=server.js.map