asciikit-mcp 2.0.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 (35) hide show
  1. package/README.md +174 -0
  2. package/dist/index.d.ts +9 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +170 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/license-validator.d.ts +30 -0
  7. package/dist/lib/license-validator.d.ts.map +1 -0
  8. package/dist/lib/license-validator.js +78 -0
  9. package/dist/lib/license-validator.js.map +1 -0
  10. package/dist/lib/pattern-loader-v2.d.ts +45 -0
  11. package/dist/lib/pattern-loader-v2.d.ts.map +1 -0
  12. package/dist/lib/pattern-loader-v2.js +101 -0
  13. package/dist/lib/pattern-loader-v2.js.map +1 -0
  14. package/dist/lib/pattern-loader.d.ts +46 -0
  15. package/dist/lib/pattern-loader.d.ts.map +1 -0
  16. package/dist/lib/pattern-loader.js +116 -0
  17. package/dist/lib/pattern-loader.js.map +1 -0
  18. package/dist/patterns/bundle.json +104 -0
  19. package/dist/src/index.d.ts +9 -0
  20. package/dist/src/index.d.ts.map +1 -0
  21. package/dist/src/index.js +171 -0
  22. package/dist/src/index.js.map +1 -0
  23. package/dist/src/lib/license-validator.d.ts +30 -0
  24. package/dist/src/lib/license-validator.d.ts.map +1 -0
  25. package/dist/src/lib/license-validator.js +78 -0
  26. package/dist/src/lib/license-validator.js.map +1 -0
  27. package/dist/src/lib/pattern-loader-v2.d.ts +45 -0
  28. package/dist/src/lib/pattern-loader-v2.d.ts.map +1 -0
  29. package/dist/src/lib/pattern-loader-v2.js +109 -0
  30. package/dist/src/lib/pattern-loader-v2.js.map +1 -0
  31. package/dist/src/types/index.d.ts +19 -0
  32. package/dist/src/types/index.d.ts.map +1 -0
  33. package/dist/src/types/index.js +5 -0
  34. package/dist/src/types/index.js.map +1 -0
  35. package/package.json +48 -0
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * AsciiKit MCP Server
4
+ *
5
+ * Provides ASCII wireframe patterns to Claude Code via MCP protocol
6
+ * Requires valid license key for decryption and access
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
@@ -0,0 +1,171 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * AsciiKit MCP Server
4
+ *
5
+ * Provides ASCII wireframe patterns to Claude Code via MCP protocol
6
+ * Requires valid license key for decryption and access
7
+ */
8
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
9
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
10
+ import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
11
+ import { LicenseValidator } from './lib/license-validator.js';
12
+ import { PatternLoader } from './lib/pattern-loader-v2.js';
13
+ const LICENSE_KEY = process.env.ASCIIKIT_LICENSE_KEY;
14
+ const LICENSE_API_URL = process.env.ASCIIKIT_LICENSE_API_URL || 'https://asciikit-license-api.currently-studio.workers.dev';
15
+ async function main() {
16
+ console.error('🚀 Starting AsciiKit MCP Server...');
17
+ // Check for license key
18
+ if (!LICENSE_KEY) {
19
+ console.error('❌ Error: ASCIIKIT_LICENSE_KEY environment variable not set');
20
+ console.error('');
21
+ console.error('Please configure your license key in Claude Code MCP settings:');
22
+ console.error('{');
23
+ console.error(' "mcpServers": {');
24
+ console.error(' "asciikit": {');
25
+ console.error(' "command": "asciikit-mcp",');
26
+ console.error(' "env": {');
27
+ console.error(' "ASCIIKIT_LICENSE_KEY": "your-license-key-here"');
28
+ console.error(' }');
29
+ console.error(' }');
30
+ console.error(' }');
31
+ console.error('}');
32
+ console.error('');
33
+ console.error('Get your license at: https://asciikit.com');
34
+ process.exit(1);
35
+ }
36
+ // Validate license
37
+ const validator = new LicenseValidator(LICENSE_API_URL, LICENSE_KEY);
38
+ const isValid = await validator.validate();
39
+ if (!isValid) {
40
+ console.error('❌ License validation failed');
41
+ console.error('');
42
+ console.error('Your license key is invalid, expired, or has been revoked.');
43
+ console.error('');
44
+ console.error('To continue using AsciiKit:');
45
+ console.error('1. Check your license key is correct');
46
+ console.error('2. Verify your subscription is active at https://asciikit.com');
47
+ console.error('3. Contact support: hello@asciikit.com');
48
+ process.exit(1);
49
+ }
50
+ console.error('✅ License validated successfully');
51
+ // Load patterns (no encryption - license validation is the protection)
52
+ const patternLoader = new PatternLoader();
53
+ await patternLoader.load();
54
+ console.error(`✅ Loaded ${patternLoader.getPatternCount()} patterns`);
55
+ // Create MCP server
56
+ const server = new Server({
57
+ name: 'asciikit',
58
+ version: '2.0.0',
59
+ }, {
60
+ capabilities: {
61
+ resources: {},
62
+ tools: {},
63
+ },
64
+ });
65
+ // List available patterns as resources
66
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
67
+ const patterns = patternLoader.listPatterns();
68
+ return {
69
+ resources: patterns.map((patternId) => ({
70
+ uri: `asciikit://patterns/${patternId}`,
71
+ name: patternId.replace(/\//g, ' / '),
72
+ mimeType: 'text/markdown',
73
+ description: `ASCII wireframe pattern: ${patternId}`,
74
+ })),
75
+ };
76
+ });
77
+ // Read pattern content
78
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
79
+ const url = new URL(request.params.uri);
80
+ const patternId = url.pathname.replace('/patterns/', '');
81
+ const content = patternLoader.getPattern(patternId);
82
+ if (!content) {
83
+ throw new Error(`Pattern not found: ${patternId}`);
84
+ }
85
+ return {
86
+ contents: [
87
+ {
88
+ uri: request.params.uri,
89
+ mimeType: 'text/markdown',
90
+ text: content,
91
+ },
92
+ ],
93
+ };
94
+ });
95
+ // List available tools
96
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
97
+ return {
98
+ tools: [
99
+ {
100
+ name: 'search_patterns',
101
+ description: 'Search for patterns by keyword or category',
102
+ inputSchema: {
103
+ type: 'object',
104
+ properties: {
105
+ query: {
106
+ type: 'string',
107
+ description: 'Search query (pattern name, category, or keyword)',
108
+ },
109
+ },
110
+ required: ['query'],
111
+ },
112
+ },
113
+ {
114
+ name: 'list_categories',
115
+ description: 'List all available pattern categories',
116
+ inputSchema: {
117
+ type: 'object',
118
+ properties: {},
119
+ },
120
+ },
121
+ ],
122
+ };
123
+ });
124
+ // Handle tool calls
125
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
126
+ const { name, arguments: args } = request.params;
127
+ if (name === 'search_patterns') {
128
+ const query = args.query.toLowerCase();
129
+ const results = patternLoader.searchPatterns(query);
130
+ return {
131
+ content: [
132
+ {
133
+ type: 'text',
134
+ text: `Found ${results.length} patterns matching "${query}":\n\n${results.map((id) => `- ${id}`).join('\n')}`,
135
+ },
136
+ ],
137
+ };
138
+ }
139
+ if (name === 'list_categories') {
140
+ const categories = patternLoader.getCategories();
141
+ return {
142
+ content: [
143
+ {
144
+ type: 'text',
145
+ text: `Available categories (${categories.length}):\n\n${categories.map((cat) => `- ${cat}`).join('\n')}`,
146
+ },
147
+ ],
148
+ };
149
+ }
150
+ throw new Error(`Unknown tool: ${name}`);
151
+ });
152
+ // Start revalidation timer (every 24 hours)
153
+ setInterval(async () => {
154
+ console.error('🔄 Revalidating license...');
155
+ const stillValid = await validator.validate();
156
+ if (!stillValid) {
157
+ console.error('❌ License no longer valid. Shutting down.');
158
+ process.exit(1);
159
+ }
160
+ console.error('✅ License still valid');
161
+ }, 24 * 60 * 60 * 1000);
162
+ // Start server
163
+ const transport = new StdioServerTransport();
164
+ await server.connect(transport);
165
+ console.error('✨ AsciiKit MCP Server running');
166
+ }
167
+ main().catch((error) => {
168
+ console.error('Fatal error:', error);
169
+ process.exit(1);
170
+ });
171
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * License Validator
3
+ *
4
+ * Validates license keys against the AsciiKit License API
5
+ */
6
+ import type { LicenseValidationResponse } from '../types/index.js';
7
+ export declare class LicenseValidator {
8
+ private apiUrl;
9
+ private licenseKey;
10
+ private lastValidation;
11
+ constructor(apiUrl: string, licenseKey: string);
12
+ /**
13
+ * Validates license key with API
14
+ * @returns true if valid, false otherwise
15
+ */
16
+ validate(): Promise<boolean>;
17
+ /**
18
+ * Gets last validation result
19
+ */
20
+ getLastValidation(): LicenseValidationResponse | null;
21
+ /**
22
+ * Checks if license is trial
23
+ */
24
+ isTrial(): boolean;
25
+ /**
26
+ * Gets days remaining for trial licenses
27
+ */
28
+ getDaysRemaining(): number | null;
29
+ }
30
+ //# sourceMappingURL=license-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-validator.d.ts","sourceRoot":"","sources":["../../../src/lib/license-validator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAA0C;gBAEpD,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAK9C;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IA4ClC;;OAEG;IACH,iBAAiB,IAAI,yBAAyB,GAAG,IAAI;IAIrD;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,gBAAgB,IAAI,MAAM,GAAG,IAAI;CAOlC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * License Validator
3
+ *
4
+ * Validates license keys against the AsciiKit License API
5
+ */
6
+ export class LicenseValidator {
7
+ apiUrl;
8
+ licenseKey;
9
+ lastValidation = null;
10
+ constructor(apiUrl, licenseKey) {
11
+ this.apiUrl = apiUrl;
12
+ this.licenseKey = licenseKey;
13
+ }
14
+ /**
15
+ * Validates license key with API
16
+ * @returns true if valid, false otherwise
17
+ */
18
+ async validate() {
19
+ try {
20
+ const response = await fetch(`${this.apiUrl}/api/validate`, {
21
+ method: 'POST',
22
+ headers: {
23
+ 'Content-Type': 'application/json',
24
+ },
25
+ body: JSON.stringify({
26
+ license_key: this.licenseKey,
27
+ }),
28
+ });
29
+ if (!response.ok) {
30
+ console.error(`License API returned status ${response.status}`);
31
+ return false;
32
+ }
33
+ const data = await response.json();
34
+ this.lastValidation = data;
35
+ if (!data.valid) {
36
+ console.error(`License validation failed: ${data.reason}`);
37
+ return false;
38
+ }
39
+ // Check if trial is expiring soon
40
+ if (data.tier === 'trial' && data.expires_at) {
41
+ const daysRemaining = Math.ceil((data.expires_at - Date.now()) / (24 * 60 * 60 * 1000));
42
+ if (daysRemaining <= 2) {
43
+ console.error('');
44
+ console.error(`⏰ Your trial expires in ${daysRemaining} day${daysRemaining === 1 ? '' : 's'}!`);
45
+ console.error(' Subscribe at: https://asciikit.com/subscribe');
46
+ console.error('');
47
+ }
48
+ }
49
+ return true;
50
+ }
51
+ catch (error) {
52
+ console.error('License validation error:', error);
53
+ return false;
54
+ }
55
+ }
56
+ /**
57
+ * Gets last validation result
58
+ */
59
+ getLastValidation() {
60
+ return this.lastValidation;
61
+ }
62
+ /**
63
+ * Checks if license is trial
64
+ */
65
+ isTrial() {
66
+ return this.lastValidation?.tier === 'trial';
67
+ }
68
+ /**
69
+ * Gets days remaining for trial licenses
70
+ */
71
+ getDaysRemaining() {
72
+ if (!this.lastValidation || this.lastValidation.tier !== 'trial' || !this.lastValidation.expires_at) {
73
+ return null;
74
+ }
75
+ return Math.ceil((this.lastValidation.expires_at - Date.now()) / (24 * 60 * 60 * 1000));
76
+ }
77
+ }
78
+ //# sourceMappingURL=license-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-validator.js","sourceRoot":"","sources":["../../../src/lib/license-validator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,OAAO,gBAAgB;IACnB,MAAM,CAAS;IACf,UAAU,CAAS;IACnB,cAAc,GAAqC,IAAI,CAAC;IAEhE,YAAY,MAAc,EAAE,UAAkB;QAC5C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,eAAe,EAAE;gBAC1D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,WAAW,EAAE,IAAI,CAAC,UAAU;iBAC7B,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBAChE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA+B,CAAC;YAChE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAE3B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC3D,OAAO,KAAK,CAAC;YACf,CAAC;YAED,kCAAkC;YAClC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;gBAExF,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;oBACvB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAClB,OAAO,CAAC,KAAK,CAAC,2BAA2B,aAAa,OAAO,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;oBAChG,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;oBACjE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,cAAc,EAAE,IAAI,KAAK,OAAO,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;YACpG,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1F,CAAC;CACF"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Pattern Loader (No Encryption)
3
+ *
4
+ * Loads patterns from unencrypted bundle
5
+ * License validation is done separately - this just loads the patterns
6
+ */
7
+ export declare class PatternLoader {
8
+ private patterns;
9
+ private version;
10
+ private categories;
11
+ private loaded;
12
+ /**
13
+ * Loads patterns from bundle file
14
+ */
15
+ load(): Promise<void>;
16
+ /**
17
+ * Gets a specific pattern by ID
18
+ */
19
+ getPattern(patternId: string): string | null;
20
+ /**
21
+ * Lists all available pattern IDs
22
+ */
23
+ listPatterns(): string[];
24
+ /**
25
+ * Searches patterns by query
26
+ */
27
+ searchPatterns(query: string): string[];
28
+ /**
29
+ * Gets all categories
30
+ */
31
+ getCategories(): string[];
32
+ /**
33
+ * Gets pattern count
34
+ */
35
+ getPatternCount(): number;
36
+ /**
37
+ * Gets pattern version
38
+ */
39
+ getVersion(): string;
40
+ /**
41
+ * Checks if patterns are loaded
42
+ */
43
+ isLoaded(): boolean;
44
+ }
45
+ //# sourceMappingURL=pattern-loader-v2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-loader-v2.d.ts","sourceRoot":"","sources":["../../../src/lib/pattern-loader-v2.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,MAAM,CAAkB;IAEhC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B3B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQ5C;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;IAQxB;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAgBvC;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;IAQzB;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGpB"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Pattern Loader (No Encryption)
3
+ *
4
+ * Loads patterns from unencrypted bundle
5
+ * License validation is done separately - this just loads the patterns
6
+ */
7
+ import * as fs from 'fs/promises';
8
+ import * as path from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = path.dirname(__filename);
12
+ export class PatternLoader {
13
+ patterns = {};
14
+ version = 'unknown';
15
+ categories = [];
16
+ loaded = false;
17
+ /**
18
+ * Loads patterns from bundle file
19
+ */
20
+ async load() {
21
+ try {
22
+ // Read pattern bundle
23
+ // Try production path first (dist/patterns/bundle.json)
24
+ let bundlePath = path.join(__dirname, '../patterns/bundle.json');
25
+ try {
26
+ await fs.access(bundlePath);
27
+ }
28
+ catch {
29
+ // Fall back to development path (src/patterns/bundle.json)
30
+ bundlePath = path.join(__dirname, '../../src/patterns/bundle.json');
31
+ }
32
+ const bundleContent = await fs.readFile(bundlePath, 'utf-8');
33
+ const bundle = JSON.parse(bundleContent);
34
+ // Store patterns in memory
35
+ this.patterns = bundle.patterns;
36
+ this.version = bundle.version;
37
+ this.categories = bundle.categories;
38
+ this.loaded = true;
39
+ }
40
+ catch (error) {
41
+ if (error instanceof Error && error.message.includes('ENOENT')) {
42
+ throw new Error('Pattern bundle not found. Run "npm run build:patterns" to generate it.');
43
+ }
44
+ throw error;
45
+ }
46
+ }
47
+ /**
48
+ * Gets a specific pattern by ID
49
+ */
50
+ getPattern(patternId) {
51
+ if (!this.loaded) {
52
+ throw new Error('Patterns not loaded. Call load() first.');
53
+ }
54
+ return this.patterns[patternId] || null;
55
+ }
56
+ /**
57
+ * Lists all available pattern IDs
58
+ */
59
+ listPatterns() {
60
+ if (!this.loaded) {
61
+ throw new Error('Patterns not loaded. Call load() first.');
62
+ }
63
+ return Object.keys(this.patterns).sort();
64
+ }
65
+ /**
66
+ * Searches patterns by query
67
+ */
68
+ searchPatterns(query) {
69
+ if (!this.loaded) {
70
+ throw new Error('Patterns not loaded. Call load() first.');
71
+ }
72
+ const lowerQuery = query.toLowerCase();
73
+ return Object.keys(this.patterns)
74
+ .filter((id) => {
75
+ const lowerID = id.toLowerCase();
76
+ const content = this.patterns[id].toLowerCase();
77
+ return lowerID.includes(lowerQuery) || content.includes(lowerQuery);
78
+ })
79
+ .sort();
80
+ }
81
+ /**
82
+ * Gets all categories
83
+ */
84
+ getCategories() {
85
+ if (!this.loaded) {
86
+ throw new Error('Patterns not loaded. Call load() first.');
87
+ }
88
+ return this.categories;
89
+ }
90
+ /**
91
+ * Gets pattern count
92
+ */
93
+ getPatternCount() {
94
+ return Object.keys(this.patterns).length;
95
+ }
96
+ /**
97
+ * Gets pattern version
98
+ */
99
+ getVersion() {
100
+ return this.version;
101
+ }
102
+ /**
103
+ * Checks if patterns are loaded
104
+ */
105
+ isLoaded() {
106
+ return this.loaded;
107
+ }
108
+ }
109
+ //# sourceMappingURL=pattern-loader-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-loader-v2.js","sourceRoot":"","sources":["../../../src/lib/pattern-loader-v2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * TypeScript types for AsciiKit MCP Server
3
+ */
4
+ export interface LicenseValidationResponse {
5
+ valid: boolean;
6
+ tier?: 'trial' | 'paid';
7
+ status?: 'trial' | 'active' | 'cancelled' | 'expired';
8
+ expires_at?: number | null;
9
+ email?: string;
10
+ reason?: string;
11
+ }
12
+ export interface PatternBundle {
13
+ patterns: Record<string, string>;
14
+ version: string;
15
+ built_at: number;
16
+ total_patterns: number;
17
+ categories: string[];
18
+ }
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IACtD,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * TypeScript types for AsciiKit MCP Server
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "asciikit-mcp",
3
+ "version": "2.0.0",
4
+ "description": "AsciiKit MCP server for Claude Code - Professional ASCII wireframe patterns for AI-assisted design",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "asciikit-mcp": "./dist/index.js"
8
+ },
9
+ "type": "module",
10
+ "scripts": {
11
+ "build": "tsc && chmod +x dist/index.js && mkdir -p dist/patterns && cp src/patterns/bundle.json dist/patterns/",
12
+ "dev": "tsx src/index.ts",
13
+ "test": "tsx src/test.ts",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "keywords": [
17
+ "asciikit",
18
+ "mcp",
19
+ "claude",
20
+ "wireframe",
21
+ "design",
22
+ "ui",
23
+ "ux",
24
+ "patterns"
25
+ ],
26
+ "author": "AsciiKit",
27
+ "license": "PROPRIETARY",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "https://github.com/asciikit/asciikit-mcp"
31
+ },
32
+ "homepage": "https://asciikit.com",
33
+ "dependencies": {
34
+ "@modelcontextprotocol/sdk": "^0.5.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^20.11.0",
38
+ "tsx": "^4.7.0",
39
+ "typescript": "^5.3.3"
40
+ },
41
+ "engines": {
42
+ "node": ">=18.0.0"
43
+ },
44
+ "files": [
45
+ "dist/**/*",
46
+ "README.md"
47
+ ]
48
+ }