@weppy/roblox-mcp 0.1.10 → 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/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +52 -10
- package/README.md +6 -0
- package/docs/en/installation/ai-apps/gemini-cli.md +24 -31
- package/docs/en/installation/roblox-plugin.md +10 -5
- package/docs/en/pro-upgrade.md +36 -30
- package/docs/en/tools/overview.md +255 -95
- package/docs/es/README.md +6 -0
- package/docs/es/installation/README.md +6 -5
- package/docs/es/installation/ai-apps/gemini-cli.md +51 -58
- package/docs/es/installation/roblox-plugin.md +29 -24
- package/docs/es/pro-upgrade.md +39 -33
- package/docs/es/tools/overview.md +4 -0
- package/docs/id/README.md +6 -0
- package/docs/id/installation/ai-apps/gemini-cli.md +42 -49
- package/docs/id/installation/roblox-plugin.md +28 -23
- package/docs/id/pro-upgrade.md +36 -30
- package/docs/id/tools/overview.md +4 -0
- package/docs/ja/README.md +6 -0
- package/docs/ja/installation/README.md +5 -5
- package/docs/ja/installation/ai-apps/gemini-cli.md +39 -46
- package/docs/ja/installation/roblox-plugin.md +32 -27
- package/docs/ja/pro-upgrade.md +38 -32
- package/docs/ja/tools/overview.md +4 -0
- package/docs/ko/README.md +6 -0
- package/docs/ko/installation/ai-apps/gemini-cli.md +24 -31
- package/docs/ko/installation/roblox-plugin.md +10 -5
- package/docs/ko/pro-upgrade.md +36 -30
- package/docs/ko/tools/overview.md +255 -95
- package/docs/pt-br/README.md +6 -0
- package/docs/pt-br/installation/ai-apps/gemini-cli.md +47 -54
- package/docs/pt-br/installation/roblox-plugin.md +28 -23
- package/docs/pt-br/pro-upgrade.md +39 -33
- package/docs/pt-br/tools/overview.md +4 -0
- package/package.json +4 -2
- package/plugins/weppy-roblox-mcp/.claude-plugin/plugin.json +1 -1
- package/plugins/weppy-roblox-mcp/dist/index.js +70 -98
- package/plugins/weppy-roblox-mcp/skills/roblox-game-dev/SKILL.md +0 -155
- package/plugins/weppy-roblox-mcp/skills/roblox-game-dev/references/animations.json +0 -34
- package/plugins/weppy-roblox-mcp/skills/roblox-game-dev/references/mcp-tools.md +0 -220
- package/plugins/weppy-roblox-mcp/skills/roblox-sync/SKILL.md +0 -492
- package/plugins/weppy-roblox-mcp/skills/roblox-sync/scripts/post-verify.sh +0 -162
- package/plugins/weppy-roblox-mcp/skills/roblox-sync/scripts/pre-check.sh +0 -307
- package/plugins/weppy-roblox-mcp/skills/roblox-sync/scripts/update-metadata.sh +0 -27
|
@@ -1,307 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# =============================================================================
|
|
3
|
-
# sync-and-verify.sh - Blocking sync verification script
|
|
4
|
-
# =============================================================================
|
|
5
|
-
# This script BLOCKS until all sync conditions are met. It does NOT exit early.
|
|
6
|
-
# Used by roblox-sync skill to guarantee sync completion before returning.
|
|
7
|
-
#
|
|
8
|
-
# Exit codes:
|
|
9
|
-
# 0 = Fully synced and verified
|
|
10
|
-
# 10 = MCP server not running (after user chose to abort)
|
|
11
|
-
# 11 = Studio/plugin not connected (after user chose to abort)
|
|
12
|
-
# 12 = Sync data validation failed (after max retries)
|
|
13
|
-
# 13 = User requested abort
|
|
14
|
-
#
|
|
15
|
-
# Usage: ./sync-and-verify.sh [--check-only] [--max-retries N]
|
|
16
|
-
# =============================================================================
|
|
17
|
-
|
|
18
|
-
set -euo pipefail
|
|
19
|
-
|
|
20
|
-
# Configuration
|
|
21
|
-
SYNC_DIR="${SYNC_DIR:-roblox-project-sync}"
|
|
22
|
-
MCP_PORT="${MCP_PORT:-3002}"
|
|
23
|
-
MAX_RETRIES="${MAX_RETRIES:-60}" # Max retries for each phase (5 minutes at 5s intervals)
|
|
24
|
-
RETRY_INTERVAL=5
|
|
25
|
-
CHECK_ONLY=false
|
|
26
|
-
|
|
27
|
-
# Required services to verify in explorer/
|
|
28
|
-
REQUIRED_SERVICES=("Workspace" "ReplicatedStorage" "ServerScriptService" "StarterPlayer")
|
|
29
|
-
|
|
30
|
-
# Parse arguments
|
|
31
|
-
while [[ $# -gt 0 ]]; do
|
|
32
|
-
case $1 in
|
|
33
|
-
--check-only) CHECK_ONLY=true; shift ;;
|
|
34
|
-
--max-retries) MAX_RETRIES="$2"; shift 2 ;;
|
|
35
|
-
*) shift ;;
|
|
36
|
-
esac
|
|
37
|
-
done
|
|
38
|
-
|
|
39
|
-
# Colors for output
|
|
40
|
-
RED='\033[0;31m'
|
|
41
|
-
GREEN='\033[0;32m'
|
|
42
|
-
YELLOW='\033[1;33m'
|
|
43
|
-
BLUE='\033[0;34m'
|
|
44
|
-
NC='\033[0m' # No Color
|
|
45
|
-
|
|
46
|
-
# Logging functions
|
|
47
|
-
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
|
48
|
-
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
|
|
49
|
-
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
|
50
|
-
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
|
51
|
-
log_guide() { echo -e "${YELLOW}[GUIDE]${NC} $1"; }
|
|
52
|
-
|
|
53
|
-
# Output machine-readable status
|
|
54
|
-
output_status() {
|
|
55
|
-
local status="$1"
|
|
56
|
-
local message="$2"
|
|
57
|
-
echo ""
|
|
58
|
-
echo "=== SYNC STATUS ==="
|
|
59
|
-
echo "STATUS=$status"
|
|
60
|
-
echo "MESSAGE=$message"
|
|
61
|
-
echo "TIMESTAMP=$(date -Iseconds)"
|
|
62
|
-
echo "SYNC_DIR=$SYNC_DIR"
|
|
63
|
-
if [ -f "$SYNC_DIR/rojo-detected.txt" ]; then
|
|
64
|
-
echo "ROJO_MODE=$(cat "$SYNC_DIR/rojo-detected.txt")"
|
|
65
|
-
else
|
|
66
|
-
echo "ROJO_MODE=false"
|
|
67
|
-
fi
|
|
68
|
-
echo "==================="
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
# Create necessary directories
|
|
72
|
-
setup_directories() {
|
|
73
|
-
mkdir -p "$SYNC_DIR/explorer"
|
|
74
|
-
mkdir -p "$SYNC_DIR/snapshots"
|
|
75
|
-
mkdir -p "$SYNC_DIR/screenshots"
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
# Check if MCP server process is accessible
|
|
79
|
-
check_mcp_available() {
|
|
80
|
-
# Check if the MCP tool can respond (via ping or connection)
|
|
81
|
-
# This verifies the Claude Code MCP connection is active
|
|
82
|
-
if [ -f "$SYNC_DIR/connection-status.txt" ]; then
|
|
83
|
-
local status=$(cat "$SYNC_DIR/connection-status.txt" 2>/dev/null | head -1)
|
|
84
|
-
local file_age=$(( $(date +%s) - $(stat -f %m "$SYNC_DIR/connection-status.txt" 2>/dev/null || echo "0") ))
|
|
85
|
-
if [ "$file_age" -lt 60 ] && [ "$status" = "connected" ]; then
|
|
86
|
-
return 0
|
|
87
|
-
fi
|
|
88
|
-
fi
|
|
89
|
-
|
|
90
|
-
# Check if Studio plugin port is responding
|
|
91
|
-
if command -v nc &> /dev/null; then
|
|
92
|
-
nc -z localhost "$MCP_PORT" 2>/dev/null && return 0
|
|
93
|
-
fi
|
|
94
|
-
|
|
95
|
-
return 1
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
# Phase 1: Wait for MCP/Studio connection
|
|
99
|
-
wait_for_connection() {
|
|
100
|
-
log_info "Phase 1: Checking MCP/Studio connection..."
|
|
101
|
-
|
|
102
|
-
local retry_count=0
|
|
103
|
-
local guided=false
|
|
104
|
-
|
|
105
|
-
while ! check_mcp_available; do
|
|
106
|
-
retry_count=$((retry_count + 1))
|
|
107
|
-
|
|
108
|
-
if [ "$CHECK_ONLY" = true ]; then
|
|
109
|
-
output_status "disconnected" "MCP/Studio not connected"
|
|
110
|
-
exit 11
|
|
111
|
-
fi
|
|
112
|
-
|
|
113
|
-
if [ "$retry_count" -gt "$MAX_RETRIES" ]; then
|
|
114
|
-
log_error "Connection timeout after $MAX_RETRIES attempts"
|
|
115
|
-
output_status "timeout" "Connection timeout - MCP/Studio not responding"
|
|
116
|
-
exit 11
|
|
117
|
-
fi
|
|
118
|
-
|
|
119
|
-
# Show guide only once
|
|
120
|
-
if [ "$guided" = false ]; then
|
|
121
|
-
guided=true
|
|
122
|
-
echo ""
|
|
123
|
-
log_warn "Roblox Studio/MCP not connected"
|
|
124
|
-
log_guide "Please follow these steps:"
|
|
125
|
-
echo " 1. Open Roblox Studio"
|
|
126
|
-
echo " 2. Open your game place file"
|
|
127
|
-
echo " 3. Go to Plugins tab"
|
|
128
|
-
echo " 4. Click 'MCP Plugin' to enable"
|
|
129
|
-
echo " 5. Verify plugin shows 'Connected' status"
|
|
130
|
-
echo ""
|
|
131
|
-
log_info "Waiting for connection... (retry $retry_count/$MAX_RETRIES)"
|
|
132
|
-
else
|
|
133
|
-
# Progress indicator
|
|
134
|
-
echo -ne "\r Waiting for connection... (retry $retry_count/$MAX_RETRIES) "
|
|
135
|
-
fi
|
|
136
|
-
|
|
137
|
-
sleep "$RETRY_INTERVAL"
|
|
138
|
-
done
|
|
139
|
-
|
|
140
|
-
echo "" # Clear the line
|
|
141
|
-
log_success "MCP/Studio connection established"
|
|
142
|
-
echo "connected" > "$SYNC_DIR/connection-status.txt"
|
|
143
|
-
return 0
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
# Phase 2: Verify sync data exists and is valid
|
|
147
|
-
verify_sync_data() {
|
|
148
|
-
log_info "Phase 2: Verifying sync data (folder structure)..."
|
|
149
|
-
|
|
150
|
-
local explorer_dir="$SYNC_DIR/explorer"
|
|
151
|
-
local missing_services=()
|
|
152
|
-
local invalid_services=()
|
|
153
|
-
|
|
154
|
-
# Check each required service has a folder with _index.json
|
|
155
|
-
for service in "${REQUIRED_SERVICES[@]}"; do
|
|
156
|
-
local service_dir="$explorer_dir/${service}"
|
|
157
|
-
if [ ! -d "$service_dir" ]; then
|
|
158
|
-
missing_services+=("$service")
|
|
159
|
-
continue
|
|
160
|
-
fi
|
|
161
|
-
|
|
162
|
-
# Check for _tree.json (new format) or _index.json (legacy)
|
|
163
|
-
local index_file="$service_dir/_tree.json"
|
|
164
|
-
if [ ! -f "$index_file" ]; then
|
|
165
|
-
index_file="$service_dir/_index.json"
|
|
166
|
-
fi
|
|
167
|
-
if [ ! -f "$index_file" ]; then
|
|
168
|
-
invalid_services+=("$service (missing _tree.json)")
|
|
169
|
-
continue
|
|
170
|
-
fi
|
|
171
|
-
|
|
172
|
-
# Check file is not empty and has valid structure
|
|
173
|
-
local file_size
|
|
174
|
-
file_size=$(stat -f %z "$index_file" 2>/dev/null || stat -c %s "$index_file" 2>/dev/null || echo "0")
|
|
175
|
-
if [ "$file_size" -lt 20 ]; then
|
|
176
|
-
invalid_services+=("$service (empty _index.json)")
|
|
177
|
-
continue
|
|
178
|
-
fi
|
|
179
|
-
|
|
180
|
-
# Basic JSON validation - check for expected fields
|
|
181
|
-
if ! grep -q '"name"' "$index_file" 2>/dev/null; then
|
|
182
|
-
invalid_services+=("$service (invalid _index.json)")
|
|
183
|
-
continue
|
|
184
|
-
fi
|
|
185
|
-
done
|
|
186
|
-
|
|
187
|
-
# Report results
|
|
188
|
-
if [ ${#missing_services[@]} -gt 0 ] || [ ${#invalid_services[@]} -gt 0 ]; then
|
|
189
|
-
if [ ${#missing_services[@]} -gt 0 ]; then
|
|
190
|
-
log_warn "Missing services: ${missing_services[*]}"
|
|
191
|
-
fi
|
|
192
|
-
if [ ${#invalid_services[@]} -gt 0 ]; then
|
|
193
|
-
log_warn "Invalid services: ${invalid_services[*]}"
|
|
194
|
-
fi
|
|
195
|
-
return 1
|
|
196
|
-
fi
|
|
197
|
-
|
|
198
|
-
log_success "All required services verified: ${REQUIRED_SERVICES[*]}"
|
|
199
|
-
return 0
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
# Check last-sync.txt for freshness
|
|
203
|
-
check_sync_freshness() {
|
|
204
|
-
local last_sync_file="$SYNC_DIR/last-sync.txt"
|
|
205
|
-
|
|
206
|
-
if [ ! -f "$last_sync_file" ]; then
|
|
207
|
-
return 1
|
|
208
|
-
fi
|
|
209
|
-
|
|
210
|
-
local last_sync=$(cat "$last_sync_file")
|
|
211
|
-
|
|
212
|
-
# Use gdate on macOS if available
|
|
213
|
-
local date_cmd="date"
|
|
214
|
-
if command -v gdate &> /dev/null; then
|
|
215
|
-
date_cmd="gdate"
|
|
216
|
-
fi
|
|
217
|
-
|
|
218
|
-
local last_epoch=$($date_cmd -d "$last_sync" +%s 2>/dev/null || echo "0")
|
|
219
|
-
local now_epoch=$($date_cmd +%s)
|
|
220
|
-
local diff_minutes=$(( (now_epoch - last_epoch) / 60 ))
|
|
221
|
-
|
|
222
|
-
if [ "$diff_minutes" -gt 30 ]; then
|
|
223
|
-
log_warn "Sync data is stale (${diff_minutes}m old)"
|
|
224
|
-
return 1
|
|
225
|
-
fi
|
|
226
|
-
|
|
227
|
-
return 0
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
# Full sync verification check
|
|
231
|
-
full_verification() {
|
|
232
|
-
local issues=()
|
|
233
|
-
|
|
234
|
-
# Check connection
|
|
235
|
-
if ! check_mcp_available; then
|
|
236
|
-
issues+=("MCP/Studio not connected")
|
|
237
|
-
fi
|
|
238
|
-
|
|
239
|
-
# Check sync data
|
|
240
|
-
if ! verify_sync_data; then
|
|
241
|
-
issues+=("Sync data incomplete or invalid")
|
|
242
|
-
fi
|
|
243
|
-
|
|
244
|
-
# Check freshness
|
|
245
|
-
if ! check_sync_freshness; then
|
|
246
|
-
issues+=("Sync data is stale or missing timestamp")
|
|
247
|
-
fi
|
|
248
|
-
|
|
249
|
-
if [ ${#issues[@]} -gt 0 ]; then
|
|
250
|
-
for issue in "${issues[@]}"; do
|
|
251
|
-
log_warn "$issue"
|
|
252
|
-
done
|
|
253
|
-
return 1
|
|
254
|
-
fi
|
|
255
|
-
|
|
256
|
-
return 0
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
# Main execution
|
|
260
|
-
main() {
|
|
261
|
-
echo "=============================================="
|
|
262
|
-
echo " Roblox Studio Sync Verification"
|
|
263
|
-
echo "=============================================="
|
|
264
|
-
echo ""
|
|
265
|
-
|
|
266
|
-
# Setup directories
|
|
267
|
-
setup_directories
|
|
268
|
-
|
|
269
|
-
# Detect Rojo
|
|
270
|
-
if [ -f "default.project.json" ]; then
|
|
271
|
-
echo "true" > "$SYNC_DIR/rojo-detected.txt"
|
|
272
|
-
log_info "Rojo project detected"
|
|
273
|
-
else
|
|
274
|
-
echo "false" > "$SYNC_DIR/rojo-detected.txt"
|
|
275
|
-
fi
|
|
276
|
-
|
|
277
|
-
# If check-only mode, just verify current state
|
|
278
|
-
if [ "$CHECK_ONLY" = true ]; then
|
|
279
|
-
if full_verification; then
|
|
280
|
-
output_status "synced" "All checks passed"
|
|
281
|
-
exit 0
|
|
282
|
-
else
|
|
283
|
-
output_status "needs_sync" "Sync verification failed"
|
|
284
|
-
exit 12
|
|
285
|
-
fi
|
|
286
|
-
fi
|
|
287
|
-
|
|
288
|
-
# Phase 1: Wait for connection (blocks until connected)
|
|
289
|
-
wait_for_connection
|
|
290
|
-
|
|
291
|
-
# Phase 2: Check if data needs to be synced
|
|
292
|
-
if verify_sync_data && check_sync_freshness; then
|
|
293
|
-
log_success "Existing sync data is valid and fresh"
|
|
294
|
-
output_status "synced" "Existing sync data verified"
|
|
295
|
-
exit 0
|
|
296
|
-
fi
|
|
297
|
-
|
|
298
|
-
# Data needs to be synced - signal this to the agent
|
|
299
|
-
log_info "Sync data needs refresh"
|
|
300
|
-
output_status "needs_sync" "Connection OK, but sync data needs refresh via MCP tools"
|
|
301
|
-
|
|
302
|
-
# Return special code to indicate sync is needed
|
|
303
|
-
# The agent will then call MCP tools to perform the actual sync
|
|
304
|
-
exit 100 # Special code: connection OK, but sync data needs refresh
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
main "$@"
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# =============================================================================
|
|
3
|
-
# update-metadata.sh - Update sync metadata after successful sync
|
|
4
|
-
# =============================================================================
|
|
5
|
-
# Updates last-sync timestamp and connection status.
|
|
6
|
-
# Run this after MCP data has been written to explorer/.
|
|
7
|
-
#
|
|
8
|
-
# Exit codes:
|
|
9
|
-
# 0 = Metadata updated
|
|
10
|
-
# 1 = Failed (sync directory not found)
|
|
11
|
-
# =============================================================================
|
|
12
|
-
|
|
13
|
-
set -euo pipefail
|
|
14
|
-
|
|
15
|
-
SYNC_DIR="${1:-roblox-project-sync}"
|
|
16
|
-
|
|
17
|
-
if [ ! -d "$SYNC_DIR" ]; then
|
|
18
|
-
echo "ERROR: Sync directory not found: $SYNC_DIR"
|
|
19
|
-
exit 1
|
|
20
|
-
fi
|
|
21
|
-
|
|
22
|
-
date -Iseconds > "$SYNC_DIR/last-sync.txt"
|
|
23
|
-
echo "connected" > "$SYNC_DIR/connection-status.txt"
|
|
24
|
-
|
|
25
|
-
echo "METADATA=updated"
|
|
26
|
-
echo "TIMESTAMP=$(cat "$SYNC_DIR/last-sync.txt")"
|
|
27
|
-
echo "CONNECTION=connected"
|