devlens-mcp 0.4.1 → 0.5.2

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.
Files changed (131) hide show
  1. package/README.md +211 -35
  2. package/RELEASE_NOTES.md +3 -7
  3. package/dist/bin/cli.js +47 -13
  4. package/dist/bin/cli.js.map +1 -1
  5. package/dist/bin/setup.d.ts +14 -0
  6. package/dist/bin/setup.d.ts.map +1 -0
  7. package/dist/bin/setup.js +272 -0
  8. package/dist/bin/setup.js.map +1 -0
  9. package/dist/src/figma/figma-api.d.ts +108 -0
  10. package/dist/src/figma/figma-api.d.ts.map +1 -0
  11. package/dist/src/figma/figma-api.js +284 -0
  12. package/dist/src/figma/figma-api.js.map +1 -0
  13. package/dist/src/figma/figma-cache.d.ts +57 -0
  14. package/dist/src/figma/figma-cache.d.ts.map +1 -0
  15. package/dist/src/figma/figma-cache.js +266 -0
  16. package/dist/src/figma/figma-cache.js.map +1 -0
  17. package/dist/src/figma/figma-client.d.ts +62 -0
  18. package/dist/src/figma/figma-client.d.ts.map +1 -0
  19. package/dist/src/figma/figma-client.js +224 -0
  20. package/dist/src/figma/figma-client.js.map +1 -0
  21. package/dist/src/figma/figma-rate-limiter.d.ts +46 -0
  22. package/dist/src/figma/figma-rate-limiter.d.ts.map +1 -0
  23. package/dist/src/figma/figma-rate-limiter.js +153 -0
  24. package/dist/src/figma/figma-rate-limiter.js.map +1 -0
  25. package/dist/src/figma/figma-retry.d.ts +19 -0
  26. package/dist/src/figma/figma-retry.d.ts.map +1 -0
  27. package/dist/src/figma/figma-retry.js +57 -0
  28. package/dist/src/figma/figma-retry.js.map +1 -0
  29. package/dist/src/figma/figma-structure.d.ts +1 -1
  30. package/dist/src/figma/figma-structure.d.ts.map +1 -1
  31. package/dist/src/figma/figma-structure.js +11 -1
  32. package/dist/src/figma/figma-structure.js.map +1 -1
  33. package/dist/src/figma/figma-types.d.ts +54 -0
  34. package/dist/src/figma/figma-types.d.ts.map +1 -0
  35. package/dist/src/figma/figma-types.js +33 -0
  36. package/dist/src/figma/figma-types.js.map +1 -0
  37. package/dist/src/figma/url-parser.d.ts +40 -0
  38. package/dist/src/figma/url-parser.d.ts.map +1 -0
  39. package/dist/src/figma/url-parser.js +107 -0
  40. package/dist/src/figma/url-parser.js.map +1 -0
  41. package/dist/src/platform/device-manager.d.ts +5 -0
  42. package/dist/src/platform/device-manager.d.ts.map +1 -1
  43. package/dist/src/platform/device-manager.js +18 -0
  44. package/dist/src/platform/device-manager.js.map +1 -1
  45. package/dist/src/platform/device-pool.d.ts +105 -0
  46. package/dist/src/platform/device-pool.d.ts.map +1 -0
  47. package/dist/src/platform/device-pool.js +328 -0
  48. package/dist/src/platform/device-pool.js.map +1 -0
  49. package/dist/src/platform/device-profiles.d.ts +50 -0
  50. package/dist/src/platform/device-profiles.d.ts.map +1 -0
  51. package/dist/src/platform/device-profiles.js +155 -0
  52. package/dist/src/platform/device-profiles.js.map +1 -0
  53. package/dist/src/platform/ios/ios-device.d.ts +0 -2
  54. package/dist/src/platform/ios/ios-device.d.ts.map +1 -1
  55. package/dist/src/platform/ios/ios-device.js +8 -18
  56. package/dist/src/platform/ios/ios-device.js.map +1 -1
  57. package/dist/src/platform/ios/simctl.d.ts +0 -5
  58. package/dist/src/platform/ios/simctl.d.ts.map +1 -1
  59. package/dist/src/platform/ios/simctl.js +0 -4
  60. package/dist/src/platform/ios/simctl.js.map +1 -1
  61. package/dist/src/platform/simulator-factory.d.ts +85 -0
  62. package/dist/src/platform/simulator-factory.d.ts.map +1 -0
  63. package/dist/src/platform/simulator-factory.js +396 -0
  64. package/dist/src/platform/simulator-factory.js.map +1 -0
  65. package/dist/src/platform/system-resources.d.ts +44 -0
  66. package/dist/src/platform/system-resources.d.ts.map +1 -0
  67. package/dist/src/platform/system-resources.js +103 -0
  68. package/dist/src/platform/system-resources.js.map +1 -0
  69. package/dist/src/prototype/browser-engine.d.ts +62 -0
  70. package/dist/src/prototype/browser-engine.d.ts.map +1 -0
  71. package/dist/src/prototype/browser-engine.js +199 -0
  72. package/dist/src/prototype/browser-engine.js.map +1 -0
  73. package/dist/src/prototype/figma-navigator.d.ts +40 -0
  74. package/dist/src/prototype/figma-navigator.d.ts.map +1 -0
  75. package/dist/src/prototype/figma-navigator.js +95 -0
  76. package/dist/src/prototype/figma-navigator.js.map +1 -0
  77. package/dist/src/prototype/flow-reporter.d.ts +47 -0
  78. package/dist/src/prototype/flow-reporter.d.ts.map +1 -0
  79. package/dist/src/prototype/flow-reporter.js +255 -0
  80. package/dist/src/prototype/flow-reporter.js.map +1 -0
  81. package/dist/src/prototype/screen-analyzer.d.ts +31 -0
  82. package/dist/src/prototype/screen-analyzer.d.ts.map +1 -0
  83. package/dist/src/prototype/screen-analyzer.js +114 -0
  84. package/dist/src/prototype/screen-analyzer.js.map +1 -0
  85. package/dist/src/prototype/web-crawler.d.ts +31 -0
  86. package/dist/src/prototype/web-crawler.d.ts.map +1 -0
  87. package/dist/src/prototype/web-crawler.js +88 -0
  88. package/dist/src/prototype/web-crawler.js.map +1 -0
  89. package/dist/src/reports/cross-device-report.d.ts +84 -0
  90. package/dist/src/reports/cross-device-report.d.ts.map +1 -0
  91. package/dist/src/reports/cross-device-report.js +342 -0
  92. package/dist/src/reports/cross-device-report.js.map +1 -0
  93. package/dist/src/server.d.ts.map +1 -1
  94. package/dist/src/server.js +9 -1
  95. package/dist/src/server.js.map +1 -1
  96. package/dist/src/snapshot/formatter.d.ts +5 -13
  97. package/dist/src/snapshot/formatter.d.ts.map +1 -1
  98. package/dist/src/snapshot/formatter.js +19 -28
  99. package/dist/src/snapshot/formatter.js.map +1 -1
  100. package/dist/src/tools/interaction-tools.d.ts +6 -6
  101. package/dist/src/tools/interaction-tools.d.ts.map +1 -1
  102. package/dist/src/tools/interaction-tools.js +2 -12
  103. package/dist/src/tools/interaction-tools.js.map +1 -1
  104. package/dist/src/tools/metro-tools.d.ts +2 -2
  105. package/dist/src/tools/multi-device-tools.d.ts +133 -0
  106. package/dist/src/tools/multi-device-tools.d.ts.map +1 -0
  107. package/dist/src/tools/multi-device-tools.js +365 -0
  108. package/dist/src/tools/multi-device-tools.js.map +1 -0
  109. package/dist/src/tools/navigation-tools.d.ts.map +1 -1
  110. package/dist/src/tools/navigation-tools.js +1 -6
  111. package/dist/src/tools/navigation-tools.js.map +1 -1
  112. package/dist/src/tools/prototype-tools.d.ts +102 -0
  113. package/dist/src/tools/prototype-tools.d.ts.map +1 -0
  114. package/dist/src/tools/prototype-tools.js +391 -0
  115. package/dist/src/tools/prototype-tools.js.map +1 -0
  116. package/dist/src/tools/screenshot-tools.d.ts +7 -74
  117. package/dist/src/tools/screenshot-tools.d.ts.map +1 -1
  118. package/dist/src/tools/screenshot-tools.js +19 -286
  119. package/dist/src/tools/screenshot-tools.js.map +1 -1
  120. package/dist/src/tools/vqa-tools.d.ts +2 -2
  121. package/dist/src/tools/vqa-tools.d.ts.map +1 -1
  122. package/dist/src/tools/vqa-tools.js +4 -69
  123. package/dist/src/tools/vqa-tools.js.map +1 -1
  124. package/docs/figma-workflow.md +58 -6
  125. package/docs/installation-guide.md +302 -0
  126. package/docs/setup-guide.md +77 -79
  127. package/docs/tool-reference.md +152 -69
  128. package/install.sh +119 -0
  129. package/package.json +5 -2
  130. package/setup.sh +320 -0
  131. package/tsconfig.json +1 -1
package/setup.sh ADDED
@@ -0,0 +1,320 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # DevLens MCP — Setup Wizard
4
+ #
5
+ # Share this script with your team via Teams / Slack / email.
6
+ # Usage:
7
+ # bash setup.sh
8
+ #
9
+ # What it does:
10
+ # 1. Checks prerequisites (Node.js 18+, adb/simctl)
11
+ # 2. Prompts for Azure DevOps PAT
12
+ # 3. Configures npm to use Azure Artifacts private registry
13
+ # 4. Installs devlens-mcp
14
+ # 5. Configures Cursor / Claude Desktop / Claude Code
15
+ # 6. Verifies everything works
16
+
17
+ set -euo pipefail
18
+
19
+ AZURE_REGISTRY="https://pkgs.dev.azure.com/JioOmni/_packaging/devlens/npm/registry/"
20
+ AZURE_FEED_URL="https://dev.azure.com/JioOmni/OmniAI/_artifacts/feed/devlens"
21
+ PAT_URL="https://dev.azure.com/JioOmni/_usersSettings/tokens"
22
+
23
+ GREEN='\033[0;32m'
24
+ YELLOW='\033[1;33m'
25
+ RED='\033[0;31m'
26
+ BLUE='\033[0;34m'
27
+ BOLD='\033[1m'
28
+ NC='\033[0m'
29
+
30
+ ok() { echo -e " ${GREEN}[OK]${NC} $1"; }
31
+ warn() { echo -e " ${YELLOW}[!!]${NC} $1"; }
32
+ fail() { echo -e " ${RED}[XX]${NC} $1"; }
33
+ info() { echo -e " ${BLUE}[..]${NC} $1"; }
34
+
35
+ banner() {
36
+ echo ""
37
+ echo -e " ${BOLD}╔══════════════════════════════════════════╗${NC}"
38
+ echo -e " ${BOLD}║ DevLens MCP — Setup Wizard ║${NC}"
39
+ echo -e " ${BOLD}╚══════════════════════════════════════════╝${NC}"
40
+ echo ""
41
+ }
42
+
43
+ # ── Step 1: Prerequisites ──────────────────────────────────
44
+
45
+ check_prerequisites() {
46
+ echo -e " ${BOLD}Step 1/6 — Checking prerequisites${NC}"
47
+ echo " ──────────────────────────────────"
48
+
49
+ if ! command -v node &>/dev/null; then
50
+ fail "Node.js not found. Install v18+ from https://nodejs.org"
51
+ exit 1
52
+ fi
53
+
54
+ NODE_VERSION=$(node -v | sed 's/v//')
55
+ NODE_MAJOR=$(echo "$NODE_VERSION" | cut -d. -f1)
56
+ if [ "$NODE_MAJOR" -lt 18 ]; then
57
+ fail "Node.js $NODE_VERSION detected — v18+ required"
58
+ exit 1
59
+ fi
60
+ ok "Node.js $NODE_VERSION"
61
+
62
+ if ! command -v npm &>/dev/null; then
63
+ fail "npm not found"
64
+ exit 1
65
+ fi
66
+ ok "npm $(npm -v)"
67
+
68
+ if command -v adb &>/dev/null; then
69
+ ok "Android SDK (adb) found"
70
+ else
71
+ info "Android SDK (adb) not found — Android features unavailable"
72
+ fi
73
+
74
+ if [[ "$OSTYPE" == "darwin"* ]]; then
75
+ if command -v xcrun &>/dev/null && xcrun simctl help &>/dev/null 2>&1; then
76
+ ok "Xcode simctl found"
77
+ else
78
+ info "Xcode simctl not found — iOS features unavailable"
79
+ fi
80
+ fi
81
+ }
82
+
83
+ # ── Step 2: Azure DevOps PAT ───────────────────────────────
84
+
85
+ get_pat() {
86
+ echo ""
87
+ echo -e " ${BOLD}Step 2/6 — Azure Artifacts authentication${NC}"
88
+ echo " ──────────────────────────────────────────"
89
+ echo ""
90
+ echo " You need a Personal Access Token (PAT) from Azure DevOps."
91
+ echo ""
92
+ echo " How to create one:"
93
+ echo " 1. Open: $PAT_URL"
94
+ echo " 2. Click 'New Token'"
95
+ echo " 3. Name: devlens-npm"
96
+ echo " 4. Scope: Packaging → Read"
97
+ echo " 5. Click 'Create' and copy the token"
98
+ echo ""
99
+
100
+ read -rsp " Paste your PAT (input hidden): " PAT
101
+ echo ""
102
+
103
+ if [ ${#PAT} -lt 20 ]; then
104
+ fail "PAT looks too short. Please try again."
105
+ exit 1
106
+ fi
107
+
108
+ ok "PAT received"
109
+ }
110
+
111
+ # ── Step 3: Configure npm ──────────────────────────────────
112
+
113
+ configure_npm() {
114
+ echo ""
115
+ echo -e " ${BOLD}Step 3/6 — Configuring npm registry${NC}"
116
+ echo " ─────────────────────────────────────"
117
+
118
+ BASE64_PAT=$(echo -n "$PAT" | base64)
119
+
120
+ REGISTRY_KEY="//pkgs.dev.azure.com/JioOmni/_packaging/devlens/npm/registry/"
121
+
122
+ NPMRC_FILE="$HOME/.npmrc"
123
+ if [ -f "$NPMRC_FILE" ]; then
124
+ # Remove any existing devlens registry entries
125
+ grep -v "pkgs.dev.azure.com/JioOmni/_packaging/devlens" "$NPMRC_FILE" > "$NPMRC_FILE.tmp" || true
126
+ mv "$NPMRC_FILE.tmp" "$NPMRC_FILE"
127
+ fi
128
+
129
+ {
130
+ echo "${REGISTRY_KEY}:username=JioOmni"
131
+ echo "${REGISTRY_KEY}:_password=${BASE64_PAT}"
132
+ echo "${REGISTRY_KEY}:email=npm@jio.com"
133
+ } >> "$NPMRC_FILE"
134
+
135
+ ok "npm credentials saved to $NPMRC_FILE"
136
+
137
+ # Create project-level .npmrc if in a project directory
138
+ if [ -f "package.json" ]; then
139
+ if [ ! -f ".npmrc" ] || ! grep -q "pkgs.dev.azure.com/JioOmni/_packaging/devlens" ".npmrc" 2>/dev/null; then
140
+ echo "registry=${AZURE_REGISTRY}" > .npmrc
141
+ echo "always-auth=true" >> .npmrc
142
+ ok "Project .npmrc created"
143
+ else
144
+ ok "Project .npmrc already configured"
145
+ fi
146
+ fi
147
+ }
148
+
149
+ # ── Step 4: Install DevLens ────────────────────────────────
150
+
151
+ install_devlens() {
152
+ echo ""
153
+ echo -e " ${BOLD}Step 4/6 — Installing devlens-mcp${NC}"
154
+ echo " ──────────────────────────────────"
155
+
156
+ info "Installing globally from Azure Artifacts..."
157
+
158
+ if npm install -g devlens-mcp@latest --registry="$AZURE_REGISTRY"; then
159
+ INSTALLED_VERSION=$(devlens-mcp --version 2>/dev/null || echo "unknown")
160
+ ok "devlens-mcp installed globally ($INSTALLED_VERSION)"
161
+ else
162
+ fail "Global install failed — check PAT permissions (needs Packaging → Read)"
163
+ exit 1
164
+ fi
165
+ }
166
+
167
+ # ── Step 5: Configure IDEs ─────────────────────────────────
168
+
169
+ configure_ide() {
170
+ local NAME="$1"
171
+ local CONFIG_PATH="$2"
172
+ local FIGMA_TOKEN="$3"
173
+
174
+ CONFIG_DIR=$(dirname "$CONFIG_PATH")
175
+
176
+ if [ ! -d "$CONFIG_DIR" ]; then
177
+ mkdir -p "$CONFIG_DIR"
178
+ fi
179
+
180
+ if [ -f "$CONFIG_PATH" ]; then
181
+ EXISTING=$(cat "$CONFIG_PATH")
182
+ else
183
+ EXISTING="{}"
184
+ fi
185
+
186
+ # Use node to merge JSON safely — uses global command, no npx caching issues
187
+ MERGED=$(node -e "
188
+ let config = {};
189
+ try { config = JSON.parse(process.argv[1]); } catch {}
190
+ if (!config.mcpServers) config.mcpServers = {};
191
+ const env = { METRO_PORT: '8081' };
192
+ const figma = process.argv[2];
193
+ if (figma) env.FIGMA_TOKEN = figma;
194
+ config.mcpServers.devlens = {
195
+ command: 'devlens-mcp',
196
+ args: [],
197
+ env
198
+ };
199
+ console.log(JSON.stringify(config, null, 2));
200
+ " "$EXISTING" "${FIGMA_TOKEN}" 2>/dev/null)
201
+
202
+ if [ -n "$MERGED" ]; then
203
+ echo "$MERGED" > "$CONFIG_PATH"
204
+ ok "$NAME: configured at $CONFIG_PATH"
205
+ else
206
+ warn "$NAME: could not write config"
207
+ fi
208
+ }
209
+
210
+ configure_ides() {
211
+ echo ""
212
+ echo -e " ${BOLD}Step 5/6 — Configuring IDEs${NC}"
213
+ echo " ──────────────────────────"
214
+
215
+ echo ""
216
+ read -rp " Figma token (optional, Enter to skip): " FIGMA_TOKEN
217
+
218
+ CONFIGURED=0
219
+
220
+ # Cursor (global)
221
+ CURSOR_CONFIG="$HOME/.cursor/mcp.json"
222
+ if [ -d "$HOME/.cursor" ] || command -v cursor &>/dev/null; then
223
+ configure_ide "Cursor (global)" "$CURSOR_CONFIG" "$FIGMA_TOKEN"
224
+ CONFIGURED=$((CONFIGURED + 1))
225
+ fi
226
+
227
+ # Cursor (project-level) — if in a project directory
228
+ if [ -f "package.json" ]; then
229
+ PROJECT_CURSOR=".cursor/mcp.json"
230
+ configure_ide "Cursor (project)" "$PROJECT_CURSOR" "$FIGMA_TOKEN"
231
+ CONFIGURED=$((CONFIGURED + 1))
232
+ fi
233
+
234
+ # Claude Desktop (macOS)
235
+ if [[ "$OSTYPE" == "darwin"* ]]; then
236
+ CLAUDE_DESKTOP="$HOME/Library/Application Support/Claude/claude_desktop_config.json"
237
+ if [ -d "$HOME/Library/Application Support/Claude" ] || [ -d "/Applications/Claude.app" ]; then
238
+ configure_ide "Claude Desktop" "$CLAUDE_DESKTOP" "$FIGMA_TOKEN"
239
+ CONFIGURED=$((CONFIGURED + 1))
240
+ fi
241
+ fi
242
+
243
+ # Claude Code
244
+ if [ -d "$HOME/.claude" ] || command -v claude &>/dev/null; then
245
+ CLAUDE_CODE="$HOME/.claude/mcp.json"
246
+ configure_ide "Claude Code" "$CLAUDE_CODE" "$FIGMA_TOKEN"
247
+ CONFIGURED=$((CONFIGURED + 1))
248
+ fi
249
+
250
+ if [ $CONFIGURED -eq 0 ]; then
251
+ warn "No IDEs detected. Manual setup:"
252
+ echo ""
253
+ echo " Add to .cursor/mcp.json or claude_desktop_config.json:"
254
+ echo ' {'
255
+ echo ' "mcpServers": {'
256
+ echo ' "devlens": {'
257
+ echo ' "command": "devlens-mcp",'
258
+ echo ' "args": [],'
259
+ echo ' "env": { "METRO_PORT": "8081" }'
260
+ echo ' }'
261
+ echo ' }'
262
+ echo ' }'
263
+ echo ""
264
+ fi
265
+ }
266
+
267
+ # ── Step 6: Verify ─────────────────────────────────────────
268
+
269
+ verify() {
270
+ echo ""
271
+ echo -e " ${BOLD}Step 6/6 — Verification${NC}"
272
+ echo " ───────────────────────"
273
+
274
+ if npm view devlens-mcp version --registry="$AZURE_REGISTRY" &>/dev/null; then
275
+ VERSION=$(npm view devlens-mcp version --registry="$AZURE_REGISTRY" 2>/dev/null)
276
+ ok "Azure Artifacts: devlens-mcp@$VERSION found"
277
+ else
278
+ warn "Could not reach Azure Artifacts — check PAT permissions"
279
+ fi
280
+
281
+ if command -v devlens-mcp &>/dev/null; then
282
+ ok "devlens-mcp CLI available globally"
283
+ else
284
+ info "devlens-mcp not on PATH — will run via npx (this is fine)"
285
+ fi
286
+ }
287
+
288
+ # ── Done ───────────────────────────────────────────────────
289
+
290
+ done_message() {
291
+ echo ""
292
+ echo -e " ${BOLD}${GREEN}╔══════════════════════════════════════════╗${NC}"
293
+ echo -e " ${BOLD}${GREEN}║ Setup Complete! ║${NC}"
294
+ echo -e " ${BOLD}${GREEN}╚══════════════════════════════════════════╝${NC}"
295
+ echo ""
296
+ echo " What's next:"
297
+ echo " 1. Restart Cursor / Claude Desktop"
298
+ echo " 2. Start your React Native app: npx react-native start"
299
+ echo " 3. Start an emulator or simulator"
300
+ echo " 4. Ask the AI: \"List running devices\""
301
+ echo ""
302
+ echo " Test it works:"
303
+ echo " - \"Take a screenshot of the app\""
304
+ echo " - \"Compare the screen with this Figma: <url>\""
305
+ echo " - \"Run VQA validation against Figma\""
306
+ echo ""
307
+ echo -e " Azure Artifacts Feed: ${BLUE}${AZURE_FEED_URL}${NC}"
308
+ echo ""
309
+ }
310
+
311
+ # ── Main ───────────────────────────────────────────────────
312
+
313
+ banner
314
+ check_prerequisites
315
+ get_pat
316
+ configure_npm
317
+ install_devlens
318
+ configure_ides
319
+ verify
320
+ done_message
package/tsconfig.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "target": "ES2022",
4
4
  "module": "Node16",
5
5
  "moduleResolution": "Node16",
6
- "lib": ["ES2022"],
6
+ "lib": ["ES2022", "DOM"],
7
7
  "outDir": "dist",
8
8
  "rootDir": ".",
9
9
  "strict": true,