@sun-asterisk/sungen 3.2.6 → 3.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/cli/commands/delivery.d.ts.map +1 -1
  2. package/dist/cli/commands/delivery.js +7 -46
  3. package/dist/cli/commands/delivery.js.map +1 -1
  4. package/dist/dashboard/snapshot-builder.d.ts.map +1 -1
  5. package/dist/dashboard/snapshot-builder.js +28 -6
  6. package/dist/dashboard/snapshot-builder.js.map +1 -1
  7. package/dist/dashboard/templates/index.html +20 -20
  8. package/dist/dashboard/types.d.ts +18 -0
  9. package/dist/dashboard/types.d.ts.map +1 -1
  10. package/dist/exporters/api-catalog-loader.d.ts +18 -0
  11. package/dist/exporters/api-catalog-loader.d.ts.map +1 -0
  12. package/dist/exporters/api-catalog-loader.js +77 -0
  13. package/dist/exporters/api-catalog-loader.js.map +1 -0
  14. package/dist/exporters/json-exporter.d.ts +10 -1
  15. package/dist/exporters/json-exporter.d.ts.map +1 -1
  16. package/dist/exporters/json-exporter.js +34 -2
  17. package/dist/exporters/json-exporter.js.map +1 -1
  18. package/dist/exporters/playwright-report-parser.d.ts +14 -0
  19. package/dist/exporters/playwright-report-parser.d.ts.map +1 -1
  20. package/dist/exporters/playwright-report-parser.js +30 -0
  21. package/dist/exporters/playwright-report-parser.js.map +1 -1
  22. package/dist/exporters/xlsx-exporter.d.ts +18 -17
  23. package/dist/exporters/xlsx-exporter.d.ts.map +1 -1
  24. package/dist/exporters/xlsx-exporter.js +25 -595
  25. package/dist/exporters/xlsx-exporter.js.map +1 -1
  26. package/dist/exporters/xlsx-report-builder.d.ts +196 -0
  27. package/dist/exporters/xlsx-report-builder.d.ts.map +1 -0
  28. package/dist/exporters/xlsx-report-builder.js +653 -0
  29. package/dist/exporters/xlsx-report-builder.js.map +1 -0
  30. package/package.json +3 -3
  31. package/src/cli/commands/delivery.ts +8 -42
  32. package/src/dashboard/snapshot-builder.ts +31 -7
  33. package/src/dashboard/templates/index.html +20 -20
  34. package/src/dashboard/types.ts +19 -0
  35. package/src/exporters/api-catalog-loader.ts +44 -0
  36. package/src/exporters/json-exporter.ts +46 -4
  37. package/src/exporters/playwright-report-parser.ts +27 -0
  38. package/src/exporters/xlsx-exporter.ts +34 -658
  39. package/src/exporters/xlsx-report-builder.ts +806 -0
  40. package/dist/cli/types.d.ts +0 -9
  41. package/dist/cli/types.d.ts.map +0 -1
  42. package/dist/cli/types.js +0 -7
  43. package/dist/cli/types.js.map +0 -1
  44. package/dist/generators/gherkin-parser/selector-extractor.d.ts +0 -37
  45. package/dist/generators/gherkin-parser/selector-extractor.d.ts.map +0 -1
  46. package/dist/generators/gherkin-parser/selector-extractor.js +0 -108
  47. package/dist/generators/gherkin-parser/selector-extractor.js.map +0 -1
  48. package/dist/generators/test-generator/types.d.ts +0 -25
  49. package/dist/generators/test-generator/types.d.ts.map +0 -1
  50. package/dist/generators/test-generator/types.js +0 -7
  51. package/dist/generators/test-generator/types.js.map +0 -1
  52. package/dist/generators/types.d.ts +0 -119
  53. package/dist/generators/types.d.ts.map +0 -1
  54. package/dist/generators/types.js +0 -48
  55. package/dist/generators/types.js.map +0 -1
  56. package/dist/orchestrator/figma/node-path-collapser.d.ts +0 -16
  57. package/dist/orchestrator/figma/node-path-collapser.d.ts.map +0 -1
  58. package/dist/orchestrator/figma/node-path-collapser.js +0 -37
  59. package/dist/orchestrator/figma/node-path-collapser.js.map +0 -1
  60. package/src/cli/types.ts +0 -9
  61. package/src/generators/gherkin-parser/selector-extractor.ts +0 -142
  62. package/src/generators/test-generator/types.ts +0 -26
  63. package/src/generators/types.ts +0 -227
  64. package/src/orchestrator/figma/node-path-collapser.ts +0 -38
@@ -1,9 +0,0 @@
1
- /**
2
- * CLI Types
3
- * Future adapter interface for programmatic command execution (e.g., VSCode extension)
4
- */
5
- export interface CommandAdapter {
6
- name: string;
7
- execute(command: string, options: Record<string, any>): Promise<void>;
8
- }
9
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE"}
package/dist/cli/types.js DELETED
@@ -1,7 +0,0 @@
1
- "use strict";
2
- /**
3
- * CLI Types
4
- * Future adapter interface for programmatic command execution (e.g., VSCode extension)
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -1,37 +0,0 @@
1
- /**
2
- * Gherkin Selector Extractor
3
- * Scans Gherkin feature files and extracts all [screen.element] references
4
- */
5
- export interface ExtractedSelector {
6
- screenId: string;
7
- elementId: string;
8
- fullRef: string;
9
- occurrences: number;
10
- }
11
- export interface SelectorsByScreen {
12
- [screenId: string]: {
13
- [elementId: string]: {
14
- fullRef: string;
15
- occurrences: number;
16
- };
17
- };
18
- }
19
- export declare class GherkinSelectorExtractor {
20
- /**
21
- * Extract all selector references from Gherkin feature files
22
- */
23
- extractSelectors(featuresDir: string): SelectorsByScreen;
24
- /**
25
- * Extract selectors from feature file content
26
- */
27
- private extractSelectorsFromContent;
28
- /**
29
- * Generate base skeleton YAML structure
30
- */
31
- generateSkeletonYaml(screenId: string, selectors: SelectorsByScreen): string;
32
- /**
33
- * Write skeleton files for all screens
34
- */
35
- writeSkeletonFiles(selectors: SelectorsByScreen, outputDir: string): void;
36
- }
37
- //# sourceMappingURL=selector-extractor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selector-extractor.d.ts","sourceRoot":"","sources":["../../../src/generators/gherkin-parser/selector-extractor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,CAAC,QAAQ,EAAE,MAAM,GAAG;QAClB,CAAC,SAAS,EAAE,MAAM,GAAG;YACnB,OAAO,EAAE,MAAM,CAAC;YAChB,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC;KACH,CAAC;CACH;AAED,qBAAa,wBAAwB;IACnC;;OAEG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB;IAgCxD;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA0BnC;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,MAAM;IA+B5E;;OAEG;IACH,kBAAkB,CAChB,SAAS,EAAE,iBAAiB,EAC5B,SAAS,EAAE,MAAM,GAChB,IAAI;CAWR"}
@@ -1,108 +0,0 @@
1
- "use strict";
2
- /**
3
- * Gherkin Selector Extractor
4
- * Scans Gherkin feature files and extracts all [screen.element] references
5
- */
6
- var __importDefault = (this && this.__importDefault) || function (mod) {
7
- return (mod && mod.__esModule) ? mod : { "default": mod };
8
- };
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.GherkinSelectorExtractor = void 0;
11
- const fs_1 = __importDefault(require("fs"));
12
- const path_1 = __importDefault(require("path"));
13
- const glob_1 = require("glob");
14
- class GherkinSelectorExtractor {
15
- /**
16
- * Extract all selector references from Gherkin feature files
17
- */
18
- extractSelectors(featuresDir) {
19
- const featureFiles = glob_1.glob.sync('**/*.feature', {
20
- cwd: featuresDir,
21
- absolute: true,
22
- });
23
- const selectorsByScreen = {};
24
- for (const filePath of featureFiles) {
25
- const content = fs_1.default.readFileSync(filePath, 'utf-8');
26
- const selectors = this.extractSelectorsFromContent(content);
27
- // Merge into selectorsByScreen
28
- for (const selector of selectors) {
29
- if (!selectorsByScreen[selector.screenId]) {
30
- selectorsByScreen[selector.screenId] = {};
31
- }
32
- if (!selectorsByScreen[selector.screenId][selector.elementId]) {
33
- selectorsByScreen[selector.screenId][selector.elementId] = {
34
- fullRef: selector.fullRef,
35
- occurrences: 0,
36
- };
37
- }
38
- selectorsByScreen[selector.screenId][selector.elementId].occurrences++;
39
- }
40
- }
41
- return selectorsByScreen;
42
- }
43
- /**
44
- * Extract selectors from feature file content
45
- */
46
- extractSelectorsFromContent(content) {
47
- const selectors = [];
48
- // Regex to match [screen.element] or [screen]
49
- const selectorRegex = /\[([a-zA-Z0-9_-]+)(?:\.([a-zA-Z0-9_-]+))?\]/g;
50
- let match;
51
- while ((match = selectorRegex.exec(content)) !== null) {
52
- const fullRef = match[0]; // e.g., "[auth-login.email]"
53
- const screenId = match[1]; // e.g., "auth-login"
54
- const elementId = match[2]; // e.g., "email" (undefined for route-only refs)
55
- // Only include selectors with both screen and element (skip route-only refs)
56
- if (elementId) {
57
- selectors.push({
58
- screenId,
59
- elementId,
60
- fullRef,
61
- occurrences: 1,
62
- });
63
- }
64
- }
65
- return selectors;
66
- }
67
- /**
68
- * Generate base skeleton YAML structure
69
- */
70
- generateSkeletonYaml(screenId, selectors) {
71
- const screenSelectors = selectors[screenId];
72
- if (!screenSelectors) {
73
- return `# No selectors found for screen: ${screenId}\n`;
74
- }
75
- const lines = [
76
- `# Selector skeleton for screen: ${screenId}`,
77
- `# AI will fill in the selector values based on UI model`,
78
- `# This file is generated by scanning Gherkin feature files`,
79
- '',
80
- ];
81
- // Sort by element ID for consistency
82
- const sortedElementIds = Object.keys(screenSelectors).sort();
83
- for (const elementId of sortedElementIds) {
84
- const { fullRef, occurrences } = screenSelectors[elementId];
85
- lines.push(`"${fullRef}":`);
86
- lines.push(` selector: ""`);
87
- lines.push(` type: ""`);
88
- lines.push(` description: ""`);
89
- lines.push(` # Referenced ${occurrences} time(s) in Gherkin`);
90
- lines.push('');
91
- }
92
- return lines.join('\n');
93
- }
94
- /**
95
- * Write skeleton files for all screens
96
- */
97
- writeSkeletonFiles(selectors, outputDir) {
98
- // Ensure output directory exists
99
- fs_1.default.mkdirSync(outputDir, { recursive: true });
100
- for (const screenId of Object.keys(selectors)) {
101
- const skeletonContent = this.generateSkeletonYaml(screenId, selectors);
102
- const outputPath = path_1.default.join(outputDir, `${screenId}.skeleton.yaml`);
103
- fs_1.default.writeFileSync(outputPath, skeletonContent, 'utf-8');
104
- }
105
- }
106
- }
107
- exports.GherkinSelectorExtractor = GherkinSelectorExtractor;
108
- //# sourceMappingURL=selector-extractor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selector-extractor.js","sourceRoot":"","sources":["../../../src/generators/gherkin-parser/selector-extractor.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- /**
2
- * Test Generator Types
3
- * Core type definitions for the test generation compiler
4
- */
5
- /**
6
- * Generated Test Result
7
- */
8
- export interface GeneratedTest {
9
- featureName: string;
10
- filePath: string;
11
- code: string;
12
- sourceFile?: string;
13
- stepCount?: number;
14
- }
15
- /**
16
- * Generation Statistics
17
- */
18
- export interface GenerationStats {
19
- totalScenarios: number;
20
- totalSteps: number;
21
- dictionaryMatched: number;
22
- todoCount: number;
23
- generationTime: number;
24
- }
25
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/generators/test-generator/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB"}
@@ -1,7 +0,0 @@
1
- "use strict";
2
- /**
3
- * Test Generator Types
4
- * Core type definitions for the test generation compiler
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/generators/test-generator/types.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -1,119 +0,0 @@
1
- /**
2
- * Core types for Selector DSL Framework
3
- * Framework-agnostic types for multi-platform support
4
- */
5
- export interface UIElement {
6
- key: string;
7
- tag: string;
8
- role?: string;
9
- name?: string;
10
- id?: string;
11
- placeholder?: string;
12
- label?: string;
13
- text?: string;
14
- ariaLabel?: string;
15
- testId?: string;
16
- source: string;
17
- framework?: string;
18
- props?: Record<string, any>;
19
- }
20
- export interface UIModel {
21
- screenId: string;
22
- routeId: string;
23
- framework: FrameworkType;
24
- sourceFiles: string[];
25
- elements: UIElement[];
26
- metadata?: {
27
- scannedAt: string;
28
- version: string;
29
- hash: string;
30
- };
31
- }
32
- export type DiscoveryMethod = 'ai-static-analysis' | 'manual' | 'runtime';
33
- export type LocatorType = 'css' | 'xpath' | 'resource-id' | 'accessibility-id' | 'test-id' | 'key' | 'text' | 'role';
34
- export interface SelectorEntry {
35
- selector: string;
36
- type: string;
37
- description: string;
38
- discoveryMethod: DiscoveryMethod;
39
- locatorType?: LocatorType;
40
- confidence?: 'high' | 'medium' | 'low';
41
- alternatives?: string[];
42
- metadata?: {
43
- lastValidated?: string;
44
- validationStatus?: 'valid' | 'invalid' | 'unknown';
45
- };
46
- }
47
- export interface SelectorDSL {
48
- [elementId: string]: SelectorEntry;
49
- }
50
- export type FrameworkType = 'react' | 'react-nextjs' | 'vue' | 'angular' | 'html' | 'flutter' | 'jetpack-compose' | 'swiftui';
51
- export type TargetPlatform = 'web' | 'android' | 'ios' | 'desktop';
52
- export type ExecutorType = 'playwright' | 'puppeteer' | 'selenium' | 'appium-android' | 'appium-ios' | 'flutter-driver' | 'espresso' | 'xcuitest';
53
- export interface ExecutorConfig {
54
- type: ExecutorType;
55
- platform: TargetPlatform;
56
- selectorPath: string;
57
- overridePath?: string;
58
- }
59
- export interface CacheEntry {
60
- screenId: string;
61
- hash: string;
62
- selectors: SelectorDSL;
63
- metadata: {
64
- createdAt: string;
65
- aiModel?: string;
66
- tokenCost?: number;
67
- framework: FrameworkType;
68
- };
69
- }
70
- export interface GeneratorConfig {
71
- aiProvider: 'anthropic' | 'google' | 'openai';
72
- aiModel?: string;
73
- sourceRoot: string;
74
- uiModelPath: string;
75
- selectorPath: string;
76
- cachePath: string;
77
- framework: FrameworkType;
78
- enableCache: boolean;
79
- cacheExpiry?: number;
80
- parallelScans?: number;
81
- verbose?: boolean;
82
- }
83
- export interface DiscoverOptions {
84
- screenId?: string;
85
- all?: boolean;
86
- force?: boolean;
87
- }
88
- export interface GenerateOptions {
89
- screenId?: string;
90
- all?: boolean;
91
- force?: boolean;
92
- skipCache?: boolean;
93
- runtimeData?: boolean;
94
- }
95
- export interface ValidateOptions {
96
- screenId?: string;
97
- all?: boolean;
98
- executor?: ExecutorType;
99
- }
100
- export interface GherkinElementReference {
101
- elementId: string;
102
- screenId: string;
103
- elementName: string;
104
- }
105
- export declare function parseElementReference(ref: string): GherkinElementReference | null;
106
- export declare class SelectorNotFoundError extends Error {
107
- elementId: string;
108
- screenId: string;
109
- constructor(elementId: string, screenId: string);
110
- }
111
- export declare class UIModelNotFoundError extends Error {
112
- screenId: string;
113
- constructor(screenId: string);
114
- }
115
- export declare class GeneratorError extends Error {
116
- cause?: Error;
117
- constructor(message: string, cause?: Error);
118
- }
119
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/generators/types.ts"],"names":[],"mappings":"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"}
@@ -1,48 +0,0 @@
1
- "use strict";
2
- /**
3
- * Core types for Selector DSL Framework
4
- * Framework-agnostic types for multi-platform support
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.GeneratorError = exports.UIModelNotFoundError = exports.SelectorNotFoundError = void 0;
8
- exports.parseElementReference = parseElementReference;
9
- function parseElementReference(ref) {
10
- // Parse "[screen.element]" format
11
- const match = ref.match(/^\[([^.]+)\.([^\]]+)\]$/);
12
- if (!match)
13
- return null;
14
- return {
15
- elementId: ref,
16
- screenId: match[1],
17
- elementName: match[2]
18
- };
19
- }
20
- // ============================================================================
21
- // Error Types
22
- // ============================================================================
23
- class SelectorNotFoundError extends Error {
24
- constructor(elementId, screenId) {
25
- super(`Selector not found: ${elementId} on screen ${screenId}`);
26
- this.elementId = elementId;
27
- this.screenId = screenId;
28
- this.name = 'SelectorNotFoundError';
29
- }
30
- }
31
- exports.SelectorNotFoundError = SelectorNotFoundError;
32
- class UIModelNotFoundError extends Error {
33
- constructor(screenId) {
34
- super(`UI Model not found for screen: ${screenId}`);
35
- this.screenId = screenId;
36
- this.name = 'UIModelNotFoundError';
37
- }
38
- }
39
- exports.UIModelNotFoundError = UIModelNotFoundError;
40
- class GeneratorError extends Error {
41
- constructor(message, cause) {
42
- super(message);
43
- this.cause = cause;
44
- this.name = 'GeneratorError';
45
- }
46
- }
47
- exports.GeneratorError = GeneratorError;
48
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/generators/types.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA4LH,sDAUC;AAVD,SAAgB,qBAAqB,CAAC,GAAW;IAC/C,kCAAkC;IAClC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,OAAO;QACL,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAClB,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;KACtB,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E,MAAa,qBAAsB,SAAQ,KAAK;IAC9C,YAAmB,SAAiB,EAAS,QAAgB;QAC3D,KAAK,CAAC,uBAAuB,SAAS,cAAc,QAAQ,EAAE,CAAC,CAAC;QAD/C,cAAS,GAAT,SAAS,CAAQ;QAAS,aAAQ,GAAR,QAAQ,CAAQ;QAE3D,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AALD,sDAKC;AAED,MAAa,oBAAqB,SAAQ,KAAK;IAC7C,YAAmB,QAAgB;QACjC,KAAK,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAC;QADnC,aAAQ,GAAR,QAAQ,CAAQ;QAEjC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AALD,oDAKC;AAED,MAAa,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe,EAAS,KAAa;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,UAAK,GAAL,KAAK,CAAQ;QAE/C,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AALD,wCAKC"}
@@ -1,16 +0,0 @@
1
- /**
2
- * Pure helper: collapse consecutive repeated segments in a Figma node path.
3
- *
4
- * Delimiter: " > " (space-angle-space).
5
- * Collapsed runs use the multiplication sign × (U+00D7).
6
- *
7
- * Examples:
8
- * "A > B > C" → "A > B > C" (unchanged)
9
- * "A > B > B > C" → "A > B×2 > C"
10
- * "Container > Container > Container > X" → "Container×3 > X"
11
- * "A > A > A > A > A > B > C" → "A×5 > B > C"
12
- * "A" → "A" (single)
13
- * "" → "" (empty)
14
- */
15
- export declare function collapseNodePath(path: string): string;
16
- //# sourceMappingURL=node-path-collapser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-path-collapser.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/figma/node-path-collapser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuBrD"}
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.collapseNodePath = collapseNodePath;
4
- /**
5
- * Pure helper: collapse consecutive repeated segments in a Figma node path.
6
- *
7
- * Delimiter: " > " (space-angle-space).
8
- * Collapsed runs use the multiplication sign × (U+00D7).
9
- *
10
- * Examples:
11
- * "A > B > C" → "A > B > C" (unchanged)
12
- * "A > B > B > C" → "A > B×2 > C"
13
- * "Container > Container > Container > X" → "Container×3 > X"
14
- * "A > A > A > A > A > B > C" → "A×5 > B > C"
15
- * "A" → "A" (single)
16
- * "" → "" (empty)
17
- */
18
- function collapseNodePath(path) {
19
- if (!path)
20
- return path;
21
- const DELIMITER = ' > ';
22
- const segments = path.split(DELIMITER);
23
- const collapsed = [];
24
- let i = 0;
25
- while (i < segments.length) {
26
- const current = segments[i];
27
- let count = 1;
28
- // Count consecutive identical segments
29
- while (i + count < segments.length && segments[i + count] === current) {
30
- count++;
31
- }
32
- collapsed.push(count > 1 ? `${current}×${count}` : current);
33
- i += count;
34
- }
35
- return collapsed.join(DELIMITER);
36
- }
37
- //# sourceMappingURL=node-path-collapser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node-path-collapser.js","sourceRoot":"","sources":["../../../src/orchestrator/figma/node-path-collapser.ts"],"names":[],"mappings":";;AAcA,4CAuBC;AArCD;;;;;;;;;;;;;GAaG;AACH,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,SAAS,GAAG,KAAK,CAAC;IACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEvC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,uCAAuC;QACvC,OAAO,CAAC,GAAG,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC;YACtE,KAAK,EAAE,CAAC;QACV,CAAC;QAED,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC,IAAI,KAAK,CAAC;IACb,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC"}
package/src/cli/types.ts DELETED
@@ -1,9 +0,0 @@
1
- /**
2
- * CLI Types
3
- * Future adapter interface for programmatic command execution (e.g., VSCode extension)
4
- */
5
-
6
- export interface CommandAdapter {
7
- name: string;
8
- execute(command: string, options: Record<string, any>): Promise<void>;
9
- }
@@ -1,142 +0,0 @@
1
- /**
2
- * Gherkin Selector Extractor
3
- * Scans Gherkin feature files and extracts all [screen.element] references
4
- */
5
-
6
- import fs from 'fs';
7
- import path from 'path';
8
- import { glob } from 'glob';
9
-
10
- export interface ExtractedSelector {
11
- screenId: string;
12
- elementId: string;
13
- fullRef: string; // e.g., "[auth-login.email]"
14
- occurrences: number;
15
- }
16
-
17
- export interface SelectorsByScreen {
18
- [screenId: string]: {
19
- [elementId: string]: {
20
- fullRef: string;
21
- occurrences: number;
22
- };
23
- };
24
- }
25
-
26
- export class GherkinSelectorExtractor {
27
- /**
28
- * Extract all selector references from Gherkin feature files
29
- */
30
- extractSelectors(featuresDir: string): SelectorsByScreen {
31
- const featureFiles = glob.sync('**/*.feature', {
32
- cwd: featuresDir,
33
- absolute: true,
34
- });
35
-
36
- const selectorsByScreen: SelectorsByScreen = {};
37
-
38
- for (const filePath of featureFiles) {
39
- const content = fs.readFileSync(filePath, 'utf-8');
40
- const selectors = this.extractSelectorsFromContent(content);
41
-
42
- // Merge into selectorsByScreen
43
- for (const selector of selectors) {
44
- if (!selectorsByScreen[selector.screenId]) {
45
- selectorsByScreen[selector.screenId] = {};
46
- }
47
-
48
- if (!selectorsByScreen[selector.screenId][selector.elementId]) {
49
- selectorsByScreen[selector.screenId][selector.elementId] = {
50
- fullRef: selector.fullRef,
51
- occurrences: 0,
52
- };
53
- }
54
-
55
- selectorsByScreen[selector.screenId][selector.elementId].occurrences++;
56
- }
57
- }
58
-
59
- return selectorsByScreen;
60
- }
61
-
62
- /**
63
- * Extract selectors from feature file content
64
- */
65
- private extractSelectorsFromContent(content: string): ExtractedSelector[] {
66
- const selectors: ExtractedSelector[] = [];
67
-
68
- // Regex to match [screen.element] or [screen]
69
- const selectorRegex = /\[([a-zA-Z0-9_-]+)(?:\.([a-zA-Z0-9_-]+))?\]/g;
70
-
71
- let match;
72
- while ((match = selectorRegex.exec(content)) !== null) {
73
- const fullRef = match[0]; // e.g., "[auth-login.email]"
74
- const screenId = match[1]; // e.g., "auth-login"
75
- const elementId = match[2]; // e.g., "email" (undefined for route-only refs)
76
-
77
- // Only include selectors with both screen and element (skip route-only refs)
78
- if (elementId) {
79
- selectors.push({
80
- screenId,
81
- elementId,
82
- fullRef,
83
- occurrences: 1,
84
- });
85
- }
86
- }
87
-
88
- return selectors;
89
- }
90
-
91
- /**
92
- * Generate base skeleton YAML structure
93
- */
94
- generateSkeletonYaml(screenId: string, selectors: SelectorsByScreen): string {
95
- const screenSelectors = selectors[screenId];
96
-
97
- if (!screenSelectors) {
98
- return `# No selectors found for screen: ${screenId}\n`;
99
- }
100
-
101
- const lines: string[] = [
102
- `# Selector skeleton for screen: ${screenId}`,
103
- `# AI will fill in the selector values based on UI model`,
104
- `# This file is generated by scanning Gherkin feature files`,
105
- '',
106
- ];
107
-
108
- // Sort by element ID for consistency
109
- const sortedElementIds = Object.keys(screenSelectors).sort();
110
-
111
- for (const elementId of sortedElementIds) {
112
- const { fullRef, occurrences } = screenSelectors[elementId];
113
-
114
- lines.push(`"${fullRef}":`);
115
- lines.push(` selector: ""`);
116
- lines.push(` type: ""`);
117
- lines.push(` description: ""`);
118
- lines.push(` # Referenced ${occurrences} time(s) in Gherkin`);
119
- lines.push('');
120
- }
121
-
122
- return lines.join('\n');
123
- }
124
-
125
- /**
126
- * Write skeleton files for all screens
127
- */
128
- writeSkeletonFiles(
129
- selectors: SelectorsByScreen,
130
- outputDir: string
131
- ): void {
132
- // Ensure output directory exists
133
- fs.mkdirSync(outputDir, { recursive: true });
134
-
135
- for (const screenId of Object.keys(selectors)) {
136
- const skeletonContent = this.generateSkeletonYaml(screenId, selectors);
137
- const outputPath = path.join(outputDir, `${screenId}.skeleton.yaml`);
138
-
139
- fs.writeFileSync(outputPath, skeletonContent, 'utf-8');
140
- }
141
- }
142
- }
@@ -1,26 +0,0 @@
1
- /**
2
- * Test Generator Types
3
- * Core type definitions for the test generation compiler
4
- */
5
-
6
- /**
7
- * Generated Test Result
8
- */
9
- export interface GeneratedTest {
10
- featureName: string;
11
- filePath: string;
12
- code: string;
13
- sourceFile?: string;
14
- stepCount?: number;
15
- }
16
-
17
- /**
18
- * Generation Statistics
19
- */
20
- export interface GenerationStats {
21
- totalScenarios: number;
22
- totalSteps: number;
23
- dictionaryMatched: number;
24
- todoCount: number;
25
- generationTime: number;
26
- }