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,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Find a ticker symbol by company name (rivian → RIVN).
|
|
3
|
+
argument-hint: <company name>
|
|
4
|
+
allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task
|
|
8
|
+
|
|
9
|
+
Resolve `$ARGUMENTS` to a ticker symbol.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
moshcode ticker lookup $ARGUMENTS --limit 10 --json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Fallback: `curl -sS "https://advis0r.com/api/lookup?q=<url-encoded>&limit=10"`
|
|
16
|
+
|
|
17
|
+
## Reading the response
|
|
18
|
+
|
|
19
|
+
`matches` is a list of `{ symbol, name, exchange, hasReport }`.
|
|
20
|
+
`hasReport: true` means advis0r already has a stored research snapshot.
|
|
21
|
+
|
|
22
|
+
## Rules
|
|
23
|
+
|
|
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.
|
|
26
|
+
- One unambiguous match: say the symbol and go straight to offering the report.
|
|
27
|
+
- No match: say the *directory* has no match, and do not invent a symbol.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Every stored advis0r research report, best score first.
|
|
3
|
+
argument-hint: "[--limit n] [--sort recent|score|ticker]"
|
|
4
|
+
allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task
|
|
8
|
+
|
|
9
|
+
List the stored reports.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
moshcode ticker reports $ARGUMENTS --json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Fallback: `curl -sS "https://advis0r.com/api/reports?sort=score&limit=25"`
|
|
16
|
+
|
|
17
|
+
## Reading the response
|
|
18
|
+
|
|
19
|
+
`reports` is a list of `{ ticker, companyName, lastPrice, overallScore,
|
|
20
|
+
confidence, classification, aiProvider, aiModel, sourceCount, signalCount,
|
|
21
|
+
generatedAt }`, and `total` is how many exist.
|
|
22
|
+
|
|
23
|
+
## Rules
|
|
24
|
+
|
|
25
|
+
- Render as a table: ticker, score, classification, price, generated-at.
|
|
26
|
+
- **`generatedAt` per row, always.** These are snapshots taken at different
|
|
27
|
+
times; a table that hides that reads as one consistent as-of date.
|
|
28
|
+
- A row with no `aiProvider` was scored deterministically, not by a model.
|
|
29
|
+
- Offer `/ticker <SYMBOL>` for anything worth a closer look.
|
|
30
|
+
- This is a coverage list, not a recommendation list. Rank order is score order.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Full-text search across every indexed earnings transcript and article.
|
|
3
|
+
argument-hint: <words to search for>
|
|
4
|
+
allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task
|
|
8
|
+
|
|
9
|
+
Search the transcript index for `$ARGUMENTS`.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
moshcode ticker search $ARGUMENTS --limit 20 --json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Fallback: `curl -sS "https://advis0r.com/api/search?q=<url-encoded>&limit=20"`
|
|
16
|
+
|
|
17
|
+
## Reading the response
|
|
18
|
+
|
|
19
|
+
`results` is a list of segments: `text`, `speaker`, `ticker`, `event_date`.
|
|
20
|
+
The API tries full-text search first and falls back to a substring scan, so a
|
|
21
|
+
hit is a hit — but relevance is not ranked. Read before summarizing.
|
|
22
|
+
|
|
23
|
+
## Rules
|
|
24
|
+
|
|
25
|
+
- Cluster the hits by ticker and say which companies came up, with dates.
|
|
26
|
+
- Quote sparingly and attribute each quote to its speaker and ticker.
|
|
27
|
+
- If nothing matches, say the *index* has no match — this searches advis0r's
|
|
28
|
+
indexed corpus, not the whole web. Suggest `/lookup` if the query looks like
|
|
29
|
+
a company name.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: What was actually said about a ticker — extracted signals with quotes and sources.
|
|
3
|
+
argument-hint: <SYMBOL>
|
|
4
|
+
allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task
|
|
8
|
+
|
|
9
|
+
List the extracted signals for `$ARGUMENTS`.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
moshcode ticker signals $ARGUMENTS --json
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Fallback: `curl -sS "https://advis0r.com/api/signals?ticker=$ARGUMENTS"`
|
|
16
|
+
|
|
17
|
+
## Reading the response
|
|
18
|
+
|
|
19
|
+
Each signal carries `signal_type`, `direction` (positive/negative/neutral),
|
|
20
|
+
`strength`, `specificity`, `quote`, `event_date`, `speaker`, `speaker_title`,
|
|
21
|
+
`source_url`, and `source_tier`.
|
|
22
|
+
|
|
23
|
+
## Rules
|
|
24
|
+
|
|
25
|
+
- Group by direction and lead with the most recent. Note the positive/negative split.
|
|
26
|
+
- **Every claim keeps its `source_url`.** These are extracted quotes from
|
|
27
|
+
transcripts and articles — a signal repeated without its source is a rumor.
|
|
28
|
+
- `strength` and `specificity` are the extractor's confidence, not the market's.
|
|
29
|
+
A strong signal from a low `source_tier` is still a low-tier source; say so.
|
|
30
|
+
- End with the response's own `disclaimer`.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Research one ticker — score, technicals, fundamentals, thesis, signals, and sources.
|
|
3
|
+
argument-hint: <SYMBOL>
|
|
4
|
+
allowed-tools: Bash(moshcode ticker:*), Bash(curl -sS https://advis0r.com/api/:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Task
|
|
8
|
+
|
|
9
|
+
Pull the stored research report for `$ARGUMENTS` and summarize it for the user.
|
|
10
|
+
|
|
11
|
+
Run:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
moshcode ticker $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/ticker?symbol=$ARGUMENTS"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Reading the response
|
|
24
|
+
|
|
25
|
+
- `overallScore` (0–100), `confidence`, and `classification` are the headline. A
|
|
26
|
+
low score is a *finding*, not a failure to report.
|
|
27
|
+
- `aiAnalysis.analysis.thesis` is a hosted-model take; `analysis.thesis` is a
|
|
28
|
+
deterministic offline one. Say which you are quoting — they carry different weight.
|
|
29
|
+
- `technical` holds rsi14 / sma / macd / atr / relativeVolume.
|
|
30
|
+
- `facts` holds SEC fundamentals; `facts.source === "unavailable"` means the
|
|
31
|
+
fundamentals section is missing, not that the company has none.
|
|
32
|
+
- `signals` are extracted quotes with `direction` and `source_url`.
|
|
33
|
+
- `sources` are the documents behind them.
|
|
34
|
+
|
|
35
|
+
## Rules
|
|
36
|
+
|
|
37
|
+
- **`reportGeneratedAt` is when this snapshot was built.** State it. The price in
|
|
38
|
+
a stored report is not a live quote, and must never be presented as one.
|
|
39
|
+
- If the response is a 400 with `didYouMean`, the user typed a company name
|
|
40
|
+
rather than a symbol — re-run against the suggested symbol and say you did.
|
|
41
|
+
- End with the response's own `disclaimer`. This is research, not advice.
|
|
42
|
+
- Link the shareable report: `https://advis0r.com/ticker/<SYMBOL>`.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
openprd: "0.2"
|
|
3
|
+
id: "0008"
|
|
4
|
+
title: "Bring equity research into the pit, and ship the pit's slash commands as a plugin"
|
|
5
|
+
status: Draft
|
|
6
|
+
authors:
|
|
7
|
+
- anthony@profullstack.com
|
|
8
|
+
created: 2026-08-06
|
|
9
|
+
updated: 2026-08-06
|
|
10
|
+
repo: https://github.com/moshcoder/moshcode
|
|
11
|
+
discussion:
|
|
12
|
+
implementation:
|
|
13
|
+
tags:
|
|
14
|
+
- research
|
|
15
|
+
- plugins
|
|
16
|
+
- advis0r
|
|
17
|
+
supersedes:
|
|
18
|
+
superseded-by:
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Problem
|
|
22
|
+
|
|
23
|
+
`moshcode trade` can look up a quote and place an order. It cannot answer the
|
|
24
|
+
question that comes before either one — *is this worth buying?* Everything that
|
|
25
|
+
would inform that lives in [advis0r.com](https://advis0r.com/api): indexed
|
|
26
|
+
earnings transcripts and news, extracted signals with sources, SEC fundamentals,
|
|
27
|
+
technicals, and a composite score. Today that means leaving the pit for a
|
|
28
|
+
browser, and it means an agent working in a session has no path to it at all.
|
|
29
|
+
|
|
30
|
+
Two separate gaps, one cause:
|
|
31
|
+
|
|
32
|
+
1. **In the pit.** There is no research verb. `/trade quote AAPL` returns a
|
|
33
|
+
price and nothing about why it is that price.
|
|
34
|
+
2. **In the engine.** moshcode already fans MCP servers and Agent Skills out
|
|
35
|
+
across engines, but it publishes no commands of its own. A slash command that
|
|
36
|
+
exists at the mosh prompt does not exist inside Claude Code, and there is no
|
|
37
|
+
mechanism by which it could.
|
|
38
|
+
|
|
39
|
+
## Goals
|
|
40
|
+
|
|
41
|
+
- Research a ticker without leaving the terminal, in one short command.
|
|
42
|
+
- An agent mid-session can pull sourced evidence about a company rather than
|
|
43
|
+
recalling it from training data.
|
|
44
|
+
- moshcode's own slash commands become installable into the engines it drives,
|
|
45
|
+
through the engines' native plugin mechanism rather than a moshcode-specific one.
|
|
46
|
+
- A stored snapshot is never mistaken for a live quote.
|
|
47
|
+
|
|
48
|
+
## Non-Goals
|
|
49
|
+
|
|
50
|
+
- Placing orders. `trade` owns that, with its preview-by-default guard; nothing
|
|
51
|
+
under `ticker` writes anything anywhere.
|
|
52
|
+
- Reimplementing advis0r. Every route used is public, read-only, and unauthenticated;
|
|
53
|
+
scoring, ingestion, and analysis stay server-side.
|
|
54
|
+
- Authentication. The routes that need a sign-in (`/api/digest`,
|
|
55
|
+
`/api/report/regenerate`) are deliberately out of scope — adding credentials
|
|
56
|
+
would make this the first moshcode verb that holds one.
|
|
57
|
+
- A general plugin framework. One marketplace, one plugin, extended by adding a
|
|
58
|
+
directory.
|
|
59
|
+
|
|
60
|
+
## Users
|
|
61
|
+
|
|
62
|
+
- Someone in the pit deciding what to look at before opening the trading CLI.
|
|
63
|
+
- A coding agent asked about a company, which should cite indexed sources rather
|
|
64
|
+
than assert from memory.
|
|
65
|
+
|
|
66
|
+
## Requirements
|
|
67
|
+
|
|
68
|
+
- R1 [P0] `moshcode ticker <SYMBOL>` prints the stored report: score, confidence,
|
|
69
|
+
classification, technicals, fundamentals, thesis, recent signals, and sources.
|
|
70
|
+
- R2 [P0] Verbs for the rest of the surface: `signals`, `search`, `lookup`,
|
|
71
|
+
`reports`, `discover`, `tickers`, `stats`, `open`. A first argument that is not
|
|
72
|
+
a verb is a symbol; `report` is the unambiguous spelling for a symbol that
|
|
73
|
+
collides with one.
|
|
74
|
+
- R3 [P0] Every rendered report states `reportGeneratedAt`, whether the price is
|
|
75
|
+
delayed, and which feed produced it. A stored price must never render as a live one.
|
|
76
|
+
- R4 [P0] Every substantive response carries the API's own `disclaimer` through
|
|
77
|
+
to the output.
|
|
78
|
+
- R5 [P0] `--json` on any verb prints the raw response, so scripts and agents get
|
|
79
|
+
the full document rather than the rendered subset.
|
|
80
|
+
- R6 [P0] The same surface is `/ticker …` at the mosh prompt.
|
|
81
|
+
- R7 [P1] A non-symbol argument is refused with the `lookup` that resolves it,
|
|
82
|
+
and a 400 carrying `didYouMean` surfaces the suggestion.
|
|
83
|
+
- R8 [P0] `.claude-plugin/marketplace.json` publishes a `ticker` plugin providing
|
|
84
|
+
`/ticker`, `/signals`, `/research`, `/lookup`, `/reports`, `/discover`.
|
|
85
|
+
- R9 [P0] `moshcode plugin install` adds the marketplace and installs the plugin,
|
|
86
|
+
fanning out across engines and reporting every engine without a plugin
|
|
87
|
+
primitive as skipped — the same contract as 0003 R8 for skills.
|
|
88
|
+
- R10 [P1] `MOSHCODE_ADVISOR_URL` and `MOSHCODE_PLUGIN_SOURCE` redirect the API
|
|
89
|
+
and the marketplace, so both are testable against a checkout.
|
|
90
|
+
- R11 [P1] The verb table in the schema and the parser's own list are checked
|
|
91
|
+
against each other, so a verb cannot complete and then fail.
|
|
92
|
+
|
|
93
|
+
## UX Notes
|
|
94
|
+
|
|
95
|
+
`ticker` renders in-process rather than handing the terminal to a tool, because
|
|
96
|
+
unlike every other entry in `tools`, there is no advis0r binary — only an HTTP
|
|
97
|
+
API. That makes it the first moshcode verb that formats a remote response itself,
|
|
98
|
+
so the rendering rules matter more than usual:
|
|
99
|
+
|
|
100
|
+
- Direction is colour: acid for positive signals, red for negative.
|
|
101
|
+
- A model-written thesis is labelled with its provider and model; a
|
|
102
|
+
deterministic one is labelled `offline`. They carry different weight and must
|
|
103
|
+
not look alike.
|
|
104
|
+
- Optional sections (fundamentals, technicals, analysis) are genuinely absent
|
|
105
|
+
when SEC or the market feed rate-limits. A missing section degrades the report;
|
|
106
|
+
it never prevents one.
|
|
107
|
+
- `discover` ranks by analyzing each candidate and legitimately takes minutes. It
|
|
108
|
+
gets a longer timeout than the row-read routes, and says so up front.
|
|
109
|
+
|
|
110
|
+
## Success Metrics
|
|
111
|
+
|
|
112
|
+
- `/ticker <SYMBOL>` answers in one line of input, with sources.
|
|
113
|
+
- The plugin installs into Claude Code and its six commands appear, verified by
|
|
114
|
+
`claude plugin validate` and an end-to-end install.
|
|
115
|
+
- No rendered output anywhere presents a stored price as a live quote.
|
|
116
|
+
|
|
117
|
+
## Risks & Open Questions
|
|
118
|
+
|
|
119
|
+
- **Scored equity research one verb away from an order-placing CLI.** The
|
|
120
|
+
mitigation is structural rather than advisory: `ticker` has no write path,
|
|
121
|
+
`trade` keeps its preview guard, and the disclaimer travels with the data.
|
|
122
|
+
- **Snapshot staleness.** advis0r rebuilds a report when it is missing or when a
|
|
123
|
+
watchlist member asks; moshcode cannot trigger a rebuild without
|
|
124
|
+
authentication. Printing the generated-at stamp is the honest answer, not a
|
|
125
|
+
workaround.
|
|
126
|
+
- Single upstream: if advis0r is down, the verb is down. Acceptable — it is a
|
|
127
|
+
research aid, not a dependency of anything else in moshcode.
|
|
128
|
+
- Open: whether `plugin` should later fan out to other engines as they gain
|
|
129
|
+
plugin primitives, or stay Claude-specific. The plan structure already allows
|
|
130
|
+
the first without a rewrite.
|
package/prd/README.md
CHANGED
|
@@ -23,4 +23,5 @@ Start one with `moshcode prd "<idea>"` (TUI: `/prd`).
|
|
|
23
23
|
| [0005](0005-hosted-moshpit-resolver.md) | A hosted Moshpit resolver, for the devices that cannot run the bridge | Draft |
|
|
24
24
|
| [0006](0006-help.md) | --help | Draft |
|
|
25
25
|
| [0007](0007-profullstack-site-init.md) | Generate batteries-included Profullstack sites for Moshpit names | Draft |
|
|
26
|
+
| [0008](0008-ticker-research-and-plugin-marketplace.md) | Bring equity research into the pit, and ship the pit's slash commands as a plugin | Draft |
|
|
26
27
|
<!-- PRD-INDEX:END -->
|