Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 29 additions & 16 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,21 +82,34 @@ jobs:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK }}
run: |
VERSION="${{ steps.version.outputs.VERSION }}"
CHANGELOG=$(echo '${{ steps.changelog.outputs.CHANGELOG }}' | head -c 1000)

curl -H "Content-Type: application/json" \
-d "{
\"embeds\": [{
\"title\": \"🚀 SlopeSniper v${VERSION} Released!\",
\"description\": \"A new version of SlopeSniper is now available.\",
\"url\": \"${{ github.server_url }}/${{ github.repository }}/releases/tag/v${VERSION}\",
\"color\": 5793266,
\"fields\": [
{\"name\": \"What's New\", \"value\": \"${CHANGELOG:-See release notes}\", \"inline\": false},
{\"name\": \"Install\", \"value\": \"\`\`\`bash\ncurl -fsSL https://raw.githubusercontent.com/BAGWATCHER/SlopeSniper/main/skills/install.sh | bash\n\`\`\`\", \"inline\": false}

# Safely escape changelog for JSON using jq
CHANGELOG_RAW=$(cat <<'CHLOG'
${{ steps.changelog.outputs.CHANGELOG }}
CHLOG
)
CHANGELOG=$(echo "$CHANGELOG_RAW" | head -c 800 | jq -Rs '.')

# Build JSON payload with jq to handle escaping
PAYLOAD=$(jq -n \
--arg title "🚀 SlopeSniper v${VERSION} Released!" \
--arg desc "A new version of SlopeSniper is now available." \
--arg url "${{ github.server_url }}/${{ github.repository }}/releases/tag/v${VERSION}" \
--argjson changelog "$CHANGELOG" \
--arg timestamp "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
'{
embeds: [{
title: $title,
description: $desc,
url: $url,
color: 5793266,
fields: [
{name: "What'\''s New", value: ($changelog // "See release notes"), inline: false},
{name: "Install", value: "```bash\ncurl -fsSL https://raw.githubusercontent.com/BAGWATCHER/SlopeSniper/main/skills/install.sh | bash\n```", inline: false}
],
\"footer\": {\"text\": \"BAGWATCHER/SlopeSniper\"},
\"timestamp\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"
footer: {text: "BAGWATCHER/SlopeSniper"},
timestamp: $timestamp
}]
}" \
$DISCORD_WEBHOOK
}')

curl -H "Content-Type: application/json" -d "$PAYLOAD" $DISCORD_WEBHOOK
43 changes: 42 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,44 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.3.41] - 2026-01-29

### Changed
- **Default log level changed to WARNING** - CLI output is now clean by default
- Use `--verbose` or `-v` for INFO-level debugging output
- Use `--quiet` or `-q` to suppress all logging
- Set `SLOPESNIPER_LOG_LEVEL=INFO` env var for persistent verbose mode

### Removed
- **Stale `src/` directory** - Old v0.1.0 duplicate code removed (consolidated to `mcp-extension/`)

### Fixed
- Version drift across all files synced to 0.3.41

## [0.3.4] - 2026-01-29

### Added
- **Discord webhook notifications for CI/CD** (#39, #40)
- Push notifications for dev/production branches
- PR merge notifications with diff colors (orange=dev, green=prod)
- Release notifications with changelog summary
- Proper JSON escaping for webhook payloads

### Fixed
- Discord release notification JSON parsing errors (using jq for safe escaping)

### Changed
- Updated BAGWATCHER PAT with proper scopes (secrets, workflow)

## [0.3.3] - 2026-01-29

### Added
- Pre-merge testing requirement documented in CONTRIBUTING.md
- Explicit testing steps before PR merge

### Fixed
- Version sync documentation improvements

## [0.3.2] - 2026-01-29

### Changed
Expand Down Expand Up @@ -284,7 +322,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

---

[Unreleased]: https://github.com/BAGWATCHER/SlopeSniper/compare/v0.3.2...HEAD
[Unreleased]: https://github.com/BAGWATCHER/SlopeSniper/compare/v0.3.41...HEAD
[0.3.41]: https://github.com/BAGWATCHER/SlopeSniper/compare/v0.3.4...v0.3.41
[0.3.4]: https://github.com/BAGWATCHER/SlopeSniper/compare/v0.3.3...v0.3.4
[0.3.3]: https://github.com/BAGWATCHER/SlopeSniper/compare/v0.3.2...v0.3.3
[0.3.2]: https://github.com/BAGWATCHER/SlopeSniper/compare/v0.3.1...v0.3.2
[0.3.1]: https://github.com/BAGWATCHER/SlopeSniper/compare/v0.3.03...v0.3.1
[0.3.03]: https://github.com/BAGWATCHER/SlopeSniper/compare/v0.3.02...v0.3.03
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
[![Version](https://img.shields.io/badge/version-0.3.2-green.svg)](https://github.com/BAGWATCHER/SlopeSniper/releases)
[![Version](https://img.shields.io/badge/version-0.3.41-green.svg)](https://github.com/BAGWATCHER/SlopeSniper/releases)

[Quick Start](#-quick-start) · [Features](#-features) · [Documentation](#-documentation) · [Contributing](#-contributing)

Expand Down
2 changes: 1 addition & 1 deletion docs/MOLTBOT_COMPATIBILITY.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# SlopeSniper + MoltBot Compatibility Assessment

*Created: 2026-01-28 | Updated: 2026-01-29 | Version: 0.3.2*
*Created: 2026-01-28 | Updated: 2026-01-29 | Version: 0.3.41*

## Executive Summary

Expand Down
39 changes: 39 additions & 0 deletions githubproducworkflow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
Post-PR Merge Workflow

After your PR is merged to BAGWATCHER/SlopeSniper:main:

# 1. Switch to main and pull latest from production
git checkout main
git pull origin main

# 2. Sync fork's main branch
git push fork main

# 3. Reset dev branch to new main (for next round of changes)
git checkout bagwatcher-release
git reset --hard origin/main
git push fork bagwatcher-release --force

---
Full Cycle Reference

# === DEVELOP ===
git checkout bagwatcher-release
# make changes...
git add -A && git commit -m "description"
git push fork bagwatcher-release

# === CREATE PR ===
GH_TOKEN="your_pat" gh pr create \
--repo BAGWATCHER/SlopeSniper \
--base main \
--head maddefientist:bagwatcher-release \
--title "title" --body "description"

# === AFTER MERGE ===
git checkout main
git pull origin main
git push fork main
git branch -D bagwatcher-release # or reset it for reuse


2 changes: 1 addition & 1 deletion mcp-extension/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"manifest_version": "0.4",
"name": "slopesniper",
"version": "0.1.0",
"version": "0.3.41",
"description": "Solana token trading assistant - USE THESE TOOLS when user wants to trade crypto. Call get_status first, then quick_trade to buy/sell tokens like BONK, WIF, SOL. Tools: get_status, quick_trade, scan_opportunities, set_strategy, get_price, check_token.",
"author": {
"name": "SlopeSniper",
Expand Down
2 changes: 1 addition & 1 deletion mcp-extension/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "slopesniper-mcp"
version = "0.3.2"
version = "0.3.41"
description = "SlopeSniper MCP Server - Safe Solana Token Trading"
requires-python = ">=3.10"
dependencies = [
Expand Down
2 changes: 1 addition & 1 deletion mcp-extension/src/slopesniper_api/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
"""SlopeSniper Web API."""

__version__ = "0.3.03"
__version__ = "0.3.41"
4 changes: 2 additions & 2 deletions mcp-extension/src/slopesniper_api/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ async def lifespan(app: FastAPI):
app = FastAPI(
title="SlopeSniper API",
description="Solana token trading via Jupiter DEX",
version="0.3.03",
version="0.3.41",
lifespan=lifespan,
)

Expand Down Expand Up @@ -126,7 +126,7 @@ async def root():
"""Health check and API info."""
return {
"service": "SlopeSniper API",
"version": "0.3.03",
"version": "0.3.41",
"status": "running",
"endpoints": [
"/status",
Expand Down
2 changes: 1 addition & 1 deletion mcp-extension/src/slopesniper_mcp/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
"""SlopeSniper MCP Server."""

__version__ = "0.3.03"
__version__ = "0.3.41"
2 changes: 1 addition & 1 deletion mcp-extension/src/slopesniper_skill/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
# Version is the single source of truth - update here for releases
# Follow semantic versioning: MAJOR.MINOR.PATCH
# Beta versions use 0.x.x (0.MINOR.PATCH)
__version__ = "0.3.2"
__version__ = "0.3.41"

from .tools import (
export_wallet,
Expand Down
14 changes: 11 additions & 3 deletions mcp-extension/src/slopesniper_skill/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@
slopesniper daemon status

Global flags:
--quiet, -q Suppress logging output (only JSON to stdout)
--quiet, -q Suppress all logging (only JSON to stdout)
--verbose, -v Enable verbose logging for debugging
"""

from __future__ import annotations
Expand Down Expand Up @@ -1133,18 +1134,25 @@ def main() -> None:
"""CLI entry point."""
args = sys.argv[1:]

# Check for --quiet flag (suppresses logging for clean JSON output)
# Check for --quiet flag (suppresses ALL logging)
quiet = "--quiet" in args or "-q" in args
if quiet:
args = [a for a in args if a not in ("--quiet", "-q")]
import logging

logging.disable(logging.CRITICAL)
# Also suppress warnings from libraries
import warnings

warnings.filterwarnings("ignore")

# Check for --verbose flag (enables INFO logging for debugging)
verbose = "--verbose" in args or "-v" in args
if verbose:
args = [a for a in args if a not in ("--verbose", "-v")]
import os

os.environ["SLOPESNIPER_LOG_LEVEL"] = "INFO"

if not args or args[0] in ("-h", "--help", "help"):
print_help()
return
Expand Down
2 changes: 1 addition & 1 deletion mcp-extension/src/slopesniper_skill/sdk/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
- PumpFunClient: Pump.fun graduated/new tokens
"""

__version__ = "0.3.03"
__version__ = "0.3.41"

from .dexscreener_client import DexScreenerClient
from .jupiter_data_client import JupiterDataClient
Expand Down
10 changes: 8 additions & 2 deletions mcp-extension/src/slopesniper_skill/sdk/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ class Utils:
def setup_logger(
name: str = "SlopeSniper",
log_file: str | None = None,
level: int = logging.INFO,
level: int | None = None,
) -> logging.Logger:
"""
Set up a logger with console and optional file output.

Args:
name: Logger name
log_file: Optional log file path (if None, console only)
level: Logging level
level: Logging level (default: WARNING, or SLOPESNIPER_LOG_LEVEL env var)

Returns:
Configured logger instance
Expand All @@ -37,6 +37,12 @@ def setup_logger(

if not logger.hasHandlers():
logger.propagate = False

# Determine log level: explicit > env var > default (WARNING for clean CLI output)
if level is None:
env_level = os.environ.get("SLOPESNIPER_LOG_LEVEL", "WARNING").upper()
level = getattr(logging, env_level, logging.WARNING)

logger.setLevel(level)

formatter = logging.Formatter("%(asctime)s | %(name)s | %(levelname)s | %(message)s")
Expand Down
56 changes: 0 additions & 56 deletions src/slopesniper_skill/__init__.py

This file was deleted.

23 changes: 0 additions & 23 deletions src/slopesniper_skill/sdk/__init__.py

This file was deleted.

Loading
Loading