specforge-mcp 0.3.0 → 0.5.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/dist/config/db-engines.json +394 -1
- package/dist/engine/detectors/cache-db-detector.d.ts +3 -0
- package/dist/engine/detectors/cache-db-detector.d.ts.map +1 -0
- package/dist/engine/detectors/cache-db-detector.js +37 -0
- package/dist/engine/detectors/cache-db-detector.js.map +1 -0
- package/dist/engine/detectors/cloud-db-detector.d.ts +4 -0
- package/dist/engine/detectors/cloud-db-detector.d.ts.map +1 -0
- package/dist/engine/detectors/cloud-db-detector.js +50 -0
- package/dist/engine/detectors/cloud-db-detector.js.map +1 -0
- package/dist/engine/detectors/graph-db-detector.d.ts +3 -0
- package/dist/engine/detectors/graph-db-detector.d.ts.map +1 -0
- package/dist/engine/detectors/graph-db-detector.js +38 -0
- package/dist/engine/detectors/graph-db-detector.js.map +1 -0
- package/dist/engine/detectors/newsql-db-detector.d.ts +3 -0
- package/dist/engine/detectors/newsql-db-detector.d.ts.map +1 -0
- package/dist/engine/detectors/newsql-db-detector.js +40 -0
- package/dist/engine/detectors/newsql-db-detector.js.map +1 -0
- package/dist/engine/detectors/search-engine-detector.d.ts +3 -0
- package/dist/engine/detectors/search-engine-detector.d.ts.map +1 -0
- package/dist/engine/detectors/search-engine-detector.js +51 -0
- package/dist/engine/detectors/search-engine-detector.js.map +1 -0
- package/dist/engine/detectors/timeseries-db-detector.d.ts +3 -0
- package/dist/engine/detectors/timeseries-db-detector.d.ts.map +1 -0
- package/dist/engine/detectors/timeseries-db-detector.js +31 -0
- package/dist/engine/detectors/timeseries-db-detector.js.map +1 -0
- package/dist/engine/detectors/vector-db-detector.d.ts +5 -0
- package/dist/engine/detectors/vector-db-detector.d.ts.map +1 -0
- package/dist/engine/detectors/vector-db-detector.js +34 -0
- package/dist/engine/detectors/vector-db-detector.js.map +1 -0
- package/dist/engine/detectors/widecolumn-db-detector.d.ts +3 -0
- package/dist/engine/detectors/widecolumn-db-detector.d.ts.map +1 -0
- package/dist/engine/detectors/widecolumn-db-detector.js +38 -0
- package/dist/engine/detectors/widecolumn-db-detector.js.map +1 -0
- package/dist/engine/framework-detector.d.ts.map +1 -1
- package/dist/engine/framework-detector.js +44 -1
- package/dist/engine/framework-detector.js.map +1 -1
- package/dist/engine/migration/db-migrator.d.ts.map +1 -1
- package/dist/engine/migration/db-migrator.js +18 -3
- package/dist/engine/migration/db-migrator.js.map +1 -1
- package/dist/tools/design-schema/advanced-db-schemas.d.ts +8 -0
- package/dist/tools/design-schema/advanced-db-schemas.d.ts.map +1 -0
- package/dist/tools/design-schema/advanced-db-schemas.js +105 -0
- package/dist/tools/design-schema/advanced-db-schemas.js.map +1 -0
- package/dist/tools/design-schema/index.d.ts +2 -0
- package/dist/tools/design-schema/index.d.ts.map +1 -1
- package/dist/tools/design-schema/index.js +3 -0
- package/dist/tools/design-schema/index.js.map +1 -1
- package/dist/tools/design-schema/nosql-category-schemas.d.ts +10 -0
- package/dist/tools/design-schema/nosql-category-schemas.d.ts.map +1 -0
- package/dist/tools/design-schema/nosql-category-schemas.js +120 -0
- package/dist/tools/design-schema/nosql-category-schemas.js.map +1 -0
- package/dist/tools/design-schema.d.ts.map +1 -1
- package/dist/tools/design-schema.js +41 -1
- package/dist/tools/design-schema.js.map +1 -1
- package/dist/tools/generate-tests/generators/database-test-generator.d.ts +11 -0
- package/dist/tools/generate-tests/generators/database-test-generator.d.ts.map +1 -0
- package/dist/tools/generate-tests/generators/database-test-generator.js +329 -0
- package/dist/tools/generate-tests/generators/database-test-generator.js.map +1 -0
- package/dist/tools/generate-tests/generators/microservices-test-generator.d.ts +10 -0
- package/dist/tools/generate-tests/generators/microservices-test-generator.d.ts.map +1 -0
- package/dist/tools/generate-tests/generators/microservices-test-generator.js +341 -0
- package/dist/tools/generate-tests/generators/microservices-test-generator.js.map +1 -0
- package/dist/tools/generate-tests/generators/security-test-generator.d.ts +11 -0
- package/dist/tools/generate-tests/generators/security-test-generator.d.ts.map +1 -0
- package/dist/tools/generate-tests/generators/security-test-generator.js +318 -0
- package/dist/tools/generate-tests/generators/security-test-generator.js.map +1 -0
- package/dist/tools/generate-tests/spec-dispatcher.d.ts.map +1 -1
- package/dist/tools/generate-tests/spec-dispatcher.js +21 -0
- package/dist/tools/generate-tests/spec-dispatcher.js.map +1 -1
- package/dist/tools/schemas/lifecycle.d.ts +1 -1
- package/dist/types/common/tech-enums.d.ts +11 -1
- package/dist/types/common/tech-enums.d.ts.map +1 -1
- package/dist/types/project/core.d.ts +9 -1
- package/dist/types/project/core.d.ts.map +1 -1
- package/dist/types/schema.d.ts +5 -0
- package/dist/types/schema.d.ts.map +1 -1
- package/dist/types/tooling/database.d.ts +7 -0
- package/dist/types/tooling/database.d.ts.map +1 -1
- package/dist/types/tooling/database.js +0 -1
- package/dist/types/tooling/database.js.map +1 -1
- package/package.json +1 -1
- package/src/config/db-engines.json +394 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProjectKnowledge } from '../../types/index.js';
|
|
2
|
+
export declare function isCacheSchema(knowledge: ProjectKnowledge): boolean;
|
|
3
|
+
export declare function generateCacheSchema(entityNames: string[], knowledge: ProjectKnowledge): string;
|
|
4
|
+
export declare function isSearchSchema(knowledge: ProjectKnowledge): boolean;
|
|
5
|
+
export declare function generateSearchSchema(entityNames: string[], knowledge: ProjectKnowledge): string;
|
|
6
|
+
export declare function isTimeseriesSchema(knowledge: ProjectKnowledge): boolean;
|
|
7
|
+
export declare function generateTimeseriesSchema(entityNames: string[], knowledge: ProjectKnowledge): string;
|
|
8
|
+
export declare function isVectorSchema(knowledge: ProjectKnowledge): boolean;
|
|
9
|
+
export declare function generateVectorSchema(entityNames: string[], knowledge: ProjectKnowledge): string;
|
|
10
|
+
//# sourceMappingURL=nosql-category-schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nosql-category-schemas.d.ts","sourceRoot":"","sources":["../../../src/tools/design-schema/nosql-category-schemas.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAI7D,wBAAgB,aAAa,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAElE;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAqC9F;AAID,wBAAgB,cAAc,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAEnE;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAgD/F;AAID,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAEvE;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EAAE,EACrB,SAAS,EAAE,gBAAgB,GAC1B,MAAM,CAqER;AAID,wBAAgB,cAAc,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAKnE;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAsE/F"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// tools/design-schema/nosql-category-schemas.ts — Schema generators for NoSQL categories (SPEC-059)
|
|
2
|
+
// Covers: Cache (B.3), Search (C.3), Time-Series (D.2), Vector (F.3)
|
|
3
|
+
// === Cache Schema (B.3) ===
|
|
4
|
+
export function isCacheSchema(knowledge) {
|
|
5
|
+
return knowledge.cacheEngine !== undefined && knowledge.cacheEngine !== null;
|
|
6
|
+
}
|
|
7
|
+
export function generateCacheSchema(entityNames, knowledge) {
|
|
8
|
+
const engine = knowledge.cacheEngine ?? 'redis';
|
|
9
|
+
const prefix = entityNames[0]?.toLowerCase() ?? 'app';
|
|
10
|
+
const lines = [
|
|
11
|
+
`## Cache Schema Design — ${engine.toUpperCase()}`,
|
|
12
|
+
'',
|
|
13
|
+
'### Key Naming Conventions',
|
|
14
|
+
`- Pattern: \`${prefix}:{entity}:{id}\``,
|
|
15
|
+
...entityNames.map((e) => `- \`${prefix}:${e.toLowerCase()}:{id}\` → single record`),
|
|
16
|
+
...entityNames.map((e) => `- \`${prefix}:${e.toLowerCase()}:list\` → collection cache`),
|
|
17
|
+
'',
|
|
18
|
+
'### TTL Policies',
|
|
19
|
+
'| Key Pattern | TTL | Rationale |',
|
|
20
|
+
'|-------------|-----|-----------|',
|
|
21
|
+
...entityNames.map((e) => `| \`${prefix}:${e.toLowerCase()}:*\` | 3600s | Standard entity cache |`),
|
|
22
|
+
`| \`${prefix}:session:*\` | 86400s | User session data |`,
|
|
23
|
+
'',
|
|
24
|
+
'### Data Structure Selection',
|
|
25
|
+
'| Use Case | Structure | Command |',
|
|
26
|
+
'|----------|-----------|---------|',
|
|
27
|
+
'| Single record | STRING (JSON) | GET/SET |',
|
|
28
|
+
'| Entity fields | HASH | HGET/HSET |',
|
|
29
|
+
'| Sorted lists | SORTED SET | ZADD/ZRANGE |',
|
|
30
|
+
'| Event log | STREAM | XADD/XREAD |',
|
|
31
|
+
'| Unique items | SET | SADD/SMEMBERS |',
|
|
32
|
+
'',
|
|
33
|
+
'### Eviction Strategy',
|
|
34
|
+
`- Recommended: \`allkeys-lru\` (evict least recently used when memory full)`,
|
|
35
|
+
'- Max memory: set via `maxmemory` directive',
|
|
36
|
+
'',
|
|
37
|
+
'### Serialization Format',
|
|
38
|
+
'- JSON for complex objects (human-readable, cross-language)',
|
|
39
|
+
'- MessagePack for high-throughput (compact binary, faster)',
|
|
40
|
+
];
|
|
41
|
+
return lines.join('\n');
|
|
42
|
+
}
|
|
43
|
+
// === Search Schema (C.3) ===
|
|
44
|
+
export function isSearchSchema(knowledge) {
|
|
45
|
+
return knowledge.searchEngine !== undefined && knowledge.searchEngine !== null;
|
|
46
|
+
}
|
|
47
|
+
export function generateSearchSchema(entityNames, knowledge) {
|
|
48
|
+
const engine = knowledge.searchEngine ?? 'elasticsearch';
|
|
49
|
+
const isElastic = engine === 'elasticsearch' || engine === 'opensearch';
|
|
50
|
+
const lines = [`## Search Engine Schema Design — ${engine}`, '', '### Index Mappings'];
|
|
51
|
+
for (const entity of entityNames) {
|
|
52
|
+
const idx = entity.toLowerCase();
|
|
53
|
+
if (isElastic) {
|
|
54
|
+
lines.push(`\n#### Index: \`${idx}\``, '```json', '{', ` "mappings": {`, ` "properties": {`, ` "id": { "type": "keyword" },`, ` "name": { "type": "text", "analyzer": "standard" },`, ` "description": { "type": "text", "analyzer": "standard" },`, ` "status": { "type": "keyword" },`, ` "created_at": { "type": "date" },`, ` "updated_at": { "type": "date" }`, ` }`, ` }`, '}', '```');
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
lines.push(`\n#### Index: \`${idx}\``, '- Searchable: `name`, `description`', '- Filterable: `id`, `status`, `created_at`', '- Sortable: `created_at`, `updated_at`');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
lines.push('', '### Search Settings', '- Synonyms: define domain-specific synonym groups', '- Stop words: use default language stop words', '- Ranking rules: relevance → date → exact match', '', '### Reindex Strategy', '- Zero-downtime: create new index → bulk index → alias swap', '- Incremental: use change streams / CDC for real-time sync', '- Full rebuild: schedule during low-traffic windows');
|
|
61
|
+
return lines.join('\n');
|
|
62
|
+
}
|
|
63
|
+
// === Time-Series Schema (D.2) ===
|
|
64
|
+
export function isTimeseriesSchema(knowledge) {
|
|
65
|
+
return knowledge.timeseriesDb !== undefined && knowledge.timeseriesDb !== null;
|
|
66
|
+
}
|
|
67
|
+
export function generateTimeseriesSchema(entityNames, knowledge) {
|
|
68
|
+
const engine = knowledge.timeseriesDb ?? 'influxdb';
|
|
69
|
+
const isInflux = engine === 'influxdb';
|
|
70
|
+
const isTimescale = engine === 'timescaledb';
|
|
71
|
+
const lines = [`## Time-Series Schema Design — ${engine}`, ''];
|
|
72
|
+
if (isInflux) {
|
|
73
|
+
lines.push('### Measurements');
|
|
74
|
+
for (const entity of entityNames) {
|
|
75
|
+
lines.push(`\n#### Measurement: \`${entity.toLowerCase()}_metrics\``, '| Column | Type | Role |', '|--------|------|------|', '| time | timestamp | Primary index |', `| ${entity.toLowerCase()}_id | tag | Indexed dimension |`, '| region | tag | Indexed dimension |', '| value | field (float) | Metric value |', '| count | field (integer) | Event count |');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else if (isTimescale) {
|
|
79
|
+
lines.push('### Hypertables');
|
|
80
|
+
for (const entity of entityNames) {
|
|
81
|
+
const tbl = entity.toLowerCase();
|
|
82
|
+
lines.push(`\n#### Hypertable: \`${tbl}_events\``, '```sql', `CREATE TABLE ${tbl}_events (`, ` time TIMESTAMPTZ NOT NULL,`, ` ${tbl}_id UUID NOT NULL,`, ` metric_name TEXT NOT NULL,`, ` value DOUBLE PRECISION,`, ` metadata JSONB`, ');', `SELECT create_hypertable('${tbl}_events', 'time');`, '```');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
lines.push('### Tables');
|
|
87
|
+
for (const entity of entityNames) {
|
|
88
|
+
lines.push(`\n#### Table: \`${entity.toLowerCase()}_events\``, '- Timestamp column: `time` (designated timestamp)', `- Symbol columns: \`${entity.toLowerCase()}_id\`, \`region\``, '- Value columns: `value` (double), `count` (long)');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
lines.push('', '### Retention Policies', '| Data Tier | Retention | Resolution |', '|-----------|-----------|------------|', '| Hot | 7 days | Raw (1s) |', '| Warm | 30 days | 1-minute aggregates |', '| Cold | 1 year | 1-hour aggregates |', '', '### Continuous Aggregates', '- 1-minute rollups: avg, min, max, count per metric', '- 1-hour rollups: avg, p50, p95, p99 per metric', '- Daily summaries: total count, avg value per entity', '', '### Downsampling Strategy', '- Automatic: scheduled jobs move raw → aggregated after retention window', '- Manual: run backfill queries for historical data migration');
|
|
92
|
+
return lines.join('\n');
|
|
93
|
+
}
|
|
94
|
+
// === Vector Schema (F.3) ===
|
|
95
|
+
export function isVectorSchema(knowledge) {
|
|
96
|
+
return ((knowledge.vectorDb !== undefined && knowledge.vectorDb !== null) ||
|
|
97
|
+
knowledge.hasVectorExtension === true);
|
|
98
|
+
}
|
|
99
|
+
export function generateVectorSchema(entityNames, knowledge) {
|
|
100
|
+
const engine = knowledge.vectorDb ?? (knowledge.hasVectorExtension ? 'pgvector' : 'pinecone');
|
|
101
|
+
const isPgvector = engine === 'pgvector';
|
|
102
|
+
const lines = [`## Vector Database Schema Design — ${engine}`, ''];
|
|
103
|
+
if (isPgvector) {
|
|
104
|
+
lines.push('### pgvector Extension Tables');
|
|
105
|
+
for (const entity of entityNames) {
|
|
106
|
+
const tbl = entity.toLowerCase();
|
|
107
|
+
lines.push(`\n#### Table: \`${tbl}_embeddings\``, '```sql', `CREATE TABLE ${tbl}_embeddings (`, ` id UUID PRIMARY KEY DEFAULT gen_random_uuid(),`, ` ${tbl}_id UUID NOT NULL REFERENCES ${tbl}s(id),`, ` embedding vector(1536), -- OpenAI ada-002 dimensions`, ` metadata JSONB,`, ` created_at TIMESTAMPTZ DEFAULT now()`, ');', `CREATE INDEX ON ${tbl}_embeddings USING hnsw (embedding vector_cosine_ops);`, '```');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
lines.push('### Collections');
|
|
112
|
+
for (const entity of entityNames) {
|
|
113
|
+
const col = entity.toLowerCase();
|
|
114
|
+
lines.push(`\n#### Collection: \`${col}_vectors\``, '```json', '{', ` "name": "${col}_vectors",`, ` "dimension": 1536,`, ` "metric": "cosine",`, ` "metadata_schema": {`, ` "${col}_id": "string",`, ` "category": "string",`, ` "created_at": "datetime"`, ` }`, '}', '```');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
lines.push('', '### Index Configuration', '| Parameter | Value | Rationale |', '|-----------|-------|-----------|', '| Index type | HNSW | Best recall/speed tradeoff |', '| ef_construction | 200 | Higher = better recall, slower build |', '| M | 16 | Connections per layer |', '| ef_search | 100 | Query-time accuracy |', '', '### Metadata Fields', '- `source_id`: reference to source record', '- `chunk_index`: position in chunked document', '- `model`: embedding model identifier', '- `version`: embedding model version for re-embedding tracking', '', '### Embedding Model Reference', '| Model | Dimensions | Use Case |', '|-------|------------|----------|', '| text-embedding-ada-002 | 1536 | General purpose (OpenAI) |', '| text-embedding-3-small | 1536 | Cost-effective (OpenAI) |', '| all-MiniLM-L6-v2 | 384 | Open-source, fast |', '| voyage-large-2 | 1024 | Code & technical docs |');
|
|
118
|
+
return lines.join('\n');
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=nosql-category-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nosql-category-schemas.js","sourceRoot":"","sources":["../../../src/tools/design-schema/nosql-category-schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-schema.d.ts","sourceRoot":"","sources":["../../src/tools/design-schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,iBAAiB,EAGjB,cAAc,EACd,UAAU,
|
|
1
|
+
{"version":3,"file":"design-schema.d.ts","sourceRoot":"","sources":["../../src/tools/design-schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,iBAAiB,EAGjB,cAAc,EACd,UAAU,EAIX,MAAM,mBAAmB,CAAC;AAuC3B,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CA2NrF;AAuED,YAAY,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -6,7 +6,7 @@ import { specStore, knowledgeStore } from '../storage/index.js';
|
|
|
6
6
|
import { t, ti } from '../i18n/index.js';
|
|
7
7
|
import { isMobileSchema, generateMobileSchema } from './design-schema-mobile.js';
|
|
8
8
|
import { isGameSchema, generateGameSchema } from './design-schema-games.js';
|
|
9
|
-
import { extractEntities, injectPrivacyAuditFields, isMcpSchema, generateMcpSchema, isSmartContractSchema, isMLSchema, isDbtSchema, generateSmartContractSchema, generateMLSchema, generateDbtSchema, } from './design-schema/index.js';
|
|
9
|
+
import { extractEntities, injectPrivacyAuditFields, isMcpSchema, generateMcpSchema, isSmartContractSchema, isMLSchema, isDbtSchema, generateSmartContractSchema, generateMLSchema, generateDbtSchema, isCacheSchema, generateCacheSchema, isSearchSchema, generateSearchSchema, isTimeseriesSchema, generateTimeseriesSchema, isVectorSchema, generateVectorSchema, isGraphSchema, generateGraphSchema, isWideColumnSchema, generateWideColumnSchema, isCloudManagedSchema, generateCloudManagedSchema, } from './design-schema/index.js';
|
|
10
10
|
import { generateTables, generateIndexes, generateRLSPolicies, generateMigrations, buildRelationships, buildDataIntegrityRules, } from './design-schema-sql.js';
|
|
11
11
|
import { detectPIIInSpec } from '../engine/pii-detector.js';
|
|
12
12
|
export async function handleDesignSchema(args) {
|
|
@@ -156,6 +156,11 @@ export async function handleDesignSchema(args) {
|
|
|
156
156
|
],
|
|
157
157
|
};
|
|
158
158
|
}
|
|
159
|
+
// SPEC-059: Specialized DB category schemas
|
|
160
|
+
const specializedResult = trySpecializedDbSchema(entities, knowledge);
|
|
161
|
+
if (specializedResult) {
|
|
162
|
+
return specializedResult;
|
|
163
|
+
}
|
|
159
164
|
const tables = generateTables(entities, dbEngine);
|
|
160
165
|
// SPEC-030: Inject privacy audit fields for entities with PII context
|
|
161
166
|
const piiResult = detectPIIInSpec(spec.title, specContent, specContent);
|
|
@@ -192,6 +197,41 @@ export async function handleDesignSchema(args) {
|
|
|
192
197
|
],
|
|
193
198
|
};
|
|
194
199
|
}
|
|
200
|
+
// -- SPEC-059: Specialized DB schema dispatch ---------------------------------
|
|
201
|
+
const SPECIALIZED_DB_CHECKS = [
|
|
202
|
+
{ detect: isCacheSchema, generate: generateCacheSchema },
|
|
203
|
+
{ detect: isSearchSchema, generate: generateSearchSchema },
|
|
204
|
+
{ detect: isTimeseriesSchema, generate: generateTimeseriesSchema },
|
|
205
|
+
{ detect: isVectorSchema, generate: generateVectorSchema },
|
|
206
|
+
{ detect: isGraphSchema, generate: generateGraphSchema },
|
|
207
|
+
{ detect: isWideColumnSchema, generate: generateWideColumnSchema },
|
|
208
|
+
{ detect: isCloudManagedSchema, generate: generateCloudManagedSchema },
|
|
209
|
+
];
|
|
210
|
+
function trySpecializedDbSchema(entities, knowledge) {
|
|
211
|
+
for (const check of SPECIALIZED_DB_CHECKS) {
|
|
212
|
+
/* v8 ignore next 1 -- specialized DB schemas tested in nosql-category-schemas.test.ts + advanced-db-schemas.test.ts */
|
|
213
|
+
if (check.detect(knowledge)) {
|
|
214
|
+
/* v8 ignore start */
|
|
215
|
+
return {
|
|
216
|
+
content: [
|
|
217
|
+
{
|
|
218
|
+
type: 'text',
|
|
219
|
+
text: ti('tools.design_schema.success', {
|
|
220
|
+
tableCount: String(entities.length),
|
|
221
|
+
indexCount: '0',
|
|
222
|
+
}),
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
type: 'text',
|
|
226
|
+
text: check.generate(entities.map((e) => e.name), knowledge),
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
};
|
|
230
|
+
/* v8 ignore stop */
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
195
235
|
// -- I/O helpers --------------------------------------------------------------
|
|
196
236
|
async function readSpecContent(spec, additionalDescription) {
|
|
197
237
|
let content = `${spec.title} ${spec.type} ${spec.scope} ${spec.target}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-schema.js","sourceRoot":"","sources":["../../src/tools/design-schema.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,wEAAwE;AACxE,gEAAgE;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"design-schema.js","sourceRoot":"","sources":["../../src/tools/design-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TestDefinition, TestFile, ProjectKnowledge } from '../../../types/index.js';
|
|
2
|
+
export declare function detectCaching(knowledge: ProjectKnowledge): string | null;
|
|
3
|
+
export declare function detectSearchEngine(knowledge: ProjectKnowledge): string | null;
|
|
4
|
+
export declare function hasOrm(knowledge: ProjectKnowledge): boolean;
|
|
5
|
+
export declare function isDatabaseTestProject(knowledge: ProjectKnowledge): boolean;
|
|
6
|
+
export declare function generateDatabaseTestDefs(title: string, testDir: string, _testExt: string, knowledge: ProjectKnowledge): TestDefinition[];
|
|
7
|
+
export declare function generateDatabaseTestFiles(spec: {
|
|
8
|
+
title: string;
|
|
9
|
+
slug: string;
|
|
10
|
+
}, testDir: string, framework: string, language: string, testExt: string, autoGenerate: boolean, knowledge: ProjectKnowledge): TestFile[];
|
|
11
|
+
//# sourceMappingURL=database-test-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-test-generator.d.ts","sourceRoot":"","sources":["../../../../src/tools/generate-tests/generators/database-test-generator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAY1F,wBAAgB,aAAa,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAQxE;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAQ7E;AAED,wBAAgB,MAAM,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAE3D;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAE1E;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,gBAAgB,GAC1B,cAAc,EAAE,CAwDlB;AAkPD,wBAAgB,yBAAyB,CACvC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACrC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,OAAO,EACrB,SAAS,EAAE,gBAAgB,GAC1B,QAAQ,EAAE,CAoBZ"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
// tools/generate-tests/generators/database-test-generator.ts — SPEC-058b Section F
|
|
2
|
+
// Generates database & data layer test scaffolds:
|
|
3
|
+
// migrations, repository/DAO CRUD, caching, full-text search.
|
|
4
|
+
const CACHE_SIGNALS = ['redis', 'memcached', 'node-cache', 'caffeine', 'ehcache', 'valkey'];
|
|
5
|
+
const SEARCH_SIGNALS = [
|
|
6
|
+
'elasticsearch',
|
|
7
|
+
'meilisearch',
|
|
8
|
+
'algolia',
|
|
9
|
+
'opensearch',
|
|
10
|
+
'solr',
|
|
11
|
+
'typesense',
|
|
12
|
+
];
|
|
13
|
+
export function detectCaching(knowledge) {
|
|
14
|
+
const stackLower = knowledge.stack.map((s) => s.toLowerCase());
|
|
15
|
+
for (const sig of CACHE_SIGNALS) {
|
|
16
|
+
if (stackLower.some((s) => s.includes(sig))) {
|
|
17
|
+
return sig;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
export function detectSearchEngine(knowledge) {
|
|
23
|
+
const stackLower = knowledge.stack.map((s) => s.toLowerCase());
|
|
24
|
+
for (const sig of SEARCH_SIGNALS) {
|
|
25
|
+
if (stackLower.some((s) => s.includes(sig))) {
|
|
26
|
+
return sig;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
export function hasOrm(knowledge) {
|
|
32
|
+
return knowledge.orm !== null && knowledge.orm !== 'unknown';
|
|
33
|
+
}
|
|
34
|
+
export function isDatabaseTestProject(knowledge) {
|
|
35
|
+
return knowledge.database !== 'unknown';
|
|
36
|
+
}
|
|
37
|
+
export function generateDatabaseTestDefs(title, testDir, _testExt, knowledge) {
|
|
38
|
+
const defs = [
|
|
39
|
+
{
|
|
40
|
+
name: `${title} — migration: schema up/down and rollback safety`,
|
|
41
|
+
type: 'integration',
|
|
42
|
+
file: `${testDir}/database/`,
|
|
43
|
+
description: 'Verify schema migrations run up/down cleanly and preserve data integrity',
|
|
44
|
+
priority: 'critical',
|
|
45
|
+
automatable: true,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: `${title} — repository: CRUD operations on ${knowledge.database}`,
|
|
49
|
+
type: 'integration',
|
|
50
|
+
file: `${testDir}/database/`,
|
|
51
|
+
description: 'Verify create, read, update, delete operations on the data layer',
|
|
52
|
+
priority: 'high',
|
|
53
|
+
automatable: true,
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
if (hasOrm(knowledge)) {
|
|
57
|
+
defs.push({
|
|
58
|
+
name: `${title} — transactions and optimistic locking`,
|
|
59
|
+
type: 'integration',
|
|
60
|
+
file: `${testDir}/database/`,
|
|
61
|
+
description: 'Verify transaction commit/rollback and optimistic locking conflict detection',
|
|
62
|
+
priority: 'high',
|
|
63
|
+
automatable: true,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const cache = detectCaching(knowledge);
|
|
67
|
+
if (cache !== null) {
|
|
68
|
+
defs.push({
|
|
69
|
+
name: `${title} — caching (${cache}): hit/miss, TTL, invalidation`,
|
|
70
|
+
type: 'integration',
|
|
71
|
+
file: `${testDir}/database/`,
|
|
72
|
+
description: 'Verify cache hit/miss behavior, TTL expiration, and invalidation patterns',
|
|
73
|
+
priority: 'high',
|
|
74
|
+
automatable: true,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const search = detectSearchEngine(knowledge);
|
|
78
|
+
if (search !== null) {
|
|
79
|
+
defs.push({
|
|
80
|
+
name: `${title} — full-text search (${search}): indexing and query relevance`,
|
|
81
|
+
type: 'integration',
|
|
82
|
+
file: `${testDir}/database/`,
|
|
83
|
+
description: 'Verify document indexing, query relevance ranking, and fuzzy matching',
|
|
84
|
+
priority: 'medium',
|
|
85
|
+
automatable: true,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return defs;
|
|
89
|
+
}
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// Scaffold builders
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
function buildTsDatabaseTest(title, db, orm, cache, search) {
|
|
94
|
+
const cacheSection = cache
|
|
95
|
+
? `
|
|
96
|
+
describe('Caching (${cache})', () => {
|
|
97
|
+
it('returns cached value on cache hit', async () => {
|
|
98
|
+
// await cache.set('user:1', { name: 'Test' }, { ttl: 60 });
|
|
99
|
+
// const result = await cache.get('user:1');
|
|
100
|
+
// expect(result).toMatchObject({ name: 'Test' });
|
|
101
|
+
expect(true).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('returns null on cache miss', async () => {
|
|
105
|
+
expect(true).toBe(true);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('expires entry after TTL', async () => {
|
|
109
|
+
expect(true).toBe(true);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('invalidates cache on data update', async () => {
|
|
113
|
+
expect(true).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
`
|
|
117
|
+
: '';
|
|
118
|
+
const searchSection = search
|
|
119
|
+
? `
|
|
120
|
+
describe('Full-text search (${search})', () => {
|
|
121
|
+
it('indexes document and makes it searchable', async () => {
|
|
122
|
+
// await searchClient.index('products').addDocuments([{ id: 1, name: 'Widget' }]);
|
|
123
|
+
// const results = await searchClient.index('products').search('Widget');
|
|
124
|
+
// expect(results.hits).toHaveLength(1);
|
|
125
|
+
expect(true).toBe(true);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('returns relevant results ranked by score', async () => {
|
|
129
|
+
expect(true).toBe(true);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('supports fuzzy matching for typos', async () => {
|
|
133
|
+
expect(true).toBe(true);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
`
|
|
137
|
+
: '';
|
|
138
|
+
const ormSection = orm
|
|
139
|
+
? `
|
|
140
|
+
describe('Transactions and locking', () => {
|
|
141
|
+
it('commits transaction on success', async () => {
|
|
142
|
+
expect(true).toBe(true);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('rolls back transaction on error', async () => {
|
|
146
|
+
expect(true).toBe(true);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it('detects optimistic locking conflict', async () => {
|
|
150
|
+
// Concurrent update with stale version → should throw
|
|
151
|
+
expect(true).toBe(true);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
`
|
|
155
|
+
: '';
|
|
156
|
+
return `// Database & Data Layer tests for: ${title}
|
|
157
|
+
// Generated by SpecForge SDD MCP Server (SPEC-058b)
|
|
158
|
+
import { describe, it, expect } from 'vitest';
|
|
159
|
+
|
|
160
|
+
describe('${title} — Database Tests (${db})', () => {
|
|
161
|
+
describe('Migrations', () => {
|
|
162
|
+
it('schema migration up applies cleanly', async () => {
|
|
163
|
+
// await migrate.up();
|
|
164
|
+
// const tables = await db.query("SELECT name FROM sqlite_master WHERE type='table'");
|
|
165
|
+
// expect(tables).toContainEqual({ name: 'users' });
|
|
166
|
+
expect(true).toBe(true); // Replace with real migration assertion
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('schema migration down reverts cleanly', async () => {
|
|
170
|
+
expect(true).toBe(true);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it('data integrity preserved after migration', async () => {
|
|
174
|
+
expect(true).toBe(true);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('rollback does not lose existing data', async () => {
|
|
178
|
+
expect(true).toBe(true);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
describe('Repository / DAO — CRUD', () => {
|
|
183
|
+
it('creates a record and returns its id', async () => {
|
|
184
|
+
// const user = await repo.create({ name: 'Test', email: 'test@example.com' });
|
|
185
|
+
// expect(user.id).toBeDefined();
|
|
186
|
+
expect(true).toBe(true);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it('reads a record by id', async () => {
|
|
190
|
+
expect(true).toBe(true);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('updates a record', async () => {
|
|
194
|
+
expect(true).toBe(true);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it('deletes a record', async () => {
|
|
198
|
+
expect(true).toBe(true);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it('returns null for non-existent record', async () => {
|
|
202
|
+
expect(true).toBe(true);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
${ormSection}${cacheSection}${searchSection}});
|
|
206
|
+
`;
|
|
207
|
+
}
|
|
208
|
+
function buildPythonDatabaseTest(title, db, orm, cache, search) {
|
|
209
|
+
const cls = title.replace(/[^a-zA-Z0-9]/g, '');
|
|
210
|
+
const ormSection = orm
|
|
211
|
+
? `
|
|
212
|
+
def test_transaction_commits_on_success(self) -> None:
|
|
213
|
+
"""Transaction commits all changes on success."""
|
|
214
|
+
pass
|
|
215
|
+
|
|
216
|
+
def test_transaction_rolls_back_on_error(self) -> None:
|
|
217
|
+
"""Transaction rolls back on exception."""
|
|
218
|
+
pass
|
|
219
|
+
|
|
220
|
+
def test_optimistic_locking_conflict(self) -> None:
|
|
221
|
+
"""Concurrent update with stale version raises conflict."""
|
|
222
|
+
pass
|
|
223
|
+
`
|
|
224
|
+
: '';
|
|
225
|
+
const cacheSection = cache
|
|
226
|
+
? `
|
|
227
|
+
def test_cache_hit_returns_value(self) -> None:
|
|
228
|
+
"""Cache returns stored value on hit."""
|
|
229
|
+
pass
|
|
230
|
+
|
|
231
|
+
def test_cache_miss_returns_none(self) -> None:
|
|
232
|
+
"""Cache returns None on miss."""
|
|
233
|
+
pass
|
|
234
|
+
|
|
235
|
+
def test_cache_ttl_expiration(self) -> None:
|
|
236
|
+
"""Cache entry expires after TTL."""
|
|
237
|
+
pass
|
|
238
|
+
|
|
239
|
+
def test_cache_invalidation_on_update(self) -> None:
|
|
240
|
+
"""Cache is invalidated when underlying data changes."""
|
|
241
|
+
pass
|
|
242
|
+
`
|
|
243
|
+
: '';
|
|
244
|
+
const searchSection = search
|
|
245
|
+
? `
|
|
246
|
+
def test_index_document_searchable(self) -> None:
|
|
247
|
+
"""Indexed document is returned by search query."""
|
|
248
|
+
pass
|
|
249
|
+
|
|
250
|
+
def test_query_relevance_ranking(self) -> None:
|
|
251
|
+
"""Results are ranked by relevance score."""
|
|
252
|
+
pass
|
|
253
|
+
|
|
254
|
+
def test_fuzzy_matching_for_typos(self) -> None:
|
|
255
|
+
"""Fuzzy search finds results despite typos."""
|
|
256
|
+
pass
|
|
257
|
+
`
|
|
258
|
+
: '';
|
|
259
|
+
return `"""Database & Data Layer tests for: ${title}
|
|
260
|
+
Generated by SpecForge SDD MCP Server (SPEC-058b).
|
|
261
|
+
Database: ${db}
|
|
262
|
+
"""
|
|
263
|
+
import pytest
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
class Test${cls}Database:
|
|
267
|
+
"""Database test suite for ${title} (${db})."""
|
|
268
|
+
|
|
269
|
+
def test_migration_up_applies_cleanly(self) -> None:
|
|
270
|
+
"""Schema migration up creates expected tables."""
|
|
271
|
+
# TODO: result = alembic.command.upgrade(config, 'head')
|
|
272
|
+
pass
|
|
273
|
+
|
|
274
|
+
def test_migration_down_reverts_cleanly(self) -> None:
|
|
275
|
+
"""Schema migration down removes tables cleanly."""
|
|
276
|
+
pass
|
|
277
|
+
|
|
278
|
+
def test_data_integrity_after_migration(self) -> None:
|
|
279
|
+
"""Existing data is preserved after migration."""
|
|
280
|
+
pass
|
|
281
|
+
|
|
282
|
+
def test_rollback_safety(self) -> None:
|
|
283
|
+
"""Rollback does not lose existing data."""
|
|
284
|
+
pass
|
|
285
|
+
|
|
286
|
+
def test_create_record(self) -> None:
|
|
287
|
+
"""Creates a record and returns its id."""
|
|
288
|
+
# TODO: user = repo.create(name='Test', email='test@example.com')
|
|
289
|
+
# assert user.id is not None
|
|
290
|
+
pass
|
|
291
|
+
|
|
292
|
+
def test_read_record_by_id(self) -> None:
|
|
293
|
+
"""Reads a record by primary key."""
|
|
294
|
+
pass
|
|
295
|
+
|
|
296
|
+
def test_update_record(self) -> None:
|
|
297
|
+
"""Updates a record field."""
|
|
298
|
+
pass
|
|
299
|
+
|
|
300
|
+
def test_delete_record(self) -> None:
|
|
301
|
+
"""Deletes a record."""
|
|
302
|
+
pass
|
|
303
|
+
|
|
304
|
+
def test_read_nonexistent_returns_none(self) -> None:
|
|
305
|
+
"""Reading a non-existent record returns None."""
|
|
306
|
+
pass
|
|
307
|
+
${ormSection}${cacheSection}${searchSection}`;
|
|
308
|
+
}
|
|
309
|
+
export function generateDatabaseTestFiles(spec, testDir, framework, language, testExt, autoGenerate, knowledge) {
|
|
310
|
+
const cache = detectCaching(knowledge);
|
|
311
|
+
const search = detectSearchEngine(knowledge);
|
|
312
|
+
const orm = hasOrm(knowledge);
|
|
313
|
+
const db = knowledge.database;
|
|
314
|
+
const isPython = language === 'python';
|
|
315
|
+
const ext = isPython ? 'py' : testExt;
|
|
316
|
+
const fw = isPython ? 'pytest' : framework;
|
|
317
|
+
const content = isPython
|
|
318
|
+
? buildPythonDatabaseTest(spec.title, db, orm, cache, search)
|
|
319
|
+
: buildTsDatabaseTest(spec.title, db, orm, cache, search);
|
|
320
|
+
return [
|
|
321
|
+
{
|
|
322
|
+
path: `${testDir}/database/${spec.slug}.database.test.${ext}`,
|
|
323
|
+
framework: fw,
|
|
324
|
+
content,
|
|
325
|
+
ready: autoGenerate,
|
|
326
|
+
},
|
|
327
|
+
];
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=database-test-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-test-generator.js","sourceRoot":"","sources":["../../../../src/tools/generate-tests/generators/database-test-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TestDefinition, TestFile, ProjectKnowledge } from '../../../types/index.js';
|
|
2
|
+
export declare function detectBroker(knowledge: ProjectKnowledge): string | null;
|
|
3
|
+
export declare function detectServiceMesh(knowledge: ProjectKnowledge): string | null;
|
|
4
|
+
export declare function isMicroservicesTestProject(knowledge: ProjectKnowledge): boolean;
|
|
5
|
+
export declare function generateMicroservicesTestDefs(title: string, testDir: string, _testExt: string, knowledge: ProjectKnowledge): TestDefinition[];
|
|
6
|
+
export declare function generateMicroservicesTestFiles(spec: {
|
|
7
|
+
title: string;
|
|
8
|
+
slug: string;
|
|
9
|
+
}, testDir: string, framework: string, language: string, testExt: string, autoGenerate: boolean, knowledge: ProjectKnowledge): TestFile[];
|
|
10
|
+
//# sourceMappingURL=microservices-test-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microservices-test-generator.d.ts","sourceRoot":"","sources":["../../../../src/tools/generate-tests/generators/microservices-test-generator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAa1F,wBAAgB,YAAY,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAQvE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAQ5E;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAe/E;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,gBAAgB,GAC1B,cAAc,EAAE,CA+DlB;AA2OD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACrC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,OAAO,EACrB,SAAS,EAAE,gBAAgB,GAC1B,QAAQ,EAAE,CAkBZ"}
|