@sun-asterisk/sungen 2.4.5 ā 2.4.6
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/cli/commands/delivery.d.ts +7 -0
- package/dist/cli/commands/delivery.d.ts.map +1 -0
- package/dist/cli/commands/delivery.js +348 -0
- package/dist/cli/commands/delivery.js.map +1 -0
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +64 -1
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.js +4 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/exporters/csv-exporter.d.ts +32 -0
- package/dist/exporters/csv-exporter.d.ts.map +1 -0
- package/dist/exporters/csv-exporter.js +311 -0
- package/dist/exporters/csv-exporter.js.map +1 -0
- package/dist/exporters/feature-parser.d.ts +48 -0
- package/dist/exporters/feature-parser.d.ts.map +1 -0
- package/dist/exporters/feature-parser.js +178 -0
- package/dist/exporters/feature-parser.js.map +1 -0
- package/dist/exporters/package-info.d.ts +9 -0
- package/dist/exporters/package-info.d.ts.map +1 -0
- package/dist/exporters/package-info.js +73 -0
- package/dist/exporters/package-info.js.map +1 -0
- package/dist/exporters/playwright-report-parser.d.ts +21 -0
- package/dist/exporters/playwright-report-parser.d.ts.map +1 -0
- package/dist/exporters/playwright-report-parser.js +184 -0
- package/dist/exporters/playwright-report-parser.js.map +1 -0
- package/dist/exporters/scenario-merger.d.ts +21 -0
- package/dist/exporters/scenario-merger.d.ts.map +1 -0
- package/dist/exporters/scenario-merger.js +51 -0
- package/dist/exporters/scenario-merger.js.map +1 -0
- package/dist/exporters/spec-parser.d.ts +20 -0
- package/dist/exporters/spec-parser.d.ts.map +1 -0
- package/dist/exporters/spec-parser.js +259 -0
- package/dist/exporters/spec-parser.js.map +1 -0
- package/dist/exporters/step-formatter.d.ts +32 -0
- package/dist/exporters/step-formatter.d.ts.map +1 -0
- package/dist/exporters/step-formatter.js +76 -0
- package/dist/exporters/step-formatter.js.map +1 -0
- package/dist/exporters/test-data-resolver.d.ts +20 -0
- package/dist/exporters/test-data-resolver.d.ts.map +1 -0
- package/dist/exporters/test-data-resolver.js +96 -0
- package/dist/exporters/test-data-resolver.js.map +1 -0
- package/dist/exporters/types.d.ts +104 -0
- package/dist/exporters/types.d.ts.map +1 -0
- package/dist/exporters/types.js +6 -0
- package/dist/exporters/types.js.map +1 -0
- package/dist/exporters/xlsx-exporter.d.ts +19 -0
- package/dist/exporters/xlsx-exporter.d.ts.map +1 -0
- package/dist/exporters/xlsx-exporter.js +309 -0
- package/dist/exporters/xlsx-exporter.js.map +1 -0
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +26 -0
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
- package/dist/orchestrator/ai-rules-updater.js +12 -0
- package/dist/orchestrator/ai-rules-updater.js.map +1 -1
- package/dist/orchestrator/project-initializer.d.ts +12 -1
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +84 -64
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +2 -0
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +15 -17
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +7 -5
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-delivery.md +71 -0
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +27 -0
- package/dist/orchestrator/templates/ai-instructions/claude-config.md +12 -2
- package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-figma.md +142 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-live.md +100 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-capture-local.md +73 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-delivery.md +103 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +2 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +22 -0
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +13 -15
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +6 -4
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-delivery.md +71 -0
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +38 -14
- package/dist/orchestrator/templates/ai-instructions/copilot-config.md +12 -2
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-figma.md +142 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-live.md +100 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-local.md +73 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +103 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +2 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-keys.md +22 -0
- package/dist/orchestrator/templates/playwright.config.d.ts.map +1 -1
- package/dist/orchestrator/templates/playwright.config.js +6 -1
- package/dist/orchestrator/templates/playwright.config.js.map +1 -1
- package/dist/orchestrator/templates/playwright.config.ts +6 -1
- package/package.json +2 -1
- package/src/cli/commands/delivery.ts +348 -0
- package/src/cli/commands/update.ts +84 -2
- package/src/cli/index.ts +4 -2
- package/src/exporters/csv-exporter.ts +304 -0
- package/src/exporters/feature-parser.ts +168 -0
- package/src/exporters/package-info.ts +35 -0
- package/src/exporters/playwright-report-parser.ts +168 -0
- package/src/exporters/scenario-merger.ts +63 -0
- package/src/exporters/spec-parser.ts +247 -0
- package/src/exporters/step-formatter.ts +80 -0
- package/src/exporters/test-data-resolver.ts +59 -0
- package/src/exporters/types.ts +112 -0
- package/src/exporters/xlsx-exporter.ts +301 -0
- package/src/generators/test-generator/utils/selector-resolver.ts +26 -0
- package/src/orchestrator/ai-rules-updater.ts +12 -0
- package/src/orchestrator/project-initializer.ts +103 -70
- package/src/orchestrator/screen-manager.ts +2 -0
- package/src/orchestrator/templates/ai-instructions/claude-cmd-add-screen.md +15 -17
- package/src/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +7 -5
- package/src/orchestrator/templates/ai-instructions/claude-cmd-delivery.md +71 -0
- package/src/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +27 -0
- package/src/orchestrator/templates/ai-instructions/claude-config.md +12 -2
- package/src/orchestrator/templates/ai-instructions/claude-skill-capture-figma.md +142 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-capture-live.md +100 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-capture-local.md +73 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-delivery.md +103 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +2 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-selector-keys.md +22 -0
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +13 -15
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +6 -4
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-delivery.md +71 -0
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +38 -14
- package/src/orchestrator/templates/ai-instructions/copilot-config.md +12 -2
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-figma.md +142 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-live.md +100 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-local.md +73 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +103 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +2 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-keys.md +22 -0
- package/src/orchestrator/templates/playwright.config.ts +6 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `sungen delivery` CLI command.
|
|
3
|
+
* Exports Gherkin scenarios + Playwright results ā CSV test case file.
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
export declare function registerDeliveryCommand(program: Command): void;
|
|
7
|
+
//# sourceMappingURL=delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/delivery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqRpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiE9D"}
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `sungen delivery` CLI command.
|
|
4
|
+
* Exports Gherkin scenarios + Playwright results ā CSV test case file.
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.registerDeliveryCommand = registerDeliveryCommand;
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const child_process_1 = require("child_process");
|
|
44
|
+
const feature_parser_1 = require("../../exporters/feature-parser");
|
|
45
|
+
const spec_parser_1 = require("../../exporters/spec-parser");
|
|
46
|
+
const test_data_resolver_1 = require("../../exporters/test-data-resolver");
|
|
47
|
+
const playwright_report_parser_1 = require("../../exporters/playwright-report-parser");
|
|
48
|
+
const scenario_merger_1 = require("../../exporters/scenario-merger");
|
|
49
|
+
const csv_exporter_1 = require("../../exporters/csv-exporter");
|
|
50
|
+
const xlsx_exporter_1 = require("../../exporters/xlsx-exporter");
|
|
51
|
+
const COLOR = {
|
|
52
|
+
reset: '\x1b[0m',
|
|
53
|
+
gray: '\x1b[90m',
|
|
54
|
+
green: '\x1b[32m',
|
|
55
|
+
red: '\x1b[31m',
|
|
56
|
+
yellow: '\x1b[33m',
|
|
57
|
+
cyan: '\x1b[36m',
|
|
58
|
+
bold: '\x1b[1m',
|
|
59
|
+
};
|
|
60
|
+
function log(msg) {
|
|
61
|
+
console.log(msg);
|
|
62
|
+
}
|
|
63
|
+
// ----------------------------------------------------------------------------
|
|
64
|
+
// Discovery
|
|
65
|
+
// ----------------------------------------------------------------------------
|
|
66
|
+
function listAllScreens(cwd) {
|
|
67
|
+
const screensDir = path.join(cwd, 'qa', 'screens');
|
|
68
|
+
if (!fs.existsSync(screensDir))
|
|
69
|
+
return [];
|
|
70
|
+
return fs
|
|
71
|
+
.readdirSync(screensDir, { withFileTypes: true })
|
|
72
|
+
.filter((d) => d.isDirectory())
|
|
73
|
+
.map((d) => d.name)
|
|
74
|
+
.sort();
|
|
75
|
+
}
|
|
76
|
+
// ----------------------------------------------------------------------------
|
|
77
|
+
// Pre-flight checks
|
|
78
|
+
// ----------------------------------------------------------------------------
|
|
79
|
+
/**
|
|
80
|
+
* Resolve the results file path for a screen.
|
|
81
|
+
* Prefer the per-screen co-located file, fall back to the global `test-results/results.json`.
|
|
82
|
+
*/
|
|
83
|
+
function resolveResultsPath(cwd, screen) {
|
|
84
|
+
const perScreen = path.join(cwd, 'specs', 'generated', screen, `${screen}-test-result.json`);
|
|
85
|
+
if (fs.existsSync(perScreen))
|
|
86
|
+
return perScreen;
|
|
87
|
+
const global = path.join(cwd, 'test-results', 'results.json');
|
|
88
|
+
if (fs.existsSync(global))
|
|
89
|
+
return global;
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
function runPreflight(cwd, screen) {
|
|
93
|
+
const featureFile = path.join(cwd, 'qa', 'screens', screen, 'features', `${screen}.feature`);
|
|
94
|
+
const testDataFile = (0, test_data_resolver_1.resolveTestDataPath)(cwd, screen);
|
|
95
|
+
const selectorsFile = path.join(cwd, 'qa', 'screens', screen, 'selectors', `${screen}.yaml`);
|
|
96
|
+
const specFile = path.join(cwd, 'specs', 'generated', screen, `${screen}.spec.ts`);
|
|
97
|
+
const resultsFile = resolveResultsPath(cwd, screen);
|
|
98
|
+
const featureOk = checkFeatureReal(featureFile);
|
|
99
|
+
const testDataOk = checkTestDataHasVars(testDataFile);
|
|
100
|
+
const selectorsOk = checkSelectorsHasEntries(selectorsFile, screen);
|
|
101
|
+
const specOk = fs.existsSync(specFile);
|
|
102
|
+
const resultsOk = resultsFile !== null;
|
|
103
|
+
const missing = [];
|
|
104
|
+
const suggestions = [];
|
|
105
|
+
if (!featureOk) {
|
|
106
|
+
missing.push(`feature file missing/empty: ${path.relative(cwd, featureFile)}`);
|
|
107
|
+
suggestions.push(`/sungen:create-test ${screen}`);
|
|
108
|
+
}
|
|
109
|
+
if (!testDataOk) {
|
|
110
|
+
missing.push(`test-data.yaml has no variables: ${path.relative(cwd, testDataFile)}`);
|
|
111
|
+
suggestions.push(`/sungen:create-test ${screen}`);
|
|
112
|
+
}
|
|
113
|
+
if (!selectorsOk) {
|
|
114
|
+
missing.push(`selectors.yaml missing entries: ${path.relative(cwd, selectorsFile)}`);
|
|
115
|
+
suggestions.push(`/sungen:run-test ${screen}`);
|
|
116
|
+
}
|
|
117
|
+
if (!specOk) {
|
|
118
|
+
missing.push(`compiled .spec.ts missing: ${path.relative(cwd, specFile)}`);
|
|
119
|
+
suggestions.push(`sungen generate --screen ${screen}`);
|
|
120
|
+
}
|
|
121
|
+
if (!resultsOk) {
|
|
122
|
+
missing.push(`test-result.json missing (optional)`);
|
|
123
|
+
suggestions.push(`PLAYWRIGHT_JSON_OUTPUT_NAME=specs/generated/${screen}/${screen}-test-result.json npx playwright test specs/generated/${screen}/${screen}.spec.ts`);
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
screen,
|
|
127
|
+
featureOk,
|
|
128
|
+
testDataOk,
|
|
129
|
+
selectorsOk,
|
|
130
|
+
specOk,
|
|
131
|
+
resultsOk,
|
|
132
|
+
missing,
|
|
133
|
+
suggestions: Array.from(new Set(suggestions)),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function checkFeatureReal(featureFile) {
|
|
137
|
+
if (!fs.existsSync(featureFile))
|
|
138
|
+
return false;
|
|
139
|
+
const content = fs.readFileSync(featureFile, 'utf-8');
|
|
140
|
+
if (!/Feature:/i.test(content))
|
|
141
|
+
return false;
|
|
142
|
+
// Treat as empty if only the sample scaffold scenario is present
|
|
143
|
+
const sample = /Scenario:\s*Sample scenario for /.test(content);
|
|
144
|
+
const realScenarios = (content.match(/\n\s*Scenario:/g) || []).length;
|
|
145
|
+
// If sample present and only 1 scenario ā it's the scaffold only
|
|
146
|
+
if (sample && realScenarios <= 1)
|
|
147
|
+
return false;
|
|
148
|
+
return realScenarios >= 1;
|
|
149
|
+
}
|
|
150
|
+
function checkTestDataHasVars(testDataFile) {
|
|
151
|
+
if (!fs.existsSync(testDataFile))
|
|
152
|
+
return false;
|
|
153
|
+
const content = fs.readFileSync(testDataFile, 'utf-8');
|
|
154
|
+
// Any non-comment line with `key: value`
|
|
155
|
+
const lines = content.split('\n').filter((l) => !l.trim().startsWith('#') && l.includes(':'));
|
|
156
|
+
return lines.length > 0;
|
|
157
|
+
}
|
|
158
|
+
function checkSelectorsHasEntries(selectorsFile, screen) {
|
|
159
|
+
if (!fs.existsSync(selectorsFile))
|
|
160
|
+
return false;
|
|
161
|
+
const content = fs.readFileSync(selectorsFile, 'utf-8');
|
|
162
|
+
// Very small check: YAML has more than just a single `<screen>: page` entry
|
|
163
|
+
const topLevelKeys = (content.match(/^[a-zA-Z_][^\s:]*:\s*$/gm) || []).length +
|
|
164
|
+
(content.match(/^[a-zA-Z_][^\s:]*:\s/gm) || []).length;
|
|
165
|
+
return topLevelKeys > 1;
|
|
166
|
+
}
|
|
167
|
+
function hasBlockingMissing(p) {
|
|
168
|
+
return !p.featureOk || !p.testDataOk || !p.selectorsOk || !p.specOk;
|
|
169
|
+
}
|
|
170
|
+
// ----------------------------------------------------------------------------
|
|
171
|
+
// Environment
|
|
172
|
+
// ----------------------------------------------------------------------------
|
|
173
|
+
function getEnvironment(cwd) {
|
|
174
|
+
let baseURL = '';
|
|
175
|
+
let projectName = 'chromium';
|
|
176
|
+
const configPath = path.join(cwd, 'playwright.config.ts');
|
|
177
|
+
if (fs.existsSync(configPath)) {
|
|
178
|
+
const c = fs.readFileSync(configPath, 'utf-8');
|
|
179
|
+
const baseMatch = c.match(/baseURL:\s*['"]([^'"]+)['"]/);
|
|
180
|
+
if (baseMatch)
|
|
181
|
+
baseURL = baseMatch[1];
|
|
182
|
+
const projMatch = c.match(/name:\s*['"]([^'"]+)['"]/);
|
|
183
|
+
if (projMatch)
|
|
184
|
+
projectName = projMatch[1];
|
|
185
|
+
}
|
|
186
|
+
let executor = process.env.CI_USER || process.env.USER || '';
|
|
187
|
+
try {
|
|
188
|
+
const gitUser = (0, child_process_1.execSync)('git config user.name', { cwd, encoding: 'utf-8' }).trim();
|
|
189
|
+
if (gitUser)
|
|
190
|
+
executor = gitUser;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// ignore
|
|
194
|
+
}
|
|
195
|
+
return { baseURL, projectName, executor };
|
|
196
|
+
}
|
|
197
|
+
// ----------------------------------------------------------------------------
|
|
198
|
+
// Per-screen export
|
|
199
|
+
// ----------------------------------------------------------------------------
|
|
200
|
+
async function exportScreen(cwd, screen, env) {
|
|
201
|
+
const featureFile = path.join(cwd, 'qa', 'screens', screen, 'features', `${screen}.feature`);
|
|
202
|
+
const testDataFile = (0, test_data_resolver_1.resolveTestDataPath)(cwd, screen);
|
|
203
|
+
const specFile = path.join(cwd, 'specs', 'generated', screen, `${screen}.spec.ts`);
|
|
204
|
+
const resultsFile = resolveResultsPath(cwd, screen);
|
|
205
|
+
const specMdFile = path.join(cwd, 'qa', 'screens', screen, 'requirements', 'spec.md');
|
|
206
|
+
try {
|
|
207
|
+
const feature = (0, feature_parser_1.parseFeatureMetadata)(featureFile);
|
|
208
|
+
const spec = (0, spec_parser_1.parseSpecFile)(specFile);
|
|
209
|
+
const testData = (0, test_data_resolver_1.loadTestData)(testDataFile);
|
|
210
|
+
const results = resultsFile ? (0, playwright_report_parser_1.loadPlaywrightReport)(resultsFile) : null;
|
|
211
|
+
const merged = (0, scenario_merger_1.mergeFeatureAndSpec)(feature, spec);
|
|
212
|
+
const rows = (0, csv_exporter_1.buildTestCaseRows)({
|
|
213
|
+
screen,
|
|
214
|
+
featureName: feature.featureName,
|
|
215
|
+
merged,
|
|
216
|
+
testData,
|
|
217
|
+
results,
|
|
218
|
+
env,
|
|
219
|
+
});
|
|
220
|
+
const specLink = fs.existsSync(specMdFile) ? path.relative(cwd, specMdFile) : '';
|
|
221
|
+
const tempSummary = (0, csv_exporter_1.buildSummary)(screen, rows, '');
|
|
222
|
+
const csv = (0, csv_exporter_1.renderCsv)(tempSummary, rows, specLink);
|
|
223
|
+
const csvPath = (0, csv_exporter_1.writeCsv)(cwd, screen, csv);
|
|
224
|
+
const wb = (0, xlsx_exporter_1.renderXlsx)(tempSummary, rows, specLink);
|
|
225
|
+
await (0, xlsx_exporter_1.writeXlsx)(cwd, screen, wb);
|
|
226
|
+
return (0, csv_exporter_1.buildSummary)(screen, rows, path.relative(cwd, csvPath));
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
console.error(`${COLOR.red}Error exporting ${screen}:${COLOR.reset} ${err instanceof Error ? err.message : err}`);
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// ----------------------------------------------------------------------------
|
|
234
|
+
// Reporter
|
|
235
|
+
// ----------------------------------------------------------------------------
|
|
236
|
+
function printPreflightTable(checks) {
|
|
237
|
+
log(`\n${COLOR.bold}Pre-flight source check${COLOR.reset}`);
|
|
238
|
+
log(`${COLOR.gray}Columns: feature | test-data | selectors | .spec.ts | test-result.json${COLOR.reset}\n`);
|
|
239
|
+
const ok = (b) => (b ? `${COLOR.green}ā${COLOR.reset}` : `${COLOR.red}ā${COLOR.reset}`);
|
|
240
|
+
for (const c of checks) {
|
|
241
|
+
log(` ${c.screen.padEnd(20)} ${ok(c.featureOk)} ${ok(c.testDataOk)} ${ok(c.selectorsOk)} ${ok(c.specOk)} ${ok(c.resultsOk)}`);
|
|
242
|
+
}
|
|
243
|
+
log('');
|
|
244
|
+
// Show suggestions for any blocking misses
|
|
245
|
+
const blockers = checks.filter(hasBlockingMissing);
|
|
246
|
+
if (blockers.length > 0) {
|
|
247
|
+
log(`${COLOR.yellow}Blocking issues:${COLOR.reset}`);
|
|
248
|
+
for (const b of blockers) {
|
|
249
|
+
log(` ${COLOR.bold}${b.screen}${COLOR.reset}`);
|
|
250
|
+
for (const m of b.missing)
|
|
251
|
+
log(` - ${COLOR.red}ā${COLOR.reset} ${m}`);
|
|
252
|
+
for (const s of b.suggestions)
|
|
253
|
+
log(` ${COLOR.cyan}ā ${s}${COLOR.reset}`);
|
|
254
|
+
}
|
|
255
|
+
log('');
|
|
256
|
+
}
|
|
257
|
+
// Warn about optional misses (results.json)
|
|
258
|
+
const warnings = checks.filter((c) => !hasBlockingMissing(c) && !c.resultsOk);
|
|
259
|
+
if (warnings.length > 0) {
|
|
260
|
+
log(`${COLOR.yellow}Warnings (optional missing):${COLOR.reset}`);
|
|
261
|
+
for (const w of warnings) {
|
|
262
|
+
log(` ${w.screen}: test-result.json missing ā execution columns will be empty`);
|
|
263
|
+
}
|
|
264
|
+
log('');
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function printSummaryTable(summaries) {
|
|
268
|
+
log(`\n${COLOR.bold}Delivery export complete${COLOR.reset}`);
|
|
269
|
+
log('');
|
|
270
|
+
log(' Screen TCs Passed Failed Pending N/A File');
|
|
271
|
+
log(' ' + '-'.repeat(80));
|
|
272
|
+
for (const s of summaries) {
|
|
273
|
+
log(` ${s.screen.padEnd(20)} ${String(s.total).padStart(3)} ${String(s.passed).padStart(6)} ${String(s.failed).padStart(6)} ${String(s.pending).padStart(7)} ${String(s.na).padStart(3)} ${s.outputFile}`);
|
|
274
|
+
}
|
|
275
|
+
log('');
|
|
276
|
+
const totalNotCompiled = summaries.reduce((a, s) => a + s.notCompiled, 0);
|
|
277
|
+
if (totalNotCompiled > 0) {
|
|
278
|
+
log(`${COLOR.yellow}Note: ${totalNotCompiled} scenario(s) flagged "Not compiled" in CSV. Re-run \`sungen generate\` to compile them.${COLOR.reset}\n`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// ----------------------------------------------------------------------------
|
|
282
|
+
// Command registration
|
|
283
|
+
// ----------------------------------------------------------------------------
|
|
284
|
+
function registerDeliveryCommand(program) {
|
|
285
|
+
program
|
|
286
|
+
.command('delivery')
|
|
287
|
+
.description('Export Gherkin + Playwright results ā CSV test case deliverable')
|
|
288
|
+
.argument('[screens...]', 'Specific screen names. Omit to process all screens.')
|
|
289
|
+
.option('--skip-preflight', 'Skip pre-flight checks (not recommended)')
|
|
290
|
+
.option('--continue-on-missing', 'Skip screens with blocking misses instead of aborting')
|
|
291
|
+
.action(async (screens, options) => {
|
|
292
|
+
try {
|
|
293
|
+
const cwd = process.cwd();
|
|
294
|
+
// 1. Scope detection
|
|
295
|
+
let targetScreens;
|
|
296
|
+
if (screens && screens.length > 0) {
|
|
297
|
+
targetScreens = screens;
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
targetScreens = listAllScreens(cwd);
|
|
301
|
+
if (targetScreens.length === 0) {
|
|
302
|
+
console.error(`${COLOR.red}No screens found in qa/screens/${COLOR.reset}`);
|
|
303
|
+
process.exit(1);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
log(`${COLOR.bold}sungen delivery${COLOR.reset} ā exporting ${targetScreens.length} screen(s): ${targetScreens.join(', ')}\n`);
|
|
307
|
+
// 2. Pre-flight
|
|
308
|
+
let toExport;
|
|
309
|
+
if (options.skipPreflight) {
|
|
310
|
+
toExport = targetScreens;
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
const checks = targetScreens.map((s) => runPreflight(cwd, s));
|
|
314
|
+
printPreflightTable(checks);
|
|
315
|
+
const blockers = checks.filter(hasBlockingMissing);
|
|
316
|
+
if (blockers.length > 0) {
|
|
317
|
+
if (options.continueOnMissing) {
|
|
318
|
+
toExport = checks.filter((c) => !hasBlockingMissing(c)).map((c) => c.screen);
|
|
319
|
+
log(`${COLOR.yellow}Continuing with ${toExport.length} ready screen(s).${COLOR.reset}\n`);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
console.error(`${COLOR.red}Aborted:${COLOR.reset} ${blockers.length} screen(s) have blocking issues.\n` +
|
|
323
|
+
`Run the suggested commands above, or use ${COLOR.cyan}--continue-on-missing${COLOR.reset} to skip them.`);
|
|
324
|
+
process.exit(1);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
toExport = checks.map((c) => c.screen);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// 3. Export
|
|
332
|
+
const env = getEnvironment(cwd);
|
|
333
|
+
const summaries = [];
|
|
334
|
+
for (const screen of toExport) {
|
|
335
|
+
const s = await exportScreen(cwd, screen, env);
|
|
336
|
+
if (s)
|
|
337
|
+
summaries.push(s);
|
|
338
|
+
}
|
|
339
|
+
// 4. Summary
|
|
340
|
+
printSummaryTable(summaries);
|
|
341
|
+
}
|
|
342
|
+
catch (err) {
|
|
343
|
+
console.error(`${COLOR.red}Fatal:${COLOR.reset} ${err instanceof Error ? err.message : err}`);
|
|
344
|
+
process.exit(1);
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../src/cli/commands/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgC5D"}
|
|
@@ -1,13 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.registerUpdateCommand = registerUpdateCommand;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
/**
|
|
6
|
+
* `sungen update` does two jobs in sequence:
|
|
7
|
+
*
|
|
8
|
+
* 1. Reinstall `@sun-asterisk/sungen@latest` globally via npm so the bundled
|
|
9
|
+
* AI templates are refreshed.
|
|
10
|
+
* 2. Re-execute `sungen update` with the env var `SUNGEN_UPDATE_SKIP_NPM=1`
|
|
11
|
+
* so the AI rules / commands / skills inside the project get overwritten
|
|
12
|
+
* from the *new* templates.
|
|
13
|
+
*
|
|
14
|
+
* We use an environment variable (not a CLI flag) for the internal hand-off
|
|
15
|
+
* because Commander throws "unknown option" if the currently-installed
|
|
16
|
+
* published version doesn't recognise the flag yet. Env vars are silently
|
|
17
|
+
* ignored by older versions ā the worst case is one extra (idempotent) npm
|
|
18
|
+
* install, never a crash.
|
|
19
|
+
*
|
|
20
|
+
* The public `--skip-npm-install` flag is still available for users who
|
|
21
|
+
* already installed the binary by other means (CI pipelines, corporate
|
|
22
|
+
* mirror, manual download) and only want to refresh the project AI assets.
|
|
23
|
+
*/
|
|
24
|
+
const SKIP_NPM_ENV = 'SUNGEN_UPDATE_SKIP_NPM';
|
|
4
25
|
function registerUpdateCommand(program) {
|
|
5
26
|
program
|
|
6
27
|
.command('update')
|
|
7
|
-
.description('
|
|
28
|
+
.description('Reinstall @sun-asterisk/sungen@latest + refresh AI rules, commands, and skills')
|
|
8
29
|
.option('--dry-run', 'Show what would be updated without making changes')
|
|
30
|
+
.option('--skip-npm-install', 'Skip the `npm install -g @sun-asterisk/sungen@latest` step (refresh project AI assets only)', false)
|
|
9
31
|
.action(async (options) => {
|
|
10
32
|
try {
|
|
33
|
+
const skipNpm = Boolean(options.skipNpmInstall) || process.env[SKIP_NPM_ENV] === '1';
|
|
34
|
+
if (!skipNpm) {
|
|
35
|
+
reinstallLatestSungen();
|
|
36
|
+
printCurrentVersion();
|
|
37
|
+
reExecUpdateForAIAssets(options.dryRun ?? false);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
11
40
|
const { AIRulesUpdater } = require('../../orchestrator/ai-rules-updater');
|
|
12
41
|
const updater = new AIRulesUpdater(process.cwd());
|
|
13
42
|
await updater.update(options.dryRun ?? false);
|
|
@@ -18,4 +47,38 @@ function registerUpdateCommand(program) {
|
|
|
18
47
|
}
|
|
19
48
|
});
|
|
20
49
|
}
|
|
50
|
+
function reinstallLatestSungen() {
|
|
51
|
+
console.log('š¦ Installing @sun-asterisk/sungen@latest...');
|
|
52
|
+
const result = (0, child_process_1.spawnSync)('npm', ['install', '-g', '@sun-asterisk/sungen@latest'], {
|
|
53
|
+
stdio: 'inherit',
|
|
54
|
+
shell: true,
|
|
55
|
+
});
|
|
56
|
+
if (result.status !== 0) {
|
|
57
|
+
throw new Error('npm install -g @sun-asterisk/sungen@latest failed. Run it manually or check your npm setup.');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function printCurrentVersion() {
|
|
61
|
+
console.log('\nš Installed version:');
|
|
62
|
+
(0, child_process_1.spawnSync)('sungen', ['--version'], { stdio: 'inherit', shell: true });
|
|
63
|
+
console.log('');
|
|
64
|
+
}
|
|
65
|
+
function reExecUpdateForAIAssets(dryRun) {
|
|
66
|
+
const args = ['update'];
|
|
67
|
+
if (dryRun)
|
|
68
|
+
args.push('--dry-run');
|
|
69
|
+
const result = (0, child_process_1.spawnSync)('sungen', args, {
|
|
70
|
+
stdio: 'inherit',
|
|
71
|
+
shell: true,
|
|
72
|
+
env: { ...process.env, [SKIP_NPM_ENV]: '1' },
|
|
73
|
+
});
|
|
74
|
+
if (result.status !== 0) {
|
|
75
|
+
console.error('\nā ļø AI-rules refresh step returned a non-zero exit code.\n' +
|
|
76
|
+
` If the newly installed version is older and didn't recognise this flow,\n` +
|
|
77
|
+
' run the refresh manually:\n\n' +
|
|
78
|
+
' sungen update --skip-npm-install' +
|
|
79
|
+
(dryRun ? ' --dry-run' : '') +
|
|
80
|
+
'\n');
|
|
81
|
+
}
|
|
82
|
+
process.exit(result.status ?? 0);
|
|
83
|
+
}
|
|
21
84
|
//# sourceMappingURL=update.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -11,21 +11,23 @@ const add_1 = require("./commands/add");
|
|
|
11
11
|
const generate_1 = require("./commands/generate");
|
|
12
12
|
const makeauth_1 = require("./commands/makeauth");
|
|
13
13
|
const update_1 = require("./commands/update");
|
|
14
|
+
const delivery_1 = require("./commands/delivery");
|
|
14
15
|
async function main() {
|
|
15
16
|
const program = new commander_1.Command();
|
|
16
17
|
program
|
|
17
18
|
.name('sungen')
|
|
18
19
|
.description('Deterministic E2E Test Compiler ā Gherkin + Selectors ā Playwright')
|
|
19
|
-
.version('2.4.
|
|
20
|
+
.version('2.4.6');
|
|
20
21
|
// Global options
|
|
21
22
|
program
|
|
22
23
|
.option('-v, --verbose', 'Enable verbose logging');
|
|
23
|
-
// Register commands (
|
|
24
|
+
// Register commands (6)
|
|
24
25
|
(0, init_1.registerInitCommand)(program);
|
|
25
26
|
(0, add_1.registerAddCommand)(program);
|
|
26
27
|
(0, generate_1.registerGenerateCommand)(program);
|
|
27
28
|
(0, makeauth_1.registerMakeauthCommand)(program);
|
|
28
29
|
(0, update_1.registerUpdateCommand)(program);
|
|
30
|
+
(0, delivery_1.registerDeliveryCommand)(program);
|
|
29
31
|
await program.parseAsync(process.argv);
|
|
30
32
|
}
|
|
31
33
|
main().catch((error) => {
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,yCAAoC;AACpC,0CAAsD;AACtD,wCAAoD;AACpD,kDAA8D;AAC9D,kDAA8D;AAC9D,8CAA0D;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,yCAAoC;AACpC,0CAAsD;AACtD,wCAAoD;AACpD,kDAA8D;AAC9D,kDAA8D;AAC9D,8CAA0D;AAC1D,kDAA8D;AAE9D,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,oEAAoE,CAAC;SACjF,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,iBAAiB;IACjB,OAAO;SACJ,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC;IAErD,wBAAwB;IACxB,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;IAC7B,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;IAC5B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAC/B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IAEjC,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assemble CSV rows from merged scenarios + test data + playwright results.
|
|
3
|
+
* Outputs a CSV file matching the BM-2-901-13 test case template format.
|
|
4
|
+
*/
|
|
5
|
+
import { MergedScenario } from './scenario-merger';
|
|
6
|
+
import { EnvironmentInfo, PlaywrightResult, ScreenSummary, TestCaseRow } from './types';
|
|
7
|
+
export interface BuildCsvInput {
|
|
8
|
+
screen: string;
|
|
9
|
+
featureName: string;
|
|
10
|
+
merged: MergedScenario[];
|
|
11
|
+
testData: Record<string, string>;
|
|
12
|
+
results: Map<string, PlaywrightResult> | null;
|
|
13
|
+
env: EnvironmentInfo;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Build CSV test case rows from merged scenarios.
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildTestCaseRows(input: BuildCsvInput): TestCaseRow[];
|
|
19
|
+
/**
|
|
20
|
+
* Calculate summary statistics from rows.
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildSummary(screen: string, rows: TestCaseRow[], outputFile: string): ScreenSummary;
|
|
23
|
+
/**
|
|
24
|
+
* Compose the full CSV file content matching the BM-2-901-13 template.
|
|
25
|
+
*/
|
|
26
|
+
export declare function renderCsv(summary: ScreenSummary, rows: TestCaseRow[], specLink: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Write the CSV to disk at qa/deliverables/<screen>-testcases.csv.
|
|
29
|
+
* Creates directory if needed.
|
|
30
|
+
*/
|
|
31
|
+
export declare function writeCsv(cwd: string, screen: string, csvContent: string): string;
|
|
32
|
+
//# sourceMappingURL=csv-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv-exporter.d.ts","sourceRoot":"","sources":["../../src/exporters/csv-exporter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAgBnD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAExF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAC9C,GAAG,EAAE,eAAe,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,WAAW,EAAE,CAyFrE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,CAmBnG;AAuBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6G/F;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAQhF"}
|