@bugzy-ai/bugzy 1.3.0 → 1.5.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
@@ -3845,13 +3845,22 @@ async function validateProjectStructure() {
3845
3845
  }
3846
3846
  async function checkToolAvailable(command) {
3847
3847
  const { spawn: spawn2 } = await import("child_process");
3848
+ const isWindows = process.platform === "win32";
3849
+ const checkCommand = isWindows ? "where" : "which";
3848
3850
  return new Promise((resolve) => {
3849
- const proc = spawn2("which", [command]);
3851
+ const proc = spawn2(checkCommand, [command], {
3852
+ shell: isWindows
3853
+ // Windows needs shell for 'where'
3854
+ });
3850
3855
  proc.on("close", (code) => {
3851
- resolve(code === 0);
3856
+ if (code !== 0) {
3857
+ console.warn(`Warning: Could not verify '${command}' is installed (${checkCommand} check failed). Continuing anyway...`);
3858
+ }
3859
+ resolve(true);
3852
3860
  });
3853
3861
  proc.on("error", () => {
3854
- resolve(false);
3862
+ console.warn(`Warning: Could not verify '${command}' is installed (${checkCommand} not available). Continuing anyway...`);
3863
+ resolve(true);
3855
3864
  });
3856
3865
  });
3857
3866
  }
@@ -3904,21 +3913,8 @@ async function startSession(prompt) {
3904
3913
  process.exit(1);
3905
3914
  }
3906
3915
  spinner = ora(`Checking ${toolProfile.name} availability`).start();
3907
- const toolAvailable = await checkToolAvailable(toolProfile.cliCommand);
3908
- if (!toolAvailable) {
3909
- spinner.fail(chalk.red(`${toolProfile.name} CLI not found`));
3910
- console.log(chalk.yellow(`
3911
- Please install ${toolProfile.name}:`));
3912
- if (tool === "claude-code") {
3913
- console.log(chalk.cyan(" https://claude.com/claude-code"));
3914
- } else if (tool === "cursor") {
3915
- console.log(chalk.cyan(" https://www.cursor.com/"));
3916
- } else if (tool === "codex") {
3917
- console.log(chalk.cyan(" npm install -g @openai/codex"));
3918
- }
3919
- process.exit(1);
3920
- }
3921
- spinner.succeed(chalk.green(`${toolProfile.name} CLI found`));
3916
+ await checkToolAvailable(toolProfile.cliCommand);
3917
+ spinner.succeed(chalk.green(`${toolProfile.name} CLI check complete`));
3922
3918
  spinner = ora("Loading environment variables").start();
3923
3919
  const envVars = loadEnvFiles();
3924
3920
  const envCount = Object.keys(envVars).length;
@@ -5433,9 +5429,264 @@ You are not a formal report generator. You are a helpful QA engineer who knows h
5433
5429
 
5434
5430
  **Target feeling:** "This is a real person who respects my time and communicates clearly."`;
5435
5431
 
5436
- // src/subagents/templates/documentation-researcher/notion.ts
5432
+ // src/subagents/templates/team-communicator/email.ts
5437
5433
  init_esm_shims();
5438
5434
  var FRONTMATTER6 = {
5435
+ name: "team-communicator",
5436
+ description: `Use this agent when you need to communicate with the product team via email about testing activities, results, or questions. Email is the fallback communication method when Slack or Teams is not configured. Examples: <example>Context: A test run has completed with several failures that need team attention. user: 'The regression test suite just finished running and we have 5 critical failures in the checkout flow' assistant: 'I'll use the team-communicator agent to email the product team about these critical test failures and get their input on prioritization.' <commentary>Since there are critical test failures that need team awareness and potentially input on prioritization, use the team-communicator agent to send an email update.</commentary></example> <example>Context: During exploratory testing, unclear behavior is discovered that needs product team clarification. user: 'I found that the user profile page shows different data when accessed from the main menu vs the settings page - not sure if this is intended behavior' assistant: 'Let me use the team-communicator agent to email the product team for clarification on this behavior.' <commentary>Since there's ambiguous behavior that needs product team clarification, use the team-communicator agent to send a question email.</commentary></example> <example>Context: Test plan generation is complete and ready for team review. user: 'The test plan for the new payment integration feature is ready for review' assistant: 'I'll use the team-communicator agent to email the completed test plan to the product team for their review and feedback.' <commentary>Since the test plan is complete and needs team review, use the team-communicator agent to send an email with the test plan details.</commentary></example>`,
5437
+ tools: ["Glob", "Grep", "Read", "WebFetch", "TodoWrite", "WebSearch", "BashOutput", "KillBash", "mcp__resend__resend_send_email", "mcp__resend__resend_send_batch_emails", "ListMcpResourcesTool", "ReadMcpResourceTool"],
5438
+ model: "haiku",
5439
+ color: "yellow"
5440
+ };
5441
+ var CONTENT6 = `You are a Team Communication Specialist who communicates like a real QA engineer via email. Your emails are concise, scannable, and professional\u2014not lengthy formal reports. You respect your team's time by keeping emails brief with clear action items.
5442
+
5443
+ ## Core Philosophy: Concise, Professional Email Communication
5444
+
5445
+ **Write like a real QA engineer sending an email:**
5446
+ - Professional but conversational tone
5447
+ - Lead with impact in the subject line
5448
+ - Action items at the top of the email body
5449
+ - Target: 100-200 words for updates, 50-100 for questions
5450
+ - Maximum email length: 300 words
5451
+
5452
+ **Key Principle:** If it takes more than 1 minute to read, it's too long.
5453
+
5454
+ ## Email Structure Guidelines
5455
+
5456
+ ### Subject Line Best Practices
5457
+
5458
+ Format: \`[TYPE] Brief description - Context\`
5459
+
5460
+ Examples:
5461
+ - \`[Test Results] Smoke tests passed - Ready for release\`
5462
+ - \`[Blocker] Staging environment down - All testing blocked\`
5463
+ - \`[Question] Profile page behavior - Need clarification\`
5464
+ - \`[Update] Test plan ready - Review requested\`
5465
+
5466
+ ### Email Type Detection
5467
+
5468
+ Before composing, identify the email type:
5469
+
5470
+ #### Type 1: Status Report (FYI Update)
5471
+ **Use when:** Sharing completed test results, progress updates
5472
+ **Goal:** Inform team, no immediate action required
5473
+ **Subject:** \`[Test Results] ...\` or \`[Update] ...\`
5474
+
5475
+ #### Type 2: Question (Need Input)
5476
+ **Use when:** Need clarification, decision, or product knowledge
5477
+ **Goal:** Get specific answer quickly
5478
+ **Subject:** \`[Question] ...\`
5479
+
5480
+ #### Type 3: Blocker/Escalation (Urgent)
5481
+ **Use when:** Critical issue blocking testing or release
5482
+ **Goal:** Get immediate help/action
5483
+ **Subject:** \`[URGENT] ...\` or \`[Blocker] ...\`
5484
+
5485
+ ## Email Body Structure
5486
+
5487
+ Every email should follow this structure:
5488
+
5489
+ ### 1. TL;DR (First Line)
5490
+ One sentence summary of the main point or ask.
5491
+
5492
+ ### 2. Context (2-3 sentences)
5493
+ Brief background\u2014assume recipient is busy.
5494
+
5495
+ ### 3. Details (If needed)
5496
+ Use bullet points for easy scanning. Keep to 3-5 items max.
5497
+
5498
+ ### 4. Action Items / Next Steps
5499
+ Clear, specific asks with names if applicable.
5500
+
5501
+ ### 5. Sign-off
5502
+ Brief, professional closing.
5503
+
5504
+ ## Email Templates
5505
+
5506
+ ### Template 1: Test Results Report
5507
+
5508
+ \`\`\`
5509
+ Subject: [Test Results] [Test type] - [X/Y passed]
5510
+
5511
+ TL;DR: [One sentence summary of results and impact]
5512
+
5513
+ Results:
5514
+ - [Test category]: [X/Y passed]
5515
+ - [Key finding if any]
5516
+
5517
+ [If failures exist:]
5518
+ Key Issues:
5519
+ - [Issue 1]: [Brief description]
5520
+ - [Issue 2]: [Brief description]
5521
+
5522
+ Artifacts: [Location or link]
5523
+
5524
+ Next Steps:
5525
+ - [Action needed, if any]
5526
+ - [Timeline or ETA if blocking]
5527
+
5528
+ Best,
5529
+ Bugzy QA
5530
+ \`\`\`
5531
+
5532
+ ### Template 2: Question
5533
+
5534
+ \`\`\`
5535
+ Subject: [Question] [Topic in 3-5 words]
5536
+
5537
+ TL;DR: Need clarification on [specific topic].
5538
+
5539
+ Context:
5540
+ [1-2 sentences explaining what you found]
5541
+
5542
+ Question:
5543
+ [Specific question]
5544
+
5545
+ Options (if applicable):
5546
+ A) [Option 1]
5547
+ B) [Option 2]
5548
+
5549
+ Would appreciate a response by [timeframe if urgent].
5550
+
5551
+ Thanks,
5552
+ Bugzy QA
5553
+ \`\`\`
5554
+
5555
+ ### Template 3: Blocker/Escalation
5556
+
5557
+ \`\`\`
5558
+ Subject: [URGENT] [Impact statement]
5559
+
5560
+ TL;DR: [One sentence on what's blocked and what's needed]
5561
+
5562
+ Issue:
5563
+ [2-3 sentence technical summary]
5564
+
5565
+ Impact:
5566
+ - [What's blocked]
5567
+ - [Timeline impact if any]
5568
+
5569
+ Need:
5570
+ - [Specific action from specific person]
5571
+ - [Timeline for resolution]
5572
+
5573
+ Please respond ASAP.
5574
+
5575
+ Thanks,
5576
+ Bugzy QA
5577
+ \`\`\`
5578
+
5579
+ ### Template 4: Success/Pass Report
5580
+
5581
+ \`\`\`
5582
+ Subject: [Test Results] [Test type] passed - [X/X]
5583
+
5584
+ TL;DR: All tests passed. [Optional: key observation]
5585
+
5586
+ Results:
5587
+ - All [X] tests passed
5588
+ - Core flows verified: [list key areas]
5589
+
5590
+ No blockers for release from QA perspective.
5591
+
5592
+ Best,
5593
+ Bugzy QA
5594
+ \`\`\`
5595
+
5596
+ ## HTML Formatting Guidelines
5597
+
5598
+ When using HTML in emails:
5599
+
5600
+ - Use \`<h3>\` for section headers
5601
+ - Use \`<ul>\` and \`<li>\` for bullet lists
5602
+ - Use \`<strong>\` for emphasis (sparingly)
5603
+ - Use \`<code>\` for technical terms, IDs, or file paths
5604
+ - Keep styling minimal\u2014many email clients strip CSS
5605
+
5606
+ Example HTML structure:
5607
+ \`\`\`html
5608
+ <h3>TL;DR</h3>
5609
+ <p>Smoke tests passed (6/6). Ready for release.</p>
5610
+
5611
+ <h3>Results</h3>
5612
+ <ul>
5613
+ <li>Authentication: <strong>Passed</strong></li>
5614
+ <li>Navigation: <strong>Passed</strong></li>
5615
+ <li>Settings: <strong>Passed</strong></li>
5616
+ </ul>
5617
+
5618
+ <h3>Next Steps</h3>
5619
+ <p>No blockers from QA. Proceed with release when ready.</p>
5620
+ \`\`\`
5621
+
5622
+ ## Email-Specific Considerations
5623
+
5624
+ ### Unlike Slack:
5625
+ - **No threading**: Include all necessary context in each email
5626
+ - **No @mentions**: Use names in the text (e.g., "John, could you...")
5627
+ - **No real-time**: Don't expect immediate responses; be clear about urgency
5628
+ - **More formal**: Use complete sentences, proper grammar
5629
+
5630
+ ### Email Etiquette:
5631
+ - Keep recipients list minimal\u2014only those who need to act or be informed
5632
+ - Use CC sparingly for FYI recipients
5633
+ - Reply to threads when following up (maintain context)
5634
+ - Include links to artifacts rather than attaching large files
5635
+
5636
+ ## Anti-Patterns to Avoid
5637
+
5638
+ **Don't:**
5639
+ 1. Write lengthy introductions before getting to the point
5640
+ 2. Use overly formal language ("As per our previous correspondence...")
5641
+ 3. Bury the action item at the end of a long email
5642
+ 4. Send separate emails for related topics (consolidate)
5643
+ 5. Use HTML formatting excessively (keep it clean)
5644
+ 6. Forget to include context (recipient may see email out of order)
5645
+
5646
+ **Do:**
5647
+ 1. Lead with the most important information
5648
+ 2. Write conversationally but professionally
5649
+ 3. Make action items clear and specific
5650
+ 4. Include enough context for standalone understanding
5651
+ 5. Proofread\u2014emails are more permanent than chat
5652
+
5653
+ ## Context Discovery
5654
+
5655
+ ${MEMORY_READ_INSTRUCTIONS.replace(/{ROLE}/g, "team-communicator")}
5656
+
5657
+ **Memory Sections for Team Communicator**:
5658
+ - Email thread contexts and history
5659
+ - Team communication preferences and patterns
5660
+ - Response tracking
5661
+ - Team member email addresses and roles
5662
+ - Successful communication strategies
5663
+
5664
+ Additionally, always read:
5665
+ 1. \`.bugzy/runtime/project-context.md\` (team info, contact list, communication preferences)
5666
+
5667
+ Use this context to:
5668
+ - Identify correct recipients (from project-context.md)
5669
+ - Learn team communication preferences (from memory)
5670
+ - Address people appropriately (from project-context.md)
5671
+ - Adapt tone to team culture (from memory patterns)
5672
+
5673
+ ${MEMORY_UPDATE_INSTRUCTIONS.replace(/{ROLE}/g, "team-communicator")}
5674
+
5675
+ Specifically for team-communicator, consider updating:
5676
+ - **Email History**: Track thread contexts and ongoing conversations
5677
+ - **Team Preferences**: Document communication patterns that work well
5678
+ - **Response Patterns**: Note what types of emails get good engagement
5679
+ - **Contact Directory**: Record team member emails and roles
5680
+
5681
+ ## Final Reminder
5682
+
5683
+ You are not a formal report generator. You are a helpful QA engineer who knows how to communicate effectively via email. Every sentence should earn its place in the email. Get to the point quickly, be clear about what you need, and respect your recipients' time.
5684
+
5685
+ **Target feeling:** "This is a concise, professional email from someone who respects my time and communicates clearly."`;
5686
+
5687
+ // src/subagents/templates/documentation-researcher/notion.ts
5688
+ init_esm_shims();
5689
+ var FRONTMATTER7 = {
5439
5690
  name: "documentation-researcher",
5440
5691
  description: `Use this agent when you need to explore, understand, or retrieve information from project documentation stored in Notion. This agent systematically researches documentation, builds a knowledge base about the documentation structure, and maintains persistent memory to avoid redundant exploration. Examples: <example>Context: Need to find authentication requirements for test case generation.
5441
5692
  user: "I need to generate test cases for the new OAuth flow"
@@ -5447,7 +5698,7 @@ assistant: "I'll use the documentation-researcher agent to search our Notion doc
5447
5698
  model: "haiku",
5448
5699
  color: "cyan"
5449
5700
  };
5450
- var CONTENT6 = `You are an expert Documentation Researcher specializing in systematic information gathering and knowledge management. Your primary responsibility is to explore, understand, and retrieve information from project documentation stored in Notion via the MCP server.
5701
+ var CONTENT7 = `You are an expert Documentation Researcher specializing in systematic information gathering and knowledge management. Your primary responsibility is to explore, understand, and retrieve information from project documentation stored in Notion via the MCP server.
5451
5702
 
5452
5703
  ## Core Responsibilities
5453
5704
 
@@ -5514,7 +5765,7 @@ You are meticulous about maintaining your memory file as a living document that
5514
5765
 
5515
5766
  // src/subagents/templates/documentation-researcher/confluence.ts
5516
5767
  init_esm_shims();
5517
- var FRONTMATTER7 = {
5768
+ var FRONTMATTER8 = {
5518
5769
  name: "documentation-researcher",
5519
5770
  description: `Use this agent when you need to explore, understand, or retrieve information from project documentation stored in Confluence. This agent systematically researches documentation, builds a knowledge base about the documentation structure, and maintains persistent memory to avoid redundant exploration. Examples: <example>Context: Need to understand feature requirements from product specs.
5520
5771
  user: "I need to create a test plan for the new user profile feature"
@@ -5526,7 +5777,7 @@ assistant: "I'll use the documentation-researcher agent to search our Confluence
5526
5777
  model: "sonnet",
5527
5778
  color: "cyan"
5528
5779
  };
5529
- var CONTENT7 = `You are an expert Documentation Researcher specializing in systematic information gathering and knowledge management. Your primary responsibility is to explore, understand, and retrieve information from project documentation stored in Confluence.
5780
+ var CONTENT8 = `You are an expert Documentation Researcher specializing in systematic information gathering and knowledge management. Your primary responsibility is to explore, understand, and retrieve information from project documentation stored in Confluence.
5530
5781
 
5531
5782
  ## Core Responsibilities
5532
5783
 
@@ -5627,7 +5878,7 @@ You are meticulous about maintaining your memory file as a living document that
5627
5878
 
5628
5879
  // src/subagents/templates/issue-tracker/linear.ts
5629
5880
  init_esm_shims();
5630
- var FRONTMATTER8 = {
5881
+ var FRONTMATTER9 = {
5631
5882
  name: "issue-tracker",
5632
5883
  description: `Use this agent to track and manage all types of issues including bugs, stories, and tasks in Linear. This agent creates detailed issue reports, manages issue lifecycle through Linear's streamlined workflow, handles story transitions for QA processes, and maintains comprehensive tracking of all project work items. Examples: <example>Context: A test run discovered a critical bug that needs tracking.
5633
5884
  user: "The login flow is broken - users get a 500 error when submitting credentials"
@@ -5639,7 +5890,7 @@ assistant: "Let me use the issue-tracker agent to update the story status to QA
5639
5890
  model: "sonnet",
5640
5891
  color: "red"
5641
5892
  };
5642
- var CONTENT8 = `You are an expert Issue Tracker specializing in managing all types of project issues including bugs, stories, and tasks in Linear. Your primary responsibility is to track work items discovered during testing, manage story transitions through QA workflows, and ensure all issues are properly documented and resolved using Linear's efficient tracking system.
5893
+ var CONTENT9 = `You are an expert Issue Tracker specializing in managing all types of project issues including bugs, stories, and tasks in Linear. Your primary responsibility is to track work items discovered during testing, manage story transitions through QA workflows, and ensure all issues are properly documented and resolved using Linear's efficient tracking system.
5643
5894
 
5644
5895
  **Core Responsibilities:**
5645
5896
 
@@ -5808,7 +6059,7 @@ You are focused on creating bug reports that fit Linear's streamlined workflow w
5808
6059
 
5809
6060
  // src/subagents/templates/issue-tracker/jira.ts
5810
6061
  init_esm_shims();
5811
- var FRONTMATTER9 = {
6062
+ var FRONTMATTER10 = {
5812
6063
  name: "issue-tracker",
5813
6064
  description: `Use this agent to track and manage all types of issues including bugs, stories, and tasks in Jira. This agent creates detailed issue reports, manages issue lifecycle through status updates, handles story transitions for QA workflows, and maintains comprehensive tracking of all project work items. Examples: <example>Context: Automated tests found multiple failures that need tracking.
5814
6065
  user: "5 tests failed in the checkout flow - payment validation is broken"
@@ -5820,7 +6071,7 @@ assistant: "Let me use the issue-tracker agent to transition PROJ-456 to Done an
5820
6071
  model: "sonnet",
5821
6072
  color: "red"
5822
6073
  };
5823
- var CONTENT9 = `You are an expert Issue Tracker specializing in managing all types of project issues including bugs, stories, and tasks in Jira. Your primary responsibility is to track work items discovered during testing, manage story transitions through QA workflows, and ensure all issues are properly documented and resolved.
6074
+ var CONTENT10 = `You are an expert Issue Tracker specializing in managing all types of project issues including bugs, stories, and tasks in Jira. Your primary responsibility is to track work items discovered during testing, manage story transitions through QA workflows, and ensure all issues are properly documented and resolved.
5824
6075
 
5825
6076
  **Core Responsibilities:**
5826
6077
 
@@ -5983,7 +6234,7 @@ init_esm_shims();
5983
6234
 
5984
6235
  // src/subagents/templates/issue-tracker/notion.ts
5985
6236
  init_esm_shims();
5986
- var FRONTMATTER10 = {
6237
+ var FRONTMATTER11 = {
5987
6238
  name: "issue-tracker",
5988
6239
  description: `Use this agent to track and manage all types of issues including bugs, stories, and tasks in Notion databases. This agent creates detailed issue reports, manages issue lifecycle through status updates, handles story transitions for QA workflows, and maintains comprehensive tracking of all project work items. Examples: <example>Context: Test execution revealed a UI bug that needs documentation.
5989
6240
  user: "The submit button on the checkout page doesn't work on mobile Safari"
@@ -5995,7 +6246,7 @@ assistant: "Let me use the issue-tracker agent to update the story status to 'QA
5995
6246
  model: "haiku",
5996
6247
  color: "red"
5997
6248
  };
5998
- var CONTENT10 = `You are an expert Issue Tracker specializing in managing all types of project issues including bugs, stories, and tasks in Notion databases. Your primary responsibility is to track work items discovered during testing, manage story transitions through QA workflows, and ensure all issues are properly documented and resolved.
6249
+ var CONTENT11 = `You are an expert Issue Tracker specializing in managing all types of project issues including bugs, stories, and tasks in Notion databases. Your primary responsibility is to track work items discovered during testing, manage story transitions through QA workflows, and ensure all issues are properly documented and resolved.
5999
6250
 
6000
6251
  **Core Responsibilities:**
6001
6252
 
@@ -6143,7 +6394,7 @@ You are meticulous about maintaining your memory file as a critical resource tha
6143
6394
 
6144
6395
  // src/subagents/templates/issue-tracker/slack.ts
6145
6396
  init_esm_shims();
6146
- var FRONTMATTER11 = {
6397
+ var FRONTMATTER12 = {
6147
6398
  name: "issue-tracker",
6148
6399
  description: `Use this agent to track and manage all types of issues including bugs, stories, and tasks in Slack. This agent creates detailed issue threads, manages issue lifecycle through thread replies and reactions, handles story transitions for QA workflows, and maintains comprehensive tracking of all project work items using Slack channels. Examples: <example>Context: Test failures need to be reported to the team immediately.
6149
6400
  user: "3 critical tests failed in the payment flow - looks like the Stripe integration is broken"
@@ -6155,7 +6406,7 @@ assistant: "Let me use the issue-tracker agent to update the story thread with Q
6155
6406
  model: "sonnet",
6156
6407
  color: "red"
6157
6408
  };
6158
- var CONTENT11 = `You are an expert Issue Tracker specializing in managing all types of project issues including bugs, stories, and tasks in Slack. Your primary responsibility is to track work items discovered during testing, manage story transitions through QA workflows, and ensure all issues are properly documented and resolved using Slack threads and channels.
6409
+ var CONTENT12 = `You are an expert Issue Tracker specializing in managing all types of project issues including bugs, stories, and tasks in Slack. Your primary responsibility is to track work items discovered during testing, manage story transitions through QA workflows, and ensure all issues are properly documented and resolved using Slack threads and channels.
6159
6410
 
6160
6411
  **Core Responsibilities:**
6161
6412
 
@@ -6404,38 +6655,42 @@ var TEMPLATES = {
6404
6655
  teams: {
6405
6656
  frontmatter: FRONTMATTER5,
6406
6657
  content: CONTENT5
6658
+ },
6659
+ email: {
6660
+ frontmatter: FRONTMATTER6,
6661
+ content: CONTENT6
6407
6662
  }
6408
6663
  },
6409
6664
  "documentation-researcher": {
6410
6665
  notion: {
6411
- frontmatter: FRONTMATTER6,
6412
- content: CONTENT6
6413
- },
6414
- confluence: {
6415
6666
  frontmatter: FRONTMATTER7,
6416
6667
  content: CONTENT7
6668
+ },
6669
+ confluence: {
6670
+ frontmatter: FRONTMATTER8,
6671
+ content: CONTENT8
6417
6672
  }
6418
6673
  },
6419
6674
  "issue-tracker": {
6420
6675
  linear: {
6421
- frontmatter: FRONTMATTER8,
6422
- content: CONTENT8
6423
- },
6424
- jira: {
6425
6676
  frontmatter: FRONTMATTER9,
6426
6677
  content: CONTENT9
6427
6678
  },
6428
- "jira-server": {
6429
- frontmatter: FRONTMATTER9,
6430
- content: CONTENT9
6679
+ jira: {
6680
+ frontmatter: FRONTMATTER10,
6681
+ content: CONTENT10
6431
6682
  },
6432
- notion: {
6683
+ "jira-server": {
6433
6684
  frontmatter: FRONTMATTER10,
6434
6685
  content: CONTENT10
6435
6686
  },
6436
- slack: {
6687
+ notion: {
6437
6688
  frontmatter: FRONTMATTER11,
6438
6689
  content: CONTENT11
6690
+ },
6691
+ slack: {
6692
+ frontmatter: FRONTMATTER12,
6693
+ content: CONTENT12
6439
6694
  }
6440
6695
  }
6441
6696
  };
@@ -6503,6 +6758,14 @@ var INTEGRATIONS = {
6503
6758
  provider: "teams",
6504
6759
  requiredMCP: "mcp__teams__*",
6505
6760
  integrationType: "oauth"
6761
+ },
6762
+ email: {
6763
+ id: "email",
6764
+ name: "Email",
6765
+ provider: "resend",
6766
+ requiredMCP: "mcp__resend__*",
6767
+ integrationType: "local"
6768
+ // Uses platform API key, no OAuth needed
6506
6769
  }
6507
6770
  };
6508
6771
  var SUBAGENTS = {
@@ -6522,9 +6785,13 @@ var SUBAGENTS = {
6522
6785
  name: "Team Communicator",
6523
6786
  description: "Send notifications and updates to your team",
6524
6787
  icon: "message-square",
6525
- integrations: [INTEGRATIONS.slack, INTEGRATIONS.teams],
6788
+ integrations: [INTEGRATIONS.slack, INTEGRATIONS.teams, INTEGRATIONS.email],
6526
6789
  model: "sonnet",
6527
6790
  color: "blue",
6791
+ isRequired: true,
6792
+ // Required - falls back to email if Slack/Teams not configured
6793
+ defaultIntegration: "email",
6794
+ // Email is the fallback when OAuth integrations aren't set up
6528
6795
  version: "1.0.0"
6529
6796
  },
6530
6797
  "issue-tracker": {
@@ -6533,8 +6800,8 @@ var SUBAGENTS = {
6533
6800
  description: "Automatically create and track bugs and issues",
6534
6801
  icon: "bot",
6535
6802
  integrations: [
6536
- INTEGRATIONS.linear,
6537
- INTEGRATIONS.jira,
6803
+ // INTEGRATIONS.linear,
6804
+ // INTEGRATIONS.jira,
6538
6805
  INTEGRATIONS["jira-server"],
6539
6806
  INTEGRATIONS.notion,
6540
6807
  INTEGRATIONS.slack
@@ -6548,7 +6815,10 @@ var SUBAGENTS = {
6548
6815
  name: "Documentation Researcher",
6549
6816
  description: "Search and retrieve information from your documentation",
6550
6817
  icon: "file-search",
6551
- integrations: [INTEGRATIONS.notion, INTEGRATIONS.confluence],
6818
+ integrations: [
6819
+ INTEGRATIONS.notion
6820
+ // INTEGRATIONS.confluence
6821
+ ],
6552
6822
  model: "sonnet",
6553
6823
  color: "cyan",
6554
6824
  version: "1.0.0"
@@ -6581,6 +6851,9 @@ var SUBAGENTS = {
6581
6851
  function getAllSubAgents() {
6582
6852
  return Object.values(SUBAGENTS);
6583
6853
  }
6854
+ function getIntegration(integrationId) {
6855
+ return INTEGRATIONS[integrationId];
6856
+ }
6584
6857
  function getRequiredSubAgents() {
6585
6858
  return Object.values(SUBAGENTS).filter((agent) => agent.isRequired);
6586
6859
  }
@@ -6777,7 +7050,9 @@ function buildTaskDefinition(taskSlug, projectSubAgents) {
6777
7050
  for (const role of requiredSubAgentRoles) {
6778
7051
  const configured = projectSubAgents.find((sa) => sa.role === role);
6779
7052
  if (configured) {
6780
- requiredMCPs.add(configured.integration);
7053
+ const integrationMeta = getIntegration(configured.integration);
7054
+ const mcpProvider = integrationMeta?.provider || configured.integration;
7055
+ requiredMCPs.add(mcpProvider);
6781
7056
  }
6782
7057
  }
6783
7058
  return {
@@ -6984,6 +7259,7 @@ var MCP_SERVERS = {
6984
7259
  name: "Slack",
6985
7260
  description: "Slack MCP server for messaging and channel operations",
6986
7261
  requiresCredentials: true,
7262
+ npmPackages: ["simple-slack-mcp-server"],
6987
7263
  config: {
6988
7264
  command: "slack-mcp-server",
6989
7265
  args: [],
@@ -6997,6 +7273,7 @@ var MCP_SERVERS = {
6997
7273
  name: "Microsoft Teams",
6998
7274
  description: "Microsoft Teams MCP server for messaging and channel operations",
6999
7275
  requiresCredentials: true,
7276
+ npmPackages: ["@bugzy-ai/teams-mcp-server"],
7000
7277
  config: {
7001
7278
  command: "teams-mcp-server",
7002
7279
  args: [],
@@ -7010,6 +7287,7 @@ var MCP_SERVERS = {
7010
7287
  name: "Playwright",
7011
7288
  description: "Playwright MCP server for browser automation",
7012
7289
  requiresCredentials: false,
7290
+ npmPackages: ["@playwright/mcp"],
7013
7291
  config: {
7014
7292
  command: "mcp-server-playwright",
7015
7293
  args: [
@@ -7034,6 +7312,7 @@ var MCP_SERVERS = {
7034
7312
  name: "Notion",
7035
7313
  description: "Notion MCP server for documentation",
7036
7314
  requiresCredentials: true,
7315
+ npmPackages: ["@notionhq/notion-mcp-server"],
7037
7316
  config: {
7038
7317
  command: "notion-mcp-server",
7039
7318
  args: [],
@@ -7047,6 +7326,7 @@ var MCP_SERVERS = {
7047
7326
  name: "Jira Server (On-Prem)",
7048
7327
  description: "Jira Server MCP via tunnel for on-premise instances",
7049
7328
  requiresCredentials: true,
7329
+ npmPackages: ["@mcp-tunnel/wrapper", "@bugzy-ai/jira-mcp-server"],
7050
7330
  config: {
7051
7331
  command: "mcp-tunnel",
7052
7332
  args: ["--server", "jira-mcp-server"],
@@ -7060,6 +7340,21 @@ var MCP_SERVERS = {
7060
7340
  JIRA_PASSWORD: "${JIRA_PASSWORD}"
7061
7341
  }
7062
7342
  }
7343
+ },
7344
+ resend: {
7345
+ provider: "resend",
7346
+ name: "Email (Resend)",
7347
+ description: "Resend MCP server for sending email notifications",
7348
+ requiresCredentials: true,
7349
+ npmPackages: ["@bugzy-ai/resend-mcp-server"],
7350
+ config: {
7351
+ command: "resend-mcp-server",
7352
+ args: [],
7353
+ env: {
7354
+ RESEND_API_KEY: "${RESEND_API_KEY}",
7355
+ RESEND_FROM_EMAIL: "${RESEND_FROM_EMAIL}"
7356
+ }
7357
+ }
7063
7358
  }
7064
7359
  // github: {
7065
7360
  // provider: 'github',
@@ -7240,11 +7535,13 @@ function getMCPEnvConfig(serverName) {
7240
7535
  const configs = {
7241
7536
  slack: `
7242
7537
  # Slack MCP Server
7243
- # Get your token from: https://api.slack.com/apps
7538
+ # Setup guide: https://github.com/bugzy-ai/bugzy/blob/main/docs/slack-setup.md
7539
+ # Required scopes: channels:read, chat:write, chat:write.public, reactions:write
7244
7540
  SLACK_ACCESS_TOKEN=`,
7245
7541
  notion: `
7246
7542
  # Notion MCP Server
7247
- # Get your token from: https://www.notion.so/my-integrations
7543
+ # Setup guide: https://github.com/bugzy-ai/bugzy/blob/main/docs/notion-setup.md
7544
+ # Requires: Internal Integration Token (ntn_* or secret_*)
7248
7545
  NOTION_TOKEN=`,
7249
7546
  linear: `
7250
7547
  # Linear MCP Server
@@ -7265,7 +7562,18 @@ CONFLUENCE_API_TOKEN=`,
7265
7562
  github: `
7266
7563
  # GitHub MCP Server
7267
7564
  # Get your token from: https://github.com/settings/tokens
7268
- GITHUB_TOKEN=`
7565
+ GITHUB_TOKEN=`,
7566
+ teams: `
7567
+ # Microsoft Teams MCP Server
7568
+ # Setup guide: https://github.com/bugzy-ai/bugzy/blob/main/docs/teams-setup.md
7569
+ # Required Graph API scopes: Team.ReadBasic.All, Channel.ReadBasic.All, ChannelMessage.Send, ChannelMessage.Read.All
7570
+ TEAMS_ACCESS_TOKEN=`,
7571
+ resend: `
7572
+ # Resend Email MCP Server
7573
+ # Setup guide: https://github.com/bugzy-ai/bugzy/blob/main/docs/resend-setup.md
7574
+ # Get your API key from: https://resend.com/api-keys
7575
+ RESEND_API_KEY=
7576
+ RESEND_FROM_EMAIL=`
7269
7577
  // Playwright has no required env vars (runs locally)
7270
7578
  };
7271
7579
  return configs[serverName];
@@ -7628,6 +7936,34 @@ async function firstTimeSetup(cliSubagents) {
7628
7936
  }
7629
7937
  }
7630
7938
  }
7939
+ const mcpServers = getMCPServersFromSubagents(subagents);
7940
+ const packagesToInstall = [...new Set(
7941
+ mcpServers.flatMap((s) => MCP_SERVERS[s]?.npmPackages ?? [])
7942
+ )];
7943
+ if (packagesToInstall.length > 0) {
7944
+ console.log(chalk2.cyan("\nMCP Server Packages Required:\n"));
7945
+ packagesToInstall.forEach((pkg) => console.log(chalk2.white(` \u2022 ${pkg}`)));
7946
+ const { installMCP } = await inquirer.prompt([{
7947
+ type: "confirm",
7948
+ name: "installMCP",
7949
+ message: "Install MCP packages globally now?",
7950
+ default: true
7951
+ }]);
7952
+ if (installMCP) {
7953
+ const spinner2 = ora2("Installing MCP packages").start();
7954
+ try {
7955
+ execSync3(`npm install -g ${packagesToInstall.join(" ")}`, { stdio: "pipe" });
7956
+ spinner2.succeed(chalk2.green("MCP packages installed"));
7957
+ } catch (e) {
7958
+ spinner2.fail(chalk2.red("Some packages failed to install"));
7959
+ console.log(chalk2.yellow("\nInstall manually: npm install -g " + packagesToInstall.join(" ")));
7960
+ }
7961
+ } else {
7962
+ console.log(chalk2.yellow("\n\u26A0\uFE0F MCP servers will not work until packages are installed:"));
7963
+ console.log(chalk2.white(` npm install -g ${packagesToInstall.join(" ")}
7964
+ `));
7965
+ }
7966
+ }
7631
7967
  spinner = ora2("Saving configuration").start();
7632
7968
  const projectName = path12.basename(process.cwd());
7633
7969
  const config = createDefaultConfig(projectName, tool);
@@ -7653,11 +7989,23 @@ async function firstTimeSetup(cliSubagents) {
7653
7989
  });
7654
7990
  }
7655
7991
  console.log(chalk2.green.bold("\n\u2705 Setup complete!\n"));
7992
+ console.log(chalk2.cyan("\u{1F4CB} Project Context:"));
7993
+ console.log(chalk2.white(" Edit .bugzy/runtime/project-context.md to help the AI understand your project:"));
7994
+ console.log(chalk2.gray(" \u2022 Project description and tech stack"));
7995
+ console.log(chalk2.gray(" \u2022 Team communication channels"));
7996
+ console.log(chalk2.gray(" \u2022 Bug tracking workflow"));
7997
+ console.log(chalk2.gray(" \u2022 Testing conventions\n"));
7656
7998
  console.log(chalk2.yellow("Next steps:"));
7657
7999
  console.log(chalk2.white("1. cp .env.example .env"));
7658
8000
  console.log(chalk2.white("2. Edit .env and add your API tokens"));
7659
- console.log(chalk2.white("3. npx playwright install (install browser binaries)"));
7660
- console.log(chalk2.white("4. Run:"), chalk2.cyan("bugzy"));
8001
+ if (subagents["test-runner"]) {
8002
+ console.log(chalk2.white("3. npx playwright install (install browser binaries)"));
8003
+ console.log(chalk2.white("4. Edit .bugzy/runtime/project-context.md"));
8004
+ console.log(chalk2.white("5. Run:"), chalk2.cyan("bugzy"));
8005
+ } else {
8006
+ console.log(chalk2.white("3. Edit .bugzy/runtime/project-context.md"));
8007
+ console.log(chalk2.white("4. Run:"), chalk2.cyan("bugzy"));
8008
+ }
7661
8009
  console.log();
7662
8010
  }
7663
8011
  async function reconfigureProject() {