mycontext-cli 4.2.7 → 4.2.10
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/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +10 -1
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +19 -60
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init-interactive.d.ts +20 -0
- package/dist/commands/init-interactive.d.ts.map +1 -1
- package/dist/commands/init-interactive.js +168 -5
- package/dist/commands/init-interactive.js.map +1 -1
- package/dist/config/shadcn-catalog.json +93 -0
- package/dist/core/brain/BrainClient.d.ts +1 -1
- package/dist/core/brain/BrainClient.d.ts.map +1 -1
- package/dist/core/brain/BrainClient.js +5 -5
- package/dist/core/brain/BrainClient.js.map +1 -1
- package/dist/doctor/DoctorEngine.d.ts.map +1 -1
- package/dist/doctor/DoctorEngine.js +21 -11
- package/dist/doctor/DoctorEngine.js.map +1 -1
- package/dist/doctor/rules/dead-code-rules.d.ts.map +1 -1
- package/dist/doctor/rules/dead-code-rules.js +33 -0
- package/dist/doctor/rules/dead-code-rules.js.map +1 -1
- package/dist/doctor/rules/instantdb-rules.d.ts.map +1 -1
- package/dist/doctor/rules/instantdb-rules.js +278 -69
- package/dist/doctor/rules/instantdb-rules.js.map +1 -1
- package/dist/doctor/rules/nextjs-rules.d.ts.map +1 -1
- package/dist/doctor/rules/nextjs-rules.js +53 -3
- package/dist/doctor/rules/nextjs-rules.js.map +1 -1
- package/dist/package.json +4 -2
- package/dist/services/ComponentInferenceEngine.d.ts +66 -0
- package/dist/services/ComponentInferenceEngine.d.ts.map +1 -0
- package/dist/services/ComponentInferenceEngine.js +302 -0
- package/dist/services/ComponentInferenceEngine.js.map +1 -0
- package/dist/services/ComponentRegistry.d.ts +61 -0
- package/dist/services/ComponentRegistry.d.ts.map +1 -0
- package/dist/services/ComponentRegistry.js +128 -0
- package/dist/services/ComponentRegistry.js.map +1 -0
- package/dist/services/InferenceEngine.js +1 -1
- package/dist/services/ProjectScanner.d.ts.map +1 -1
- package/dist/services/ProjectScanner.js +18 -1
- package/dist/services/ProjectScanner.js.map +1 -1
- package/dist/services/ScaffoldEngine.d.ts +87 -0
- package/dist/services/ScaffoldEngine.d.ts.map +1 -0
- package/dist/services/ScaffoldEngine.js +409 -0
- package/dist/services/ScaffoldEngine.js.map +1 -0
- package/dist/services/ScaffoldPreview.d.ts +62 -0
- package/dist/services/ScaffoldPreview.d.ts.map +1 -0
- package/dist/services/ScaffoldPreview.js +292 -0
- package/dist/services/ScaffoldPreview.js.map +1 -0
- package/dist/services/TemplateEngine.d.ts +136 -0
- package/dist/services/TemplateEngine.d.ts.map +1 -0
- package/dist/services/TemplateEngine.js +483 -0
- package/dist/services/TemplateEngine.js.map +1 -0
- package/dist/services/TemplateHelpers.d.ts +9 -0
- package/dist/services/TemplateHelpers.d.ts.map +1 -0
- package/dist/services/TemplateHelpers.js +212 -0
- package/dist/services/TemplateHelpers.js.map +1 -0
- package/dist/templates/actions/auth-actions.ts.hbs +140 -0
- package/dist/templates/actions/crud-actions.ts.hbs +113 -0
- package/dist/templates/components/auth/login-form.tsx.hbs +67 -0
- package/dist/templates/components/auth/login-skeleton.tsx.hbs +24 -0
- package/dist/templates/components/auth/register-form.tsx.hbs +116 -0
- package/dist/templates/components/crud/entity-card.tsx.hbs +71 -0
- package/dist/templates/components/crud/entity-form.tsx.hbs +158 -0
- package/dist/templates/components/crud/entity-skeleton.tsx.hbs +90 -0
- package/dist/templates/components/crud/entity-table.tsx.hbs +129 -0
- package/dist/templates/components/ui/button.tsx.hbs +53 -0
- package/dist/templates/components/ui/card.tsx.hbs +68 -0
- package/dist/templates/components/ui/input.tsx.hbs +33 -0
- package/dist/templates/components/ui/label.tsx.hbs +20 -0
- package/dist/templates/components/ui/skeleton.tsx.hbs +15 -0
- package/dist/templates/components/ui/theme-provider.tsx.hbs +66 -0
- package/dist/templates/components/ui/theme-toggle.tsx.hbs +30 -0
- package/dist/templates/config/app.css.hbs +150 -0
- package/dist/templates/layouts/dashboard-layout.tsx.hbs +69 -0
- package/dist/templates/layouts/error.tsx.hbs +51 -0
- package/dist/templates/layouts/loading.tsx.hbs +22 -0
- package/dist/templates/layouts/not-found.tsx.hbs +24 -0
- package/dist/templates/layouts/root-layout.tsx.hbs +40 -0
- package/dist/templates/lib/instant.ts.hbs +19 -0
- package/dist/templates/lib/utils.ts.hbs +24 -0
- package/dist/templates/pages/auth/login-page.tsx.hbs +30 -0
- package/dist/templates/pages/auth/register-page.tsx.hbs +38 -0
- package/dist/templates/pages/crud/create-page.tsx.hbs +42 -0
- package/dist/templates/pages/crud/detail-page.tsx.hbs +90 -0
- package/dist/templates/pages/crud/list-page.tsx.hbs +60 -0
- package/dist/templates/pages/crud/loading.tsx.hbs +13 -0
- package/dist/templates/pages/landing-page.tsx.hbs +111 -0
- package/dist/types/asl.d.ts +1 -1
- package/dist/types/asl.d.ts.map +1 -1
- package/dist/types/living-context.d.ts +1 -1
- package/dist/types/living-context.d.ts.map +1 -1
- package/dist/utils/FileGenerator.js +3 -3
- package/dist/utils/FileGenerator.js.map +1 -1
- package/dist/utils/generateTypesFromSchema.d.ts +47 -0
- package/dist/utils/generateTypesFromSchema.d.ts.map +1 -0
- package/dist/utils/generateTypesFromSchema.js +298 -0
- package/dist/utils/generateTypesFromSchema.js.map +1 -0
- package/package.json +4 -2
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mycontext-cli",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.10",
|
|
4
4
|
"description": "CLI tool for spec-driven development - Generate comprehensive context, visual screens, and scaffolding for AI-powered coding",
|
|
5
5
|
"main": "dist/cli.js",
|
|
6
6
|
"bin": {
|
|
@@ -54,9 +54,10 @@
|
|
|
54
54
|
"@google/generative-ai": "^0.24.1",
|
|
55
55
|
"@huggingface/inference": "^4.11.1",
|
|
56
56
|
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
57
|
-
"@myycontext/core": "
|
|
57
|
+
"@myycontext/core": "workspace:*",
|
|
58
58
|
"@playwright/test": "^1.58.2",
|
|
59
59
|
"@types/figlet": "^1.7.0",
|
|
60
|
+
"@types/handlebars": "^4.1.0",
|
|
60
61
|
"axios": "^1.6.0",
|
|
61
62
|
"chalk": "^5.6.2",
|
|
62
63
|
"commander": "^11.1.0",
|
|
@@ -68,6 +69,7 @@
|
|
|
68
69
|
"fuse.js": "^7.1.0",
|
|
69
70
|
"glob": "^10.3.10",
|
|
70
71
|
"gradient-string": "^3.0.0",
|
|
72
|
+
"handlebars": "^4.7.8",
|
|
71
73
|
"inquirer": "^9.2.12",
|
|
72
74
|
"mdast-util-to-markdown": "^2.1.2",
|
|
73
75
|
"node-fetch": "^2.7.0",
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { ASL } from "../types/asl";
|
|
2
|
+
export interface ShadCNComponent {
|
|
3
|
+
name: string;
|
|
4
|
+
dependencies: string[];
|
|
5
|
+
useCases: string[];
|
|
6
|
+
description: string;
|
|
7
|
+
required: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ShadCNCatalog {
|
|
10
|
+
components: ShadCNComponent[];
|
|
11
|
+
metadata: {
|
|
12
|
+
version: string;
|
|
13
|
+
totalComponents: number;
|
|
14
|
+
lastUpdated: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* ComponentInferenceEngine - Smart inference of needed shadCN components
|
|
19
|
+
*
|
|
20
|
+
* Analyzes ASL specification to determine which shadCN UI components
|
|
21
|
+
* are needed for the project. Automatically resolves dependencies.
|
|
22
|
+
*
|
|
23
|
+
* Benefits:
|
|
24
|
+
* - Only installs what's needed (saves tokens and time)
|
|
25
|
+
* - Resolves dependencies automatically
|
|
26
|
+
* - Provides reasoning for each component choice
|
|
27
|
+
*/
|
|
28
|
+
export declare class ComponentInferenceEngine {
|
|
29
|
+
private catalog;
|
|
30
|
+
constructor();
|
|
31
|
+
/**
|
|
32
|
+
* Infer which shadCN components are needed based on ASL
|
|
33
|
+
* Returns array of component names to install
|
|
34
|
+
*/
|
|
35
|
+
inferNeededComponents(asl: ASL): string[];
|
|
36
|
+
/**
|
|
37
|
+
* Check if ASL has list/table views
|
|
38
|
+
*/
|
|
39
|
+
private hasListViews;
|
|
40
|
+
/**
|
|
41
|
+
* Check if a page is an entity list page
|
|
42
|
+
*/
|
|
43
|
+
private isEntityListPage;
|
|
44
|
+
/**
|
|
45
|
+
* Check if ASL has admin/RBAC features
|
|
46
|
+
*/
|
|
47
|
+
private hasAdminFeatures;
|
|
48
|
+
/**
|
|
49
|
+
* Resolve component dependencies
|
|
50
|
+
* E.g., if we need 'form', we also need 'button' and 'label'
|
|
51
|
+
*/
|
|
52
|
+
private resolveDependencies;
|
|
53
|
+
/**
|
|
54
|
+
* Load shadCN component catalog
|
|
55
|
+
*/
|
|
56
|
+
private loadCatalog;
|
|
57
|
+
/**
|
|
58
|
+
* Default catalog (used if shadcn-catalog.json doesn't exist yet)
|
|
59
|
+
*/
|
|
60
|
+
private getDefaultCatalog;
|
|
61
|
+
/**
|
|
62
|
+
* Explain why each component was chosen
|
|
63
|
+
*/
|
|
64
|
+
explainChoices(asl: ASL): Map<string, string>;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=ComponentInferenceEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComponentInferenceEngine.d.ts","sourceRoot":"","sources":["../../src/services/ComponentInferenceEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAwB,MAAM,cAAc,CAAC;AAIzD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;;;;;;;;;GAUG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,OAAO,CAAgB;;IAM/B;;;OAGG;IACH,qBAAqB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,EAAE;IAwCzC;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IASxB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgGzB;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CAkC9C"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ComponentInferenceEngine = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const fs = __importStar(require("fs-extra"));
|
|
39
|
+
/**
|
|
40
|
+
* ComponentInferenceEngine - Smart inference of needed shadCN components
|
|
41
|
+
*
|
|
42
|
+
* Analyzes ASL specification to determine which shadCN UI components
|
|
43
|
+
* are needed for the project. Automatically resolves dependencies.
|
|
44
|
+
*
|
|
45
|
+
* Benefits:
|
|
46
|
+
* - Only installs what's needed (saves tokens and time)
|
|
47
|
+
* - Resolves dependencies automatically
|
|
48
|
+
* - Provides reasoning for each component choice
|
|
49
|
+
*/
|
|
50
|
+
class ComponentInferenceEngine {
|
|
51
|
+
constructor() {
|
|
52
|
+
this.catalog = this.loadCatalog();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Infer which shadCN components are needed based on ASL
|
|
56
|
+
* Returns array of component names to install
|
|
57
|
+
*/
|
|
58
|
+
inferNeededComponents(asl) {
|
|
59
|
+
const needed = new Set();
|
|
60
|
+
// Base components (always needed for any app)
|
|
61
|
+
needed.add('button');
|
|
62
|
+
needed.add('card');
|
|
63
|
+
// Auth-based components
|
|
64
|
+
if (asl.auth) {
|
|
65
|
+
needed.add('form');
|
|
66
|
+
needed.add('input');
|
|
67
|
+
needed.add('label');
|
|
68
|
+
needed.add('toast'); // for error messages
|
|
69
|
+
}
|
|
70
|
+
// Entity CRUD forms
|
|
71
|
+
if (asl.entities && Object.keys(asl.entities).length > 0) {
|
|
72
|
+
needed.add('form');
|
|
73
|
+
needed.add('input');
|
|
74
|
+
needed.add('textarea'); // for long text fields
|
|
75
|
+
needed.add('select'); // for references/dropdowns
|
|
76
|
+
needed.add('dialog'); // for create/edit modals
|
|
77
|
+
needed.add('label');
|
|
78
|
+
}
|
|
79
|
+
// List views (tables for data display)
|
|
80
|
+
if (this.hasListViews(asl)) {
|
|
81
|
+
needed.add('table');
|
|
82
|
+
}
|
|
83
|
+
// Admin/RBAC features
|
|
84
|
+
if (this.hasAdminFeatures(asl)) {
|
|
85
|
+
needed.add('dropdown-menu'); // for actions
|
|
86
|
+
needed.add('badge'); // for status/roles
|
|
87
|
+
}
|
|
88
|
+
// Resolve dependencies (e.g., form needs button, label)
|
|
89
|
+
return this.resolveDependencies(needed);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if ASL has list/table views
|
|
93
|
+
*/
|
|
94
|
+
hasListViews(asl) {
|
|
95
|
+
// Entities imply list views
|
|
96
|
+
if (asl.entities && Object.keys(asl.entities).length > 0) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
// Check for explicit list pages
|
|
100
|
+
return asl.pages.some(p => p.path.includes('/list') ||
|
|
101
|
+
this.isEntityListPage(p, asl.entities));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check if a page is an entity list page
|
|
105
|
+
*/
|
|
106
|
+
isEntityListPage(page, entities) {
|
|
107
|
+
if (!entities)
|
|
108
|
+
return false;
|
|
109
|
+
const entityNames = Object.keys(entities).map(name => name.toLowerCase() + 's');
|
|
110
|
+
return entityNames.some(name => page.path.includes('/' + name));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if ASL has admin/RBAC features
|
|
114
|
+
*/
|
|
115
|
+
hasAdminFeatures(asl) {
|
|
116
|
+
if (!asl.permissions)
|
|
117
|
+
return false;
|
|
118
|
+
return asl.permissions.some(p => p.role === 'admin' ||
|
|
119
|
+
p.role === 'moderator' ||
|
|
120
|
+
p.actions.includes('manage'));
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Resolve component dependencies
|
|
124
|
+
* E.g., if we need 'form', we also need 'button' and 'label'
|
|
125
|
+
*/
|
|
126
|
+
resolveDependencies(components) {
|
|
127
|
+
const resolved = new Set(components);
|
|
128
|
+
// Keep resolving until no new dependencies are added
|
|
129
|
+
let changed = true;
|
|
130
|
+
while (changed) {
|
|
131
|
+
changed = false;
|
|
132
|
+
const current = Array.from(resolved);
|
|
133
|
+
for (const comp of current) {
|
|
134
|
+
const definition = this.catalog.components.find(c => c.name === comp);
|
|
135
|
+
if (definition) {
|
|
136
|
+
for (const dep of definition.dependencies) {
|
|
137
|
+
if (!resolved.has(dep)) {
|
|
138
|
+
resolved.add(dep);
|
|
139
|
+
changed = true;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Return sorted array
|
|
146
|
+
return Array.from(resolved).sort();
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Load shadCN component catalog
|
|
150
|
+
*/
|
|
151
|
+
loadCatalog() {
|
|
152
|
+
try {
|
|
153
|
+
const catalogPath = path.join(__dirname, '../config/shadcn-catalog.json');
|
|
154
|
+
return fs.readJSONSync(catalogPath);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
// Return minimal catalog if file doesn't exist yet
|
|
158
|
+
return this.getDefaultCatalog();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Default catalog (used if shadcn-catalog.json doesn't exist yet)
|
|
163
|
+
*/
|
|
164
|
+
getDefaultCatalog() {
|
|
165
|
+
return {
|
|
166
|
+
components: [
|
|
167
|
+
{
|
|
168
|
+
name: 'button',
|
|
169
|
+
dependencies: [],
|
|
170
|
+
useCases: ['forms', 'actions', 'navigation'],
|
|
171
|
+
description: 'Interactive button component with variants',
|
|
172
|
+
required: true
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: 'form',
|
|
176
|
+
dependencies: ['label', 'button'],
|
|
177
|
+
useCases: ['auth', 'crud', 'settings'],
|
|
178
|
+
description: 'Form wrapper with validation support',
|
|
179
|
+
required: false
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
name: 'input',
|
|
183
|
+
dependencies: ['label'],
|
|
184
|
+
useCases: ['auth', 'forms'],
|
|
185
|
+
description: 'Text input field',
|
|
186
|
+
required: false
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
name: 'card',
|
|
190
|
+
dependencies: [],
|
|
191
|
+
useCases: ['lists', 'dashboard'],
|
|
192
|
+
description: 'Container with header, content, footer',
|
|
193
|
+
required: false
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
name: 'table',
|
|
197
|
+
dependencies: [],
|
|
198
|
+
useCases: ['lists', 'admin', 'data-display'],
|
|
199
|
+
description: 'Data table component',
|
|
200
|
+
required: false
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
name: 'dialog',
|
|
204
|
+
dependencies: ['button'],
|
|
205
|
+
useCases: ['modals', 'forms', 'confirmations'],
|
|
206
|
+
description: 'Modal dialog component',
|
|
207
|
+
required: false
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
name: 'toast',
|
|
211
|
+
dependencies: [],
|
|
212
|
+
useCases: ['notifications', 'feedback'],
|
|
213
|
+
description: 'Toast notification system',
|
|
214
|
+
required: false
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
name: 'select',
|
|
218
|
+
dependencies: [],
|
|
219
|
+
useCases: ['forms', 'filters'],
|
|
220
|
+
description: 'Dropdown select component',
|
|
221
|
+
required: false
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
name: 'label',
|
|
225
|
+
dependencies: [],
|
|
226
|
+
useCases: ['forms'],
|
|
227
|
+
description: 'Form label component',
|
|
228
|
+
required: false
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
name: 'textarea',
|
|
232
|
+
dependencies: ['label'],
|
|
233
|
+
useCases: ['forms', 'comments'],
|
|
234
|
+
description: 'Multi-line text input',
|
|
235
|
+
required: false
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
name: 'dropdown-menu',
|
|
239
|
+
dependencies: ['button'],
|
|
240
|
+
useCases: ['navigation', 'actions', 'admin'],
|
|
241
|
+
description: 'Dropdown menu component',
|
|
242
|
+
required: false
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
name: 'badge',
|
|
246
|
+
dependencies: [],
|
|
247
|
+
useCases: ['status', 'labels', 'counts'],
|
|
248
|
+
description: 'Badge/pill component for status',
|
|
249
|
+
required: false
|
|
250
|
+
}
|
|
251
|
+
],
|
|
252
|
+
metadata: {
|
|
253
|
+
version: 'latest',
|
|
254
|
+
totalComponents: 12,
|
|
255
|
+
lastUpdated: '2026-02-22'
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Explain why each component was chosen
|
|
261
|
+
*/
|
|
262
|
+
explainChoices(asl) {
|
|
263
|
+
const explanations = new Map();
|
|
264
|
+
const components = this.inferNeededComponents(asl);
|
|
265
|
+
components.forEach(comp => {
|
|
266
|
+
const definition = this.catalog.components.find(c => c.name === comp);
|
|
267
|
+
if (!definition)
|
|
268
|
+
return;
|
|
269
|
+
if (comp === 'button' || comp === 'card') {
|
|
270
|
+
explanations.set(comp, 'Always needed for UI');
|
|
271
|
+
}
|
|
272
|
+
else if (asl.auth && ['form', 'input', 'label', 'toast'].includes(comp)) {
|
|
273
|
+
explanations.set(comp, 'Required for authentication');
|
|
274
|
+
}
|
|
275
|
+
else if (asl.entities && Object.keys(asl.entities).length > 0 && ['textarea', 'select', 'dialog'].includes(comp)) {
|
|
276
|
+
explanations.set(comp, 'Required for CRUD forms');
|
|
277
|
+
}
|
|
278
|
+
else if (comp === 'table') {
|
|
279
|
+
explanations.set(comp, 'Required for entity lists');
|
|
280
|
+
}
|
|
281
|
+
else if (this.hasAdminFeatures(asl) && ['dropdown-menu', 'badge'].includes(comp)) {
|
|
282
|
+
explanations.set(comp, 'Required for admin features');
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
// Dependency
|
|
286
|
+
const parent = components.find(c => {
|
|
287
|
+
const def = this.catalog.components.find(d => d.name === c);
|
|
288
|
+
return def?.dependencies.includes(comp);
|
|
289
|
+
});
|
|
290
|
+
if (parent) {
|
|
291
|
+
explanations.set(comp, `Dependency of ${parent}`);
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
explanations.set(comp, definition.description);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
return explanations;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
exports.ComponentInferenceEngine = ComponentInferenceEngine;
|
|
302
|
+
//# sourceMappingURL=ComponentInferenceEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComponentInferenceEngine.js","sourceRoot":"","sources":["../../src/services/ComponentInferenceEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ASL } from "../types/asl";
|
|
2
|
+
export interface ShadCNComponentMetadata {
|
|
3
|
+
name: string;
|
|
4
|
+
version: string;
|
|
5
|
+
installedAt: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CustomComponentMetadata {
|
|
8
|
+
name: string;
|
|
9
|
+
type: 'auth' | 'entity' | 'custom';
|
|
10
|
+
path: string;
|
|
11
|
+
shadcnDeps: string[];
|
|
12
|
+
props?: Record<string, string>;
|
|
13
|
+
createdAt: string;
|
|
14
|
+
lastModified?: string;
|
|
15
|
+
usedIn: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface ComponentRegistryData {
|
|
18
|
+
version: string;
|
|
19
|
+
shadcnComponents: ShadCNComponentMetadata[];
|
|
20
|
+
customComponents: CustomComponentMetadata[];
|
|
21
|
+
stats: {
|
|
22
|
+
totalShadCN: number;
|
|
23
|
+
totalCustom: number;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* ComponentRegistry - Track all components in the project
|
|
28
|
+
*
|
|
29
|
+
* Maintains .mycontext/components_registry.json with metadata about:
|
|
30
|
+
* - Installed shadCN components
|
|
31
|
+
* - Custom generated components
|
|
32
|
+
* - Component dependencies and usage
|
|
33
|
+
*
|
|
34
|
+
* Enables:
|
|
35
|
+
* - LEGO assembly (component reuse)
|
|
36
|
+
* - Token usage tracking
|
|
37
|
+
* - Avoiding duplicate installations
|
|
38
|
+
*/
|
|
39
|
+
export declare class ComponentRegistry {
|
|
40
|
+
/**
|
|
41
|
+
* Initialize component registry for a new project
|
|
42
|
+
*/
|
|
43
|
+
initialize(projectPath: string, asl: ASL, shadcnComponents: string[]): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Register a custom component
|
|
46
|
+
*/
|
|
47
|
+
registerComponent(projectPath: string, component: CustomComponentMetadata): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Check if a shadCN component is installed
|
|
50
|
+
*/
|
|
51
|
+
has(projectPath: string, componentName: string): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Get all custom components of a specific type
|
|
54
|
+
*/
|
|
55
|
+
findByType(projectPath: string, type: CustomComponentMetadata['type']): Promise<CustomComponentMetadata[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Get registry stats
|
|
58
|
+
*/
|
|
59
|
+
getStats(projectPath: string): Promise<ComponentRegistryData['stats'] | null>;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=ComponentRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComponentRegistry.d.ts","sourceRoot":"","sources":["../../src/services/ComponentRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAInC,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,uBAAuB,EAAE,CAAC;IAC5C,gBAAgB,EAAE,uBAAuB,EAAE,CAAC;IAC5C,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,iBAAiB;IAC5B;;OAEG;IACG,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,GAAG,EACR,gBAAgB,EAAE,MAAM,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC;IAoBhB;;OAEG;IACG,iBAAiB,CACrB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,uBAAuB,GACjC,OAAO,CAAC,IAAI,CAAC;IAchB;;OAEG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUvE;;OAEG;IACG,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,uBAAuB,CAAC,MAAM,CAAC,GACpC,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAUrC;;OAEG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CASpF"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ComponentRegistry = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const fs = __importStar(require("fs-extra"));
|
|
39
|
+
/**
|
|
40
|
+
* ComponentRegistry - Track all components in the project
|
|
41
|
+
*
|
|
42
|
+
* Maintains .mycontext/components_registry.json with metadata about:
|
|
43
|
+
* - Installed shadCN components
|
|
44
|
+
* - Custom generated components
|
|
45
|
+
* - Component dependencies and usage
|
|
46
|
+
*
|
|
47
|
+
* Enables:
|
|
48
|
+
* - LEGO assembly (component reuse)
|
|
49
|
+
* - Token usage tracking
|
|
50
|
+
* - Avoiding duplicate installations
|
|
51
|
+
*/
|
|
52
|
+
class ComponentRegistry {
|
|
53
|
+
/**
|
|
54
|
+
* Initialize component registry for a new project
|
|
55
|
+
*/
|
|
56
|
+
async initialize(projectPath, asl, shadcnComponents) {
|
|
57
|
+
const registry = {
|
|
58
|
+
version: '1.0',
|
|
59
|
+
shadcnComponents: shadcnComponents.map(name => ({
|
|
60
|
+
name,
|
|
61
|
+
version: 'latest',
|
|
62
|
+
installedAt: new Date().toISOString()
|
|
63
|
+
})),
|
|
64
|
+
customComponents: [],
|
|
65
|
+
stats: {
|
|
66
|
+
totalShadCN: shadcnComponents.length,
|
|
67
|
+
totalCustom: 0
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const registryPath = path.join(projectPath, '.mycontext', 'components_registry.json');
|
|
71
|
+
await fs.ensureDir(path.dirname(registryPath));
|
|
72
|
+
await fs.writeJSON(registryPath, registry, { spaces: 2 });
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Register a custom component
|
|
76
|
+
*/
|
|
77
|
+
async registerComponent(projectPath, component) {
|
|
78
|
+
const registryPath = path.join(projectPath, '.mycontext', 'components_registry.json');
|
|
79
|
+
// Load existing registry
|
|
80
|
+
const registry = await fs.readJSON(registryPath);
|
|
81
|
+
// Add component
|
|
82
|
+
registry.customComponents.push(component);
|
|
83
|
+
registry.stats.totalCustom = registry.customComponents.length;
|
|
84
|
+
// Save
|
|
85
|
+
await fs.writeJSON(registryPath, registry, { spaces: 2 });
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if a shadCN component is installed
|
|
89
|
+
*/
|
|
90
|
+
async has(projectPath, componentName) {
|
|
91
|
+
try {
|
|
92
|
+
const registryPath = path.join(projectPath, '.mycontext', 'components_registry.json');
|
|
93
|
+
const registry = await fs.readJSON(registryPath);
|
|
94
|
+
return registry.shadcnComponents.some(c => c.name === componentName);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get all custom components of a specific type
|
|
102
|
+
*/
|
|
103
|
+
async findByType(projectPath, type) {
|
|
104
|
+
try {
|
|
105
|
+
const registryPath = path.join(projectPath, '.mycontext', 'components_registry.json');
|
|
106
|
+
const registry = await fs.readJSON(registryPath);
|
|
107
|
+
return registry.customComponents.filter(c => c.type === type);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get registry stats
|
|
115
|
+
*/
|
|
116
|
+
async getStats(projectPath) {
|
|
117
|
+
try {
|
|
118
|
+
const registryPath = path.join(projectPath, '.mycontext', 'components_registry.json');
|
|
119
|
+
const registry = await fs.readJSON(registryPath);
|
|
120
|
+
return registry.stats;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.ComponentRegistry = ComponentRegistry;
|
|
128
|
+
//# sourceMappingURL=ComponentRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComponentRegistry.js","sourceRoot":"","sources":["../../src/services/ComponentRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -194,7 +194,7 @@ Consider:
|
|
|
194
194
|
4. What patterns exist in similar applications?
|
|
195
195
|
|
|
196
196
|
## Guidelines
|
|
197
|
-
1. **Entities**: Must have 'name' and 'fields'. Fields must have 'name' and 'type' (string, number, boolean, date, json, ref).
|
|
197
|
+
1. **Entities**: Must be a Record/Object where keys are entity names. Each entity must have 'name' and 'fields'. Fields must have 'name' and 'type' (string, number, boolean, date, json, ref).
|
|
198
198
|
2. **Auth**: If needed, provider must be 'email', 'oauth-github', 'oauth-google', or 'magic-link'.
|
|
199
199
|
3. **Permissions**: Each permission must have 'role', 'resource' (entity name or '*'), and 'actions' (array of: 'create', 'read', 'update', 'delete', 'manage'). **DO NOT USE 'can'**.
|
|
200
200
|
4. **Pages**: Must have 'path' (e.g., '/dashboard'), 'name' (component name), 'type' ('page' or 'layout').
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectScanner.d.ts","sourceRoot":"","sources":["../../src/services/ProjectScanner.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,oBAAoB,GAAG,iBAAiB,GAAG,UAAU,GAAG,YAAY,CAAC;IAC3E,QAAQ,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,qBAAqB,EAAE,GAAG,CAAC;CAC5B;
|
|
1
|
+
{"version":3,"file":"ProjectScanner.d.ts","sourceRoot":"","sources":["../../src/services/ProjectScanner.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,oBAAoB,GAAG,iBAAiB,GAAG,UAAU,GAAG,YAAY,CAAC;IAC3E,QAAQ,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,qBAAqB,EAAE,GAAG,CAAC;CAC5B;AAsCD,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,EAAE,CAAuB;gBAErB,WAAW,GAAE,MAAsB;IAI/C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC;IAqCtC;;OAEG;YACW,aAAa;IAoF3B;;OAEG;YACW,eAAe;IAe7B;;OAEG;IACG,cAAc,CAClB,QAAQ,EAAE,eAAe,EACzB,eAAe,EAAE,GAAG,GACnB,OAAO,CAAC,iBAAiB,CAAC;IA6E7B;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAYhD;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IA8B9C;;OAEG;IACH,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,eAAe;CAMxB"}
|