moshcode 0.25.1 → 0.27.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 +35 -0
- package/README.md +114 -0
- package/bin/moshcode.mjs +23 -1
- package/package.json +3 -1
- package/plugins/crypto/.claude-plugin/plugin.json +13 -0
- package/plugins/crypto/README.md +66 -0
- package/plugins/crypto/commands/bars.md +35 -0
- package/plugins/crypto/commands/book.md +31 -0
- package/plugins/crypto/commands/coin.md +31 -0
- package/plugins/crypto/commands/crypto.md +50 -0
- package/plugins/crypto/commands/pairs.md +31 -0
- package/plugins/crypto/commands/quote.md +31 -0
- package/plugins/crypto/commands/spark.md +36 -0
- package/plugins/ticker/.claude-plugin/plugin.json +13 -0
- package/plugins/ticker/README.md +49 -0
- package/plugins/ticker/commands/discover.md +37 -0
- package/plugins/ticker/commands/lookup.md +27 -0
- package/plugins/ticker/commands/reports.md +30 -0
- package/plugins/ticker/commands/research.md +29 -0
- package/plugins/ticker/commands/signals.md +30 -0
- package/plugins/ticker/commands/ticker.md +42 -0
- package/prd/0008-ticker-research-and-plugin-marketplace.md +130 -0
- package/prd/README.md +1 -0
- package/src/advisor.mjs +598 -0
- package/src/cli-schema.mjs +166 -0
- package/src/crypto.mjs +877 -0
- package/src/integrations.mjs +76 -2
- package/src/plugins.mjs +126 -0
- package/src/socials.mjs +72 -0
- package/src/tui.mjs +45 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
|
|
3
|
+
"name": "moshcode",
|
|
4
|
+
"description": "moshcode's own Claude Code plugins — the pit's slash commands, in your engine",
|
|
5
|
+
"owner": {
|
|
6
|
+
"name": "moshcoder",
|
|
7
|
+
"url": "https://moshcode.sh"
|
|
8
|
+
},
|
|
9
|
+
"plugins": [
|
|
10
|
+
{
|
|
11
|
+
"name": "ticker",
|
|
12
|
+
"description": "Equity research slash commands backed by advis0r.com: scored reports, extracted signals, transcript search, company-name lookup, and ranked watchlists.",
|
|
13
|
+
"source": "./plugins/ticker",
|
|
14
|
+
"category": "productivity",
|
|
15
|
+
"author": {
|
|
16
|
+
"name": "moshcoder",
|
|
17
|
+
"url": "https://moshcode.sh"
|
|
18
|
+
},
|
|
19
|
+
"homepage": "https://github.com/moshcoder/moshcode#ticker",
|
|
20
|
+
"keywords": ["stocks", "equity", "research", "markets", "advis0r"]
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "crypto",
|
|
24
|
+
"description": "Crypto market data slash commands backed by advis0r.com: live prices, technical scores, order books, OHLCV history and sparklines across Alpaca's US crypto venue.",
|
|
25
|
+
"source": "./plugins/crypto",
|
|
26
|
+
"category": "productivity",
|
|
27
|
+
"author": {
|
|
28
|
+
"name": "moshcoder",
|
|
29
|
+
"url": "https://moshcode.sh"
|
|
30
|
+
},
|
|
31
|
+
"homepage": "https://github.com/moshcoder/moshcode#crypto",
|
|
32
|
+
"keywords": ["crypto", "bitcoin", "markets", "prices", "advis0r"]
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
package/README.md
CHANGED
|
@@ -46,6 +46,9 @@ or miss one that does. A test fails the build when it drifts.
|
|
|
46
46
|
| `moshcode engines` | engines | list engines and installation status |
|
|
47
47
|
| `moshcode tools` | tools | list workflow tools and installation status |
|
|
48
48
|
| `moshcode trade` | tools | look up markets and trade through Alpaca |
|
|
49
|
+
| `moshcode ticker` <br>`advisor` | tools | equity research from advis0r.com |
|
|
50
|
+
| `moshcode crypto` <br>`coins` | tools | crypto market data from advis0r.com |
|
|
51
|
+
| `moshcode plugin` <br>`plugins` | extend | install moshcode's slash commands into Claude Code |
|
|
49
52
|
| `moshcode commands` | script | list built-in moshscript commands |
|
|
50
53
|
| `moshcode completion` | extend | print a shell completion script |
|
|
51
54
|
| `moshcode run` | script | run a moshscript |
|
|
@@ -211,6 +214,80 @@ Alpaca's CLI has no confirmation prompts; `--submit` intentionally removes
|
|
|
211
214
|
MoshCode's preview guard. Live trading additionally requires Alpaca's `--live`
|
|
212
215
|
opt-in or corresponding environment setting.
|
|
213
216
|
|
|
217
|
+
### Equity research (`moshcode ticker`)
|
|
218
|
+
|
|
219
|
+
Where `trade` is Alpaca's order book, `ticker` is the research desk:
|
|
220
|
+
[advis0r.com](https://advis0r.com/api)'s public read-only API, rendered in the
|
|
221
|
+
pit. No key, no login, no write routes, no binary to install:
|
|
222
|
+
|
|
223
|
+
```sh
|
|
224
|
+
moshcode ticker NVDA # score, technicals, fundamentals, thesis, signals
|
|
225
|
+
moshcode ticker lookup rivian # company name → RIVN
|
|
226
|
+
moshcode ticker signals AAPL # what was said, quoted and sourced
|
|
227
|
+
moshcode ticker search "data center" # across every indexed transcript
|
|
228
|
+
moshcode ticker reports --limit 10 # the stored index, best score first
|
|
229
|
+
moshcode ticker discover fusion # a ranked watchlist (slow — analyzes each candidate)
|
|
230
|
+
moshcode ticker open NVDA # the shareable report page
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Add `--json` to any of them for the raw response. The same facade is `/ticker …`
|
|
234
|
+
in the pit, and `MOSHCODE_ADVISOR_URL` points it at another instance.
|
|
235
|
+
|
|
236
|
+
Reports are **stored snapshots**, not live quotes: every response carries
|
|
237
|
+
`reportGeneratedAt` and every renderer prints it, alongside whether the price is
|
|
238
|
+
delayed and which feed produced it. Scores labelled `offline` come from
|
|
239
|
+
deterministic rules rather than a model. It is a research aid, not advice, and
|
|
240
|
+
nothing under `ticker` can place an order.
|
|
241
|
+
|
|
242
|
+
### Crypto market data (`moshcode crypto`)
|
|
243
|
+
|
|
244
|
+
`crypto` is `ticker`'s sibling on the same host: advis0r's read-only crypto
|
|
245
|
+
routes over Alpaca's US crypto venue, which trades 24/7 and needs no extra
|
|
246
|
+
subscription.
|
|
247
|
+
|
|
248
|
+
```sh
|
|
249
|
+
moshcode crypto BTC # price, technicals, score, supply, order book
|
|
250
|
+
moshcode crypto lookup bitcoin # asset name → BTC/USD
|
|
251
|
+
moshcode crypto quote ETH-USD # latest trade + quote, spread in bps
|
|
252
|
+
moshcode crypto spark BTC ETH SOL # recent moves across pairs, as sparklines
|
|
253
|
+
moshcode crypto bars ETH-USD --timeframe 1Hour # historical OHLCV
|
|
254
|
+
moshcode crypto book BTC-USD --depth 5 # top of book, both sides
|
|
255
|
+
moshcode crypto assets # every supported pair
|
|
256
|
+
moshcode crypto open BTC # the shareable page
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Pairs are accepted as `BTC`, `BTC-USD`, `BTC/USD` or `BTCUSD` — a bare asset
|
|
260
|
+
resolves to that asset's USD pair. `--json` gives the raw response, `/crypto …`
|
|
261
|
+
is the same facade in the pit, and `MOSHCODE_ADVISOR_URL` points it elsewhere.
|
|
262
|
+
|
|
263
|
+
Unlike a `ticker` report, this is a **live venue read**, not a stored snapshot —
|
|
264
|
+
there are no transcripts, no filings and no signals behind a crypto pair, and
|
|
265
|
+
the failure mode runs the other way: the price is accurate to the second and
|
|
266
|
+
stale by the time you act on it. Every response stamps when it was fetched.
|
|
267
|
+
|
|
268
|
+
The technical score counts venue-local liquidity, so it is **not comparable** to
|
|
269
|
+
an equity's score, and each response ships the `caveats` that say so. Prices are
|
|
270
|
+
Alpaca's US venue alone and can differ materially from other exchanges. Research
|
|
271
|
+
aid, not advice — and like `ticker`, nothing under `crypto` can place an order.
|
|
272
|
+
|
|
273
|
+
### Social posting from the pit
|
|
274
|
+
|
|
275
|
+
The pit can hand a prepared post to Bluesky or Nostr without storing either
|
|
276
|
+
account's credentials in MoshCode:
|
|
277
|
+
|
|
278
|
+
```text
|
|
279
|
+
/socials
|
|
280
|
+
/post bsky "shipped it 🤘"
|
|
281
|
+
/post nostr "shipped it 🤘"
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
Bluesky opens its official compose intent. Nostr opens the MoshCode composer,
|
|
285
|
+
connects to a NIP-07 browser signer (or a NIP-46 bunker through
|
|
286
|
+
[`window.nostr.js`](https://github.com/fiatjaf/window.nostr.js)), signs a kind-1
|
|
287
|
+
event, and publishes it to the displayed relays. Both flows leave the final
|
|
288
|
+
confirmation in the browser. If the pit is remote or headless, `/post` prints
|
|
289
|
+
the composer URL instead.
|
|
290
|
+
|
|
214
291
|
## Browser terminal (`moshcode console`)
|
|
215
292
|
|
|
216
293
|
A real terminal in the browser — arrow keys, history, full-screen TUIs — because
|
|
@@ -287,6 +364,43 @@ from and five to rotate. Porkbun's API access is off by default and enabled
|
|
|
287
364
|
per-domain — and its documentation tools work with no keys at all, which is a
|
|
288
365
|
sensible way to try the server before trusting it with DNS writes.
|
|
289
366
|
|
|
367
|
+
## Claude Code plugins
|
|
368
|
+
|
|
369
|
+
MoshCode publishes its own plugin marketplace, so the pit's slash commands work
|
|
370
|
+
inside your engine too:
|
|
371
|
+
|
|
372
|
+
```sh
|
|
373
|
+
moshcode plugin list # what the marketplace ships, and who can take it
|
|
374
|
+
moshcode plugin install # add the marketplace + install `ticker`
|
|
375
|
+
moshcode plugin install crypto # add the marketplace + install `crypto`
|
|
376
|
+
moshcode plugin remove ticker # take it back off
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
`ticker@moshcode` adds `/ticker`, `/signals`, `/research`, `/lookup`,
|
|
380
|
+
`/reports`, and `/discover` — the same advis0r research surface described above,
|
|
381
|
+
driven from inside a coding session.
|
|
382
|
+
|
|
383
|
+
`crypto@moshcode` adds `/crypto`, `/quote`, `/book`, `/bars`, `/spark`,
|
|
384
|
+
`/pairs`, and `/coin`. It ships separately because it is a different surface,
|
|
385
|
+
not a mode of the first: live venue reads instead of stored snapshots, and a
|
|
386
|
+
score that must not be ranked against an equity's.
|
|
387
|
+
|
|
388
|
+
Restart the engine after installing either; a newly installed plugin is not live
|
|
389
|
+
in a session that is already running.
|
|
390
|
+
|
|
391
|
+
The equivalent by hand:
|
|
392
|
+
|
|
393
|
+
```sh
|
|
394
|
+
claude plugin marketplace add moshcoder/moshcode
|
|
395
|
+
claude plugin install ticker@moshcode
|
|
396
|
+
claude plugin install crypto@moshcode
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
Claude Code is currently the only engine with a plugin primitive. The others are
|
|
400
|
+
reported as skipped with a reason, the same way they are for skills, rather than
|
|
401
|
+
being left out of the summary. `MOSHCODE_PLUGIN_SOURCE=.` installs from a local
|
|
402
|
+
checkout instead of GitHub, which is how you try an unreleased plugin.
|
|
403
|
+
|
|
290
404
|
## Upgrade everything
|
|
291
405
|
|
|
292
406
|
```sh
|
package/bin/moshcode.mjs
CHANGED
|
@@ -19,7 +19,10 @@ import { tradeArgs, tradeUsage } from "../src/trade.mjs";
|
|
|
19
19
|
import { runUpgrade } from "../src/upgrade.mjs";
|
|
20
20
|
import { selfUpdateCommand } from "../src/selfupdate.mjs";
|
|
21
21
|
import { describeUninstall, uninstallPlan } from "../src/uninstall.mjs";
|
|
22
|
-
import { mcpCommand, skillCommand } from "../src/integrations.mjs";
|
|
22
|
+
import { mcpCommand, pluginCommand, skillCommand } from "../src/integrations.mjs";
|
|
23
|
+
import { tickerCommand } from "../src/advisor.mjs";
|
|
24
|
+
import { cryptoCommand } from "../src/crypto.mjs";
|
|
25
|
+
import { canOpenBrowser, openBrowser } from "../src/open-url.mjs";
|
|
23
26
|
import { locate, tilde } from "../src/pwd.mjs";
|
|
24
27
|
import { createPrd, listPrds, authoringPrompt } from "../src/prd.mjs";
|
|
25
28
|
import { loginAuto, whoami, logout } from "../src/auth.mjs";
|
|
@@ -344,6 +347,25 @@ async function main() {
|
|
|
344
347
|
propagateExit(r.code, r.signal);
|
|
345
348
|
return;
|
|
346
349
|
}
|
|
350
|
+
if (cmd === "ticker" || cmd === "advisor") {
|
|
351
|
+
const code = await tickerCommand(rest, {
|
|
352
|
+
openUrl: (url) => canOpenBrowser() && openBrowser(url),
|
|
353
|
+
});
|
|
354
|
+
if (code) process.exitCode = code;
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
if (cmd === "crypto" || cmd === "coins") {
|
|
358
|
+
const code = await cryptoCommand(rest, {
|
|
359
|
+
openUrl: (url) => canOpenBrowser() && openBrowser(url),
|
|
360
|
+
});
|
|
361
|
+
if (code) process.exitCode = code;
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
if (cmd === "plugin" || cmd === "plugins") {
|
|
365
|
+
const code = await pluginCommand(rest);
|
|
366
|
+
if (code) process.exitCode = code;
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
347
369
|
if (cmd === "console") {
|
|
348
370
|
const code = await consoleCommand(rest);
|
|
349
371
|
if (code) process.exitCode = code;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "moshcode",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.27.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "moshcode — a metal wrapper for coding engines and native UGig/CoinPay workflow CLIs, with OpenPRD and moshscript",
|
|
6
6
|
"repository": {
|
|
@@ -25,6 +25,8 @@
|
|
|
25
25
|
"src",
|
|
26
26
|
"examples",
|
|
27
27
|
"prd",
|
|
28
|
+
".claude-plugin",
|
|
29
|
+
"plugins",
|
|
28
30
|
"install.sh",
|
|
29
31
|
"README.md"
|
|
30
32
|
],
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://anthropic.com/claude-code/plugin.schema.json",
|
|
3
|
+
"name": "crypto",
|
|
4
|
+
"description": "Crypto market data slash commands backed by advis0r.com: live prices, technical scores, order books, OHLCV history and sparklines across Alpaca's US crypto venue.",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "moshcoder",
|
|
8
|
+
"url": "https://moshcode.sh"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/moshcoder/moshcode#crypto",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": ["crypto", "bitcoin", "markets", "prices", "advis0r"]
|
|
13
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# crypto — market data in your engine 🤘
|
|
2
|
+
|
|
3
|
+
Slash commands backed by [advis0r.com](https://advis0r.com/api/crypto): live
|
|
4
|
+
prices, technical scores, order books, OHLCV history and multi-pair sparklines
|
|
5
|
+
across Alpaca's US crypto venue.
|
|
6
|
+
|
|
7
|
+
| command | what it does |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| `/crypto BTC` | price, technicals, score, supply, order book |
|
|
10
|
+
| `/quote ETH-USD` | latest trade and quote, with the spread in bps |
|
|
11
|
+
| `/book BTC-USD` | top of the order book, both sides |
|
|
12
|
+
| `/bars ETH-USD` | historical OHLCV at any supported timeframe |
|
|
13
|
+
| `/spark BTC ETH SOL` | recent moves across pairs, ranked |
|
|
14
|
+
| `/pairs` | every supported pair, grouped by quote asset |
|
|
15
|
+
| `/coin bitcoin` | asset name → `BTC/USD` |
|
|
16
|
+
|
|
17
|
+
Pairs are accepted as `BTC`, `BTC-USD`, `BTC/USD` or `BTCUSD`. A bare asset
|
|
18
|
+
resolves to that asset's USD pair.
|
|
19
|
+
|
|
20
|
+
## Install
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
moshcode plugin install crypto
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Or straight from Claude Code:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
claude plugin marketplace add moshcoder/moshcode
|
|
30
|
+
claude plugin install crypto@moshcode
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Restart the engine afterwards — a newly installed plugin is not live in a
|
|
34
|
+
session that is already running.
|
|
35
|
+
|
|
36
|
+
## How it works
|
|
37
|
+
|
|
38
|
+
Each command shells out to `moshcode crypto …`, which calls advis0r's public,
|
|
39
|
+
read-only API. No key, no login, no write routes. With `moshcode` absent, every
|
|
40
|
+
command falls back to `curl` against the same endpoints.
|
|
41
|
+
|
|
42
|
+
Point the commands at another instance with `MOSHCODE_ADVISOR_URL`.
|
|
43
|
+
|
|
44
|
+
## Why this is separate from `ticker`
|
|
45
|
+
|
|
46
|
+
They answer different questions from different data, and share only a hostname.
|
|
47
|
+
A `/ticker` report is a **stored snapshot** built from transcripts, SEC
|
|
48
|
+
fundamentals and extracted signals — its risk is a stale price read as a live
|
|
49
|
+
one. A `/crypto` report is a **live venue read** with no transcripts, no
|
|
50
|
+
filings and no signals — its risk is the opposite: a price that is accurate to
|
|
51
|
+
the second and stale by the time you act on it.
|
|
52
|
+
|
|
53
|
+
The scores are not comparable either. The crypto technical score counts
|
|
54
|
+
venue-local liquidity, so ranking a coin against an equity by score is
|
|
55
|
+
meaningless. Both surfaces ship their own `caveats`, and both commands are
|
|
56
|
+
instructed to print them.
|
|
57
|
+
|
|
58
|
+
## What this is not
|
|
59
|
+
|
|
60
|
+
A research aid, not advice. Prices are Alpaca's US crypto venue alone and can
|
|
61
|
+
differ materially from other exchanges. Crypto trades 24/7 with no circuit
|
|
62
|
+
breakers — there is no close, no premarket, and no halt.
|
|
63
|
+
|
|
64
|
+
Trading lives behind a different verb: `moshcode trade` wraps Alpaca, previews
|
|
65
|
+
orders by default, and requires an explicit `--submit`. Nothing in this plugin
|
|
66
|
+
can place an order.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Historical crypto OHLCV for one pair, at any supported timeframe.
|
|
3
|
+
argument-hint: <PAIR> [timeframe]
|
|
4
|
+
allowed-tools: Bash(moshcode crypto:*), Bash(curl -sS https://advis0r.com/api/crypto/:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task
|
|
8
|
+
|
|
9
|
+
Pull historical bars for `$ARGUMENTS`.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
moshcode crypto bars $ARGUMENTS --timeframe 1Day --limit 30 --json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Timeframes: `1Min`, `5Min`, `15Min`, `1Hour`, `1Day`, `1Week`. Add
|
|
16
|
+
`--start`/`--end` (ISO dates) to pin a window.
|
|
17
|
+
|
|
18
|
+
Fallback: `curl -sS "https://advis0r.com/api/crypto/bars?symbol=<PAIR>&timeframe=1Day&limit=30"`
|
|
19
|
+
|
|
20
|
+
## Reading the response
|
|
21
|
+
|
|
22
|
+
`bars` is keyed by canonical symbol (`"BTC/USD"`), each value an ascending array
|
|
23
|
+
of `{ timestamp, open, high, low, close, volume, vwap }`.
|
|
24
|
+
|
|
25
|
+
## Rules
|
|
26
|
+
|
|
27
|
+
- **`limit` is upstream's page size, not a cap on what returns.** The response
|
|
28
|
+
can hold more bars than you asked for. If you show a subset, say which subset
|
|
29
|
+
— "the 5 most recent of 17", never a silent truncation.
|
|
30
|
+
- Bars are ascending by time. Confirm the direction before calling a move.
|
|
31
|
+
- `volume` is base-asset units on Alpaca's US venue alone, not aggregate market
|
|
32
|
+
volume. Do not compare it to a CoinGecko or exchange-aggregate figure.
|
|
33
|
+
- Crypto bars are calendar-based and continuous — no gaps, no sessions, no
|
|
34
|
+
weekends. A "20-day" window here is not 20 trading sessions.
|
|
35
|
+
- End with the response's own `disclaimer`.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Top of the crypto order book, both sides, with the spread.
|
|
3
|
+
argument-hint: <PAIR>
|
|
4
|
+
allowed-tools: Bash(moshcode crypto:*), Bash(curl -sS https://advis0r.com/api/crypto/:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task
|
|
8
|
+
|
|
9
|
+
Show the order book for `$ARGUMENTS`.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
moshcode crypto book $ARGUMENTS --depth 10 --json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Fallback: `curl -sS "https://advis0r.com/api/crypto/orderbook?symbol=$ARGUMENTS&depth=10"`
|
|
16
|
+
|
|
17
|
+
## Reading the response
|
|
18
|
+
|
|
19
|
+
`orderbooks[]` each carry a `timestamp`, `bids[]` and `asks[]`, every level a
|
|
20
|
+
`{ price, size }`. Bids descend from the best bid; asks ascend from the best ask.
|
|
21
|
+
|
|
22
|
+
## Rules
|
|
23
|
+
|
|
24
|
+
- Report the spread in basis points, not just in dollars — a $50 spread means
|
|
25
|
+
something different on BTC than on ETH.
|
|
26
|
+
- **Size is depth on one venue, not the market.** Do not describe the book as
|
|
27
|
+
"the market's" depth, and do not extrapolate what a large order would fill at.
|
|
28
|
+
- A book is a snapshot of an instant. Timestamp it.
|
|
29
|
+
- If one side is much thinner than the other, say so plainly rather than
|
|
30
|
+
reading it as a directional signal — it is a liquidity observation.
|
|
31
|
+
- End with the response's own `disclaimer`.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Find a crypto pair by asset name (bitcoin → BTC/USD).
|
|
3
|
+
argument-hint: <asset name>
|
|
4
|
+
allowed-tools: Bash(moshcode crypto:*), Bash(curl -sS https://advis0r.com/api/crypto/:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task
|
|
8
|
+
|
|
9
|
+
Resolve `$ARGUMENTS` to a tradable pair.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
moshcode crypto lookup $ARGUMENTS --limit 10 --json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Fallback: `curl -sS "https://advis0r.com/api/crypto/lookup?q=<url-encoded>&limit=10"`
|
|
16
|
+
|
|
17
|
+
## Reading the response
|
|
18
|
+
|
|
19
|
+
`matches` is a list of `{ symbol, slug, base, quote, name }`.
|
|
20
|
+
|
|
21
|
+
## Rules
|
|
22
|
+
|
|
23
|
+
- One coin usually returns several pairs — `BTC/USD`, `BTC/USDC`, `BTC/USDT`.
|
|
24
|
+
Show them all and say which quote asset each settles in; default to the USD
|
|
25
|
+
pair unless the user asked otherwise.
|
|
26
|
+
- Watch for name collisions: a query can match a different coin whose name
|
|
27
|
+
merely contains the words ("bitcoin" also returns Bitcoin Cash). Say which
|
|
28
|
+
match is the one they meant.
|
|
29
|
+
- No match: say this venue lists no such pair, and do not invent a symbol. The
|
|
30
|
+
coin may exist and simply not be listed here — those are different answers.
|
|
31
|
+
- Offer `/crypto <PAIR>` for the match you land on.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Research one crypto pair — price, technicals, score, supply and order book.
|
|
3
|
+
argument-hint: <PAIR>
|
|
4
|
+
allowed-tools: Bash(moshcode crypto:*), Bash(curl -sS https://advis0r.com/api/crypto/:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task
|
|
8
|
+
|
|
9
|
+
Pull the full report for `$ARGUMENTS` and summarize it for the user.
|
|
10
|
+
|
|
11
|
+
Run:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
moshcode crypto $ARGUMENTS --json
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
If `moshcode` is not installed, fall back to the API directly:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
curl -sS "https://advis0r.com/api/crypto/report?symbol=$ARGUMENTS"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Pairs are accepted as `BTC`, `BTC-USD`, `BTC/USD` or `BTCUSD`. A bare asset
|
|
24
|
+
resolves to that asset's USD pair.
|
|
25
|
+
|
|
26
|
+
## Reading the response
|
|
27
|
+
|
|
28
|
+
- `snapshot` is the live read: `latestTrade`, `latestQuote` (bid/ask),
|
|
29
|
+
`dailyBar`, `prevDailyBar`, and a `change` against yesterday's close.
|
|
30
|
+
- `technical` holds sma / ema / rsi14 / macd / bollinger / atr14 /
|
|
31
|
+
`relativeVolume` / `momentum` / `trend` / `volatilityRegime`.
|
|
32
|
+
- `technicalScore.score` is 0–100 with a `breakdown`. It is **technical only** —
|
|
33
|
+
there is no thesis, no transcript and no filing behind a crypto pair.
|
|
34
|
+
- `fundamentals` is CoinGecko supply data: market cap, rank, circulating and max
|
|
35
|
+
supply, 24h volume, all-time high. It is absent for many pairs.
|
|
36
|
+
- `caveats` are per-response and specific. Read them before quoting the score.
|
|
37
|
+
|
|
38
|
+
## Rules
|
|
39
|
+
|
|
40
|
+
- **These prices are Alpaca's US crypto venue alone.** Say so. They can differ
|
|
41
|
+
materially from Coinbase, Binance, or an aggregate index.
|
|
42
|
+
- Crypto trades 24/7 with no circuit breakers and no market close. Never
|
|
43
|
+
describe a crypto price as "at the close" or "premarket".
|
|
44
|
+
- State `generatedAt` / `fetchedAt`. This is a live read, so it goes stale in
|
|
45
|
+
seconds, not days — the opposite failure mode from a stored `/ticker` report.
|
|
46
|
+
- The score's liquidity component counts venue-local volume only, so it is
|
|
47
|
+
**not comparable** to an equity's score from `/ticker`. Do not rank the two
|
|
48
|
+
against each other.
|
|
49
|
+
- End with the response's own `disclaimer`. This is research, not advice.
|
|
50
|
+
- Link the shareable page: `https://advis0r.com/crypto/<PAIR>`.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Every crypto pair advis0r can price, and which are trading.
|
|
3
|
+
allowed-tools: Bash(moshcode crypto:*), Bash(curl -sS https://advis0r.com/api/crypto/:*)
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Task
|
|
7
|
+
|
|
8
|
+
List the supported pairs.
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
moshcode crypto assets --json
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Fallback: `curl -sS "https://advis0r.com/api/crypto/assets"`
|
|
15
|
+
|
|
16
|
+
## Reading the response
|
|
17
|
+
|
|
18
|
+
`assets[]` are `{ symbol, slug, base, quote, name, status }`. `slug` is the
|
|
19
|
+
URL-safe spelling (`BTC-USD`) used in paths; `symbol` is canonical (`BTC/USD`).
|
|
20
|
+
`status` is `live` or `idle`.
|
|
21
|
+
|
|
22
|
+
## Rules
|
|
23
|
+
|
|
24
|
+
- Group by `quote` asset. The same coin priced in USD, USDT and BTC are three
|
|
25
|
+
different markets with three different liquidity profiles.
|
|
26
|
+
- **`idle` means listed but not currently printing trades** — it is not the same
|
|
27
|
+
as unsupported. Show idle pairs, marked, rather than filtering them out.
|
|
28
|
+
- If the user was looking for a specific coin, use `/coin <name>` instead of
|
|
29
|
+
scanning this list for them.
|
|
30
|
+
- This is the coverage of one venue, not of crypto. A coin missing here is
|
|
31
|
+
missing *from Alpaca's US venue*.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: The latest crypto trade and quote, with the bid/ask spread.
|
|
3
|
+
argument-hint: <PAIR>
|
|
4
|
+
allowed-tools: Bash(moshcode crypto:*), Bash(curl -sS https://advis0r.com/api/crypto/:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task
|
|
8
|
+
|
|
9
|
+
Get the current quote for `$ARGUMENTS`.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
moshcode crypto quote $ARGUMENTS --json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Fallback: `curl -sS "https://advis0r.com/api/crypto/quote?symbol=$ARGUMENTS"`
|
|
16
|
+
|
|
17
|
+
## Reading the response
|
|
18
|
+
|
|
19
|
+
`quotes[]` each carry `latestTrade` (price, size, timestamp), `latestQuote`
|
|
20
|
+
(bidPrice/bidSize/askPrice/askSize), `spread`, `spreadBps`, and `mid`.
|
|
21
|
+
|
|
22
|
+
## Rules
|
|
23
|
+
|
|
24
|
+
- Give the price at the precision the pair trades at. SHIB near $0.000006
|
|
25
|
+
rounded to two decimals is "$0.00", which is wrong, not concise.
|
|
26
|
+
- **`spreadBps` is the cost of crossing.** A wide spread means thin liquidity on
|
|
27
|
+
this venue — report it alongside the price rather than burying it.
|
|
28
|
+
- `latestTrade.timestamp` and `latestQuote.timestamp` can differ. If the last
|
|
29
|
+
trade is old, the mid is a quote, not evidence of a trade at that level.
|
|
30
|
+
- Prices are Alpaca's US crypto venue and trade 24/7 — never "at the close".
|
|
31
|
+
- End with the response's own `disclaimer`.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Compare recent moves across several crypto pairs at once.
|
|
3
|
+
argument-hint: <PAIR> [PAIR…]
|
|
4
|
+
allowed-tools: Bash(moshcode crypto:*), Bash(curl -sS https://advis0r.com/api/crypto/:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task
|
|
8
|
+
|
|
9
|
+
Compare recent price action across `$ARGUMENTS`.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
moshcode crypto spark $ARGUMENTS --period 24h --json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
`--period` is `24h` or `7d`. Up to 20 pairs per call. With no pairs given, ask
|
|
16
|
+
which ones — or offer the majors (BTC, ETH, SOL).
|
|
17
|
+
|
|
18
|
+
Fallback: `curl -sS "https://advis0r.com/api/crypto/sparklines?symbols=BTC-USD,ETH-USD&period=24h"`
|
|
19
|
+
|
|
20
|
+
## Reading the response
|
|
21
|
+
|
|
22
|
+
`series` is keyed by canonical symbol, each with `points[]` (closes, ascending),
|
|
23
|
+
`first`, `last`, `changePercent`, and the `start`/`end` of the window.
|
|
24
|
+
|
|
25
|
+
## Rules
|
|
26
|
+
|
|
27
|
+
- Lead with `changePercent` per pair and rank them — that is the question a
|
|
28
|
+
multi-pair call is asking.
|
|
29
|
+
- **Each series is scaled to itself.** A dramatic-looking shape on one pair and
|
|
30
|
+
a flat one on another can be the same percentage move; compare the numbers,
|
|
31
|
+
not the shapes.
|
|
32
|
+
- Name the window (`start` → `end`) and the period. "Up 5%" over 24h and over 7d
|
|
33
|
+
are different claims.
|
|
34
|
+
- Do not extrapolate a trend from 24 points, and do not call a direction
|
|
35
|
+
"momentum" without the technicals to back it — `/crypto <PAIR>` has those.
|
|
36
|
+
- End with the response's own `disclaimer`.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://anthropic.com/claude-code/plugin.schema.json",
|
|
3
|
+
"name": "ticker",
|
|
4
|
+
"description": "Equity research slash commands backed by advis0r.com: scored reports, extracted signals, transcript search, company-name lookup, and ranked watchlists.",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "moshcoder",
|
|
8
|
+
"url": "https://moshcode.sh"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/moshcoder/moshcode#ticker",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": ["stocks", "equity", "research", "markets", "advis0r"]
|
|
13
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# ticker — equity research in your engine 🤘
|
|
2
|
+
|
|
3
|
+
Slash commands backed by [advis0r.com](https://advis0r.com/api): scored research
|
|
4
|
+
reports, extracted signals with sources, transcript search, company-name lookup,
|
|
5
|
+
and ranked watchlists.
|
|
6
|
+
|
|
7
|
+
| command | what it does |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| `/ticker NVDA` | score, technicals, fundamentals, thesis, signals, sources |
|
|
10
|
+
| `/signals AAPL` | what was actually said, quoted and sourced |
|
|
11
|
+
| `/research data center` | full-text search across every indexed transcript |
|
|
12
|
+
| `/lookup rivian` | company name → `RIVN` |
|
|
13
|
+
| `/reports` | every stored report, best score first |
|
|
14
|
+
| `/discover fusion` | a ranked watchlist for a topic (slow) |
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
moshcode plugin install
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Or straight from Claude Code:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
claude plugin marketplace add moshcoder/moshcode
|
|
26
|
+
claude plugin install ticker@moshcode
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Restart the engine afterwards — a newly installed plugin is not live in a
|
|
30
|
+
session that is already running.
|
|
31
|
+
|
|
32
|
+
## How it works
|
|
33
|
+
|
|
34
|
+
Each command shells out to `moshcode ticker …`, which calls advis0r's public,
|
|
35
|
+
read-only API. No key, no login, no write routes. With `moshcode` absent, every
|
|
36
|
+
command falls back to `curl` against the same endpoints.
|
|
37
|
+
|
|
38
|
+
Point the commands at another instance with `MOSHCODE_ADVISOR_URL`.
|
|
39
|
+
|
|
40
|
+
## What this is not
|
|
41
|
+
|
|
42
|
+
A research aid, not advice. Reports are **stored snapshots** — every response
|
|
43
|
+
carries `reportGeneratedAt`, and every command is instructed to print it, because
|
|
44
|
+
a stale price presented as a live one is the one failure mode that actually costs
|
|
45
|
+
someone money. Scores marked `offline` come from deterministic rules, not a model.
|
|
46
|
+
|
|
47
|
+
Trading lives behind a different verb: `moshcode trade` wraps Alpaca, previews
|
|
48
|
+
orders by default, and requires an explicit `--submit`. Nothing in this plugin
|
|
49
|
+
can place an order.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Build a ranked watchlist for a topic (slow — it analyzes each candidate).
|
|
3
|
+
argument-hint: "[topic]"
|
|
4
|
+
allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task
|
|
8
|
+
|
|
9
|
+
Rank candidates for `$ARGUMENTS` (no topic → the default watchlist).
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
moshcode ticker discover $ARGUMENTS --limit 10 --json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Fallback: `curl -sS --max-time 180 "https://advis0r.com/api/discover?topic=<url-encoded>&provider=offline&horizon=2&limit=10"`
|
|
16
|
+
|
|
17
|
+
**This route runs an analysis per candidate and can take minutes.** Tell the
|
|
18
|
+
user it is working before you start, and do not retry on a timeout — re-running
|
|
19
|
+
it costs the same minutes again.
|
|
20
|
+
|
|
21
|
+
## Reading the response
|
|
22
|
+
|
|
23
|
+
`candidates` is ranked, each with `rank`, `ticker`, `companyName`, `lastPrice`,
|
|
24
|
+
`overallScore`, `confidence`, `classification`, `thesis`, `primaryCatalyst`,
|
|
25
|
+
`mainRisk`, `independentConfirmation`, plus liquidity fields
|
|
26
|
+
(`bidAskSpreadPercent`, `avgVolume`, `float`, `marketCap`).
|
|
27
|
+
|
|
28
|
+
## Rules
|
|
29
|
+
|
|
30
|
+
- Lead with `rank`, `ticker`, `overallScore`, and `classification`.
|
|
31
|
+
- **Print `mainRisk` next to every thesis.** A ranked list that shows only the
|
|
32
|
+
bull case is a pitch, not research.
|
|
33
|
+
- `provider: offline` means these scores are deterministic rules, not a model.
|
|
34
|
+
Say which provider produced the ranking.
|
|
35
|
+
- Flag illiquidity: a wide `bidAskSpreadPercent` or thin `avgVolume` matters
|
|
36
|
+
more than the score for anything small-cap.
|
|
37
|
+
- End with the response's own `disclaimer`.
|