opencastle 0.27.0 → 0.27.2

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 (242) hide show
  1. package/bin/cli.mjs +6 -0
  2. package/dist/cli/agents.d.ts +3 -0
  3. package/dist/cli/agents.d.ts.map +1 -0
  4. package/dist/cli/agents.js +161 -0
  5. package/dist/cli/agents.js.map +1 -0
  6. package/dist/cli/baselines.d.ts +3 -0
  7. package/dist/cli/baselines.d.ts.map +1 -0
  8. package/dist/cli/baselines.js +128 -0
  9. package/dist/cli/baselines.js.map +1 -0
  10. package/dist/cli/convoy/dashboard-types.d.ts +146 -0
  11. package/dist/cli/convoy/dashboard-types.d.ts.map +1 -0
  12. package/dist/cli/convoy/dashboard-types.js +2 -0
  13. package/dist/cli/convoy/dashboard-types.js.map +1 -0
  14. package/dist/cli/convoy/engine.d.ts +67 -2
  15. package/dist/cli/convoy/engine.d.ts.map +1 -1
  16. package/dist/cli/convoy/engine.js +2036 -28
  17. package/dist/cli/convoy/engine.js.map +1 -1
  18. package/dist/cli/convoy/engine.test.js +1659 -70
  19. package/dist/cli/convoy/engine.test.js.map +1 -1
  20. package/dist/cli/convoy/event-schemas.d.ts +9 -0
  21. package/dist/cli/convoy/event-schemas.d.ts.map +1 -0
  22. package/dist/cli/convoy/event-schemas.js +185 -0
  23. package/dist/cli/convoy/event-schemas.js.map +1 -0
  24. package/dist/cli/convoy/events.d.ts +12 -1
  25. package/dist/cli/convoy/events.d.ts.map +1 -1
  26. package/dist/cli/convoy/events.js +186 -13
  27. package/dist/cli/convoy/events.js.map +1 -1
  28. package/dist/cli/convoy/events.test.js +325 -28
  29. package/dist/cli/convoy/events.test.js.map +1 -1
  30. package/dist/cli/convoy/expertise.d.ts +16 -0
  31. package/dist/cli/convoy/expertise.d.ts.map +1 -0
  32. package/dist/cli/convoy/expertise.js +121 -0
  33. package/dist/cli/convoy/expertise.js.map +1 -0
  34. package/dist/cli/convoy/expertise.test.d.ts +2 -0
  35. package/dist/cli/convoy/expertise.test.d.ts.map +1 -0
  36. package/dist/cli/convoy/expertise.test.js +96 -0
  37. package/dist/cli/convoy/expertise.test.js.map +1 -0
  38. package/dist/cli/convoy/export.test.js +1 -0
  39. package/dist/cli/convoy/export.test.js.map +1 -1
  40. package/dist/cli/convoy/formula.d.ts +19 -0
  41. package/dist/cli/convoy/formula.d.ts.map +1 -0
  42. package/dist/cli/convoy/formula.js +142 -0
  43. package/dist/cli/convoy/formula.js.map +1 -0
  44. package/dist/cli/convoy/formula.test.d.ts +2 -0
  45. package/dist/cli/convoy/formula.test.d.ts.map +1 -0
  46. package/dist/cli/convoy/formula.test.js +342 -0
  47. package/dist/cli/convoy/formula.test.js.map +1 -0
  48. package/dist/cli/convoy/gates.d.ts +128 -0
  49. package/dist/cli/convoy/gates.d.ts.map +1 -0
  50. package/dist/cli/convoy/gates.js +606 -0
  51. package/dist/cli/convoy/gates.js.map +1 -0
  52. package/dist/cli/convoy/gates.test.d.ts +2 -0
  53. package/dist/cli/convoy/gates.test.d.ts.map +1 -0
  54. package/dist/cli/convoy/gates.test.js +976 -0
  55. package/dist/cli/convoy/gates.test.js.map +1 -0
  56. package/dist/cli/convoy/health.d.ts +11 -0
  57. package/dist/cli/convoy/health.d.ts.map +1 -1
  58. package/dist/cli/convoy/health.js +54 -0
  59. package/dist/cli/convoy/health.js.map +1 -1
  60. package/dist/cli/convoy/health.test.js +56 -1
  61. package/dist/cli/convoy/health.test.js.map +1 -1
  62. package/dist/cli/convoy/issues.d.ts +8 -0
  63. package/dist/cli/convoy/issues.d.ts.map +1 -0
  64. package/dist/cli/convoy/issues.js +98 -0
  65. package/dist/cli/convoy/issues.js.map +1 -0
  66. package/dist/cli/convoy/issues.test.d.ts +2 -0
  67. package/dist/cli/convoy/issues.test.d.ts.map +1 -0
  68. package/dist/cli/convoy/issues.test.js +107 -0
  69. package/dist/cli/convoy/issues.test.js.map +1 -0
  70. package/dist/cli/convoy/knowledge.d.ts +5 -0
  71. package/dist/cli/convoy/knowledge.d.ts.map +1 -0
  72. package/dist/cli/convoy/knowledge.js +116 -0
  73. package/dist/cli/convoy/knowledge.js.map +1 -0
  74. package/dist/cli/convoy/knowledge.test.d.ts +2 -0
  75. package/dist/cli/convoy/knowledge.test.d.ts.map +1 -0
  76. package/dist/cli/convoy/knowledge.test.js +87 -0
  77. package/dist/cli/convoy/knowledge.test.js.map +1 -0
  78. package/dist/cli/convoy/lessons.d.ts +17 -0
  79. package/dist/cli/convoy/lessons.d.ts.map +1 -0
  80. package/dist/cli/convoy/lessons.js +149 -0
  81. package/dist/cli/convoy/lessons.js.map +1 -0
  82. package/dist/cli/convoy/lessons.test.d.ts +2 -0
  83. package/dist/cli/convoy/lessons.test.d.ts.map +1 -0
  84. package/dist/cli/convoy/lessons.test.js +135 -0
  85. package/dist/cli/convoy/lessons.test.js.map +1 -0
  86. package/dist/cli/convoy/lock.d.ts +13 -0
  87. package/dist/cli/convoy/lock.d.ts.map +1 -0
  88. package/dist/cli/convoy/lock.js +88 -0
  89. package/dist/cli/convoy/lock.js.map +1 -0
  90. package/dist/cli/convoy/lock.test.d.ts +2 -0
  91. package/dist/cli/convoy/lock.test.d.ts.map +1 -0
  92. package/dist/cli/convoy/lock.test.js +136 -0
  93. package/dist/cli/convoy/lock.test.js.map +1 -0
  94. package/dist/cli/convoy/log-merge.test.d.ts +2 -0
  95. package/dist/cli/convoy/log-merge.test.d.ts.map +1 -0
  96. package/dist/cli/convoy/log-merge.test.js +147 -0
  97. package/dist/cli/convoy/log-merge.test.js.map +1 -0
  98. package/dist/cli/convoy/merge.d.ts +4 -0
  99. package/dist/cli/convoy/merge.d.ts.map +1 -1
  100. package/dist/cli/convoy/merge.js +18 -1
  101. package/dist/cli/convoy/merge.js.map +1 -1
  102. package/dist/cli/convoy/merge.test.js +6 -7
  103. package/dist/cli/convoy/merge.test.js.map +1 -1
  104. package/dist/cli/convoy/partition.d.ts +51 -0
  105. package/dist/cli/convoy/partition.d.ts.map +1 -0
  106. package/dist/cli/convoy/partition.js +186 -0
  107. package/dist/cli/convoy/partition.js.map +1 -0
  108. package/dist/cli/convoy/partition.test.d.ts +2 -0
  109. package/dist/cli/convoy/partition.test.d.ts.map +1 -0
  110. package/dist/cli/convoy/partition.test.js +315 -0
  111. package/dist/cli/convoy/partition.test.js.map +1 -0
  112. package/dist/cli/convoy/pipeline.test.js +6 -0
  113. package/dist/cli/convoy/pipeline.test.js.map +1 -1
  114. package/dist/cli/convoy/store.d.ts +99 -7
  115. package/dist/cli/convoy/store.d.ts.map +1 -1
  116. package/dist/cli/convoy/store.js +764 -31
  117. package/dist/cli/convoy/store.js.map +1 -1
  118. package/dist/cli/convoy/store.test.js +1810 -18
  119. package/dist/cli/convoy/store.test.js.map +1 -1
  120. package/dist/cli/convoy/types.d.ts +427 -5
  121. package/dist/cli/convoy/types.d.ts.map +1 -1
  122. package/dist/cli/convoy/types.js +42 -1
  123. package/dist/cli/convoy/types.js.map +1 -1
  124. package/dist/cli/log.d.ts +11 -0
  125. package/dist/cli/log.d.ts.map +1 -1
  126. package/dist/cli/log.js +114 -2
  127. package/dist/cli/log.js.map +1 -1
  128. package/dist/cli/run/adapters/claude.d.ts +2 -0
  129. package/dist/cli/run/adapters/claude.d.ts.map +1 -1
  130. package/dist/cli/run/adapters/claude.js +89 -49
  131. package/dist/cli/run/adapters/claude.js.map +1 -1
  132. package/dist/cli/run/adapters/claude.test.d.ts +2 -0
  133. package/dist/cli/run/adapters/claude.test.d.ts.map +1 -0
  134. package/dist/cli/run/adapters/claude.test.js +205 -0
  135. package/dist/cli/run/adapters/claude.test.js.map +1 -0
  136. package/dist/cli/run/adapters/copilot.d.ts +1 -0
  137. package/dist/cli/run/adapters/copilot.d.ts.map +1 -1
  138. package/dist/cli/run/adapters/copilot.js +84 -46
  139. package/dist/cli/run/adapters/copilot.js.map +1 -1
  140. package/dist/cli/run/adapters/copilot.test.d.ts +2 -0
  141. package/dist/cli/run/adapters/copilot.test.d.ts.map +1 -0
  142. package/dist/cli/run/adapters/copilot.test.js +195 -0
  143. package/dist/cli/run/adapters/copilot.test.js.map +1 -0
  144. package/dist/cli/run/adapters/cursor.d.ts +1 -0
  145. package/dist/cli/run/adapters/cursor.d.ts.map +1 -1
  146. package/dist/cli/run/adapters/cursor.js +83 -47
  147. package/dist/cli/run/adapters/cursor.js.map +1 -1
  148. package/dist/cli/run/adapters/cursor.test.d.ts +2 -0
  149. package/dist/cli/run/adapters/cursor.test.d.ts.map +1 -0
  150. package/dist/cli/run/adapters/cursor.test.js +129 -0
  151. package/dist/cli/run/adapters/cursor.test.js.map +1 -0
  152. package/dist/cli/run/adapters/opencode.d.ts +1 -0
  153. package/dist/cli/run/adapters/opencode.d.ts.map +1 -1
  154. package/dist/cli/run/adapters/opencode.js +81 -47
  155. package/dist/cli/run/adapters/opencode.js.map +1 -1
  156. package/dist/cli/run/adapters/opencode.test.d.ts +2 -0
  157. package/dist/cli/run/adapters/opencode.test.d.ts.map +1 -0
  158. package/dist/cli/run/adapters/opencode.test.js +119 -0
  159. package/dist/cli/run/adapters/opencode.test.js.map +1 -0
  160. package/dist/cli/run/executor.js +1 -1
  161. package/dist/cli/run/executor.js.map +1 -1
  162. package/dist/cli/run/schema.d.ts.map +1 -1
  163. package/dist/cli/run/schema.js +245 -4
  164. package/dist/cli/run/schema.js.map +1 -1
  165. package/dist/cli/run/schema.test.js +669 -0
  166. package/dist/cli/run/schema.test.js.map +1 -1
  167. package/dist/cli/run.d.ts.map +1 -1
  168. package/dist/cli/run.js +362 -22
  169. package/dist/cli/run.js.map +1 -1
  170. package/dist/cli/types.d.ts +85 -2
  171. package/dist/cli/types.d.ts.map +1 -1
  172. package/dist/cli/types.js.map +1 -1
  173. package/dist/cli/watch.d.ts +15 -0
  174. package/dist/cli/watch.d.ts.map +1 -0
  175. package/dist/cli/watch.js +279 -0
  176. package/dist/cli/watch.js.map +1 -0
  177. package/package.json +5 -1
  178. package/src/cli/agents.ts +177 -0
  179. package/src/cli/baselines.ts +143 -0
  180. package/src/cli/convoy/TELEMETRY.md +203 -0
  181. package/src/cli/convoy/dashboard-types.ts +141 -0
  182. package/src/cli/convoy/engine.test.ts +1937 -70
  183. package/src/cli/convoy/engine.ts +2350 -40
  184. package/src/cli/convoy/event-schemas.ts +195 -0
  185. package/src/cli/convoy/events.test.ts +384 -39
  186. package/src/cli/convoy/events.ts +202 -16
  187. package/src/cli/convoy/expertise.test.ts +128 -0
  188. package/src/cli/convoy/expertise.ts +163 -0
  189. package/src/cli/convoy/export.test.ts +1 -0
  190. package/src/cli/convoy/formula.test.ts +405 -0
  191. package/src/cli/convoy/formula.ts +174 -0
  192. package/src/cli/convoy/gates.test.ts +1169 -0
  193. package/src/cli/convoy/gates.ts +774 -0
  194. package/src/cli/convoy/health.test.ts +64 -2
  195. package/src/cli/convoy/health.ts +80 -2
  196. package/src/cli/convoy/issues.test.ts +143 -0
  197. package/src/cli/convoy/issues.ts +136 -0
  198. package/src/cli/convoy/knowledge.test.ts +101 -0
  199. package/src/cli/convoy/knowledge.ts +132 -0
  200. package/src/cli/convoy/lessons.test.ts +188 -0
  201. package/src/cli/convoy/lessons.ts +164 -0
  202. package/src/cli/convoy/lock.test.ts +181 -0
  203. package/src/cli/convoy/lock.ts +103 -0
  204. package/src/cli/convoy/log-merge.test.ts +179 -0
  205. package/src/cli/convoy/merge.test.ts +6 -7
  206. package/src/cli/convoy/merge.ts +19 -1
  207. package/src/cli/convoy/partition.test.ts +423 -0
  208. package/src/cli/convoy/partition.ts +232 -0
  209. package/src/cli/convoy/pipeline.test.ts +6 -0
  210. package/src/cli/convoy/store.test.ts +2041 -20
  211. package/src/cli/convoy/store.ts +945 -46
  212. package/src/cli/convoy/types.ts +278 -4
  213. package/src/cli/log.ts +120 -2
  214. package/src/cli/run/adapters/claude.test.ts +234 -0
  215. package/src/cli/run/adapters/claude.ts +45 -5
  216. package/src/cli/run/adapters/copilot.test.ts +224 -0
  217. package/src/cli/run/adapters/copilot.ts +34 -4
  218. package/src/cli/run/adapters/cursor.test.ts +144 -0
  219. package/src/cli/run/adapters/cursor.ts +33 -2
  220. package/src/cli/run/adapters/opencode.test.ts +135 -0
  221. package/src/cli/run/adapters/opencode.ts +30 -2
  222. package/src/cli/run/executor.ts +1 -1
  223. package/src/cli/run/schema.test.ts +758 -0
  224. package/src/cli/run/schema.ts +300 -25
  225. package/src/cli/run.ts +341 -21
  226. package/src/cli/types.ts +86 -1
  227. package/src/cli/watch.ts +298 -0
  228. package/src/dashboard/dist/_astro/{index.DtnyD8a5.css → index.6L3_HsPT.css} +1 -1
  229. package/src/dashboard/dist/data/.gitkeep +0 -0
  230. package/src/dashboard/dist/data/convoy-list.json +1 -0
  231. package/src/dashboard/dist/data/overall-stats.json +24 -0
  232. package/src/dashboard/dist/index.html +701 -3
  233. package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
  234. package/src/dashboard/public/data/.gitkeep +0 -0
  235. package/src/dashboard/public/data/convoy-list.json +1 -0
  236. package/src/dashboard/public/data/overall-stats.json +24 -0
  237. package/src/dashboard/scripts/etl.test.ts +210 -0
  238. package/src/dashboard/scripts/etl.ts +108 -0
  239. package/src/dashboard/scripts/integration-test.ts +504 -0
  240. package/src/dashboard/src/pages/index.astro +854 -15
  241. package/src/dashboard/src/styles/dashboard.css +557 -1
  242. package/src/orchestrator/prompts/generate-convoy.prompt.md +212 -13
@@ -0,0 +1,606 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ import { inflateSync } from 'node:zlib';
6
+ import { parse as yamlParse } from 'yaml';
7
+ const SECRET_PATTERNS = [
8
+ { name: 'AWS Access Key', pattern: /AKIA[0-9A-Z]{16}/i },
9
+ {
10
+ name: 'AWS Secret Key',
11
+ // eslint-disable-next-line no-useless-escape
12
+ pattern: /(?:aws_secret_access_key|secret_key)\s*[=:]\s*[A-Za-z0-9\/+=]{40}/i,
13
+ },
14
+ {
15
+ name: 'Generic API Key',
16
+ pattern: /(?:api[_-]?key|apikey)\s*[=:]\s*['"]?[A-Za-z0-9_-]{20,}/i,
17
+ },
18
+ { name: 'Bearer Token', pattern: /[Bb]earer\s+[A-Za-z0-9\-._~+/]+=*/ },
19
+ { name: 'Private Key', pattern: /-----BEGIN (?:RSA|EC|OPENSSH) PRIVATE KEY-----/ },
20
+ {
21
+ name: 'Connection String',
22
+ // eslint-disable-next-line no-useless-escape
23
+ pattern: /(?:postgres|mysql|mongodb|redis):\/\/[^\s]+:[^\s]+@/,
24
+ },
25
+ { name: 'GitHub Token', pattern: /(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{36,}/ },
26
+ {
27
+ name: 'Generic Password',
28
+ pattern: /(?:password|passwd|pwd)\s*[=:]\s*['"]?[^\s'"]{8,}/i,
29
+ },
30
+ { name: 'Slack Token', pattern: /xox[bprs]-[A-Za-z0-9-]{10,}/i },
31
+ {
32
+ name: 'Generic Secret',
33
+ pattern: /(?:secret|token|credential)\s*[=:]\s*['"]?[A-Za-z0-9_-]{16,}/i,
34
+ },
35
+ ];
36
+ let _allowlist = null;
37
+ /** The config path used for the allowlist. Override for testing. */
38
+ export let _allowlistConfigPath = join(process.cwd(), '.opencastle', 'secret-scan-config.yml');
39
+ /** Reset the allowlist cache (for testing). */
40
+ export function _resetAllowlistCache() {
41
+ _allowlist = null;
42
+ }
43
+ /** Override the allowlist config path and reset cache (for testing). */
44
+ export function _setAllowlistConfigPath(path) {
45
+ _allowlistConfigPath = path;
46
+ _allowlist = null;
47
+ }
48
+ function loadAllowlist() {
49
+ if (_allowlist !== null)
50
+ return _allowlist;
51
+ try {
52
+ if (!existsSync(_allowlistConfigPath)) {
53
+ _allowlist = [];
54
+ return _allowlist;
55
+ }
56
+ const content = readFileSync(_allowlistConfigPath, 'utf-8');
57
+ const parsed = yamlParse(content);
58
+ if (!parsed || !Array.isArray(parsed['allowlist'])) {
59
+ _allowlist = [];
60
+ return _allowlist;
61
+ }
62
+ _allowlist = parsed['allowlist'];
63
+ return _allowlist;
64
+ }
65
+ catch {
66
+ _allowlist = [];
67
+ return _allowlist;
68
+ }
69
+ }
70
+ function isSuppressed(finding, filePath, allowlist) {
71
+ for (const entry of allowlist) {
72
+ if (entry.paths && entry.paths.length > 0) {
73
+ if (!entry.paths.some((p) => filePath.includes(p)))
74
+ continue;
75
+ }
76
+ if (entry.literal) {
77
+ if (finding.snippet.includes(entry.literal))
78
+ return true;
79
+ }
80
+ else if (entry.pattern) {
81
+ try {
82
+ if (new RegExp(entry.pattern, 'i').test(finding.snippet))
83
+ return true;
84
+ }
85
+ catch {
86
+ // Invalid regex in allowlist — skip entry
87
+ }
88
+ }
89
+ }
90
+ return false;
91
+ }
92
+ // ── scanForSecrets ────────────────────────────────────────────────────────────
93
+ /**
94
+ * Scan text content line-by-line for secrets using the default pattern set.
95
+ * Allowlist entries in `.opencastle/secret-scan-config.yml` suppress false positives.
96
+ */
97
+ export function scanForSecrets(content, filePath = '') {
98
+ const allowlist = loadAllowlist();
99
+ const lines = content.split('\n');
100
+ const findings = [];
101
+ for (let i = 0; i < lines.length; i++) {
102
+ const line = lines[i];
103
+ for (const { name, pattern } of SECRET_PATTERNS) {
104
+ if (pattern.test(line)) {
105
+ const snippet = line.length > 100 ? line.slice(0, 97) + '...' : line;
106
+ const finding = { pattern: name, file: filePath, line: i + 1, snippet };
107
+ if (!isSuppressed(finding, filePath, allowlist)) {
108
+ findings.push(finding);
109
+ }
110
+ // Only report the first matching pattern per line
111
+ break;
112
+ }
113
+ }
114
+ }
115
+ return { clean: findings.length === 0, findings };
116
+ }
117
+ // ── withSecretScan ────────────────────────────────────────────────────────────
118
+ /**
119
+ * Guard a write action with a secret scan.
120
+ * Calls `writeAction` if content is clean; calls `onBlock` with findings otherwise.
121
+ */
122
+ export function withSecretScan(content, writeAction, onBlock) {
123
+ const result = scanForSecrets(content);
124
+ if (result.clean) {
125
+ writeAction();
126
+ }
127
+ else {
128
+ onBlock(result.findings);
129
+ }
130
+ }
131
+ /**
132
+ * Run a shell command with SIGTERM → SIGKILL timeout escalation.
133
+ * On timeout: sends SIGTERM immediately, then SIGKILL after 5 s if still running.
134
+ */
135
+ export function runGateCommand(command, args, cwd, timeoutMs = 300_000) {
136
+ return new Promise((resolve) => {
137
+ const child = spawn(command, args, { cwd, stdio: 'pipe' });
138
+ let stdout = '';
139
+ let stderr = '';
140
+ let settled = false;
141
+ let timedOut = false;
142
+ let sigkillTimer = null;
143
+ child.stdout?.on('data', (d) => {
144
+ stdout += d.toString();
145
+ });
146
+ child.stderr?.on('data', (d) => {
147
+ stderr += d.toString();
148
+ });
149
+ const timer = setTimeout(() => {
150
+ if (settled)
151
+ return;
152
+ timedOut = true;
153
+ child.kill('SIGTERM');
154
+ sigkillTimer = setTimeout(() => {
155
+ if (!settled)
156
+ child.kill('SIGKILL');
157
+ }, 5_000);
158
+ }, timeoutMs);
159
+ function settle(exitCode) {
160
+ if (settled)
161
+ return;
162
+ settled = true;
163
+ clearTimeout(timer);
164
+ if (sigkillTimer !== null)
165
+ clearTimeout(sigkillTimer);
166
+ resolve({ stdout, stderr, exitCode, timedOut });
167
+ }
168
+ child.on('close', (code) => settle(code ?? -1));
169
+ child.on('error', () => settle(-1));
170
+ });
171
+ }
172
+ // ── runSecretScanGate ─────────────────────────────────────────────────────────
173
+ /** Scan a list of changed files in the worktree for secrets. */
174
+ export async function runSecretScanGate(changedFiles, worktreePath) {
175
+ const allFindings = [];
176
+ for (const relPath of changedFiles) {
177
+ const fullPath = join(worktreePath, relPath);
178
+ let content;
179
+ try {
180
+ content = await readFile(fullPath, 'utf-8');
181
+ }
182
+ catch {
183
+ continue; // Skip unreadable files (deleted, binary, etc.)
184
+ }
185
+ const result = scanForSecrets(content, relPath);
186
+ allFindings.push(...result.findings);
187
+ }
188
+ if (allFindings.length === 0) {
189
+ return { passed: true, output: `Secret scan: clean (${changedFiles.length} files scanned)` };
190
+ }
191
+ const lines = allFindings.map((f) => ` [${f.pattern}] ${f.file}:${f.line}: ${f.snippet}`);
192
+ return {
193
+ passed: false,
194
+ output: `Secret scan: ${allFindings.length} finding(s) detected\n${lines.join('\n')}`,
195
+ };
196
+ }
197
+ // ── runBlastRadiusGate ────────────────────────────────────────────────────────
198
+ /**
199
+ * Analyze a git diff for blast radius.
200
+ * WARN at 200+ lines OR 5+ files; BLOCK at 500+ lines OR 10+ files.
201
+ */
202
+ export function runBlastRadiusGate(diff) {
203
+ const diffLines = diff.split('\n');
204
+ let linesChanged = 0;
205
+ let filesChanged = 0;
206
+ for (const line of diffLines) {
207
+ if (line.startsWith('diff --git ')) {
208
+ filesChanged++;
209
+ }
210
+ else if ((line.startsWith('+') && !line.startsWith('+++')) ||
211
+ (line.startsWith('-') && !line.startsWith('---'))) {
212
+ linesChanged++;
213
+ }
214
+ }
215
+ const summary = `Blast radius: ${linesChanged} lines changed, ${filesChanged} files changed`;
216
+ if (linesChanged >= 500 || filesChanged >= 10) {
217
+ return {
218
+ passed: false,
219
+ output: `${summary} — exceeds BLOCK threshold (500+ lines or 10+ files)`,
220
+ level: 'block',
221
+ };
222
+ }
223
+ if (linesChanged >= 200 || filesChanged >= 5) {
224
+ return {
225
+ passed: true,
226
+ output: `${summary} — exceeds WARN threshold (200+ lines or 5+ files)`,
227
+ level: 'warn',
228
+ };
229
+ }
230
+ return { passed: true, output: `${summary} — within acceptable limits`, level: 'ok' };
231
+ }
232
+ // ── runDependencyAuditGate ────────────────────────────────────────────────────
233
+ /** Run npm audit in the worktree to detect high/critical vulnerabilities. */
234
+ export async function runDependencyAuditGate(worktreePath) {
235
+ const result = await runGateCommand('npm', ['audit', '--json'], worktreePath, 300_000);
236
+ if (result.exitCode === 0) {
237
+ return { passed: true, output: 'Dependency audit: no vulnerabilities found' };
238
+ }
239
+ try {
240
+ const auditData = JSON.parse(result.stdout);
241
+ const vulns = auditData.metadata?.vulnerabilities;
242
+ if (vulns) {
243
+ const critical = vulns.critical ?? 0;
244
+ const high = vulns.high ?? 0;
245
+ if (critical > 0 || high > 0) {
246
+ return {
247
+ passed: false,
248
+ output: `Dependency audit failed: ${critical} critical, ${high} high vulnerabilities\n${result.stdout}`,
249
+ };
250
+ }
251
+ }
252
+ }
253
+ catch {
254
+ // Fall through if JSON parse fails
255
+ }
256
+ return {
257
+ passed: false,
258
+ output: `Dependency audit failed (exit ${result.exitCode}):\n${result.stderr || result.stdout}`,
259
+ };
260
+ }
261
+ // ── runRegressionTestGate ─────────────────────────────────────────────────────
262
+ /** Run the test suite in the worktree directory. */
263
+ export async function runRegressionTestGate(worktreePath, testCommand = 'npm test') {
264
+ const parts = testCommand.split(' ');
265
+ const cmd = parts[0];
266
+ const args = parts.slice(1);
267
+ const result = await runGateCommand(cmd, args, worktreePath, 300_000);
268
+ if (result.exitCode === 0) {
269
+ return { passed: true, output: `Regression test passed\n${result.stdout}` };
270
+ }
271
+ return {
272
+ passed: false,
273
+ output: `Regression test failed (exit ${result.exitCode}):\n${result.stderr || result.stdout}`,
274
+ };
275
+ }
276
+ // ── PNG pixel diff ───────────────────────────────────────────────────────────
277
+ function parsePngDimensions(buf) {
278
+ if (buf.length < 29)
279
+ return null;
280
+ const sig = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
281
+ for (let i = 0; i < 8; i++) {
282
+ if (buf[i] !== sig[i])
283
+ return null;
284
+ }
285
+ const chunkType = buf.slice(12, 16).toString('ascii');
286
+ if (chunkType !== 'IHDR')
287
+ return null;
288
+ const width = buf.readUInt32BE(16);
289
+ const height = buf.readUInt32BE(20);
290
+ const colorType = buf[25];
291
+ return { width, height, colorType };
292
+ }
293
+ function collectIdatData(buf) {
294
+ const chunks = [];
295
+ let offset = 8;
296
+ while (offset + 12 <= buf.length) {
297
+ const length = buf.readUInt32BE(offset);
298
+ const type = buf.slice(offset + 4, offset + 8).toString('ascii');
299
+ if (type === 'IEND')
300
+ break;
301
+ if (type === 'IDAT') {
302
+ chunks.push(buf.slice(offset + 8, offset + 8 + length));
303
+ }
304
+ offset += 8 + length + 4;
305
+ }
306
+ return Buffer.concat(chunks);
307
+ }
308
+ function bytesPerPixelForColorType(colorType) {
309
+ switch (colorType) {
310
+ case 0: return 1;
311
+ case 2: return 3;
312
+ case 3: return 1;
313
+ case 4: return 2;
314
+ case 6: return 4;
315
+ default: return 4;
316
+ }
317
+ }
318
+ /**
319
+ * Compare two PNG buffers pixel-by-pixel and return the fraction (0–1) of differing pixels.
320
+ * Returns 1.0 if dimensions differ, buffers are invalid, or an error occurs.
321
+ */
322
+ export function pixelDiffPercentage(baselineBuffer, currentBuffer) {
323
+ try {
324
+ const baseDims = parsePngDimensions(baselineBuffer);
325
+ const currDims = parsePngDimensions(currentBuffer);
326
+ if (!baseDims || !currDims)
327
+ return 1.0;
328
+ if (baseDims.width !== currDims.width || baseDims.height !== currDims.height)
329
+ return 1.0;
330
+ const { width, height, colorType } = baseDims;
331
+ const totalPixels = width * height;
332
+ if (totalPixels === 0)
333
+ return 0;
334
+ const baseIdat = collectIdatData(baselineBuffer);
335
+ const currIdat = collectIdatData(currentBuffer);
336
+ const baseRaw = inflateSync(baseIdat);
337
+ const currRaw = inflateSync(currIdat);
338
+ const bpp = bytesPerPixelForColorType(colorType);
339
+ const rowBytes = 1 + width * bpp;
340
+ let diffPixels = 0;
341
+ for (let row = 0; row < height; row++) {
342
+ const rowOffset = row * rowBytes;
343
+ for (let col = 0; col < width; col++) {
344
+ const pixelOffset = rowOffset + 1 + col * bpp;
345
+ let differs = false;
346
+ for (let channel = 0; channel < bpp; channel++) {
347
+ const base = baseRaw[pixelOffset + channel] ?? 0;
348
+ const curr = currRaw[pixelOffset + channel] ?? 0;
349
+ if (Math.abs(base - curr) > 5) {
350
+ differs = true;
351
+ break;
352
+ }
353
+ }
354
+ if (differs)
355
+ diffPixels++;
356
+ }
357
+ }
358
+ return diffPixels / totalPixels;
359
+ }
360
+ catch {
361
+ return 1.0;
362
+ }
363
+ }
364
+ /** Compare a screenshot buffer against a saved baseline PNG. */
365
+ export async function computeVisualDiff(context) {
366
+ const { screenshotBuffer, baselinePath, threshold } = context;
367
+ if (!existsSync(baselinePath)) {
368
+ return { passed: true, diffPercent: 0, output: 'No baseline found — skipping visual diff' };
369
+ }
370
+ const scanResult = scanForSecrets(screenshotBuffer.toString('base64'), 'screenshot');
371
+ if (!scanResult.clean) {
372
+ return {
373
+ passed: false,
374
+ diffPercent: 1.0,
375
+ output: 'Screenshot scan: potential secrets detected in screenshot data',
376
+ };
377
+ }
378
+ const baselineBuffer = readFileSync(baselinePath);
379
+ const diffPercent = pixelDiffPercentage(baselineBuffer, screenshotBuffer);
380
+ const passed = diffPercent <= threshold;
381
+ return {
382
+ passed,
383
+ diffPercent,
384
+ output: passed
385
+ ? `Visual diff: PASS (${(diffPercent * 100).toFixed(2)}% diff, threshold: ${(threshold * 100).toFixed(2)}%)`
386
+ : `Visual diff: FAIL (${(diffPercent * 100).toFixed(2)}% diff exceeds threshold: ${(threshold * 100).toFixed(2)}%)`,
387
+ };
388
+ }
389
+ /**
390
+ * Persist a screenshot buffer as a PNG baseline file.
391
+ * Secret-scans the buffer (as base64) before writing.
392
+ */
393
+ export function captureAndPersistBaseline(screenshotBuffer, slug, basePath = '.opencastle/baselines') {
394
+ const scanResult = scanForSecrets(screenshotBuffer.toString('base64'), 'screenshot');
395
+ if (!scanResult.clean) {
396
+ return { persisted: false, reason: 'secrets_detected' };
397
+ }
398
+ mkdirSync(basePath, { recursive: true });
399
+ writeFileSync(join(basePath, `${slug}.png`), screenshotBuffer);
400
+ return { persisted: true };
401
+ }
402
+ const A11Y_SEVERITY_RANK = {
403
+ critical: 4,
404
+ serious: 3,
405
+ moderate: 2,
406
+ minor: 1,
407
+ };
408
+ /**
409
+ * Map a list of a11y findings against a severity threshold.
410
+ * Returns passed:false if any finding meets or exceeds the threshold.
411
+ */
412
+ export function mapA11ySeverity(findings, threshold) {
413
+ const thresholdRank = A11Y_SEVERITY_RANK[threshold];
414
+ const failing = findings.filter((f) => A11Y_SEVERITY_RANK[f.impact] >= thresholdRank);
415
+ if (failing.length === 0) {
416
+ return {
417
+ passed: true,
418
+ output: `A11y audit: PASS (0 findings at or above ${threshold} severity)`,
419
+ findings: [],
420
+ };
421
+ }
422
+ const countBySeverity = {};
423
+ for (const f of failing) {
424
+ countBySeverity[f.impact] = (countBySeverity[f.impact] ?? 0) + 1;
425
+ }
426
+ const countSummary = Object.entries(countBySeverity)
427
+ .map(([k, v]) => `${v} ${k}`)
428
+ .join(', ');
429
+ const descriptions = failing
430
+ .map((f) => ` [${f.impact}] ${f.id}: ${f.description.slice(0, 200)}`)
431
+ .join('\n');
432
+ return {
433
+ passed: false,
434
+ output: `A11y audit: FAIL (${countSummary})\n${descriptions}`,
435
+ findings: failing,
436
+ };
437
+ }
438
+ /** Run an a11y audit via a browser-capable MCP server. */
439
+ export async function runA11yAudit(context) {
440
+ const { mcpServers, url, severityThreshold } = context;
441
+ if (!isLocalUrl(url)) {
442
+ return {
443
+ passed: false,
444
+ output: `A11y audit blocked: URL "${url}" is not a local address. Only localhost/127.0.0.1/[::1] URLs are allowed.`,
445
+ findings: [],
446
+ };
447
+ }
448
+ const browserServer = mcpServers.find((s) => /browser|chrome|playwright|devtools/i.test(s.name) ||
449
+ /browser|chrome|playwright|devtools/i.test(s.type));
450
+ if (!browserServer?.command) {
451
+ return {
452
+ passed: false,
453
+ output: 'A11y audit: no browser-capable MCP server found',
454
+ findings: [],
455
+ };
456
+ }
457
+ const result = await runGateCommand(browserServer.command, [...(browserServer.args ?? []), '--a11y-audit', '--urls', url], process.cwd(), 60_000);
458
+ const scanResult = scanForSecrets(result.stdout, 'a11y-audit-output');
459
+ if (!scanResult.clean) {
460
+ return {
461
+ passed: false,
462
+ output: 'A11y audit: output contained potential secrets (redacted)',
463
+ findings: [],
464
+ };
465
+ }
466
+ let findings = [];
467
+ try {
468
+ findings = JSON.parse(result.stdout);
469
+ }
470
+ catch {
471
+ return {
472
+ passed: result.exitCode === 0,
473
+ output: result.exitCode === 0
474
+ ? 'A11y audit: PASS (no structured output)'
475
+ : `A11y audit: failed to parse output (exit ${result.exitCode}): ${result.stderr || result.stdout}`,
476
+ findings: [],
477
+ };
478
+ }
479
+ return mapA11ySeverity(findings, severityThreshold);
480
+ }
481
+ // ── browserTestGate ───────────────────────────────────────────────────────────
482
+ /**
483
+ * Validate that a URL points to localhost/127.0.0.1/[::1] only.
484
+ * Prevents SSRF by rejecting any external addresses.
485
+ */
486
+ function isLocalUrl(url) {
487
+ try {
488
+ const parsed = new URL(url);
489
+ const host = parsed.hostname;
490
+ return host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '[::1]';
491
+ }
492
+ catch {
493
+ return false;
494
+ }
495
+ }
496
+ /**
497
+ * Run browser-based tests against localhost URLs using an MCP browser server.
498
+ * All URLs are validated to be local addresses (SSRF prevention).
499
+ */
500
+ export async function browserTestGate(context) {
501
+ const { mcpServers, taskConfig, worktreePath } = context;
502
+ const results = [];
503
+ let allPassed = true;
504
+ // Validate URLs — only allow localhost to prevent SSRF
505
+ for (const url of taskConfig.urls) {
506
+ if (!isLocalUrl(url)) {
507
+ return {
508
+ passed: false,
509
+ output: `Browser test gate blocked: URL "${url}" is not a local address. Only localhost/127.0.0.1/[::1] URLs are allowed.`,
510
+ };
511
+ }
512
+ }
513
+ // Find browser-capable MCP server
514
+ const browserServer = mcpServers.find((s) => /browser|chrome|playwright|devtools/i.test(s.name) ||
515
+ /browser|chrome|playwright|devtools/i.test(s.type));
516
+ if (!browserServer) {
517
+ return {
518
+ passed: false,
519
+ output: 'Browser test gate: no browser-capable MCP server found in defaults.mcp_servers',
520
+ };
521
+ }
522
+ // Test each URL via curl
523
+ for (const url of taskConfig.urls) {
524
+ const curlResult = await runGateCommand('curl', ['-sS', '-o', '/dev/null', '-w', '%{http_code}', '--max-time', '30', url], worktreePath, 35_000);
525
+ if (curlResult.timedOut) {
526
+ allPassed = false;
527
+ results.push(` \u2717 ${url}: timed out`);
528
+ }
529
+ else {
530
+ const statusCode = parseInt(curlResult.stdout.trim(), 10);
531
+ if (isNaN(statusCode) || statusCode >= 400) {
532
+ allPassed = false;
533
+ results.push(` \u2717 ${url}: HTTP ${curlResult.stdout.trim() || 'error'} (exit ${curlResult.exitCode})`);
534
+ }
535
+ else {
536
+ results.push(` \u2713 ${url}: HTTP ${statusCode}`);
537
+ }
538
+ }
539
+ }
540
+ // If browser MCP server has a command, attempt browser automation
541
+ if (browserServer.command) {
542
+ const browserArgs = [...(browserServer.args ?? []), '--urls', ...taskConfig.urls];
543
+ if (taskConfig.check_console_errors)
544
+ browserArgs.push('--check-console-errors');
545
+ const timeoutMs = (context.approvalTimeout ?? 60) * 1000;
546
+ const browserResult = await runGateCommand(browserServer.command, browserArgs, worktreePath, timeoutMs);
547
+ if (browserResult.exitCode !== 0) {
548
+ allPassed = false;
549
+ results.push(` Browser automation failed (exit ${browserResult.exitCode}): ${browserResult.stderr || browserResult.stdout}`);
550
+ }
551
+ else {
552
+ const scanResult = scanForSecrets(browserResult.stdout, 'browser-test-output');
553
+ if (!scanResult.clean) {
554
+ results.push(` \u26a0 Browser output contained potential secrets (redacted)`);
555
+ }
556
+ else {
557
+ results.push(` Browser automation passed`);
558
+ if (taskConfig.check_console_errors && browserResult.stdout.includes('[console.error]')) {
559
+ allPassed = false;
560
+ results.push(` \u2717 Console errors detected in browser output`);
561
+ }
562
+ }
563
+ }
564
+ }
565
+ // Visual diff check (if visual_diff_threshold is set and browser server has a command)
566
+ if (taskConfig.visual_diff_threshold !== undefined && browserServer?.command) {
567
+ const baselinesDir = join(worktreePath, taskConfig.baselines_dir ?? '.opencastle/baselines');
568
+ for (const url of taskConfig.urls) {
569
+ const slug = url.replace(/[^a-zA-Z0-9]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');
570
+ const ssResult = await runGateCommand(browserServer.command, [...(browserServer.args ?? []), '--screenshot', '--urls', url], worktreePath, (context.approvalTimeout ?? 60) * 1000);
571
+ if (ssResult.exitCode !== 0) {
572
+ allPassed = false;
573
+ results.push(` Visual diff ${url}: screenshot failed (exit ${ssResult.exitCode})`);
574
+ continue;
575
+ }
576
+ const screenshotBuffer = Buffer.from(ssResult.stdout);
577
+ const baselinePath = join(baselinesDir, `${slug}.png`);
578
+ const diffResult = await computeVisualDiff({
579
+ screenshotBuffer,
580
+ baselinePath,
581
+ threshold: taskConfig.visual_diff_threshold,
582
+ });
583
+ results.push(` Visual diff ${url}: ${diffResult.output}`);
584
+ if (!diffResult.passed)
585
+ allPassed = false;
586
+ }
587
+ }
588
+ // A11y audit (if a11y is enabled)
589
+ if (taskConfig.a11y) {
590
+ for (const url of taskConfig.urls) {
591
+ const a11yResult = await runA11yAudit({
592
+ mcpServers,
593
+ url,
594
+ severityThreshold: taskConfig.severity_threshold ?? 'serious',
595
+ });
596
+ results.push(` A11y ${url}: ${a11yResult.output}`);
597
+ if (!a11yResult.passed)
598
+ allPassed = false;
599
+ }
600
+ }
601
+ return {
602
+ passed: allPassed,
603
+ output: `Browser test gate: ${allPassed ? 'PASS' : 'FAIL'}\n${results.join('\n')}`,
604
+ };
605
+ }
606
+ //# sourceMappingURL=gates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gates.js","sourceRoot":"","sources":["../../../src/cli/convoy/gates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gates.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gates.test.d.ts","sourceRoot":"","sources":["../../../src/cli/convoy/gates.test.ts"],"names":[],"mappings":""}