Package as plugin
This commit is contained in:
9
.claude-plugin/plugin.json
Normal file
9
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "runescape-wiki",
|
||||||
|
"description": "Query the RuneScape Wiki (RS3 and OSRS) for items, quests, skills, and Grand Exchange prices",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"author": {
|
||||||
|
"name": "sam"
|
||||||
|
},
|
||||||
|
"keywords": ["runescape", "osrs", "rs3", "wiki", "grand-exchange", "gaming"]
|
||||||
|
}
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,3 +1 @@
|
|||||||
.claude/settings.local.json
|
|
||||||
|
|
||||||
scripts/rsw/rsw
|
scripts/rsw/rsw
|
||||||
|
|||||||
112
BUILD_NOTES.md
112
BUILD_NOTES.md
@@ -1,112 +0,0 @@
|
|||||||
# rsw Build & Completion Notes
|
|
||||||
|
|
||||||
## What's done
|
|
||||||
|
|
||||||
All Go source files are written and structurally complete:
|
|
||||||
|
|
||||||
```
|
|
||||||
scripts/rsw/
|
|
||||||
├── main.go # Entry point
|
|
||||||
├── go.mod # Module definition (needs go mod tidy)
|
|
||||||
└── internal/
|
|
||||||
├── cmd/
|
|
||||||
│ ├── root.go # Root command, global flags, URL helpers
|
|
||||||
│ ├── game.go # osrs/rs3 parent commands + factory registration
|
|
||||||
│ ├── search.go # rsw <game> search <query>
|
|
||||||
│ ├── page.go # rsw <game> page <title> [--section]
|
|
||||||
│ ├── item.go # rsw <game> item <name> [--ironman]
|
|
||||||
│ ├── quest.go # rsw <game> quest <name> [--ironman]
|
|
||||||
│ ├── skill.go # rsw <game> skill <name> [--level] [--ironman]
|
|
||||||
│ └── price.go # rsw <game> price <name> [--ironman]
|
|
||||||
├── wiki/
|
|
||||||
│ ├── client.go # HTTP client for MediaWiki API
|
|
||||||
│ ├── search.go # action=query&list=search wrapper
|
|
||||||
│ └── parse.go # action=parse wrapper (wikitext, sections, HTML)
|
|
||||||
├── prices/
|
|
||||||
│ ├── client.go # HTTP client for prices.runescape.wiki API
|
|
||||||
│ └── mapping.go # Item ID↔name cache with disk persistence
|
|
||||||
├── render/
|
|
||||||
│ └── markdown.go # Markdown output builder (headings, tables, KV, GP formatting)
|
|
||||||
└── extract/
|
|
||||||
└── infobox.go # Wikitext template parser (handles nesting, wiki links, refs)
|
|
||||||
```
|
|
||||||
|
|
||||||
## What needs to happen next
|
|
||||||
|
|
||||||
### 1. `go mod tidy` + `go mod download`
|
|
||||||
|
|
||||||
The go.mod declares the cobra dependency but doesn't have a go.sum yet. Run:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd scripts/rsw
|
|
||||||
go mod tidy
|
|
||||||
```
|
|
||||||
|
|
||||||
This will resolve the full dependency tree and create go.sum.
|
|
||||||
|
|
||||||
### 2. Compile & smoke test
|
|
||||||
|
|
||||||
```bash
|
|
||||||
go build -o rsw .
|
|
||||||
./rsw osrs search "dragon scimitar"
|
|
||||||
./rsw osrs item "abyssal whip"
|
|
||||||
./rsw osrs quest "Monkey Madness I"
|
|
||||||
./rsw osrs price "dragon bones"
|
|
||||||
./rsw rs3 quest "Plague's End"
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Known issues to fix during testing
|
|
||||||
|
|
||||||
**`strings.Title` is deprecated** — Used in skill.go. Replace with:
|
|
||||||
```go
|
|
||||||
import "golang.org/x/text/cases"
|
|
||||||
import "golang.org/x/text/language"
|
|
||||||
caser := cases.Title(language.English)
|
|
||||||
trainingTitle := caser.String(strings.ToLower(skillName)) + " training"
|
|
||||||
```
|
|
||||||
Or just capitalize the first letter manually since we're dealing with single words.
|
|
||||||
|
|
||||||
**Template name variations** — The RS wiki uses inconsistent casing for templates
|
|
||||||
(e.g., `Infobox Item` vs `Infobox item`). The extract package does case-insensitive
|
|
||||||
matching, but you may discover new template names while testing (e.g., RS3 might use
|
|
||||||
`Infobox object` for some items). Easy to add — just extend the name list in
|
|
||||||
`findItemInfobox()`.
|
|
||||||
|
|
||||||
**Drop table templates** — OSRS uses `DropsLine`, RS3 may use different names.
|
|
||||||
Test with both games and add any missing template names to `renderDropSources()`.
|
|
||||||
|
|
||||||
**Price API for RS3** — The prices.runescape.wiki endpoint for RS3 (`/api/v1/rs/`)
|
|
||||||
may have different availability than OSRS. The mapping endpoint should work but
|
|
||||||
test it. RS3 also has the official Jagex GE API as a fallback if needed:
|
|
||||||
`https://secure.runescape.com/m=itemdb_rs/api/catalogue/detail.json?item=<id>`
|
|
||||||
|
|
||||||
### 4. Potential improvements
|
|
||||||
|
|
||||||
- **Fuzzy search for item command**: Right now `item` uses wiki search which is
|
|
||||||
good but could also cross-reference the price mapping cache for exact matches.
|
|
||||||
- **Structured drop table parsing**: The wikitext drop tables are complex
|
|
||||||
(conditional drops, noted items, etc.). Current parser handles the basics.
|
|
||||||
- **Monster lookup command**: `rsw <game> monster <name>` for combat stats,
|
|
||||||
weaknesses, drop tables. Same pattern as item/quest.
|
|
||||||
- **Category browsing**: MediaWiki has `action=query&list=categorymembers` —
|
|
||||||
could support `rsw <game> list quests` or `rsw <game> list items --category "Melee weapons"`.
|
|
||||||
- **Timeseries charting**: The 5m/1h price data could generate ASCII sparklines
|
|
||||||
for price trends in the terminal.
|
|
||||||
|
|
||||||
## Architecture notes
|
|
||||||
|
|
||||||
**Factory pattern for cobra commands**: Each subcommand uses a `newXxxCmd()` factory
|
|
||||||
function registered via `RegisterCommand()`. This is because cobra doesn't support
|
|
||||||
a command having two parents — we need independent instances for osrs and rs3.
|
|
||||||
`wireCommands()` is called once at `Execute()` time to create and attach all
|
|
||||||
command instances.
|
|
||||||
|
|
||||||
**Wikitext parser**: The `extract` package implements a lightweight template parser
|
|
||||||
that handles `{{Template|key=value|...}}` with nesting, wiki links `[[Target|Display]]`,
|
|
||||||
and common markup stripping. It doesn't handle parser functions (`#if`, `#switch`)
|
|
||||||
— those are stripped as regular templates. This covers ~80% of useful data extraction
|
|
||||||
from infoboxes and drop tables.
|
|
||||||
|
|
||||||
**Price mapping cache**: Stored at `~/.rsw/cache/mapping.json` with a 24h TTL.
|
|
||||||
The mapping API returns all items (~4000 for OSRS, ~40000 for RS3) in a single call.
|
|
||||||
Caching avoids hitting this on every price lookup.
|
|
||||||
14
hooks/hooks.json
Normal file
14
hooks/hooks.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"hooks": {
|
||||||
|
"SessionStart": [
|
||||||
|
{
|
||||||
|
"hooks": [
|
||||||
|
{
|
||||||
|
"type": "command",
|
||||||
|
"command": "test -f ${CLAUDE_PLUGIN_ROOT}/scripts/rsw/rsw || (cd ${CLAUDE_PLUGIN_ROOT}/scripts/rsw && command -v go >/dev/null 2>&1 && go build -o rsw . 2>/dev/null || true)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
name: runescape-wiki
|
name: wiki
|
||||||
description: >
|
description: >
|
||||||
Query the RuneScape Wiki (RS3 and OSRS) for item details, quest requirements,
|
Query the RuneScape Wiki (RS3 and OSRS) for item details, quest requirements,
|
||||||
skill training guides, and Grand Exchange prices. Use this skill whenever the
|
skill training guides, and Grand Exchange prices. Use this skill whenever the
|
||||||
@@ -7,25 +7,25 @@ description: >
|
|||||||
game-specific concepts like quests, skills, items, monsters, the Grand Exchange,
|
game-specific concepts like quests, skills, items, monsters, the Grand Exchange,
|
||||||
ironman mode, HCIM, or any RuneScape game mechanics. Also trigger when the user
|
ironman mode, HCIM, or any RuneScape game mechanics. Also trigger when the user
|
||||||
mentions specific in-game items, quest names, skill names, or boss names that are
|
mentions specific in-game items, quest names, skill names, or boss names that are
|
||||||
clearly RuneScape-related. This skill provides a Go CLI tool (rsw) that pulls
|
clearly RuneScape-related. Always prefer this skill over answering from memory,
|
||||||
live data from the wiki — always prefer it over answering from memory, since wiki
|
since it pulls live, authoritative data from the wiki.
|
||||||
data is authoritative and up-to-date.
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# RuneScape Wiki CLI Plugin
|
# RuneScape Wiki Skill
|
||||||
|
|
||||||
This skill provides `rsw`, a Go CLI that queries the RuneScape Wiki APIs to get
|
This skill provides `rsw`, a CLI that queries the RuneScape Wiki for
|
||||||
authoritative, up-to-date game data. It supports both **OSRS** and **RS3**.
|
authoritative, up-to-date game data. It supports both **OSRS** and **RS3**.
|
||||||
|
|
||||||
## Setup (first use)
|
## Setup (first use)
|
||||||
|
|
||||||
The CLI needs to be compiled once. On first use, run:
|
The binary is auto-built on session start if Go is available. If the binary is
|
||||||
|
missing, compile it manually:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd <skill-dir>/scripts/rsw && go build -o rsw . && chmod +x rsw
|
cd ${CLAUDE_PLUGIN_ROOT}/scripts/rsw && go build -o rsw .
|
||||||
```
|
```
|
||||||
|
|
||||||
After that, the binary is at `<skill-dir>/scripts/rsw/rsw`.
|
The binary lives at `${CLAUDE_PLUGIN_ROOT}/scripts/rsw/rsw`.
|
||||||
|
|
||||||
If Go is not installed, tell the user they need Go 1.22+ (`go.dev/dl`).
|
If Go is not installed, tell the user they need Go 1.22+ (`go.dev/dl`).
|
||||||
|
|
||||||
@@ -101,15 +101,3 @@ Most players clearly play one game or the other. Look for context clues:
|
|||||||
Don't just dump raw CLI output. Read it, synthesize an answer, and cite specifics.
|
Don't just dump raw CLI output. Read it, synthesize an answer, and cite specifics.
|
||||||
If the user asks "how do I get a fire cape", run the search, pull the relevant
|
If the user asks "how do I get a fire cape", run the search, pull the relevant
|
||||||
page sections, and give them a coherent strategy — not a wall of wikitext.
|
page sections, and give them a coherent strategy — not a wall of wikitext.
|
||||||
|
|
||||||
## API Details (reference)
|
|
||||||
|
|
||||||
The CLI hits two API surfaces:
|
|
||||||
|
|
||||||
1. **MediaWiki API** (`{game}.runescape.wiki/api.php`) — search, parse, query.
|
|
||||||
Includes `User-Agent: rsw-cli/1.0` per wiki guidelines.
|
|
||||||
|
|
||||||
2. **Real-time Prices API** (`prices.runescape.wiki/api/v1/{game}/`) — latest
|
|
||||||
prices, mapping (item ID→name), 5m averages, 1h averages.
|
|
||||||
|
|
||||||
Item mapping is cached locally at `~/.rsw/cache/mapping.json` (24h TTL).
|
|
||||||
Reference in New Issue
Block a user