7 Commits

Author SHA1 Message Date
shoko
32ed72868b docs(polymarket-browse): update SKILL.md with troubleshooting, examples, changelog, credits
- Clarify --detail argument (only for MATCH markets, error on out of range)
- Add Troubleshooting section with common issues
- Add Examples section with usage patterns
- Add Changelog section
- Add Credits section
2026-03-26 19:16:19 +00:00
shoko
dfad8d3072 chore(polymarket-browse): add version 0.0.2 to SKILL.md frontmatter 2026-03-26 18:43:26 +00:00
c0f008ab8b Merge pull request 'Fix: Event happening exactly now shows LIVE instead of In 0m' (#28) from fix/live-time-display into master 2026-03-26 18:48:23 +01:00
shoko
53c268511a Add test for event happening exactly now shows LIVE
Added test_get_time_data_live_exactly_now to prevent regression.
2026-03-26 17:46:53 +00:00
shoko
7f3b885521 Fix: Event happening exactly now shows 'LIVE' instead of 'In 0m'
Changed condition from total_sec < 0 to total_sec <= 0 to catch the edge case where an event is happening right now.
2026-03-26 17:43:28 +00:00
shoko
e0ae6bbd14 Remove incorrect '100 pages safety cap' claim from SKILL.md
This limit doesn't exist in the code.
2026-03-26 17:37:41 +00:00
f468a12ea4 Merge pull request 'Add parallel fetching, caching, and max_total parameter' (#26) from feat/parallel-fetch-cache into master 2026-03-26 18:23:20 +01:00
3 changed files with 129 additions and 4 deletions

View File

@@ -1,5 +1,6 @@
---
name: polymarket-browse
version: 0.0.2
category: research
description: Browse tradeable Polymarket events by game category. Shows active matches with ML odds (cents format), volume, tournament, and market URLs. Supports Counter Strike, League of Legends, Dota 2, Valorant, NBA, NFL, UFC, Tennis.
---
@@ -46,7 +47,11 @@ polymarket-browse [--category "Counter Strike"] [--limit 5] [--matches N] [--non
- `--search` : Free-text team/term search within the selected category. Appends to the category query. Example: `--category "Counter Strike" --search "FlyQuest"`
- `--matches-only` : Show only match markets (suppress non-match section).
- `--non-matches-only` : Show only non-match markets (suppress match section).
- `--detail` : Index of match event (1-indexed) to show detailed markets. Default: 1. Set to 0 to disable.
- `--detail N` : Show detailed markets for match event N (1-indexed).
- Only applies to MATCH markets (not non-match/tournament markets)
- Default: 1 (auto-shows details for first match)
- Set to 0 to disable detail view
- If N exceeds available matches, shows error with available range
- `--list-categories` : List available game categories and exit
- `--raw` : Show all events without tradeable filter (for debugging). Includes fetch stats.
- `--no-cache` : Disable caching and fetch fresh data from the API.
@@ -120,7 +125,7 @@ Use `--raw` to disable the tradeable filter and see all match markets regardless
## Pagination
The script fetches **ALL pages** until the API runs out of results (up to 100 pages as a safety cap).
The script fetches **ALL pages** until the API runs out of results.
### Parallel Fetching
@@ -152,3 +157,113 @@ All odds are shown in **cents** format:
- `30c` = 0.30 probability
- `95c` = 0.95 probability
- `GamerLegion 28c | 72c Team Yandex` = GamerLegion at 28c, Team Yandex at 72c
## Troubleshooting
### "WARNING: Partial fetch" appears
The API returned incomplete data due to an error/timeout. Results shown may be incomplete. Try again with `--no-cache` to force a fresh fetch.
### No markets appear
- Verify your category is correct: `--list-categories`
- Try with `--raw` to see all events (not just tradeable ones)
- Some categories may have no active match markets at certain times
### Why did my match disappear?
Matches are filtered out when:
- They have ended (startTime > 4 hours ago)
- BO2 matches ended in a tie (1-1)
- The market has converged (bestBid >= 0.99 or bestAsk <= 0.01)
- The event has ended (endDate passed)
### Telegram not working
- Verify `BOT_TOKEN` and `CHAT_ID` environment variables are set
- Ensure bot is started and chat ID is correct
- Check Telegram has not blocked the bot
## Examples
### Basic usage
```bash
# Browse Counter Strike matches (default)
polymarket-browse
# Browse NBA matches
polymarket-browse --category NBA
# Show more results
polymarket-browse --limit 10
```
### Searching for teams
```bash
# Find FlyQuest Counter Strike matches
polymarket-browse --category "Counter Strike" --search "FlyQuest"
# Find any team/event across category
polymarket-browse --category "Counter Strike" --search "Spirit"
```
### Filtering results
```bash
# Show only match markets (no tournament futures)
polymarket-browse --matches-only
# Show only non-match markets (tournaments, props)
polymarket-browse --non-matches-only
# Different limits for each section
polymarket-browse --matches 10 --non-matches 5
```
### Using --detail
```bash
# Show details for 1st match (default behavior, auto-enabled)
polymarket-browse --detail 1
# Show details for 3rd match
polymarket-browse --detail 3
# Disable detail view
polymarket-browse --detail 0
```
### Debugging
```bash
# Show all events without tradeable filter
polymarket-browse --raw
# Force fresh data (bypass cache)
polymarket-browse --no-cache
# Limit total events for quick snapshot
polymarket-browse --max-total 20
```
### Timezone
```bash
# Display times in different timezone (default: UTC+7/WIB)
polymarket-browse --timezone UTC+8
polymarket-browse --timezone UTC-5
```
## Changelog
### v0.0.2 (Current)
- Added `--matches-only` and `--non-matches-only` filters
- Added `--max-total` for limiting fetch size
- Added Telegram support with `--telegram` flag
- Added `--timezone` argument for display timezone configuration
- Improved BO2 tie detection
### v0.0.1
- Initial release
- Basic Polymarket browsing by category
- Match/non-match market filtering
- Moneyline odds display
## Credits
**Author:** shokollm
**Repository:** https://github.com/shokollm/jujutsu-skills
Built for Hermes Agent and OpenClaw.

View File

@@ -470,8 +470,8 @@ def _get_time_data(e: dict[str, Any], tz: timezone | None = None) -> TimeData:
delta = start_dt - now_utc
total_sec = delta.total_seconds()
if total_sec < 0:
# Event is in the past
if total_sec <= 0:
# Event is in the past or happening now
hours_ago = abs(total_sec) / 3600
if hours_ago < 1:
time_status = "LIVE"

View File

@@ -309,6 +309,16 @@ class TestTimeFunctions(unittest.TestCase):
self.assertEqual(td["time_urgency"], 3)
self.assertIn("WIB", td["abs_time"])
def test_get_time_data_live_exactly_now(self):
"""Event starts exactly now -> 'LIVE', urgency 3 (not 'In 0m')."""
frozen = self._frozen_dt(2026, 3, 25, 12, 0, 0)
with patch("browse.datetime", self._mock_datetime(frozen)):
from browse import _get_time_data
td = _get_time_data(self._make_event("2026-03-25T12:00:00Z"))
self.assertEqual(td["time_status"], "LIVE")
self.assertEqual(td["time_urgency"], 3)
def test_get_time_data_started_2h_ago(self):
"""Started 2 hours ago -> 'LIVE 2h', urgency 3."""
frozen = self._frozen_dt(2026, 3, 25, 14, 0, 0)