logicstamp-context 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/LLM_CONTEXT.md +260 -0
- package/README.md +949 -0
- package/dist/cli/commands/clean.d.ts +15 -0
- package/dist/cli/commands/clean.d.ts.map +1 -0
- package/dist/cli/commands/clean.js +142 -0
- package/dist/cli/commands/clean.js.map +1 -0
- package/dist/cli/commands/compare.d.ts +88 -0
- package/dist/cli/commands/compare.d.ts.map +1 -0
- package/dist/cli/commands/compare.js +519 -0
- package/dist/cli/commands/compare.js.map +1 -0
- package/dist/cli/commands/context.d.ts +24 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +576 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/init.d.ts +14 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +71 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +52 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +368 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +223 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/stamp.d.ts +7 -0
- package/dist/cli/stamp.d.ts.map +1 -0
- package/dist/cli/stamp.js +961 -0
- package/dist/cli/stamp.js.map +1 -0
- package/dist/cli/validate-index.d.ts +7 -0
- package/dist/cli/validate-index.d.ts.map +1 -0
- package/dist/cli/validate-index.js +55 -0
- package/dist/cli/validate-index.js.map +1 -0
- package/dist/core/astParser.d.ts +47 -0
- package/dist/core/astParser.d.ts.map +1 -0
- package/dist/core/astParser.js +417 -0
- package/dist/core/astParser.js.map +1 -0
- package/dist/core/contractBuilder.d.ts +48 -0
- package/dist/core/contractBuilder.d.ts.map +1 -0
- package/dist/core/contractBuilder.js +120 -0
- package/dist/core/contractBuilder.js.map +1 -0
- package/dist/core/manifest.d.ts +75 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +173 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/pack.d.ts +190 -0
- package/dist/core/pack.d.ts.map +1 -0
- package/dist/core/pack.js +438 -0
- package/dist/core/pack.js.map +1 -0
- package/dist/core/signature.d.ts +47 -0
- package/dist/core/signature.d.ts.map +1 -0
- package/dist/core/signature.js +208 -0
- package/dist/core/signature.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/types/UIFContract.d.ts +112 -0
- package/dist/types/UIFContract.d.ts.map +1 -0
- package/dist/types/UIFContract.js +36 -0
- package/dist/types/UIFContract.js.map +1 -0
- package/dist/utils/config.d.ts +34 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +62 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/fsx.d.ts +85 -0
- package/dist/utils/fsx.d.ts.map +1 -0
- package/dist/utils/fsx.js +181 -0
- package/dist/utils/fsx.js.map +1 -0
- package/dist/utils/gitignore.d.ts +62 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +183 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/hash.d.ts +73 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +159 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/llmContext.d.ts +34 -0
- package/dist/utils/llmContext.d.ts.map +1 -0
- package/dist/utils/llmContext.js +136 -0
- package/dist/utils/llmContext.js.map +1 -0
- package/dist/utils/tokens.d.ts +23 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +29 -0
- package/dist/utils/tokens.js.map +1 -0
- package/package.json +69 -0
- package/schema/logicstamp.context.schema.json +430 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @uif Contract 0.3
|
|
3
|
+
*
|
|
4
|
+
* Description: signature - Presentational component
|
|
5
|
+
*
|
|
6
|
+
* Version (Component Composition):
|
|
7
|
+
* variables: []
|
|
8
|
+
* hooks: []
|
|
9
|
+
* components: []
|
|
10
|
+
* functions: ["applyDisplayOnlyPreset","applyNavOnlyPreset","applySubmitOnlyPreset","buildLogicSignature","generateBehavioralPredictions","inferDescription"]
|
|
11
|
+
* imports: ["../types/UIFContract.js","./astParser.js"]
|
|
12
|
+
*
|
|
13
|
+
* Logic Signature:
|
|
14
|
+
* props: {}
|
|
15
|
+
* emits: {}
|
|
16
|
+
* state: {}
|
|
17
|
+
*
|
|
18
|
+
* Predictions:
|
|
19
|
+
* (none)
|
|
20
|
+
*
|
|
21
|
+
* Hashes (informational only - authoritative values in .uif.json):
|
|
22
|
+
* semantic: uif:9a5a412d07f6985e03fda241 (informational)
|
|
23
|
+
* file: uif:64d7d3b1474878658358e5a8
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Build logic signature with preset validation
|
|
27
|
+
*/
|
|
28
|
+
export function buildLogicSignature(ast, preset) {
|
|
29
|
+
const signature = {
|
|
30
|
+
props: ast.props,
|
|
31
|
+
emits: ast.emits,
|
|
32
|
+
state: Object.keys(ast.state).length > 0 ? ast.state : undefined,
|
|
33
|
+
};
|
|
34
|
+
const prediction = [];
|
|
35
|
+
const violations = [];
|
|
36
|
+
// Apply preset-specific rules
|
|
37
|
+
switch (preset) {
|
|
38
|
+
case 'submit-only':
|
|
39
|
+
applySubmitOnlyPreset(ast, prediction, violations);
|
|
40
|
+
break;
|
|
41
|
+
case 'nav-only':
|
|
42
|
+
applyNavOnlyPreset(ast, prediction, violations);
|
|
43
|
+
break;
|
|
44
|
+
case 'display-only':
|
|
45
|
+
applyDisplayOnlyPreset(ast, prediction, violations);
|
|
46
|
+
break;
|
|
47
|
+
case 'none':
|
|
48
|
+
// No preset constraints
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
return { signature, prediction, violations };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Submit-only preset: only onSubmit event allowed
|
|
55
|
+
*/
|
|
56
|
+
function applySubmitOnlyPreset(ast, prediction, violations) {
|
|
57
|
+
prediction.push('Contract preset: submit-only');
|
|
58
|
+
const allowedEvents = ['onSubmit'];
|
|
59
|
+
const eventKeys = Object.keys(ast.emits);
|
|
60
|
+
const forbidden = eventKeys.filter((key) => !allowedEvents.includes(key));
|
|
61
|
+
if (forbidden.length > 0) {
|
|
62
|
+
violations.push(`Submit-only contract violated: remove events [${forbidden.join(', ')}]`);
|
|
63
|
+
}
|
|
64
|
+
if (eventKeys.includes('onSubmit')) {
|
|
65
|
+
prediction.push('When loading=true, submit button should be disabled');
|
|
66
|
+
prediction.push('onSubmit is the only permitted action handler');
|
|
67
|
+
}
|
|
68
|
+
// Check for loading/busy state
|
|
69
|
+
if (ast.state.loading || ast.state.busy || ast.state.isLoading) {
|
|
70
|
+
prediction.push('Loading state controls button disabled state');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Nav-only preset: only onClick navigation allowed
|
|
75
|
+
*/
|
|
76
|
+
function applyNavOnlyPreset(ast, prediction, violations) {
|
|
77
|
+
prediction.push('Contract preset: nav-only');
|
|
78
|
+
const allowedEvents = ['onClick'];
|
|
79
|
+
const eventKeys = Object.keys(ast.emits);
|
|
80
|
+
const forbidden = eventKeys.filter((key) => !allowedEvents.includes(key));
|
|
81
|
+
if (forbidden.length > 0) {
|
|
82
|
+
violations.push(`Nav-only contract violated: remove events [${forbidden.join(', ')}]`);
|
|
83
|
+
}
|
|
84
|
+
if (!eventKeys.includes('onClick')) {
|
|
85
|
+
violations.push('Nav-only contract expects an onClick navigation handler');
|
|
86
|
+
}
|
|
87
|
+
prediction.push('Component handles navigation only, no form submission or data mutation');
|
|
88
|
+
// Check for href prop (for link-like components)
|
|
89
|
+
if ('href' in ast.props || 'to' in ast.props) {
|
|
90
|
+
prediction.push('Navigation target specified via href/to prop');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Display-only preset: no events allowed
|
|
95
|
+
*/
|
|
96
|
+
function applyDisplayOnlyPreset(ast, prediction, violations) {
|
|
97
|
+
prediction.push('Contract preset: display-only');
|
|
98
|
+
const eventKeys = Object.keys(ast.emits);
|
|
99
|
+
if (eventKeys.length > 0) {
|
|
100
|
+
violations.push(`Display-only contract violated: no events permitted, found [${eventKeys.join(', ')}]`);
|
|
101
|
+
}
|
|
102
|
+
prediction.push('Component is purely presentational with no event handlers');
|
|
103
|
+
prediction.push('All behavior driven by props only');
|
|
104
|
+
// Check for derived state
|
|
105
|
+
const stateKeys = Object.keys(ast.state);
|
|
106
|
+
if (stateKeys.length > 0) {
|
|
107
|
+
violations.push(`Display-only contract should minimize internal state, found [${stateKeys.join(', ')}]`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Generate additional behavioral predictions based on common patterns
|
|
112
|
+
*/
|
|
113
|
+
export function generateBehavioralPredictions(ast) {
|
|
114
|
+
const predictions = [];
|
|
115
|
+
// Form handling patterns
|
|
116
|
+
if (ast.hooks.includes('useForm') || ast.functions.some((f) => f.includes('validate'))) {
|
|
117
|
+
predictions.push('Includes form validation logic');
|
|
118
|
+
}
|
|
119
|
+
// Side effects
|
|
120
|
+
if (ast.hooks.includes('useEffect')) {
|
|
121
|
+
predictions.push('Has side effects managed by useEffect');
|
|
122
|
+
}
|
|
123
|
+
// Data fetching
|
|
124
|
+
if (ast.hooks.some((h) => h.includes('Query') || h.includes('Mutation')) ||
|
|
125
|
+
ast.functions.some((f) => f.includes('fetch') || f.includes('load'))) {
|
|
126
|
+
predictions.push('Fetches or mutates external data');
|
|
127
|
+
}
|
|
128
|
+
// Memoization
|
|
129
|
+
if (ast.hooks.includes('useMemo') || ast.hooks.includes('useCallback')) {
|
|
130
|
+
predictions.push('Uses memoization for performance optimization');
|
|
131
|
+
}
|
|
132
|
+
// Context usage
|
|
133
|
+
if (ast.hooks.includes('useContext')) {
|
|
134
|
+
predictions.push('Consumes React Context for shared state');
|
|
135
|
+
}
|
|
136
|
+
// Refs
|
|
137
|
+
if (ast.hooks.includes('useRef')) {
|
|
138
|
+
predictions.push('Uses refs for DOM access or mutable values');
|
|
139
|
+
}
|
|
140
|
+
// Loading states
|
|
141
|
+
const stateKeys = Object.keys(ast.state);
|
|
142
|
+
if (stateKeys.some((k) => k.includes('loading') || k.includes('pending'))) {
|
|
143
|
+
predictions.push('Manages loading/pending UI states');
|
|
144
|
+
}
|
|
145
|
+
// Error states
|
|
146
|
+
if (stateKeys.some((k) => k.includes('error'))) {
|
|
147
|
+
predictions.push('Handles and displays error states');
|
|
148
|
+
}
|
|
149
|
+
return predictions;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Infer component description from file name and structure
|
|
153
|
+
*/
|
|
154
|
+
export function inferDescription(filePath, ast) {
|
|
155
|
+
const fileName = filePath.split(/[/\\]/).pop()?.replace(/\.(tsx?|jsx?)$/, '') || 'Component';
|
|
156
|
+
// Check kind first - non-React files should get appropriate labels
|
|
157
|
+
if (ast.kind === 'node:cli') {
|
|
158
|
+
return `${fileName} - CLI entry point`;
|
|
159
|
+
}
|
|
160
|
+
if (ast.kind === 'ts:module') {
|
|
161
|
+
// Check for common utility patterns
|
|
162
|
+
if (fileName.toLowerCase().includes('util') || fileName.toLowerCase().includes('helper')) {
|
|
163
|
+
return `${fileName} - Utility module`;
|
|
164
|
+
}
|
|
165
|
+
if (fileName.toLowerCase().includes('config')) {
|
|
166
|
+
return `${fileName} - Configuration module`;
|
|
167
|
+
}
|
|
168
|
+
if (fileName.toLowerCase().includes('type') || fileName.toLowerCase().includes('interface')) {
|
|
169
|
+
return `${fileName} - Type definitions`;
|
|
170
|
+
}
|
|
171
|
+
return `${fileName} - TypeScript module`;
|
|
172
|
+
}
|
|
173
|
+
// React component patterns (kind === 'react:component')
|
|
174
|
+
if (fileName.toLowerCase().includes('button')) {
|
|
175
|
+
return `${fileName} - Interactive button component`;
|
|
176
|
+
}
|
|
177
|
+
if (fileName.toLowerCase().includes('form')) {
|
|
178
|
+
return `${fileName} - Form component with validation`;
|
|
179
|
+
}
|
|
180
|
+
if (fileName.toLowerCase().includes('modal') || fileName.toLowerCase().includes('dialog')) {
|
|
181
|
+
return `${fileName} - Modal/dialog component`;
|
|
182
|
+
}
|
|
183
|
+
if (fileName.toLowerCase().includes('input') || fileName.toLowerCase().includes('field')) {
|
|
184
|
+
return `${fileName} - Form input field`;
|
|
185
|
+
}
|
|
186
|
+
if (fileName.toLowerCase().includes('card')) {
|
|
187
|
+
return `${fileName} - Card display component`;
|
|
188
|
+
}
|
|
189
|
+
if (fileName.toLowerCase().includes('nav') || fileName.toLowerCase().includes('menu')) {
|
|
190
|
+
return `${fileName} - Navigation component`;
|
|
191
|
+
}
|
|
192
|
+
// Default description based on state and emits
|
|
193
|
+
const hasState = Object.keys(ast.state).length > 0;
|
|
194
|
+
const hasEmits = Object.keys(ast.emits).length > 0;
|
|
195
|
+
if (hasState && hasEmits) {
|
|
196
|
+
return `${fileName} - Interactive component with internal state`;
|
|
197
|
+
}
|
|
198
|
+
else if (hasState) {
|
|
199
|
+
return `${fileName} - Stateful component`;
|
|
200
|
+
}
|
|
201
|
+
else if (hasEmits) {
|
|
202
|
+
return `${fileName} - Interactive component`;
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
return `${fileName} - Presentational component`;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=signature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature.js","sourceRoot":"","sources":["../../src/core/signature.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LogicStamp Context - Main entry point
|
|
3
|
+
*
|
|
4
|
+
* This package provides tools for generating AI-friendly context bundles
|
|
5
|
+
* from React/TypeScript codebases.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { extractFromFile, buildContract, pack } from 'logicstamp-context';
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export type { UIFContract, NextJSMetadata, LogicSignature, ContractKind, PropType, EventType } from './types/UIFContract.js';
|
|
13
|
+
export type { LogicStampBundle, BundleNode, PackOptions, CodeInclusionMode, BundleFormat, MissingDependency } from './core/pack.js';
|
|
14
|
+
export type { ProjectManifest, ComponentNode } from './core/manifest.js';
|
|
15
|
+
export type { AstExtract } from './core/astParser.js';
|
|
16
|
+
export type { ContractBuildResult, ContractBuildParams } from './core/contractBuilder.js';
|
|
17
|
+
export type { SignatureResult } from './core/signature.js';
|
|
18
|
+
export { extractFromFile } from './core/astParser.js';
|
|
19
|
+
export { buildContract } from './core/contractBuilder.js';
|
|
20
|
+
export { pack, computeBundleHash, validateHashLock } from './core/pack.js';
|
|
21
|
+
export { buildLogicSignature } from './core/signature.js';
|
|
22
|
+
export { contextCommand, type ContextOptions } from './cli/commands/context.js';
|
|
23
|
+
export { compareCommand, type CompareOptions } from './cli/commands/compare.js';
|
|
24
|
+
export { validateCommand } from './cli/commands/validate.js';
|
|
25
|
+
export { init } from './cli/commands/init.js';
|
|
26
|
+
export { cleanCommand } from './cli/commands/clean.js';
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC7H,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACpI,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACzE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LogicStamp Context - Main entry point
|
|
3
|
+
*
|
|
4
|
+
* This package provides tools for generating AI-friendly context bundles
|
|
5
|
+
* from React/TypeScript codebases.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { extractFromFile, buildContract, pack } from 'logicstamp-context';
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
// Core functions
|
|
13
|
+
export { extractFromFile } from './core/astParser.js';
|
|
14
|
+
export { buildContract } from './core/contractBuilder.js';
|
|
15
|
+
export { pack, computeBundleHash, validateHashLock } from './core/pack.js';
|
|
16
|
+
export { buildLogicSignature } from './core/signature.js';
|
|
17
|
+
// CLI commands (for programmatic use)
|
|
18
|
+
export { contextCommand } from './cli/commands/context.js';
|
|
19
|
+
export { compareCommand } from './cli/commands/compare.js';
|
|
20
|
+
export { validateCommand } from './cli/commands/validate.js';
|
|
21
|
+
export { init } from './cli/commands/init.js';
|
|
22
|
+
export { cleanCommand } from './cli/commands/clean.js';
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,sCAAsC;AACtC,OAAO,EAAE,cAAc,EAAuB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,cAAc,EAAuB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @uif Contract 0.3
|
|
3
|
+
*
|
|
4
|
+
* Description: UIFContract - Presentational component
|
|
5
|
+
*
|
|
6
|
+
* Version (Component Composition):
|
|
7
|
+
* variables: []
|
|
8
|
+
* hooks: []
|
|
9
|
+
* components: []
|
|
10
|
+
* functions: ["isUIFContract"]
|
|
11
|
+
* imports: []
|
|
12
|
+
*
|
|
13
|
+
* Logic Signature:
|
|
14
|
+
* props: {}
|
|
15
|
+
* emits: {}
|
|
16
|
+
* state: {}
|
|
17
|
+
*
|
|
18
|
+
* Predictions:
|
|
19
|
+
* (none)
|
|
20
|
+
*
|
|
21
|
+
* Hashes (informational only - authoritative values in .uif.json):
|
|
22
|
+
* semantic: uif:84f4985dd25893f9bb7e43f6 (informational)
|
|
23
|
+
* file: uif:f1297e88a770031270331b9b
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Core type definition for UI Forge Contract
|
|
27
|
+
* Schema version 0.3
|
|
28
|
+
*/
|
|
29
|
+
export type ContractPreset = 'submit-only' | 'nav-only' | 'display-only' | 'none';
|
|
30
|
+
export type ContractKind = 'react:component' | 'ts:module' | 'node:cli';
|
|
31
|
+
export interface ComponentVersion {
|
|
32
|
+
variables: string[];
|
|
33
|
+
hooks: string[];
|
|
34
|
+
components: string[];
|
|
35
|
+
functions: string[];
|
|
36
|
+
imports?: string[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Prop type descriptors
|
|
40
|
+
*/
|
|
41
|
+
export type PropType = string | string[] | {
|
|
42
|
+
type: 'literal-union' | 'function' | 'object' | 'array' | string;
|
|
43
|
+
optional?: boolean;
|
|
44
|
+
literals?: string[];
|
|
45
|
+
signature?: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Event type descriptors
|
|
49
|
+
*/
|
|
50
|
+
export type EventType = string | {
|
|
51
|
+
type: 'function';
|
|
52
|
+
signature: string;
|
|
53
|
+
optional?: boolean;
|
|
54
|
+
};
|
|
55
|
+
export interface LogicSignature {
|
|
56
|
+
props: Record<string, PropType>;
|
|
57
|
+
emits: Record<string, EventType>;
|
|
58
|
+
state?: Record<string, string>;
|
|
59
|
+
}
|
|
60
|
+
export interface A11yMetrics {
|
|
61
|
+
contrastMin?: number;
|
|
62
|
+
role?: string;
|
|
63
|
+
}
|
|
64
|
+
export interface LatencyMetrics {
|
|
65
|
+
clientP95Ms?: number;
|
|
66
|
+
}
|
|
67
|
+
export interface CoverageMetrics {
|
|
68
|
+
lines?: number;
|
|
69
|
+
branches?: number;
|
|
70
|
+
}
|
|
71
|
+
export interface ContractMetrics {
|
|
72
|
+
a11y?: A11yMetrics;
|
|
73
|
+
latency?: LatencyMetrics;
|
|
74
|
+
coverage?: CoverageMetrics;
|
|
75
|
+
}
|
|
76
|
+
export interface ContractLinks {
|
|
77
|
+
tokens?: string;
|
|
78
|
+
figma?: string;
|
|
79
|
+
spec?: string;
|
|
80
|
+
}
|
|
81
|
+
export interface NextJSMetadata {
|
|
82
|
+
isInAppDir?: boolean;
|
|
83
|
+
directive?: 'client' | 'server';
|
|
84
|
+
}
|
|
85
|
+
export type ExportMetadata = 'default' | 'named' | {
|
|
86
|
+
named: string[];
|
|
87
|
+
};
|
|
88
|
+
export interface UIFContract {
|
|
89
|
+
type: 'UIFContract';
|
|
90
|
+
schemaVersion: '0.3';
|
|
91
|
+
kind: ContractKind;
|
|
92
|
+
entryId: string;
|
|
93
|
+
entryPathAbs?: string;
|
|
94
|
+
entryPathRel?: string;
|
|
95
|
+
os?: 'win32' | 'posix';
|
|
96
|
+
description: string;
|
|
97
|
+
usedIn?: string[];
|
|
98
|
+
version: ComponentVersion;
|
|
99
|
+
logicSignature: LogicSignature;
|
|
100
|
+
exports?: ExportMetadata;
|
|
101
|
+
prediction?: string[];
|
|
102
|
+
metrics?: ContractMetrics;
|
|
103
|
+
links?: ContractLinks;
|
|
104
|
+
nextjs?: NextJSMetadata;
|
|
105
|
+
semanticHash: string;
|
|
106
|
+
fileHash: string;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Utility type guards
|
|
110
|
+
*/
|
|
111
|
+
export declare function isUIFContract(obj: unknown): obj is UIFContract;
|
|
112
|
+
//# sourceMappingURL=UIFContract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UIFContract.d.ts","sourceRoot":"","sources":["../../src/types/UIFContract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @uif Contract 0.3
|
|
3
|
+
*
|
|
4
|
+
* Description: UIFContract - Presentational component
|
|
5
|
+
*
|
|
6
|
+
* Version (Component Composition):
|
|
7
|
+
* variables: []
|
|
8
|
+
* hooks: []
|
|
9
|
+
* components: []
|
|
10
|
+
* functions: ["isUIFContract"]
|
|
11
|
+
* imports: []
|
|
12
|
+
*
|
|
13
|
+
* Logic Signature:
|
|
14
|
+
* props: {}
|
|
15
|
+
* emits: {}
|
|
16
|
+
* state: {}
|
|
17
|
+
*
|
|
18
|
+
* Predictions:
|
|
19
|
+
* (none)
|
|
20
|
+
*
|
|
21
|
+
* Hashes (informational only - authoritative values in .uif.json):
|
|
22
|
+
* semantic: uif:84f4985dd25893f9bb7e43f6 (informational)
|
|
23
|
+
* file: uif:f1297e88a770031270331b9b
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Utility type guards
|
|
27
|
+
*/
|
|
28
|
+
export function isUIFContract(obj) {
|
|
29
|
+
return (typeof obj === 'object' &&
|
|
30
|
+
obj !== null &&
|
|
31
|
+
'type' in obj &&
|
|
32
|
+
obj.type === 'UIFContract' &&
|
|
33
|
+
'schemaVersion' in obj &&
|
|
34
|
+
obj.schemaVersion === '0.3');
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=UIFContract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UIFContract.js","sourceRoot":"","sources":["../../src/types/UIFContract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AA0GH;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,MAAM,IAAI,GAAG;QACb,GAAG,CAAC,IAAI,KAAK,aAAa;QAC1B,eAAe,IAAI,GAAG;QACtB,GAAG,CAAC,aAAa,KAAK,KAAK,CAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for managing LogicStamp configuration
|
|
3
|
+
*/
|
|
4
|
+
export interface LogicStampConfig {
|
|
5
|
+
/** User's preference for .gitignore management: "added" | "skipped" */
|
|
6
|
+
gitignorePreference?: 'added' | 'skipped';
|
|
7
|
+
/** User's preference for LLM_CONTEXT.md generation: "added" | "skipped" */
|
|
8
|
+
llmContextPreference?: 'added' | 'skipped';
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Get the config directory path for a project
|
|
12
|
+
*/
|
|
13
|
+
export declare function getConfigDir(projectRoot: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Get the config file path for a project
|
|
16
|
+
*/
|
|
17
|
+
export declare function getConfigPath(projectRoot: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Check if config file exists
|
|
20
|
+
*/
|
|
21
|
+
export declare function configExists(projectRoot: string): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Read config from disk
|
|
24
|
+
*/
|
|
25
|
+
export declare function readConfig(projectRoot: string): Promise<LogicStampConfig>;
|
|
26
|
+
/**
|
|
27
|
+
* Write config to disk
|
|
28
|
+
*/
|
|
29
|
+
export declare function writeConfig(projectRoot: string, config: LogicStampConfig): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Update config with new values (merges with existing)
|
|
32
|
+
*/
|
|
33
|
+
export declare function updateConfig(projectRoot: string, updates: Partial<LogicStampConfig>): Promise<void>;
|
|
34
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,mBAAmB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,2EAA2E;IAC3E,oBAAoB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQ/E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9F;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzG"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for managing LogicStamp configuration
|
|
3
|
+
*/
|
|
4
|
+
import { readFile, writeFile, mkdir, access } from 'node:fs/promises';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
/**
|
|
7
|
+
* Get the config directory path for a project
|
|
8
|
+
*/
|
|
9
|
+
export function getConfigDir(projectRoot) {
|
|
10
|
+
return join(projectRoot, '.logicstamp');
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Get the config file path for a project
|
|
14
|
+
*/
|
|
15
|
+
export function getConfigPath(projectRoot) {
|
|
16
|
+
return join(getConfigDir(projectRoot), 'config.json');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if config file exists
|
|
20
|
+
*/
|
|
21
|
+
export async function configExists(projectRoot) {
|
|
22
|
+
try {
|
|
23
|
+
await access(getConfigPath(projectRoot));
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Read config from disk
|
|
32
|
+
*/
|
|
33
|
+
export async function readConfig(projectRoot) {
|
|
34
|
+
try {
|
|
35
|
+
const configPath = getConfigPath(projectRoot);
|
|
36
|
+
const content = await readFile(configPath, 'utf-8');
|
|
37
|
+
return JSON.parse(content);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Write config to disk
|
|
45
|
+
*/
|
|
46
|
+
export async function writeConfig(projectRoot, config) {
|
|
47
|
+
const configDir = getConfigDir(projectRoot);
|
|
48
|
+
const configPath = getConfigPath(projectRoot);
|
|
49
|
+
// Ensure config directory exists
|
|
50
|
+
await mkdir(configDir, { recursive: true });
|
|
51
|
+
// Write config file
|
|
52
|
+
await writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Update config with new values (merges with existing)
|
|
56
|
+
*/
|
|
57
|
+
export async function updateConfig(projectRoot, updates) {
|
|
58
|
+
const existing = await readConfig(projectRoot);
|
|
59
|
+
const merged = { ...existing, ...updates };
|
|
60
|
+
await writeConfig(projectRoot, merged);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAW,MAAM,WAAW,CAAC;AAS1C;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,OAAO,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB;IAClD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,MAAwB;IAC7E,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAE9C,iCAAiC;IACjC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,oBAAoB;IACpB,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB,EAAE,OAAkC;IACxF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;IAC3C,MAAM,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @uif Contract 0.3
|
|
3
|
+
*
|
|
4
|
+
* Description: fsx - Presentational component
|
|
5
|
+
*
|
|
6
|
+
* Version (Component Composition):
|
|
7
|
+
* variables: []
|
|
8
|
+
* hooks: []
|
|
9
|
+
* components: []
|
|
10
|
+
* functions: ["deleteSidecar","fileExists","findSidecarFiles","getRelativePath","getSidecarPath","globFiles","normalizeEntryId","readFileWithText","resolvePath"]
|
|
11
|
+
* imports: ["glob","node:fs/promises","node:path"]
|
|
12
|
+
*
|
|
13
|
+
* Logic Signature:
|
|
14
|
+
* props: {}
|
|
15
|
+
* events: {}
|
|
16
|
+
* state: {}
|
|
17
|
+
*
|
|
18
|
+
* Predictions:
|
|
19
|
+
* (none)
|
|
20
|
+
*
|
|
21
|
+
* Hashes (informational only - authoritative values in .uif.json):
|
|
22
|
+
* semantic: uif:80b91273520265259cc8e40e (informational)
|
|
23
|
+
* file: uif:f6ee3958ee861ee956f6b5c9
|
|
24
|
+
*/
|
|
25
|
+
export interface FileWithText {
|
|
26
|
+
path: string;
|
|
27
|
+
text: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Find files matching glob patterns
|
|
31
|
+
*/
|
|
32
|
+
export declare function globFiles(searchPath: string, extensions?: string): Promise<string[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Read file and return path + content
|
|
35
|
+
*/
|
|
36
|
+
export declare function readFileWithText(filePath: string): Promise<FileWithText>;
|
|
37
|
+
/**
|
|
38
|
+
* Find all sidecar files (*.uif.json) in a directory
|
|
39
|
+
*/
|
|
40
|
+
export declare function findSidecarFiles(searchPath: string): Promise<string[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Delete a sidecar file
|
|
43
|
+
*/
|
|
44
|
+
export declare function deleteSidecar(sidecarPath: string): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Get relative path from base directory
|
|
47
|
+
*/
|
|
48
|
+
export declare function getRelativePath(from: string, to: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Resolve absolute path
|
|
51
|
+
*/
|
|
52
|
+
export declare function resolvePath(...paths: string[]): string;
|
|
53
|
+
/**
|
|
54
|
+
* Check if file exists
|
|
55
|
+
*/
|
|
56
|
+
export declare function fileExists(filePath: string): Promise<boolean>;
|
|
57
|
+
/**
|
|
58
|
+
* Get sidecar path for a source file
|
|
59
|
+
*/
|
|
60
|
+
export declare function getSidecarPath(sourcePath: string, outRoot: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* Normalize a file path for cross-platform consistency
|
|
63
|
+
* This is the canonical path normalization used throughout the codebase.
|
|
64
|
+
* Rules:
|
|
65
|
+
* - Convert backslashes to forward slashes (POSIX-style)
|
|
66
|
+
* - Use Node's normalize() to resolve .. and . segments
|
|
67
|
+
* - On Windows: preserve drive letter but normalize case
|
|
68
|
+
* - Remove leading ./ if present
|
|
69
|
+
* - Result should match manifest keys exactly
|
|
70
|
+
*
|
|
71
|
+
* This function is the single source of truth for path normalization.
|
|
72
|
+
* All entryId fields in contracts and manifest keys use this normalization.
|
|
73
|
+
*/
|
|
74
|
+
export declare function normalizeEntryId(entryId: string): string;
|
|
75
|
+
/**
|
|
76
|
+
* Get the folder path for a given file (parent directory)
|
|
77
|
+
* Returns normalized folder path
|
|
78
|
+
*/
|
|
79
|
+
export declare function getFolderPath(filePath: string): string;
|
|
80
|
+
/**
|
|
81
|
+
* Group files by their containing folder
|
|
82
|
+
* Returns a Map of folderPath -> array of file paths
|
|
83
|
+
*/
|
|
84
|
+
export declare function groupFilesByFolder(files: string[], projectRoot: string): Map<string, string[]>;
|
|
85
|
+
//# sourceMappingURL=fsx.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fsx.d.ts","sourceRoot":"","sources":["../../src/utils/fsx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAUH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAmB,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC,CAmCnB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAG9E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAM5E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAStE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ1E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAe9F"}
|