ta-studio-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 TA Studios
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md ADDED
@@ -0,0 +1,136 @@
1
+ # ta-studio-mcp
2
+
3
+ **Domain knowledge MCP server for AI agents working on mobile test automation.**
4
+
5
+ One command gives your agent structured knowledge about OAVR navigation patterns, SoM screenshot annotation, coordinate scaling fixes, agent configuration, and 9+ documented bug fixes — so it builds on proven solutions instead of rediscovering them.
6
+
7
+ ## Quick Start
8
+
9
+ ```bash
10
+ npx ta-studio-mcp
11
+ ```
12
+
13
+ ## What's Inside
14
+
15
+ | Tool | What It Returns |
16
+ |------|----------------|
17
+ | `getMethodology` | 10+ topics: OAVR pattern, SoM annotation, coordinate scaling, agent config, vision click, mobile MCP, flicker detection, closed loop, device auto-select |
18
+ | `getKnownIssues` | 9 documented bugs with symptoms, root causes, fixes, file paths, and commit SHAs |
19
+ | `getCodebaseMap` | Full codebase structure — backend, frontend, agents, scripts, integrations, config |
20
+ | `getWorkflow` | 7 step-by-step workflows: bug_fix, navigation_test, bbox_verify, agent_debug, feature, figma_analysis, flicker_test |
21
+ | `getQuickCommands` | All dev commands for backend, frontend, E2E, device, and git |
22
+ | `getConventions` | Code style guidelines, patterns, and 7 critical rules |
23
+ | `getAgentConfig` | Agent configuration reference — models, parallel_tool_calls, reasoning, streaming |
24
+
25
+ ## Installation
26
+
27
+ ### Claude Code
28
+
29
+ ```bash
30
+ claude mcp add ta-studio -- npx -y ta-studio-mcp
31
+ ```
32
+
33
+ ### Cursor
34
+
35
+ Add to `.cursor/mcp.json`:
36
+
37
+ ```json
38
+ {
39
+ "mcpServers": {
40
+ "ta-studio": {
41
+ "command": "npx",
42
+ "args": ["-y", "ta-studio-mcp"]
43
+ }
44
+ }
45
+ }
46
+ ```
47
+
48
+ ### Windsurf
49
+
50
+ Add to `~/.codeium/windsurf/mcp_config.json`:
51
+
52
+ ```json
53
+ {
54
+ "mcpServers": {
55
+ "ta-studio": {
56
+ "command": "npx",
57
+ "args": ["-y", "ta-studio-mcp"]
58
+ }
59
+ }
60
+ }
61
+ ```
62
+
63
+ ### VS Code (Copilot / Continue / Augment)
64
+
65
+ Add to `.vscode/settings.json`:
66
+
67
+ ```json
68
+ {
69
+ "mcp": {
70
+ "servers": {
71
+ "ta-studio": {
72
+ "command": "npx",
73
+ "args": ["-y", "ta-studio-mcp"]
74
+ }
75
+ }
76
+ }
77
+ }
78
+ ```
79
+
80
+ ## Example Usage
81
+
82
+ Ask your AI agent:
83
+
84
+ - *"How does the OAVR pattern work?"* → Agent calls `getMethodology({ topic: "oavr" })`
85
+ - *"What's the bounding box coordinate bug?"* → Agent calls `getKnownIssues({ category: "bbox_alignment" })`
86
+ - *"How do I debug a navigation test?"* → Agent calls `getWorkflow({ name: "agent_debug" })`
87
+ - *"What model does the coordinator use?"* → Agent calls `getAgentConfig()`
88
+
89
+ ## Key Knowledge Areas
90
+
91
+ ### Coordinate Scaling (Critical Fix)
92
+
93
+ Mobile MCP screenshots are JPEG-compressed at ~45% of native resolution (486×1080 vs 1080×2400), but element coordinates from `list_elements_on_screen` are in native space. The fix:
94
+
95
+ ```
96
+ scale_x = img.width / screen_width → 486/1080 = 0.45
97
+ scale_y = img.height / screen_height → 1080/2400 = 0.45
98
+ ```
99
+
100
+ ### OAVR Navigation Pattern
101
+
102
+ ```
103
+ Observe → Screen Classifier analyzes current screen
104
+ Act → Execute action (click, swipe, type) via Mobile MCP
105
+ Verify → Action Verifier confirms success
106
+ Reason → Failure Diagnosis suggests recovery if failed
107
+ ```
108
+
109
+ ### Agent Configuration
110
+
111
+ | Agent | Model | parallel_tool_calls | Reasoning |
112
+ |-------|-------|-------------------|-----------|
113
+ | Coordinator | gpt-5.2 | `true` | high |
114
+ | Device Testing | gpt-5-mini | `false` | medium |
115
+
116
+ ## Tech Stack
117
+
118
+ - **Runtime**: Node.js ≥ 18
119
+ - **Protocol**: Model Context Protocol (MCP) via `@modelcontextprotocol/sdk`
120
+ - **Transport**: stdio (local process)
121
+ - **Schema**: Zod validation
122
+
123
+ ## Development
124
+
125
+ ```bash
126
+ cd packages/ta-studio-mcp
127
+ npm install
128
+ npm run build # Compile TypeScript
129
+ npm run dev # Watch mode
130
+ npm start # Run server
131
+ ```
132
+
133
+ ## License
134
+
135
+ MIT — see [LICENSE](./LICENSE)
136
+
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * TA Studio MCP Server
4
+ *
5
+ * Domain knowledge, patterns, bug fixes, and workflows for AI agents
6
+ * working on the TA Studio mobile test automation platform.
7
+ *
8
+ * Usage:
9
+ * npx ta-studio-mcp
10
+ * claude mcp add ta-studio -- npx -y ta-studio-mcp
11
+ */
12
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
13
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
14
+ import { registerAllTools } from './tools/register-all.js';
15
+ const server = new McpServer({
16
+ name: 'ta-studio-mcp',
17
+ version: '1.0.0',
18
+ }, {
19
+ capabilities: {
20
+ logging: {},
21
+ },
22
+ });
23
+ // Register all domain knowledge tools
24
+ registerAllTools(server);
25
+ // Connect via stdio transport (for local process-spawned integrations)
26
+ const transport = new StdioServerTransport();
27
+ await server.connect(transport);
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;IACE,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,OAAO,EAAE,EAAE;KACZ;CACF,CACF,CAAC;AAEF,sCAAsC;AACtC,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAEzB,uEAAuE;AACvE,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Codebase map — file purposes and architecture.
3
+ */
4
+ export declare const CODEBASE_SECTIONS: Record<string, string>;
5
+ export declare const CODEBASE_SECTION_LIST: string[];
6
+ //# sourceMappingURL=codebase-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codebase-map.d.ts","sourceRoot":"","sources":["../../src/knowledge/codebase-map.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiHpD,CAAC;AAEF,eAAO,MAAM,qBAAqB,UAAiC,CAAC"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Codebase map — file purposes and architecture.
3
+ */
4
+ export const CODEBASE_SECTIONS = {
5
+ overview: `# TA Studio Codebase Map
6
+
7
+ Sections: backend, frontend, agents, scripts, integrations, config
8
+
9
+ ## Directory Structure
10
+ my-fullstack-app/
11
+ ├── backend/app/ # FastAPI backend (Python 3.11+)
12
+ ├── frontend/test-studio/ # React + TypeScript + Vite frontend
13
+ ├── integrations/chef/ # Chef AI agent integration (Remix)
14
+ ├── packages/ # Local npm packages (ta-studio-mcp)
15
+ ├── scripts/ # Utility scripts
16
+ ├── tests/ # E2E and manual tests
17
+ └── screenshots/ # Agent screenshots output`,
18
+ backend: `# Backend (backend/app/)
19
+
20
+ | Path | Purpose |
21
+ |------|---------|
22
+ | main.py | FastAPI entry point, route registration |
23
+ | agents/coordinator/ | Coordinator Agent (GPT-5.2) — orchestration |
24
+ | agents/coordinator/coordinator_agent.py | Agent definition + handoffs |
25
+ | agents/coordinator/coordinator_service.py | Main orchestration service |
26
+ | agents/device_testing/ | Device Testing Agent (GPT-5-mini) |
27
+ | agents/device_testing/device_testing_agent.py | Agent config (parallel_tool_calls=False) |
28
+ | agents/device_testing/mobile_mcp_client.py | Mobile MCP + ADB fallback |
29
+ | agents/device_testing/tools/ | Navigation tools (SoM, vision_click) |
30
+ | agents/device_testing/tools/autonomous_navigation_tools.py | Core navigation + bbox annotation |
31
+ | agents/device_testing/tools/agentic_vision_tools.py | GPT-5.2 vision-based click |
32
+ | agents/device_testing/subagents/ | OAVR sub-agents (classifier, verifier, diagnosis) |
33
+ | agents/device_testing/flicker_detection_service.py | 4-layer flicker detection |
34
+ | agents/device_testing/golden_bug_service.py | Golden bug evaluation |
35
+ | api/ | FastAPI route handlers |
36
+ | api/ai_agent.py | SSE streaming AI chat endpoint |
37
+ | api/device_simulation.py | Device/emulator discovery (2s cache) |
38
+ | benchmarks/ | Android World benchmarks |
39
+ | figma/ | Figma design analysis pipeline |
40
+ | figma/flow_analyzer.py | 3-phase Figma flow analysis |
41
+ | observability/tracing.py | LangSmith tracing |`,
42
+ frontend: `# Frontend (frontend/test-studio/src/)
43
+
44
+ | Path | Purpose |
45
+ |------|---------|
46
+ | App.tsx | Main app with React Router |
47
+ | pages/DemoPage.tsx | Split-screen demo (60% viewer, 40% chat) |
48
+ | pages/LandingPage.tsx | Marketing homepage |
49
+ | pages/PricingPage.tsx | Cloud pricing + enterprise |
50
+ | pages/ChangelogPage.tsx | Version changelog |
51
+ | components/emulator/ | Emulator HUD + WebSocket streaming |
52
+ | components/DemoGate.tsx | Email gate for demo access |
53
+ | hooks/ | Custom React hooks |
54
+
55
+ Tech stack: React 18.3.1, TypeScript, Vite, TailwindCSS 4.x, shadcn/ui
56
+ State: TanStack Query (server), React Context (client)
57
+ Streaming: SSE for AI chat, WebSocket for emulator frames`,
58
+ agents: `# Agent Architecture
59
+
60
+ ## Hierarchy
61
+ Coordinator (GPT-5.2) → Dynamic handoffs → Specialists
62
+ ├── Search Assistant — bug/scenario search
63
+ ├── Test Generation Specialist — test code generation
64
+ └── Device Testing Specialist (GPT-5-mini) — mobile automation
65
+ └── OAVR Sub-agents
66
+ ├── Screen Classifier
67
+ ├── Action Verifier
68
+ └── Failure Diagnosis
69
+
70
+ ## Key Patterns
71
+ - OpenAI Agents SDK with Runner.run_streamed()
72
+ - Dynamic handoffs via is_enabled callbacks
73
+ - SSE streaming to frontend
74
+ - parallel_tool_calls=False for Device Testing (sequential navigation)
75
+ - parallel_tool_calls=True for Coordinator (parallel orchestration)`,
76
+ scripts: `# Scripts
77
+
78
+ | Path | Purpose |
79
+ |------|---------|
80
+ | backend/scripts/figma_cv_overlay.py | Direct CV overlay (no API calls) |
81
+ | backend/scripts/test_figma_flow_analyzer.py | Figma flow analyzer test harness |
82
+ | backend/scripts/test_flicker_detection.py | Flicker detection PoC |
83
+ | backend/scripts/annotate_real_device.py | SoM annotation demo |
84
+ | backend/scripts/ai_verify.py | LLM-based code verification |
85
+ | scripts/demo-tunnel.sh | Demo tunnel setup |
86
+ | scripts/setup-macos.sh | macOS dev environment setup |`,
87
+ integrations: `# Integrations
88
+
89
+ ## Chef (integrations/chef/)
90
+ - Remix + React 18 + ai SDK 4.x
91
+ - Convex backend
92
+ - Braintrust evaluation harness
93
+ - CRITICAL: Uses React 18 + ai SDK 4.x (TA frontend uses React 19 + ai SDK 5.x)
94
+ - NEVER share node_modules between Chef and TA frontend
95
+
96
+ ## Chef Annotation System
97
+ Three annotation types: usage, failure, model
98
+ - JSON.parse on payloads MUST be wrapped in try-catch
99
+ - encodeModelAnnotation must default provider to 'Unknown' (not null)
100
+ - toolCallId must never be null — use call.toolCallId ?? 'unknown'
101
+ - response.json() can only be called ONCE — store in variable`,
102
+ config: `# Key Configuration Files
103
+
104
+ | File | Purpose |
105
+ |------|---------|
106
+ | .env | Environment variables (OPENAI_API_KEY) |
107
+ | backend/requirements.txt | Python dependencies |
108
+ | frontend/test-studio/package.json | Node dependencies |
109
+ | playwright.config.ts | E2E test configuration |
110
+ | package.json (root) | Root deps (@playwright/test, mcp-appium) |`,
111
+ };
112
+ export const CODEBASE_SECTION_LIST = Object.keys(CODEBASE_SECTIONS);
113
+ //# sourceMappingURL=codebase-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codebase-map.js","sourceRoot":"","sources":["../../src/knowledge/codebase-map.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,QAAQ,EAAE;;;;;;;;;;;;qDAYyC;IAEnD,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;iDAuBsC;IAE/C,QAAQ,EAAE;;;;;;;;;;;;;;;0DAe8C;IAExD,MAAM,EAAE;;;;;;;;;;;;;;;;;oEAiB0D;IAElE,OAAO,EAAE;;;;;;;;;;yDAU8C;IAEvD,YAAY,EAAE;;;;;;;;;;;;;;8DAc8C;IAE5D,MAAM,EAAE;;;;;;;;mEAQyD;CAClE,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Code conventions and style guidelines.
3
+ */
4
+ export declare const CONVENTIONS = "# TA Studio Code Conventions\n\n## Python (Backend)\n- Imports: absolute imports from app. prefix\n- Type hints: Required for ALL function signatures\n- Docstrings: Google style for public functions\n- Async: Use async/await for I/O operations\n- Logging: Use logging.getLogger(__name__)\n\nExample:\n```python\nfrom app.agents.device_testing.mobile_mcp_client import MobileMCPClient\n\nasync def take_screenshot(device_id: str) -> str:\n \"\"\"Take screenshot from device.\n \n Args:\n device_id: Android device identifier\n \n Returns:\n Base64-encoded screenshot data\n \"\"\"\n pass\n```\n\n## TypeScript (Frontend)\n- Components: Functional components with hooks, one per file\n- Types: Explicit types, avoid any\n- Imports: Use @/ path alias for src imports\n- State: React hooks for local state, TanStack Query for server state\n\nExample:\n```typescript\ninterface DeviceProps {\n deviceId: string;\n onStreamStart: (id: string) => void;\n}\nconst DeviceCard: React.FC<DeviceProps> = ({ deviceId, onStreamStart }) => { ... };\n```\n\n## Agent Code Patterns\n- Agent-as-tool pattern: coordinator delegates to specialized agents\n- Colocation: agent code + tools + models together\n- Factory pattern: agent creation via factory functions\n- DRY: no duplicate code across modules\n\n## Convex / Template Literals\n- Use \\n escape sequences (not multi-line templates) in Convex actions\n- Why: Easier to diff-review, auto-formatters don't mess indentation\n\n## Mobile MCP Data Shapes\n- Screenshots: { type: \"image\", data: \"base64...\", mimeType: \"image/jpeg\" }\n- ALWAYS keep structured, NEVER JSON.stringify for model consumption\n- Vision-ready: convert to data-URL: data:{mime};base64,{b64}\n\n## Critical Rules\n1. NEVER share node_modules between Chef (React 18) and TA frontend (React 19)\n2. NEVER commit without running verification\n3. ALWAYS auto-select first device (prefer emulator-5554)\n4. ALWAYS scale coordinates before drawing bounding boxes\n5. ALWAYS wrap JSON.parse in try-catch for external payloads\n6. ALWAYS use keyword arguments for functions with *, syntax\n7. NEVER pass async functions to asyncio.to_thread()\n";
5
+ export declare const AGENT_CONFIG_REFERENCE = "# Agent Configuration Reference\n\n## Coordinator Agent\n- Model: gpt-5.2\n- parallel_tool_calls: True\n- reasoning: Reasoning(effort=\"high\")\n- Handoffs: Search Assistant, Test Generation, Device Testing\n- Instructions: General orchestration, task routing\n\n## Device Testing Agent\n- Model: gpt-5-mini (vision-capable)\n- parallel_tool_calls: False (CRITICAL \u2014 navigation is sequential)\n- reasoning: Reasoning(effort=\"medium\")\n- Tools: take_screenshot, list_elements, click, swipe, type, vision_click\n- Instructions: OAVR pattern, auto-select device, never ask user\n\n## Search Assistant\n- Model: gpt-5-mini\n- Purpose: Bug/scenario search in knowledge base\n\n## Test Generation Specialist\n- Model: gpt-5-mini\n- Purpose: Generate test code from bug descriptions\n\n## Streaming\n- SSE (Server-Sent Events) for AI chat responses\n- WebSocket for emulator frame streaming\n- OpenAI Agents SDK Runner.run_streamed() for agent execution\n";
6
+ //# sourceMappingURL=conventions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conventions.d.ts","sourceRoot":"","sources":["../../src/knowledge/conventions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,WAAW,opEA+DvB,CAAC;AAEF,eAAO,MAAM,sBAAsB,g8BA4BlC,CAAC"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Code conventions and style guidelines.
3
+ */
4
+ export const CONVENTIONS = `# TA Studio Code Conventions
5
+
6
+ ## Python (Backend)
7
+ - Imports: absolute imports from app. prefix
8
+ - Type hints: Required for ALL function signatures
9
+ - Docstrings: Google style for public functions
10
+ - Async: Use async/await for I/O operations
11
+ - Logging: Use logging.getLogger(__name__)
12
+
13
+ Example:
14
+ \`\`\`python
15
+ from app.agents.device_testing.mobile_mcp_client import MobileMCPClient
16
+
17
+ async def take_screenshot(device_id: str) -> str:
18
+ """Take screenshot from device.
19
+
20
+ Args:
21
+ device_id: Android device identifier
22
+
23
+ Returns:
24
+ Base64-encoded screenshot data
25
+ """
26
+ pass
27
+ \`\`\`
28
+
29
+ ## TypeScript (Frontend)
30
+ - Components: Functional components with hooks, one per file
31
+ - Types: Explicit types, avoid any
32
+ - Imports: Use @/ path alias for src imports
33
+ - State: React hooks for local state, TanStack Query for server state
34
+
35
+ Example:
36
+ \`\`\`typescript
37
+ interface DeviceProps {
38
+ deviceId: string;
39
+ onStreamStart: (id: string) => void;
40
+ }
41
+ const DeviceCard: React.FC<DeviceProps> = ({ deviceId, onStreamStart }) => { ... };
42
+ \`\`\`
43
+
44
+ ## Agent Code Patterns
45
+ - Agent-as-tool pattern: coordinator delegates to specialized agents
46
+ - Colocation: agent code + tools + models together
47
+ - Factory pattern: agent creation via factory functions
48
+ - DRY: no duplicate code across modules
49
+
50
+ ## Convex / Template Literals
51
+ - Use \\n escape sequences (not multi-line templates) in Convex actions
52
+ - Why: Easier to diff-review, auto-formatters don't mess indentation
53
+
54
+ ## Mobile MCP Data Shapes
55
+ - Screenshots: { type: "image", data: "base64...", mimeType: "image/jpeg" }
56
+ - ALWAYS keep structured, NEVER JSON.stringify for model consumption
57
+ - Vision-ready: convert to data-URL: data:{mime};base64,{b64}
58
+
59
+ ## Critical Rules
60
+ 1. NEVER share node_modules between Chef (React 18) and TA frontend (React 19)
61
+ 2. NEVER commit without running verification
62
+ 3. ALWAYS auto-select first device (prefer emulator-5554)
63
+ 4. ALWAYS scale coordinates before drawing bounding boxes
64
+ 5. ALWAYS wrap JSON.parse in try-catch for external payloads
65
+ 6. ALWAYS use keyword arguments for functions with *, syntax
66
+ 7. NEVER pass async functions to asyncio.to_thread()
67
+ `;
68
+ export const AGENT_CONFIG_REFERENCE = `# Agent Configuration Reference
69
+
70
+ ## Coordinator Agent
71
+ - Model: gpt-5.2
72
+ - parallel_tool_calls: True
73
+ - reasoning: Reasoning(effort="high")
74
+ - Handoffs: Search Assistant, Test Generation, Device Testing
75
+ - Instructions: General orchestration, task routing
76
+
77
+ ## Device Testing Agent
78
+ - Model: gpt-5-mini (vision-capable)
79
+ - parallel_tool_calls: False (CRITICAL — navigation is sequential)
80
+ - reasoning: Reasoning(effort="medium")
81
+ - Tools: take_screenshot, list_elements, click, swipe, type, vision_click
82
+ - Instructions: OAVR pattern, auto-select device, never ask user
83
+
84
+ ## Search Assistant
85
+ - Model: gpt-5-mini
86
+ - Purpose: Bug/scenario search in knowledge base
87
+
88
+ ## Test Generation Specialist
89
+ - Model: gpt-5-mini
90
+ - Purpose: Generate test code from bug descriptions
91
+
92
+ ## Streaming
93
+ - SSE (Server-Sent Events) for AI chat responses
94
+ - WebSocket for emulator frame streaming
95
+ - OpenAI Agents SDK Runner.run_streamed() for agent execution
96
+ `;
97
+ //# sourceMappingURL=conventions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conventions.js","sourceRoot":"","sources":["../../src/knowledge/conventions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+D1B,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BrC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Known issues database — every bug we've found and how we fixed it.
3
+ */
4
+ export interface KnownIssue {
5
+ id: string;
6
+ title: string;
7
+ category: string;
8
+ severity: 'critical' | 'high' | 'medium' | 'low';
9
+ symptom: string;
10
+ rootCause: string;
11
+ fix: string;
12
+ file: string;
13
+ commit?: string;
14
+ }
15
+ export declare const KNOWN_ISSUES: KnownIssue[];
16
+ export declare const ISSUE_CATEGORIES: string[];
17
+ //# sourceMappingURL=known-issues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"known-issues.d.ts","sourceRoot":"","sources":["../../src/knowledge/known-issues.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,EAAE,UAAU,EAiGpC,CAAC;AAEF,eAAO,MAAM,gBAAgB,UAAkD,CAAC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Known issues database — every bug we've found and how we fixed it.
3
+ */
4
+ export const KNOWN_ISSUES = [
5
+ {
6
+ id: 'bbox-coordinate-misalignment',
7
+ title: 'Bounding Box Coordinate Misalignment',
8
+ category: 'bbox_alignment',
9
+ severity: 'critical',
10
+ symptom: 'Bounding boxes drawn at completely wrong positions — labels and rectangles dont match actual UI elements. Elements appear off-screen.',
11
+ rootCause: 'Mobile MCP take_screenshot returns JPEG at ~45% of native resolution (486×1080) but list_elements_on_screen returns coordinates in native device resolution (1080×2400). Drawing at native coords on scaled image puts everything ~2.2x off-position.',
12
+ fix: 'Get device screen size via get_screen_size(), compute scale_x = img.width/screen_width, scale_y = img.height/screen_height, apply to all element coordinates before drawing.',
13
+ file: 'agents/device_testing/tools/autonomous_navigation_tools.py',
14
+ commit: 'c7e5a68',
15
+ },
16
+ {
17
+ id: 'missing-asyncio-import',
18
+ title: 'Missing asyncio Import',
19
+ category: 'import_errors',
20
+ severity: 'critical',
21
+ symptom: 'NameError: asyncio is not defined at line 552 (asyncio.to_thread call)',
22
+ rootCause: 'asyncio was used but never imported at module level.',
23
+ fix: 'Added import asyncio at line 10.',
24
+ file: 'agents/device_testing/tools/autonomous_navigation_tools.py',
25
+ commit: 'a3773ee',
26
+ },
27
+ {
28
+ id: 'async-def-in-to-thread',
29
+ title: 'async def passed to asyncio.to_thread()',
30
+ category: 'agent_chat',
31
+ severity: 'critical',
32
+ symptom: 'Bounding box drawing returns a coroutine object instead of results. SoM annotations silently fail.',
33
+ rootCause: '_draw_bounding_boxes_threaded was defined as async def but asyncio.to_thread() expects a synchronous function.',
34
+ fix: 'Changed async def _draw_bounding_boxes_threaded to def _draw_bounding_boxes_threaded (removed async).',
35
+ file: 'agents/device_testing/tools/autonomous_navigation_tools.py',
36
+ commit: 'a3773ee',
37
+ },
38
+ {
39
+ id: 'keyword-only-arg-mismatch',
40
+ title: 'Keyword-Only Argument Mismatch',
41
+ category: 'agent_chat',
42
+ severity: 'high',
43
+ symptom: 'TypeError on _bbox_find_label_position call — positional arguments passed to keyword-only parameters.',
44
+ rootCause: 'Function uses *, syntax (keyword-only args) but call site passes positional args.',
45
+ fix: 'Changed to keyword arguments: _bbox_find_label_position(x=x, y=y, width=width, ...)',
46
+ file: 'agents/device_testing/tools/autonomous_navigation_tools.py',
47
+ commit: 'a3773ee',
48
+ },
49
+ {
50
+ id: 'annotated-filepath-not-reset',
51
+ title: 'Annotated filepath not reset on bbox failure',
52
+ category: 'agent_chat',
53
+ severity: 'high',
54
+ symptom: 'FileNotFoundError when vision API tries to read annotated screenshot that doesnt exist.',
55
+ rootCause: 'annotated_filepath was set to the annotated path before drawing, but not reset when drawing fails.',
56
+ fix: 'Added annotated_filepath = filepath in the except handler (fallback to raw screenshot).',
57
+ file: 'agents/device_testing/tools/autonomous_navigation_tools.py',
58
+ commit: 'a3773ee',
59
+ },
60
+ {
61
+ id: 'agent-duplicate-device-calls',
62
+ title: 'Agent calls list_devices and start_navigation twice',
63
+ category: 'agent_chat',
64
+ severity: 'critical',
65
+ symptom: 'Agent calls list_available_devices AND start_navigation_session simultaneously, asks user which device, then hangs.',
66
+ rootCause: 'parallel_tool_calls=True on Device Testing Agent + no auto-select instructions.',
67
+ fix: 'Set parallel_tool_calls=False, added auto-select instructions (prefer emulator-5554), added NEVER ask user rule.',
68
+ file: 'agents/device_testing/device_testing_agent.py',
69
+ commit: 'a5fb8b4',
70
+ },
71
+ {
72
+ id: 'figma-images-rate-limit',
73
+ title: 'Figma Images API Rate Limit (Plan-Tier)',
74
+ category: 'figma_api',
75
+ severity: 'medium',
76
+ symptom: '429 on Figma REST API with Retry-After: 396156 (4.6 days)',
77
+ rootCause: 'Plan-tier rate limits on Figma Images API.',
78
+ fix: 'Use direct CV overlay (scripts/figma_cv_overlay.py) — captures browser screenshot via Playwright, detects flow groups via brightness thresholding + morphological connected components. No API calls needed.',
79
+ file: 'scripts/figma_cv_overlay.py',
80
+ },
81
+ {
82
+ id: 'openai-rate-limits',
83
+ title: 'OpenAI 429 Rate Limit Errors',
84
+ category: 'rate_limits',
85
+ severity: 'medium',
86
+ symptom: '429 errors from OpenAI API during heavy agent usage.',
87
+ rootCause: 'High token volume from verbose screen descriptions.',
88
+ fix: 'TOON format reduces tokens by 30-60%. Already integrated in autonomous_navigation_tools.py.',
89
+ file: 'agents/device_testing/tools/autonomous_navigation_tools.py',
90
+ },
91
+ {
92
+ id: 'chef-annotation-json-parse',
93
+ title: 'Chef Annotation Crashes (JSON.parse / Zod)',
94
+ category: 'chef_annotations',
95
+ severity: 'high',
96
+ symptom: 'UI render crashes, silent annotation drops, or response.json() failures.',
97
+ rootCause: 'Three bugs: 1) Unguarded JSON.parse in parseAnnotations, 2) Null provider/toolCallId in encodeModelAnnotation, 3) Double response.json() in recordUsage.',
98
+ fix: '1) Wrap JSON.parse in try-catch + continue on failure. 2) Default to "Unknown"/"unknown" not null. 3) Store await response.json() in variable, add early return on error.',
99
+ file: 'integrations/chef/app/lib/common/annotations.ts',
100
+ },
101
+ ];
102
+ export const ISSUE_CATEGORIES = [...new Set(KNOWN_ISSUES.map(i => i.category))];
103
+ //# sourceMappingURL=known-issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"known-issues.js","sourceRoot":"","sources":["../../src/knowledge/known-issues.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC;QACE,EAAE,EAAE,8BAA8B;QAClC,KAAK,EAAE,sCAAsC;QAC7C,QAAQ,EAAE,gBAAgB;QAC1B,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,uIAAuI;QAChJ,SAAS,EAAE,uPAAuP;QAClQ,GAAG,EAAE,8KAA8K;QACnL,IAAI,EAAE,4DAA4D;QAClE,MAAM,EAAE,SAAS;KAClB;IACD;QACE,EAAE,EAAE,wBAAwB;QAC5B,KAAK,EAAE,wBAAwB;QAC/B,QAAQ,EAAE,eAAe;QACzB,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,wEAAwE;QACjF,SAAS,EAAE,sDAAsD;QACjE,GAAG,EAAE,kCAAkC;QACvC,IAAI,EAAE,4DAA4D;QAClE,MAAM,EAAE,SAAS;KAClB;IACD;QACE,EAAE,EAAE,wBAAwB;QAC5B,KAAK,EAAE,yCAAyC;QAChD,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,oGAAoG;QAC7G,SAAS,EAAE,gHAAgH;QAC3H,GAAG,EAAE,uGAAuG;QAC5G,IAAI,EAAE,4DAA4D;QAClE,MAAM,EAAE,SAAS;KAClB;IACD;QACE,EAAE,EAAE,2BAA2B;QAC/B,KAAK,EAAE,gCAAgC;QACvC,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,uGAAuG;QAChH,SAAS,EAAE,mFAAmF;QAC9F,GAAG,EAAE,qFAAqF;QAC1F,IAAI,EAAE,4DAA4D;QAClE,MAAM,EAAE,SAAS;KAClB;IACD;QACE,EAAE,EAAE,8BAA8B;QAClC,KAAK,EAAE,8CAA8C;QACrD,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,yFAAyF;QAClG,SAAS,EAAE,oGAAoG;QAC/G,GAAG,EAAE,yFAAyF;QAC9F,IAAI,EAAE,4DAA4D;QAClE,MAAM,EAAE,SAAS;KAClB;IACD;QACE,EAAE,EAAE,8BAA8B;QAClC,KAAK,EAAE,qDAAqD;QAC5D,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,qHAAqH;QAC9H,SAAS,EAAE,iFAAiF;QAC5F,GAAG,EAAE,kHAAkH;QACvH,IAAI,EAAE,+CAA+C;QACrD,MAAM,EAAE,SAAS;KAClB;IACD;QACE,EAAE,EAAE,yBAAyB;QAC7B,KAAK,EAAE,yCAAyC;QAChD,QAAQ,EAAE,WAAW;QACrB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,2DAA2D;QACpE,SAAS,EAAE,4CAA4C;QACvD,GAAG,EAAE,8MAA8M;QACnN,IAAI,EAAE,6BAA6B;KACpC;IACD;QACE,EAAE,EAAE,oBAAoB;QACxB,KAAK,EAAE,8BAA8B;QACrC,QAAQ,EAAE,aAAa;QACvB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,sDAAsD;QAC/D,SAAS,EAAE,qDAAqD;QAChE,GAAG,EAAE,6FAA6F;QAClG,IAAI,EAAE,4DAA4D;KACnE;IACD;QACE,EAAE,EAAE,4BAA4B;QAChC,KAAK,EAAE,4CAA4C;QACnD,QAAQ,EAAE,kBAAkB;QAC5B,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,0EAA0E;QACnF,SAAS,EAAE,0JAA0J;QACrK,GAAG,EAAE,2KAA2K;QAChL,IAAI,EAAE,iDAAiD;KACxD;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * TA Studio methodology knowledge base.
3
+ * Each topic explains a pattern, technique, or architectural decision.
4
+ */
5
+ export declare const METHODOLOGY_TOPICS: Record<string, string>;
6
+ export declare const METHODOLOGY_TOPIC_LIST: string[];
7
+ //# sourceMappingURL=methodology.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"methodology.d.ts","sourceRoot":"","sources":["../../src/knowledge/methodology.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAqFrD,CAAC;AAuHF,eAAO,MAAM,sBAAsB,UAAkC,CAAC"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * TA Studio methodology knowledge base.
3
+ * Each topic explains a pattern, technique, or architectural decision.
4
+ */
5
+ export const METHODOLOGY_TOPICS = {
6
+ overview: `# TA Studio Methodologies — Overview
7
+
8
+ Available topics: oavr, som_annotation, coordinate_scaling, agent_config, flicker_detection, figma_flow, golden_bugs, mobile_mcp, vision_click, self_correction, closed_loop, device_auto_select, parallel_tool_calls
9
+
10
+ ## Architecture
11
+ - **Backend**: FastAPI (Python 3.11+) at backend/
12
+ - **Frontend**: React + TypeScript + Vite at frontend/test-studio/
13
+ - **Mobile MCP**: Model Context Protocol for Android emulator control
14
+ - **AI Agents**: Hierarchical multi-agent (Coordinator → Specialists)
15
+ - **Models**: GPT-5.2 (coordinator, vision), GPT-5-mini (device testing)
16
+ - **Streaming**: SSE for AI chat, WebSocket for emulator frames`,
17
+ oavr: `# OAVR Pattern — Observe-Act-Verify-Reason
18
+
19
+ The device testing agent uses OAVR for autonomous navigation:
20
+
21
+ 1. **Observe** → Screen Classifier Agent analyzes current screen state
22
+ 2. **Act** → Execute action (click, swipe, type) via Mobile MCP
23
+ 3. **Verify** → Action Verifier confirms the action succeeded
24
+ 4. **Reason** → Failure Diagnosis suggests recovery if verification failed
25
+
26
+ Key files:
27
+ - agents/device_testing/subagents/screen_classifier_agent.py
28
+ - agents/device_testing/subagents/action_verifier_agent.py
29
+ - agents/device_testing/subagents/failure_diagnosis_agent.py
30
+
31
+ The pattern ensures the agent doesn't blindly proceed after failed actions.`,
32
+ som_annotation: `# Set-of-Mark (SoM) Screenshot Annotation
33
+
34
+ Based on OmniParser's SoM approach — color-coded, type-aware bounding boxes.
35
+
36
+ ## 9-Color Element Type Palette
37
+ | Type | Color | Tag | Example Classes |
38
+ |-----------|-------------|--------|-----------------------------------|
39
+ | button | Dodger blue | BTN | Button, ImageButton, FAB |
40
+ | input | Orange | INPUT | EditText, SearchView |
41
+ | toggle | Purple | TOGGLE | Switch, CheckBox, RadioButton |
42
+ | nav | Deep pink | NAV | BottomNavigationView, Toolbar |
43
+ | image | Dark cyan | IMG | ImageView |
44
+ | text | Gray | TXT | TextView |
45
+ | list | Forest green| LIST | RecyclerView, ListView |
46
+ | container | Dark gray | BOX | FrameLayout, LinearLayout |
47
+ | unknown | Green | ELEM | Unclassified elements |
48
+
49
+ ## Critical Rules
50
+ 1. Class map ordering: Specific substrings (radiobutton, compoundbutton) MUST precede generic ones (button) — first match wins
51
+ 2. Dual element format: Support both MCP nested (coordinates.width) and ADB flat (width) keys
52
+ 3. Resolution scaling: Font = width/54, line = width/360. Never use fixed pixel sizes
53
+ 4. Priority sorting: Interactive elements first, then by area descending
54
+ 5. Container filtering: Skip FrameLayout/LinearLayout/RelativeLayout to reduce noise
55
+
56
+ Key file: agents/device_testing/tools/autonomous_navigation_tools.py`,
57
+ coordinate_scaling: `# Coordinate Scaling — Screenshot vs Device Resolution
58
+
59
+ ## The Problem
60
+ Mobile MCP take_screenshot returns JPEG images scaled to ~45% of native resolution, but list_elements_on_screen returns coordinates in native device resolution.
61
+
62
+ | Layer | Resolution | Source |
63
+ |--------------------|-------------|----------------------------------|
64
+ | Device screen | 1080×2400 | Native resolution |
65
+ | Screenshot image | 486×1080 | Mobile MCP compresses to JPEG |
66
+ | Element coordinates| 1080×2400 | list_elements_on_screen (native) |
67
+
68
+ ## The Fix
69
+ 1. Get device screen size: mobile_mcp_client.get_screen_size(device_id)
70
+ Returns: "Screen size is 1080x2400 pixels"
71
+ 2. Parse width/height with regex: r'(\\d+)\\s*x\\s*(\\d+)'
72
+ 3. Compute scale factors:
73
+ scale_x = img.width / screen_width → 486/1080 = 0.45
74
+ scale_y = img.height / screen_height → 1080/2400 = 0.45
75
+ 4. Apply to ALL element coordinates before drawing:
76
+ x = int(raw_x * scale_x)
77
+ y = int(raw_y * scale_y)
78
+ width = int(raw_w * scale_x)
79
+ height = int(raw_h * scale_y)
80
+
81
+ ## Verification
82
+ - Center element (540,1200) → (243,540) ✓
83
+ - Bottom-right (1080,2400) → (486,1080) ✓
84
+ - Without scaling: elements at y=1990 drawn on 1080-tall image → off-screen ✗
85
+
86
+ Key file: autonomous_navigation_tools.py lines 397-595`,
87
+ };
88
+ // Additional topics added below to stay within file-size limits
89
+ METHODOLOGY_TOPICS.agent_config = `# Agent Configuration Patterns
90
+
91
+ ## Coordinator Agent (GPT-5.2)
92
+ - parallel_tool_calls=True (orchestration tasks can be parallel)
93
+ - reasoning=Reasoning(effort="high")
94
+ - Dynamic handoffs via is_enabled callbacks
95
+ - Delegates to: Search Assistant, Test Generation Specialist, Device Testing Specialist
96
+
97
+ ## Device Testing Agent (GPT-5-mini)
98
+ - parallel_tool_calls=False ← CRITICAL (navigation is sequential: observe→act→verify)
99
+ - reasoning=Reasoning(effort="medium")
100
+ - Auto-selects first device (prefers emulator-5554)
101
+ - NEVER asks user to choose between devices
102
+
103
+ ## Why parallel_tool_calls=False for Device Testing
104
+ Navigation is inherently sequential. With parallel=True, the agent was calling
105
+ list_available_devices AND start_navigation_session simultaneously, then asking
106
+ the user which device to use instead of auto-selecting. Setting it to False
107
+ forces sequential execution: discover device → select → navigate.
108
+
109
+ Key file: agents/device_testing/device_testing_agent.py`;
110
+ METHODOLOGY_TOPICS.vision_click = `# Vision-Augmented Navigation (Sight-Based Interaction)
111
+
112
+ When the accessibility tree (list_elements_on_screen) is insufficient (canvas-based UI,
113
+ loading states), the agent uses Agentic Vision (GPT-5.2) to find elements visually.
114
+
115
+ ## Primary Tool: vision_click(query="...")
116
+ 1. Captures screenshot via Mobile MCP
117
+ 2. Sends to GPT-5.2 with reasoning for element identification
118
+ 3. GPT-5.2 returns pixel coordinates of the target element
119
+ 4. Executes coordinate click via Mobile MCP
120
+
121
+ ## Workflow: Think → Act → Verify
122
+ - Think: GPT-5.2 analyzes screenshot, identifies target element
123
+ - Act: Determine precise pixel coordinates
124
+ - Verify: Coordinate click executed, verify screen changed
125
+
126
+ Key file: agents/device_testing/tools/agentic_vision_tools.py`;
127
+ METHODOLOGY_TOPICS.mobile_mcp = `# Mobile MCP Client Architecture
128
+
129
+ ## Connection
130
+ - Spawns npx -y @mobilenext/mobile-mcp@latest as subprocess
131
+ - Communicates via JSON-RPC over stdin/stdout
132
+ - Auto-initializes with protocol version 2024-11-05
133
+
134
+ ## ADB Fallback
135
+ When Mobile MCP returns "Device not found", automatically falls back to ADB:
136
+ - click → adb shell input tap x y
137
+ - type → adb shell input text "..."
138
+ - press_button → adb shell input keyevent KEYCODE
139
+
140
+ ## Key Methods
141
+ - take_screenshot(device) → returns JPEG base64 (scaled down ~45%)
142
+ - list_elements_on_screen(device) → returns elements in NATIVE resolution
143
+ - get_screen_size(device) → returns "Screen size is WxH pixels"
144
+ - click_on_screen(device, x, y) → click at coordinates
145
+ - swipe_on_screen(device, direction) → swipe gesture
146
+
147
+ Key file: agents/device_testing/mobile_mcp_client.py`;
148
+ METHODOLOGY_TOPICS.flicker_detection = `# Flicker Detection Pipeline — 4-Layer Architecture
149
+
150
+ Detects screen flickers too fast for periodic screenshots (16-200ms).
151
+
152
+ ## Layers
153
+ - Layer 0: SurfaceFlinger frame timing + logcat monitoring (always-on, zero cost)
154
+ - Layer 1: adb screenrecord triggered recording (60fps H.264)
155
+ - Layer 2: ffmpeg scene-filtered extraction + parallel SSIM analysis
156
+ - Layer 3: GPT-5.2 vision verification (semantic bug vs animation classification)
157
+
158
+ ## Optimizations (19x speedup)
159
+ - ffmpeg scene detection pre-filter (60-80% frame reduction)
160
+ - JPEG extraction (5-10x smaller than PNG)
161
+ - Parallel SSIM via ProcessPoolExecutor (3-5x speedup)
162
+ - Adaptive threshold (median - 2σ)
163
+
164
+ Key file: agents/device_testing/flicker_detection_service.py (1117 lines)`;
165
+ METHODOLOGY_TOPICS.closed_loop = `# Closed-Loop Verification (Ralph Loop)
166
+
167
+ Every change follows: THINK → ACT → VERIFY → OBSERVE → ADAPT → COMMIT
168
+
169
+ ## Verification Commands (Run Before Every Commit)
170
+ Backend: cd backend && pytest --tb=short
171
+ Frontend: cd frontend/test-studio && npm run build && npm run lint && npm run test -- --run
172
+ E2E: npx playwright test tests/e2e/golden-bugs.spec.ts
173
+
174
+ ## Self-Correction Protocol
175
+ 1. Read the error — understand what broke
176
+ 2. Diagnose root cause — don't just patch symptoms
177
+ 3. Fix systematically — update code, tests, and docs together
178
+ 4. Re-verify — run full verification again
179
+ 5. Iterate — repeat until green
180
+
181
+ NEVER commit without running verification!`;
182
+ METHODOLOGY_TOPICS.device_auto_select = `# Device Auto-Selection
183
+
184
+ ## The Bug
185
+ Agent was calling list_available_devices AND start_navigation_session twice each,
186
+ asking the user which device to use, then hanging without executing the task.
187
+
188
+ ## The Fix
189
+ 1. Instructions updated: "Auto-select the first available device (prefer emulator-5554)"
190
+ 2. CRITICAL WORKFLOW section added: "NEVER ask user to choose between devices"
191
+ 3. parallel_tool_calls set to False on Device Testing Agent
192
+
193
+ ## Device Selection Priority
194
+ 1. emulator-5554 (default Android emulator)
195
+ 2. First emulator-* found
196
+ 3. First device in the list
197
+
198
+ Key file: agents/device_testing/device_testing_agent.py`;
199
+ export const METHODOLOGY_TOPIC_LIST = Object.keys(METHODOLOGY_TOPICS);
200
+ //# sourceMappingURL=methodology.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"methodology.js","sourceRoot":"","sources":["../../src/knowledge/methodology.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,QAAQ,EAAE;;;;;;;;;;gEAUoD;IAE9D,IAAI,EAAE;;;;;;;;;;;;;;4EAcoE;IAE1E,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;qEAwBmD;IAEnE,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uDA6BiC;CACtD,CAAC;AAEF,gEAAgE;AAChE,kBAAkB,CAAC,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;wDAoBsB,CAAC;AAEzD,kBAAkB,CAAC,YAAY,GAAG;;;;;;;;;;;;;;;;8DAgB4B,CAAC;AAE/D,kBAAkB,CAAC,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;qDAoBqB,CAAC;AAEtD,kBAAkB,CAAC,iBAAiB,GAAG;;;;;;;;;;;;;;;;0EAgBmC,CAAC;AAE3E,kBAAkB,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;2CAgBU,CAAC;AAE5C,kBAAkB,CAAC,kBAAkB,GAAG;;;;;;;;;;;;;;;;wDAgBgB,CAAC;AAEzD,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Step-by-step workflows for common TA Studio tasks.
3
+ */
4
+ export declare const WORKFLOWS: Record<string, string>;
5
+ export declare const WORKFLOW_LIST: string[];
6
+ export declare const QUICK_COMMANDS = "# Quick Commands\n\n## Backend\ncd backend && python -m uvicorn app.main:app --reload --port 8000\ncd backend && pytest --tb=short\ncd backend && python -m mypy app/ --ignore-missing-imports\n\n## Frontend\ncd frontend/test-studio && npm run dev\ncd frontend/test-studio && npm run build\ncd frontend/test-studio && npm run lint\ncd frontend/test-studio && npx tsc --noEmit\n\n## E2E\nnpx playwright test\nnpx playwright test --trace on\nnpx playwright show-report\n\n## Device\nadb devices\nadb shell wm size\nadb shell screencap -p /sdcard/screen.png && adb pull /sdcard/screen.png\n\n## Git\ngit add <files> && git diff --cached --stat\ngit commit -m \"fix: description\"\ngit push origin main";
7
+ //# sourceMappingURL=workflows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/knowledge/workflows.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA8G5C,CAAC;AAEF,eAAO,MAAM,aAAa,UAAyB,CAAC;AAEpD,eAAO,MAAM,cAAc,6rBA0BN,CAAC"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Step-by-step workflows for common TA Studio tasks.
3
+ */
4
+ export const WORKFLOWS = {
5
+ bug_fix: `# Bug Fix Workflow
6
+
7
+ 1. DIAGNOSE — Read error logs, reproduce the issue
8
+ cd backend && tail -f /tmp/backend.log
9
+ 2. LOCATE — Find the affected file using codebase search
10
+ 3. ROOT CAUSE — Identify WHY, not just WHERE
11
+ 4. FIX — Make minimal, targeted change
12
+ 5. VERIFY — Run tests
13
+ cd backend && pytest --tb=short
14
+ cd frontend/test-studio && npm run build
15
+ 6. TEST E2E — If UI-related, run E2E
16
+ npx playwright test
17
+ 7. COMMIT — Only when all checks pass
18
+ git add <files> && git commit -m "fix: <description>"`,
19
+ navigation_test: `# Navigation Test Workflow
20
+
21
+ 1. ENSURE EMULATOR — adb devices (verify emulator-5554 connected)
22
+ 2. START BACKEND — cd backend && python -m uvicorn app.main:app --reload --port 8000
23
+ 3. START FRONTEND — cd frontend/test-studio && npm run dev
24
+ 4. OPEN DEMO — http://localhost:5173/demo
25
+ 5. SEND TASK — Type navigation task in chat (e.g. "go youtube find video for terry tricks")
26
+ 6. OBSERVE — Watch agent execute OAVR loop:
27
+ - Screenshots appear in emulator viewer
28
+ - SoM annotations show bounding boxes
29
+ - Agent narrates each step
30
+ 7. VERIFY ANNOTATIONS — Check bounding boxes align with actual elements
31
+ - If misaligned, check coordinate scaling (see: coordinate_scaling methodology)
32
+ 8. CHECK COMPLETION — Agent should report task complete with evidence`,
33
+ bbox_verify: `# Bounding Box Verification Workflow
34
+
35
+ 1. CAPTURE — Take screenshot via agent or manually:
36
+ ls -la backend/screenshots/emulator-5554_*_annotated.png
37
+ 2. COMPARE — Open raw and annotated screenshots side-by-side
38
+ 3. CHECK ALIGNMENT — Each bounding box should:
39
+ - Surround the correct UI element
40
+ - Have the right color for element type (see SoM palette)
41
+ - Label matches element text/type
42
+ 4. IF MISALIGNED:
43
+ a. Check device screen size: adb shell wm size → e.g. 1080x2400
44
+ b. Check screenshot size: python3 -c "from PIL import Image; print(Image.open('screenshot.png').size)"
45
+ c. Verify scale factors: scale_x = img_width / screen_width
46
+ d. Check autonomous_navigation_tools.py lines 397-448 for scaling code
47
+ 5. TEST FIX — Run navigation task and verify annotations`,
48
+ agent_debug: `# Agent Chat Debugging Workflow
49
+
50
+ 1. CHECK SERVICES:
51
+ curl http://localhost:8000/health
52
+ curl http://localhost:5173
53
+ 2. CHECK BACKEND LOGS:
54
+ tail -f /tmp/backend.log
55
+ 3. COMMON ISSUES:
56
+ - Agent hangs → Check parallel_tool_calls setting (should be False for device testing)
57
+ - Device not found → adb devices, check emulator running
58
+ - Screenshot fails → Check Mobile MCP process running
59
+ - Bbox wrong → Check coordinate scaling (methodology: coordinate_scaling)
60
+ 4. SSE STREAM DEBUG:
61
+ - Open browser DevTools → Network → filter "EventStream"
62
+ - Check for proper event format: data: {...}
63
+ 5. AGENT TRACE — Check LangSmith (if configured):
64
+ https://smith.langchain.com`,
65
+ feature: `# Feature Development Workflow
66
+
67
+ 1. PLAN — Define scope, affected files, architecture impact
68
+ 2. BRANCH — git checkout -b feature/<name>
69
+ 3. IMPLEMENT — Follow code style (Python: type hints + docstrings, TS: explicit types)
70
+ 4. TEST — Write unit tests alongside implementation
71
+ 5. VERIFY BACKEND:
72
+ cd backend && pytest --tb=short
73
+ 6. VERIFY FRONTEND:
74
+ cd frontend/test-studio && npm run build && npm run lint
75
+ 7. E2E — Test end-to-end if UI-related
76
+ npx playwright test
77
+ 8. REVIEW — Self-review diff before commit
78
+ 9. COMMIT — Descriptive commit message
79
+ 10. PUSH — git push origin feature/<name>`,
80
+ figma_analysis: `# Figma Flow Analysis Workflow
81
+
82
+ 1. GET API KEY — Figma Personal Access Token
83
+ 2. EXTRACT — Figma REST API (depth=3): DOC→CANVAS→SECTION→FRAME
84
+ 3. CLUSTER — Multi-signal priority cascade:
85
+ Sections → Prototype connections → Name prefixes → Spatial (Y-bin + X-gap)
86
+ 4. VISUALIZE — PIL bounding boxes on Figma canvas screenshots
87
+ 5. IF RATE-LIMITED — Use CV overlay (no API calls):
88
+ cd backend && python scripts/figma_cv_overlay.py
89
+ - Brightness thresholding (>80 for sections, >100 for frames)
90
+ - Morphological closing/opening (scipy.ndimage)
91
+ - Connected component analysis
92
+
93
+ Key files:
94
+ - app/figma/flow_analyzer.py — Core pipeline
95
+ - scripts/figma_cv_overlay.py — CV fallback`,
96
+ flicker_test: `# Flicker Detection Test Workflow
97
+
98
+ 1. ENSURE EMULATOR — adb devices
99
+ 2. START RECORDING — Layer 1 triggers adb screenrecord (60fps)
100
+ 3. REPRODUCE — Navigate to the screen with suspected flicker
101
+ 4. EXTRACT FRAMES — Layer 2 uses ffmpeg scene detection
102
+ 5. ANALYZE — Parallel SSIM comparison of consecutive frames
103
+ 6. VERIFY — Layer 3 sends suspicious frames to GPT-5.2 vision
104
+ 7. REPORT — Classified as bug (flicker/glitch) or animation (expected)
105
+
106
+ Quick test:
107
+ cd backend && python scripts/test_flicker_detection.py`,
108
+ };
109
+ export const WORKFLOW_LIST = Object.keys(WORKFLOWS);
110
+ export const QUICK_COMMANDS = `# Quick Commands
111
+
112
+ ## Backend
113
+ cd backend && python -m uvicorn app.main:app --reload --port 8000
114
+ cd backend && pytest --tb=short
115
+ cd backend && python -m mypy app/ --ignore-missing-imports
116
+
117
+ ## Frontend
118
+ cd frontend/test-studio && npm run dev
119
+ cd frontend/test-studio && npm run build
120
+ cd frontend/test-studio && npm run lint
121
+ cd frontend/test-studio && npx tsc --noEmit
122
+
123
+ ## E2E
124
+ npx playwright test
125
+ npx playwright test --trace on
126
+ npx playwright show-report
127
+
128
+ ## Device
129
+ adb devices
130
+ adb shell wm size
131
+ adb shell screencap -p /sdcard/screen.png && adb pull /sdcard/screen.png
132
+
133
+ ## Git
134
+ git add <files> && git diff --cached --stat
135
+ git commit -m "fix: description"
136
+ git push origin main`;
137
+ //# sourceMappingURL=workflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/knowledge/workflows.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,SAAS,GAA2B;IAC/C,OAAO,EAAE;;;;;;;;;;;;;yDAa8C;IAEvD,eAAe,EAAE;;;;;;;;;;;;;sEAamD;IAEpE,WAAW,EAAE;;;;;;;;;;;;;;yDAc0C;IAEvD,WAAW,EAAE;;;;;;;;;;;;;;;;+BAgBgB;IAE7B,OAAO,EAAE;;;;;;;;;;;;;;0CAc+B;IAExC,cAAc,EAAE;;;;;;;;;;;;;;;4CAe0B;IAE1C,YAAY,EAAE;;;;;;;;;;;uDAWuC;CACtD,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;qBA0BT,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Register all TA Studio MCP tools on a McpServer instance.
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ export declare function registerAllTools(server: McpServer): void;
6
+ //# sourceMappingURL=register-all.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-all.d.ts","sourceRoot":"","sources":["../../src/tools/register-all.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoIxD"}
@@ -0,0 +1,104 @@
1
+ import { z } from 'zod';
2
+ import { METHODOLOGY_TOPICS, METHODOLOGY_TOPIC_LIST } from '../knowledge/methodology.js';
3
+ import { KNOWN_ISSUES, ISSUE_CATEGORIES } from '../knowledge/known-issues.js';
4
+ import { CODEBASE_SECTIONS, CODEBASE_SECTION_LIST } from '../knowledge/codebase-map.js';
5
+ import { WORKFLOWS, WORKFLOW_LIST, QUICK_COMMANDS } from '../knowledge/workflows.js';
6
+ import { CONVENTIONS, AGENT_CONFIG_REFERENCE } from '../knowledge/conventions.js';
7
+ export function registerAllTools(server) {
8
+ // ─── 1. getMethodology ───
9
+ server.registerTool('getMethodology', {
10
+ title: 'TA Studio Methodology',
11
+ description: `Get detailed methodology for a TA Studio pattern or technique. Topics: ${METHODOLOGY_TOPIC_LIST.join(', ')}. Use "overview" to see all topics.`,
12
+ inputSchema: {
13
+ topic: z.string().describe(`Topic name. Available: ${METHODOLOGY_TOPIC_LIST.join(', ')}`),
14
+ },
15
+ }, async ({ topic }) => {
16
+ const content = METHODOLOGY_TOPICS[topic];
17
+ if (!content) {
18
+ return {
19
+ content: [{ type: 'text', text: `Unknown topic "${topic}". Available: ${METHODOLOGY_TOPIC_LIST.join(', ')}` }],
20
+ };
21
+ }
22
+ return { content: [{ type: 'text', text: content }] };
23
+ });
24
+ // ─── 2. getKnownIssues ───
25
+ server.registerTool('getKnownIssues', {
26
+ title: 'TA Studio Known Issues',
27
+ description: `Get known issues and their fixes. Categories: ${ISSUE_CATEGORIES.join(', ')}. Omit category for all issues.`,
28
+ inputSchema: {
29
+ category: z.string().optional().describe(`Filter by category: ${ISSUE_CATEGORIES.join(', ')}`),
30
+ },
31
+ }, async ({ category }) => {
32
+ const issues = category
33
+ ? KNOWN_ISSUES.filter(i => i.category === category)
34
+ : KNOWN_ISSUES;
35
+ if (issues.length === 0) {
36
+ return {
37
+ content: [{ type: 'text', text: `No issues found for category "${category}". Available: ${ISSUE_CATEGORIES.join(', ')}` }],
38
+ };
39
+ }
40
+ const text = issues.map(i => `## [${i.severity.toUpperCase()}] ${i.title}\n` +
41
+ `**ID**: ${i.id}\n` +
42
+ `**Symptom**: ${i.symptom}\n` +
43
+ `**Root Cause**: ${i.rootCause}\n` +
44
+ `**Fix**: ${i.fix}\n` +
45
+ `**File**: ${i.file}` +
46
+ (i.commit ? `\n**Commit**: ${i.commit}` : '')).join('\n\n---\n\n');
47
+ return { content: [{ type: 'text', text: `# Known Issues (${issues.length})\n\n${text}` }] };
48
+ });
49
+ // ─── 3. getCodebaseMap ───
50
+ server.registerTool('getCodebaseMap', {
51
+ title: 'TA Studio Codebase Map',
52
+ description: `Get codebase structure and file purposes. Sections: ${CODEBASE_SECTION_LIST.join(', ')}. Use "overview" for full map.`,
53
+ inputSchema: {
54
+ section: z.string().optional().describe(`Section: ${CODEBASE_SECTION_LIST.join(', ')}. Default: overview`),
55
+ },
56
+ }, async ({ section }) => {
57
+ const key = section || 'overview';
58
+ const content = CODEBASE_SECTIONS[key];
59
+ if (!content) {
60
+ return {
61
+ content: [{ type: 'text', text: `Unknown section "${key}". Available: ${CODEBASE_SECTION_LIST.join(', ')}` }],
62
+ };
63
+ }
64
+ return { content: [{ type: 'text', text: content }] };
65
+ });
66
+ // ─── 4. getWorkflow ───
67
+ server.registerTool('getWorkflow', {
68
+ title: 'TA Studio Workflows',
69
+ description: `Get step-by-step workflow. Available: ${WORKFLOW_LIST.join(', ')}.`,
70
+ inputSchema: {
71
+ name: z.string().describe(`Workflow name: ${WORKFLOW_LIST.join(', ')}`),
72
+ },
73
+ }, async ({ name }) => {
74
+ const content = WORKFLOWS[name];
75
+ if (!content) {
76
+ return {
77
+ content: [{ type: 'text', text: `Unknown workflow "${name}". Available: ${WORKFLOW_LIST.join(', ')}` }],
78
+ };
79
+ }
80
+ return { content: [{ type: 'text', text: content }] };
81
+ });
82
+ // ─── 5. getQuickCommands ───
83
+ server.registerTool('getQuickCommands', {
84
+ title: 'TA Studio Quick Commands',
85
+ description: 'Get all quick development commands for backend, frontend, E2E, device, and git.',
86
+ }, async () => {
87
+ return { content: [{ type: 'text', text: QUICK_COMMANDS }] };
88
+ });
89
+ // ─── 6. getConventions ───
90
+ server.registerTool('getConventions', {
91
+ title: 'TA Studio Code Conventions',
92
+ description: 'Get code style guidelines, patterns, and critical rules for Python backend and TypeScript frontend.',
93
+ }, async () => {
94
+ return { content: [{ type: 'text', text: CONVENTIONS }] };
95
+ });
96
+ // ─── 7. getAgentConfig ───
97
+ server.registerTool('getAgentConfig', {
98
+ title: 'TA Studio Agent Configuration',
99
+ description: 'Get full agent configuration reference — models, parallel_tool_calls, reasoning levels, handoffs, and streaming setup.',
100
+ }, async () => {
101
+ return { content: [{ type: 'text', text: AGENT_CONFIG_REFERENCE }] };
102
+ });
103
+ }
104
+ //# sourceMappingURL=register-all.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-all.js","sourceRoot":"","sources":["../../src/tools/register-all.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "ta-studio-mcp",
3
+ "version": "1.0.0",
4
+ "description": "TA Studio MCP — Domain knowledge, patterns, bug fixes, and workflows for AI agents working on the TA Studio mobile test automation platform.",
5
+ "type": "module",
6
+ "bin": {
7
+ "ta-studio-mcp": "dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "files": [
11
+ "dist",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsc --watch",
18
+ "start": "node dist/index.js",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/TA-Studios-AI-Avengers/ta-agent-examples.git",
24
+ "directory": "packages/ta-studio-mcp"
25
+ },
26
+ "homepage": "https://github.com/TA-Studios-AI-Avengers/ta-agent-examples/tree/main/packages/ta-studio-mcp#readme",
27
+ "bugs": {
28
+ "url": "https://github.com/TA-Studios-AI-Avengers/ta-agent-examples/issues"
29
+ },
30
+ "author": "TA Studios",
31
+ "keywords": [
32
+ "mcp",
33
+ "model-context-protocol",
34
+ "mobile-testing",
35
+ "android",
36
+ "test-automation",
37
+ "ai-agents",
38
+ "ta-studio",
39
+ "claude",
40
+ "openai",
41
+ "agentic",
42
+ "oavr",
43
+ "som-annotation",
44
+ "device-testing",
45
+ "screenshot-annotation"
46
+ ],
47
+ "license": "MIT",
48
+ "dependencies": {
49
+ "@modelcontextprotocol/sdk": "^1.21.1",
50
+ "zod": "^3.23.8"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^22.0.0",
54
+ "typescript": "^5.5.4"
55
+ },
56
+ "engines": {
57
+ "node": ">=18"
58
+ }
59
+ }