moshcode 0.29.3 → 0.31.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/README.md CHANGED
@@ -376,14 +376,20 @@ moshcode plugin install crypto # add the marketplace + install `crypto`
376
376
  moshcode plugin remove stocks # take it back off
377
377
  ```
378
378
 
379
- `stocks@moshcode` adds `/stocks:stocks`, `/stocks:signals`, `/stocks:research`,
380
- `/stocks:lookup`, `/stocks:reports`, and `/stocks:discover` the same advis0r research surface described above,
381
- driven from inside a coding session.
379
+ The two plugins share the four names for the questions both markets answer, and
380
+ differ only where the markets do. Either one's `/…:help` prints its own list.
382
381
 
383
- `crypto@moshcode` adds `/crypto:crypto`, `/crypto:quote`, `/crypto:book`,
384
- `/crypto:bars`, `/crypto:spark`, `/crypto:pairs`, and `/crypto: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.
382
+ | | `stocks@moshcode` | `crypto@moshcode` |
383
+ |---|---|---|
384
+ | shared | `help` `report` `quote` `lookup` | `help` `report` `quote` `lookup` |
385
+ | its own | `signals` `research` `list` `discover` | `book` `bars` `spark` `pairs` |
386
+
387
+ So `/stocks:report NVDA` and `/crypto:report BTC` are the same question asked of
388
+ different markets, while `/stocks:signals` (what an executive said on a call)
389
+ and `/crypto:book` (live order book depth) have no counterpart on the other
390
+ side. They ship separately because they are different surfaces, not modes of one
391
+ another: stored snapshots versus live venue reads, and a crypto score that must
392
+ not be ranked against an equity's.
387
393
 
388
394
  Restart the engine after installing either; a newly installed plugin is not live
389
395
  in a session that is already running.
@@ -420,7 +426,7 @@ any marketplace". `moshcode plugin install` runs both steps for you.
420
426
  ### Upgrading from `ticker@moshcode`
421
427
 
422
428
  `stocks` was called `ticker` before v0.29.0. Installing the new id does **not**
423
- replace the old one — engines install plugins side by side, so `/stocks:stocks` would
429
+ replace the old one — engines install plugins side by side, so `/stocks:report` would
424
430
  come from two plugins at once. Remove the old id first:
425
431
 
426
432
  ```sh
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "moshcode",
3
- "version": "0.29.3",
3
+ "version": "0.31.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": {
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://anthropic.com/claude-code/plugin.schema.json",
3
3
  "name": "crypto",
4
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.2.0",
5
+ "version": "0.4.0",
6
6
  "author": {
7
7
  "name": "moshcoder",
8
8
  "url": "https://moshcode.sh"
@@ -6,13 +6,19 @@ across Alpaca's US crypto venue.
6
6
 
7
7
  | command | what it does |
8
8
  | --- | --- |
9
- | `/crypto:crypto BTC` | price, technicals, score, supply, order book |
9
+ | `/crypto:help` | this list, in the engine |
10
+ | `/crypto:report BTC` | price, technicals, score, supply, order book |
10
11
  | `/crypto:quote ETH-USD` | latest trade and quote, with the spread in bps |
12
+ | `/crypto:lookup bitcoin` | asset name → `BTC/USD` |
11
13
  | `/crypto:book BTC-USD` | top of the order book, both sides |
12
14
  | `/crypto:bars ETH-USD` | historical OHLCV at any supported timeframe |
13
15
  | `/crypto:spark BTC ETH SOL` | recent moves across pairs, ranked |
14
16
  | `/crypto:pairs` | every supported pair, grouped by quote asset |
15
- | `/crypto:coin bitcoin` | asset name → `BTC/USD` |
17
+
18
+ The first four names mean the same thing in `stocks@moshcode` — `help`,
19
+ `report`, `quote`, `lookup` — so knowing one plugin gets you half the other.
20
+ The rest are the parts a 24/7 venue has and equities do not: a live order book,
21
+ arbitrary timeframes, and cross-pair comparison.
16
22
 
17
23
  Pairs are accepted as `BTC`, `BTC-USD`, `BTC/USD` or `BTCUSD`. A bare asset
18
24
  resolves to that asset's USD pair.
@@ -50,9 +56,9 @@ Point the commands at another instance with `MOSHCODE_ADVISOR_URL`.
50
56
  ## Why this is separate from `stocks`
51
57
 
52
58
  They answer different questions from different data, and share only a hostname.
53
- A `/stocks:stocks` report is a **stored snapshot** built from transcripts, SEC
59
+ A `/stocks:report` report is a **stored snapshot** built from transcripts, SEC
54
60
  fundamentals and extracted signals — its risk is a stale price read as a live
55
- one. A `/crypto:crypto` report is a **live venue read** with no transcripts, no
61
+ one. A `/crypto:report` report is a **live venue read** with no transcripts, no
56
62
  filings and no signals — its risk is the opposite: a price that is accurate to
57
63
  the second and stale by the time you act on it.
58
64
 
@@ -0,0 +1,39 @@
1
+ ---
2
+ description: What the crypto plugin can do, and the exact command names to type.
3
+ ---
4
+
5
+ ## Task
6
+
7
+ List what this plugin provides. Do not call any tool — everything needed is
8
+ below. Render it as a compact table, then the notes.
9
+
10
+ | command | what it does |
11
+ | --- | --- |
12
+ | `/crypto:report <PAIR>` | the full report — price, technicals, score, supply, order book |
13
+ | `/crypto:quote <PAIR>` | the short answer — latest trade, bid/ask, spread |
14
+ | `/crypto:lookup <name>` | asset name → pair (`bitcoin` → `BTC/USD`) |
15
+ | `/crypto:book <PAIR>` | top of the order book, both sides |
16
+ | `/crypto:bars <PAIR>` | historical OHLCV at any supported timeframe |
17
+ | `/crypto:spark <PAIR…>` | recent moves across several pairs, ranked |
18
+ | `/crypto:pairs` | every supported pair, grouped by quote asset |
19
+
20
+ ## Notes to pass on
21
+
22
+ - Pairs are accepted as `BTC`, `BTC-USD`, `BTC/USD` or `BTCUSD`. A bare asset
23
+ resolves to that asset's USD pair.
24
+ - Every command name is namespaced `/crypto:…`. A bare `/report` is not a
25
+ command — Claude Code always prefixes plugin commands with the plugin name.
26
+ - `stocks@moshcode` is the sibling plugin, and the four shared names mean the
27
+ same thing there: `/stocks:report`, `/stocks:quote`, `/stocks:lookup`,
28
+ `/stocks:help`. It adds `/stocks:signals`, `/stocks:research`,
29
+ `/stocks:list` and `/stocks:discover` — transcript and filing work that
30
+ has no crypto equivalent.
31
+ - **These are live venue reads, not stored snapshots** — the opposite of the
32
+ stocks plugin. Prices are Alpaca's US crypto venue alone and can differ
33
+ materially from other exchanges. Crypto trades 24/7: no close, no halt.
34
+ - The crypto technical score counts venue-local liquidity, so it is **not
35
+ comparable** to a `/stocks:report` score. Do not rank the two against
36
+ each other.
37
+
38
+ If the user asked for something no command covers, say so rather than
39
+ improvising one that does not exist.
@@ -28,4 +28,4 @@ Fallback: `curl -sS "https://advis0r.com/api/crypto/lookup?q=<url-encoded>&limit
28
28
  match is the one they meant.
29
29
  - No match: say this venue lists no such pair, and do not invent a symbol. The
30
30
  coin may exist and simply not be listed here — those are different answers.
31
- - Offer `/crypto:crypto <PAIR>` for the match you land on.
31
+ - Offer `/crypto:report <PAIR>` for the match you land on.
@@ -25,7 +25,7 @@ URL-safe spelling (`BTC-USD`) used in paths; `symbol` is canonical (`BTC/USD`).
25
25
  different markets with three different liquidity profiles.
26
26
  - **`idle` means listed but not currently printing trades** — it is not the same
27
27
  as unsupported. Show idle pairs, marked, rather than filtering them out.
28
- - If the user was looking for a specific coin, use `/crypto:coin <name>` instead of
28
+ - If the user was looking for a specific coin, use `/crypto:lookup <name>` instead of
29
29
  scanning this list for them.
30
30
  - This is the coverage of one venue, not of crypto. A coin missing here is
31
31
  missing *from Alpaca's US venue*.
@@ -42,9 +42,9 @@ resolves to that asset's USD pair.
42
42
  - Crypto trades 24/7 with no circuit breakers and no market close. Never
43
43
  describe a crypto price as "at the close" or "premarket".
44
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:stocks` report.
45
+ seconds, not days — the opposite failure mode from a stored `/stocks:report` report.
46
46
  - The score's liquidity component counts venue-local volume only, so it is
47
- **not comparable** to an equity's score from `/stocks:stocks`. Do not rank the two
47
+ **not comparable** to an equity's score from `/stocks:report`. Do not rank the two
48
48
  against each other.
49
49
  - End with the response's own `disclaimer`. This is research, not advice.
50
50
  - Link the shareable page: `https://advis0r.com/crypto/<PAIR>`.
@@ -32,5 +32,5 @@ Fallback: `curl -sS "https://advis0r.com/api/crypto/sparklines?symbols=BTC-USD,E
32
32
  - Name the window (`start` → `end`) and the period. "Up 5%" over 24h and over 7d
33
33
  are different claims.
34
34
  - Do not extrapolate a trend from 24 points, and do not call a direction
35
- "momentum" without the technicals to back it — `/crypto:crypto <PAIR>` has those.
35
+ "momentum" without the technicals to back it — `/crypto:report <PAIR>` has those.
36
36
  - End with the response's own `disclaimer`.
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://anthropic.com/claude-code/plugin.schema.json",
3
3
  "name": "stocks",
4
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.2.0",
5
+ "version": "0.4.0",
6
6
  "author": {
7
7
  "name": "moshcoder",
8
8
  "url": "https://moshcode.sh"
@@ -6,13 +6,25 @@ and ranked watchlists.
6
6
 
7
7
  | command | what it does |
8
8
  | --- | --- |
9
- | `/stocks:stocks NVDA` | score, technicals, fundamentals, thesis, signals, sources |
9
+ | `/stocks:help` | this list, in the engine |
10
+ | `/stocks:report NVDA` | score, technicals, fundamentals, thesis, signals, sources |
11
+ | `/stocks:quote NVDA` | the short answer — price, score, staleness |
12
+ | `/stocks:lookup rivian` | company name → `RIVN` |
10
13
  | `/stocks:signals AAPL` | what was actually said, quoted and sourced |
11
14
  | `/stocks:research data center` | full-text search across every indexed transcript |
12
- | `/stocks:lookup rivian` | company name `RIVN` |
13
- | `/stocks:reports` | every stored report, best score first |
15
+ | `/stocks:list` | every ticker with a stored report, best score first |
14
16
  | `/stocks:discover fusion` | a ranked watchlist for a topic (slow) |
15
17
 
18
+ The first four names mean the same thing in `crypto@moshcode` — `help`,
19
+ `report`, `quote`, `lookup` — so knowing one plugin gets you half the other.
20
+ The rest are the parts equities have and crypto does not: transcripts, filings,
21
+ and a watchlist built from them.
22
+
23
+ `/stocks:report` takes a symbol and returns one write-up; `/stocks:list` takes
24
+ none and lists everything covered. `list` was called `reports` until v0.31.0 —
25
+ one letter from `report`, which made it a coin-flip at the prompt. The CLI has
26
+ accepted `moshcode stocks list` all along, so the two surfaces still agree.
27
+
16
28
  The `stocks:` prefix is not optional. Claude Code namespaces every plugin
17
29
  command as `/<plugin>:<command>` — always, not only when two plugins collide —
18
30
  so a bare `/stocks` answers `Unknown command`. Typing `/` and picking from the
@@ -24,11 +36,11 @@ command, not this plugin's.)
24
36
  ## Upgrading from `ticker@moshcode`
25
37
 
26
38
  This plugin used to be called `ticker`. Both it and its headline command were
27
- renamed so the name says which market it covers, now that `/crypto:crypto` sits beside
39
+ renamed so the name says which market it covers, now that `/crypto:report` sits beside
28
40
  it.
29
41
 
30
42
  Installing the new one does **not** replace the old one — engines install
31
- plugins side by side, so `/stocks:stocks` would come from two plugins at once. Remove
43
+ plugins side by side, so `/stocks:report` would come from two plugins at once. Remove
32
44
  the old id first:
33
45
 
34
46
  ```bash
@@ -0,0 +1,35 @@
1
+ ---
2
+ description: What the stocks plugin can do, and the exact command names to type.
3
+ ---
4
+
5
+ ## Task
6
+
7
+ List what this plugin provides. Do not call any tool — everything needed is
8
+ below. Render it as a compact table, then the notes.
9
+
10
+ | command | what it does |
11
+ | --- | --- |
12
+ | `/stocks:report <SYMBOL>` | the full research report — score, technicals, fundamentals, thesis, signals, sources |
13
+ | `/stocks:quote <SYMBOL>` | the short answer — price, score, staleness |
14
+ | `/stocks:lookup <company>` | company name → ticker (`rivian` → `RIVN`) |
15
+ | `/stocks:signals <SYMBOL>` | what was actually said, quoted and sourced |
16
+ | `/stocks:research <words…>` | full-text search across every indexed transcript |
17
+ | `/stocks:list` | every ticker with a stored report, best score first |
18
+ | `/stocks:discover <topic>` | a ranked watchlist for a topic (slow — analyzes each candidate) |
19
+
20
+ ## Notes to pass on
21
+
22
+ - `/stocks:report` takes a symbol and returns one write-up; `/stocks:list` takes
23
+ no symbol and lists everything covered. (`list` used to be called `reports`,
24
+ which sat one letter from `report` and was a coin-flip at the prompt.)
25
+ - Every command name is namespaced `/stocks:…`. A bare `/report` is not a
26
+ command — Claude Code always prefixes plugin commands with the plugin name.
27
+ - `crypto@moshcode` is the sibling plugin, and the four shared names mean the
28
+ same thing there: `/crypto:report`, `/crypto:quote`, `/crypto:lookup`,
29
+ `/crypto:help`. It adds `/crypto:book`, `/crypto:bars`, `/crypto:spark` and
30
+ `/crypto:pairs` for things equities do not have.
31
+ - Everything here is a **stored snapshot** from advis0r.com, read-only and
32
+ public. Nothing in this plugin can place an order — that is `moshcode trade`.
33
+
34
+ If the user asked for something no command covers, say so rather than
35
+ improvising one that does not exist.
@@ -1,15 +1,15 @@
1
1
  ---
2
- description: Every stored advis0r research report, best score first.
2
+ description: List every ticker with a stored report, best score first.
3
3
  argument-hint: "[--limit n] [--sort recent|score|ticker]"
4
4
  allowed-tools: Bash(moshcode stocks:*), Bash(curl -sS https://advis0r.com/api/:*)
5
5
  ---
6
6
 
7
7
  ## Task
8
8
 
9
- List the stored reports.
9
+ List every ticker advis0r has a stored report for.
10
10
 
11
11
  ```bash
12
- moshcode stocks reports $ARGUMENTS --json
12
+ moshcode stocks list $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 `/stocks:stocks <SYMBOL>` for anything worth a closer look.
29
+ - Offer `/stocks:report <SYMBOL>` for anything worth a closer look.
30
30
  - This is a coverage list, not a recommendation list. Rank order is score order.
@@ -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 `/stocks:stocks <SYMBOL>` for those.
25
+ - Mark which ones have a report, and offer `/stocks:report <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.
@@ -0,0 +1,37 @@
1
+ ---
2
+ description: The fast read on one ticker — price, score, and how stale the snapshot is.
3
+ argument-hint: <SYMBOL>
4
+ allowed-tools: Bash(moshcode stocks:*), Bash(curl -sS https://advis0r.com/api/:*)
5
+ ---
6
+
7
+ ## Task
8
+
9
+ Give the short answer on `$ARGUMENTS` — price and score, not the full write-up.
10
+
11
+ ```bash
12
+ moshcode stocks $ARGUMENTS --json
13
+ ```
14
+
15
+ Fallback: `curl -sS "https://advis0r.com/api/ticker?symbol=$ARGUMENTS"`
16
+
17
+ This is the same document `/stocks:report` reads. The difference is what you do
18
+ with it: four lines, not a report. If the user wants the thesis, signals and
19
+ sources, that is `/stocks:report`.
20
+
21
+ ## Reading the response
22
+
23
+ Take only: `lastPrice`, `priceTimestamp`, `delayed`, `overallScore`,
24
+ `classification`, and `companyName`.
25
+
26
+ ## Rules
27
+
28
+ - **Four lines at most.** Price, score with classification, staleness, and one
29
+ pointer to `/stocks:report <SYMBOL>` for the rest. Brevity is the feature.
30
+ - **This is a stored snapshot, not a live quote.** Print `priceTimestamp` and
31
+ say `delayed` when it is — a stale price presented as a live one is the one
32
+ failure here that costs money. Equities are not crypto: this number can be
33
+ days old.
34
+ - A low score is the answer, not a failure to answer. Say it plainly.
35
+ - Keep the response's own `disclaimer` if the user is acting on the number.
36
+ - If the symbol 400s with `didYouMean`, they typed a company name — re-run
37
+ against the suggestion and say you did, or point at `/stocks:lookup`.
package/src/plugins.mjs CHANGED
@@ -53,20 +53,41 @@ export function marketplaceSource(env = process.env) {
53
53
  export const PLUGINS = [
54
54
  {
55
55
  name: "stocks",
56
- version: "0.2.0",
56
+ version: "0.4.0",
57
57
  description: "equity research slash commands backed by advis0r.com",
58
- commands: ["/stocks:stocks", "/stocks:signals", "/stocks:research", "/stocks:lookup", "/stocks:reports", "/stocks:discover"],
59
- example: "/stocks:stocks NVDA",
58
+ // `list` rather than `reports`: one letter from `report` is a coin-flip at
59
+ // the prompt, and `index` would read as a market index in a stocks plugin.
60
+ // The CLI already accepts `moshcode stocks list` as an alias, so the two
61
+ // surfaces still agree.
62
+ commands: [
63
+ "/stocks:help", "/stocks:report", "/stocks:quote", "/stocks:lookup",
64
+ "/stocks:signals", "/stocks:research", "/stocks:list", "/stocks:discover",
65
+ ],
66
+ example: "/stocks:report NVDA",
60
67
  },
61
68
  {
62
69
  name: "crypto",
63
- version: "0.2.0",
70
+ version: "0.4.0",
64
71
  description: "crypto market data slash commands backed by advis0r.com",
65
- commands: ["/crypto:crypto", "/crypto:quote", "/crypto:book", "/crypto:bars", "/crypto:spark", "/crypto:pairs", "/crypto:coin"],
66
- example: "/crypto:crypto BTC",
72
+ commands: [
73
+ "/crypto:help", "/crypto:report", "/crypto:quote", "/crypto:lookup",
74
+ "/crypto:book", "/crypto:bars", "/crypto:spark", "/crypto:pairs",
75
+ ],
76
+ example: "/crypto:report BTC",
67
77
  },
68
78
  ];
69
79
 
80
+ /**
81
+ * Command names both plugins are expected to share.
82
+ *
83
+ * The two cover different markets, so they can never ship the same *set* — a
84
+ * crypto pair has no earnings transcript and an equity has no order book. What
85
+ * they can share is vocabulary: the same question is spelled the same way on
86
+ * both sides, so knowing one plugin means knowing half the other. A test holds
87
+ * this, because the natural drift is for one side to grow a synonym.
88
+ */
89
+ export const SHARED_COMMANDS = ["help", "report", "quote", "lookup"];
90
+
70
91
  /** How Claude Code namespaces a plugin's command. */
71
92
  export function pluginCommandName(plugin, file) {
72
93
  return `/${plugin}:${String(file).replace(/\.md$/, "")}`;