@agents-forge/aiqa 1.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 (43) hide show
  1. package/CLAUDE.md +112 -0
  2. package/README.md +281 -0
  3. package/dist/agent.d.ts +41 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +485 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/cli.d.ts +13 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +195 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/config.d.ts +59 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +53 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/index.d.ts +18 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +15 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/session.d.ts +50 -0
  20. package/dist/session.d.ts.map +1 -0
  21. package/dist/session.js +99 -0
  22. package/dist/session.js.map +1 -0
  23. package/dist/subagents/analyst.d.ts +3 -0
  24. package/dist/subagents/analyst.d.ts.map +1 -0
  25. package/dist/subagents/analyst.js +96 -0
  26. package/dist/subagents/analyst.js.map +1 -0
  27. package/dist/subagents/qa-engineer.d.ts +4 -0
  28. package/dist/subagents/qa-engineer.d.ts.map +1 -0
  29. package/dist/subagents/qa-engineer.js +139 -0
  30. package/dist/subagents/qa-engineer.js.map +1 -0
  31. package/dist/subagents/qa-planner.d.ts +3 -0
  32. package/dist/subagents/qa-planner.d.ts.map +1 -0
  33. package/dist/subagents/qa-planner.js +69 -0
  34. package/dist/subagents/qa-planner.js.map +1 -0
  35. package/dist/subagents/qa-reporter.d.ts +4 -0
  36. package/dist/subagents/qa-reporter.d.ts.map +1 -0
  37. package/dist/subagents/qa-reporter.js +94 -0
  38. package/dist/subagents/qa-reporter.js.map +1 -0
  39. package/dist/subagents/qa-reviewer.d.ts +3 -0
  40. package/dist/subagents/qa-reviewer.d.ts.map +1 -0
  41. package/dist/subagents/qa-reviewer.js +97 -0
  42. package/dist/subagents/qa-reviewer.js.map +1 -0
  43. package/package.json +65 -0
package/dist/agent.js ADDED
@@ -0,0 +1,485 @@
1
+ import { query } from "@anthropic-ai/claude-agent-sdk";
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ import * as readline from "node:readline/promises";
5
+ import { execSync } from "child_process";
6
+ import { SessionManager } from "./session.js";
7
+ import { resolvePaths } from "./config.js";
8
+ import { buildAnalystPrompt } from "./subagents/analyst.js";
9
+ import { buildQAPlannerPrompt } from "./subagents/qa-planner.js";
10
+ import { buildQAEngineerPrompt } from "./subagents/qa-engineer.js";
11
+ import { buildQAReviewerPrompt } from "./subagents/qa-reviewer.js";
12
+ import { buildQAReporterPrompt } from "./subagents/qa-reporter.js";
13
+ // ─── Provider detection ───────────────────────────────────────────────────────
14
+ export function detectProvider() {
15
+ if (process.env.ANTHROPIC_API_KEY || process.env.ANTHROPIC_AUTH_TOKEN)
16
+ return "anthropic";
17
+ try {
18
+ execSync("claude --version", { stdio: "ignore" });
19
+ return "anthropic";
20
+ }
21
+ catch { }
22
+ try {
23
+ const token = execSync("gh auth token", { stdio: ["ignore", "pipe", "ignore"] }).toString().trim();
24
+ if (token)
25
+ return "copilot";
26
+ }
27
+ catch { }
28
+ return "anthropic";
29
+ }
30
+ // ─── Playwright CLI check ─────────────────────────────────────────────────────
31
+ function checkPlaywrightCLI() {
32
+ try {
33
+ execSync("playwright-cli --version", { stdio: "ignore" });
34
+ return true;
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ }
40
+ function ensurePlaywrightSkills(cwd) {
41
+ const skillsPath = path.join(cwd, ".playwright-cli");
42
+ if (!fs.existsSync(skillsPath)) {
43
+ try {
44
+ console.log("📚 Installing playwright-cli skills...");
45
+ execSync("playwright-cli install --skills", { cwd, stdio: "inherit" });
46
+ }
47
+ catch {
48
+ console.log("⚠️ Could not install playwright-cli skills — continuing");
49
+ }
50
+ }
51
+ }
52
+ // ─── Step / snapshot bookkeeping ──────────────────────────────────────────────
53
+ const PIPELINE_STEPS = [
54
+ "analyst",
55
+ "qa-planner",
56
+ "qa-engineer",
57
+ "qa-reviewer",
58
+ "qa-reporter",
59
+ ];
60
+ /**
61
+ * A step is "done" iff its output artifact actually exists on disk.
62
+ * This is far more reliable than matching streamed model text.
63
+ */
64
+ function stepOutputExists(step, session) {
65
+ const o = session.outputs;
66
+ switch (step) {
67
+ case "analyst":
68
+ return fs.existsSync(o.requirements);
69
+ case "qa-planner":
70
+ return fs.existsSync(o.testPlan);
71
+ case "qa-engineer":
72
+ return fs.existsSync(o.specsDir) &&
73
+ fs.readdirSync(o.specsDir).some((f) => f.endsWith(".spec.ts"));
74
+ case "qa-reviewer":
75
+ return fs.existsSync(o.reviewReport);
76
+ case "qa-reporter":
77
+ return fs.existsSync(o.summaryReport);
78
+ default:
79
+ return false;
80
+ }
81
+ }
82
+ /** Scan the snapshots dir and register every .yml into the session. */
83
+ function registerSnapshotsFromDisk(sessionMgr) {
84
+ const dir = sessionMgr.get().outputs.snapshotsDir;
85
+ if (!fs.existsSync(dir))
86
+ return;
87
+ for (const file of fs.readdirSync(dir)) {
88
+ if (file.endsWith(".yml")) {
89
+ const page = path.basename(file, ".yml");
90
+ sessionMgr.addSnapshot(page, "", path.join(dir, file));
91
+ }
92
+ }
93
+ }
94
+ // ─── playwright.config.ts overwrite guard ─────────────────────────────────────
95
+ const GUARDED_FILE = "playwright.config.ts";
96
+ /** Prompt y/N on the terminal. Non-interactive (no TTY) returns false. */
97
+ async function confirm(question) {
98
+ if (!process.stdin.isTTY)
99
+ return false;
100
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
101
+ try {
102
+ const ans = (await rl.question(question)).trim().toLowerCase();
103
+ return ans === "y" || ans === "yes";
104
+ }
105
+ finally {
106
+ rl.close();
107
+ }
108
+ }
109
+ /**
110
+ * Decide upfront whether an existing playwright.config.ts must be protected.
111
+ * We can't intercept the agent's write mid-stream (canUseTool only works in the
112
+ * SDK's streaming-input mode, not with a string prompt), so instead we ask once,
113
+ * before the run, and tell the agent not to touch the file.
114
+ *
115
+ * Returns true when the existing config must be left untouched.
116
+ */
117
+ async function decideConfigProtection(workingDir, force) {
118
+ const configPath = path.join(workingDir, GUARDED_FILE);
119
+ if (!fs.existsSync(configPath))
120
+ return false; // nothing to protect
121
+ if (force) {
122
+ console.log(`⚠️ Existing ${GUARDED_FILE} may be overwritten (--force).`);
123
+ return false;
124
+ }
125
+ console.log(`\n⚠️ An existing ${GUARDED_FILE} was found in this project:`);
126
+ console.log(` ${configPath}`);
127
+ const overwrite = await confirm(` Allow AIQA to overwrite it during this run? [y/N] `);
128
+ if (overwrite) {
129
+ console.log(` → It may be regenerated.\n`);
130
+ return false;
131
+ }
132
+ console.log(` → Keeping your existing ${GUARDED_FILE}; AIQA will use it as-is.\n`);
133
+ return true;
134
+ }
135
+ /** Concise one-line progress label for a tool call, shown live during the run. */
136
+ function formatToolProgress(name, input, workingDir) {
137
+ const rel = (p) => {
138
+ const s = String(p ?? "");
139
+ try {
140
+ return path.relative(workingDir, s) || s;
141
+ }
142
+ catch {
143
+ return s;
144
+ }
145
+ };
146
+ switch (name) {
147
+ case "Bash": {
148
+ const cmd = String(input?.command ?? "").replace(/\s+/g, " ").trim();
149
+ return ` ⏳ ${cmd.length > 100 ? cmd.slice(0, 100) + "…" : cmd}`;
150
+ }
151
+ case "Write": return ` 📝 writing ${rel(input?.file_path)}`;
152
+ case "Edit":
153
+ case "MultiEdit": return ` ✏️ editing ${rel(input?.file_path)}`;
154
+ case "Read": return ` 📖 reading ${rel(input?.file_path)}`;
155
+ case "Glob": return ` 🔍 glob ${String(input?.pattern ?? "")}`;
156
+ case "Grep": return ` 🔍 grep ${String(input?.pattern ?? "")}`;
157
+ case "WebFetch": return ` 🌐 ${String(input?.url ?? "")}`;
158
+ case "WebSearch": return ` 🔎 ${String(input?.query ?? "")}`;
159
+ default: return ` 🔧 ${name}`;
160
+ }
161
+ }
162
+ // ─── Open generated docs in VS Code (--open) ─────────────────────────────────
163
+ const MD_PREVIEW_EDITOR = "vscode.markdown.preview.editor";
164
+ function isVSCode() {
165
+ return (process.env.TERM_PROGRAM === "vscode" ||
166
+ !!process.env.VSCODE_PID ||
167
+ !!process.env.VSCODE_GIT_IPC_HANDLE);
168
+ }
169
+ function codeCliAvailable() {
170
+ try {
171
+ execSync("code --version", { stdio: "ignore" });
172
+ return true;
173
+ }
174
+ catch {
175
+ return false;
176
+ }
177
+ }
178
+ /**
179
+ * Add a `*.md → Markdown preview` editor association to the project's
180
+ * .vscode/settings.json so `code <file>.md` opens rendered. Never clobbers a
181
+ * settings.json it can't safely parse (e.g. one containing comments).
182
+ */
183
+ function ensureMarkdownPreviewAssociation(workingDir) {
184
+ const vscodeDir = path.join(workingDir, ".vscode");
185
+ const settingsPath = path.join(vscodeDir, "settings.json");
186
+ if (fs.existsSync(settingsPath)) {
187
+ const raw = fs.readFileSync(settingsPath, "utf-8");
188
+ let parsed;
189
+ try {
190
+ parsed = JSON.parse(raw);
191
+ }
192
+ catch {
193
+ if (!raw.includes(MD_PREVIEW_EDITOR)) {
194
+ console.log(`⚠️ --open: couldn't safely edit ${path.relative(workingDir, settingsPath)} (has comments). Add this manually:`);
195
+ console.log(` "workbench.editorAssociations": { "*.md": "${MD_PREVIEW_EDITOR}" }`);
196
+ return "manual";
197
+ }
198
+ return "exists";
199
+ }
200
+ const assoc = (parsed["workbench.editorAssociations"] ??= {});
201
+ if (assoc["*.md"] === MD_PREVIEW_EDITOR)
202
+ return "exists";
203
+ assoc["*.md"] = MD_PREVIEW_EDITOR;
204
+ fs.writeFileSync(settingsPath, JSON.stringify(parsed, null, 2), "utf-8");
205
+ return "updated";
206
+ }
207
+ fs.mkdirSync(vscodeDir, { recursive: true });
208
+ fs.writeFileSync(settingsPath, JSON.stringify({ "workbench.editorAssociations": { "*.md": MD_PREVIEW_EDITOR } }, null, 2), "utf-8");
209
+ return "created";
210
+ }
211
+ /** Open the generated markdown deliverables in VS Code's Markdown preview. */
212
+ function openGeneratedDocs(workingDir, files) {
213
+ if (!isVSCode()) {
214
+ console.log("ℹ️ --open: not running inside VS Code — skipping.");
215
+ return;
216
+ }
217
+ if (!codeCliAvailable()) {
218
+ console.log("ℹ️ --open: the `code` CLI isn't on PATH — skipping. (In VS Code: run 'Shell Command: Install code command in PATH'.)");
219
+ return;
220
+ }
221
+ const state = ensureMarkdownPreviewAssociation(workingDir);
222
+ if (state === "created" || state === "updated") {
223
+ console.log(`📝 --open: set '*.md → Markdown preview' in ${path.join(".vscode", "settings.json")}.`);
224
+ }
225
+ const existing = files.filter((f) => fs.existsSync(f));
226
+ for (const f of existing) {
227
+ try {
228
+ execSync(`code "${f}"`, { stdio: "ignore" });
229
+ }
230
+ catch { }
231
+ }
232
+ if (existing.length)
233
+ console.log(`📖 --open: opened ${existing.length} doc(s) in VS Code Markdown preview.`);
234
+ }
235
+ // ─── System prompt ────────────────────────────────────────────────────────────
236
+ function buildSystemPrompt(sessionMgr, skip, playwrightCliAvailable, grep, protectConfig = false, existingRequirements, paths = resolvePaths()) {
237
+ const session = sessionMgr.get();
238
+ return `You are AIQA — AI Assisted Quality Super Agent, acting as a Team Lead of Business Analyst & QA specialists.
239
+ You run the full QA pipeline for "${session.target}" in a single session.
240
+ All context flows in memory between steps — no need to re-read files between steps unless needed.
241
+
242
+ ## Session
243
+ - Run ID: ${session.runId}
244
+ - Target: ${session.target}
245
+ - Base URL: ${session.baseUrl}
246
+ - Session file: ${session.outputs.sessionFile}
247
+ - Snapshots dir: ${session.outputs.snapshotsDir}
248
+
249
+ ## playwright-cli status: ${playwrightCliAvailable ? "✅ Available" : "⚠️ Not available — install with: npm install -g @playwright/cli@latest"}
250
+ ${protectConfig ? `
251
+ ## ⚠️ EXISTING playwright.config.ts — DO NOT MODIFY
252
+ The user has an existing playwright.config.ts and chose to keep it. You MUST NOT create,
253
+ write, overwrite, edit, or delete playwright.config.ts. Use the existing file as-is when
254
+ running tests. All OTHER output files should be written as normal.
255
+ ` : ""}
256
+ ## Pipeline Steps
257
+ Run these steps IN ORDER. Skip any step listed in: [${skip.join(", ") || "none"}]
258
+
259
+ ${!skip.includes("analyst") ? `
260
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
261
+ STEP 1 — ANALYST
262
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
263
+ ${buildAnalystPrompt(session, existingRequirements)}
264
+ ` : "STEP 1 — ANALYST: SKIPPED"}
265
+
266
+ ${!skip.includes("qa-planner") ? `
267
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
268
+ STEP 2 — QA PLANNER
269
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
270
+ ${buildQAPlannerPrompt(session)}
271
+ ` : "STEP 2 — QA PLANNER: SKIPPED"}
272
+
273
+ ${!skip.includes("qa-engineer") ? `
274
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
275
+ STEP 3 — QA ENGINEER
276
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
277
+ ${buildQAEngineerPrompt(session, paths)}
278
+ ` : "STEP 3 — QA ENGINEER: SKIPPED"}
279
+
280
+ ${!skip.includes("qa-reviewer") ? `
281
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
282
+ STEP 4 — QA REVIEWER
283
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
284
+ ${buildQAReviewerPrompt(session)}
285
+ ` : "STEP 4 — QA REVIEWER: SKIPPED"}
286
+
287
+ ${!skip.includes("qa-reporter") ? `
288
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
289
+ STEP 5 — QA REPORTER
290
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
291
+ ${buildQAReporterPrompt(session, grep, paths)}
292
+ ` : "STEP 5 — QA REPORTER: SKIPPED"}
293
+
294
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
295
+ GLOBAL RULES
296
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
297
+
298
+ 1. Always announce which step you are starting with a clear header
299
+ 2. After completing each step — confirm the output file was written with its size
300
+ 3. Use snapshots from the analyst step in ALL subsequent steps
301
+ 4. If you hit a problem mid-pipeline — use AskFollowup to ask the user, then continue
302
+ 5. Never stop the pipeline unless a critical error makes continuation impossible
303
+ 6. After ALL steps complete — print a final summary of all files created`;
304
+ }
305
+ // ─── Main exported function ───────────────────────────────────────────────────
306
+ export async function runAIQA(input) {
307
+ const workingDir = input.cwd ?? process.cwd();
308
+ const skip = [...(input.skip ?? [])];
309
+ const start = Date.now();
310
+ const paths = resolvePaths(input.paths);
311
+ // Init session
312
+ const sessionMgr = new SessionManager(workingDir, input.target, input.resume ?? false, paths);
313
+ const session = sessionMgr.get();
314
+ // Pick up any snapshots already on disk so downstream prompts can list them
315
+ // (and so a resumed run sees what the analyst captured previously).
316
+ registerSnapshotsFromDisk(sessionMgr);
317
+ // On --resume, skip steps whose output artifact already exists on disk.
318
+ if (input.resume) {
319
+ for (const step of PIPELINE_STEPS) {
320
+ if (stepOutputExists(step, session)) {
321
+ sessionMgr.setStatus(step, "completed");
322
+ if (!skip.includes(step))
323
+ skip.push(step);
324
+ }
325
+ }
326
+ }
327
+ console.log(`\n🎯 Target: ${input.target}`);
328
+ console.log(`📁 Output dir: ${workingDir}`);
329
+ console.log(`🔖 Run ID: ${session.runId}`);
330
+ if (skip.length > 0)
331
+ console.log(`⏭️ Skipping: ${skip.join(", ")}`);
332
+ if (input.grep)
333
+ console.log(`🏷️ Test filter: ${input.grep}`);
334
+ // Check playwright-cli
335
+ const playwrightCliAvailable = checkPlaywrightCLI();
336
+ if (playwrightCliAvailable) {
337
+ console.log("✅ playwright-cli available");
338
+ ensurePlaywrightSkills(workingDir);
339
+ }
340
+ else {
341
+ console.log("⚠️ playwright-cli not found — install: npm install -g @playwright/cli@latest");
342
+ }
343
+ // Don't silently clobber an existing playwright.config.ts in the user's project.
344
+ const protectConfig = await decideConfigProtection(workingDir, input.force ?? false);
345
+ // If the provided requirements doc IS the file the analyst will generate
346
+ // (e.g. the user named their doc requirements.md), preserve a copy under a
347
+ // reserved name so the merged output doesn't overwrite the original.
348
+ let existingReq = input.existingRequirements;
349
+ if (existingReq && fs.existsSync(existingReq) &&
350
+ path.resolve(existingReq) === path.resolve(session.outputs.requirements)) {
351
+ const preserved = path.join(path.dirname(existingReq), "existing-requirements.md");
352
+ fs.copyFileSync(existingReq, preserved);
353
+ existingReq = preserved;
354
+ console.log(`ℹ️ Your requirements.md was preserved as existing-requirements.md — the merged output will be written to requirements.md.`);
355
+ }
356
+ console.log("\n━".repeat(60));
357
+ const systemPrompt = buildSystemPrompt(sessionMgr, skip, playwrightCliAvailable, input.grep, protectConfig, existingReq, paths);
358
+ const prompt = `Run the full AIQA pipeline for: "${input.target}"
359
+
360
+ Steps to run: ${["analyst", "qa-planner", "qa-engineer", "qa-reviewer", "qa-reporter"]
361
+ .filter((s) => !skip.includes(s))
362
+ .join(" → ")}
363
+
364
+ Work through each step in order. Use playwright-cli for browser exploration and test generation.
365
+ Pass insights and snapshots from each step into the next — context flows in memory.
366
+ Write all output files to their specified paths.`;
367
+ try {
368
+ for await (const message of query({
369
+ prompt,
370
+ options: {
371
+ systemPrompt,
372
+ allowedTools: [
373
+ "Read",
374
+ "Write",
375
+ "Edit",
376
+ "Glob",
377
+ "Bash",
378
+ "WebSearch",
379
+ "WebFetch",
380
+ ],
381
+ // Unattended pipeline — pre-approve all tools (the analyst & reporter steps
382
+ // need Bash for playwright-cli / npx playwright). The playwright.config.ts
383
+ // overwrite guard is handled upfront in decideConfigProtection(), because
384
+ // canUseTool only fires in the SDK's streaming-input mode, not with a string
385
+ // prompt — relying on it left Write/Edit auto-denied.
386
+ permissionMode: "bypassPermissions",
387
+ allowDangerouslySkipPermissions: true,
388
+ cwd: workingDir,
389
+ ...(input.model ? { model: input.model } : {}),
390
+ },
391
+ })) {
392
+ const msg = message;
393
+ if (msg.type === "assistant" && msg.message?.content) {
394
+ for (const block of msg.message.content) {
395
+ if ("text" in block && block.text) {
396
+ // Stream the model's narration straight through. Step status is
397
+ // derived from real output files on disk after the run, not from
398
+ // pattern-matching this text (which was unreliable).
399
+ process.stdout.write(block.text);
400
+ }
401
+ else if ("name" in block) {
402
+ // Live progress so the terminal isn't silent during long steps
403
+ // (e.g. the analyst running many playwright-cli commands).
404
+ console.log(formatToolProgress(block.name, block.input, workingDir));
405
+ }
406
+ }
407
+ }
408
+ else if (msg.type === "result") {
409
+ console.log(`\n${"━".repeat(60)}`);
410
+ console.log(`✅ Pipeline finished: ${msg.subtype}`);
411
+ }
412
+ }
413
+ }
414
+ catch (err) {
415
+ if (err?.message?.includes("API key") || err?.message?.includes("auth")) {
416
+ throw new Error("Authentication failed.\n\n" +
417
+ " Option 1 — Anthropic API key: set ANTHROPIC_API_KEY in .env\n" +
418
+ " Option 2 — Claude subscription: claude login\n" +
419
+ " Option 3 — GitHub Copilot: gh auth login");
420
+ }
421
+ throw err;
422
+ }
423
+ // Collect outputs
424
+ const outputs = {};
425
+ const checkFiles = [
426
+ ["requirements", session.outputs.requirements],
427
+ ["testPlan", session.outputs.testPlan],
428
+ ["testCases", session.outputs.testCasesDir],
429
+ ["specs", session.outputs.specsDir],
430
+ ["reviewReport", session.outputs.reviewReport],
431
+ ["summaryReport", session.outputs.summaryReport],
432
+ ["playwrightConfig", session.outputs.playwrightConfig],
433
+ ["htmlReport", session.outputs.htmlReport],
434
+ ];
435
+ console.log("\n📁 Output files:");
436
+ for (const [key, filePath] of checkFiles) {
437
+ if (fs.existsSync(filePath)) {
438
+ outputs[key] = filePath;
439
+ console.log(` ✅ ${path.relative(workingDir, filePath)}`);
440
+ }
441
+ }
442
+ // Register any snapshots the analyst captured this run, then print the count
443
+ registerSnapshotsFromDisk(sessionMgr);
444
+ const snapshotsDir = session.outputs.snapshotsDir;
445
+ if (fs.existsSync(snapshotsDir)) {
446
+ const snapshots = fs.readdirSync(snapshotsDir).filter((f) => f.endsWith(".yml"));
447
+ console.log(` 📸 ${snapshots.length} snapshots in .aiqa/snapshots/`);
448
+ }
449
+ // Derive final step status from real output artifacts on disk:
450
+ // skipped steps stay skipped, others pass iff their output file exists.
451
+ for (const step of PIPELINE_STEPS) {
452
+ if (skip.includes(step)) {
453
+ sessionMgr.setStatus(step, "skipped");
454
+ }
455
+ else {
456
+ sessionMgr.setStatus(step, stepOutputExists(step, session) ? "completed" : "failed");
457
+ }
458
+ }
459
+ sessionMgr.printStatus();
460
+ // --open: open the key deliverables in VS Code's Markdown preview, and print
461
+ // the steps for viewing the Playwright HTML report in the integrated browser
462
+ // (Simple Browser can't be launched from a CLI, and the report needs a server).
463
+ if (input.open) {
464
+ openGeneratedDocs(workingDir, [
465
+ session.outputs.requirements,
466
+ session.outputs.testPlan,
467
+ session.outputs.summaryReport,
468
+ ]);
469
+ if (isVSCode() && fs.existsSync(session.outputs.htmlReport)) {
470
+ const reportDir = path.relative(workingDir, path.dirname(session.outputs.htmlReport)) ||
471
+ path.dirname(session.outputs.htmlReport);
472
+ console.log(`\n🌐 View the Playwright report in VS Code's integrated browser:`);
473
+ console.log(` 1) npx playwright show-report "${reportDir}" (prints a http://localhost URL)`);
474
+ console.log(` 2) Command Palette → “Simple Browser: Show” → paste that URL`);
475
+ }
476
+ }
477
+ const passed = Object.values(session.pipeline).every((s) => s === "completed" || s === "skipped");
478
+ return {
479
+ sessionFile: session.outputs.sessionFile,
480
+ outputs,
481
+ passed,
482
+ totalDuration: Date.now() - start,
483
+ };
484
+ }
485
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @agents-forge/aiqa
4
+ * AI Assisted Quality Engineering — single unified agent
5
+ *
6
+ * Usage:
7
+ * npx @agents-forge/aiqa (interactive: prompts for URL + existing requirements)
8
+ * npx @agents-forge/aiqa https://my-app.com
9
+ * npx @agents-forge/aiqa https://my-app.com --grep @smoke
10
+ * npx @agents-forge/aiqa https://my-app.com --resume
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG"}