@bugzy-ai/bugzy 1.14.0 → 1.15.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.
@@ -123,9 +123,9 @@ var INTEGRATIONS = {
123
123
  }
124
124
  };
125
125
  var SUBAGENTS = {
126
- "test-runner": {
127
- role: "test-runner",
128
- name: "Test Runner",
126
+ "browser-automation": {
127
+ role: "browser-automation",
128
+ name: "Browser Automation",
129
129
  description: "Execute automated browser tests (always included)",
130
130
  icon: "play",
131
131
  integrations: [INTEGRATIONS.playwright],
@@ -182,7 +182,7 @@ var SUBAGENTS = {
182
182
  "test-code-generator": {
183
183
  role: "test-code-generator",
184
184
  name: "Test Code Generator",
185
- description: "Generate automated Playwright test scripts and Page Objects",
185
+ description: "Generate automated test scripts and page objects",
186
186
  icon: "code",
187
187
  integrations: [INTEGRATIONS.playwright],
188
188
  model: "sonnet",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/subagents/metadata.ts"],"sourcesContent":["/**\n * Sub-Agents Metadata\n * Client-safe metadata without file system access\n */\n\n/**\n * Integration type determines how credentials are obtained\n * - 'oauth': Uses Nango OAuth flow (Slack, Notion, Jira Cloud, etc.)\n * - 'local': No configuration needed (Playwright)\n * - 'custom': Custom configuration flow (Jira Server via MCP tunnel)\n */\nexport type IntegrationType = 'oauth' | 'local' | 'custom';\n\n/**\n * Integration configuration for sub-agents\n */\nexport interface SubAgentIntegration {\n id: string;\n name: string;\n provider: string;\n requiredMCP?: string;\n /** @deprecated Use integrationType instead */\n isLocal?: boolean; // True if integration doesn't require external connector (e.g., playwright)\n integrationType: IntegrationType;\n}\n\n/**\n * Sub-Agent Metadata\n */\nexport interface SubAgentMetadata {\n role: string;\n name: string;\n description: string;\n icon: string; // Icon name (e.g., 'play', 'message-square', 'bot', 'file-search')\n integrations: SubAgentIntegration[];\n model?: string;\n color?: string;\n isRequired?: boolean;\n defaultIntegration?: string; // Fallback integration ID when others aren't configured\n version: string;\n}\n\n/**\n * Available integrations by provider\n */\nexport const INTEGRATIONS: Record<string, SubAgentIntegration> = {\n linear: {\n id: 'linear',\n name: 'Linear',\n provider: 'linear',\n requiredMCP: 'mcp__linear__*',\n integrationType: 'oauth'\n },\n jira: {\n id: 'jira',\n name: 'Jira',\n provider: 'jira',\n requiredMCP: 'mcp__jira__*',\n integrationType: 'oauth'\n },\n 'jira-server': {\n id: 'jira-server',\n name: 'Jira Server',\n provider: 'jira-server',\n requiredMCP: 'mcp__jira-server__*',\n integrationType: 'custom'\n },\n 'azure-devops': {\n id: 'azure-devops',\n name: 'Azure DevOps',\n provider: 'azure-devops',\n requiredMCP: 'mcp__azure-devops__*',\n integrationType: 'oauth' // Uses Nango with API key auth for PAT\n },\n notion: {\n id: 'notion',\n name: 'Notion',\n provider: 'notion',\n requiredMCP: 'mcp__notion__*',\n integrationType: 'oauth'\n },\n confluence: {\n id: 'confluence',\n name: 'Confluence',\n provider: 'confluence',\n requiredMCP: 'mcp__confluence__*',\n integrationType: 'oauth'\n },\n slack: {\n id: 'slack',\n name: 'Slack',\n provider: 'slack',\n requiredMCP: 'mcp__slack__*',\n integrationType: 'oauth'\n },\n playwright: {\n id: 'playwright',\n name: 'Playwright',\n provider: 'playwright',\n // No requiredMCP — uses playwright-cli (CLI tool), not MCP server\n isLocal: true, // Playwright runs locally, no external connector needed\n integrationType: 'local'\n },\n teams: {\n id: 'teams',\n name: 'Microsoft Teams',\n provider: 'teams',\n requiredMCP: 'mcp__teams__*',\n integrationType: 'oauth'\n },\n email: {\n id: 'email',\n name: 'Email',\n provider: 'resend',\n requiredMCP: 'mcp__resend__*',\n integrationType: 'local' // Uses platform API key, no OAuth needed\n },\n github: {\n id: 'github',\n name: 'GitHub',\n provider: 'github',\n requiredMCP: 'mcp__github__*',\n integrationType: 'oauth'\n },\n local: {\n id: 'local',\n name: 'Local (Terminal)',\n provider: 'local',\n // No requiredMCP - uses built-in Claude Code tools (AskUserQuestion, text output)\n isLocal: true,\n integrationType: 'local'\n }\n};\n\n/**\n * Sub-Agents Registry - metadata only (templates loaded from files)\n */\nexport const SUBAGENTS: Record<string, SubAgentMetadata> = {\n 'test-runner': {\n role: 'test-runner',\n name: 'Test Runner',\n description: 'Execute automated browser tests (always included)',\n icon: 'play',\n integrations: [INTEGRATIONS.playwright],\n model: 'sonnet',\n color: 'green',\n isRequired: true,\n version: '1.0.0'\n },\n 'team-communicator': {\n role: 'team-communicator',\n name: 'Team Communicator',\n description: 'Send notifications and updates to your team',\n icon: 'message-square',\n integrations: [INTEGRATIONS.slack, INTEGRATIONS.teams, INTEGRATIONS.email],\n model: 'sonnet',\n color: 'blue',\n isRequired: true, // Required - CLI uses 'local' (auto-configured), cloud uses email fallback\n defaultIntegration: 'email', // Email fallback for cloud (CLI auto-configures 'local' separately)\n version: '1.0.0'\n },\n 'issue-tracker': {\n role: 'issue-tracker',\n name: 'Issue Tracker',\n description: 'Automatically create and track bugs and issues',\n icon: 'bot',\n integrations: [\n // INTEGRATIONS.linear,\n INTEGRATIONS.jira,\n INTEGRATIONS['jira-server'],\n INTEGRATIONS['azure-devops'],\n INTEGRATIONS.notion,\n INTEGRATIONS.slack\n ],\n model: 'sonnet',\n color: 'red',\n version: '1.0.0'\n },\n 'documentation-researcher': {\n role: 'documentation-researcher',\n name: 'Documentation Researcher',\n description: 'Search and retrieve information from your documentation',\n icon: 'file-search',\n integrations: [\n INTEGRATIONS.notion,\n INTEGRATIONS.jira,\n // INTEGRATIONS.confluence\n ],\n model: 'sonnet',\n color: 'cyan',\n version: '1.0.0'\n },\n 'test-code-generator': {\n role: 'test-code-generator',\n name: 'Test Code Generator',\n description: 'Generate automated Playwright test scripts and Page Objects',\n icon: 'code',\n integrations: [INTEGRATIONS.playwright],\n model: 'sonnet',\n color: 'purple',\n isRequired: true, // Required for automated test generation\n version: '1.0.0'\n },\n 'test-debugger-fixer': {\n role: 'test-debugger-fixer',\n name: 'Test Debugger & Fixer',\n description: 'Debug and fix failing automated tests automatically',\n icon: 'wrench',\n integrations: [INTEGRATIONS.playwright],\n model: 'sonnet',\n color: 'yellow',\n isRequired: true, // Required for automated test execution and fixing\n version: '1.0.0'\n },\n 'changelog-historian': {\n role: 'changelog-historian',\n name: 'Changelog Historian',\n description: 'Retrieves and analyzes code changes from GitHub PRs and commits',\n icon: 'git-pull-request',\n integrations: [INTEGRATIONS.github],\n model: 'haiku',\n color: 'gray',\n isRequired: false,\n version: '1.0.0'\n }\n};\n\n/**\n * Get all available sub-agents\n */\nexport function getAllSubAgents(): SubAgentMetadata[] {\n return Object.values(SUBAGENTS);\n}\n\n/**\n * Get sub-agent by role\n */\nexport function getSubAgent(role: string): SubAgentMetadata | undefined {\n return SUBAGENTS[role];\n}\n\n/**\n * Get integration by ID\n */\nexport function getIntegration(integrationId: string): SubAgentIntegration | undefined {\n return INTEGRATIONS[integrationId];\n}\n\n/**\n * Get required sub-agents (always included)\n */\nexport function getRequiredSubAgents(): SubAgentMetadata[] {\n return Object.values(SUBAGENTS).filter(agent => agent.isRequired);\n}\n\n/**\n * Get optional sub-agents (user can choose)\n */\nexport function getOptionalSubAgents(): SubAgentMetadata[] {\n return Object.values(SUBAGENTS).filter(agent => !agent.isRequired);\n}\n\n/**\n * Map integration ID to display name\n */\nexport function getIntegrationDisplayName(integrationId: string): string {\n return INTEGRATIONS[integrationId]?.name || integrationId;\n}\n\n/**\n * Get required integrations from a list of subagent roles\n */\nexport function getRequiredIntegrationsFromSubagents(roles: string[]): string[] {\n const integrations = new Set<string>();\n\n for (const role of roles) {\n const agent = SUBAGENTS[role];\n if (agent?.integrations) {\n agent.integrations.forEach(int => integrations.add(int.id));\n }\n }\n\n return Array.from(integrations);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/subagents/metadata.ts"],"sourcesContent":["/**\n * Sub-Agents Metadata\n * Client-safe metadata without file system access\n */\n\n/**\n * Integration type determines how credentials are obtained\n * - 'oauth': Uses Nango OAuth flow (Slack, Notion, Jira Cloud, etc.)\n * - 'local': No configuration needed (Playwright)\n * - 'custom': Custom configuration flow (Jira Server via MCP tunnel)\n */\nexport type IntegrationType = 'oauth' | 'local' | 'custom';\n\n/**\n * Integration configuration for sub-agents\n */\nexport interface SubAgentIntegration {\n id: string;\n name: string;\n provider: string;\n requiredMCP?: string;\n /** @deprecated Use integrationType instead */\n isLocal?: boolean; // True if integration doesn't require external connector (e.g., playwright)\n integrationType: IntegrationType;\n}\n\n/**\n * Sub-Agent Metadata\n */\nexport interface SubAgentMetadata {\n role: string;\n name: string;\n description: string;\n icon: string; // Icon name (e.g., 'play', 'message-square', 'bot', 'file-search')\n integrations: SubAgentIntegration[];\n model?: string;\n color?: string;\n isRequired?: boolean;\n defaultIntegration?: string; // Fallback integration ID when others aren't configured\n version: string;\n}\n\n/**\n * Available integrations by provider\n */\nexport const INTEGRATIONS: Record<string, SubAgentIntegration> = {\n linear: {\n id: 'linear',\n name: 'Linear',\n provider: 'linear',\n requiredMCP: 'mcp__linear__*',\n integrationType: 'oauth'\n },\n jira: {\n id: 'jira',\n name: 'Jira',\n provider: 'jira',\n requiredMCP: 'mcp__jira__*',\n integrationType: 'oauth'\n },\n 'jira-server': {\n id: 'jira-server',\n name: 'Jira Server',\n provider: 'jira-server',\n requiredMCP: 'mcp__jira-server__*',\n integrationType: 'custom'\n },\n 'azure-devops': {\n id: 'azure-devops',\n name: 'Azure DevOps',\n provider: 'azure-devops',\n requiredMCP: 'mcp__azure-devops__*',\n integrationType: 'oauth' // Uses Nango with API key auth for PAT\n },\n notion: {\n id: 'notion',\n name: 'Notion',\n provider: 'notion',\n requiredMCP: 'mcp__notion__*',\n integrationType: 'oauth'\n },\n confluence: {\n id: 'confluence',\n name: 'Confluence',\n provider: 'confluence',\n requiredMCP: 'mcp__confluence__*',\n integrationType: 'oauth'\n },\n slack: {\n id: 'slack',\n name: 'Slack',\n provider: 'slack',\n requiredMCP: 'mcp__slack__*',\n integrationType: 'oauth'\n },\n playwright: {\n id: 'playwright',\n name: 'Playwright',\n provider: 'playwright',\n // No requiredMCP — uses playwright-cli (CLI tool), not MCP server\n isLocal: true, // Playwright runs locally, no external connector needed\n integrationType: 'local'\n },\n teams: {\n id: 'teams',\n name: 'Microsoft Teams',\n provider: 'teams',\n requiredMCP: 'mcp__teams__*',\n integrationType: 'oauth'\n },\n email: {\n id: 'email',\n name: 'Email',\n provider: 'resend',\n requiredMCP: 'mcp__resend__*',\n integrationType: 'local' // Uses platform API key, no OAuth needed\n },\n github: {\n id: 'github',\n name: 'GitHub',\n provider: 'github',\n requiredMCP: 'mcp__github__*',\n integrationType: 'oauth'\n },\n local: {\n id: 'local',\n name: 'Local (Terminal)',\n provider: 'local',\n // No requiredMCP - uses built-in Claude Code tools (AskUserQuestion, text output)\n isLocal: true,\n integrationType: 'local'\n }\n};\n\n/**\n * Sub-Agents Registry - metadata only (templates loaded from files)\n */\nexport const SUBAGENTS: Record<string, SubAgentMetadata> = {\n 'browser-automation': {\n role: 'browser-automation',\n name: 'Browser Automation',\n description: 'Execute automated browser tests (always included)',\n icon: 'play',\n integrations: [INTEGRATIONS.playwright],\n model: 'sonnet',\n color: 'green',\n isRequired: true,\n version: '1.0.0'\n },\n 'team-communicator': {\n role: 'team-communicator',\n name: 'Team Communicator',\n description: 'Send notifications and updates to your team',\n icon: 'message-square',\n integrations: [INTEGRATIONS.slack, INTEGRATIONS.teams, INTEGRATIONS.email],\n model: 'sonnet',\n color: 'blue',\n isRequired: true, // Required - CLI uses 'local' (auto-configured), cloud uses email fallback\n defaultIntegration: 'email', // Email fallback for cloud (CLI auto-configures 'local' separately)\n version: '1.0.0'\n },\n 'issue-tracker': {\n role: 'issue-tracker',\n name: 'Issue Tracker',\n description: 'Automatically create and track bugs and issues',\n icon: 'bot',\n integrations: [\n // INTEGRATIONS.linear,\n INTEGRATIONS.jira,\n INTEGRATIONS['jira-server'],\n INTEGRATIONS['azure-devops'],\n INTEGRATIONS.notion,\n INTEGRATIONS.slack\n ],\n model: 'sonnet',\n color: 'red',\n version: '1.0.0'\n },\n 'documentation-researcher': {\n role: 'documentation-researcher',\n name: 'Documentation Researcher',\n description: 'Search and retrieve information from your documentation',\n icon: 'file-search',\n integrations: [\n INTEGRATIONS.notion,\n INTEGRATIONS.jira,\n // INTEGRATIONS.confluence\n ],\n model: 'sonnet',\n color: 'cyan',\n version: '1.0.0'\n },\n 'test-code-generator': {\n role: 'test-code-generator',\n name: 'Test Code Generator',\n description: 'Generate automated test scripts and page objects',\n icon: 'code',\n integrations: [INTEGRATIONS.playwright],\n model: 'sonnet',\n color: 'purple',\n isRequired: true, // Required for automated test generation\n version: '1.0.0'\n },\n 'test-debugger-fixer': {\n role: 'test-debugger-fixer',\n name: 'Test Debugger & Fixer',\n description: 'Debug and fix failing automated tests automatically',\n icon: 'wrench',\n integrations: [INTEGRATIONS.playwright],\n model: 'sonnet',\n color: 'yellow',\n isRequired: true, // Required for automated test execution and fixing\n version: '1.0.0'\n },\n 'changelog-historian': {\n role: 'changelog-historian',\n name: 'Changelog Historian',\n description: 'Retrieves and analyzes code changes from GitHub PRs and commits',\n icon: 'git-pull-request',\n integrations: [INTEGRATIONS.github],\n model: 'haiku',\n color: 'gray',\n isRequired: false,\n version: '1.0.0'\n }\n};\n\n/**\n * Get all available sub-agents\n */\nexport function getAllSubAgents(): SubAgentMetadata[] {\n return Object.values(SUBAGENTS);\n}\n\n/**\n * Get sub-agent by role\n */\nexport function getSubAgent(role: string): SubAgentMetadata | undefined {\n return SUBAGENTS[role];\n}\n\n/**\n * Get integration by ID\n */\nexport function getIntegration(integrationId: string): SubAgentIntegration | undefined {\n return INTEGRATIONS[integrationId];\n}\n\n/**\n * Get required sub-agents (always included)\n */\nexport function getRequiredSubAgents(): SubAgentMetadata[] {\n return Object.values(SUBAGENTS).filter(agent => agent.isRequired);\n}\n\n/**\n * Get optional sub-agents (user can choose)\n */\nexport function getOptionalSubAgents(): SubAgentMetadata[] {\n return Object.values(SUBAGENTS).filter(agent => !agent.isRequired);\n}\n\n/**\n * Map integration ID to display name\n */\nexport function getIntegrationDisplayName(integrationId: string): string {\n return INTEGRATIONS[integrationId]?.name || integrationId;\n}\n\n/**\n * Get required integrations from a list of subagent roles\n */\nexport function getRequiredIntegrationsFromSubagents(roles: string[]): string[] {\n const integrations = new Set<string>();\n\n for (const role of roles) {\n const agent = SUBAGENTS[role];\n if (agent?.integrations) {\n agent.integrations.forEach(int => integrations.add(int.id));\n }\n }\n\n return Array.from(integrations);\n}\n"],"mappings":"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","names":[]}
@@ -91,9 +91,9 @@ var INTEGRATIONS = {
91
91
  }
92
92
  };
93
93
  var SUBAGENTS = {
94
- "test-runner": {
95
- role: "test-runner",
96
- name: "Test Runner",
94
+ "browser-automation": {
95
+ role: "browser-automation",
96
+ name: "Browser Automation",
97
97
  description: "Execute automated browser tests (always included)",
98
98
  icon: "play",
99
99
  integrations: [INTEGRATIONS.playwright],
@@ -150,7 +150,7 @@ var SUBAGENTS = {
150
150
  "test-code-generator": {
151
151
  role: "test-code-generator",
152
152
  name: "Test Code Generator",
153
- description: "Generate automated Playwright test scripts and Page Objects",
153
+ description: "Generate automated test scripts and page objects",
154
154
  icon: "code",
155
155
  integrations: [INTEGRATIONS.playwright],
156
156
  model: "sonnet",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/subagents/metadata.ts"],"sourcesContent":["/**\n * Sub-Agents Metadata\n * Client-safe metadata without file system access\n */\n\n/**\n * Integration type determines how credentials are obtained\n * - 'oauth': Uses Nango OAuth flow (Slack, Notion, Jira Cloud, etc.)\n * - 'local': No configuration needed (Playwright)\n * - 'custom': Custom configuration flow (Jira Server via MCP tunnel)\n */\nexport type IntegrationType = 'oauth' | 'local' | 'custom';\n\n/**\n * Integration configuration for sub-agents\n */\nexport interface SubAgentIntegration {\n id: string;\n name: string;\n provider: string;\n requiredMCP?: string;\n /** @deprecated Use integrationType instead */\n isLocal?: boolean; // True if integration doesn't require external connector (e.g., playwright)\n integrationType: IntegrationType;\n}\n\n/**\n * Sub-Agent Metadata\n */\nexport interface SubAgentMetadata {\n role: string;\n name: string;\n description: string;\n icon: string; // Icon name (e.g., 'play', 'message-square', 'bot', 'file-search')\n integrations: SubAgentIntegration[];\n model?: string;\n color?: string;\n isRequired?: boolean;\n defaultIntegration?: string; // Fallback integration ID when others aren't configured\n version: string;\n}\n\n/**\n * Available integrations by provider\n */\nexport const INTEGRATIONS: Record<string, SubAgentIntegration> = {\n linear: {\n id: 'linear',\n name: 'Linear',\n provider: 'linear',\n requiredMCP: 'mcp__linear__*',\n integrationType: 'oauth'\n },\n jira: {\n id: 'jira',\n name: 'Jira',\n provider: 'jira',\n requiredMCP: 'mcp__jira__*',\n integrationType: 'oauth'\n },\n 'jira-server': {\n id: 'jira-server',\n name: 'Jira Server',\n provider: 'jira-server',\n requiredMCP: 'mcp__jira-server__*',\n integrationType: 'custom'\n },\n 'azure-devops': {\n id: 'azure-devops',\n name: 'Azure DevOps',\n provider: 'azure-devops',\n requiredMCP: 'mcp__azure-devops__*',\n integrationType: 'oauth' // Uses Nango with API key auth for PAT\n },\n notion: {\n id: 'notion',\n name: 'Notion',\n provider: 'notion',\n requiredMCP: 'mcp__notion__*',\n integrationType: 'oauth'\n },\n confluence: {\n id: 'confluence',\n name: 'Confluence',\n provider: 'confluence',\n requiredMCP: 'mcp__confluence__*',\n integrationType: 'oauth'\n },\n slack: {\n id: 'slack',\n name: 'Slack',\n provider: 'slack',\n requiredMCP: 'mcp__slack__*',\n integrationType: 'oauth'\n },\n playwright: {\n id: 'playwright',\n name: 'Playwright',\n provider: 'playwright',\n // No requiredMCP — uses playwright-cli (CLI tool), not MCP server\n isLocal: true, // Playwright runs locally, no external connector needed\n integrationType: 'local'\n },\n teams: {\n id: 'teams',\n name: 'Microsoft Teams',\n provider: 'teams',\n requiredMCP: 'mcp__teams__*',\n integrationType: 'oauth'\n },\n email: {\n id: 'email',\n name: 'Email',\n provider: 'resend',\n requiredMCP: 'mcp__resend__*',\n integrationType: 'local' // Uses platform API key, no OAuth needed\n },\n github: {\n id: 'github',\n name: 'GitHub',\n provider: 'github',\n requiredMCP: 'mcp__github__*',\n integrationType: 'oauth'\n },\n local: {\n id: 'local',\n name: 'Local (Terminal)',\n provider: 'local',\n // No requiredMCP - uses built-in Claude Code tools (AskUserQuestion, text output)\n isLocal: true,\n integrationType: 'local'\n }\n};\n\n/**\n * Sub-Agents Registry - metadata only (templates loaded from files)\n */\nexport const SUBAGENTS: Record<string, SubAgentMetadata> = {\n 'test-runner': {\n role: 'test-runner',\n name: 'Test Runner',\n description: 'Execute automated browser tests (always included)',\n icon: 'play',\n integrations: [INTEGRATIONS.playwright],\n model: 'sonnet',\n color: 'green',\n isRequired: true,\n version: '1.0.0'\n },\n 'team-communicator': {\n role: 'team-communicator',\n name: 'Team Communicator',\n description: 'Send notifications and updates to your team',\n icon: 'message-square',\n integrations: [INTEGRATIONS.slack, INTEGRATIONS.teams, INTEGRATIONS.email],\n model: 'sonnet',\n color: 'blue',\n isRequired: true, // Required - CLI uses 'local' (auto-configured), cloud uses email fallback\n defaultIntegration: 'email', // Email fallback for cloud (CLI auto-configures 'local' separately)\n version: '1.0.0'\n },\n 'issue-tracker': {\n role: 'issue-tracker',\n name: 'Issue Tracker',\n description: 'Automatically create and track bugs and issues',\n icon: 'bot',\n integrations: [\n // INTEGRATIONS.linear,\n INTEGRATIONS.jira,\n INTEGRATIONS['jira-server'],\n INTEGRATIONS['azure-devops'],\n INTEGRATIONS.notion,\n INTEGRATIONS.slack\n ],\n model: 'sonnet',\n color: 'red',\n version: '1.0.0'\n },\n 'documentation-researcher': {\n role: 'documentation-researcher',\n name: 'Documentation Researcher',\n description: 'Search and retrieve information from your documentation',\n icon: 'file-search',\n integrations: [\n INTEGRATIONS.notion,\n INTEGRATIONS.jira,\n // INTEGRATIONS.confluence\n ],\n model: 'sonnet',\n color: 'cyan',\n version: '1.0.0'\n },\n 'test-code-generator': {\n role: 'test-code-generator',\n name: 'Test Code Generator',\n description: 'Generate automated Playwright test scripts and Page Objects',\n icon: 'code',\n integrations: [INTEGRATIONS.playwright],\n model: 'sonnet',\n color: 'purple',\n isRequired: true, // Required for automated test generation\n version: '1.0.0'\n },\n 'test-debugger-fixer': {\n role: 'test-debugger-fixer',\n name: 'Test Debugger & Fixer',\n description: 'Debug and fix failing automated tests automatically',\n icon: 'wrench',\n integrations: [INTEGRATIONS.playwright],\n model: 'sonnet',\n color: 'yellow',\n isRequired: true, // Required for automated test execution and fixing\n version: '1.0.0'\n },\n 'changelog-historian': {\n role: 'changelog-historian',\n name: 'Changelog Historian',\n description: 'Retrieves and analyzes code changes from GitHub PRs and commits',\n icon: 'git-pull-request',\n integrations: [INTEGRATIONS.github],\n model: 'haiku',\n color: 'gray',\n isRequired: false,\n version: '1.0.0'\n }\n};\n\n/**\n * Get all available sub-agents\n */\nexport function getAllSubAgents(): SubAgentMetadata[] {\n return Object.values(SUBAGENTS);\n}\n\n/**\n * Get sub-agent by role\n */\nexport function getSubAgent(role: string): SubAgentMetadata | undefined {\n return SUBAGENTS[role];\n}\n\n/**\n * Get integration by ID\n */\nexport function getIntegration(integrationId: string): SubAgentIntegration | undefined {\n return INTEGRATIONS[integrationId];\n}\n\n/**\n * Get required sub-agents (always included)\n */\nexport function getRequiredSubAgents(): SubAgentMetadata[] {\n return Object.values(SUBAGENTS).filter(agent => agent.isRequired);\n}\n\n/**\n * Get optional sub-agents (user can choose)\n */\nexport function getOptionalSubAgents(): SubAgentMetadata[] {\n return Object.values(SUBAGENTS).filter(agent => !agent.isRequired);\n}\n\n/**\n * Map integration ID to display name\n */\nexport function getIntegrationDisplayName(integrationId: string): string {\n return INTEGRATIONS[integrationId]?.name || integrationId;\n}\n\n/**\n * Get required integrations from a list of subagent roles\n */\nexport function getRequiredIntegrationsFromSubagents(roles: string[]): string[] {\n const integrations = new Set<string>();\n\n for (const role of roles) {\n const agent = SUBAGENTS[role];\n if (agent?.integrations) {\n agent.integrations.forEach(int => integrations.add(int.id));\n }\n }\n\n return Array.from(integrations);\n}\n"],"mappings":";AA6CO,IAAM,eAAoD;AAAA,EAC/D,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,eAAe;AAAA,IACb,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,gBAAgB;AAAA,IACd,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,iBAAiB;AAAA;AAAA,EACnB;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA;AAAA,IAEV,SAAS;AAAA;AAAA,IACT,iBAAiB;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,iBAAiB;AAAA;AAAA,EACnB;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA;AAAA,IAEV,SAAS;AAAA,IACT,iBAAiB;AAAA,EACnB;AACF;AAKO,IAAM,YAA8C;AAAA,EACzD,eAAe;AAAA,IACb,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,IACN,cAAc,CAAC,aAAa,UAAU;AAAA,IACtC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,SAAS;AAAA,EACX;AAAA,EACA,qBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,IACN,cAAc,CAAC,aAAa,OAAO,aAAa,OAAO,aAAa,KAAK;AAAA,IACzE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA;AAAA,IACZ,oBAAoB;AAAA;AAAA,IACpB,SAAS;AAAA,EACX;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,IACN,cAAc;AAAA;AAAA,MAEZ,aAAa;AAAA,MACb,aAAa,aAAa;AAAA,MAC1B,aAAa,cAAc;AAAA,MAC3B,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EACA,4BAA4B;AAAA,IAC1B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,IACN,cAAc;AAAA,MACZ,aAAa;AAAA,MACb,aAAa;AAAA;AAAA,IAEf;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EACA,uBAAuB;AAAA,IACrB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,IACN,cAAc,CAAC,aAAa,UAAU;AAAA,IACtC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA;AAAA,IACZ,SAAS;AAAA,EACX;AAAA,EACA,uBAAuB;AAAA,IACrB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,IACN,cAAc,CAAC,aAAa,UAAU;AAAA,IACtC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA;AAAA,IACZ,SAAS;AAAA,EACX;AAAA,EACA,uBAAuB;AAAA,IACrB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,MAAM;AAAA,IACN,cAAc,CAAC,aAAa,MAAM;AAAA,IAClC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,SAAS;AAAA,EACX;AACF;AAKO,SAAS,kBAAsC;AACpD,SAAO,OAAO,OAAO,SAAS;AAChC;AAKO,SAAS,YAAY,MAA4C;AACtE,SAAO,UAAU,IAAI;AACvB;AAKO,SAAS,eAAe,eAAwD;AACrF,SAAO,aAAa,aAAa;AACnC;AAKO,SAAS,uBAA2C;AACzD,SAAO,OAAO,OAAO,SAAS,EAAE,OAAO,WAAS,MAAM,UAAU;AAClE;AAKO,SAAS,uBAA2C;AACzD,SAAO,OAAO,OAAO,SAAS,EAAE,OAAO,WAAS,CAAC,MAAM,UAAU;AACnE;AAKO,SAAS,0BAA0B,eAA+B;AACvE,SAAO,aAAa,aAAa,GAAG,QAAQ;AAC9C;AAKO,SAAS,qCAAqC,OAA2B;AAC9E,QAAM,eAAe,oBAAI,IAAY;AAErC,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,UAAU,IAAI;AAC5B,QAAI,OAAO,cAAc;AACvB,YAAM,aAAa,QAAQ,SAAO,aAAa,IAAI,IAAI,EAAE,CAAC;AAAA,IAC5D;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,YAAY;AAChC;","names":[]}
1
+ {"version":3,"sources":["../../src/subagents/metadata.ts"],"sourcesContent":["/**\n * Sub-Agents Metadata\n * Client-safe metadata without file system access\n */\n\n/**\n * Integration type determines how credentials are obtained\n * - 'oauth': Uses Nango OAuth flow (Slack, Notion, Jira Cloud, etc.)\n * - 'local': No configuration needed (Playwright)\n * - 'custom': Custom configuration flow (Jira Server via MCP tunnel)\n */\nexport type IntegrationType = 'oauth' | 'local' | 'custom';\n\n/**\n * Integration configuration for sub-agents\n */\nexport interface SubAgentIntegration {\n id: string;\n name: string;\n provider: string;\n requiredMCP?: string;\n /** @deprecated Use integrationType instead */\n isLocal?: boolean; // True if integration doesn't require external connector (e.g., playwright)\n integrationType: IntegrationType;\n}\n\n/**\n * Sub-Agent Metadata\n */\nexport interface SubAgentMetadata {\n role: string;\n name: string;\n description: string;\n icon: string; // Icon name (e.g., 'play', 'message-square', 'bot', 'file-search')\n integrations: SubAgentIntegration[];\n model?: string;\n color?: string;\n isRequired?: boolean;\n defaultIntegration?: string; // Fallback integration ID when others aren't configured\n version: string;\n}\n\n/**\n * Available integrations by provider\n */\nexport const INTEGRATIONS: Record<string, SubAgentIntegration> = {\n linear: {\n id: 'linear',\n name: 'Linear',\n provider: 'linear',\n requiredMCP: 'mcp__linear__*',\n integrationType: 'oauth'\n },\n jira: {\n id: 'jira',\n name: 'Jira',\n provider: 'jira',\n requiredMCP: 'mcp__jira__*',\n integrationType: 'oauth'\n },\n 'jira-server': {\n id: 'jira-server',\n name: 'Jira Server',\n provider: 'jira-server',\n requiredMCP: 'mcp__jira-server__*',\n integrationType: 'custom'\n },\n 'azure-devops': {\n id: 'azure-devops',\n name: 'Azure DevOps',\n provider: 'azure-devops',\n requiredMCP: 'mcp__azure-devops__*',\n integrationType: 'oauth' // Uses Nango with API key auth for PAT\n },\n notion: {\n id: 'notion',\n name: 'Notion',\n provider: 'notion',\n requiredMCP: 'mcp__notion__*',\n integrationType: 'oauth'\n },\n confluence: {\n id: 'confluence',\n name: 'Confluence',\n provider: 'confluence',\n requiredMCP: 'mcp__confluence__*',\n integrationType: 'oauth'\n },\n slack: {\n id: 'slack',\n name: 'Slack',\n provider: 'slack',\n requiredMCP: 'mcp__slack__*',\n integrationType: 'oauth'\n },\n playwright: {\n id: 'playwright',\n name: 'Playwright',\n provider: 'playwright',\n // No requiredMCP — uses playwright-cli (CLI tool), not MCP server\n isLocal: true, // Playwright runs locally, no external connector needed\n integrationType: 'local'\n },\n teams: {\n id: 'teams',\n name: 'Microsoft Teams',\n provider: 'teams',\n requiredMCP: 'mcp__teams__*',\n integrationType: 'oauth'\n },\n email: {\n id: 'email',\n name: 'Email',\n provider: 'resend',\n requiredMCP: 'mcp__resend__*',\n integrationType: 'local' // Uses platform API key, no OAuth needed\n },\n github: {\n id: 'github',\n name: 'GitHub',\n provider: 'github',\n requiredMCP: 'mcp__github__*',\n integrationType: 'oauth'\n },\n local: {\n id: 'local',\n name: 'Local (Terminal)',\n provider: 'local',\n // No requiredMCP - uses built-in Claude Code tools (AskUserQuestion, text output)\n isLocal: true,\n integrationType: 'local'\n }\n};\n\n/**\n * Sub-Agents Registry - metadata only (templates loaded from files)\n */\nexport const SUBAGENTS: Record<string, SubAgentMetadata> = {\n 'browser-automation': {\n role: 'browser-automation',\n name: 'Browser Automation',\n description: 'Execute automated browser tests (always included)',\n icon: 'play',\n integrations: [INTEGRATIONS.playwright],\n model: 'sonnet',\n color: 'green',\n isRequired: true,\n version: '1.0.0'\n },\n 'team-communicator': {\n role: 'team-communicator',\n name: 'Team Communicator',\n description: 'Send notifications and updates to your team',\n icon: 'message-square',\n integrations: [INTEGRATIONS.slack, INTEGRATIONS.teams, INTEGRATIONS.email],\n model: 'sonnet',\n color: 'blue',\n isRequired: true, // Required - CLI uses 'local' (auto-configured), cloud uses email fallback\n defaultIntegration: 'email', // Email fallback for cloud (CLI auto-configures 'local' separately)\n version: '1.0.0'\n },\n 'issue-tracker': {\n role: 'issue-tracker',\n name: 'Issue Tracker',\n description: 'Automatically create and track bugs and issues',\n icon: 'bot',\n integrations: [\n // INTEGRATIONS.linear,\n INTEGRATIONS.jira,\n INTEGRATIONS['jira-server'],\n INTEGRATIONS['azure-devops'],\n INTEGRATIONS.notion,\n INTEGRATIONS.slack\n ],\n model: 'sonnet',\n color: 'red',\n version: '1.0.0'\n },\n 'documentation-researcher': {\n role: 'documentation-researcher',\n name: 'Documentation Researcher',\n description: 'Search and retrieve information from your documentation',\n icon: 'file-search',\n integrations: [\n INTEGRATIONS.notion,\n INTEGRATIONS.jira,\n // INTEGRATIONS.confluence\n ],\n model: 'sonnet',\n color: 'cyan',\n version: '1.0.0'\n },\n 'test-code-generator': {\n role: 'test-code-generator',\n name: 'Test Code Generator',\n description: 'Generate automated test scripts and page objects',\n icon: 'code',\n integrations: [INTEGRATIONS.playwright],\n model: 'sonnet',\n color: 'purple',\n isRequired: true, // Required for automated test generation\n version: '1.0.0'\n },\n 'test-debugger-fixer': {\n role: 'test-debugger-fixer',\n name: 'Test Debugger & Fixer',\n description: 'Debug and fix failing automated tests automatically',\n icon: 'wrench',\n integrations: [INTEGRATIONS.playwright],\n model: 'sonnet',\n color: 'yellow',\n isRequired: true, // Required for automated test execution and fixing\n version: '1.0.0'\n },\n 'changelog-historian': {\n role: 'changelog-historian',\n name: 'Changelog Historian',\n description: 'Retrieves and analyzes code changes from GitHub PRs and commits',\n icon: 'git-pull-request',\n integrations: [INTEGRATIONS.github],\n model: 'haiku',\n color: 'gray',\n isRequired: false,\n version: '1.0.0'\n }\n};\n\n/**\n * Get all available sub-agents\n */\nexport function getAllSubAgents(): SubAgentMetadata[] {\n return Object.values(SUBAGENTS);\n}\n\n/**\n * Get sub-agent by role\n */\nexport function getSubAgent(role: string): SubAgentMetadata | undefined {\n return SUBAGENTS[role];\n}\n\n/**\n * Get integration by ID\n */\nexport function getIntegration(integrationId: string): SubAgentIntegration | undefined {\n return INTEGRATIONS[integrationId];\n}\n\n/**\n * Get required sub-agents (always included)\n */\nexport function getRequiredSubAgents(): SubAgentMetadata[] {\n return Object.values(SUBAGENTS).filter(agent => agent.isRequired);\n}\n\n/**\n * Get optional sub-agents (user can choose)\n */\nexport function getOptionalSubAgents(): SubAgentMetadata[] {\n return Object.values(SUBAGENTS).filter(agent => !agent.isRequired);\n}\n\n/**\n * Map integration ID to display name\n */\nexport function getIntegrationDisplayName(integrationId: string): string {\n return INTEGRATIONS[integrationId]?.name || integrationId;\n}\n\n/**\n * Get required integrations from a list of subagent roles\n */\nexport function getRequiredIntegrationsFromSubagents(roles: string[]): string[] {\n const integrations = new Set<string>();\n\n for (const role of roles) {\n const agent = SUBAGENTS[role];\n if (agent?.integrations) {\n agent.integrations.forEach(int => integrations.add(int.id));\n }\n }\n\n return Array.from(integrations);\n}\n"],"mappings":"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","names":[]}
@@ -56,9 +56,9 @@ var TASK_SLUGS = {
56
56
  var generateTestCasesTask = {
57
57
  slug: TASK_SLUGS.GENERATE_TEST_CASES,
58
58
  name: "Generate Test Cases",
59
- description: "Generate manual test case documentation AND automated Playwright test scripts from test plan",
59
+ description: "Generate manual test case documentation AND automated test scripts from test plan",
60
60
  frontmatter: {
61
- description: "Generate manual test case documentation AND automated Playwright test scripts from test plan",
61
+ description: "Generate manual test case documentation AND automated test scripts from test plan",
62
62
  "argument-hint": "--type [exploratory|functional|regression|smoke] --focus [optional-feature]"
63
63
  },
64
64
  steps: [
@@ -66,12 +66,12 @@ var generateTestCasesTask = {
66
66
  {
67
67
  inline: true,
68
68
  title: "Generate Test Cases Overview",
69
- content: `Generate comprehensive test artifacts including BOTH manual test case documentation AND automated Playwright test scripts.
69
+ content: `Generate comprehensive test artifacts including BOTH manual test case documentation AND automated test scripts. Read \`./tests/CLAUDE.md\` for framework-specific conventions, directory structure, and commands.
70
70
 
71
71
  This command generates:
72
72
  1. **Manual Test Case Documentation** (in \`./test-cases/\`) - Human-readable test cases in markdown format
73
- 2. **Automated Playwright Tests** (in \`./tests/specs/\`) - Executable TypeScript test scripts
74
- 3. **Page Object Models** (in \`./tests/pages/\`) - Reusable page classes for automated tests
73
+ 2. **Automated Test Scripts** (in directory from \`./tests/CLAUDE.md\`) - Executable test scripts
74
+ 3. **Page Objects** (in directory from \`./tests/CLAUDE.md\`) - Reusable page classes for automated tests
75
75
  4. **Supporting Files** (fixtures, helpers, components) - As needed for test automation`
76
76
  },
77
77
  // Step 2: Security Notice (library)
@@ -106,9 +106,9 @@ Read the test plan from \`test-plan.md\` to understand:
106
106
 
107
107
  **1.2 Check Existing Test Cases and Tests**
108
108
  - List all files in \`./test-cases/\` to understand existing manual test coverage
109
- - List all files in \`./tests/specs/\` to understand existing automated tests
109
+ - List existing automated tests in the test directory (see \`./tests/CLAUDE.md\` for structure)
110
110
  - Determine next test case ID (TC-XXX format)
111
- - Identify existing Page Objects in \`./tests/pages/\`
111
+ - Identify existing page objects (see \`./tests/CLAUDE.md\` for directory)
112
112
  - Avoid creating overlapping test cases or duplicate automation`
113
113
  },
114
114
  // Step 6: Documentation Researcher (conditional library step)
@@ -217,8 +217,8 @@ Before invoking the agent, identify the test cases for the current area:
217
217
  - Test type: {type}
218
218
  - Test plan: test-plan.md
219
219
  - Manual test cases directory: ./test-cases/
220
- - Existing automated tests: ./tests/specs/
221
- - Existing Page Objects: ./tests/pages/
220
+ - Existing automated tests: [directory from ./tests/CLAUDE.md]
221
+ - Existing page objects: [directory from ./tests/CLAUDE.md]
222
222
 
223
223
  **Knowledge Base Patterns (MUST APPLY):**
224
224
  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.
@@ -229,7 +229,7 @@ Include ALL relevant testing patterns from the knowledge base that apply to this
229
229
  3. Explore the feature area to understand implementation (gather selectors, URLs, flows)
230
230
  4. Build missing Page Objects and supporting code
231
231
  5. For each test case marked \`automated: true\`:
232
- - Create automated Playwright test in ./tests/specs/
232
+ - Create automated test in the test directory (from ./tests/CLAUDE.md)
233
233
  - Update the manual test case file to reference the automated test path
234
234
  - Apply ALL knowledge base patterns listed above (timing, selectors, assertions)
235
235
  6. Run and iterate on each test until it passes or fails with a product bug
@@ -260,15 +260,7 @@ Move to the next area and repeat until all areas are complete.
260
260
  {
261
261
  inline: true,
262
262
  title: "Create Directories if Needed",
263
- content: `Ensure required directories exist:
264
- \`\`\`bash
265
- mkdir -p ./test-cases
266
- mkdir -p ./tests/specs
267
- mkdir -p ./tests/pages
268
- mkdir -p ./tests/components
269
- mkdir -p ./tests/fixtures
270
- mkdir -p ./tests/helpers
271
- \`\`\``
263
+ content: `Ensure required directories exist. Create the \`./test-cases/\` directory for manual test cases, and create the test directories specified in \`./tests/CLAUDE.md\` (test specs, page objects, components, fixtures, helpers).`
272
264
  },
273
265
  // Step 14: Extract Env Variables (library)
274
266
  "extract-env-variables",
@@ -288,7 +280,7 @@ mkdir -p ./tests/helpers
288
280
  - Features covered by automation
289
281
  - Areas kept manual-only (and why)
290
282
  3. Highlight key automated test scenarios
291
- 4. Share command to run automated tests: npx playwright test
283
+ 4. Share command to run automated tests (from \`./tests/CLAUDE.md\`)
292
284
  5. Ask for team review and validation
293
285
  6. Mention any areas needing exploration or clarification
294
286
  7. Use appropriate channel and threading for the update
@@ -333,8 +325,8 @@ The team communication should include:
333
325
  - Areas kept manual-only (and why)
334
326
 
335
327
  **Next Steps:**
336
- - Command to run automated tests: \`npx playwright test\`
337
- - Instructions to run specific test file
328
+ - Command to run automated tests (from \`./tests/CLAUDE.md\`)
329
+ - Instructions to run specific test file (from \`./tests/CLAUDE.md\`)
338
330
  - Note about copying .env.testdata to .env
339
331
  - Mention any exploration needed for edge cases
340
332
 
@@ -350,7 +342,7 @@ The team communication should include:
350
342
  - **Test Independence**: Each test must be runnable in isolation and in parallel`
351
343
  }
352
344
  ],
353
- requiredSubagents: ["test-runner", "test-code-generator"],
345
+ requiredSubagents: ["browser-automation", "test-code-generator"],
354
346
  optionalSubagents: ["documentation-researcher", "team-communicator"],
355
347
  dependentTasks: []
356
348
  };
@@ -549,7 +541,7 @@ The team communication should include:
549
541
  - Instructions for the user to fill in actual values in .env.testdata before running tests`
550
542
  }
551
543
  ],
552
- requiredSubagents: ["test-runner"],
544
+ requiredSubagents: ["browser-automation"],
553
545
  optionalSubagents: ["documentation-researcher", "team-communicator"],
554
546
  dependentTasks: []
555
547
  };
@@ -633,7 +625,28 @@ The handler file contains all necessary processing logic for the detected intent
633
625
  - Response guidelines
634
626
  - Memory update instructions`
635
627
  },
636
- // Step 6: Clarification Protocol (for ambiguous intents)
628
+ // Step 6: Post Response via Team Communicator
629
+ {
630
+ inline: true,
631
+ title: "Post Response to Team",
632
+ content: `## Post Response to the Team
633
+
634
+ After processing the message through the handler and composing your response:
635
+
636
+ {{INVOKE_TEAM_COMMUNICATOR}} to post the response back to the team.
637
+
638
+ **Context to include in the delegation:**
639
+ - The original message/question from the team member
640
+ - Your composed response with all gathered data
641
+ - Whether this should be a thread reply (if the original message was in a thread) or a new message
642
+ - The relevant channel (from project-context.md)
643
+
644
+ **Do NOT:**
645
+ - Skip posting and just display the response as text output
646
+ - Ask the user whether to post \u2014 the message came from the team, the response goes back to the team
647
+ - Compose a draft without sending it`
648
+ },
649
+ // Step 7: Clarification Protocol (for ambiguous intents)
637
650
  "clarification-protocol",
638
651
  // Step 8: Knowledge Base Update (library)
639
652
  "update-knowledge-base",
@@ -1050,7 +1063,7 @@ After queuing and notifying, the task is DONE. Do NOT:
1050
1063
  - Execute /verify-changes, /run-tests, /generate-test-cases directly
1051
1064
  - Wait for team response (messaging infrastructure handles that)
1052
1065
  - Create or modify test files
1053
- - Run Playwright tests
1066
+ - Run automated tests
1054
1067
 
1055
1068
  #### 5.6 Update Event Processor Memory
1056
1069
  If new patterns discovered, append to \`.bugzy/runtime/memory/event-processor.md\`:
@@ -1157,10 +1170,10 @@ Create files if they don't exist:
1157
1170
  var runTestsTask = {
1158
1171
  slug: TASK_SLUGS.RUN_TESTS,
1159
1172
  name: "Run Tests",
1160
- description: "Execute automated Playwright tests, analyze failures, and fix test issues automatically",
1173
+ description: "Execute automated tests, analyze failures, and fix test issues automatically",
1161
1174
  frontmatter: {
1162
- description: "Execute automated Playwright tests, analyze failures, and fix test issues automatically",
1163
- "argument-hint": '[file-pattern|tag|all] (e.g., "auth", "@smoke", "tests/specs/login.spec.ts")'
1175
+ description: "Execute automated tests, analyze failures, and fix test issues automatically",
1176
+ "argument-hint": '[file-pattern|tag|all] (e.g., "auth", "@smoke", or a specific test file path)'
1164
1177
  },
1165
1178
  steps: [
1166
1179
  // Step 1: Overview (inline)
@@ -1169,7 +1182,7 @@ var runTestsTask = {
1169
1182
  title: "Run Tests Overview",
1170
1183
  content: `# Run Tests Command
1171
1184
 
1172
- Execute automated Playwright tests, analyze failures using JSON reports, automatically fix test issues, and log product bugs.`
1185
+ Execute automated tests, analyze failures using JSON reports, automatically fix test issues, and log product bugs. Read \`./tests/CLAUDE.md\` for framework-specific conventions and commands.`
1173
1186
  },
1174
1187
  // Step 2: Security Notice (library)
1175
1188
  "security-notice",
@@ -1182,9 +1195,9 @@ Execute automated Playwright tests, analyze failures using JSON reports, automat
1182
1195
  **Parse Arguments:**
1183
1196
  Extract the following from arguments:
1184
1197
  - **selector**: Test selection criteria
1185
- - File pattern: "auth" \u2192 finds tests/specs/**/*auth*.spec.ts
1186
- - Tag: "@smoke" \u2192 runs tests with @smoke annotation
1187
- - Specific file: "tests/specs/login.spec.ts"
1198
+ - File pattern: "auth" \u2192 find matching test files (see \`./tests/CLAUDE.md\` for directory structure)
1199
+ - Tag: "@smoke" \u2192 runs tests with tag annotation
1200
+ - Specific file: path to a specific test file
1188
1201
  - All tests: "all" or "" \u2192 runs entire test suite`
1189
1202
  },
1190
1203
  // Step 4: Load Project Context (library)
@@ -1200,34 +1213,26 @@ Extract the following from arguments:
1200
1213
  inline: true,
1201
1214
  title: "Identify Automated Tests to Run",
1202
1215
  content: `#### Understand Test Selection
1216
+
1217
+ Read \`./tests/CLAUDE.md\` for the test directory structure, file patterns, and execution commands.
1218
+
1203
1219
  Parse the selector argument to determine which tests to run:
1204
1220
 
1205
1221
  **File Pattern** (e.g., "auth", "login"):
1206
- - Find matching test files: \`tests/specs/**/*[pattern]*.spec.ts\`
1222
+ - Find matching test files in the test directory specified by \`./tests/CLAUDE.md\`
1207
1223
  - Example: "auth" \u2192 finds all test files with "auth" in the name
1208
1224
 
1209
1225
  **Tag** (e.g., "@smoke", "@regression"):
1210
- - Run tests with specific Playwright tag annotation
1211
- - Use Playwright's \`--grep\` option
1226
+ - Run tests with specific tag annotation using the tag command from \`./tests/CLAUDE.md\`
1212
1227
 
1213
- **Specific File** (e.g., "tests/specs/auth/login.spec.ts"):
1214
- - Run that specific test file
1228
+ **Specific File**:
1229
+ - Run that specific test file using the single-file command from \`./tests/CLAUDE.md\`
1215
1230
 
1216
1231
  **All Tests** ("all" or no selector):
1217
- - Run entire test suite: \`tests/specs/**/*.spec.ts\`
1232
+ - Run entire test suite using the run-all command from \`./tests/CLAUDE.md\`
1218
1233
 
1219
1234
  #### Find Matching Test Files
1220
- Use glob patterns to find test files:
1221
- \`\`\`bash
1222
- # For file pattern
1223
- ls tests/specs/**/*[pattern]*.spec.ts
1224
-
1225
- # For specific file
1226
- ls tests/specs/auth/login.spec.ts
1227
-
1228
- # For all tests
1229
- ls tests/specs/**/*.spec.ts
1230
- \`\`\`
1235
+ Use glob patterns to find test files in the directory structure defined by \`./tests/CLAUDE.md\`.
1231
1236
 
1232
1237
  #### Validate Test Files Exist
1233
1238
  Check that at least one test file was found:
@@ -1241,7 +1246,7 @@ Before running tests, confirm the selection with the user if ambiguous:
1241
1246
  - **No selector** (all tests): Confirm running full suite before executing`
1242
1247
  },
1243
1248
  // Step 7-10: Test Execution (library steps)
1244
- "run-playwright-tests",
1249
+ "run-tests",
1245
1250
  "parse-test-results",
1246
1251
  "triage-failures",
1247
1252
  "fix-test-issues",
@@ -1267,8 +1272,8 @@ If no test cases match the selection criteria:
1267
1272
  2. List available test cases or suggest running \`/generate-test-cases\` first
1268
1273
  3. Provide examples of valid selection criteria
1269
1274
 
1270
- #### If Test Runner Agent Fails
1271
- If the test-runner agent encounters issues:
1275
+ #### If Browser Automation Agent Fails
1276
+ If the browser-automation agent encounters issues:
1272
1277
  1. Report the specific error
1273
1278
  2. Suggest troubleshooting steps
1274
1279
  3. Offer to run tests individually if batch execution failed
@@ -1282,18 +1287,18 @@ If selected test cases have formatting issues:
1282
1287
  ### Important Notes
1283
1288
 
1284
1289
  **Test Selection Strategy**:
1285
- - **Always read** \`.bugzy/runtime/test-execution-strategy.md\` before selecting tests
1290
+ - **Always read** \`./tests/docs/test-execution-strategy.md\` before selecting tests
1286
1291
  - Default to \`@smoke\` tests for fast validation unless user explicitly requests otherwise
1287
1292
  - Smoke tests provide 100% manual test case coverage with zero redundancy (~2-5 min)
1288
1293
  - Full regression includes intentional redundancy for diagnostic value (~10-15 min)
1289
1294
  - Use context keywords from user request to choose appropriate tier
1290
1295
 
1291
1296
  **Test Execution**:
1292
- - Automated Playwright tests are executed via bash command, not through agents
1297
+ - Automated tests are executed via bash command, not through agents
1293
1298
  - Test execution time varies by tier (see strategy document for details)
1294
1299
  - JSON reports provide structured test results for analysis
1295
- - Playwright automatically captures traces, screenshots, and videos on failures
1296
- - Test artifacts are stored in test-results/ directory
1300
+ - Test framework may capture traces, screenshots, and videos on failures (see \`./tests/CLAUDE.md\`)
1301
+ - Test artifacts are stored as defined in \`./tests/CLAUDE.md\`
1297
1302
 
1298
1303
  **Failure Handling**:
1299
1304
  - Test failures are automatically triaged (product bugs vs test issues)
@@ -1303,11 +1308,11 @@ If selected test cases have formatting issues:
1303
1308
  - Critical failures trigger immediate team notification
1304
1309
 
1305
1310
  **Related Documentation**:
1306
- - \`.bugzy/runtime/test-execution-strategy.md\` - When and why to run specific tests
1307
- - \`.bugzy/runtime/testing-best-practices.md\` - How to write tests (patterns and anti-patterns)`
1311
+ - \`./tests/docs/test-execution-strategy.md\` - When and why to run specific tests
1312
+ - \`./tests/docs/testing-best-practices.md\` - How to write tests (patterns and anti-patterns)`
1308
1313
  }
1309
1314
  ],
1310
- requiredSubagents: ["test-runner", "test-debugger-fixer"],
1315
+ requiredSubagents: ["browser-automation", "test-debugger-fixer"],
1311
1316
  optionalSubagents: ["issue-tracker", "team-communicator"],
1312
1317
  dependentTasks: []
1313
1318
  };
@@ -1331,7 +1336,7 @@ var verifyChangesTask = {
1331
1336
  ## Overview
1332
1337
 
1333
1338
  This task performs comprehensive change verification with:
1334
- - **Automated testing**: Execute Playwright tests with automatic triage and fixing
1339
+ - **Automated testing**: Execute automated tests with automatic triage and fixing
1335
1340
  - **Manual verification checklists**: Generate role-specific checklists for non-automatable scenarios
1336
1341
  - **Multi-trigger support**: Works from manual CLI, Slack messages, GitHub PRs, and CI/CD
1337
1342
  - **Smart output routing**: Results formatted and delivered to the appropriate channel`
@@ -1562,11 +1567,11 @@ Analyze the change description to identify affected feature areas:
1562
1567
 
1563
1568
  | Description Keywords | Inferred Test Scope | Example |
1564
1569
  |---------------------|-------------------|---------|
1565
- | "login", "authentication", "sign in/up" | \`tests/specs/auth/\` | "Fix login page validation" -> Auth tests |
1566
- | "checkout", "payment", "purchase" | \`tests/specs/checkout/\` | "Optimize checkout flow" -> Checkout tests |
1567
- | "cart", "shopping cart", "add to cart" | \`tests/specs/cart/\` | "Update cart calculations" -> Cart tests |
1570
+ | "login", "authentication", "sign in/up" | Auth test suite | "Fix login page validation" -> Auth tests |
1571
+ | "checkout", "payment", "purchase" | Checkout test suite | "Optimize checkout flow" -> Checkout tests |
1572
+ | "cart", "shopping cart", "add to cart" | Cart test suite | "Update cart calculations" -> Cart tests |
1568
1573
  | "API", "endpoint", "backend" | API test suites | "Add new user API endpoint" -> User API tests |
1569
- | "profile", "account", "settings" | \`tests/specs/profile/\` or \`tests/specs/settings/\` | "Profile page redesign" -> Profile tests |
1574
+ | "profile", "account", "settings" | Profile/settings test suite | "Profile page redesign" -> Profile tests |
1570
1575
 
1571
1576
  **Inference strategy:**
1572
1577
  1. **Extract feature keywords** from PR title and description
@@ -1641,13 +1646,13 @@ If the Jira issue or PR references test accounts/data (e.g., TEST_PREMIUM_USER,
1641
1646
 
1642
1647
  **CRITICAL**: Never conclude "manual verification required" or "BLOCKED" solely because test data is missing. Always create the test artifacts first.
1643
1648
 
1644
- ### Generate Playwright Specs
1649
+ ### Generate Automated Test Specs
1645
1650
 
1646
1651
  {{INVOKE_TEST_CODE_GENERATOR}} to create automated test specs:
1647
1652
  - Read the manual test cases you just created
1648
1653
  - Explore the feature in the browser to discover selectors and flows
1649
- - Create Page Objects in \`./tests/pages/\` if needed
1650
- - Create test specs in \`./tests/specs/\` matching the test cases
1654
+ - Create page objects in the directory specified by \`./tests/CLAUDE.md\`
1655
+ - Create test specs in the directory specified by \`./tests/CLAUDE.md\`
1651
1656
  - Run each new test to verify it passes
1652
1657
  - Update the manual test case with \`automated_test\` reference
1653
1658
 
@@ -1657,7 +1662,7 @@ Skip this step \u2014 proceed directly to running existing tests.`,
1657
1662
  conditionalOnSubagent: "test-code-generator"
1658
1663
  },
1659
1664
  // Step 8-11: Test Execution (library steps)
1660
- "run-playwright-tests",
1665
+ "run-tests",
1661
1666
  "parse-test-results",
1662
1667
  "triage-failures",
1663
1668
  "fix-test-issues",
@@ -1846,7 +1851,7 @@ Post PR comment if GitHub context available.`,
1846
1851
  - Recommend: Check test configuration and prerequisites
1847
1852
 
1848
1853
  **If test execution fails:**
1849
- - Report specific error (Playwright not installed, env vars missing)
1854
+ - Report specific error (test framework not installed, env vars missing)
1850
1855
  - Suggest troubleshooting steps
1851
1856
  - Don't proceed with triage if tests didn't run
1852
1857
 
@@ -1876,7 +1881,7 @@ A successful verification includes:
1876
1881
  10. Clear recommendation provided (merge / review / block)`
1877
1882
  }
1878
1883
  ],
1879
- requiredSubagents: ["test-runner", "test-debugger-fixer"],
1884
+ requiredSubagents: ["browser-automation", "test-debugger-fixer"],
1880
1885
  optionalSubagents: ["documentation-researcher", "issue-tracker", "team-communicator", "changelog-historian", "test-code-generator"],
1881
1886
  dependentTasks: []
1882
1887
  };
@@ -1925,7 +1930,7 @@ This command orchestrates the complete test coverage workflow in a single execut
1925
1930
  },
1926
1931
  // Phase 2: Exploration Protocol
1927
1932
  "exploration-protocol",
1928
- // Execute exploration via test-runner
1933
+ // Execute exploration via browser-automation
1929
1934
  "create-exploration-test-case",
1930
1935
  "run-exploration",
1931
1936
  "process-exploration-results",
@@ -1936,7 +1941,7 @@ This command orchestrates the complete test coverage workflow in a single execut
1936
1941
  "generate-test-cases",
1937
1942
  "automate-test-cases",
1938
1943
  // Phase 5: Test Execution
1939
- "run-playwright-tests",
1944
+ "run-tests",
1940
1945
  "parse-test-results",
1941
1946
  // Phase 6: Triage and Fix (NEW - was missing from full-test-coverage)
1942
1947
  "triage-failures",
@@ -1953,7 +1958,7 @@ This command orchestrates the complete test coverage workflow in a single execut
1953
1958
  },
1954
1959
  "generate-final-report"
1955
1960
  ],
1956
- requiredSubagents: ["test-runner", "test-code-generator", "test-debugger-fixer"],
1961
+ requiredSubagents: ["browser-automation", "test-code-generator", "test-debugger-fixer"],
1957
1962
  optionalSubagents: ["documentation-researcher", "team-communicator", "issue-tracker"],
1958
1963
  dependentTasks: ["run-tests", "generate-test-cases"]
1959
1964
  };
@@ -1972,7 +1977,7 @@ var exploreApplicationTask = {
1972
1977
  {
1973
1978
  inline: true,
1974
1979
  title: "Explore Application Overview",
1975
- content: `Discover actual UI elements, workflows, and behaviors using the test-runner agent. Updates test plan and project documentation with findings.`
1980
+ content: `Discover actual UI elements, workflows, and behaviors using the browser-automation agent. Updates test plan and project documentation with findings.`
1976
1981
  },
1977
1982
  // Step 2: Security Notice (from library)
1978
1983
  "security-notice",
@@ -2019,7 +2024,7 @@ var exploreApplicationTask = {
2019
2024
  "cleanup-temp-files",
2020
2025
  "update-knowledge-base"
2021
2026
  ],
2022
- requiredSubagents: ["test-runner"],
2027
+ requiredSubagents: ["browser-automation"],
2023
2028
  optionalSubagents: ["team-communicator"],
2024
2029
  dependentTasks: []
2025
2030
  };