@bugzy-ai/bugzy 1.13.0 → 1.14.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.
package/dist/cli/index.js CHANGED
@@ -260,6 +260,9 @@ Before invoking the agent, identify the test cases for the current area:
260
260
  - Existing automated tests: ./tests/specs/
261
261
  - Existing Page Objects: ./tests/pages/
262
262
 
263
+ **Knowledge Base Patterns (MUST APPLY):**
264
+ Include ALL relevant testing patterns from the knowledge base that apply to this area. For example, if the KB documents timing behaviors (animation delays, loading states), selector gotchas, or recommended assertion approaches \u2014 list them here explicitly and instruct the agent to use the specific patterns described (e.g., specific assertion methods with specific timeouts). The test-code-generator does not have access to the knowledge base, so you MUST relay the exact patterns and recommended code approaches.
265
+
263
266
  **The agent should:**
264
267
  1. Read the manual test case files for this area
265
268
  2. Check existing Page Object infrastructure for this area
@@ -268,6 +271,7 @@ Before invoking the agent, identify the test cases for the current area:
268
271
  5. For each test case marked \`automated: true\`:
269
272
  - Create automated Playwright test in ./tests/specs/
270
273
  - Update the manual test case file to reference the automated test path
274
+ - Apply ALL knowledge base patterns listed above (timing, selectors, assertions)
271
275
  6. Run and iterate on each test until it passes or fails with a product bug
272
276
  7. Update .env.testdata with any new variables
273
277
 
@@ -1488,6 +1492,40 @@ The input format determines the trigger source and context extraction strategy.`
1488
1492
  Store the detected trigger for use in output routing:
1489
1493
  - Set variable: \`TRIGGER_SOURCE\` = [GITHUB_PR | SLACK_MESSAGE | CI_CD | MANUAL]
1490
1494
  - This determines output formatting and delivery channel`
1495
+ },
1496
+ // Step 5c: Coverage Gap vs. Ambiguity (inline)
1497
+ {
1498
+ inline: true,
1499
+ title: "Coverage Gap vs. Ambiguity",
1500
+ content: `### Coverage Gap vs. Ambiguity
1501
+
1502
+ When the trigger indicates a feature has been implemented and is ready for testing (Jira "Ready to Test", PR merged, CI/CD pipeline):
1503
+
1504
+ **Missing test coverage for the referenced feature is a COVERAGE GAP, not an ambiguity.**
1505
+
1506
+ - The developer/team is asserting the feature exists and is ready for testing
1507
+ - "Not yet explored" or "out of scope" in the test plan means the QA team hasn't tested it yet \u2014 it does NOT mean the feature doesn't exist
1508
+ - Do NOT classify as CRITICAL based on stale documentation or knowledge base gaps
1509
+ - If project-context.md or the Jira issue references the feature, assume it exists until browser exploration proves otherwise
1510
+ - Coverage gaps are handled in the "Create Tests for Coverage Gaps" step below \u2014 do NOT block here
1511
+
1512
+ ### If You Browse the App and Cannot Find the Referenced Feature
1513
+
1514
+ Apply the Clarification Protocol's **"Execution Obstacle vs. Requirement Ambiguity"** principle:
1515
+
1516
+ This is an **execution obstacle**, NOT a requirement ambiguity \u2014 because the authoritative trigger source (Jira issue, PR, team request) asserts the feature exists. Common causes for not finding it:
1517
+ - **Missing role/tier**: You're logged in as a basic user but the feature requires admin/premium access
1518
+ - **Missing test data**: Required test accounts or data haven't been configured in \`.env.testdata\`
1519
+ - **Feature flags**: The feature is behind a flag not enabled in the test environment
1520
+ - **Environment config**: The feature requires specific environment variables or deployment settings
1521
+
1522
+ **Action: PROCEED to "Create Tests for Coverage Gaps".** Do NOT BLOCK.
1523
+ - Create test cases and specs that reference the feature as described in the trigger
1524
+ - Add placeholder env vars to \`.env.testdata\` for any missing credentials
1525
+ - Notify the team (via team-communicator) about the access obstacle and what needs to be configured
1526
+ - Tests may fail until the obstacle is resolved \u2014 this is expected and acceptable
1527
+
1528
+ **Only classify as CRITICAL (and BLOCK) if NO authoritative trigger source claims the feature exists** \u2014 e.g., a vague manual request with no Jira/PR backing.`
1491
1529
  },
1492
1530
  // Step 6: Clarification Protocol (library)
1493
1531
  "clarification-protocol",
@@ -2353,6 +2391,204 @@ function validateEnvVars(mcpServers, envVars) {
2353
2391
  init_esm_shims();
2354
2392
  import * as fs3 from "fs";
2355
2393
  import * as path4 from "path";
2394
+
2395
+ // src/subagents/metadata.ts
2396
+ init_esm_shims();
2397
+ var INTEGRATIONS = {
2398
+ linear: {
2399
+ id: "linear",
2400
+ name: "Linear",
2401
+ provider: "linear",
2402
+ requiredMCP: "mcp__linear__*",
2403
+ integrationType: "oauth"
2404
+ },
2405
+ jira: {
2406
+ id: "jira",
2407
+ name: "Jira",
2408
+ provider: "jira",
2409
+ requiredMCP: "mcp__jira__*",
2410
+ integrationType: "oauth"
2411
+ },
2412
+ "jira-server": {
2413
+ id: "jira-server",
2414
+ name: "Jira Server",
2415
+ provider: "jira-server",
2416
+ requiredMCP: "mcp__jira-server__*",
2417
+ integrationType: "custom"
2418
+ },
2419
+ "azure-devops": {
2420
+ id: "azure-devops",
2421
+ name: "Azure DevOps",
2422
+ provider: "azure-devops",
2423
+ requiredMCP: "mcp__azure-devops__*",
2424
+ integrationType: "oauth"
2425
+ // Uses Nango with API key auth for PAT
2426
+ },
2427
+ notion: {
2428
+ id: "notion",
2429
+ name: "Notion",
2430
+ provider: "notion",
2431
+ requiredMCP: "mcp__notion__*",
2432
+ integrationType: "oauth"
2433
+ },
2434
+ confluence: {
2435
+ id: "confluence",
2436
+ name: "Confluence",
2437
+ provider: "confluence",
2438
+ requiredMCP: "mcp__confluence__*",
2439
+ integrationType: "oauth"
2440
+ },
2441
+ slack: {
2442
+ id: "slack",
2443
+ name: "Slack",
2444
+ provider: "slack",
2445
+ requiredMCP: "mcp__slack__*",
2446
+ integrationType: "oauth"
2447
+ },
2448
+ playwright: {
2449
+ id: "playwright",
2450
+ name: "Playwright",
2451
+ provider: "playwright",
2452
+ // No requiredMCP — uses playwright-cli (CLI tool), not MCP server
2453
+ isLocal: true,
2454
+ // Playwright runs locally, no external connector needed
2455
+ integrationType: "local"
2456
+ },
2457
+ teams: {
2458
+ id: "teams",
2459
+ name: "Microsoft Teams",
2460
+ provider: "teams",
2461
+ requiredMCP: "mcp__teams__*",
2462
+ integrationType: "oauth"
2463
+ },
2464
+ email: {
2465
+ id: "email",
2466
+ name: "Email",
2467
+ provider: "resend",
2468
+ requiredMCP: "mcp__resend__*",
2469
+ integrationType: "local"
2470
+ // Uses platform API key, no OAuth needed
2471
+ },
2472
+ github: {
2473
+ id: "github",
2474
+ name: "GitHub",
2475
+ provider: "github",
2476
+ requiredMCP: "mcp__github__*",
2477
+ integrationType: "oauth"
2478
+ },
2479
+ local: {
2480
+ id: "local",
2481
+ name: "Local (Terminal)",
2482
+ provider: "local",
2483
+ // No requiredMCP - uses built-in Claude Code tools (AskUserQuestion, text output)
2484
+ isLocal: true,
2485
+ integrationType: "local"
2486
+ }
2487
+ };
2488
+ var SUBAGENTS = {
2489
+ "test-runner": {
2490
+ role: "test-runner",
2491
+ name: "Test Runner",
2492
+ description: "Execute automated browser tests (always included)",
2493
+ icon: "play",
2494
+ integrations: [INTEGRATIONS.playwright],
2495
+ model: "sonnet",
2496
+ color: "green",
2497
+ isRequired: true,
2498
+ version: "1.0.0"
2499
+ },
2500
+ "team-communicator": {
2501
+ role: "team-communicator",
2502
+ name: "Team Communicator",
2503
+ description: "Send notifications and updates to your team",
2504
+ icon: "message-square",
2505
+ integrations: [INTEGRATIONS.slack, INTEGRATIONS.teams, INTEGRATIONS.email],
2506
+ model: "sonnet",
2507
+ color: "blue",
2508
+ isRequired: true,
2509
+ // Required - CLI uses 'local' (auto-configured), cloud uses email fallback
2510
+ defaultIntegration: "email",
2511
+ // Email fallback for cloud (CLI auto-configures 'local' separately)
2512
+ version: "1.0.0"
2513
+ },
2514
+ "issue-tracker": {
2515
+ role: "issue-tracker",
2516
+ name: "Issue Tracker",
2517
+ description: "Automatically create and track bugs and issues",
2518
+ icon: "bot",
2519
+ integrations: [
2520
+ // INTEGRATIONS.linear,
2521
+ INTEGRATIONS.jira,
2522
+ INTEGRATIONS["jira-server"],
2523
+ INTEGRATIONS["azure-devops"],
2524
+ INTEGRATIONS.notion,
2525
+ INTEGRATIONS.slack
2526
+ ],
2527
+ model: "sonnet",
2528
+ color: "red",
2529
+ version: "1.0.0"
2530
+ },
2531
+ "documentation-researcher": {
2532
+ role: "documentation-researcher",
2533
+ name: "Documentation Researcher",
2534
+ description: "Search and retrieve information from your documentation",
2535
+ icon: "file-search",
2536
+ integrations: [
2537
+ INTEGRATIONS.notion,
2538
+ INTEGRATIONS.jira
2539
+ // INTEGRATIONS.confluence
2540
+ ],
2541
+ model: "sonnet",
2542
+ color: "cyan",
2543
+ version: "1.0.0"
2544
+ },
2545
+ "test-code-generator": {
2546
+ role: "test-code-generator",
2547
+ name: "Test Code Generator",
2548
+ description: "Generate automated Playwright test scripts and Page Objects",
2549
+ icon: "code",
2550
+ integrations: [INTEGRATIONS.playwright],
2551
+ model: "sonnet",
2552
+ color: "purple",
2553
+ isRequired: true,
2554
+ // Required for automated test generation
2555
+ version: "1.0.0"
2556
+ },
2557
+ "test-debugger-fixer": {
2558
+ role: "test-debugger-fixer",
2559
+ name: "Test Debugger & Fixer",
2560
+ description: "Debug and fix failing automated tests automatically",
2561
+ icon: "wrench",
2562
+ integrations: [INTEGRATIONS.playwright],
2563
+ model: "sonnet",
2564
+ color: "yellow",
2565
+ isRequired: true,
2566
+ // Required for automated test execution and fixing
2567
+ version: "1.0.0"
2568
+ },
2569
+ "changelog-historian": {
2570
+ role: "changelog-historian",
2571
+ name: "Changelog Historian",
2572
+ description: "Retrieves and analyzes code changes from GitHub PRs and commits",
2573
+ icon: "git-pull-request",
2574
+ integrations: [INTEGRATIONS.github],
2575
+ model: "haiku",
2576
+ color: "gray",
2577
+ isRequired: false,
2578
+ version: "1.0.0"
2579
+ }
2580
+ };
2581
+ function getAllSubAgents() {
2582
+ return Object.values(SUBAGENTS);
2583
+ }
2584
+ function getIntegration(integrationId) {
2585
+ return INTEGRATIONS[integrationId];
2586
+ }
2587
+ function getRequiredSubAgents() {
2588
+ return Object.values(SUBAGENTS).filter((agent) => agent.isRequired);
2589
+ }
2590
+
2591
+ // src/cli/utils/validation.ts
2356
2592
  async function validateProjectStructure() {
2357
2593
  const config = await loadConfig();
2358
2594
  const tool = config ? getToolFromConfig(config) : DEFAULT_TOOL;
@@ -2415,7 +2651,10 @@ async function checkToolAvailable(command) {
2415
2651
  function getRequiredMCPs(subagents) {
2416
2652
  const mcps = /* @__PURE__ */ new Set();
2417
2653
  for (const [_role, integration] of Object.entries(subagents)) {
2418
- mcps.add(integration);
2654
+ const integrationMeta = getIntegration(integration);
2655
+ if (integrationMeta?.requiredMCP) {
2656
+ mcps.add(integration);
2657
+ }
2419
2658
  }
2420
2659
  return Array.from(mcps);
2421
2660
  }
@@ -2603,7 +2842,7 @@ var CONTENT = `You are an expert automated test execution specialist with deep e
2603
2842
 
2604
2843
  3. **Environment Setup**: Before test execution:
2605
2844
  - Read \`.env.testdata\` to get non-secret environment variable values (TEST_BASE_URL, TEST_OWNER_EMAIL, etc.)
2606
- - For secrets, variable names will be passed to Playwright MCP which reads them from .env at runtime
2845
+ - For secrets, variable names are available as environment variables (playwright-cli inherits the process environment)
2607
2846
 
2608
2847
  4. **Test Case Parsing**: You will receive a test case file path. Parse the test case to extract:
2609
2848
  - Test steps and actions to perform
@@ -2611,16 +2850,16 @@ var CONTENT = `You are an expert automated test execution specialist with deep e
2611
2850
  - Test data and input values (replace any \${TEST_*} or $TEST_* variables with actual values from .env)
2612
2851
  - Preconditions and setup requirements
2613
2852
 
2614
- 5. **Browser Automation Execution**: Using the Playwright MCP server:
2615
- - Launch a browser instance with appropriate configuration
2616
- - Execute each test step sequentially
2853
+ 5. **Browser Automation Execution**: Using playwright-cli (CLI-based browser automation):
2854
+ - Launch a browser: \`playwright-cli open <url>\`
2855
+ - Execute each test step sequentially using CLI commands: \`click\`, \`fill\`, \`select\`, \`hover\`, etc.
2856
+ - Use \`snapshot\` to inspect page state and find element references (@e1, @e2, etc.)
2617
2857
  - Handle dynamic waits and element interactions intelligently
2618
2858
  - Manage browser state between steps
2619
2859
  - **IMPORTANT - Environment Variable Handling**:
2620
2860
  - When test cases contain environment variables:
2621
2861
  - For non-secrets (TEST_BASE_URL, TEST_OWNER_EMAIL): Read actual values from .env.testdata and use them directly
2622
- - For secrets (TEST_OWNER_PASSWORD, API keys): Pass variable name to Playwright MCP for runtime substitution
2623
- - Playwright MCP automatically reads .env for secrets and injects them at runtime
2862
+ - For secrets (TEST_OWNER_PASSWORD, API keys): playwright-cli inherits environment variables from the process
2624
2863
  - Example: Test says "Navigate to TEST_BASE_URL/login" \u2192 Read TEST_BASE_URL from .env.testdata, use the actual URL
2625
2864
 
2626
2865
  6. **Evidence Collection at Each Step**:
@@ -2645,7 +2884,7 @@ var CONTENT = `You are an expert automated test execution specialist with deep e
2645
2884
  - \`steps.json\`: Structured steps with timestamps, video time synchronization, and detailed descriptions (see schema)
2646
2885
 
2647
2886
  Video handling:
2648
- - Playwright automatically saves videos to \`.playwright-mcp/\` folder
2887
+ - Videos are automatically saved to \`.playwright-mcp/\` folder via PLAYWRIGHT_MCP_SAVE_VIDEO env var
2649
2888
  - Find the latest video: \`ls -t .playwright-mcp/*.webm 2>/dev/null | head -1\`
2650
2889
  - Store ONLY the filename in summary.json: \`{ "video": { "filename": "basename.webm" } }\`
2651
2890
  - Do NOT copy, move, or delete video files - external service handles uploads
@@ -2684,8 +2923,7 @@ var CONTENT = `You are an expert automated test execution specialist with deep e
2684
2923
  - Identify all TEST_* variable references (e.g., TEST_BASE_URL, TEST_OWNER_EMAIL, TEST_OWNER_PASSWORD)
2685
2924
  - Read .env.testdata to get actual values for non-secret variables
2686
2925
  - For non-secrets (TEST_BASE_URL, TEST_OWNER_EMAIL, etc.): Use actual values from .env.testdata directly in test execution
2687
- - For secrets (TEST_OWNER_PASSWORD, API keys, etc.): Pass variable names to Playwright MCP for runtime injection from .env
2688
- - Playwright MCP will read .env and inject secret values during browser automation
2926
+ - For secrets (TEST_OWNER_PASSWORD, API keys, etc.): playwright-cli inherits env vars from the process environment
2689
2927
  - If a required variable is not found in .env.testdata, log a warning but continue
2690
2928
 
2691
2929
  5. Extract execution ID from the execution environment:
@@ -2699,7 +2937,7 @@ var CONTENT = `You are an expert automated test execution specialist with deep e
2699
2937
  - Describe what action will be performed (communicate to user)
2700
2938
  - Log the step being executed with timestamp
2701
2939
  - Calculate elapsed time from test start (for videoTimeSeconds)
2702
- - Execute the action using Playwright's robust selectors
2940
+ - Execute the action using playwright-cli commands (click, fill, select, etc. with element refs)
2703
2941
  - Wait for page stability
2704
2942
  - Validate expected behavior
2705
2943
  - Record findings and actual behavior
@@ -2774,12 +3012,11 @@ var CONTENT = `You are an expert automated test execution specialist with deep e
2774
3012
  **Environment Variable Handling:**
2775
3013
  - Read .env.testdata at the start of execution to get non-secret environment variables
2776
3014
  - For non-secrets (TEST_BASE_URL, TEST_OWNER_EMAIL, etc.): Use actual values from .env.testdata directly
2777
- - For secrets (TEST_OWNER_PASSWORD, API keys): Pass variable names to Playwright MCP for runtime injection
2778
- - Playwright MCP reads .env for secrets and injects them during browser automation
3015
+ - For secrets (TEST_OWNER_PASSWORD, API keys): playwright-cli inherits env vars from the process environment
2779
3016
  - DO NOT read .env yourself (security policy - it contains only secrets)
2780
3017
  - DO NOT make up fake values or fallbacks
2781
3018
  - If a variable is missing from .env.testdata, log a warning
2782
- - If Playwright MCP reports a secret is missing/empty, that indicates .env is misconfigured
3019
+ - If a secret env var is missing/empty, that indicates .env is misconfigured
2783
3020
  - Document which environment variables were used in the test run summary
2784
3021
 
2785
3022
  When you encounter ambiguous test steps, make intelligent decisions based on common testing patterns and document your interpretation. Always prioritize capturing evidence over speed of execution. Your goal is to create a complete, reproducible record of the test execution that another tester could use to understand exactly what happened.`;
@@ -2827,7 +3064,7 @@ var CONTENT2 = `You are an expert Playwright test automation engineer specializi
2827
3064
  - Update the manual test case file with the automated_test reference
2828
3065
  - Create supporting artifacts: Page Objects, fixtures, helpers, components, types
2829
3066
 
2830
- 5. **Mandatory Application Exploration**: NEVER generate Page Objects without exploring the live application first using Playwright MCP tools:
3067
+ 5. **Mandatory Application Exploration**: NEVER generate Page Objects without exploring the live application first using playwright-cli:
2831
3068
  - Navigate to pages, authenticate, inspect elements
2832
3069
  - Capture screenshots for documentation
2833
3070
  - Document exact role names, labels, text, URLs
@@ -2858,7 +3095,7 @@ var CONTENT2 = `You are an expert Playwright test automation engineer specializi
2858
3095
 
2859
3096
  **STEP 2: Build Missing Infrastructure** (if needed)
2860
3097
 
2861
- - **Explore feature under test**: Use Playwright MCP tools to:
3098
+ - **Explore feature under test**: Use playwright-cli to:
2862
3099
  * Navigate to the feature's pages
2863
3100
  * Inspect elements and gather selectors (role, label, text)
2864
3101
  * Document actual URLs from the browser
@@ -3065,8 +3302,8 @@ var CONTENT2 = `You are an expert Playwright test automation engineer specializi
3065
3302
  - Create test interdependencies - tests must be independent
3066
3303
 
3067
3304
  \u2705 **ALWAYS**:
3068
- - Explore application using Playwright MCP before generating code
3069
- - Verify selectors in live browser using browser_select tool
3305
+ - Explore application using playwright-cli before generating code
3306
+ - Verify selectors in live browser using playwright-cli snapshot
3070
3307
  - Document actual URLs from browser address bar
3071
3308
  - Take screenshots for documentation
3072
3309
  - Use role-based selectors as first priority
@@ -3139,7 +3376,7 @@ var CONTENT3 = `You are an expert Playwright test debugger and fixer with deep e
3139
3376
  - Brittle selectors (CSS classes, IDs that change)
3140
3377
 
3141
3378
  4. **Debug Using Browser**: When needed, explore the application manually:
3142
- - Use Playwright MCP to open browser
3379
+ - Use playwright-cli to open browser (\`playwright-cli open <url>\`)
3143
3380
  - Navigate to the relevant page
3144
3381
  - Inspect elements to find correct selectors
3145
3382
  - Manually perform test steps to understand actual behavior
@@ -3249,7 +3486,7 @@ var CONTENT3 = `You are an expert Playwright test debugger and fixer with deep e
3249
3486
  - Check for screenshot/trace file references
3250
3487
 
3251
3488
  **Step 3: Reproduce and Debug**
3252
- - Open browser via Playwright MCP if needed
3489
+ - Open browser via playwright-cli if needed (\`playwright-cli open <url>\`)
3253
3490
  - Navigate to relevant page
3254
3491
  - Manually execute test steps
3255
3492
  - Identify discrepancy between test expectations and actual behavior
@@ -3372,13 +3609,14 @@ var CONTENT3 = `You are an expert Playwright test debugger and fixer with deep e
3372
3609
  - NEVER read \`.env\` file (contains secrets only)
3373
3610
  - If test needs new environment variable, update \`.env.testdata\`
3374
3611
 
3375
- 9. **Using Playwright MCP for Debugging**:
3376
- - You have direct access to Playwright MCP
3377
- - Open browser: Request to launch Playwright
3378
- - Navigate: Go to URLs relevant to failing test
3379
- - Inspect elements: Find correct selectors
3380
- - Execute test steps manually: Understand actual behavior
3381
- - Close browser when done
3612
+ 9. **Using playwright-cli for Debugging**:
3613
+ - You have direct access to playwright-cli via Bash
3614
+ - Open browser: \`playwright-cli open <url>\`
3615
+ - Take snapshot: \`playwright-cli snapshot\` to get element refs (@e1, @e2, etc.)
3616
+ - Navigate: \`playwright-cli navigate <url>\`
3617
+ - Inspect elements: Use \`snapshot\` to find correct selectors and element refs
3618
+ - Execute test steps manually: Use \`click\`, \`fill\`, \`select\` commands
3619
+ - Close browser: \`playwright-cli close\`
3382
3620
 
3383
3621
  10. **Test Stability Best Practices**:
3384
3622
  - Replace all \`waitForTimeout()\` with specific waits
@@ -3675,6 +3913,24 @@ var CONTENT5 = `You are a Team Communication Specialist who communicates like a
3675
3913
 
3676
3914
  **Key Principle:** If it takes more than 30 seconds to read, it's too long.
3677
3915
 
3916
+ ## CRITICAL: Always Post Messages
3917
+
3918
+ When you are invoked, your job is to POST a message to Slack \u2014 not just compose one.
3919
+
3920
+ **You MUST call \`slack_post_message\` or \`slack_post_rich_message\`** to deliver the message. Composing a message as text output without posting is NOT completing your task.
3921
+
3922
+ **NEVER:**
3923
+ - Return a draft without posting it
3924
+ - Ask "should I post this?" \u2014 if you were invoked, the answer is yes
3925
+ - Compose text and wait for approval before posting
3926
+
3927
+ **ALWAYS:**
3928
+ 1. Identify the correct channel (from project-context.md or the invocation context)
3929
+ 2. Compose the message following the guidelines below
3930
+ 3. Call the Slack API tool to POST the message
3931
+ 4. If a thread reply is needed, post main message first, then reply in thread
3932
+ 5. Report back: channel name, message timestamp, and confirmation it was posted
3933
+
3678
3934
  ## Message Type Detection
3679
3935
 
3680
3936
  Before composing, identify the message type:
@@ -6062,202 +6318,6 @@ function getTemplate(role, integration) {
6062
6318
  return TEMPLATES[role]?.[integration];
6063
6319
  }
6064
6320
 
6065
- // src/subagents/metadata.ts
6066
- init_esm_shims();
6067
- var INTEGRATIONS = {
6068
- linear: {
6069
- id: "linear",
6070
- name: "Linear",
6071
- provider: "linear",
6072
- requiredMCP: "mcp__linear__*",
6073
- integrationType: "oauth"
6074
- },
6075
- jira: {
6076
- id: "jira",
6077
- name: "Jira",
6078
- provider: "jira",
6079
- requiredMCP: "mcp__jira__*",
6080
- integrationType: "oauth"
6081
- },
6082
- "jira-server": {
6083
- id: "jira-server",
6084
- name: "Jira Server",
6085
- provider: "jira-server",
6086
- requiredMCP: "mcp__jira-server__*",
6087
- integrationType: "custom"
6088
- },
6089
- "azure-devops": {
6090
- id: "azure-devops",
6091
- name: "Azure DevOps",
6092
- provider: "azure-devops",
6093
- requiredMCP: "mcp__azure-devops__*",
6094
- integrationType: "oauth"
6095
- // Uses Nango with API key auth for PAT
6096
- },
6097
- notion: {
6098
- id: "notion",
6099
- name: "Notion",
6100
- provider: "notion",
6101
- requiredMCP: "mcp__notion__*",
6102
- integrationType: "oauth"
6103
- },
6104
- confluence: {
6105
- id: "confluence",
6106
- name: "Confluence",
6107
- provider: "confluence",
6108
- requiredMCP: "mcp__confluence__*",
6109
- integrationType: "oauth"
6110
- },
6111
- slack: {
6112
- id: "slack",
6113
- name: "Slack",
6114
- provider: "slack",
6115
- requiredMCP: "mcp__slack__*",
6116
- integrationType: "oauth"
6117
- },
6118
- playwright: {
6119
- id: "playwright",
6120
- name: "Playwright",
6121
- provider: "playwright",
6122
- requiredMCP: "mcp__playwright__*",
6123
- isLocal: true,
6124
- // Playwright runs locally, no external connector needed
6125
- integrationType: "local"
6126
- },
6127
- teams: {
6128
- id: "teams",
6129
- name: "Microsoft Teams",
6130
- provider: "teams",
6131
- requiredMCP: "mcp__teams__*",
6132
- integrationType: "oauth"
6133
- },
6134
- email: {
6135
- id: "email",
6136
- name: "Email",
6137
- provider: "resend",
6138
- requiredMCP: "mcp__resend__*",
6139
- integrationType: "local"
6140
- // Uses platform API key, no OAuth needed
6141
- },
6142
- github: {
6143
- id: "github",
6144
- name: "GitHub",
6145
- provider: "github",
6146
- requiredMCP: "mcp__github__*",
6147
- integrationType: "oauth"
6148
- },
6149
- local: {
6150
- id: "local",
6151
- name: "Local (Terminal)",
6152
- provider: "local",
6153
- // No requiredMCP - uses built-in Claude Code tools (AskUserQuestion, text output)
6154
- isLocal: true,
6155
- integrationType: "local"
6156
- }
6157
- };
6158
- var SUBAGENTS = {
6159
- "test-runner": {
6160
- role: "test-runner",
6161
- name: "Test Runner",
6162
- description: "Execute automated browser tests (always included)",
6163
- icon: "play",
6164
- integrations: [INTEGRATIONS.playwright],
6165
- model: "sonnet",
6166
- color: "green",
6167
- isRequired: true,
6168
- version: "1.0.0"
6169
- },
6170
- "team-communicator": {
6171
- role: "team-communicator",
6172
- name: "Team Communicator",
6173
- description: "Send notifications and updates to your team",
6174
- icon: "message-square",
6175
- integrations: [INTEGRATIONS.slack, INTEGRATIONS.teams, INTEGRATIONS.email],
6176
- model: "sonnet",
6177
- color: "blue",
6178
- isRequired: true,
6179
- // Required - CLI uses 'local' (auto-configured), cloud uses email fallback
6180
- defaultIntegration: "email",
6181
- // Email fallback for cloud (CLI auto-configures 'local' separately)
6182
- version: "1.0.0"
6183
- },
6184
- "issue-tracker": {
6185
- role: "issue-tracker",
6186
- name: "Issue Tracker",
6187
- description: "Automatically create and track bugs and issues",
6188
- icon: "bot",
6189
- integrations: [
6190
- // INTEGRATIONS.linear,
6191
- INTEGRATIONS.jira,
6192
- INTEGRATIONS["jira-server"],
6193
- INTEGRATIONS["azure-devops"],
6194
- INTEGRATIONS.notion,
6195
- INTEGRATIONS.slack
6196
- ],
6197
- model: "sonnet",
6198
- color: "red",
6199
- version: "1.0.0"
6200
- },
6201
- "documentation-researcher": {
6202
- role: "documentation-researcher",
6203
- name: "Documentation Researcher",
6204
- description: "Search and retrieve information from your documentation",
6205
- icon: "file-search",
6206
- integrations: [
6207
- INTEGRATIONS.notion,
6208
- INTEGRATIONS.jira
6209
- // INTEGRATIONS.confluence
6210
- ],
6211
- model: "sonnet",
6212
- color: "cyan",
6213
- version: "1.0.0"
6214
- },
6215
- "test-code-generator": {
6216
- role: "test-code-generator",
6217
- name: "Test Code Generator",
6218
- description: "Generate automated Playwright test scripts and Page Objects",
6219
- icon: "code",
6220
- integrations: [INTEGRATIONS.playwright],
6221
- model: "sonnet",
6222
- color: "purple",
6223
- isRequired: true,
6224
- // Required for automated test generation
6225
- version: "1.0.0"
6226
- },
6227
- "test-debugger-fixer": {
6228
- role: "test-debugger-fixer",
6229
- name: "Test Debugger & Fixer",
6230
- description: "Debug and fix failing automated tests automatically",
6231
- icon: "wrench",
6232
- integrations: [INTEGRATIONS.playwright],
6233
- model: "sonnet",
6234
- color: "yellow",
6235
- isRequired: true,
6236
- // Required for automated test execution and fixing
6237
- version: "1.0.0"
6238
- },
6239
- "changelog-historian": {
6240
- role: "changelog-historian",
6241
- name: "Changelog Historian",
6242
- description: "Retrieves and analyzes code changes from GitHub PRs and commits",
6243
- icon: "git-pull-request",
6244
- integrations: [INTEGRATIONS.github],
6245
- model: "haiku",
6246
- color: "gray",
6247
- isRequired: false,
6248
- version: "1.0.0"
6249
- }
6250
- };
6251
- function getAllSubAgents() {
6252
- return Object.values(SUBAGENTS);
6253
- }
6254
- function getIntegration(integrationId) {
6255
- return INTEGRATIONS[integrationId];
6256
- }
6257
- function getRequiredSubAgents() {
6258
- return Object.values(SUBAGENTS).filter((agent) => agent.isRequired);
6259
- }
6260
-
6261
6321
  // src/subagents/index.ts
6262
6322
  function buildSubagentConfig(role, integration) {
6263
6323
  const template = getTemplate(role, integration);
@@ -6459,6 +6519,8 @@ Before proceeding, read the curated knowledge base to inform your work:
6459
6519
  - Build on existing understanding
6460
6520
  - Maintain consistency with established practices
6461
6521
 
6522
+ 3. **Relay to subagents**: Subagents do NOT read the knowledge base directly. When delegating work, you MUST include relevant KB patterns in your delegation message \u2014 especially testing patterns (timing, selectors, assertion approaches) that affect test reliability.
6523
+
6462
6524
  **Note:** The knowledge base may not exist yet or may be empty. If it doesn't exist or is empty, proceed without this context and help build it as you work.`,
6463
6525
  tags: ["setup", "context"]
6464
6526
  };
@@ -6610,7 +6672,9 @@ If the Clarification Protocol determined project maturity, adjust exploration de
6610
6672
  - **Growing project**: Use requirement clarity as-is (standard protocol)
6611
6673
  - **Mature project**: Trust knowledge base \u2014 can stay at suggested depth or go one level shallower if KB covers the feature
6612
6674
 
6613
- **Always verify features exist before testing them.** If exploration reveals that a referenced page or feature does not exist in the application, this is CRITICAL severity \u2014 escalate via the Clarification Protocol regardless of maturity level. Do NOT silently adapt or work around the missing feature.
6675
+ **Always verify features exist before testing them.** If exploration reveals that a referenced page or feature does not exist in the application, apply the Clarification Protocol's "Execution Obstacle vs. Requirement Ambiguity" principle:
6676
+ - If an authoritative trigger source (Jira issue, PR, team request) asserts the feature exists, this is likely an **execution obstacle** (missing credentials, feature flags, environment config) \u2014 proceed with test artifact creation and notify the team about the access issue. Do NOT BLOCK.
6677
+ - If NO authoritative source claims the feature exists, this is **CRITICAL severity** \u2014 escalate via the Clarification Protocol regardless of maturity level. Do NOT silently adapt or work around the missing feature.
6614
6678
 
6615
6679
  ### Quick Exploration (1-2 min)
6616
6680
 
@@ -6897,11 +6961,56 @@ If ambiguity is detected, assess its severity:
6897
6961
 
6898
6962
  | Severity | Characteristics | Examples | Action |
6899
6963
  |----------|----------------|----------|--------|
6900
- | **CRITICAL** | Expected behavior undefined/contradictory; test outcome unpredictable; core functionality unclear; success criteria missing; multiple interpretations = different strategies; **referenced page/feature does not exist in the application** | "Fix the issue" (what issue?), "Improve performance" (which metrics?), "Fix sorting in todo list" (by date? priority? completion status?), "Test the Settings page" (no Settings page exists), "Verify the checkout flow" (no checkout page found) | **STOP** - You MUST ask via team-communicator before proceeding |
6964
+ | **CRITICAL** | Expected behavior undefined/contradictory; test outcome unpredictable; core functionality unclear; success criteria missing; multiple interpretations = different strategies; **referenced page/feature confirmed absent after browser verification AND no authoritative trigger source (Jira, PR, team request) asserts the feature exists** | "Fix the issue" (what issue?), "Improve performance" (which metrics?), "Fix sorting in todo list" (by date? priority? completion status?), "Test the Settings page" (browsed app \u2014 no Settings page exists, and no Jira/PR claims it was built) | **STOP** - You MUST ask via team-communicator before proceeding |
6901
6965
  | **HIGH** | Core underspecified but direction clear; affects majority of scenarios; vague success criteria; assumptions risky | "Fix ordering" (sequence OR visibility?), "Add validation" (what? messages?), "Update dashboard" (which widgets?) | **STOP** - You MUST ask via team-communicator before proceeding |
6902
6966
  | **MEDIUM** | Specific details missing; general requirements clear; affects subset of cases; reasonable low-risk assumptions possible; wrong assumption = test updates not strategy overhaul | Missing field labels, unclear error message text, undefined timeouts, button placement not specified, date formats unclear | **PROCEED** - (1) Moderate exploration, (2) Document assumptions: "Assuming X because Y", (3) Proceed with creation/execution, (4) Async clarification (team-communicator), (5) Mark [ASSUMED: description] |
6903
6967
  | **LOW** | Minor edge cases; documentation gaps don't affect execution; optional/cosmetic elements; minimal impact | Tooltip text, optional field validation, icon choice, placeholder text, tab order | **PROCEED** - (1) Mark [TO BE CLARIFIED: description], (2) Proceed, (3) Mention in report "Minor Details", (4) No blocking/async clarification |
6904
6968
 
6969
+ ### Execution Obstacle vs. Requirement Ambiguity
6970
+
6971
+ Before classifying something as CRITICAL, distinguish between these two fundamentally different situations:
6972
+
6973
+ **Requirement Ambiguity** = *What* to test is unclear \u2192 severity assessment applies normally
6974
+ - No authoritative source describes the feature
6975
+ - The task description is vague or contradictory
6976
+ - You cannot determine what "correct" behavior looks like
6977
+ - \u2192 Apply severity table above. CRITICAL/HIGH \u2192 BLOCK.
6978
+
6979
+ **Execution Obstacle** = *What* to test is clear, but *how* to access/verify has obstacles \u2192 NEVER BLOCK
6980
+ - An authoritative trigger source (Jira issue, PR, team message) asserts the feature exists
6981
+ - You browsed the app but couldn't find/access the feature
6982
+ - The obstacle is likely: wrong user role/tier, missing test data, feature flags, environment config
6983
+ - \u2192 PROCEED with artifact creation (test cases, test specs). Notify team about the obstacle.
6984
+
6985
+ **The key test:** Does an authoritative trigger source (Jira, PR, team request) assert the feature exists?
6986
+ - **YES** \u2192 It's an execution obstacle. The feature exists but you can't access it. Proceed: create test artifacts, add placeholder env vars, notify team about access issues.
6987
+ - **NO** \u2192 It may genuinely not exist. Apply CRITICAL severity, ask what was meant.
6988
+
6989
+ | Scenario | Trigger Says | Browser Shows | Classification | Action |
6990
+ |----------|-------------|---------------|----------------|--------|
6991
+ | Jira says "test premium dashboard", you log in as test_user and don't see it | Feature exists | Can't access | **Execution obstacle** | Create tests, notify team re: missing premium credentials |
6992
+ | PR says "verify new settings page", you browse and find no settings page | Feature exists | Can't find | **Execution obstacle** | Create tests, notify team re: possible feature flag/env issue |
6993
+ | Manual request "test the settings page", no Jira/PR, you browse and find no settings page | No source claims it | Can't find | **Requirement ambiguity (CRITICAL)** | BLOCK, ask what was meant |
6994
+ | Jira says "fix sorting", but doesn't specify sort criteria | Feature exists | Feature exists | **Requirement ambiguity (HIGH)** | BLOCK, ask which sort criteria |
6995
+
6996
+ **Partial Feature Existence \u2014 URL found but requested functionality absent:**
6997
+
6998
+ A common edge case: a page/route loads successfully, but the SPECIFIC FUNCTIONALITY you were asked to test doesn't exist on it.
6999
+
7000
+ **Rule:** Evaluate whether the REQUESTED FUNCTIONALITY exists, not just whether a URL resolves.
7001
+
7002
+ | Page Exists | Requested Features Exist | Authoritative Trigger | Classification |
7003
+ |-------------|--------------------------|----------------------|----------------|
7004
+ | Yes | Yes | Any | Proceed normally |
7005
+ | Yes | No | Yes (Jira/PR says features built) | Execution obstacle \u2014 features behind flag/env |
7006
+ | Yes | No | No (manual request only) | **Requirement ambiguity (CRITICAL)** \u2014 ask what's expected |
7007
+ | No | N/A | Yes | Execution obstacle \u2014 page not deployed yet |
7008
+ | No | N/A | No | **Requirement ambiguity (CRITICAL)** \u2014 ask what was meant |
7009
+
7010
+ **Example:** Prompt says "Test the checkout payment form with credit card 4111..." You browse to /checkout and find an information form (first name, last name, postal code) but NO payment form, NO shipping options, NO Place Order button. No Jira/PR claims these features exist. \u2192 **CRITICAL requirement ambiguity.** Ask: "I found a checkout information form at /checkout but no payment form or shipping options. Can you clarify what checkout features you'd like tested?"
7011
+
7012
+ **Key insight:** Finding a URL is not the same as finding the requested functionality. Do NOT classify this as an "execution obstacle" just because the page loads.
7013
+
6905
7014
  ### Check Memory for Similar Clarifications
6906
7015
 
6907
7016
  Before asking, check if similar question was answered:
@@ -7047,7 +7156,7 @@ When reporting test results, always include an "Ambiguities" section if clarific
7047
7156
  ## Remember
7048
7157
 
7049
7158
  - **STOP means STOP** - When you hit a STOP threshold, you MUST call team-communicator to ask via Slack. Do NOT silently adapt, skip, or work around the issue
7050
- - **Non-existent features = CRITICAL** - If a page, component, or feature referenced in the task does not exist, this is always CRITICAL severity \u2014 ask what was meant
7159
+ - **Non-existent features \u2014 check context first** - If a page/feature doesn't exist in the browser, check whether an authoritative trigger (Jira, PR, team request) asserts it exists. If YES \u2192 execution obstacle (proceed with artifact creation, notify team). If NO authoritative source claims it exists \u2192 CRITICAL severity, ask what was meant
7051
7160
  - **Ask correctly > guess poorly** - Specific questions lead to specific answers
7052
7161
  - **Never invent success criteria** - If the task says "improve" or "fix" without metrics, ask what "done" looks like
7053
7162
  - **Check memory first** - Avoid re-asking previously answered questions
@@ -7991,8 +8100,10 @@ function buildComposedTaskDefinition(taskSlug, projectSubAgents) {
7991
8100
  const configured = projectSubAgents.find((sa) => sa.role === role);
7992
8101
  if (configured) {
7993
8102
  const integrationMeta = getIntegration(configured.integration);
7994
- const mcpProvider = integrationMeta?.provider || configured.integration;
7995
- requiredMCPs.add(mcpProvider);
8103
+ if (integrationMeta?.requiredMCP) {
8104
+ const mcpProvider = integrationMeta.provider || configured.integration;
8105
+ requiredMCPs.add(mcpProvider);
8106
+ }
7996
8107
  }
7997
8108
  }
7998
8109
  const content = contentParts.join("\n\n");
@@ -8247,31 +8358,6 @@ var MCP_SERVERS = {
8247
8358
  }
8248
8359
  }
8249
8360
  },
8250
- playwright: {
8251
- provider: "playwright",
8252
- name: "Playwright",
8253
- description: "Playwright MCP server for browser automation",
8254
- requiresCredentials: false,
8255
- npmPackages: ["@playwright/mcp"],
8256
- config: {
8257
- command: "playwright-mcp",
8258
- args: [
8259
- "--browser",
8260
- "chromium",
8261
- "--secrets",
8262
- ".env",
8263
- "--no-sandbox",
8264
- "--viewport-size",
8265
- "1280x720"
8266
- ]
8267
- },
8268
- containerExtensions: {
8269
- args: ["--headless"],
8270
- env: {
8271
- PLAYWRIGHT_BROWSERS_PATH: "/opt/ms-playwright"
8272
- }
8273
- }
8274
- },
8275
8361
  notion: {
8276
8362
  provider: "notion",
8277
8363
  name: "Notion",