@crowley/rag-mcp 1.2.0 → 1.2.1

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.
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { createMemoryTools } from '../../tools/memory';
2
+ import { createMemoryTools } from '../../tools/memory.js';
3
3
  function createMockCtx() {
4
4
  return {
5
5
  api: {
@@ -24,7 +24,7 @@ describe('Memory Tools', () => {
24
24
  ctx = createMockCtx();
25
25
  });
26
26
  function findTool(name) {
27
- return tools.find(t => t.name === name);
27
+ return tools.find((t) => t.name === name);
28
28
  }
29
29
  describe('remember', () => {
30
30
  it('stores memory and returns formatted result', async () => {
@@ -15,9 +15,9 @@ export function createAdvancedTools(projectName) {
15
15
  description: `Consolidate duplicate memories for ${projectName}. Finds similar memories and merges them using LLM to reduce clutter.`,
16
16
  schema: z.object({
17
17
  type: z.string().optional().describe("Filter by memory type (decision, insight, context, todo, conversation, note, or all). Default: all"),
18
- threshold: z.number().optional().describe("Similarity threshold for merging (0.5-1.0, default: 0.9). Lower = more aggressive merging."),
18
+ threshold: z.coerce.number().optional().describe("Similarity threshold for merging (0.5-1.0, default: 0.9). Lower = more aggressive merging."),
19
19
  dryRun: z.boolean().optional().describe("If true, preview merge candidates without making changes (default: true)."),
20
- limit: z.number().optional().describe("Max clusters to process (default: 50)."),
20
+ limit: z.coerce.number().optional().describe("Max clusters to process (default: 50)."),
21
21
  }),
22
22
  annotations: TOOL_ANNOTATIONS["merge_memories"],
23
23
  handler: async (args, ctx) => {
@@ -65,7 +65,7 @@ export function createAdvancedTools(projectName) {
65
65
  currentFile: z.string().describe("Path of the file being edited"),
66
66
  currentCode: z.string().describe("Current code snippet or file content"),
67
67
  language: z.string().optional().describe("Programming language filter (optional)"),
68
- limit: z.number().optional().describe("Max results (default: 5)"),
68
+ limit: z.coerce.number().optional().describe("Max results (default: 5)"),
69
69
  }),
70
70
  annotations: TOOL_ANNOTATIONS["get_completion_context"],
71
71
  handler: async (args, ctx) => {
@@ -108,7 +108,7 @@ export function createAdvancedTools(projectName) {
108
108
  currentFile: z.string().describe("Path of the file being edited"),
109
109
  currentCode: z.string().describe("Current code content"),
110
110
  language: z.string().optional().describe("Programming language filter (optional)"),
111
- limit: z.number().optional().describe("Max suggestions (default: 10)"),
111
+ limit: z.coerce.number().optional().describe("Max suggestions (default: 10)"),
112
112
  }),
113
113
  annotations: TOOL_ANNOTATIONS["get_import_suggestions"],
114
114
  handler: async (args, ctx) => {
@@ -147,7 +147,7 @@ export function createAdvancedTools(projectName) {
147
147
  typeName: z.string().optional().describe("Name of the type/interface/class to look up"),
148
148
  code: z.string().optional().describe("Code containing types to look up (alternative to typeName)"),
149
149
  currentFile: z.string().optional().describe("Current file to exclude from results"),
150
- limit: z.number().optional().describe("Max results per category (default: 5)"),
150
+ limit: z.coerce.number().optional().describe("Max results per category (default: 5)"),
151
151
  }),
152
152
  annotations: TOOL_ANNOTATIONS["get_type_context"],
153
153
  handler: async (args, ctx) => {
@@ -187,7 +187,7 @@ export function createAdvancedTools(projectName) {
187
187
  name: "get_behavior_patterns",
188
188
  description: `Analyze user workflow patterns for ${projectName}. Shows peak hours, tool preferences, common sequences, and session statistics.`,
189
189
  schema: z.object({
190
- days: z.number().optional().describe("Number of days to analyze (default: 7)"),
190
+ days: z.coerce.number().optional().describe("Number of days to analyze (default: 7)"),
191
191
  sessionId: z.string().optional().describe("Filter to a specific session (optional)"),
192
192
  }),
193
193
  annotations: TOOL_ANNOTATIONS["get_behavior_patterns"],
@@ -15,7 +15,7 @@ export function createAgentTools(projectName) {
15
15
  type: z.enum(["research", "review", "documentation", "refactor", "test"]).describe("Agent type: research, review, documentation, refactor, or test"),
16
16
  task: z.string().describe("The task for the agent to perform"),
17
17
  context: z.string().optional().describe("Optional additional context (code, requirements, etc.)"),
18
- maxIterations: z.number().optional().describe("Maximum ReAct iterations (default: varies by agent type)"),
18
+ maxIterations: z.coerce.number().optional().describe("Maximum ReAct iterations (default: varies by agent type)"),
19
19
  }),
20
20
  annotations: TOOL_ANNOTATIONS["run_agent"],
21
21
  handler: async (args, ctx) => {
@@ -154,7 +154,7 @@ export function createAnalyticsTools(projectName) {
154
154
  description: `Enable scalar quantization on a ${projectName} collection to reduce memory usage.`,
155
155
  schema: z.object({
156
156
  collectionName: z.string().describe("Collection name to enable quantization on"),
157
- quantile: z.number().optional().describe("Quantile for quantization (0-1, default: 0.99)"),
157
+ quantile: z.coerce.number().optional().describe("Quantile for quantization (0-1, default: 0.99)"),
158
158
  }),
159
159
  annotations: TOOL_ANNOTATIONS["enable_quantization"],
160
160
  handler: async (args, ctx) => {
@@ -56,7 +56,7 @@ ${alternatives ? `## Alternatives Considered\n${alternatives}` : ""}`;
56
56
  schema: z.object({
57
57
  query: z.string().optional().describe("Search query (optional - returns all if empty)"),
58
58
  status: z.enum(["proposed", "accepted", "deprecated", "superseded", "all"]).optional().describe("Filter by status"),
59
- limit: z.number().optional().describe("Max results (default: 10)"),
59
+ limit: z.coerce.number().optional().describe("Max results (default: 10)"),
60
60
  }),
61
61
  annotations: TOOL_ANNOTATIONS["get_adrs"],
62
62
  handler: async (args, ctx) => {
@@ -138,7 +138,7 @@ ${appliesTo ? `## Applies To\n${appliesTo}` : ""}`;
138
138
  schema: z.object({
139
139
  query: z.string().optional().describe("Search for patterns by name or description"),
140
140
  appliesTo: z.string().optional().describe("Filter by what patterns apply to (e.g., 'api', 'module')"),
141
- limit: z.number().optional().describe("Max results (default: 10)"),
141
+ limit: z.coerce.number().optional().describe("Max results (default: 10)"),
142
142
  }),
143
143
  annotations: TOOL_ANNOTATIONS["get_patterns"],
144
144
  handler: async (args, ctx) => {
@@ -437,7 +437,7 @@ ${relatedAdr ? `## Related ADR\n${relatedAdr}` : ""}`;
437
437
  description: `List technical debt items for ${projectName}.`,
438
438
  schema: z.object({
439
439
  impact: z.enum(["low", "medium", "high", "critical", "all"]).optional().describe("Filter by impact"),
440
- limit: z.number().optional().describe("Max results (default: 10)"),
440
+ limit: z.coerce.number().optional().describe("Max results (default: 10)"),
441
441
  }),
442
442
  annotations: TOOL_ANNOTATIONS["get_tech_debt"],
443
443
  handler: async (args, ctx) => {
package/dist/tools/ask.js CHANGED
@@ -99,7 +99,7 @@ export function createAskTools(projectName) {
99
99
  conversation: z.string().describe("The conversation text to analyze"),
100
100
  context: z.string().optional().describe("Additional context about the conversation"),
101
101
  autoSave: z.boolean().optional().describe("Automatically save extracted learnings (default: false)"),
102
- minConfidence: z.number().optional().describe("Minimum confidence threshold for learnings (0-1, default: 0.7)"),
102
+ minConfidence: z.coerce.number().optional().describe("Minimum confidence threshold for learnings (0-1, default: 0.7)"),
103
103
  }),
104
104
  annotations: TOOL_ANNOTATIONS["analyze_conversation"],
105
105
  handler: async (args, ctx) => {
@@ -15,8 +15,8 @@ export function createClusteringTools(projectName) {
15
15
  description: `Cluster code in the ${projectName} codebase by similarity. Groups related files around seed points.`,
16
16
  schema: z.object({
17
17
  seedIds: z.array(z.string()).describe("Seed point IDs to cluster around"),
18
- limit: z.number().optional().describe("Max results per cluster (default: 5)"),
19
- threshold: z.number().optional().describe("Minimum similarity threshold (0-1, default: 0.7)"),
18
+ limit: z.coerce.number().optional().describe("Max results per cluster (default: 5)"),
19
+ threshold: z.coerce.number().optional().describe("Minimum similarity threshold (0-1, default: 0.7)"),
20
20
  }),
21
21
  annotations: TOOL_ANNOTATIONS["cluster_code"],
22
22
  handler: async (args, ctx) => {
@@ -52,8 +52,8 @@ export function createClusteringTools(projectName) {
52
52
  description: `Find duplicate or near-duplicate code in ${projectName}. Groups similar files by content.`,
53
53
  schema: z.object({
54
54
  collection: z.string().optional().describe("Collection to search (default: codebase)"),
55
- limit: z.number().optional().describe("Max duplicate groups to return (default: 10)"),
56
- threshold: z.number().optional().describe("Minimum similarity threshold (0-1, default: 0.9)"),
55
+ limit: z.coerce.number().optional().describe("Max duplicate groups to return (default: 10)"),
56
+ threshold: z.coerce.number().optional().describe("Minimum similarity threshold (0-1, default: 0.9)"),
57
57
  }),
58
58
  annotations: TOOL_ANNOTATIONS["find_duplicates"],
59
59
  handler: async (args, ctx) => {
@@ -97,7 +97,7 @@ export function createClusteringTools(projectName) {
97
97
  schema: z.object({
98
98
  positiveIds: z.array(z.string()).describe("IDs of vectors to find similar code to"),
99
99
  negativeIds: z.array(z.string()).optional().describe("IDs of vectors to avoid (dissimilar)"),
100
- limit: z.number().optional().describe("Max results (default: 5)"),
100
+ limit: z.coerce.number().optional().describe("Max results (default: 5)"),
101
101
  }),
102
102
  annotations: TOOL_ANNOTATIONS["recommend_similar"],
103
103
  handler: async (args, ctx) => {
@@ -129,7 +129,7 @@ export function createClusteringTools(projectName) {
129
129
  text: z.string().describe("Text to extract learnings from"),
130
130
  context: z.string().optional().describe("Additional context about the text"),
131
131
  autoSave: z.boolean().optional().describe("Automatically save extracted learnings (default: false)"),
132
- minConfidence: z.number().optional().describe("Minimum confidence threshold (0-1, default: 0.7)"),
132
+ minConfidence: z.coerce.number().optional().describe("Minimum confidence threshold (0-1, default: 0.7)"),
133
133
  }),
134
134
  annotations: TOOL_ANNOTATIONS["extract_learnings"],
135
135
  handler: async (args, ctx) => {
@@ -15,7 +15,7 @@ export function createConfluenceTools(projectName) {
15
15
  description: `Search indexed Confluence documentation for ${projectName}. Returns relevant pages with content snippets.`,
16
16
  schema: z.object({
17
17
  query: z.string().describe("Search query for Confluence content"),
18
- limit: z.number().optional().describe("Max results (default: 5)"),
18
+ limit: z.coerce.number().optional().describe("Max results (default: 5)"),
19
19
  spaceKey: z.string().optional().describe("Filter by Confluence space key"),
20
20
  }),
21
21
  annotations: TOOL_ANNOTATIONS["search_confluence"],
@@ -46,7 +46,7 @@ export function createConfluenceTools(projectName) {
46
46
  schema: z.object({
47
47
  spaceKeys: z.array(z.string()).optional().describe("Specific space keys to index (indexes all accessible if empty)"),
48
48
  labels: z.array(z.string()).optional().describe("Filter pages by labels"),
49
- maxPages: z.number().optional().describe("Maximum pages to index (default: 500)"),
49
+ maxPages: z.coerce.number().optional().describe("Maximum pages to index (default: 500)"),
50
50
  force: z.boolean().optional().describe("Force re-index even if already indexed"),
51
51
  }),
52
52
  annotations: TOOL_ANNOTATIONS["index_confluence"],
@@ -138,10 +138,10 @@ export function createIndexingTools(projectName) {
138
138
  schema: z.object({}),
139
139
  outputSchema: z.object({
140
140
  status: z.string(),
141
- totalFiles: z.number().optional(),
142
- indexedFiles: z.number().optional(),
141
+ totalFiles: z.coerce.number().optional(),
142
+ indexedFiles: z.coerce.number().optional(),
143
143
  lastUpdated: z.string().optional(),
144
- vectorCount: z.number().optional(),
144
+ vectorCount: z.coerce.number().optional(),
145
145
  cached: z.boolean(),
146
146
  }),
147
147
  annotations: TOOL_ANNOTATIONS["get_index_status"],
@@ -62,7 +62,7 @@ export function createMemoryTools(projectName) {
62
62
  schema: z.object({
63
63
  query: z.string().describe("What to recall (semantic search)"),
64
64
  type: z.enum(["decision", "insight", "context", "todo", "conversation", "note", "all"]).optional().describe("Filter by memory type (default: all)"),
65
- limit: z.number().optional().describe("Max memories to retrieve (default: 5)"),
65
+ limit: z.coerce.number().optional().describe("Max memories to retrieve (default: 5)"),
66
66
  }),
67
67
  annotations: TOOL_ANNOTATIONS["recall"],
68
68
  handler: async (args, ctx) => {
@@ -89,8 +89,8 @@ export function createMemoryTools(projectName) {
89
89
  schema: z.object({
90
90
  type: z.enum(["decision", "insight", "context", "todo", "conversation", "note", "all"]).optional().describe("Filter by type"),
91
91
  tag: z.string().optional().describe("Filter by tag"),
92
- limit: z.number().optional().describe("Max results (default: 10)"),
93
- offset: z.number().optional().describe("Pagination offset (default: 0)"),
92
+ limit: z.coerce.number().optional().describe("Max results (default: 10)"),
93
+ offset: z.coerce.number().optional().describe("Pagination offset (default: 0)"),
94
94
  }),
95
95
  annotations: TOOL_ANNOTATIONS["list_memories"],
96
96
  handler: async (args, ctx) => {
@@ -129,7 +129,7 @@ export function createMemoryTools(projectName) {
129
129
  schema: z.object({
130
130
  memoryId: z.string().optional().describe("Specific memory ID to delete"),
131
131
  type: z.enum(["decision", "insight", "context", "todo", "conversation", "note"]).optional().describe("Delete all memories of this type"),
132
- olderThanDays: z.number().optional().describe("Delete memories older than N days"),
132
+ olderThanDays: z.coerce.number().optional().describe("Delete memories older than N days"),
133
133
  }),
134
134
  annotations: TOOL_ANNOTATIONS["forget"],
135
135
  handler: async (args, ctx) => {
@@ -247,8 +247,8 @@ export function createMemoryTools(projectName) {
247
247
  name: "review_memories",
248
248
  description: `Get auto-extracted memories pending review in ${projectName}. Shows unvalidated learnings that need human confirmation.`,
249
249
  schema: z.object({
250
- limit: z.number().optional().describe("Max memories to return (default: 20)"),
251
- offset: z.number().optional().describe("Pagination offset (default: 0)"),
250
+ limit: z.coerce.number().optional().describe("Max memories to return (default: 20)"),
251
+ offset: z.coerce.number().optional().describe("Pagination offset (default: 0)"),
252
252
  }),
253
253
  annotations: TOOL_ANNOTATIONS["review_memories"],
254
254
  handler: async (args, ctx) => {
package/dist/tools/pm.js CHANGED
@@ -15,7 +15,7 @@ export function createPmTools(projectName) {
15
15
  description: `Search technical requirements and product documentation for ${projectName}. Finds relevant requirements, user stories, and specifications from Confluence.`,
16
16
  schema: z.object({
17
17
  query: z.string().describe("Search query for requirements (e.g., 'video inspection flow', 'payment integration')"),
18
- limit: z.number().optional().describe("Max results (default: 5)"),
18
+ limit: z.coerce.number().optional().describe("Max results (default: 5)"),
19
19
  }),
20
20
  annotations: TOOL_ANNOTATIONS["search_requirements"],
21
21
  handler: async (args, ctx) => {
@@ -236,8 +236,8 @@ export function createPmTools(projectName) {
236
236
  description: `List all documented requirements/features for ${projectName} from Confluence. Groups by category or status.`,
237
237
  schema: z.object({
238
238
  category: z.string().optional().describe("Filter by category (optional)"),
239
- limit: z.number().optional().describe("Max results (default: 20)"),
240
- offset: z.number().optional().describe("Pagination offset (default: 0)"),
239
+ limit: z.coerce.number().optional().describe("Max results (default: 20)"),
240
+ offset: z.coerce.number().optional().describe("Pagination offset (default: 0)"),
241
241
  }),
242
242
  annotations: TOOL_ANNOTATIONS["list_requirements"],
243
243
  handler: async (args, ctx) => {
@@ -15,7 +15,7 @@ export function createSearchTools(projectName) {
15
15
  description: `Search the ${projectName} codebase. Returns file locations, symbols, and graph connections. Use Read tool to view the actual code at returned locations.`,
16
16
  schema: z.object({
17
17
  query: z.string().describe("Search query for finding code"),
18
- limit: z.number().optional().describe("Max results to return (default: 5)"),
18
+ limit: z.coerce.number().optional().describe("Max results to return (default: 5)"),
19
19
  language: z.string().optional().describe("Filter by language (typescript, python, vue, etc.)"),
20
20
  path: z.string().optional().describe("Filter by path pattern (e.g., 'src/modules/*')"),
21
21
  layer: z.string().optional().describe("Filter by architectural layer (api, service, util, model, middleware, test, parser, types, config, other)"),
@@ -43,7 +43,7 @@ export function createSearchTools(projectName) {
43
43
  description: "Find code similar to a given snippet.",
44
44
  schema: z.object({
45
45
  code: z.string().describe("Code snippet to find similar code for"),
46
- limit: z.number().optional().describe("Max results (default: 5)"),
46
+ limit: z.coerce.number().optional().describe("Max results (default: 5)"),
47
47
  }),
48
48
  annotations: TOOL_ANNOTATIONS["search_similar"],
49
49
  handler: async (args, ctx) => {
@@ -66,7 +66,7 @@ export function createSearchTools(projectName) {
66
66
  schema: z.object({
67
67
  query: z.string().describe("Search query"),
68
68
  groupBy: z.string().optional().describe("Field to group by (default: 'file')"),
69
- limit: z.number().optional().describe("Max groups to return (default: 10)"),
69
+ limit: z.coerce.number().optional().describe("Max groups to return (default: 10)"),
70
70
  language: z.string().optional().describe("Filter by language"),
71
71
  layer: z.string().optional().describe("Filter by architectural layer (api, service, util, etc.)"),
72
72
  service: z.string().optional().describe("Filter by service/class name"),
@@ -97,8 +97,8 @@ export function createSearchTools(projectName) {
97
97
  description: `Hybrid search combining keyword matching and semantic similarity for ${projectName}. Returns file locations with symbols and connections. Use Read tool to view code.`,
98
98
  schema: z.object({
99
99
  query: z.string().describe("Search query"),
100
- limit: z.number().optional().describe("Max results (default: 10)"),
101
- semanticWeight: z.number().optional().describe("Weight for semantic vs keyword (0-1, default: 0.7)"),
100
+ limit: z.coerce.number().optional().describe("Max results (default: 10)"),
101
+ semanticWeight: z.coerce.number().optional().describe("Weight for semantic vs keyword (0-1, default: 0.7)"),
102
102
  language: z.string().optional().describe("Filter by language"),
103
103
  layer: z.string().optional().describe("Filter by architectural layer (api, service, util, etc.)"),
104
104
  service: z.string().optional().describe("Filter by service/class name"),
@@ -128,7 +128,7 @@ export function createSearchTools(projectName) {
128
128
  description: `Search documentation in the ${projectName} project.`,
129
129
  schema: z.object({
130
130
  query: z.string().describe("Search query"),
131
- limit: z.number().optional().describe("Max results (default: 5)"),
131
+ limit: z.coerce.number().optional().describe("Max results (default: 5)"),
132
132
  }),
133
133
  annotations: TOOL_ANNOTATIONS["search_docs"],
134
134
  handler: async (args, ctx) => {
@@ -154,11 +154,11 @@ export function createSearchTools(projectName) {
154
154
  schema: z.object({}),
155
155
  outputSchema: z.object({
156
156
  projectName: z.string(),
157
- totalFiles: z.number(),
158
- totalLines: z.number().optional(),
159
- vectorCount: z.number(),
157
+ totalFiles: z.coerce.number(),
158
+ totalLines: z.coerce.number().optional(),
159
+ vectorCount: z.coerce.number(),
160
160
  lastIndexed: z.string().optional(),
161
- languages: z.record(z.string(), z.number()).optional(),
161
+ languages: z.record(z.string(), z.coerce.number()).optional(),
162
162
  }),
163
163
  annotations: TOOL_ANNOTATIONS["get_project_stats"],
164
164
  handler: async (_args, ctx) => {
@@ -194,15 +194,15 @@ export function createSearchTools(projectName) {
194
194
  schema: z.object({
195
195
  symbol: z.string().describe("Symbol name to find (function, class, type, etc.)"),
196
196
  kind: z.string().optional().describe("Filter by kind: function, class, interface, type, enum, const"),
197
- limit: z.number().optional().describe("Max results (default: 10)"),
197
+ limit: z.coerce.number().optional().describe("Max results (default: 10)"),
198
198
  }),
199
199
  outputSchema: z.object({
200
200
  symbols: z.array(z.object({
201
201
  kind: z.string(),
202
202
  name: z.string(),
203
203
  file: z.string(),
204
- startLine: z.number(),
205
- endLine: z.number(),
204
+ startLine: z.coerce.number(),
205
+ endLine: z.coerce.number(),
206
206
  signature: z.string(),
207
207
  exported: z.boolean(),
208
208
  })),
@@ -246,8 +246,8 @@ export function createSearchTools(projectName) {
246
246
  description: `Search ${projectName} codebase with graph expansion. Returns file locations plus connected files via import/call relationships. Use Read tool to view code.`,
247
247
  schema: z.object({
248
248
  query: z.string().describe("Search query"),
249
- limit: z.number().optional().describe("Max direct results (default: 5)"),
250
- expandHops: z.number().optional().describe("Number of graph hops to expand (default: 1)"),
249
+ limit: z.coerce.number().optional().describe("Max direct results (default: 5)"),
250
+ expandHops: z.coerce.number().optional().describe("Number of graph hops to expand (default: 1)"),
251
251
  }),
252
252
  annotations: TOOL_ANNOTATIONS["search_graph"],
253
253
  handler: async (args, ctx) => {
@@ -102,7 +102,7 @@ export function createSessionTools(projectName, sharedCtx) {
102
102
  name: "analyze_usage_patterns",
103
103
  description: `Analyze tool usage patterns for ${projectName}. Shows common workflows, detected patterns, and recommendations for improving productivity.`,
104
104
  schema: z.object({
105
- days: z.number().optional().describe("Number of days to analyze (default: 7)."),
105
+ days: z.coerce.number().optional().describe("Number of days to analyze (default: 7)."),
106
106
  }),
107
107
  annotations: TOOL_ANNOTATIONS["analyze_usage_patterns"],
108
108
  handler: async (args, ctx) => {
@@ -290,7 +290,7 @@ export function createSuggestionTools(projectName) {
290
290
  schema: z.object({
291
291
  file: z.string().optional().describe("File path to find related code for"),
292
292
  code: z.string().optional().describe("Code snippet to find related code for"),
293
- limit: z.number().optional().describe("Max results (default: 5)"),
293
+ limit: z.coerce.number().optional().describe("Max results (default: 5)"),
294
294
  }),
295
295
  annotations: TOOL_ANNOTATIONS["suggest_related_code"],
296
296
  handler: async (args, ctx) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crowley/rag-mcp",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "Universal RAG MCP Server for any project",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",