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 +22 -0
- package/README.md +136 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/codebase-map.d.ts +6 -0
- package/dist/knowledge/codebase-map.d.ts.map +1 -0
- package/dist/knowledge/codebase-map.js +113 -0
- package/dist/knowledge/codebase-map.js.map +1 -0
- package/dist/knowledge/conventions.d.ts +6 -0
- package/dist/knowledge/conventions.d.ts.map +1 -0
- package/dist/knowledge/conventions.js +97 -0
- package/dist/knowledge/conventions.js.map +1 -0
- package/dist/knowledge/known-issues.d.ts +17 -0
- package/dist/knowledge/known-issues.d.ts.map +1 -0
- package/dist/knowledge/known-issues.js +103 -0
- package/dist/knowledge/known-issues.js.map +1 -0
- package/dist/knowledge/methodology.d.ts +7 -0
- package/dist/knowledge/methodology.d.ts.map +1 -0
- package/dist/knowledge/methodology.js +200 -0
- package/dist/knowledge/methodology.js.map +1 -0
- package/dist/knowledge/workflows.d.ts +7 -0
- package/dist/knowledge/workflows.d.ts.map +1 -0
- package/dist/knowledge/workflows.js +137 -0
- package/dist/knowledge/workflows.js.map +1 -0
- package/dist/tools/register-all.d.ts +6 -0
- package/dist/tools/register-all.d.ts.map +1 -0
- package/dist/tools/register-all.js +104 -0
- package/dist/tools/register-all.js.map +1 -0
- package/package.json +59 -0
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
|
+
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAElF,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,4BAA4B;IAC5B,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,0EAA0E,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,qCAAqC;QAC7J,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SAC1F;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,kBAAkB,KAAK,iBAAiB,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;aACxH,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC,CACF,CAAC;IAEF,4BAA4B;IAC5B,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,iDAAiD,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC;QAC1H,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SAC/F;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,QAAQ;YACrB,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;YACnD,CAAC,CAAC,YAAY,CAAC;QACjB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,iCAAiC,QAAQ,iBAAiB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;aACpI,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC1B,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,KAAK,IAAI;YAC/C,WAAW,CAAC,CAAC,EAAE,IAAI;YACnB,gBAAgB,CAAC,CAAC,OAAO,IAAI;YAC7B,mBAAmB,CAAC,CAAC,SAAS,IAAI;YAClC,YAAY,CAAC,CAAC,GAAG,IAAI;YACrB,aAAa,CAAC,CAAC,IAAI,EAAE;YACrB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC9C,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,mBAAmB,MAAM,CAAC,MAAM,QAAQ,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;IACxG,CAAC,CACF,CAAC;IAEF,4BAA4B;IAC5B,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,uDAAuD,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,gCAAgC;QACpI,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC;SAC3G;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,MAAM,GAAG,GAAG,OAAO,IAAI,UAAU,CAAC;QAClC,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oBAAoB,GAAG,iBAAiB,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;aACvH,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC,CACF,CAAC;IAEF,yBAAyB;IACzB,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,yCAAyC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QACjF,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SACxE;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qBAAqB,IAAI,iBAAiB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;aACjH,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC,CACF,CAAC;IAEF,8BAA8B;IAC9B,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,iFAAiF;KAC/F,EACD,KAAK,IAAI,EAAE;QACT,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;IACxE,CAAC,CACF,CAAC;IAEF,4BAA4B;IAC5B,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,4BAA4B;QACnC,WAAW,EAAE,qGAAqG;KACnH,EACD,KAAK,IAAI,EAAE;QACT,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IACrE,CAAC,CACF,CAAC;IAEF,4BAA4B;IAC5B,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,+BAA+B;QACtC,WAAW,EAAE,wHAAwH;KACtI,EACD,KAAK,IAAI,EAAE;QACT,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,EAAE,CAAC;IAChF,CAAC,CACF,CAAC;AACJ,CAAC"}
|
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
|
+
}
|