lexic-mcp 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 (63) hide show
  1. package/README.md +152 -0
  2. package/dist/client/lexic-api.d.ts +65 -0
  3. package/dist/client/lexic-api.d.ts.map +1 -0
  4. package/dist/client/lexic-api.js +253 -0
  5. package/dist/client/lexic-api.js.map +1 -0
  6. package/dist/config.d.ts +14 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +30 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/core/admin.d.ts +74 -0
  11. package/dist/core/admin.d.ts.map +1 -0
  12. package/dist/core/admin.js +103 -0
  13. package/dist/core/admin.js.map +1 -0
  14. package/dist/core/context.d.ts +28 -0
  15. package/dist/core/context.d.ts.map +1 -0
  16. package/dist/core/context.js +76 -0
  17. package/dist/core/context.js.map +1 -0
  18. package/dist/core/index.d.ts +17 -0
  19. package/dist/core/index.d.ts.map +1 -0
  20. package/dist/core/index.js +50 -0
  21. package/dist/core/index.js.map +1 -0
  22. package/dist/core/query.d.ts +47 -0
  23. package/dist/core/query.d.ts.map +1 -0
  24. package/dist/core/query.js +55 -0
  25. package/dist/core/query.js.map +1 -0
  26. package/dist/core/store.d.ts +35 -0
  27. package/dist/core/store.d.ts.map +1 -0
  28. package/dist/core/store.js +55 -0
  29. package/dist/core/store.js.map +1 -0
  30. package/dist/core/types.d.ts +57 -0
  31. package/dist/core/types.d.ts.map +1 -0
  32. package/dist/core/types.js +7 -0
  33. package/dist/core/types.js.map +1 -0
  34. package/dist/domains/development/index.d.ts +8 -0
  35. package/dist/domains/development/index.d.ts.map +1 -0
  36. package/dist/domains/development/index.js +18 -0
  37. package/dist/domains/development/index.js.map +1 -0
  38. package/dist/domains/development/tools.d.ts +97 -0
  39. package/dist/domains/development/tools.d.ts.map +1 -0
  40. package/dist/domains/development/tools.js +140 -0
  41. package/dist/domains/development/tools.js.map +1 -0
  42. package/dist/domains/index.d.ts +9 -0
  43. package/dist/domains/index.d.ts.map +1 -0
  44. package/dist/domains/index.js +8 -0
  45. package/dist/domains/index.js.map +1 -0
  46. package/dist/domains/loader.d.ts +34 -0
  47. package/dist/domains/loader.d.ts.map +1 -0
  48. package/dist/domains/loader.js +74 -0
  49. package/dist/domains/loader.js.map +1 -0
  50. package/dist/index.d.ts +8 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +162 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/utils/errors.d.ts +27 -0
  55. package/dist/utils/errors.d.ts.map +1 -0
  56. package/dist/utils/errors.js +48 -0
  57. package/dist/utils/errors.js.map +1 -0
  58. package/dist/utils/logger.d.ts +20 -0
  59. package/dist/utils/logger.d.ts.map +1 -0
  60. package/dist/utils/logger.js +63 -0
  61. package/dist/utils/logger.js.map +1 -0
  62. package/package.json +53 -0
  63. package/templates/README.md +12 -0
package/README.md ADDED
@@ -0,0 +1,152 @@
1
+ # Lexic MCP Server
2
+
3
+ An MCP (Model Context Protocol) server that connects Claude Code to [Lexic](https://lexic.io) for persistent project knowledge management.
4
+
5
+ ## What It Does
6
+
7
+ - **Store decisions** — Log architectural choices with rationale
8
+ - **Query knowledge** — Search your project's knowledge base
9
+ - **Get context** — Retrieve aggregated context for features/topics
10
+ - **Maintain continuity** — Claude Code remembers across sessions
11
+
12
+ ## Quick Start
13
+
14
+ ### 1. Install
15
+
16
+ ```bash
17
+ npm install -g lexic-mcp
18
+ ```
19
+
20
+ Or clone and build:
21
+ ```bash
22
+ git clone https://github.com/yourusername/lexic-mcp.git
23
+ cd lexic-mcp
24
+ npm install
25
+ npm run build
26
+ ```
27
+
28
+ ### 2. Get a PAT from Lexic
29
+
30
+ 1. Log into [Lexic](https://lexic.io)
31
+ 2. Go to Settings → API Tokens
32
+ 3. Create a new token with `notes:*` and `read` scopes
33
+ 4. Copy the token (you won't see it again)
34
+
35
+ ### 3. Configure Claude Code
36
+
37
+ Add to your Claude Code settings (`~/.config/claude/settings.json`):
38
+
39
+ ```json
40
+ {
41
+ "mcpServers": {
42
+ "lexic": {
43
+ "command": "lexic-mcp",
44
+ "env": {
45
+ "LEXIC_API_URL": "https://lexic.io/api",
46
+ "LEXIC_PAT": "pat_xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
47
+ }
48
+ }
49
+ }
50
+ }
51
+ ```
52
+
53
+ Or if running from source:
54
+ ```json
55
+ {
56
+ "mcpServers": {
57
+ "lexic": {
58
+ "command": "node",
59
+ "args": ["/path/to/lexic-mcp/dist/index.js"],
60
+ "env": {
61
+ "LEXIC_API_URL": "https://lexic.io/api",
62
+ "LEXIC_PAT": "pat_xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
63
+ }
64
+ }
65
+ }
66
+ }
67
+ ```
68
+
69
+ ### 4. Use It
70
+
71
+ In Claude Code:
72
+
73
+ ```
74
+ "Search my knowledge base for entity-system decisions"
75
+ → Uses knowledge_query tool
76
+
77
+ "Log a decision: we're using IVFFlat for vector indexing because..."
78
+ → Uses dev_log_decision tool
79
+
80
+ "What context do I need to work on the billing feature?"
81
+ → Uses dev_get_feature_context tool
82
+ ```
83
+
84
+ ## Available Tools
85
+
86
+ ### Core (KOA)
87
+
88
+ | Tool | Description |
89
+ |------|-------------|
90
+ | `knowledge_query` | Search knowledge base |
91
+ | `knowledge_store` | Store new knowledge |
92
+ | `knowledge_get_context` | Get aggregated context for a topic |
93
+
94
+ ### Admin Tools (user-scoped PAT only)
95
+
96
+ | Tool | Description |
97
+ |------|-------------|
98
+ | `lexic_create_project` | Create a new project/lexicon |
99
+ | `lexic_list_projects` | List all accessible projects |
100
+ | `lexic_get_project_info` | Get current project info |
101
+
102
+ ### Development Domain
103
+
104
+ | Tool | Description |
105
+ |------|-------------|
106
+ | `dev_log_decision` | Log a development decision with template |
107
+ | `dev_get_feature_context` | Get feature-specific context |
108
+
109
+ ## Environment Variables
110
+
111
+ | Variable | Required | Default | Description |
112
+ |----------|----------|---------|-------------|
113
+ | `LEXIC_API_URL` | Yes | - | Lexic API base URL |
114
+ | `LEXIC_PAT` | Yes | - | Personal Access Token |
115
+ | `LEXIC_DOMAINS` | No | `development` | Comma-separated domains to load |
116
+ | `LEXIC_DOMAINS_PATH` | No | `./domains` | Path to domains folder |
117
+ | `LOG_LEVEL` | No | `info` | Logging level (debug, info, warn, error) |
118
+
119
+ ## Development
120
+
121
+ ```bash
122
+ # Install dependencies
123
+ npm install
124
+
125
+ # Build
126
+ npm run build
127
+
128
+ # Run tests
129
+ npm test
130
+
131
+ # Development mode (watch)
132
+ npm run dev
133
+ ```
134
+
135
+ ## Troubleshooting
136
+
137
+ ### "Invalid or expired token"
138
+
139
+ Your PAT has expired (max 30 days). Generate a new one in Lexic.
140
+
141
+ ### "Failed to connect to Lexic"
142
+
143
+ Check that `LEXIC_API_URL` is correct and the service is accessible.
144
+
145
+ ### Tools not appearing in Claude Code
146
+
147
+ 1. Restart Claude Code after changing settings
148
+ 2. Check server logs: `LOG_LEVEL=debug lexic-mcp`
149
+
150
+ ## License
151
+
152
+ MIT
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Lexic API Client
3
+ *
4
+ * See .claude/specs/IMPLEMENTATION.md Section 3
5
+ */
6
+ import type { Config } from '../config.js';
7
+ export interface LexicClient {
8
+ createNote(content: string, title?: string): Promise<CreateNoteResult>;
9
+ searchNotes(query: string, limit?: number): Promise<SearchResult[]>;
10
+ getNote(id: string): Promise<Note>;
11
+ updateNote(id: string, content: string): Promise<Note>;
12
+ semanticSearch(query: string, limit?: number): Promise<SearchResult[]>;
13
+ createLexicon(name: string, description?: string): Promise<CreateLexiconResult>;
14
+ listLexicons(): Promise<ListLexiconsResult>;
15
+ getCurrentLexiconInfo(): Promise<LexiconInfo>;
16
+ createNoteInLexicon(lexiconId: string, content: string, title?: string): Promise<CreateNoteResult>;
17
+ validateConnection(): Promise<ConnectionValidation>;
18
+ isUserScoped(): boolean;
19
+ getCurrentLexiconId(): string | undefined;
20
+ }
21
+ export interface CreateNoteResult {
22
+ success: boolean;
23
+ noteId?: string;
24
+ error?: string;
25
+ }
26
+ export interface SearchResult {
27
+ noteId: string;
28
+ title?: string;
29
+ content: string;
30
+ score: number;
31
+ createdAt: string;
32
+ updatedAt: string;
33
+ }
34
+ export interface Note {
35
+ id: string;
36
+ title?: string;
37
+ content: string;
38
+ createdAt: string;
39
+ updatedAt: string;
40
+ }
41
+ export interface CreateLexiconResult {
42
+ success: boolean;
43
+ lexiconId?: string;
44
+ error?: string;
45
+ }
46
+ export interface LexiconInfo {
47
+ id: string;
48
+ name: string;
49
+ description?: string;
50
+ noteCount: number;
51
+ createdAt: string;
52
+ updatedAt: string;
53
+ }
54
+ export interface ListLexiconsResult {
55
+ lexicons: LexiconInfo[];
56
+ }
57
+ export interface ConnectionValidation {
58
+ valid: boolean;
59
+ lexiconId?: string;
60
+ userId?: string;
61
+ isUserScoped: boolean;
62
+ error?: string;
63
+ }
64
+ export declare function createLexicClient(config: Config): LexicClient;
65
+ //# sourceMappingURL=lexic-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexic-api.d.ts","sourceRoot":"","sources":["../../src/client/lexic-api.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAe3C,MAAM,WAAW,WAAW;IAE1B,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvE,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGvD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAGvE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChF,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5C,qBAAqB,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAG9C,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAGnG,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAGpD,YAAY,IAAI,OAAO,CAAC;IACxB,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAcD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CA8R7D"}
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Lexic API Client
3
+ *
4
+ * See .claude/specs/IMPLEMENTATION.md Section 3
5
+ */
6
+ import { logger } from '../utils/logger.js';
7
+ import { LexicApiError, AuthenticationError, AuthorizationError, NotFoundError, RateLimitError, ServerError } from '../utils/errors.js';
8
+ // ============================================================================
9
+ // CONSTANTS
10
+ // ============================================================================
11
+ const REQUEST_TIMEOUT_MS = 30000;
12
+ const MAX_RETRIES = 1;
13
+ const INITIAL_RETRY_DELAY_MS = 1000;
14
+ // ============================================================================
15
+ // IMPLEMENTATION
16
+ // ============================================================================
17
+ export function createLexicClient(config) {
18
+ const { apiUrl, pat } = config;
19
+ // Track connection state
20
+ let connectionState = null;
21
+ // Helper to build headers
22
+ function getHeaders() {
23
+ return {
24
+ 'Authorization': `Bearer ${pat}`,
25
+ 'Content-Type': 'application/json'
26
+ };
27
+ }
28
+ // Helper to handle errors
29
+ function handleError(status, errorMessage, correlationId) {
30
+ switch (status) {
31
+ case 401:
32
+ throw new AuthenticationError(errorMessage, correlationId);
33
+ case 403:
34
+ throw new AuthorizationError(errorMessage, correlationId);
35
+ case 404:
36
+ throw new NotFoundError(errorMessage, correlationId);
37
+ case 429:
38
+ throw new RateLimitError(errorMessage, correlationId);
39
+ default:
40
+ if (status >= 500) {
41
+ throw new ServerError(errorMessage, status, correlationId);
42
+ }
43
+ throw new LexicApiError(errorMessage, status, correlationId);
44
+ }
45
+ }
46
+ // Core fetch with timeout, retry, and error handling
47
+ async function fetchWithRetry(url, options, retries = MAX_RETRIES) {
48
+ const controller = new AbortController();
49
+ const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
50
+ try {
51
+ const response = await fetch(url, {
52
+ ...options,
53
+ signal: controller.signal,
54
+ headers: {
55
+ ...getHeaders(),
56
+ ...options.headers
57
+ }
58
+ });
59
+ clearTimeout(timeoutId);
60
+ // Retry on 5xx errors
61
+ if (response.status >= 500 && retries > 0) {
62
+ const delay = INITIAL_RETRY_DELAY_MS * Math.pow(2, MAX_RETRIES - retries);
63
+ logger.debug('Retrying request after server error', {
64
+ url,
65
+ status: response.status,
66
+ delay,
67
+ retriesLeft: retries - 1
68
+ });
69
+ await sleep(delay);
70
+ return fetchWithRetry(url, options, retries - 1);
71
+ }
72
+ return response;
73
+ }
74
+ catch (error) {
75
+ clearTimeout(timeoutId);
76
+ if (error instanceof Error && error.name === 'AbortError') {
77
+ throw new LexicApiError('Request timeout', 408);
78
+ }
79
+ throw error;
80
+ }
81
+ }
82
+ // Parse response and handle errors
83
+ async function parseResponse(response) {
84
+ const correlationId = response.headers.get('x-correlation-id') || undefined;
85
+ const body = await response.json();
86
+ if (!response.ok) {
87
+ const errorMessage = body.error || `Request failed with status ${response.status}`;
88
+ handleError(response.status, errorMessage, correlationId);
89
+ }
90
+ return body;
91
+ }
92
+ return {
93
+ // ========================================================================
94
+ // CONNECTION VALIDATION
95
+ // ========================================================================
96
+ async validateConnection() {
97
+ try {
98
+ const response = await fetch(`${apiUrl}/auth/validate`, {
99
+ method: 'GET',
100
+ headers: getHeaders()
101
+ });
102
+ const body = await response.json();
103
+ if (!response.ok) {
104
+ connectionState = {
105
+ valid: false,
106
+ isUserScoped: false,
107
+ error: body.error || 'Authentication failed'
108
+ };
109
+ return connectionState;
110
+ }
111
+ connectionState = {
112
+ valid: body.valid ?? true,
113
+ lexiconId: body.lexiconId,
114
+ userId: body.userId,
115
+ isUserScoped: body.isUserScoped ?? !body.lexiconId
116
+ };
117
+ return connectionState;
118
+ }
119
+ catch (error) {
120
+ connectionState = {
121
+ valid: false,
122
+ isUserScoped: false,
123
+ error: `Network error: ${error instanceof Error ? error.message : String(error)}`
124
+ };
125
+ return connectionState;
126
+ }
127
+ },
128
+ // ========================================================================
129
+ // NOTES API
130
+ // ========================================================================
131
+ async createNote(content, title) {
132
+ try {
133
+ const response = await fetchWithRetry(`${apiUrl}/notes`, {
134
+ method: 'POST',
135
+ body: JSON.stringify({ content, title })
136
+ });
137
+ const body = await response.json();
138
+ if (!response.ok) {
139
+ return { success: false, error: body.error || 'Failed to create note' };
140
+ }
141
+ logger.debug('Note created', { noteId: body.id });
142
+ return { success: true, noteId: body.id };
143
+ }
144
+ catch (error) {
145
+ logger.error('Failed to create note', { error: error instanceof Error ? error.message : String(error) });
146
+ return { success: false, error: error instanceof Error ? error.message : 'Unknown error' };
147
+ }
148
+ },
149
+ async searchNotes(query, limit = 10) {
150
+ const url = `${apiUrl}/notes/search?q=${encodeURIComponent(query)}&limit=${limit}`;
151
+ const response = await fetchWithRetry(url, { method: 'GET' });
152
+ const body = await parseResponse(response);
153
+ return body.results.map(r => ({
154
+ noteId: r.id,
155
+ title: r.title,
156
+ content: r.content,
157
+ score: r.score,
158
+ createdAt: r.createdAt,
159
+ updatedAt: r.updatedAt
160
+ }));
161
+ },
162
+ async getNote(id) {
163
+ const url = `${apiUrl}/notes/${encodeURIComponent(id)}`;
164
+ const response = await fetchWithRetry(url, { method: 'GET' });
165
+ return parseResponse(response);
166
+ },
167
+ async updateNote(id, content) {
168
+ const url = `${apiUrl}/notes/${encodeURIComponent(id)}`;
169
+ const response = await fetchWithRetry(url, {
170
+ method: 'PATCH',
171
+ body: JSON.stringify({ content })
172
+ });
173
+ return parseResponse(response);
174
+ },
175
+ // ========================================================================
176
+ // SEMANTIC SEARCH
177
+ // ========================================================================
178
+ async semanticSearch(query, limit = 10) {
179
+ const url = `${apiUrl}/search?q=${encodeURIComponent(query)}&limit=${limit}&type=semantic`;
180
+ const response = await fetchWithRetry(url, { method: 'GET' });
181
+ const body = await parseResponse(response);
182
+ return body.results.map(r => ({
183
+ noteId: r.id,
184
+ title: r.title,
185
+ content: r.content,
186
+ score: r.score,
187
+ createdAt: r.createdAt,
188
+ updatedAt: r.updatedAt
189
+ }));
190
+ },
191
+ // ========================================================================
192
+ // LEXICON MANAGEMENT (user-scoped PAT only)
193
+ // ========================================================================
194
+ async createLexicon(name, description) {
195
+ try {
196
+ const response = await fetchWithRetry(`${apiUrl}/lexicons`, {
197
+ method: 'POST',
198
+ body: JSON.stringify({ name, description })
199
+ });
200
+ const body = await response.json();
201
+ if (!response.ok) {
202
+ return { success: false, error: body.error || 'Failed to create lexicon' };
203
+ }
204
+ logger.debug('Lexicon created', { lexiconId: body.id });
205
+ return { success: true, lexiconId: body.id };
206
+ }
207
+ catch (error) {
208
+ return { success: false, error: error instanceof Error ? error.message : 'Unknown error' };
209
+ }
210
+ },
211
+ async listLexicons() {
212
+ const response = await fetchWithRetry(`${apiUrl}/lexicons`, { method: 'GET' });
213
+ const body = await parseResponse(response);
214
+ return body;
215
+ },
216
+ async getCurrentLexiconInfo() {
217
+ const response = await fetchWithRetry(`${apiUrl}/lexicons/current`, { method: 'GET' });
218
+ return parseResponse(response);
219
+ },
220
+ async createNoteInLexicon(lexiconId, content, title) {
221
+ try {
222
+ const response = await fetchWithRetry(`${apiUrl}/lexicons/${encodeURIComponent(lexiconId)}/notes`, {
223
+ method: 'POST',
224
+ body: JSON.stringify({ content, title })
225
+ });
226
+ const body = await response.json();
227
+ if (!response.ok) {
228
+ return { success: false, error: body.error || 'Failed to create note' };
229
+ }
230
+ return { success: true, noteId: body.id };
231
+ }
232
+ catch (error) {
233
+ return { success: false, error: error instanceof Error ? error.message : 'Unknown error' };
234
+ }
235
+ },
236
+ // ========================================================================
237
+ // CONTEXT HELPERS
238
+ // ========================================================================
239
+ isUserScoped() {
240
+ return connectionState?.isUserScoped ?? false;
241
+ },
242
+ getCurrentLexiconId() {
243
+ return connectionState?.lexiconId;
244
+ }
245
+ };
246
+ }
247
+ // ============================================================================
248
+ // HELPERS
249
+ // ============================================================================
250
+ function sleep(ms) {
251
+ return new Promise(resolve => setTimeout(resolve, ms));
252
+ }
253
+ //# sourceMappingURL=lexic-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexic-api.js","sourceRoot":"","sources":["../../src/client/lexic-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Configuration Loading
3
+ *
4
+ * See .claude/specs/IMPLEMENTATION.md Section 2
5
+ */
6
+ export interface Config {
7
+ apiUrl: string;
8
+ pat: string;
9
+ domainsPath: string;
10
+ domains: string[];
11
+ logLevel: 'debug' | 'info' | 'warn' | 'error';
12
+ }
13
+ export declare function loadConfig(): Config;
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC/C;AAED,wBAAgB,UAAU,IAAI,MAAM,CAuBnC"}
package/dist/config.js ADDED
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Configuration Loading
3
+ *
4
+ * See .claude/specs/IMPLEMENTATION.md Section 2
5
+ */
6
+ import path from 'path';
7
+ export function loadConfig() {
8
+ const apiUrl = process.env.LEXIC_API_URL;
9
+ const pat = process.env.LEXIC_PAT;
10
+ if (!apiUrl)
11
+ throw new Error('LEXIC_API_URL is required');
12
+ if (!pat)
13
+ throw new Error('LEXIC_PAT is required');
14
+ if (!pat.startsWith('pat_'))
15
+ throw new Error('LEXIC_PAT must start with pat_');
16
+ // Parse domains list
17
+ const domainsEnv = process.env.LEXIC_DOMAINS || 'development';
18
+ const domains = domainsEnv.split(',').map(d => d.trim()).filter(Boolean);
19
+ // Resolve domains path (default: ./domains relative to package root)
20
+ const domainsPath = process.env.LEXIC_DOMAINS_PATH ||
21
+ path.resolve(process.cwd(), 'domains');
22
+ return {
23
+ apiUrl,
24
+ pat,
25
+ domainsPath,
26
+ domains,
27
+ logLevel: process.env.LOG_LEVEL || 'info'
28
+ };
29
+ }
30
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAUxB,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAElC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC1D,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAE/E,qBAAqB;IACrB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,aAAa,CAAC;IAC9D,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEzE,qEAAqE;IACrE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB;QAChD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;IAEzC,OAAO;QACL,MAAM;QACN,GAAG;QACH,WAAW;QACX,OAAO;QACP,QAAQ,EAAG,OAAO,CAAC,GAAG,CAAC,SAAgC,IAAI,MAAM;KAClE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Lexic Admin Tools
3
+ *
4
+ * Manage lexicons (projects). Only available with user-scoped PATs.
5
+ */
6
+ import type { LexicClient } from '../client/lexic-api.js';
7
+ export interface CreateProjectParams {
8
+ name: string;
9
+ description?: string;
10
+ domain?: string;
11
+ }
12
+ export interface CreateProjectResult {
13
+ success: boolean;
14
+ projectId: string;
15
+ name: string;
16
+ seededNotes?: number;
17
+ message: string;
18
+ }
19
+ export interface ProjectInfo {
20
+ id: string;
21
+ name: string;
22
+ description?: string;
23
+ noteCount: number;
24
+ createdAt: string;
25
+ updatedAt: string;
26
+ }
27
+ export interface ListProjectsResult {
28
+ projects: ProjectInfo[];
29
+ total: number;
30
+ }
31
+ export declare function createCreateProjectTool(client: LexicClient, seeders: Map<string, (client: LexicClient, lexiconId: string) => Promise<number>>): {
32
+ name: string;
33
+ description: string;
34
+ inputSchema: {
35
+ type: "object";
36
+ properties: {
37
+ name: {
38
+ type: string;
39
+ description: string;
40
+ };
41
+ description: {
42
+ type: string;
43
+ description: string;
44
+ };
45
+ domain: {
46
+ type: string;
47
+ description: string;
48
+ };
49
+ };
50
+ required: string[];
51
+ };
52
+ handler: (params: CreateProjectParams) => Promise<CreateProjectResult>;
53
+ };
54
+ export declare function createListProjectsTool(client: LexicClient): {
55
+ name: string;
56
+ description: string;
57
+ inputSchema: {
58
+ type: "object";
59
+ properties: {};
60
+ required: never[];
61
+ };
62
+ handler: () => Promise<ListProjectsResult>;
63
+ };
64
+ export declare function createGetProjectInfoTool(client: LexicClient): {
65
+ name: string;
66
+ description: string;
67
+ inputSchema: {
68
+ type: "object";
69
+ properties: {};
70
+ required: never[];
71
+ };
72
+ handler: () => Promise<ProjectInfo>;
73
+ };
74
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/core/admin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAM1D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;sBAuBvD,mBAAmB,KAAG,OAAO,CAAC,mBAAmB,CAAC;EA6B7E;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW;;;;;;;;mBASnC,OAAO,CAAC,kBAAkB,CAAC;EAgBjD;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,WAAW;;;;;;;;mBASrC,OAAO,CAAC,WAAW,CAAC;EAa1C"}