Releases: moshcoder/moshcode
Release list
v0.30.0 — one vocabulary
Breaking, in the plugins. Three commands were renamed, and both plugins gained a /help.
If you have either plugin installed
claude plugin update stocks@moshcode
claude plugin update crypto@moshcodeThen restart the engine. Until you do, your install keeps the old names — a moshcode upgrade does not carry plugin changes.
| was | now |
|---|---|
/stocks:stocks NVDA |
/stocks:report NVDA |
/crypto:crypto BTC |
/crypto:report BTC |
/crypto:coin bitcoin |
/crypto:lookup bitcoin |
One vocabulary across both
The two plugins had grown separate words for the same question — stocks and crypto for "the full report", coin and lookup for "name → symbol". Knowing one taught you nothing about the other. And the headline command in each was named after its own plugin, which is what produced the /crypto:crypto stutter.
They can't ship the same set — a crypto pair has no earnings transcript, an equity has no order book — but they can share vocabulary, and now do:
stocks@moshcode |
crypto@moshcode |
|
|---|---|---|
| shared | help report quote lookup |
help report quote lookup |
| its own | signals research reports discover |
book bars spark pairs |
Eight each, four spelled identically. /stocks:report NVDA and /crypto:report BTC are the same question asked of different markets.
New
/stocks:help, /crypto:help — each lists its own plugin's commands, no tool call needed. "Command not found" now has a signpost.
/stocks:quote NVDA — the four-line read: price, score, and how stale the snapshot is. It exists because moshcode stocks quote already worked in the CLI, so the plugin was the one surface where the word didn't — which is how it got found.
Guards
Two tests now hold the shape: every plugin must ship each shared name, and no command may repeat its own plugin's name — the rule /crypto:crypto would have failed.
Nothing in the moshcode CLI changed. moshcode stocks and moshcode crypto keep every verb and alias they had.
v0.29.3 — updates that reach you
A patch release. The moshcode half changes nothing you can see; the part that matters is in the plugins.
Both plugins are now 0.2.0
Claude Code only pulls a new copy of a plugin when the plugin's own version moves:
"If set, users only receive updates when you bump this field."
Both plugins had declared 0.1.0 since the day they were created — through every change since, including v0.29.2, which rewrote every command file to carry the namespaced /stocks:… and /crypto:… names. Existing installs kept serving the old copy, so the surface people were told to use was not the surface they had.
Both now declare 0.2.0, which makes those edits reachable:
claude plugin update stocks@moshcode
claude plugin update crypto@moshcodeRestart the engine afterwards. If you installed either plugin for the first time today, you already have the current content and this changes nothing for you.
moshcode upgrade does not do this. It updates the CLI and leaves installed plugins exactly where they were — which was not obvious anywhere, and is now in the README.
Stopping it happening again
The plugin version joins the catalog in src/plugins.mjs, right beside the command list an editor is already touching when they change a plugin, with the update mechanism spelled out above it. A test pins the catalog to the manifest that ships, and it was checked to fail when the two disagree rather than merely passing today.
v0.29.2 — commands you can actually type
A patch release: one documentation fix, and one rendering fix.
Plugin commands are namespaced, and now say so (#331)
Every plugin command was advertised bare — /crypto, /stocks, /signals — and none of those exist. Claude Code namespaces plugin commands as /<plugin>:<command> always, not only when two plugins collide, so the first thing anyone tried after installing was:
$ /crypto BTC
Unknown command: /crypto
The real names:
| plugin | commands |
|---|---|
stocks@moshcode |
/stocks:stocks /stocks:signals /stocks:research /stocks:lookup /stocks:reports /stocks:discover |
crypto@moshcode |
/crypto:crypto /crypto:quote /crypto:book /crypto:bars /crypto:spark /crypto:pairs /crypto:coin |
Typing / and picking from the menu inserts the right form for you.
Fixed in the catalog, both plugin READMEs, the main README, and the cross-references inside the command files themselves — those tell the model which command to offer next, so a bare name there sent you to the same dead end one step later.
Nothing inside the moshcode pit changed. There, the same research really is plain /stocks … and /crypto …, because those are moshcode's own commands rather than a plugin's. Having both spellings in one project is the genuinely confusing part, so the READMEs now call it out.
Also fixed: the invitation printed after installing appended a hardcoded NVDA to whatever came first in the command list — telling anyone who installed the crypto plugin to go try a stock. Each plugin now carries its own runnable example (/crypto:crypto BTC), and a test asserts it invokes a command that plugin actually ships.
Why it survived two releases: the drift test compared the advertised commands against bare filenames, so /crypto "matched" crypto.md and stayed green — nothing checked the name against how the file is actually invoked. It now derives the namespaced form.
A down move no longer reads as "$-186.36" (#330)
moshcode crypto <PAIR> signed the change by letting the price formatter carry the minus, which put it after the currency mark. An up move read +$186.36 and a down move read $-186.36 — the same quantity rendered two different shapes depending on direction. The sign now leads in both cases, the way the percentage already did.
Thanks to @clawedassistant26 for catching it. It has been wrong since /crypto shipped in v0.27.0.
v0.29.1 — installs that actually install
A patch fix, no surface changes.
moshcode plugin install now refreshes the marketplace
plugin install ran claude plugin marketplace add before every install, specifically so a machine that added the marketplace before a plugin existed would not fail with "not found in any marketplace". It could never have worked: add is a no-op for a marketplace already on disk, so the install read a stale local copy and failed with exactly that error.
✘ Failed to install plugin "stocks@moshcode": Plugin "stocks" not found in
marketplace "moshcode". Your local copy may be out of date…
This broke plugin install crypto in v0.27.0 and plugin install stocks in v0.29.0 — on every machine that had installed a plugin from this marketplace beforehand, which is all of them. The only machines it worked on were the ones that had never used the marketplace, and a fresh CI runner is always one of those, which is why nothing caught it.
marketplace update now runs between add and install. If you hit the failure on either of the last two releases, upgrade and re-run — no manual step needed:
moshcode upgrade
moshcode plugin install stocksDoing it by hand instead? The update line is the one to not skip:
claude plugin marketplace add moshcoder/moshcode
claude plugin marketplace update moshcode # `add` is a no-op if you already have it
claude plugin install stocks@moshcodeAll three READMEs carry that line now, with a sentence on why it is there.
v0.29.0 — finish the rename
Breaking. ticker@moshcode is no longer published. The plugin is stocks@moshcode, shipping the same six commands.
If you installed the old plugin, do both halves
Engines install plugins side by side, not over each other — installing stocks without removing ticker leaves /stocks coming from two plugins at once:
moshcode plugin remove ticker
moshcode plugin install stocksmoshcode plugin remove ticker keeps working for exactly that reason, even though moshcode plugin install ticker now refuses:
$ moshcode plugin install ticker
✗ "ticker" is now "stocks" — install stocks@moshcode
· already have the old one? moshcode plugin remove ticker first
Restart the engine afterwards; a newly installed plugin is not live in a session that is already running.
Why
v0.28.0 renamed the verb to stocks and deliberately left the plugin id alone, to spare existing installs a migration. That left ticker@moshcode serving a command called /stocks — the kind of mismatch that reads as a bug in the tool rather than a decision. This finishes the job: one migration now instead of an explanation forever.
Nothing else moved. Same six commands, same behaviour, same advis0r API:
| command | what it does |
|---|---|
/stocks NVDA |
score, technicals, fundamentals, thesis, signals, sources |
/signals AAPL |
what was actually said, quoted and sourced |
/research data center |
full-text search across every indexed transcript |
/lookup rivian |
company name → RIVN |
/reports |
every stored report, best score first |
/discover fusion |
a ranked watchlist for a topic |
crypto@moshcode is unaffected.
v0.28.0 — say which market
Breaking. moshcode ticker and /ticker are gone. The verb is moshcode stocks / /stocks.
moshcode stocks NVDA # score, technicals, fundamentals, thesis, signals
moshcode stocks lookup rivian # company name → RIVN
moshcode stocks signals AAPL # what was said, quoted and sourcedWhy
ticker named the argument, not the subject. That was fine while it was the only market verb — it stopped being fine the moment /crypto landed beside it in v0.27.0, because "ticker" describes a symbol both surfaces use and a market only one of them covers. stocks sits opposite crypto and says which is which.
A hard rename rather than an alias: two names for one verb is exactly the confusion the rename exists to remove, and ticker was two days old.
Migrating
Every verb, flag and behaviour is unchanged — only the command name moved. advisor remains an alias, so moshcode advisor NVDA never broke.
The old name is not silently dead. Both the CLI and the pit say where it went:
$ moshcode ticker NVDA
✗ unknown command "ticker" — did you mean stocks?
mosh ▸ /ticker NVDA
✗ unknown command "/ticker NVDA" — /ticker is now /stocks.
That comes from a RENAMED_COMMANDS table, deliberately not an alias table — the verb stays gone. Edit distance could never have produced the suggestion; ticker is six edits from stocks. A test asserts every entry names a command that exists and an old name that no longer dispatches.
What did not change
The word "ticker" stays wherever it means a symbol rather than the command — is not a ticker symbol, the tickers verb, --sort ticker, advis0r's own /api/ticker and /ticker/<SYMBOL> routes, and the ticker response field.
moshcode trade ticker AAPL is Alpaca's asset lookup, a different command, and is untouched.
The plugin keeps its id. ticker@moshcode still installs; its command is now /stocks. Renaming the plugin would have forced everyone who already installed it to uninstall and reinstall, which an id is not worth — existing installs pick /stocks up on the next plugin update.
v0.27.0 — the other market
One feature that adds a command rather than changes one, hence a minor bump.
moshcode crypto / /crypto — the other market
advis0r.com now serves crypto under /crypto/**, so the pit gets the sibling of ticker that surface implies.
moshcode crypto BTC # price, technicals, score, supply, order book
moshcode crypto lookup bitcoin # asset name → BTC/USD
moshcode crypto quote ETH-USD # latest trade + quote, spread in bps
moshcode crypto spark BTC ETH SOL # recent moves across pairs, ranked
moshcode crypto bars ETH --timeframe 1Hour
moshcode crypto book BTC-USD --depth 5A bare pair is the report, so the common case stays the shortest thing to type. Pairs are accepted as BTC, BTC-USD, BTC/USD or BTCUSD — a bare asset resolves to that asset's USD pair. --json on any verb returns the raw document. Every route used is public, read-only and unauthenticated, so there is no login verb, no write path, and no credential held.
A sibling, not a mode of ticker
The two share a hostname and nothing else. A ticker report is a stored snapshot built from transcripts, SEC fundamentals and extracted signals; its failure mode is a stale price read as a live one. A crypto report is a live venue read with no transcripts, no filings and no signals; its failure mode runs the other way — accurate to the second, and stale by the time you act on it. One code path would have meant one set of labels lying about one of them.
The scores are not comparable either: the crypto technical score counts venue-local liquidity, so ranking a coin against an equity by score is meaningless. Both surfaces ship their own caveats, and both renderers print them, alongside the API's own disclaimer.
Two things that would otherwise be quietly wrong
Precision. Prices render at the precision the pair actually trades at. A fixed two decimals renders half the index — SHIB near $0.000006 — as $0.00. Derived numbers are priced like the number beside them, so a $126.10 move on a $65,021.84 coin does not print as $126.0980.
--limit on bars. Upstream treats it as a page size over its own window, not a cap on what returns — --limit 5 came back with seventeen bars. The renderer honours the flag and says that it trimmed (5 × 1Hour · newest of 17) rather than breaking the promise silently or printing everything.
A second Claude Code plugin
moshcode plugin install cryptoInstalls crypto@moshcode, which provides /crypto, /quote, /book, /bars, /spark, /pairs and /coin inside the engine. It ships separately from ticker for the same reason the verbs are separate, and no command name collides between the two. The plugin frontmatter test now iterates the marketplace manifest rather than one hard-coded directory, so a plugin added later cannot ship unchecked.
Also in this release
v0.26.0 — the question before the trade
Two features that add commands rather than change them, hence a minor bump.
moshcode ticker / /ticker — the question before the trade
trade could quote a price and place an order. Nothing answered is this worth buying?
moshcode ticker NVDA # score, technicals, fundamentals, thesis, signals, sources
moshcode ticker lookup rivian # company name → RIVN
moshcode ticker signals AAPL # what was said, quoted and sourced
moshcode ticker search "data center"
moshcode ticker discover fusion # ranked watchlistA bare symbol is the report, so the common case stays the shortest thing to type. --json on any verb returns the raw document. Backed by advis0r.com — every route used is public, read-only and unauthenticated, so there is no login verb, no write path, and no credential held.
Two rules the renderers enforce structurally rather than merely document: a stored snapshot always prints its reportGeneratedAt, whether the price is delayed and which feed produced it — a stale price dressed as a live one is the failure mode here that costs money — and the API's own disclaimer travels with the data. A model-written thesis is labelled with its provider and model; a deterministic one is labelled offline.
A Claude Code plugin marketplace
moshcode fanned MCP servers and Agent Skills out across engines but published none of its own commands. It does now.
moshcode plugin installAdds the marketplace and installs ticker@moshcode, which provides /ticker, /signals, /research, /lookup, /reports and /discover inside the engine. The fan-out follows the same contract as skills: every engine appears in the summary, and the ones with no plugin primitive say so rather than being silently omitted.
Posting from the pit
/bluesky and /nostr post from the pit, with credentials resolved the way every other moshcode integration resolves them.
Note for anyone who installed the plugin already
install.sh serves the latest release tarball, not main. Before this release the installed binary reported unknown command "ticker", and the plugin's slash commands fell back to calling the API with curl — working, but skipping the rendering the verb exists to do. Update to get the real path:
curl -fsSL https://moshcoding.com/install.sh | sh -s -- updatev0.25.1 — a session, not a listing
/agents opencode and /agents privacycode now open a live session.
Both engines were wired to agentsView: ["agent", "list"], so /agents ran <engine> agent list — a one-shot, machine-readable command that prints every agent's permission config and exits straight back to the pit. On opencode 1.18.x that output is raw JSON, so it read as a wall of errors followed by a crash.
/agents promises to hand the terminal to a live session, so neither engine carries an agentsView any more: both fall through to --auto, which opens the TUI — where tab reaches the agent list anyway.
Both also declare their installer bin directories (~/.opencode/bin, ~/.privacycode/bin). Those installers only append to a shell rc, so the moshcode process that ran the installer reported the engine missing until the next shell — the same bridge kimi already had.
Full: #315
v0.25.0 — an answer a script can read
Account status as JSON
moshcode whoami --jsonprints the current session as machine-readable JSON instead of prose.- The
statusfield distinguishes the cases that matter to a script — logged in,not_logged_in,expired,unverified— rather than making one parse a sentence to find out which it is. - Shell completion offers the flag, and
moshcode help whoamidocuments it.
$ moshcode whoami --json
{
"status": "not_logged_in",
"verified": false,
"api": "https://app.moshcode.sh",
"user": null
}Packaging
binpaths are written the way npm normalizes them, so publishing no longer warns that the entry points were "invalid and removed". They never were — npm was rewriting them and shipping working binaries — but the warning read like a broken package.
Install is unchanged: curl -fsSL https://moshcoding.com/install.sh | sh, or npm i -g moshcode.