2 Commits

Author SHA1 Message Date
Devid HW eb7161f118 release: v1.31.4
- Version bump 1.31.3 → 1.31.4
- server.json identifier URL updated (SHA256 set by CI after build)
- CHANGELOG.md updated
2026-04-22 07:23:56 +07:00
Devid HW f239dd3e00 fix: update all scripts for correctness and consistency
release.sh:
- Add --yes/-y flag (and CI=true) for non-interactive execution
- Auto-resolve server.json conflict during rebase-before-push so CI's
  SHA256 commit no longer blocks the push
- Fix major version bump (was double-assigned, now single expression)

build-release.sh:
- Remove cp of /CLAUDE.md (gitignored personal file — caused build failure)
- Bundle all IDE setup docs (QUICKSTART, CLAUDE, CURSOR, VSCODE, WINDSURF)
- Use set -euo pipefail; chmod +x binary; clean up dist/ subdir after tar

build-rust.sh:
- Replace Windsurf-specific install hint with generic cargo install --path . --force
- Use set -euo pipefail

setup.sh:
- Replace "Antigravity" with "Claude Desktop" in comments and output

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 07:23:49 +07:00
8 changed files with 131 additions and 83 deletions
+10
View File
@@ -1,5 +1,15 @@
# Changelog # Changelog
## [1.31.4] — 2026-04-22
- fix: update all scripts for correctness and consistency
- release: v1.31.3
- docs: clean up public repo — remove IDE files, fix stale refs
- release: v1.31.2
- refactor: reduce handler boilerplate in analysis and experts modules
- fix: registryType mcpbPackageType → mcpb
## [1.31.3] — 2026-04-22 ## [1.31.3] — 2026-04-22
- docs: clean up public repo — remove IDE files, fix stale refs - docs: clean up public repo — remove IDE files, fix stale refs
Generated
+1 -1
View File
@@ -481,7 +481,7 @@ dependencies = [
[[package]] [[package]]
name = "mt5-quant" name = "mt5-quant"
version = "1.31.3" version = "1.31.4"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"base64", "base64",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "mt5-quant" name = "mt5-quant"
version = "1.31.3" version = "1.31.4"
edition = "2021" edition = "2021"
description = "MT5-Quant MCP Server - Exposes MT5 backtest and optimization tools via MCP" description = "MT5-Quant MCP Server - Exposes MT5 backtest and optimization tools via MCP"
authors = ["masdevid <masdevid@example.com>"] authors = ["masdevid <masdevid@example.com>"]
+30 -23
View File
@@ -1,8 +1,11 @@
#!/bin/bash #!/usr/bin/env bash
# Build release binaries for distribution # Build release binary and package it for distribution
# Creates: dist/mt5-quant-{platform}.tar.gz # Creates: dist/mcp-mt5-quant-{platform}.tar.gz
#
# Usage:
# bash scripts/build-release.sh
set -e set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
@@ -10,16 +13,17 @@ PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
cd "$PROJECT_ROOT" cd "$PROJECT_ROOT"
VERSION=$(grep -E '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/') VERSION=$(grep -E '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
echo "=== Building MCP-MT5-Quant v${VERSION} ===" echo "=== Building mt5-quant v${VERSION} ==="
echo "" echo ""
# Clean previous builds # Clean previous builds
rm -rf "$PROJECT_ROOT/dist" rm -rf "$PROJECT_ROOT/dist"
mkdir -p "$PROJECT_ROOT/dist" mkdir -p "$PROJECT_ROOT/dist"
# Build current platform # Build release binary
echo "Building for current platform..." echo "Building release binary..."
RUSTFLAGS="-D warnings" cargo build --release RUSTFLAGS="-D warnings" cargo build --release
echo ""
# Detect platform # Detect platform
UNAME=$(uname -s) UNAME=$(uname -s)
@@ -30,43 +34,46 @@ if [[ "$UNAME" == "Darwin" ]]; then
elif [[ "$UNAME" == "Linux" ]]; then elif [[ "$UNAME" == "Linux" ]]; then
PLATFORM="linux-${ARCH}" PLATFORM="linux-${ARCH}"
else else
PLATFORM="unknown" PLATFORM="unknown-${ARCH}"
fi fi
PACKAGE_NAME="mcp-mt5-quant-${PLATFORM}" PACKAGE_NAME="mcp-mt5-quant-${PLATFORM}"
PACKAGE_DIR="$PROJECT_ROOT/dist/${PACKAGE_NAME}" PACKAGE_DIR="$PROJECT_ROOT/dist/${PACKAGE_NAME}"
echo "Packaging for ${PLATFORM}..." echo "Packaging for ${PLATFORM}..."
mkdir -p "$PACKAGE_DIR" mkdir -p "$PACKAGE_DIR/docs"
# Copy binary # Binary
cp "$PROJECT_ROOT/target/release/mt5-quant" "$PACKAGE_DIR/" cp "$PROJECT_ROOT/target/release/mt5-quant" "$PACKAGE_DIR/"
chmod +x "$PACKAGE_DIR/mt5-quant"
# Copy config template # Config template
mkdir -p "$PACKAGE_DIR/config" mkdir -p "$PACKAGE_DIR/config"
cp "$PROJECT_ROOT/config/mt5-quant.example.yaml" "$PACKAGE_DIR/config/" cp "$PROJECT_ROOT/config/mt5-quant.example.yaml" "$PACKAGE_DIR/config/"
# Copy docs # Documentation
cp "$PROJECT_ROOT/README.md" "$PACKAGE_DIR/" cp "$PROJECT_ROOT/README.md" "$PACKAGE_DIR/"
cp "$PROJECT_ROOT/docs/WINDSURF.md" "$PACKAGE_DIR/WINDSURF_SETUP.md" cp "$PROJECT_ROOT/docs/QUICKSTART.md" "$PACKAGE_DIR/docs/"
cp "$PROJECT_ROOT/CLAUDE.md" "$PACKAGE_DIR/" cp "$PROJECT_ROOT/docs/CLAUDE.md" "$PACKAGE_DIR/docs/"
cp "$PROJECT_ROOT/docs/CURSOR.md" "$PACKAGE_DIR/docs/"
cp "$PROJECT_ROOT/docs/VSCODE.md" "$PACKAGE_DIR/docs/"
cp "$PROJECT_ROOT/docs/WINDSURF.md" "$PACKAGE_DIR/docs/"
# Create tarball # Create tarball
cd "$PROJECT_ROOT/dist" cd "$PROJECT_ROOT/dist"
tar -czf "${PACKAGE_NAME}.tar.gz" "$PACKAGE_NAME" tar -czf "${PACKAGE_NAME}.tar.gz" "$PACKAGE_NAME"
rm -rf "$PACKAGE_NAME"
echo "" echo ""
echo "=== Build Complete ===" echo "=== Build complete ==="
echo "" echo ""
echo "Package: dist/${PACKAGE_NAME}.tar.gz" echo "Package : dist/${PACKAGE_NAME}.tar.gz"
echo "Binary: mt5-quant" echo "Size : $(du -h "${PACKAGE_NAME}.tar.gz" | cut -f1)"
echo "Size: $(du -h "${PACKAGE_NAME}.tar.gz" | cut -f1)"
echo "" echo ""
echo "Contents:" echo "Contents:"
tar -tzf "${PACKAGE_NAME}.tar.gz" | head -10 tar -tzf "${PACKAGE_NAME}.tar.gz"
echo "" echo ""
echo "To install:" echo "Install:"
echo " tar -xzf ${PACKAGE_NAME}.tar.gz" echo " tar -xzf ${PACKAGE_NAME}.tar.gz"
echo " cd ${PACKAGE_NAME}" echo " sudo cp ${PACKAGE_NAME}/mt5-quant /usr/local/bin/"
echo " sudo cp mt5-quant /usr/local/bin/"
echo " mt5-quant --help" echo " mt5-quant --help"
+8 -15
View File
@@ -1,32 +1,25 @@
#!/bin/bash #!/usr/bin/env bash
# Build MT5-Quant Rust MCP Server # Build MT5-Quant release binary
# Output: target/release/mt5-quant # Output: target/release/mt5-quant
set -e set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
cd "$PROJECT_ROOT" cd "$PROJECT_ROOT"
echo "=== MT5-Quant Rust Build ===" echo "=== MT5-Quant build ==="
echo "Project root: $PROJECT_ROOT" echo "Root: $PROJECT_ROOT"
echo "" echo ""
echo "Building release binary..."
cargo build --release cargo build --release
echo "" echo ""
echo "=== Build Complete ===" echo "=== Done ==="
echo "" echo ""
echo "Executable location:"
ls -lh "$PROJECT_ROOT/target/release/mt5-quant" ls -lh "$PROJECT_ROOT/target/release/mt5-quant"
echo "" echo ""
echo "To test:" echo "Run: ./target/release/mt5-quant --help"
echo " ./target/release/mt5-quant --help" echo "Install: cargo install --path . --force"
echo ""
echo "To install for Windsurf:"
echo " Update ~/.windsurf/config.yaml:"
echo " command: $PROJECT_ROOT/target/release/mt5-quant"
echo "" echo ""
+76 -38
View File
@@ -7,6 +7,7 @@
# bash scripts/release.sh major # 1.31.0 → 2.0.0 # bash scripts/release.sh major # 1.31.0 → 2.0.0
# bash scripts/release.sh 1.32.0 # explicit version # bash scripts/release.sh 1.32.0 # explicit version
# bash scripts/release.sh v1.32.0 # with v prefix # bash scripts/release.sh v1.32.0 # with v prefix
# bash scripts/release.sh patch --yes # non-interactive (CI / Claude Code)
set -euo pipefail set -euo pipefail
cd "$(dirname "$0")/.." cd "$(dirname "$0")/.."
@@ -18,44 +19,54 @@ warn() { echo -e "${YELLOW}⚠ $*${NC}"; }
die() { echo -e "${RED}$*${NC}" >&2; exit 1; } die() { echo -e "${RED}$*${NC}" >&2; exit 1; }
hr() { echo -e "${BLUE}────────────────────────────────────────${NC}"; } hr() { echo -e "${BLUE}────────────────────────────────────────${NC}"; }
# ── Prerequisites ───────────────────────────────────────────────────────────── # ── Argument parsing ───────────────────────────────────────────────────────────
command -v cargo >/dev/null 2>&1 || die "cargo not found" bump="${1:-patch}"
AUTO_YES=false
if [[ "${2:-}" == "--yes" || "${2:-}" == "-y" || "${CI:-}" == "true" ]]; then
AUTO_YES=true
fi
# ── Prerequisites ──────────────────────────────────────────────────────────────
command -v cargo >/dev/null 2>&1 || die "cargo not found"
command -v python3 >/dev/null 2>&1 || die "python3 not found" command -v python3 >/dev/null 2>&1 || die "python3 not found"
# ── Current version ─────────────────────────────────────────────────────────── # ── Current version ───────────────────────────────────────────────────────────
current=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/') current=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
[[ -n "$current" ]] || die "Could not parse version from Cargo.toml" [[ -n "$current" ]] || die "Could not parse version from Cargo.toml"
info "Current version: ${BOLD}$current${NC}" info "Current version: ${BOLD}$current${NC}"
# ── Compute new version ─────────────────────────────────────────────────────── # ── Compute new version ───────────────────────────────────────────────────────
bump="${1:-patch}"
IFS='.' read -r major minor patch_v <<< "$current" IFS='.' read -r major minor patch_v <<< "$current"
case "$bump" in case "$bump" in
major) new="${major+1}.0.0"; new="$((major + 1)).0.0" ;; major) new="$((major + 1)).0.0" ;;
minor) new="${major}.$((minor + 1)).0" ;; minor) new="${major}.$((minor + 1)).0" ;;
patch) new="${major}.${minor}.$((patch_v + 1))" ;; patch) new="${major}.${minor}.$((patch_v + 1))" ;;
v*.*.*) new="${bump#v}" ;; v*.*.*) new="${bump#v}" ;;
*.*.*) new="$bump" ;; *.*.*) new="$bump" ;;
*) die "Usage: $0 [patch|minor|major|X.Y.Z]" ;; *) die "Usage: $0 [patch|minor|major|X.Y.Z] [--yes]" ;;
esac esac
# Validate semver
[[ "$new" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || die "Invalid version: $new" [[ "$new" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || die "Invalid version: $new"
hr hr
info "Releasing: ${BOLD}$current$new${NC}" info "Releasing: ${BOLD}$current$new${NC}"
hr hr
# ── Confirm ─────────────────────────────────────────────────────────────────── # ── Confirm ───────────────────────────────────────────────────────────────────
read -rp "Proceed with release v${new}? [y/N] " confirm if [[ "$AUTO_YES" == false ]]; then
[[ "$confirm" =~ ^[Yy]$ ]] || die "Aborted" read -rp "Proceed with release v${new}? [y/N] " confirm
[[ "$confirm" =~ ^[Yy]$ ]] || die "Aborted"
else
info "Auto-confirmed (--yes)"
fi
# ── Check git state ─────────────────────────────────────────────────────────── # ── Check git state ───────────────────────────────────────────────────────────
info "Checking git state..." info "Checking git state..."
if ! git diff --quiet 2>/dev/null || ! git diff --cached --quiet 2>/dev/null; then if ! git diff --quiet 2>/dev/null || ! git diff --cached --quiet 2>/dev/null; then
@@ -64,13 +75,12 @@ fi
current_branch=$(git rev-parse --abbrev-ref HEAD) current_branch=$(git rev-parse --abbrev-ref HEAD)
info "Branch: $current_branch" info "Branch: $current_branch"
# Check tag doesn't already exist
if git rev-parse "v${new}" >/dev/null 2>&1; then if git rev-parse "v${new}" >/dev/null 2>&1; then
die "Tag v${new} already exists" die "Tag v${new} already exists"
fi fi
ok "Git state clean" ok "Git state clean"
# ── 1. Bump Cargo.toml ──────────────────────────────────────────────────────── # ── 1. Bump Cargo.toml ────────────────────────────────────────────────────────
info "Bumping Cargo.toml..." info "Bumping Cargo.toml..."
if [[ "$(uname)" == "Darwin" ]]; then if [[ "$(uname)" == "Darwin" ]]; then
@@ -78,16 +88,14 @@ if [[ "$(uname)" == "Darwin" ]]; then
else else
sed -i "s/^version = \"${current}\"/version = \"${new}\"/" Cargo.toml sed -i "s/^version = \"${current}\"/version = \"${new}\"/" Cargo.toml
fi fi
# Update Cargo.lock
cargo metadata --no-deps --format-version 1 >/dev/null 2>&1 || true cargo metadata --no-deps --format-version 1 >/dev/null 2>&1 || true
ok "Cargo.toml → $new" ok "Cargo.toml → $new"
# ── 2. Update server.json ───────────────────────────────────────────────────── # ── 2. Update server.json ─────────────────────────────────────────────────────
info "Updating server.json..." info "Updating server.json..."
NEW_VERSION="$new" python3 - <<'PYEOF' NEW_VERSION="$new" python3 - <<'PYEOF'
import json, os, re, sys import json, os, re
version = os.environ['NEW_VERSION'] version = os.environ['NEW_VERSION']
@@ -98,7 +106,6 @@ data['version'] = version
for pkg in data.get('packages', []): for pkg in data.get('packages', []):
pkg['version'] = version pkg['version'] = version
# Update download URL to point at new version tag
if 'identifier' in pkg: if 'identifier' in pkg:
pkg['identifier'] = re.sub( pkg['identifier'] = re.sub(
r'/v[0-9]+\.[0-9]+\.[0-9]+/', r'/v[0-9]+\.[0-9]+\.[0-9]+/',
@@ -114,9 +121,9 @@ with open('server.json', 'w') as f:
print(f" server.json version={version}, identifier URL updated") print(f" server.json version={version}, identifier URL updated")
PYEOF PYEOF
ok "server.json → $new (SHA256 updated by CI)" ok "server.json → $new (SHA256 set by CI)"
# ── 3. Generate CHANGELOG entry ─────────────────────────────────────────────── # ── 3. Generate CHANGELOG entry ───────────────────────────────────────────────
info "Generating CHANGELOG entry..." info "Generating CHANGELOG entry..."
prev_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "") prev_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
@@ -138,7 +145,6 @@ today=$(date +%Y-%m-%d)
} > /tmp/release_entry.md } > /tmp/release_entry.md
if [[ -f CHANGELOG.md ]]; then if [[ -f CHANGELOG.md ]]; then
# Insert after the first header line
tmp=$(mktemp) tmp=$(mktemp)
head -1 CHANGELOG.md > "$tmp" head -1 CHANGELOG.md > "$tmp"
echo "" >> "$tmp" echo "" >> "$tmp"
@@ -146,22 +152,18 @@ if [[ -f CHANGELOG.md ]]; then
tail -n +2 CHANGELOG.md >> "$tmp" tail -n +2 CHANGELOG.md >> "$tmp"
mv "$tmp" CHANGELOG.md mv "$tmp" CHANGELOG.md
else else
{ { echo "# Changelog"; echo ""; cat /tmp/release_entry.md; } > CHANGELOG.md
echo "# Changelog"
echo ""
cat /tmp/release_entry.md
} > CHANGELOG.md
fi fi
rm -f /tmp/release_entry.md rm -f /tmp/release_entry.md
ok "CHANGELOG.md updated" ok "CHANGELOG.md updated"
# ── 4. Verify build compiles ────────────────────────────────────────────────── # ── 4. Verify build ────────────────────────────────────────────────────────────
info "Verifying build (cargo check)..." info "Verifying build (cargo check)..."
cargo check --quiet 2>&1 || die "cargo check failed — fix errors before releasing" cargo check --quiet 2>&1 || die "cargo check failed — fix errors before releasing"
ok "Build check passed" ok "Build check passed"
# ── 5. Commit ───────────────────────────────────────────────────────────────── # ── 5. Commit ─────────────────────────────────────────────────────────────────
info "Creating release commit..." info "Creating release commit..."
git add Cargo.toml Cargo.lock server.json CHANGELOG.md git add Cargo.toml Cargo.lock server.json CHANGELOG.md
@@ -172,20 +174,56 @@ git commit -m "release: v${new}
- CHANGELOG.md updated" - CHANGELOG.md updated"
ok "Release commit created" ok "Release commit created"
# ── 6. Tag ──────────────────────────────────────────────────────────────────── # ── 6. Tag ────────────────────────────────────────────────────────────────────
info "Creating annotated tag v${new}..." info "Creating annotated tag v${new}..."
git tag -a "v${new}" -m "Release v${new}" git tag -a "v${new}" -m "Release v${new}"
ok "Tagged v${new}" ok "Tagged v${new}"
# ── 7. Push ─────────────────────────────────────────────────────────────────── # ── 7. Push (rebase if remote has new commits from CI) ─────────────────────────
info "Pushing to GitHub..." info "Pushing to GitHub..."
git push origin "$current_branch" if ! git push origin "$current_branch" 2>/dev/null; then
git push origin "v${new}" warn "Push rejected — rebasing on remote (CI may have committed SHA256)..."
git fetch origin "$current_branch"
# Resolve server.json conflict automatically: keep our version
if ! git rebase "origin/${current_branch}"; then
if git diff --name-only --diff-filter=U | grep -q "server.json"; then
python3 - <<'PYEOF'
import re
with open('server.json') as f:
raw = f.read()
resolved = re.sub(
r'<<<<<<< HEAD.*?=======\n(.*?)>>>>>>> [^\n]+\n',
r'\1',
raw,
flags=re.DOTALL
)
with open('server.json', 'w') as f:
f.write(resolved)
PYEOF
git add server.json
GIT_EDITOR=true git rebase --continue
else
git rebase --abort
die "Rebase failed with unexpected conflicts — push manually"
fi
fi
git push origin "$current_branch"
fi
# Push tag (delete and re-push if rebase moved the commit)
git push origin "v${new}" 2>/dev/null || {
git push origin ":refs/tags/v${new}" 2>/dev/null || true
git tag -f -a "v${new}" -m "Release v${new}"
git push origin "v${new}"
}
ok "Pushed — GitHub Actions triggered" ok "Pushed — GitHub Actions triggered"
# ── Done ────────────────────────────────────────────────────────────────────── # ── Done ──────────────────────────────────────────────────────────────────────
hr hr
echo "" echo ""
+2 -2
View File
@@ -14,7 +14,7 @@
# - Windsurf : ~/.codeium/windsurf/mcp_config.json (JSON, mcpServers) # - Windsurf : ~/.codeium/windsurf/mcp_config.json (JSON, mcpServers)
# - Cursor : ~/.cursor/mcp.json (JSON, mcpServers) # - Cursor : ~/.cursor/mcp.json (JSON, mcpServers)
# - VS Code : .vscode/mcp.json (JSON, servers - not mcpServers) # - VS Code : .vscode/mcp.json (JSON, servers - not mcpServers)
# - Antigravity : mcp_config.json via UI (JSON, mcpServers) # - Claude Desktop: ~/Library/Application Support/Claude/claude_desktop_config.json
# #
# Previous installations are auto-detected and uninstalled before re-registering. # Previous installations are auto-detected and uninstalled before re-registering.
@@ -1201,7 +1201,7 @@ _register_all_mcp_platforms() {
echo " - Windsurf: Edit ~/.codeium/windsurf/mcp_config.json" echo " - Windsurf: Edit ~/.codeium/windsurf/mcp_config.json"
echo " - Cursor: Edit ~/.cursor/mcp.json" echo " - Cursor: Edit ~/.cursor/mcp.json"
echo " - VS Code: Edit .vscode/mcp.json (workspace) or use MCP: Add Server command" echo " - VS Code: Edit .vscode/mcp.json (workspace) or use MCP: Add Server command"
echo " - Antigravity:Use Agent panel → MCP Servers → Manage → Edit configuration" echo " - Claude Desktop: Edit ~/Library/Application Support/Claude/claude_desktop_config.json"
echo "" echo ""
return return
fi fi
+3 -3
View File
@@ -7,12 +7,12 @@
"url": "https://github.com/masdevid/mt5-quant", "url": "https://github.com/masdevid/mt5-quant",
"source": "github" "source": "github"
}, },
"version": "1.31.3", "version": "1.31.4",
"packages": [ "packages": [
{ {
"registryType": "mcpb", "registryType": "mcpb",
"version": "1.31.3", "version": "1.31.4",
"identifier": "https://github.com/masdevid/mt5-quant/releases/download/v1.31.3/mcp-mt5-quant-macos-arm64.tar.gz", "identifier": "https://github.com/masdevid/mt5-quant/releases/download/v1.31.4/mcp-mt5-quant-macos-arm64.tar.gz",
"fileSha256": "TBD_CI_WILL_UPDATE", "fileSha256": "TBD_CI_WILL_UPDATE",
"transport": { "transport": {
"type": "stdio" "type": "stdio"