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.
- package/README.md +211 -35
- package/RELEASE_NOTES.md +3 -7
- package/dist/bin/cli.js +47 -13
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/setup.d.ts +14 -0
- package/dist/bin/setup.d.ts.map +1 -0
- package/dist/bin/setup.js +272 -0
- package/dist/bin/setup.js.map +1 -0
- package/dist/src/figma/figma-api.d.ts +108 -0
- package/dist/src/figma/figma-api.d.ts.map +1 -0
- package/dist/src/figma/figma-api.js +284 -0
- package/dist/src/figma/figma-api.js.map +1 -0
- package/dist/src/figma/figma-cache.d.ts +57 -0
- package/dist/src/figma/figma-cache.d.ts.map +1 -0
- package/dist/src/figma/figma-cache.js +266 -0
- package/dist/src/figma/figma-cache.js.map +1 -0
- package/dist/src/figma/figma-client.d.ts +62 -0
- package/dist/src/figma/figma-client.d.ts.map +1 -0
- package/dist/src/figma/figma-client.js +224 -0
- package/dist/src/figma/figma-client.js.map +1 -0
- package/dist/src/figma/figma-rate-limiter.d.ts +46 -0
- package/dist/src/figma/figma-rate-limiter.d.ts.map +1 -0
- package/dist/src/figma/figma-rate-limiter.js +153 -0
- package/dist/src/figma/figma-rate-limiter.js.map +1 -0
- package/dist/src/figma/figma-retry.d.ts +19 -0
- package/dist/src/figma/figma-retry.d.ts.map +1 -0
- package/dist/src/figma/figma-retry.js +57 -0
- package/dist/src/figma/figma-retry.js.map +1 -0
- package/dist/src/figma/figma-structure.d.ts +1 -1
- package/dist/src/figma/figma-structure.d.ts.map +1 -1
- package/dist/src/figma/figma-structure.js +11 -1
- package/dist/src/figma/figma-structure.js.map +1 -1
- package/dist/src/figma/figma-types.d.ts +54 -0
- package/dist/src/figma/figma-types.d.ts.map +1 -0
- package/dist/src/figma/figma-types.js +33 -0
- package/dist/src/figma/figma-types.js.map +1 -0
- package/dist/src/figma/url-parser.d.ts +40 -0
- package/dist/src/figma/url-parser.d.ts.map +1 -0
- package/dist/src/figma/url-parser.js +107 -0
- package/dist/src/figma/url-parser.js.map +1 -0
- package/dist/src/platform/device-manager.d.ts +5 -0
- package/dist/src/platform/device-manager.d.ts.map +1 -1
- package/dist/src/platform/device-manager.js +18 -0
- package/dist/src/platform/device-manager.js.map +1 -1
- package/dist/src/platform/device-pool.d.ts +105 -0
- package/dist/src/platform/device-pool.d.ts.map +1 -0
- package/dist/src/platform/device-pool.js +328 -0
- package/dist/src/platform/device-pool.js.map +1 -0
- package/dist/src/platform/device-profiles.d.ts +50 -0
- package/dist/src/platform/device-profiles.d.ts.map +1 -0
- package/dist/src/platform/device-profiles.js +155 -0
- package/dist/src/platform/device-profiles.js.map +1 -0
- package/dist/src/platform/ios/ios-device.d.ts +0 -2
- package/dist/src/platform/ios/ios-device.d.ts.map +1 -1
- package/dist/src/platform/ios/ios-device.js +8 -18
- package/dist/src/platform/ios/ios-device.js.map +1 -1
- package/dist/src/platform/ios/simctl.d.ts +0 -5
- package/dist/src/platform/ios/simctl.d.ts.map +1 -1
- package/dist/src/platform/ios/simctl.js +0 -4
- package/dist/src/platform/ios/simctl.js.map +1 -1
- package/dist/src/platform/simulator-factory.d.ts +85 -0
- package/dist/src/platform/simulator-factory.d.ts.map +1 -0
- package/dist/src/platform/simulator-factory.js +396 -0
- package/dist/src/platform/simulator-factory.js.map +1 -0
- package/dist/src/platform/system-resources.d.ts +44 -0
- package/dist/src/platform/system-resources.d.ts.map +1 -0
- package/dist/src/platform/system-resources.js +103 -0
- package/dist/src/platform/system-resources.js.map +1 -0
- package/dist/src/prototype/browser-engine.d.ts +62 -0
- package/dist/src/prototype/browser-engine.d.ts.map +1 -0
- package/dist/src/prototype/browser-engine.js +199 -0
- package/dist/src/prototype/browser-engine.js.map +1 -0
- package/dist/src/prototype/figma-navigator.d.ts +40 -0
- package/dist/src/prototype/figma-navigator.d.ts.map +1 -0
- package/dist/src/prototype/figma-navigator.js +95 -0
- package/dist/src/prototype/figma-navigator.js.map +1 -0
- package/dist/src/prototype/flow-reporter.d.ts +47 -0
- package/dist/src/prototype/flow-reporter.d.ts.map +1 -0
- package/dist/src/prototype/flow-reporter.js +255 -0
- package/dist/src/prototype/flow-reporter.js.map +1 -0
- package/dist/src/prototype/screen-analyzer.d.ts +31 -0
- package/dist/src/prototype/screen-analyzer.d.ts.map +1 -0
- package/dist/src/prototype/screen-analyzer.js +114 -0
- package/dist/src/prototype/screen-analyzer.js.map +1 -0
- package/dist/src/prototype/web-crawler.d.ts +31 -0
- package/dist/src/prototype/web-crawler.d.ts.map +1 -0
- package/dist/src/prototype/web-crawler.js +88 -0
- package/dist/src/prototype/web-crawler.js.map +1 -0
- package/dist/src/reports/cross-device-report.d.ts +84 -0
- package/dist/src/reports/cross-device-report.d.ts.map +1 -0
- package/dist/src/reports/cross-device-report.js +342 -0
- package/dist/src/reports/cross-device-report.js.map +1 -0
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +9 -1
- package/dist/src/server.js.map +1 -1
- package/dist/src/snapshot/formatter.d.ts +5 -13
- package/dist/src/snapshot/formatter.d.ts.map +1 -1
- package/dist/src/snapshot/formatter.js +19 -28
- package/dist/src/snapshot/formatter.js.map +1 -1
- package/dist/src/tools/interaction-tools.d.ts +6 -6
- package/dist/src/tools/interaction-tools.d.ts.map +1 -1
- package/dist/src/tools/interaction-tools.js +2 -12
- package/dist/src/tools/interaction-tools.js.map +1 -1
- package/dist/src/tools/metro-tools.d.ts +2 -2
- package/dist/src/tools/multi-device-tools.d.ts +133 -0
- package/dist/src/tools/multi-device-tools.d.ts.map +1 -0
- package/dist/src/tools/multi-device-tools.js +365 -0
- package/dist/src/tools/multi-device-tools.js.map +1 -0
- package/dist/src/tools/navigation-tools.d.ts.map +1 -1
- package/dist/src/tools/navigation-tools.js +1 -6
- package/dist/src/tools/navigation-tools.js.map +1 -1
- package/dist/src/tools/prototype-tools.d.ts +102 -0
- package/dist/src/tools/prototype-tools.d.ts.map +1 -0
- package/dist/src/tools/prototype-tools.js +391 -0
- package/dist/src/tools/prototype-tools.js.map +1 -0
- package/dist/src/tools/screenshot-tools.d.ts +7 -74
- package/dist/src/tools/screenshot-tools.d.ts.map +1 -1
- package/dist/src/tools/screenshot-tools.js +19 -286
- package/dist/src/tools/screenshot-tools.js.map +1 -1
- package/dist/src/tools/vqa-tools.d.ts +2 -2
- package/dist/src/tools/vqa-tools.d.ts.map +1 -1
- package/dist/src/tools/vqa-tools.js +4 -69
- package/dist/src/tools/vqa-tools.js.map +1 -1
- package/docs/figma-workflow.md +58 -6
- package/docs/installation-guide.md +302 -0
- package/docs/setup-guide.md +77 -79
- package/docs/tool-reference.md +152 -69
- package/install.sh +119 -0
- package/package.json +5 -2
- package/setup.sh +320 -0
- 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
|