@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.
@@ -3853,13 +3853,22 @@ async function validateProjectStructure() {
3853
3853
  }
3854
3854
  async function checkToolAvailable(command) {
3855
3855
  const { spawn: spawn2 } = await import("child_process");
3856
+ const isWindows = process.platform === "win32";
3857
+ const checkCommand = isWindows ? "where" : "which";
3856
3858
  return new Promise((resolve) => {
3857
- const proc = spawn2("which", [command]);
3859
+ const proc = spawn2(checkCommand, [command], {
3860
+ shell: isWindows
3861
+ // Windows needs shell for 'where'
3862
+ });
3858
3863
  proc.on("close", (code) => {
3859
- resolve(code === 0);
3864
+ if (code !== 0) {
3865
+ console.warn(`Warning: Could not verify '${command}' is installed (${checkCommand} check failed). Continuing anyway...`);
3866
+ }
3867
+ resolve(true);
3860
3868
  });
3861
3869
  proc.on("error", () => {
3862
- resolve(false);
3870
+ console.warn(`Warning: Could not verify '${command}' is installed (${checkCommand} not available). Continuing anyway...`);
3871
+ resolve(true);
3863
3872
  });
3864
3873
  });
3865
3874
  }
@@ -3912,21 +3921,8 @@ async function startSession(prompt) {
3912
3921
  process.exit(1);
3913
3922
  }
3914
3923
  spinner = (0, import_ora.default)(`Checking ${toolProfile.name} availability`).start();
3915
- const toolAvailable = await checkToolAvailable(toolProfile.cliCommand);
3916
- if (!toolAvailable) {
3917
- spinner.fail(import_chalk.default.red(`${toolProfile.name} CLI not found`));
3918
- console.log(import_chalk.default.yellow(`
3919
- Please install ${toolProfile.name}:`));
3920
- if (tool === "claude-code") {
3921
- console.log(import_chalk.default.cyan(" https://claude.com/claude-code"));
3922
- } else if (tool === "cursor") {
3923
- console.log(import_chalk.default.cyan(" https://www.cursor.com/"));
3924
- } else if (tool === "codex") {
3925
- console.log(import_chalk.default.cyan(" npm install -g @openai/codex"));
3926
- }
3927
- process.exit(1);
3928
- }
3929
- spinner.succeed(import_chalk.default.green(`${toolProfile.name} CLI found`));
3924
+ await checkToolAvailable(toolProfile.cliCommand);
3925
+ spinner.succeed(import_chalk.default.green(`${toolProfile.name} CLI check complete`));
3930
3926
  spinner = (0, import_ora.default)("Loading environment variables").start();
3931
3927
  const envVars = loadEnvFiles();
3932
3928
  const envCount = Object.keys(envVars).length;
@@ -5441,9 +5437,264 @@ You are not a formal report generator. You are a helpful QA engineer who knows h
5441
5437
 
5442
5438
  **Target feeling:** "This is a real person who respects my time and communicates clearly."`;
5443
5439
 
5444
- // src/subagents/templates/documentation-researcher/notion.ts
5440
+ // src/subagents/templates/team-communicator/email.ts
5445
5441
  init_cjs_shims();
5446
5442
  var FRONTMATTER6 = {
5443
+ name: "team-communicator",
5444
+ 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>`,
5445
+ tools: ["Glob", "Grep", "Read", "WebFetch", "TodoWrite", "WebSearch", "BashOutput", "KillBash", "mcp__resend__resend_send_email", "mcp__resend__resend_send_batch_emails", "ListMcpResourcesTool", "ReadMcpResourceTool"],
5446
+ model: "haiku",
5447
+ color: "yellow"
5448
+ };
5449
+ 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.
5450
+
5451
+ ## Core Philosophy: Concise, Professional Email Communication
5452
+
5453
+ **Write like a real QA engineer sending an email:**
5454
+ - Professional but conversational tone
5455
+ - Lead with impact in the subject line
5456
+ - Action items at the top of the email body
5457
+ - Target: 100-200 words for updates, 50-100 for questions
5458
+ - Maximum email length: 300 words
5459
+
5460
+ **Key Principle:** If it takes more than 1 minute to read, it's too long.
5461
+
5462
+ ## Email Structure Guidelines
5463
+
5464
+ ### Subject Line Best Practices
5465
+
5466
+ Format: \`[TYPE] Brief description - Context\`
5467
+
5468
+ Examples:
5469
+ - \`[Test Results] Smoke tests passed - Ready for release\`
5470
+ - \`[Blocker] Staging environment down - All testing blocked\`
5471
+ - \`[Question] Profile page behavior - Need clarification\`
5472
+ - \`[Update] Test plan ready - Review requested\`
5473
+
5474
+ ### Email Type Detection
5475
+
5476
+ Before composing, identify the email type:
5477
+
5478
+ #### Type 1: Status Report (FYI Update)
5479
+ **Use when:** Sharing completed test results, progress updates
5480
+ **Goal:** Inform team, no immediate action required
5481
+ **Subject:** \`[Test Results] ...\` or \`[Update] ...\`
5482
+
5483
+ #### Type 2: Question (Need Input)
5484
+ **Use when:** Need clarification, decision, or product knowledge
5485
+ **Goal:** Get specific answer quickly
5486
+ **Subject:** \`[Question] ...\`
5487
+
5488
+ #### Type 3: Blocker/Escalation (Urgent)
5489
+ **Use when:** Critical issue blocking testing or release
5490
+ **Goal:** Get immediate help/action
5491
+ **Subject:** \`[URGENT] ...\` or \`[Blocker] ...\`
5492
+
5493
+ ## Email Body Structure
5494
+
5495
+ Every email should follow this structure:
5496
+
5497
+ ### 1. TL;DR (First Line)
5498
+ One sentence summary of the main point or ask.
5499
+
5500
+ ### 2. Context (2-3 sentences)
5501
+ Brief background\u2014assume recipient is busy.
5502
+
5503
+ ### 3. Details (If needed)
5504
+ Use bullet points for easy scanning. Keep to 3-5 items max.
5505
+
5506
+ ### 4. Action Items / Next Steps
5507
+ Clear, specific asks with names if applicable.
5508
+
5509
+ ### 5. Sign-off
5510
+ Brief, professional closing.
5511
+
5512
+ ## Email Templates
5513
+
5514
+ ### Template 1: Test Results Report
5515
+
5516
+ \`\`\`
5517
+ Subject: [Test Results] [Test type] - [X/Y passed]
5518
+
5519
+ TL;DR: [One sentence summary of results and impact]
5520
+
5521
+ Results:
5522
+ - [Test category]: [X/Y passed]
5523
+ - [Key finding if any]
5524
+
5525
+ [If failures exist:]
5526
+ Key Issues:
5527
+ - [Issue 1]: [Brief description]
5528
+ - [Issue 2]: [Brief description]
5529
+
5530
+ Artifacts: [Location or link]
5531
+
5532
+ Next Steps:
5533
+ - [Action needed, if any]
5534
+ - [Timeline or ETA if blocking]
5535
+
5536
+ Best,
5537
+ Bugzy QA
5538
+ \`\`\`
5539
+
5540
+ ### Template 2: Question
5541
+
5542
+ \`\`\`
5543
+ Subject: [Question] [Topic in 3-5 words]
5544
+
5545
+ TL;DR: Need clarification on [specific topic].
5546
+
5547
+ Context:
5548
+ [1-2 sentences explaining what you found]
5549
+
5550
+ Question:
5551
+ [Specific question]
5552
+
5553
+ Options (if applicable):
5554
+ A) [Option 1]
5555
+ B) [Option 2]
5556
+
5557
+ Would appreciate a response by [timeframe if urgent].
5558
+
5559
+ Thanks,
5560
+ Bugzy QA
5561
+ \`\`\`
5562
+
5563
+ ### Template 3: Blocker/Escalation
5564
+
5565
+ \`\`\`
5566
+ Subject: [URGENT] [Impact statement]
5567
+
5568
+ TL;DR: [One sentence on what's blocked and what's needed]
5569
+
5570
+ Issue:
5571
+ [2-3 sentence technical summary]
5572
+
5573
+ Impact:
5574
+ - [What's blocked]
5575
+ - [Timeline impact if any]
5576
+
5577
+ Need:
5578
+ - [Specific action from specific person]
5579
+ - [Timeline for resolution]
5580
+
5581
+ Please respond ASAP.
5582
+
5583
+ Thanks,
5584
+ Bugzy QA
5585
+ \`\`\`
5586
+
5587
+ ### Template 4: Success/Pass Report
5588
+
5589
+ \`\`\`
5590
+ Subject: [Test Results] [Test type] passed - [X/X]
5591
+
5592
+ TL;DR: All tests passed. [Optional: key observation]
5593
+
5594
+ Results:
5595
+ - All [X] tests passed
5596
+ - Core flows verified: [list key areas]
5597
+
5598
+ No blockers for release from QA perspective.
5599
+
5600
+ Best,
5601
+ Bugzy QA
5602
+ \`\`\`
5603
+
5604
+ ## HTML Formatting Guidelines
5605
+
5606
+ When using HTML in emails:
5607
+
5608
+ - Use \`<h3>\` for section headers
5609
+ - Use \`<ul>\` and \`<li>\` for bullet lists
5610
+ - Use \`<strong>\` for emphasis (sparingly)
5611
+ - Use \`<code>\` for technical terms, IDs, or file paths
5612
+ - Keep styling minimal\u2014many email clients strip CSS
5613
+
5614
+ Example HTML structure:
5615
+ \`\`\`html
5616
+ <h3>TL;DR</h3>
5617
+ <p>Smoke tests passed (6/6). Ready for release.</p>
5618
+
5619
+ <h3>Results</h3>
5620
+ <ul>
5621
+ <li>Authentication: <strong>Passed</strong></li>
5622
+ <li>Navigation: <strong>Passed</strong></li>
5623
+ <li>Settings: <strong>Passed</strong></li>
5624
+ </ul>
5625
+
5626
+ <h3>Next Steps</h3>
5627
+ <p>No blockers from QA. Proceed with release when ready.</p>
5628
+ \`\`\`
5629
+
5630
+ ## Email-Specific Considerations
5631
+
5632
+ ### Unlike Slack:
5633
+ - **No threading**: Include all necessary context in each email
5634
+ - **No @mentions**: Use names in the text (e.g., "John, could you...")
5635
+ - **No real-time**: Don't expect immediate responses; be clear about urgency
5636
+ - **More formal**: Use complete sentences, proper grammar
5637
+
5638
+ ### Email Etiquette:
5639
+ - Keep recipients list minimal\u2014only those who need to act or be informed
5640
+ - Use CC sparingly for FYI recipients
5641
+ - Reply to threads when following up (maintain context)
5642
+ - Include links to artifacts rather than attaching large files
5643
+
5644
+ ## Anti-Patterns to Avoid
5645
+
5646
+ **Don't:**
5647
+ 1. Write lengthy introductions before getting to the point
5648
+ 2. Use overly formal language ("As per our previous correspondence...")
5649
+ 3. Bury the action item at the end of a long email
5650
+ 4. Send separate emails for related topics (consolidate)
5651
+ 5. Use HTML formatting excessively (keep it clean)
5652
+ 6. Forget to include context (recipient may see email out of order)
5653
+
5654
+ **Do:**
5655
+ 1. Lead with the most important information
5656
+ 2. Write conversationally but professionally
5657
+ 3. Make action items clear and specific
5658
+ 4. Include enough context for standalone understanding
5659
+ 5. Proofread\u2014emails are more permanent than chat
5660
+
5661
+ ## Context Discovery
5662
+
5663
+ ${MEMORY_READ_INSTRUCTIONS.replace(/{ROLE}/g, "team-communicator")}
5664
+
5665
+ **Memory Sections for Team Communicator**:
5666
+ - Email thread contexts and history
5667
+ - Team communication preferences and patterns
5668
+ - Response tracking
5669
+ - Team member email addresses and roles
5670
+ - Successful communication strategies
5671
+
5672
+ Additionally, always read:
5673
+ 1. \`.bugzy/runtime/project-context.md\` (team info, contact list, communication preferences)
5674
+
5675
+ Use this context to:
5676
+ - Identify correct recipients (from project-context.md)
5677
+ - Learn team communication preferences (from memory)
5678
+ - Address people appropriately (from project-context.md)
5679
+ - Adapt tone to team culture (from memory patterns)
5680
+
5681
+ ${MEMORY_UPDATE_INSTRUCTIONS.replace(/{ROLE}/g, "team-communicator")}
5682
+
5683
+ Specifically for team-communicator, consider updating:
5684
+ - **Email History**: Track thread contexts and ongoing conversations
5685
+ - **Team Preferences**: Document communication patterns that work well
5686
+ - **Response Patterns**: Note what types of emails get good engagement
5687
+ - **Contact Directory**: Record team member emails and roles
5688
+
5689
+ ## Final Reminder
5690
+
5691
+ 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.
5692
+
5693
+ **Target feeling:** "This is a concise, professional email from someone who respects my time and communicates clearly."`;
5694
+
5695
+ // src/subagents/templates/documentation-researcher/notion.ts
5696
+ init_cjs_shims();
5697
+ var FRONTMATTER7 = {
5447
5698
  name: "documentation-researcher",
5448
5699
  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.
5449
5700
  user: "I need to generate test cases for the new OAuth flow"
@@ -5455,7 +5706,7 @@ assistant: "I'll use the documentation-researcher agent to search our Notion doc
5455
5706
  model: "haiku",
5456
5707
  color: "cyan"
5457
5708
  };
5458
- 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.
5709
+ 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.
5459
5710
 
5460
5711
  ## Core Responsibilities
5461
5712
 
@@ -5522,7 +5773,7 @@ You are meticulous about maintaining your memory file as a living document that
5522
5773
 
5523
5774
  // src/subagents/templates/documentation-researcher/confluence.ts
5524
5775
  init_cjs_shims();
5525
- var FRONTMATTER7 = {
5776
+ var FRONTMATTER8 = {
5526
5777
  name: "documentation-researcher",
5527
5778
  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.
5528
5779
  user: "I need to create a test plan for the new user profile feature"
@@ -5534,7 +5785,7 @@ assistant: "I'll use the documentation-researcher agent to search our Confluence
5534
5785
  model: "sonnet",
5535
5786
  color: "cyan"
5536
5787
  };
5537
- 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.
5788
+ 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.
5538
5789
 
5539
5790
  ## Core Responsibilities
5540
5791
 
@@ -5635,7 +5886,7 @@ You are meticulous about maintaining your memory file as a living document that
5635
5886
 
5636
5887
  // src/subagents/templates/issue-tracker/linear.ts
5637
5888
  init_cjs_shims();
5638
- var FRONTMATTER8 = {
5889
+ var FRONTMATTER9 = {
5639
5890
  name: "issue-tracker",
5640
5891
  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.
5641
5892
  user: "The login flow is broken - users get a 500 error when submitting credentials"
@@ -5647,7 +5898,7 @@ assistant: "Let me use the issue-tracker agent to update the story status to QA
5647
5898
  model: "sonnet",
5648
5899
  color: "red"
5649
5900
  };
5650
- 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.
5901
+ 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.
5651
5902
 
5652
5903
  **Core Responsibilities:**
5653
5904
 
@@ -5816,7 +6067,7 @@ You are focused on creating bug reports that fit Linear's streamlined workflow w
5816
6067
 
5817
6068
  // src/subagents/templates/issue-tracker/jira.ts
5818
6069
  init_cjs_shims();
5819
- var FRONTMATTER9 = {
6070
+ var FRONTMATTER10 = {
5820
6071
  name: "issue-tracker",
5821
6072
  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.
5822
6073
  user: "5 tests failed in the checkout flow - payment validation is broken"
@@ -5828,7 +6079,7 @@ assistant: "Let me use the issue-tracker agent to transition PROJ-456 to Done an
5828
6079
  model: "sonnet",
5829
6080
  color: "red"
5830
6081
  };
5831
- 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.
6082
+ 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.
5832
6083
 
5833
6084
  **Core Responsibilities:**
5834
6085
 
@@ -5991,7 +6242,7 @@ init_cjs_shims();
5991
6242
 
5992
6243
  // src/subagents/templates/issue-tracker/notion.ts
5993
6244
  init_cjs_shims();
5994
- var FRONTMATTER10 = {
6245
+ var FRONTMATTER11 = {
5995
6246
  name: "issue-tracker",
5996
6247
  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.
5997
6248
  user: "The submit button on the checkout page doesn't work on mobile Safari"
@@ -6003,7 +6254,7 @@ assistant: "Let me use the issue-tracker agent to update the story status to 'QA
6003
6254
  model: "haiku",
6004
6255
  color: "red"
6005
6256
  };
6006
- 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.
6257
+ 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.
6007
6258
 
6008
6259
  **Core Responsibilities:**
6009
6260
 
@@ -6151,7 +6402,7 @@ You are meticulous about maintaining your memory file as a critical resource tha
6151
6402
 
6152
6403
  // src/subagents/templates/issue-tracker/slack.ts
6153
6404
  init_cjs_shims();
6154
- var FRONTMATTER11 = {
6405
+ var FRONTMATTER12 = {
6155
6406
  name: "issue-tracker",
6156
6407
  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.
6157
6408
  user: "3 critical tests failed in the payment flow - looks like the Stripe integration is broken"
@@ -6163,7 +6414,7 @@ assistant: "Let me use the issue-tracker agent to update the story thread with Q
6163
6414
  model: "sonnet",
6164
6415
  color: "red"
6165
6416
  };
6166
- 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.
6417
+ 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.
6167
6418
 
6168
6419
  **Core Responsibilities:**
6169
6420
 
@@ -6412,38 +6663,42 @@ var TEMPLATES = {
6412
6663
  teams: {
6413
6664
  frontmatter: FRONTMATTER5,
6414
6665
  content: CONTENT5
6666
+ },
6667
+ email: {
6668
+ frontmatter: FRONTMATTER6,
6669
+ content: CONTENT6
6415
6670
  }
6416
6671
  },
6417
6672
  "documentation-researcher": {
6418
6673
  notion: {
6419
- frontmatter: FRONTMATTER6,
6420
- content: CONTENT6
6421
- },
6422
- confluence: {
6423
6674
  frontmatter: FRONTMATTER7,
6424
6675
  content: CONTENT7
6676
+ },
6677
+ confluence: {
6678
+ frontmatter: FRONTMATTER8,
6679
+ content: CONTENT8
6425
6680
  }
6426
6681
  },
6427
6682
  "issue-tracker": {
6428
6683
  linear: {
6429
- frontmatter: FRONTMATTER8,
6430
- content: CONTENT8
6431
- },
6432
- jira: {
6433
6684
  frontmatter: FRONTMATTER9,
6434
6685
  content: CONTENT9
6435
6686
  },
6436
- "jira-server": {
6437
- frontmatter: FRONTMATTER9,
6438
- content: CONTENT9
6687
+ jira: {
6688
+ frontmatter: FRONTMATTER10,
6689
+ content: CONTENT10
6439
6690
  },
6440
- notion: {
6691
+ "jira-server": {
6441
6692
  frontmatter: FRONTMATTER10,
6442
6693
  content: CONTENT10
6443
6694
  },
6444
- slack: {
6695
+ notion: {
6445
6696
  frontmatter: FRONTMATTER11,
6446
6697
  content: CONTENT11
6698
+ },
6699
+ slack: {
6700
+ frontmatter: FRONTMATTER12,
6701
+ content: CONTENT12
6447
6702
  }
6448
6703
  }
6449
6704
  };
@@ -6511,6 +6766,14 @@ var INTEGRATIONS = {
6511
6766
  provider: "teams",
6512
6767
  requiredMCP: "mcp__teams__*",
6513
6768
  integrationType: "oauth"
6769
+ },
6770
+ email: {
6771
+ id: "email",
6772
+ name: "Email",
6773
+ provider: "resend",
6774
+ requiredMCP: "mcp__resend__*",
6775
+ integrationType: "local"
6776
+ // Uses platform API key, no OAuth needed
6514
6777
  }
6515
6778
  };
6516
6779
  var SUBAGENTS = {
@@ -6530,9 +6793,13 @@ var SUBAGENTS = {
6530
6793
  name: "Team Communicator",
6531
6794
  description: "Send notifications and updates to your team",
6532
6795
  icon: "message-square",
6533
- integrations: [INTEGRATIONS.slack, INTEGRATIONS.teams],
6796
+ integrations: [INTEGRATIONS.slack, INTEGRATIONS.teams, INTEGRATIONS.email],
6534
6797
  model: "sonnet",
6535
6798
  color: "blue",
6799
+ isRequired: true,
6800
+ // Required - falls back to email if Slack/Teams not configured
6801
+ defaultIntegration: "email",
6802
+ // Email is the fallback when OAuth integrations aren't set up
6536
6803
  version: "1.0.0"
6537
6804
  },
6538
6805
  "issue-tracker": {
@@ -6541,8 +6808,8 @@ var SUBAGENTS = {
6541
6808
  description: "Automatically create and track bugs and issues",
6542
6809
  icon: "bot",
6543
6810
  integrations: [
6544
- INTEGRATIONS.linear,
6545
- INTEGRATIONS.jira,
6811
+ // INTEGRATIONS.linear,
6812
+ // INTEGRATIONS.jira,
6546
6813
  INTEGRATIONS["jira-server"],
6547
6814
  INTEGRATIONS.notion,
6548
6815
  INTEGRATIONS.slack
@@ -6556,7 +6823,10 @@ var SUBAGENTS = {
6556
6823
  name: "Documentation Researcher",
6557
6824
  description: "Search and retrieve information from your documentation",
6558
6825
  icon: "file-search",
6559
- integrations: [INTEGRATIONS.notion, INTEGRATIONS.confluence],
6826
+ integrations: [
6827
+ INTEGRATIONS.notion
6828
+ // INTEGRATIONS.confluence
6829
+ ],
6560
6830
  model: "sonnet",
6561
6831
  color: "cyan",
6562
6832
  version: "1.0.0"
@@ -6589,6 +6859,9 @@ var SUBAGENTS = {
6589
6859
  function getAllSubAgents() {
6590
6860
  return Object.values(SUBAGENTS);
6591
6861
  }
6862
+ function getIntegration(integrationId) {
6863
+ return INTEGRATIONS[integrationId];
6864
+ }
6592
6865
  function getRequiredSubAgents() {
6593
6866
  return Object.values(SUBAGENTS).filter((agent) => agent.isRequired);
6594
6867
  }
@@ -6785,7 +7058,9 @@ function buildTaskDefinition(taskSlug, projectSubAgents) {
6785
7058
  for (const role of requiredSubAgentRoles) {
6786
7059
  const configured = projectSubAgents.find((sa) => sa.role === role);
6787
7060
  if (configured) {
6788
- requiredMCPs.add(configured.integration);
7061
+ const integrationMeta = getIntegration(configured.integration);
7062
+ const mcpProvider = integrationMeta?.provider || configured.integration;
7063
+ requiredMCPs.add(mcpProvider);
6789
7064
  }
6790
7065
  }
6791
7066
  return {
@@ -6992,6 +7267,7 @@ var MCP_SERVERS = {
6992
7267
  name: "Slack",
6993
7268
  description: "Slack MCP server for messaging and channel operations",
6994
7269
  requiresCredentials: true,
7270
+ npmPackages: ["simple-slack-mcp-server"],
6995
7271
  config: {
6996
7272
  command: "slack-mcp-server",
6997
7273
  args: [],
@@ -7005,6 +7281,7 @@ var MCP_SERVERS = {
7005
7281
  name: "Microsoft Teams",
7006
7282
  description: "Microsoft Teams MCP server for messaging and channel operations",
7007
7283
  requiresCredentials: true,
7284
+ npmPackages: ["@bugzy-ai/teams-mcp-server"],
7008
7285
  config: {
7009
7286
  command: "teams-mcp-server",
7010
7287
  args: [],
@@ -7018,6 +7295,7 @@ var MCP_SERVERS = {
7018
7295
  name: "Playwright",
7019
7296
  description: "Playwright MCP server for browser automation",
7020
7297
  requiresCredentials: false,
7298
+ npmPackages: ["@playwright/mcp"],
7021
7299
  config: {
7022
7300
  command: "mcp-server-playwright",
7023
7301
  args: [
@@ -7042,6 +7320,7 @@ var MCP_SERVERS = {
7042
7320
  name: "Notion",
7043
7321
  description: "Notion MCP server for documentation",
7044
7322
  requiresCredentials: true,
7323
+ npmPackages: ["@notionhq/notion-mcp-server"],
7045
7324
  config: {
7046
7325
  command: "notion-mcp-server",
7047
7326
  args: [],
@@ -7055,6 +7334,7 @@ var MCP_SERVERS = {
7055
7334
  name: "Jira Server (On-Prem)",
7056
7335
  description: "Jira Server MCP via tunnel for on-premise instances",
7057
7336
  requiresCredentials: true,
7337
+ npmPackages: ["@mcp-tunnel/wrapper", "@bugzy-ai/jira-mcp-server"],
7058
7338
  config: {
7059
7339
  command: "mcp-tunnel",
7060
7340
  args: ["--server", "jira-mcp-server"],
@@ -7068,6 +7348,21 @@ var MCP_SERVERS = {
7068
7348
  JIRA_PASSWORD: "${JIRA_PASSWORD}"
7069
7349
  }
7070
7350
  }
7351
+ },
7352
+ resend: {
7353
+ provider: "resend",
7354
+ name: "Email (Resend)",
7355
+ description: "Resend MCP server for sending email notifications",
7356
+ requiresCredentials: true,
7357
+ npmPackages: ["@bugzy-ai/resend-mcp-server"],
7358
+ config: {
7359
+ command: "resend-mcp-server",
7360
+ args: [],
7361
+ env: {
7362
+ RESEND_API_KEY: "${RESEND_API_KEY}",
7363
+ RESEND_FROM_EMAIL: "${RESEND_FROM_EMAIL}"
7364
+ }
7365
+ }
7071
7366
  }
7072
7367
  // github: {
7073
7368
  // provider: 'github',
@@ -7248,11 +7543,13 @@ function getMCPEnvConfig(serverName) {
7248
7543
  const configs = {
7249
7544
  slack: `
7250
7545
  # Slack MCP Server
7251
- # Get your token from: https://api.slack.com/apps
7546
+ # Setup guide: https://github.com/bugzy-ai/bugzy/blob/main/docs/slack-setup.md
7547
+ # Required scopes: channels:read, chat:write, chat:write.public, reactions:write
7252
7548
  SLACK_ACCESS_TOKEN=`,
7253
7549
  notion: `
7254
7550
  # Notion MCP Server
7255
- # Get your token from: https://www.notion.so/my-integrations
7551
+ # Setup guide: https://github.com/bugzy-ai/bugzy/blob/main/docs/notion-setup.md
7552
+ # Requires: Internal Integration Token (ntn_* or secret_*)
7256
7553
  NOTION_TOKEN=`,
7257
7554
  linear: `
7258
7555
  # Linear MCP Server
@@ -7273,7 +7570,18 @@ CONFLUENCE_API_TOKEN=`,
7273
7570
  github: `
7274
7571
  # GitHub MCP Server
7275
7572
  # Get your token from: https://github.com/settings/tokens
7276
- GITHUB_TOKEN=`
7573
+ GITHUB_TOKEN=`,
7574
+ teams: `
7575
+ # Microsoft Teams MCP Server
7576
+ # Setup guide: https://github.com/bugzy-ai/bugzy/blob/main/docs/teams-setup.md
7577
+ # Required Graph API scopes: Team.ReadBasic.All, Channel.ReadBasic.All, ChannelMessage.Send, ChannelMessage.Read.All
7578
+ TEAMS_ACCESS_TOKEN=`,
7579
+ resend: `
7580
+ # Resend Email MCP Server
7581
+ # Setup guide: https://github.com/bugzy-ai/bugzy/blob/main/docs/resend-setup.md
7582
+ # Get your API key from: https://resend.com/api-keys
7583
+ RESEND_API_KEY=
7584
+ RESEND_FROM_EMAIL=`
7277
7585
  // Playwright has no required env vars (runs locally)
7278
7586
  };
7279
7587
  return configs[serverName];
@@ -7636,6 +7944,34 @@ async function firstTimeSetup(cliSubagents) {
7636
7944
  }
7637
7945
  }
7638
7946
  }
7947
+ const mcpServers = getMCPServersFromSubagents(subagents);
7948
+ const packagesToInstall = [...new Set(
7949
+ mcpServers.flatMap((s) => MCP_SERVERS[s]?.npmPackages ?? [])
7950
+ )];
7951
+ if (packagesToInstall.length > 0) {
7952
+ console.log(import_chalk2.default.cyan("\nMCP Server Packages Required:\n"));
7953
+ packagesToInstall.forEach((pkg) => console.log(import_chalk2.default.white(` \u2022 ${pkg}`)));
7954
+ const { installMCP } = await import_inquirer.default.prompt([{
7955
+ type: "confirm",
7956
+ name: "installMCP",
7957
+ message: "Install MCP packages globally now?",
7958
+ default: true
7959
+ }]);
7960
+ if (installMCP) {
7961
+ const spinner2 = (0, import_ora2.default)("Installing MCP packages").start();
7962
+ try {
7963
+ (0, import_child_process4.execSync)(`npm install -g ${packagesToInstall.join(" ")}`, { stdio: "pipe" });
7964
+ spinner2.succeed(import_chalk2.default.green("MCP packages installed"));
7965
+ } catch (e) {
7966
+ spinner2.fail(import_chalk2.default.red("Some packages failed to install"));
7967
+ console.log(import_chalk2.default.yellow("\nInstall manually: npm install -g " + packagesToInstall.join(" ")));
7968
+ }
7969
+ } else {
7970
+ console.log(import_chalk2.default.yellow("\n\u26A0\uFE0F MCP servers will not work until packages are installed:"));
7971
+ console.log(import_chalk2.default.white(` npm install -g ${packagesToInstall.join(" ")}
7972
+ `));
7973
+ }
7974
+ }
7639
7975
  spinner = (0, import_ora2.default)("Saving configuration").start();
7640
7976
  const projectName = path11.basename(process.cwd());
7641
7977
  const config = createDefaultConfig(projectName, tool);
@@ -7661,11 +7997,23 @@ async function firstTimeSetup(cliSubagents) {
7661
7997
  });
7662
7998
  }
7663
7999
  console.log(import_chalk2.default.green.bold("\n\u2705 Setup complete!\n"));
8000
+ console.log(import_chalk2.default.cyan("\u{1F4CB} Project Context:"));
8001
+ console.log(import_chalk2.default.white(" Edit .bugzy/runtime/project-context.md to help the AI understand your project:"));
8002
+ console.log(import_chalk2.default.gray(" \u2022 Project description and tech stack"));
8003
+ console.log(import_chalk2.default.gray(" \u2022 Team communication channels"));
8004
+ console.log(import_chalk2.default.gray(" \u2022 Bug tracking workflow"));
8005
+ console.log(import_chalk2.default.gray(" \u2022 Testing conventions\n"));
7664
8006
  console.log(import_chalk2.default.yellow("Next steps:"));
7665
8007
  console.log(import_chalk2.default.white("1. cp .env.example .env"));
7666
8008
  console.log(import_chalk2.default.white("2. Edit .env and add your API tokens"));
7667
- console.log(import_chalk2.default.white("3. npx playwright install (install browser binaries)"));
7668
- console.log(import_chalk2.default.white("4. Run:"), import_chalk2.default.cyan("bugzy"));
8009
+ if (subagents["test-runner"]) {
8010
+ console.log(import_chalk2.default.white("3. npx playwright install (install browser binaries)"));
8011
+ console.log(import_chalk2.default.white("4. Edit .bugzy/runtime/project-context.md"));
8012
+ console.log(import_chalk2.default.white("5. Run:"), import_chalk2.default.cyan("bugzy"));
8013
+ } else {
8014
+ console.log(import_chalk2.default.white("3. Edit .bugzy/runtime/project-context.md"));
8015
+ console.log(import_chalk2.default.white("4. Run:"), import_chalk2.default.cyan("bugzy"));
8016
+ }
7669
8017
  console.log();
7670
8018
  }
7671
8019
  async function reconfigureProject() {