lexic-mcp 0.1.0 → 0.1.2

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 (64) hide show
  1. package/README.md +10 -1
  2. package/dist/bundle.cjs +49 -0
  3. package/dist/index.js +5 -8
  4. package/package.json +6 -5
  5. package/dist/client/lexic-api.d.ts +0 -65
  6. package/dist/client/lexic-api.d.ts.map +0 -1
  7. package/dist/client/lexic-api.js +0 -253
  8. package/dist/client/lexic-api.js.map +0 -1
  9. package/dist/config.d.ts +0 -14
  10. package/dist/config.d.ts.map +0 -1
  11. package/dist/config.js +0 -30
  12. package/dist/config.js.map +0 -1
  13. package/dist/core/admin.d.ts +0 -74
  14. package/dist/core/admin.d.ts.map +0 -1
  15. package/dist/core/admin.js +0 -103
  16. package/dist/core/admin.js.map +0 -1
  17. package/dist/core/context.d.ts +0 -28
  18. package/dist/core/context.d.ts.map +0 -1
  19. package/dist/core/context.js +0 -76
  20. package/dist/core/context.js.map +0 -1
  21. package/dist/core/index.d.ts +0 -17
  22. package/dist/core/index.d.ts.map +0 -1
  23. package/dist/core/index.js +0 -50
  24. package/dist/core/index.js.map +0 -1
  25. package/dist/core/query.d.ts +0 -47
  26. package/dist/core/query.d.ts.map +0 -1
  27. package/dist/core/query.js +0 -55
  28. package/dist/core/query.js.map +0 -1
  29. package/dist/core/store.d.ts +0 -35
  30. package/dist/core/store.d.ts.map +0 -1
  31. package/dist/core/store.js +0 -55
  32. package/dist/core/store.js.map +0 -1
  33. package/dist/core/types.d.ts +0 -57
  34. package/dist/core/types.d.ts.map +0 -1
  35. package/dist/core/types.js +0 -7
  36. package/dist/core/types.js.map +0 -1
  37. package/dist/domains/development/index.d.ts +0 -8
  38. package/dist/domains/development/index.d.ts.map +0 -1
  39. package/dist/domains/development/index.js +0 -18
  40. package/dist/domains/development/index.js.map +0 -1
  41. package/dist/domains/development/tools.d.ts +0 -97
  42. package/dist/domains/development/tools.d.ts.map +0 -1
  43. package/dist/domains/development/tools.js +0 -140
  44. package/dist/domains/development/tools.js.map +0 -1
  45. package/dist/domains/index.d.ts +0 -9
  46. package/dist/domains/index.d.ts.map +0 -1
  47. package/dist/domains/index.js +0 -8
  48. package/dist/domains/index.js.map +0 -1
  49. package/dist/domains/loader.d.ts +0 -34
  50. package/dist/domains/loader.d.ts.map +0 -1
  51. package/dist/domains/loader.js +0 -74
  52. package/dist/domains/loader.js.map +0 -1
  53. package/dist/index.d.ts +0 -8
  54. package/dist/index.d.ts.map +0 -1
  55. package/dist/index.js.map +0 -1
  56. package/dist/utils/errors.d.ts +0 -27
  57. package/dist/utils/errors.d.ts.map +0 -1
  58. package/dist/utils/errors.js +0 -48
  59. package/dist/utils/errors.js.map +0 -1
  60. package/dist/utils/logger.d.ts +0 -20
  61. package/dist/utils/logger.d.ts.map +0 -1
  62. package/dist/utils/logger.js +0 -63
  63. package/dist/utils/logger.js.map +0 -1
  64. package/templates/README.md +0 -12
@@ -1,103 +0,0 @@
1
- /**
2
- * Lexic Admin Tools
3
- *
4
- * Manage lexicons (projects). Only available with user-scoped PATs.
5
- */
6
- // ============================================================================
7
- // TOOLS
8
- // ============================================================================
9
- export function createCreateProjectTool(client, seeders) {
10
- return {
11
- name: 'lexic_create_project',
12
- description: 'Create a new project (lexicon) for knowledge management. Optionally seed with domain-specific initial structure.',
13
- inputSchema: {
14
- type: 'object',
15
- properties: {
16
- name: {
17
- type: 'string',
18
- description: 'Project name (e.g., "lexic-mcp", "Q1 Planning")'
19
- },
20
- description: {
21
- type: 'string',
22
- description: 'Optional project description'
23
- },
24
- domain: {
25
- type: 'string',
26
- description: 'Optional domain to seed initial notes (e.g., "development")'
27
- }
28
- },
29
- required: ['name']
30
- },
31
- handler: async (params) => {
32
- const { name, description, domain } = params;
33
- // Create the lexicon
34
- const result = await client.createLexicon(name, description);
35
- if (!result.success || !result.lexiconId) {
36
- throw new Error(`Failed to create project: ${result.error}`);
37
- }
38
- let seededNotes = 0;
39
- // If domain specified, run its seeder
40
- if (domain && seeders.has(domain)) {
41
- const seeder = seeders.get(domain);
42
- seededNotes = await seeder(client, result.lexiconId);
43
- }
44
- return {
45
- success: true,
46
- projectId: result.lexiconId,
47
- name,
48
- seededNotes,
49
- message: seededNotes > 0
50
- ? `Project "${name}" created with ${seededNotes} initial notes from ${domain} domain`
51
- : `Project "${name}" created`
52
- };
53
- }
54
- };
55
- }
56
- export function createListProjectsTool(client) {
57
- return {
58
- name: 'lexic_list_projects',
59
- description: 'List all accessible projects (lexicons)',
60
- inputSchema: {
61
- type: 'object',
62
- properties: {},
63
- required: []
64
- },
65
- handler: async () => {
66
- const result = await client.listLexicons();
67
- return {
68
- projects: result.lexicons.map(l => ({
69
- id: l.id,
70
- name: l.name,
71
- description: l.description,
72
- noteCount: l.noteCount,
73
- createdAt: l.createdAt,
74
- updatedAt: l.updatedAt
75
- })),
76
- total: result.lexicons.length
77
- };
78
- }
79
- };
80
- }
81
- export function createGetProjectInfoTool(client) {
82
- return {
83
- name: 'lexic_get_project_info',
84
- description: 'Get information about the current project (lexicon)',
85
- inputSchema: {
86
- type: 'object',
87
- properties: {},
88
- required: []
89
- },
90
- handler: async () => {
91
- const info = await client.getCurrentLexiconInfo();
92
- return {
93
- id: info.id,
94
- name: info.name,
95
- description: info.description,
96
- noteCount: info.noteCount,
97
- createdAt: info.createdAt,
98
- updatedAt: info.updatedAt
99
- };
100
- }
101
- };
102
- }
103
- //# sourceMappingURL=admin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/core/admin.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- /**
2
- * knowledge.get_context tool
3
- *
4
- * See .claude/specs/IMPLEMENTATION.md Section 4.3
5
- */
6
- import type { LexicClient } from '../client/lexic-api.js';
7
- import type { ContextParams, ContextResult } from './types.js';
8
- export declare function createContextTool(client: LexicClient): {
9
- name: string;
10
- description: string;
11
- inputSchema: {
12
- type: string;
13
- properties: {
14
- topic: {
15
- type: string;
16
- description: string;
17
- };
18
- depth: {
19
- type: string;
20
- enum: string[];
21
- description: string;
22
- };
23
- };
24
- required: string[];
25
- };
26
- handler: (params: ContextParams) => Promise<ContextResult>;
27
- };
28
- //# sourceMappingURL=context.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW;;;;;;;;;;;;;;;;;;sBAmBzB,aAAa,KAAG,OAAO,CAAC,aAAa,CAAC;EAmDjE"}
@@ -1,76 +0,0 @@
1
- /**
2
- * knowledge.get_context tool
3
- *
4
- * See .claude/specs/IMPLEMENTATION.md Section 4.3
5
- */
6
- export function createContextTool(client) {
7
- return {
8
- name: 'knowledge_get_context',
9
- description: 'Get comprehensive context about a feature or topic. Returns relevant decisions, status, and related information aggregated into a summary.',
10
- inputSchema: {
11
- type: 'object',
12
- properties: {
13
- topic: {
14
- type: 'string',
15
- description: 'The feature, component, or topic to get context for'
16
- },
17
- depth: {
18
- type: 'string',
19
- enum: ['brief', 'standard', 'comprehensive'],
20
- description: 'How much context to retrieve (default: standard)'
21
- }
22
- },
23
- required: ['topic']
24
- },
25
- handler: async (params) => {
26
- const { topic, depth = 'standard' } = params;
27
- const limits = {
28
- brief: 3,
29
- standard: 5,
30
- comprehensive: 10
31
- };
32
- const results = await client.semanticSearch(topic, limits[depth]);
33
- if (results.length === 0) {
34
- return {
35
- topic,
36
- hasContext: false,
37
- summary: `No existing knowledge found for "${topic}".`,
38
- suggestions: [
39
- 'This may be a new topic. Consider documenting initial decisions.',
40
- 'Try broader search terms if you expected results.'
41
- ]
42
- };
43
- }
44
- // Categorize results
45
- const decisions = results.filter(r => r.content.toLowerCase().includes('decision:') ||
46
- r.title?.toLowerCase().includes('decision'));
47
- const general = results.filter(r => !r.content.toLowerCase().includes('decision:') &&
48
- !r.title?.toLowerCase().includes('decision'));
49
- return {
50
- topic,
51
- hasContext: true,
52
- summary: `Found ${results.length} relevant notes for "${topic}".`,
53
- decisions: decisions.map(d => ({
54
- title: extractTitle(d.content) || d.title || 'Decision',
55
- date: d.updatedAt,
56
- excerpt: truncate(d.content, 200)
57
- })),
58
- relatedNotes: general.map(n => ({
59
- title: n.title || 'Note',
60
- excerpt: truncate(n.content, 300)
61
- })),
62
- lastUpdated: results[0].updatedAt
63
- };
64
- }
65
- };
66
- }
67
- function extractTitle(content) {
68
- const match = content.match(/^#\s+(.+)$/m);
69
- return match?.[1];
70
- }
71
- function truncate(text, maxLength) {
72
- if (text.length <= maxLength)
73
- return text;
74
- return text.slice(0, maxLength - 3) + '...';
75
- }
76
- //# sourceMappingURL=context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/core/context.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /**
2
- * KOA Core Tools Registration
3
- */
4
- import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
5
- import type { LexicClient } from '../client/lexic-api.js';
6
- /**
7
- * Register core KOA tools with the MCP server.
8
- * These are always available regardless of domain.
9
- */
10
- export declare function registerCoreTools(server: Server, client: LexicClient): void;
11
- /**
12
- * Register admin tools (only if PAT is user-scoped).
13
- * These allow creating and managing lexicons.
14
- */
15
- export declare function registerAdminTools(server: Server, client: LexicClient, seeders: Map<string, (client: LexicClient, lexiconId: string) => Promise<number>>): void;
16
- export * from './types.js';
17
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAW1D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAgB3E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAChF,IAAI,CAqBN;AAED,cAAc,YAAY,CAAC"}
@@ -1,50 +0,0 @@
1
- /**
2
- * KOA Core Tools Registration
3
- */
4
- import { createQueryTool } from './query.js';
5
- import { createStoreTool } from './store.js';
6
- import { createContextTool } from './context.js';
7
- import { createCreateProjectTool, createListProjectsTool, createGetProjectInfoTool } from './admin.js';
8
- import { logger } from '../utils/logger.js';
9
- /**
10
- * Register core KOA tools with the MCP server.
11
- * These are always available regardless of domain.
12
- */
13
- export function registerCoreTools(server, client) {
14
- const queryTool = createQueryTool(client);
15
- const storeTool = createStoreTool(client);
16
- const contextTool = createContextTool(client);
17
- // TODO: Register tools with MCP server
18
- // See spec Section 6 for registration pattern
19
- void server;
20
- void queryTool;
21
- void storeTool;
22
- void contextTool;
23
- logger.debug('Registered core KOA tools', {
24
- tools: ['knowledge_query', 'knowledge_store', 'knowledge_get_context']
25
- });
26
- }
27
- /**
28
- * Register admin tools (only if PAT is user-scoped).
29
- * These allow creating and managing lexicons.
30
- */
31
- export function registerAdminTools(server, client, seeders) {
32
- // Only register if PAT allows multiple lexicons
33
- if (!client.isUserScoped()) {
34
- logger.debug('Skipping admin tools (PAT is lexicon-scoped)');
35
- return;
36
- }
37
- const createProjectTool = createCreateProjectTool(client, seeders);
38
- const listProjectsTool = createListProjectsTool(client);
39
- const getProjectInfoTool = createGetProjectInfoTool(client);
40
- // TODO: Register tools with MCP server
41
- void server;
42
- void createProjectTool;
43
- void listProjectsTool;
44
- void getProjectInfoTool;
45
- logger.debug('Registered admin tools', {
46
- tools: ['lexic_create_project', 'lexic_list_projects', 'lexic_get_project_info']
47
- });
48
- }
49
- export * from './types.js';
50
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,MAAmB;IACnE,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE9C,uCAAuC;IACvC,8CAA8C;IAE9C,KAAK,MAAM,CAAC;IACZ,KAAK,SAAS,CAAC;IACf,KAAK,SAAS,CAAC;IACf,KAAK,WAAW,CAAC;IAEjB,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;QACxC,KAAK,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,uBAAuB,CAAC;KACvE,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAc,EACd,MAAmB,EACnB,OAAiF;IAEjF,gDAAgD;IAChD,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnE,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAE5D,uCAAuC;IAEvC,KAAK,MAAM,CAAC;IACZ,KAAK,iBAAiB,CAAC;IACvB,KAAK,gBAAgB,CAAC;IACtB,KAAK,kBAAkB,CAAC;IAExB,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;QACrC,KAAK,EAAE,CAAC,sBAAsB,EAAE,qBAAqB,EAAE,wBAAwB,CAAC;KACjF,CAAC,CAAC;AACL,CAAC;AAED,cAAc,YAAY,CAAC"}
@@ -1,47 +0,0 @@
1
- /**
2
- * knowledge.query tool
3
- *
4
- * See .claude/specs/IMPLEMENTATION.md Section 4.1
5
- */
6
- import type { LexicClient } from '../client/lexic-api.js';
7
- import type { QueryParams, QueryResult } from './types.js';
8
- export declare function createQueryTool(client: LexicClient): {
9
- name: string;
10
- description: string;
11
- inputSchema: {
12
- type: string;
13
- properties: {
14
- query: {
15
- type: string;
16
- description: string;
17
- };
18
- limit: {
19
- type: string;
20
- description: string;
21
- };
22
- filter: {
23
- type: string;
24
- description: string;
25
- properties: {
26
- tags: {
27
- type: string;
28
- items: {
29
- type: string;
30
- };
31
- };
32
- dateFrom: {
33
- type: string;
34
- format: string;
35
- };
36
- dateTo: {
37
- type: string;
38
- format: string;
39
- };
40
- };
41
- };
42
- };
43
- required: string[];
44
- };
45
- handler: (params: QueryParams) => Promise<QueryResult>;
46
- };
47
- //# sourceMappingURL=query.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/core/query.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA2BvB,WAAW,KAAG,OAAO,CAAC,WAAW,CAAC;EAkB7D"}
@@ -1,55 +0,0 @@
1
- /**
2
- * knowledge.query tool
3
- *
4
- * See .claude/specs/IMPLEMENTATION.md Section 4.1
5
- */
6
- export function createQueryTool(client) {
7
- return {
8
- name: 'knowledge_query',
9
- description: 'Search the project knowledge base for relevant information. Use this to find decisions, context, or documentation about a topic.',
10
- inputSchema: {
11
- type: 'object',
12
- properties: {
13
- query: {
14
- type: 'string',
15
- description: 'Search query - can be natural language or keywords'
16
- },
17
- limit: {
18
- type: 'number',
19
- description: 'Maximum results to return (default: 5, max: 20)'
20
- },
21
- filter: {
22
- type: 'object',
23
- description: 'Optional filters',
24
- properties: {
25
- tags: { type: 'array', items: { type: 'string' } },
26
- dateFrom: { type: 'string', format: 'date' },
27
- dateTo: { type: 'string', format: 'date' }
28
- }
29
- }
30
- },
31
- required: ['query']
32
- },
33
- handler: async (params) => {
34
- const { query, limit = 5 } = params;
35
- const results = await client.semanticSearch(query, Math.min(limit, 20));
36
- return {
37
- results: results.map(r => ({
38
- id: r.noteId,
39
- title: r.title,
40
- excerpt: truncate(r.content, 500),
41
- relevance: r.score,
42
- date: r.updatedAt
43
- })),
44
- totalFound: results.length,
45
- query
46
- };
47
- }
48
- };
49
- }
50
- function truncate(text, maxLength) {
51
- if (text.length <= maxLength)
52
- return text;
53
- return text.slice(0, maxLength - 3) + '...';
54
- }
55
- //# sourceMappingURL=query.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/core/query.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,UAAU,eAAe,CAAC,MAAmB;IACjD,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,kIAAkI;QAC/I,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,oDAAoD;iBAClE;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iDAAiD;iBAC/D;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kBAAkB;oBAC/B,UAAU,EAAE;wBACV,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;wBAClD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;wBAC5C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;qBAC3C;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;QACD,OAAO,EAAE,KAAK,EAAE,MAAmB,EAAwB,EAAE;YAC3D,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC;YAEpC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;YAExE,OAAO;gBACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACzB,EAAE,EAAE,CAAC,CAAC,MAAM;oBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;oBACjC,SAAS,EAAE,CAAC,CAAC,KAAK;oBAClB,IAAI,EAAE,CAAC,CAAC,SAAS;iBAClB,CAAC,CAAC;gBACH,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,KAAK;aACN,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,SAAiB;IAC/C,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC9C,CAAC"}
@@ -1,35 +0,0 @@
1
- /**
2
- * knowledge.store tool
3
- *
4
- * See .claude/specs/IMPLEMENTATION.md Section 4.2
5
- */
6
- import type { LexicClient } from '../client/lexic-api.js';
7
- import type { StoreParams, StoreResult } from './types.js';
8
- export declare function createStoreTool(client: LexicClient): {
9
- name: string;
10
- description: string;
11
- inputSchema: {
12
- type: string;
13
- properties: {
14
- content: {
15
- type: string;
16
- description: string;
17
- };
18
- title: {
19
- type: string;
20
- description: string;
21
- };
22
- template: {
23
- type: string;
24
- description: string;
25
- };
26
- variables: {
27
- type: string;
28
- description: string;
29
- };
30
- };
31
- required: string[];
32
- };
33
- handler: (params: StoreParams) => Promise<StoreResult>;
34
- };
35
- //# sourceMappingURL=store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;sBA0BvB,WAAW,KAAG,OAAO,CAAC,WAAW,CAAC;EAuB7D"}
@@ -1,55 +0,0 @@
1
- /**
2
- * knowledge.store tool
3
- *
4
- * See .claude/specs/IMPLEMENTATION.md Section 4.2
5
- */
6
- export function createStoreTool(client) {
7
- return {
8
- name: 'knowledge_store',
9
- description: 'Store new knowledge in the project knowledge base. Use this to save decisions, findings, or important context.',
10
- inputSchema: {
11
- type: 'object',
12
- properties: {
13
- content: {
14
- type: 'string',
15
- description: 'The content to store (markdown supported)'
16
- },
17
- title: {
18
- type: 'string',
19
- description: 'Optional title for the note'
20
- },
21
- template: {
22
- type: 'string',
23
- description: "Optional template to use (e.g., 'decision', 'finding')"
24
- },
25
- variables: {
26
- type: 'object',
27
- description: 'Variables to fill in template'
28
- }
29
- },
30
- required: ['content']
31
- },
32
- handler: async (params) => {
33
- const { content, title, template, variables } = params;
34
- let finalContent = content;
35
- // If template specified, render it
36
- if (template && variables) {
37
- finalContent = await renderTemplate(template, variables);
38
- }
39
- const result = await client.createNote(finalContent, title);
40
- if (!result.success) {
41
- throw new Error(`Failed to store knowledge: ${result.error}`);
42
- }
43
- return {
44
- success: true,
45
- noteId: result.noteId,
46
- message: 'Knowledge stored successfully'
47
- };
48
- }
49
- };
50
- }
51
- async function renderTemplate(_templateName, _variables) {
52
- // TODO: Implement template loading and rendering
53
- throw new Error('Template rendering not yet implemented');
54
- }
55
- //# sourceMappingURL=store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,UAAU,eAAe,CAAC,MAAmB;IACjD,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,gHAAgH;QAC7H,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2CAA2C;iBACzD;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6BAA6B;iBAC3C;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,wDAAwD;iBACtE;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+BAA+B;iBAC7C;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;SACtB;QACD,OAAO,EAAE,KAAK,EAAE,MAAmB,EAAwB,EAAE;YAC3D,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;YAEvD,IAAI,YAAY,GAAG,OAAO,CAAC;YAE3B,mCAAmC;YACnC,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;gBAC1B,YAAY,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC3D,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YAE5D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAChE,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,OAAO,EAAE,+BAA+B;aACzC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,aAAqB,EACrB,UAAmC;IAEnC,iDAAiD;IACjD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC5D,CAAC"}
@@ -1,57 +0,0 @@
1
- /**
2
- * KOA Core Types
3
- *
4
- * Shared types for Knowledge-Orchestrated Actions
5
- */
6
- export interface QueryParams {
7
- query: string;
8
- limit?: number;
9
- filter?: {
10
- tags?: string[];
11
- dateFrom?: string;
12
- dateTo?: string;
13
- };
14
- }
15
- export interface QueryResult {
16
- results: Array<{
17
- id: string;
18
- title?: string;
19
- excerpt: string;
20
- relevance: number;
21
- date: string;
22
- }>;
23
- totalFound: number;
24
- query: string;
25
- }
26
- export interface StoreParams {
27
- content: string;
28
- title?: string;
29
- template?: string;
30
- variables?: Record<string, unknown>;
31
- }
32
- export interface StoreResult {
33
- success: boolean;
34
- noteId?: string;
35
- message: string;
36
- }
37
- export interface ContextParams {
38
- topic: string;
39
- depth?: 'brief' | 'standard' | 'comprehensive';
40
- }
41
- export interface ContextResult {
42
- topic: string;
43
- hasContext: boolean;
44
- summary: string;
45
- decisions?: Array<{
46
- title: string;
47
- date: string;
48
- excerpt: string;
49
- }>;
50
- relatedNotes?: Array<{
51
- title: string;
52
- excerpt: string;
53
- }>;
54
- suggestions?: string[];
55
- lastUpdated?: string;
56
- }
57
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,eAAe,CAAC;CAChD;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,KAAK,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -1,7 +0,0 @@
1
- /**
2
- * KOA Core Types
3
- *
4
- * Shared types for Knowledge-Orchestrated Actions
5
- */
6
- export {};
7
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Development Domain Extension
3
- *
4
- * See .claude/specs/IMPLEMENTATION.md Section 5
5
- */
6
- import type { Domain } from '../index.js';
7
- export declare const developmentDomain: Domain;
8
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domains/development/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,eAAO,MAAM,iBAAiB,EAAE,MAa/B,CAAC"}
@@ -1,18 +0,0 @@
1
- /**
2
- * Development Domain Extension
3
- *
4
- * See .claude/specs/IMPLEMENTATION.md Section 5
5
- */
6
- import { createLogDecisionTool, createGetFeatureContextTool } from './tools.js';
7
- export const developmentDomain = {
8
- name: 'development',
9
- registerTools(server, client) {
10
- const logDecisionTool = createLogDecisionTool(client);
11
- const getFeatureContextTool = createGetFeatureContextTool(client);
12
- // TODO: Register tools with MCP server
13
- void server;
14
- void logDecisionTool;
15
- void getFeatureContextTool;
16
- }
17
- };
18
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domains/development/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAEhF,MAAM,CAAC,MAAM,iBAAiB,GAAW;IACvC,IAAI,EAAE,aAAa;IAEnB,aAAa,CAAC,MAAc,EAAE,MAAmB;QAC/C,MAAM,eAAe,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,qBAAqB,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;QAElE,uCAAuC;QAEvC,KAAK,MAAM,CAAC;QACZ,KAAK,eAAe,CAAC;QACrB,KAAK,qBAAqB,CAAC;IAC7B,CAAC;CACF,CAAC"}