guardrail-cli 1.0.6 → 2.0.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.
Files changed (144) hide show
  1. package/README.md +483 -10
  2. package/dist/commands/baseline.d.ts +7 -0
  3. package/dist/commands/baseline.d.ts.map +1 -0
  4. package/dist/commands/baseline.js +79 -0
  5. package/dist/commands/baseline.js.map +1 -0
  6. package/dist/commands/cache.d.ts +13 -0
  7. package/dist/commands/cache.d.ts.map +1 -0
  8. package/dist/commands/cache.js +165 -0
  9. package/dist/commands/cache.js.map +1 -0
  10. package/dist/commands/evidence.d.ts +45 -0
  11. package/dist/commands/evidence.d.ts.map +1 -0
  12. package/dist/commands/evidence.js +197 -0
  13. package/dist/commands/evidence.js.map +1 -0
  14. package/dist/commands/index.d.ts +8 -0
  15. package/dist/commands/index.d.ts.map +1 -0
  16. package/dist/commands/index.js +15 -0
  17. package/dist/commands/index.js.map +1 -0
  18. package/dist/commands/scan-secrets.d.ts +47 -0
  19. package/dist/commands/scan-secrets.d.ts.map +1 -0
  20. package/dist/commands/scan-secrets.js +225 -0
  21. package/dist/commands/scan-secrets.js.map +1 -0
  22. package/dist/commands/scan-vulnerabilities-enhanced.d.ts +41 -0
  23. package/dist/commands/scan-vulnerabilities-enhanced.d.ts.map +1 -0
  24. package/dist/commands/scan-vulnerabilities-enhanced.js +368 -0
  25. package/dist/commands/scan-vulnerabilities-enhanced.js.map +1 -0
  26. package/dist/commands/scan-vulnerabilities-osv.d.ts +58 -0
  27. package/dist/commands/scan-vulnerabilities-osv.d.ts.map +1 -0
  28. package/dist/commands/scan-vulnerabilities-osv.js +716 -0
  29. package/dist/commands/scan-vulnerabilities-osv.js.map +1 -0
  30. package/dist/commands/scan-vulnerabilities.d.ts +32 -0
  31. package/dist/commands/scan-vulnerabilities.d.ts.map +1 -0
  32. package/dist/commands/scan-vulnerabilities.js +283 -0
  33. package/dist/commands/scan-vulnerabilities.js.map +1 -0
  34. package/dist/commands/secrets-allowlist.d.ts +7 -0
  35. package/dist/commands/secrets-allowlist.d.ts.map +1 -0
  36. package/dist/commands/secrets-allowlist.js +85 -0
  37. package/dist/commands/secrets-allowlist.js.map +1 -0
  38. package/dist/fix/applicator.d.ts +44 -0
  39. package/dist/fix/applicator.d.ts.map +1 -0
  40. package/dist/fix/applicator.js +144 -0
  41. package/dist/fix/applicator.js.map +1 -0
  42. package/dist/fix/backup.d.ts +38 -0
  43. package/dist/fix/backup.d.ts.map +1 -0
  44. package/dist/fix/backup.js +154 -0
  45. package/dist/fix/backup.js.map +1 -0
  46. package/dist/fix/engine.d.ts +55 -0
  47. package/dist/fix/engine.d.ts.map +1 -0
  48. package/dist/fix/engine.js +285 -0
  49. package/dist/fix/engine.js.map +1 -0
  50. package/dist/fix/index.d.ts +5 -0
  51. package/dist/fix/index.d.ts.map +1 -0
  52. package/dist/fix/index.js +12 -0
  53. package/dist/fix/index.js.map +1 -0
  54. package/dist/fix/interactive.d.ts +22 -0
  55. package/dist/fix/interactive.d.ts.map +1 -0
  56. package/dist/fix/interactive.js +172 -0
  57. package/dist/fix/interactive.js.map +1 -0
  58. package/dist/formatters/index.d.ts +6 -0
  59. package/dist/formatters/index.d.ts.map +1 -0
  60. package/dist/formatters/index.js +11 -0
  61. package/dist/formatters/index.js.map +1 -0
  62. package/dist/formatters/sarif-enhanced.d.ts +78 -0
  63. package/dist/formatters/sarif-enhanced.d.ts.map +1 -0
  64. package/dist/formatters/sarif-enhanced.js +144 -0
  65. package/dist/formatters/sarif-enhanced.js.map +1 -0
  66. package/dist/formatters/sarif-v2.d.ts +121 -0
  67. package/dist/formatters/sarif-v2.d.ts.map +1 -0
  68. package/dist/formatters/sarif-v2.js +356 -0
  69. package/dist/formatters/sarif-v2.js.map +1 -0
  70. package/dist/formatters/sarif.d.ts +72 -0
  71. package/dist/formatters/sarif.d.ts.map +1 -0
  72. package/dist/formatters/sarif.js +146 -0
  73. package/dist/formatters/sarif.js.map +1 -0
  74. package/dist/index.js +3362 -1397
  75. package/dist/index.js.map +1 -1
  76. package/dist/init/ci-generator.d.ts +18 -0
  77. package/dist/init/ci-generator.d.ts.map +1 -0
  78. package/dist/init/ci-generator.js +251 -0
  79. package/dist/init/ci-generator.js.map +1 -0
  80. package/dist/init/detect-framework.d.ts +15 -0
  81. package/dist/init/detect-framework.d.ts.map +1 -0
  82. package/dist/init/detect-framework.js +299 -0
  83. package/dist/init/detect-framework.js.map +1 -0
  84. package/dist/init/hooks-installer.d.ts +22 -0
  85. package/dist/init/hooks-installer.d.ts.map +1 -0
  86. package/dist/init/hooks-installer.js +302 -0
  87. package/dist/init/hooks-installer.js.map +1 -0
  88. package/dist/init/index.d.ts +8 -0
  89. package/dist/init/index.d.ts.map +1 -0
  90. package/dist/init/index.js +22 -0
  91. package/dist/init/index.js.map +1 -0
  92. package/dist/init/templates.d.ts +401 -0
  93. package/dist/init/templates.d.ts.map +1 -0
  94. package/dist/init/templates.js +240 -0
  95. package/dist/init/templates.js.map +1 -0
  96. package/dist/reality/reality-runner.d.ts +76 -0
  97. package/dist/reality/reality-runner.d.ts.map +1 -0
  98. package/dist/reality/reality-runner.js +454 -0
  99. package/dist/reality/reality-runner.js.map +1 -0
  100. package/dist/runtime/auth-utils.d.ts +43 -0
  101. package/dist/runtime/auth-utils.d.ts.map +1 -0
  102. package/dist/runtime/auth-utils.js +126 -0
  103. package/dist/runtime/auth-utils.js.map +1 -0
  104. package/dist/runtime/client.d.ts +74 -0
  105. package/dist/runtime/client.d.ts.map +1 -0
  106. package/dist/runtime/client.js +222 -0
  107. package/dist/runtime/client.js.map +1 -0
  108. package/dist/runtime/creds.d.ts +48 -0
  109. package/dist/runtime/creds.d.ts.map +1 -0
  110. package/dist/runtime/creds.js +245 -0
  111. package/dist/runtime/creds.js.map +1 -0
  112. package/dist/runtime/exit-codes.d.ts +47 -0
  113. package/dist/runtime/exit-codes.d.ts.map +1 -0
  114. package/dist/runtime/exit-codes.js +91 -0
  115. package/dist/runtime/exit-codes.js.map +1 -0
  116. package/dist/runtime/index.d.ts +9 -0
  117. package/dist/runtime/index.d.ts.map +1 -0
  118. package/dist/runtime/index.js +25 -0
  119. package/dist/runtime/index.js.map +1 -0
  120. package/dist/runtime/semver.d.ts +37 -0
  121. package/dist/runtime/semver.d.ts.map +1 -0
  122. package/dist/runtime/semver.js +110 -0
  123. package/dist/runtime/semver.js.map +1 -0
  124. package/dist/scanner/baseline.d.ts +52 -0
  125. package/dist/scanner/baseline.d.ts.map +1 -0
  126. package/dist/scanner/baseline.js +85 -0
  127. package/dist/scanner/baseline.js.map +1 -0
  128. package/dist/scanner/incremental.d.ts +30 -0
  129. package/dist/scanner/incremental.d.ts.map +1 -0
  130. package/dist/scanner/incremental.js +82 -0
  131. package/dist/scanner/incremental.js.map +1 -0
  132. package/dist/scanner/parallel.d.ts +43 -0
  133. package/dist/scanner/parallel.d.ts.map +1 -0
  134. package/dist/scanner/parallel.js +99 -0
  135. package/dist/scanner/parallel.js.map +1 -0
  136. package/dist/ui/frame.d.ts +68 -0
  137. package/dist/ui/frame.d.ts.map +1 -0
  138. package/dist/ui/frame.js +165 -0
  139. package/dist/ui/frame.js.map +1 -0
  140. package/dist/ui/index.d.ts +5 -0
  141. package/dist/ui/index.d.ts.map +1 -0
  142. package/dist/ui/index.js +16 -0
  143. package/dist/ui/index.js.map +1 -0
  144. package/package.json +42 -9
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Reality Mode - Playwright Test Execution
3
+ *
4
+ * Enterprise-grade execution of generated Playwright tests with:
5
+ * - Dependency detection (Playwright, browsers)
6
+ * - Artifact storage (.guardrail/reality/<runId>/)
7
+ * - Configurable execution (headless, timeout, workers, reporter)
8
+ * - Signal handling (Ctrl+C, timeout kill)
9
+ */
10
+ export interface PlaywrightRunOptions {
11
+ testFile: string;
12
+ headless: boolean;
13
+ timeout: number;
14
+ workers: number;
15
+ reporter: string;
16
+ projectPath: string;
17
+ baseUrl: string;
18
+ flow: string;
19
+ trace?: 'on' | 'off' | 'retain-on-failure' | 'on-first-retry';
20
+ video?: 'on' | 'off' | 'retain-on-failure' | 'on-first-retry';
21
+ screenshot?: 'on' | 'off' | 'only-on-failure';
22
+ }
23
+ export interface DependencyCheckResult {
24
+ playwrightInstalled: boolean;
25
+ browsersInstalled: boolean;
26
+ playwrightPath: string | null;
27
+ errorMessage: string | null;
28
+ installCommands: string[];
29
+ }
30
+ export interface RunArtifacts {
31
+ runId: string;
32
+ artifactDir: string;
33
+ testFilePath: string;
34
+ reportPath: string | null;
35
+ screenshotsDir: string;
36
+ }
37
+ export interface PlaywrightRunResult {
38
+ success: boolean;
39
+ exitCode: number;
40
+ output: string;
41
+ artifacts: RunArtifacts;
42
+ duration: number;
43
+ }
44
+ /**
45
+ * Check if Playwright is installed and browsers are available
46
+ */
47
+ export declare function checkPlaywrightDependencies(projectPath: string): DependencyCheckResult;
48
+ /**
49
+ * Build Playwright command arguments
50
+ */
51
+ export declare function buildPlaywrightArgs(options: PlaywrightRunOptions): string[];
52
+ /**
53
+ * Create artifact directory structure
54
+ */
55
+ export declare function createArtifactDirectory(projectPath: string, flow: string): RunArtifacts;
56
+ /**
57
+ * Copy test file to artifact directory
58
+ */
59
+ export declare function copyTestToArtifacts(sourceTestFile: string, artifacts: RunArtifacts): void;
60
+ /**
61
+ * Run Playwright tests with proper signal handling
62
+ */
63
+ export declare function runPlaywrightTests(options: PlaywrightRunOptions, artifacts: RunArtifacts, onOutput: (data: string) => void): Promise<PlaywrightRunResult>;
64
+ /**
65
+ * Format duration for display
66
+ */
67
+ export declare function formatDuration(ms: number): string;
68
+ /**
69
+ * Run Playwright codegen for recording mode
70
+ */
71
+ export declare function runPlaywrightCodegen(baseUrl: string, outputFile: string, projectPath: string, onOutput: (data: string) => void): Promise<{
72
+ success: boolean;
73
+ exitCode: number;
74
+ output: string;
75
+ }>;
76
+ //# sourceMappingURL=reality-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reality-runner.d.ts","sourceRoot":"","sources":["../../src/reality/reality-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,mBAAmB,GAAG,gBAAgB,CAAC;IAC9D,KAAK,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,mBAAmB,GAAG,gBAAgB,CAAC;IAC9D,UAAU,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,iBAAiB,CAAC;CAC/C;AAED,MAAM,WAAW,qBAAqB;IACpC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,YAAY,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,qBAAqB,CA4GtF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAqC3E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAiBvF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,IAAI,CAEzF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,YAAY,EACvB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CAiK9B;AA8CD;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAYjD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC/B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA2EjE"}
@@ -0,0 +1,454 @@
1
+ "use strict";
2
+ /**
3
+ * Reality Mode - Playwright Test Execution
4
+ *
5
+ * Enterprise-grade execution of generated Playwright tests with:
6
+ * - Dependency detection (Playwright, browsers)
7
+ * - Artifact storage (.guardrail/reality/<runId>/)
8
+ * - Configurable execution (headless, timeout, workers, reporter)
9
+ * - Signal handling (Ctrl+C, timeout kill)
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.checkPlaywrightDependencies = checkPlaywrightDependencies;
13
+ exports.buildPlaywrightArgs = buildPlaywrightArgs;
14
+ exports.createArtifactDirectory = createArtifactDirectory;
15
+ exports.copyTestToArtifacts = copyTestToArtifacts;
16
+ exports.runPlaywrightTests = runPlaywrightTests;
17
+ exports.formatDuration = formatDuration;
18
+ exports.runPlaywrightCodegen = runPlaywrightCodegen;
19
+ const child_process_1 = require("child_process");
20
+ const fs_1 = require("fs");
21
+ const path_1 = require("path");
22
+ const crypto_1 = require("crypto");
23
+ /**
24
+ * Check if Playwright is installed and browsers are available
25
+ */
26
+ function checkPlaywrightDependencies(projectPath) {
27
+ const result = {
28
+ playwrightInstalled: false,
29
+ browsersInstalled: false,
30
+ playwrightPath: null,
31
+ errorMessage: null,
32
+ installCommands: [],
33
+ };
34
+ // Check for Playwright in node_modules
35
+ const localPlaywright = (0, path_1.join)(projectPath, 'node_modules', '@playwright', 'test');
36
+ const localPlaywrightBin = (0, path_1.join)(projectPath, 'node_modules', '.bin', 'playwright');
37
+ if ((0, fs_1.existsSync)(localPlaywright)) {
38
+ result.playwrightInstalled = true;
39
+ result.playwrightPath = localPlaywrightBin;
40
+ }
41
+ else {
42
+ // Check for global Playwright
43
+ try {
44
+ const globalCheck = (0, child_process_1.execSync)('npx playwright --version', {
45
+ encoding: 'utf8',
46
+ stdio: ['pipe', 'pipe', 'pipe'],
47
+ timeout: 10000,
48
+ });
49
+ if (globalCheck && globalCheck.includes('.')) {
50
+ result.playwrightInstalled = true;
51
+ result.playwrightPath = 'npx playwright';
52
+ }
53
+ }
54
+ catch {
55
+ // Not installed globally either
56
+ }
57
+ }
58
+ if (!result.playwrightInstalled) {
59
+ result.errorMessage = 'Playwright is not installed.';
60
+ result.installCommands = [
61
+ 'npm install -D @playwright/test',
62
+ 'npx playwright install',
63
+ ];
64
+ return result;
65
+ }
66
+ // Check if browsers are installed
67
+ try {
68
+ const browserCheckCmd = result.playwrightPath === 'npx playwright'
69
+ ? 'npx playwright install --dry-run chromium 2>&1'
70
+ : `"${result.playwrightPath}" install --dry-run chromium 2>&1`;
71
+ // Try to detect browser installation by checking common paths
72
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
73
+ const browserPaths = [
74
+ (0, path_1.join)(homeDir, '.cache', 'ms-playwright'),
75
+ (0, path_1.join)(homeDir, 'AppData', 'Local', 'ms-playwright'),
76
+ (0, path_1.join)(homeDir, 'Library', 'Caches', 'ms-playwright'),
77
+ ];
78
+ let browsersFound = false;
79
+ for (const browserPath of browserPaths) {
80
+ if ((0, fs_1.existsSync)(browserPath)) {
81
+ try {
82
+ const contents = (0, fs_1.readdirSync)(browserPath);
83
+ if (contents.some(f => f.startsWith('chromium'))) {
84
+ browsersFound = true;
85
+ break;
86
+ }
87
+ }
88
+ catch {
89
+ // Ignore read errors
90
+ }
91
+ }
92
+ }
93
+ if (browsersFound) {
94
+ result.browsersInstalled = true;
95
+ }
96
+ else {
97
+ // Try running a quick test to see if browsers work
98
+ try {
99
+ (0, child_process_1.execSync)('npx playwright test --list 2>&1', {
100
+ encoding: 'utf8',
101
+ stdio: ['pipe', 'pipe', 'pipe'],
102
+ timeout: 15000,
103
+ cwd: projectPath,
104
+ });
105
+ result.browsersInstalled = true;
106
+ }
107
+ catch (e) {
108
+ const errorOutput = e.stdout?.toString() || e.stderr?.toString() || '';
109
+ if (errorOutput.includes('Executable doesn\'t exist') ||
110
+ errorOutput.includes('browserType.launch') ||
111
+ errorOutput.includes('npx playwright install')) {
112
+ result.browsersInstalled = false;
113
+ result.errorMessage = 'Playwright browsers are not installed.';
114
+ result.installCommands = ['npx playwright install'];
115
+ }
116
+ else {
117
+ // Might just be no tests found, which is fine
118
+ result.browsersInstalled = true;
119
+ }
120
+ }
121
+ }
122
+ }
123
+ catch {
124
+ // Assume browsers might be installed if we can't check
125
+ result.browsersInstalled = true;
126
+ }
127
+ if (!result.browsersInstalled) {
128
+ result.errorMessage = 'Playwright browsers are not installed.';
129
+ result.installCommands = ['npx playwright install'];
130
+ }
131
+ return result;
132
+ }
133
+ /**
134
+ * Build Playwright command arguments
135
+ */
136
+ function buildPlaywrightArgs(options) {
137
+ const args = ['test', options.testFile];
138
+ // Headless mode (Playwright default is headless, --headed overrides)
139
+ if (!options.headless) {
140
+ args.push('--headed');
141
+ }
142
+ // Timeout (in milliseconds)
143
+ if (options.timeout > 0) {
144
+ args.push('--timeout', String(options.timeout * 1000));
145
+ }
146
+ // Workers
147
+ args.push('--workers', String(options.workers));
148
+ // Reporter
149
+ if (options.reporter) {
150
+ args.push('--reporter', options.reporter);
151
+ }
152
+ // Screenshot
153
+ if (options.screenshot) {
154
+ args.push('--screenshot', options.screenshot);
155
+ }
156
+ // Trace mode
157
+ if (options.trace) {
158
+ args.push('--trace', options.trace);
159
+ }
160
+ // Video
161
+ if (options.video) {
162
+ args.push('--video', options.video);
163
+ }
164
+ return args;
165
+ }
166
+ /**
167
+ * Create artifact directory structure
168
+ */
169
+ function createArtifactDirectory(projectPath, flow) {
170
+ const runId = `${flow}-${Date.now()}-${(0, crypto_1.randomUUID)().slice(0, 8)}`;
171
+ const artifactDir = (0, path_1.join)(projectPath, '.guardrail', 'reality', runId);
172
+ const screenshotsDir = (0, path_1.join)(artifactDir, 'screenshots');
173
+ const reportDir = (0, path_1.join)(artifactDir, 'report');
174
+ (0, fs_1.mkdirSync)(artifactDir, { recursive: true });
175
+ (0, fs_1.mkdirSync)(screenshotsDir, { recursive: true });
176
+ (0, fs_1.mkdirSync)(reportDir, { recursive: true });
177
+ return {
178
+ runId,
179
+ artifactDir,
180
+ testFilePath: (0, path_1.join)(artifactDir, `reality-${flow}.test.ts`),
181
+ reportPath: reportDir,
182
+ screenshotsDir,
183
+ };
184
+ }
185
+ /**
186
+ * Copy test file to artifact directory
187
+ */
188
+ function copyTestToArtifacts(sourceTestFile, artifacts) {
189
+ (0, fs_1.copyFileSync)(sourceTestFile, artifacts.testFilePath);
190
+ }
191
+ /**
192
+ * Run Playwright tests with proper signal handling
193
+ */
194
+ async function runPlaywrightTests(options, artifacts, onOutput) {
195
+ return new Promise((resolve) => {
196
+ const startTime = Date.now();
197
+ let output = '';
198
+ let childProcess = null;
199
+ let killed = false;
200
+ let timeoutHandle = null;
201
+ const depCheck = checkPlaywrightDependencies(options.projectPath);
202
+ if (!depCheck.playwrightInstalled || !depCheck.browsersInstalled) {
203
+ resolve({
204
+ success: false,
205
+ exitCode: 2,
206
+ output: depCheck.errorMessage || 'Dependency check failed',
207
+ artifacts,
208
+ duration: Date.now() - startTime,
209
+ });
210
+ return;
211
+ }
212
+ const args = buildPlaywrightArgs(options);
213
+ // Add output directory for artifacts
214
+ args.push('--output', artifacts.screenshotsDir);
215
+ // Determine if we should use npx or local binary
216
+ const useNpx = depCheck.playwrightPath === 'npx playwright';
217
+ const command = useNpx ? 'npx' : process.platform === 'win32' ? 'npx' : depCheck.playwrightPath;
218
+ const spawnArgs = useNpx ? ['playwright', ...args] : args;
219
+ // Write run metadata
220
+ const metadata = {
221
+ runId: artifacts.runId,
222
+ startTime: new Date().toISOString(),
223
+ options: {
224
+ testFile: options.testFile,
225
+ headless: options.headless,
226
+ timeout: options.timeout,
227
+ workers: options.workers,
228
+ reporter: options.reporter,
229
+ baseUrl: options.baseUrl,
230
+ flow: options.flow,
231
+ },
232
+ command: `${command} ${spawnArgs.join(' ')}`,
233
+ };
234
+ (0, fs_1.writeFileSync)((0, path_1.join)(artifacts.artifactDir, 'run-metadata.json'), JSON.stringify(metadata, null, 2));
235
+ childProcess = (0, child_process_1.spawn)(command, spawnArgs, {
236
+ cwd: (0, path_1.dirname)(options.testFile),
237
+ stdio: ['pipe', 'pipe', 'pipe'],
238
+ shell: process.platform === 'win32',
239
+ env: {
240
+ ...process.env,
241
+ PLAYWRIGHT_HTML_REPORT: artifacts.reportPath || undefined,
242
+ BASE_URL: options.baseUrl,
243
+ },
244
+ });
245
+ // Set up timeout
246
+ if (options.timeout > 0) {
247
+ const totalTimeout = options.timeout * 1000 * 2; // 2x timeout for safety
248
+ timeoutHandle = setTimeout(() => {
249
+ if (childProcess && !killed) {
250
+ killed = true;
251
+ output += '\n[TIMEOUT] Test execution exceeded timeout limit. Killing process.\n';
252
+ onOutput('\n[TIMEOUT] Test execution exceeded timeout limit. Killing process.\n');
253
+ childProcess.kill('SIGTERM');
254
+ setTimeout(() => {
255
+ if (childProcess && !childProcess.killed) {
256
+ childProcess.kill('SIGKILL');
257
+ }
258
+ }, 5000);
259
+ }
260
+ }, totalTimeout);
261
+ }
262
+ // Handle Ctrl+C
263
+ const sigintHandler = () => {
264
+ if (childProcess && !killed) {
265
+ killed = true;
266
+ output += '\n[INTERRUPTED] Received SIGINT. Stopping tests.\n';
267
+ onOutput('\n[INTERRUPTED] Received SIGINT. Stopping tests.\n');
268
+ childProcess.kill('SIGTERM');
269
+ }
270
+ };
271
+ process.on('SIGINT', sigintHandler);
272
+ childProcess.stdout?.on('data', (data) => {
273
+ const text = data.toString();
274
+ output += text;
275
+ onOutput(text);
276
+ });
277
+ childProcess.stderr?.on('data', (data) => {
278
+ const text = data.toString();
279
+ output += text;
280
+ onOutput(text);
281
+ });
282
+ childProcess.on('close', (code) => {
283
+ if (timeoutHandle) {
284
+ clearTimeout(timeoutHandle);
285
+ }
286
+ process.removeListener('SIGINT', sigintHandler);
287
+ const duration = Date.now() - startTime;
288
+ const exitCode = code ?? 1;
289
+ // Write output log
290
+ (0, fs_1.writeFileSync)((0, path_1.join)(artifacts.artifactDir, 'output.log'), output);
291
+ // Write result summary
292
+ const summary = {
293
+ runId: artifacts.runId,
294
+ success: exitCode === 0,
295
+ exitCode,
296
+ duration,
297
+ endTime: new Date().toISOString(),
298
+ killed,
299
+ };
300
+ (0, fs_1.writeFileSync)((0, path_1.join)(artifacts.artifactDir, 'result.json'), JSON.stringify(summary, null, 2));
301
+ // Copy any HTML report if available
302
+ copyHtmlReportIfExists(options.projectPath, artifacts);
303
+ resolve({
304
+ success: exitCode === 0,
305
+ exitCode,
306
+ output,
307
+ artifacts,
308
+ duration,
309
+ });
310
+ });
311
+ childProcess.on('error', (err) => {
312
+ if (timeoutHandle) {
313
+ clearTimeout(timeoutHandle);
314
+ }
315
+ process.removeListener('SIGINT', sigintHandler);
316
+ const duration = Date.now() - startTime;
317
+ output += `\n[ERROR] Failed to spawn Playwright: ${err.message}\n`;
318
+ (0, fs_1.writeFileSync)((0, path_1.join)(artifacts.artifactDir, 'output.log'), output);
319
+ resolve({
320
+ success: false,
321
+ exitCode: 1,
322
+ output,
323
+ artifacts,
324
+ duration,
325
+ });
326
+ });
327
+ });
328
+ }
329
+ /**
330
+ * Copy HTML report to artifacts if it exists
331
+ */
332
+ function copyHtmlReportIfExists(projectPath, artifacts) {
333
+ const possibleReportPaths = [
334
+ (0, path_1.join)(projectPath, 'playwright-report'),
335
+ (0, path_1.join)((0, path_1.dirname)(artifacts.testFilePath), 'playwright-report'),
336
+ (0, path_1.join)(projectPath, '.guardrail', 'reality-tests', 'playwright-report'),
337
+ ];
338
+ for (const reportPath of possibleReportPaths) {
339
+ if ((0, fs_1.existsSync)(reportPath) && (0, fs_1.existsSync)((0, path_1.join)(reportPath, 'index.html'))) {
340
+ try {
341
+ copyDirectoryRecursive(reportPath, artifacts.reportPath);
342
+ break;
343
+ }
344
+ catch {
345
+ // Ignore copy errors
346
+ }
347
+ }
348
+ }
349
+ }
350
+ /**
351
+ * Recursively copy directory
352
+ */
353
+ function copyDirectoryRecursive(src, dest) {
354
+ if (!(0, fs_1.existsSync)(dest)) {
355
+ (0, fs_1.mkdirSync)(dest, { recursive: true });
356
+ }
357
+ const entries = (0, fs_1.readdirSync)(src, { withFileTypes: true });
358
+ for (const entry of entries) {
359
+ const srcPath = (0, path_1.join)(src, entry.name);
360
+ const destPath = (0, path_1.join)(dest, entry.name);
361
+ if (entry.isDirectory()) {
362
+ copyDirectoryRecursive(srcPath, destPath);
363
+ }
364
+ else {
365
+ (0, fs_1.copyFileSync)(srcPath, destPath);
366
+ }
367
+ }
368
+ }
369
+ /**
370
+ * Format duration for display
371
+ */
372
+ function formatDuration(ms) {
373
+ if (ms < 1000) {
374
+ return `${ms}ms`;
375
+ }
376
+ const seconds = Math.floor(ms / 1000);
377
+ const minutes = Math.floor(seconds / 60);
378
+ const remainingSeconds = seconds % 60;
379
+ if (minutes > 0) {
380
+ return `${minutes}m ${remainingSeconds}s`;
381
+ }
382
+ return `${seconds}s`;
383
+ }
384
+ /**
385
+ * Run Playwright codegen for recording mode
386
+ */
387
+ async function runPlaywrightCodegen(baseUrl, outputFile, projectPath, onOutput) {
388
+ return new Promise((resolve) => {
389
+ const depCheck = checkPlaywrightDependencies(projectPath);
390
+ if (!depCheck.playwrightInstalled || !depCheck.browsersInstalled) {
391
+ const errorMsg = depCheck.errorMessage || 'Dependency check failed';
392
+ onOutput(errorMsg + '\n');
393
+ if (depCheck.installCommands.length > 0) {
394
+ onOutput('\nInstall commands:\n');
395
+ depCheck.installCommands.forEach(cmd => onOutput(` ${cmd}\n`));
396
+ }
397
+ resolve({
398
+ success: false,
399
+ exitCode: 2,
400
+ output: errorMsg,
401
+ });
402
+ return;
403
+ }
404
+ let output = '';
405
+ const args = ['codegen', baseUrl, '--target', 'playwright-test', '--output', outputFile];
406
+ const useNpx = depCheck.playwrightPath === 'npx playwright';
407
+ const command = useNpx ? 'npx' : process.platform === 'win32' ? 'npx' : depCheck.playwrightPath;
408
+ const spawnArgs = useNpx ? ['playwright', ...args] : args;
409
+ onOutput(`Starting Playwright codegen...\n`);
410
+ onOutput(`Command: ${command} ${spawnArgs.join(' ')}\n\n`);
411
+ onOutput('Instructions:\n');
412
+ onOutput(' 1. Browser will open - interact with your app\n');
413
+ onOutput(' 2. Click, type, navigate as needed\n');
414
+ onOutput(' 3. Close the browser when done\n');
415
+ onOutput(' 4. Generated test will be saved to: ' + outputFile + '\n\n');
416
+ const childProcess = (0, child_process_1.spawn)(command, spawnArgs, {
417
+ cwd: (0, path_1.dirname)(outputFile),
418
+ stdio: ['pipe', 'pipe', 'pipe'],
419
+ shell: process.platform === 'win32',
420
+ env: {
421
+ ...process.env,
422
+ },
423
+ });
424
+ childProcess.stdout?.on('data', (data) => {
425
+ const text = data.toString();
426
+ output += text;
427
+ onOutput(text);
428
+ });
429
+ childProcess.stderr?.on('data', (data) => {
430
+ const text = data.toString();
431
+ output += text;
432
+ onOutput(text);
433
+ });
434
+ childProcess.on('close', (code) => {
435
+ const exitCode = code ?? 0;
436
+ resolve({
437
+ success: exitCode === 0,
438
+ exitCode,
439
+ output,
440
+ });
441
+ });
442
+ childProcess.on('error', (err) => {
443
+ const errorMsg = `Failed to spawn Playwright codegen: ${err.message}`;
444
+ output += errorMsg;
445
+ onOutput(errorMsg + '\n');
446
+ resolve({
447
+ success: false,
448
+ exitCode: 1,
449
+ output,
450
+ });
451
+ });
452
+ });
453
+ }
454
+ //# sourceMappingURL=reality-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reality-runner.js","sourceRoot":"","sources":["../../src/reality/reality-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Enterprise Auth Utilities
3
+ * - Key masking for secure display
4
+ * - Expiry warning calculations
5
+ * - Cache validity checks
6
+ */
7
+ /**
8
+ * Mask an API key for secure display
9
+ * Keeps prefix and last 4 characters: gr_pro_****abcd
10
+ */
11
+ export declare function maskApiKey(apiKey: string): string;
12
+ /**
13
+ * Calculate hours until expiry
14
+ * Returns null if no expiry or already expired
15
+ */
16
+ export declare function hoursUntilExpiry(expiresAt: string | undefined): number | null;
17
+ /**
18
+ * Check if expiry is within warning threshold (72 hours)
19
+ */
20
+ export declare function isExpiryWarning(expiresAt: string | undefined, thresholdHours?: number): boolean;
21
+ /**
22
+ * Format expiry for display
23
+ */
24
+ export declare function formatExpiry(expiresAt: string | undefined): string;
25
+ /**
26
+ * Check if cached entitlements should be reused
27
+ * Returns true if cache is valid and has > 5 minutes remaining
28
+ */
29
+ export declare function shouldUseCachedEntitlements(expiresAt: string | undefined): boolean;
30
+ /**
31
+ * Get client metadata for API requests
32
+ */
33
+ export declare function getClientMetadata(): {
34
+ version: string;
35
+ os: string;
36
+ arch: string;
37
+ };
38
+ /**
39
+ * Validate API key format
40
+ * Returns error message or null if valid
41
+ */
42
+ export declare function validateApiKeyFormat(apiKey: string): string | null;
43
+ //# sourceMappingURL=auth-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-utils.d.ts","sourceRoot":"","sources":["../../src/runtime/auth-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAkBjD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAU7E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,GAAE,MAAW,GAAG,OAAO,CAInG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAYlE;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAQlF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAcjF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBlE"}