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.
- package/README.md +152 -0
- package/dist/client/lexic-api.d.ts +65 -0
- package/dist/client/lexic-api.d.ts.map +1 -0
- package/dist/client/lexic-api.js +253 -0
- package/dist/client/lexic-api.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +30 -0
- package/dist/config.js.map +1 -0
- package/dist/core/admin.d.ts +74 -0
- package/dist/core/admin.d.ts.map +1 -0
- package/dist/core/admin.js +103 -0
- package/dist/core/admin.js.map +1 -0
- package/dist/core/context.d.ts +28 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +76 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +50 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/query.d.ts +47 -0
- package/dist/core/query.d.ts.map +1 -0
- package/dist/core/query.js +55 -0
- package/dist/core/query.js.map +1 -0
- package/dist/core/store.d.ts +35 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +55 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/types.d.ts +57 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/domains/development/index.d.ts +8 -0
- package/dist/domains/development/index.d.ts.map +1 -0
- package/dist/domains/development/index.js +18 -0
- package/dist/domains/development/index.js.map +1 -0
- package/dist/domains/development/tools.d.ts +97 -0
- package/dist/domains/development/tools.d.ts.map +1 -0
- package/dist/domains/development/tools.js +140 -0
- package/dist/domains/development/tools.js.map +1 -0
- package/dist/domains/index.d.ts +9 -0
- package/dist/domains/index.d.ts.map +1 -0
- package/dist/domains/index.js +8 -0
- package/dist/domains/index.js.map +1 -0
- package/dist/domains/loader.d.ts +34 -0
- package/dist/domains/loader.d.ts.map +1 -0
- package/dist/domains/loader.js +74 -0
- package/dist/domains/loader.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +162 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/errors.d.ts +27 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +48 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +63 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +53 -0
- 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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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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"}
|