moshcode 0.26.0 → 0.28.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.
@@ -18,6 +18,18 @@
18
18
  },
19
19
  "homepage": "https://github.com/moshcoder/moshcode#ticker",
20
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"]
21
33
  }
22
34
  ]
23
35
  }
package/README.md CHANGED
@@ -46,7 +46,8 @@ 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 |
49
+ | `moshcode stocks` <br>`advisor` | tools | equity research from advis0r.com |
50
+ | `moshcode crypto` <br>`coins` | tools | crypto market data from advis0r.com |
50
51
  | `moshcode plugin` <br>`plugins` | extend | install moshcode's slash commands into Claude Code |
51
52
  | `moshcode commands` | script | list built-in moshscript commands |
52
53
  | `moshcode completion` | extend | print a shell completion script |
@@ -213,30 +214,61 @@ Alpaca's CLI has no confirmation prompts; `--submit` intentionally removes
213
214
  MoshCode's preview guard. Live trading additionally requires Alpaca's `--live`
214
215
  opt-in or corresponding environment setting.
215
216
 
216
- ### Equity research (`moshcode ticker`)
217
+ ### Equity research (`moshcode stocks`)
217
218
 
218
- Where `trade` is Alpaca's order book, `ticker` is the research desk:
219
+ Where `trade` is Alpaca's order book, `stocks` is the research desk:
219
220
  [advis0r.com](https://advis0r.com/api)'s public read-only API, rendered in the
220
221
  pit. No key, no login, no write routes, no binary to install:
221
222
 
222
223
  ```sh
223
- moshcode ticker NVDA # score, technicals, fundamentals, thesis, signals
224
- moshcode ticker lookup rivian # company name → RIVN
225
- moshcode ticker signals AAPL # what was said, quoted and sourced
226
- moshcode ticker search "data center" # across every indexed transcript
227
- moshcode ticker reports --limit 10 # the stored index, best score first
228
- moshcode ticker discover fusion # a ranked watchlist (slow — analyzes each candidate)
229
- moshcode ticker open NVDA # the shareable report page
224
+ moshcode stocks NVDA # score, technicals, fundamentals, thesis, signals
225
+ moshcode stocks lookup rivian # company name → RIVN
226
+ moshcode stocks signals AAPL # what was said, quoted and sourced
227
+ moshcode stocks search "data center" # across every indexed transcript
228
+ moshcode stocks reports --limit 10 # the stored index, best score first
229
+ moshcode stocks discover fusion # a ranked watchlist (slow — analyzes each candidate)
230
+ moshcode stocks open NVDA # the shareable report page
230
231
  ```
231
232
 
232
- Add `--json` to any of them for the raw response. The same facade is `/ticker …`
233
+ Add `--json` to any of them for the raw response. The same facade is `/stocks …`
233
234
  in the pit, and `MOSHCODE_ADVISOR_URL` points it at another instance.
234
235
 
235
236
  Reports are **stored snapshots**, not live quotes: every response carries
236
237
  `reportGeneratedAt` and every renderer prints it, alongside whether the price is
237
238
  delayed and which feed produced it. Scores labelled `offline` come from
238
239
  deterministic rules rather than a model. It is a research aid, not advice, and
239
- nothing under `ticker` can place an order.
240
+ nothing under `stocks` can place an order.
241
+
242
+ ### Crypto market data (`moshcode crypto`)
243
+
244
+ `crypto` is `stocks`'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 `stocks` 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 `stocks`, nothing under `crypto` can place an order.
240
272
 
241
273
  ### Social posting from the pit
242
274
 
@@ -340,19 +372,28 @@ inside your engine too:
340
372
  ```sh
341
373
  moshcode plugin list # what the marketplace ships, and who can take it
342
374
  moshcode plugin install # add the marketplace + install `ticker`
375
+ moshcode plugin install crypto # add the marketplace + install `crypto`
343
376
  moshcode plugin remove ticker # take it back off
344
377
  ```
345
378
 
346
- `ticker@moshcode` adds `/ticker`, `/signals`, `/research`, `/lookup`,
379
+ `ticker@moshcode` adds `/stocks`, `/signals`, `/research`, `/lookup`,
347
380
  `/reports`, and `/discover` — the same advis0r research surface described above,
348
- driven from inside a coding session. Restart the engine afterwards; a newly
349
- installed plugin is not live in a session that is already running.
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.
350
390
 
351
391
  The equivalent by hand:
352
392
 
353
393
  ```sh
354
394
  claude plugin marketplace add moshcoder/moshcode
355
395
  claude plugin install ticker@moshcode
396
+ claude plugin install crypto@moshcode
356
397
  ```
357
398
 
358
399
  Claude Code is currently the only engine with a plugin primitive. The others are
package/bin/moshcode.mjs CHANGED
@@ -20,7 +20,8 @@ import { runUpgrade } from "../src/upgrade.mjs";
20
20
  import { selfUpdateCommand } from "../src/selfupdate.mjs";
21
21
  import { describeUninstall, uninstallPlan } from "../src/uninstall.mjs";
22
22
  import { mcpCommand, pluginCommand, skillCommand } from "../src/integrations.mjs";
23
- import { tickerCommand } from "../src/advisor.mjs";
23
+ import { stocksCommand } from "../src/advisor.mjs";
24
+ import { cryptoCommand } from "../src/crypto.mjs";
24
25
  import { canOpenBrowser, openBrowser } from "../src/open-url.mjs";
25
26
  import { locate, tilde } from "../src/pwd.mjs";
26
27
  import { createPrd, listPrds, authoringPrompt } from "../src/prd.mjs";
@@ -346,8 +347,15 @@ async function main() {
346
347
  propagateExit(r.code, r.signal);
347
348
  return;
348
349
  }
349
- if (cmd === "ticker" || cmd === "advisor") {
350
- const code = await tickerCommand(rest, {
350
+ if (cmd === "stocks" || cmd === "advisor") {
351
+ const code = await stocksCommand(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, {
351
359
  openUrl: (url) => canOpenBrowser() && openBrowser(url),
352
360
  });
353
361
  if (code) process.exitCode = code;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "moshcode",
3
- "version": "0.26.0",
3
+ "version": "0.28.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": {
@@ -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 `stocks`
45
+
46
+ They answer different questions from different data, and share only a hostname.
47
+ A `/stocks` 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 `/stocks` report.
46
+ - The score's liquidity component counts venue-local volume only, so it is
47
+ **not comparable** to an equity's score from `/stocks`. 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`.
@@ -6,13 +6,19 @@ and ranked watchlists.
6
6
 
7
7
  | command | what it does |
8
8
  | --- | --- |
9
- | `/ticker NVDA` | score, technicals, fundamentals, thesis, signals, sources |
9
+ | `/stocks NVDA` | score, technicals, fundamentals, thesis, signals, sources |
10
10
  | `/signals AAPL` | what was actually said, quoted and sourced |
11
11
  | `/research data center` | full-text search across every indexed transcript |
12
12
  | `/lookup rivian` | company name → `RIVN` |
13
13
  | `/reports` | every stored report, best score first |
14
14
  | `/discover fusion` | a ranked watchlist for a topic (slow) |
15
15
 
16
+ The headline command is `/stocks`, not `/ticker` — it was renamed so the verb
17
+ says what it covers, now that `/crypto` sits beside it. **The plugin itself is
18
+ still `ticker@moshcode`**, deliberately: renaming the plugin would force
19
+ everyone who already installed it to uninstall and reinstall, and an id is not
20
+ worth that. Existing installs pick `/stocks` up on the next plugin update.
21
+
16
22
  ## Install
17
23
 
18
24
  ```bash
@@ -31,7 +37,7 @@ session that is already running.
31
37
 
32
38
  ## How it works
33
39
 
34
- Each command shells out to `moshcode ticker …`, which calls advis0r's public,
40
+ Each command shells out to `moshcode stocks …`, which calls advis0r's public,
35
41
  read-only API. No key, no login, no write routes. With `moshcode` absent, every
36
42
  command falls back to `curl` against the same endpoints.
37
43
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Build a ranked watchlist for a topic (slow — it analyzes each candidate).
3
3
  argument-hint: "[topic]"
4
- allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*)
4
+ allowed-tools: Bash(moshcode stocks:*), Bash(curl -sS https://advis0r.com/api/:*)
5
5
  ---
6
6
 
7
7
  ## Task
@@ -9,7 +9,7 @@ allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*
9
9
  Rank candidates for `$ARGUMENTS` (no topic → the default watchlist).
10
10
 
11
11
  ```bash
12
- moshcode ticker discover $ARGUMENTS --limit 10 --json
12
+ moshcode stocks discover $ARGUMENTS --limit 10 --json
13
13
  ```
14
14
 
15
15
  Fallback: `curl -sS --max-time 180 "https://advis0r.com/api/discover?topic=<url-encoded>&provider=offline&horizon=2&limit=10"`
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Find a ticker symbol by company name (rivian → RIVN).
3
3
  argument-hint: <company name>
4
- allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*)
4
+ allowed-tools: Bash(moshcode stocks:*), Bash(curl -sS https://advis0r.com/api/:*)
5
5
  ---
6
6
 
7
7
  ## Task
@@ -9,7 +9,7 @@ allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*
9
9
  Resolve `$ARGUMENTS` to a ticker symbol.
10
10
 
11
11
  ```bash
12
- moshcode ticker lookup $ARGUMENTS --limit 10 --json
12
+ moshcode stocks lookup $ARGUMENTS --limit 10 --json
13
13
  ```
14
14
 
15
15
  Fallback: `curl -sS "https://advis0r.com/api/lookup?q=<url-encoded>&limit=10"`
@@ -22,6 +22,6 @@ Fallback: `curl -sS "https://advis0r.com/api/lookup?q=<url-encoded>&limit=10"`
22
22
  ## Rules
23
23
 
24
24
  - Show every match with its exchange — "Delta" is an airline and a faucet company.
25
- - Mark which ones have a report, and offer `/ticker <SYMBOL>` for those.
25
+ - Mark which ones have a report, and offer `/stocks <SYMBOL>` for those.
26
26
  - One unambiguous match: say the symbol and go straight to offering the report.
27
27
  - No match: say the *directory* has no match, and do not invent a symbol.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Every stored advis0r research report, best score first.
3
3
  argument-hint: "[--limit n] [--sort recent|score|ticker]"
4
- allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*)
4
+ allowed-tools: Bash(moshcode stocks:*), Bash(curl -sS https://advis0r.com/api/:*)
5
5
  ---
6
6
 
7
7
  ## Task
@@ -9,7 +9,7 @@ allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*
9
9
  List the stored reports.
10
10
 
11
11
  ```bash
12
- moshcode ticker reports $ARGUMENTS --json
12
+ moshcode stocks reports $ARGUMENTS --json
13
13
  ```
14
14
 
15
15
  Fallback: `curl -sS "https://advis0r.com/api/reports?sort=score&limit=25"`
@@ -26,5 +26,5 @@ generatedAt }`, and `total` is how many exist.
26
26
  - **`generatedAt` per row, always.** These are snapshots taken at different
27
27
  times; a table that hides that reads as one consistent as-of date.
28
28
  - A row with no `aiProvider` was scored deterministically, not by a model.
29
- - Offer `/ticker <SYMBOL>` for anything worth a closer look.
29
+ - Offer `/stocks <SYMBOL>` for anything worth a closer look.
30
30
  - This is a coverage list, not a recommendation list. Rank order is score order.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Full-text search across every indexed earnings transcript and article.
3
3
  argument-hint: <words to search for>
4
- allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*)
4
+ allowed-tools: Bash(moshcode stocks:*), Bash(curl -sS https://advis0r.com/api/:*)
5
5
  ---
6
6
 
7
7
  ## Task
@@ -9,7 +9,7 @@ allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*
9
9
  Search the transcript index for `$ARGUMENTS`.
10
10
 
11
11
  ```bash
12
- moshcode ticker search $ARGUMENTS --limit 20 --json
12
+ moshcode stocks search $ARGUMENTS --limit 20 --json
13
13
  ```
14
14
 
15
15
  Fallback: `curl -sS "https://advis0r.com/api/search?q=<url-encoded>&limit=20"`
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: What was actually said about a ticker — extracted signals with quotes and sources.
3
3
  argument-hint: <SYMBOL>
4
- allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*)
4
+ allowed-tools: Bash(moshcode stocks:*), Bash(curl -sS https://advis0r.com/api/:*)
5
5
  ---
6
6
 
7
7
  ## Task
@@ -9,7 +9,7 @@ allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*
9
9
  List the extracted signals for `$ARGUMENTS`.
10
10
 
11
11
  ```bash
12
- moshcode ticker signals $ARGUMENTS --json
12
+ moshcode stocks signals $ARGUMENTS --json
13
13
  ```
14
14
 
15
15
  Fallback: `curl -sS "https://advis0r.com/api/signals?ticker=$ARGUMENTS"`
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Research one ticker — score, technicals, fundamentals, thesis, signals, and sources.
3
3
  argument-hint: <SYMBOL>
4
- allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*)
4
+ allowed-tools: Bash(moshcode stocks:*), Bash(curl -sS https://advis0r.com/api/:*)
5
5
  ---
6
6
 
7
7
  ## Task
@@ -11,7 +11,7 @@ Pull the stored research report for `$ARGUMENTS` and summarize it for the user.
11
11
  Run:
12
12
 
13
13
  ```bash
14
- moshcode ticker $ARGUMENTS --json
14
+ moshcode stocks $ARGUMENTS --json
15
15
  ```
16
16
 
17
17
  If `moshcode` is not installed, fall back to the API directly: