Skip to content

feat(cli): iris pricing — the agent can tell a user where to sign up - #60

Open
mayoalexander wants to merge 1 commit into
mainfrom
feat/iris-pricing-verb
Open

feat(cli): iris pricing — the agent can tell a user where to sign up#60
mayoalexander wants to merge 1 commit into
mainfrom
feat/iris-pricing-verb

Conversation

@mayoalexander

Copy link
Copy Markdown

Adds iris pricing so the on-machine agent can close the loop it currently cannot.

IRIS's conversion event is an install — the agent is meant to hand over the dashboard, support and the plan once it is running. There was no pricing, plans, billing, account or subscribe verb; packages is operator tooling for editing the catalogue, not a way for a user to buy.

iris pricing                     plans for the current brand + the signup URL
iris pricing <slug>              one plan, its features and checkout URL
iris pricing --brand freelabel   the other brand
iris pricing --url               URL only, pipeable
iris pricing --json              for the agent to render itself

Two design decisions, both from live bugs

Works signed out. The user who needs this has just installed and has no account. Gating it behind auth fails exactly that person. Any catalogue read failure still prints the pricing URL.

Never prints the other brand's URL. heyiris.io/register and heyiris.io/pricing both shipped redirects to freelabel.net. An agent repeating that in a terminal is trusted more than a web page, and no analytics catches it.

The brand mapping is load-bearing

The catalogue stores iris and elon — not freelabel. The first version filtered on "freelabel", matched 0 of 24 live packages, and rendered an empty list. Caught by running the filter against the real catalogue instead of against what the word ought to have been.

Verification

Ran the filtering logic against all 24 live packages:

--brand iris       19 plans   cross-brand plans: 0   cross-brand URL: false
--brand freelabel   5 plans   cross-brand plans: 0   cross-brand URL: false

Not verified: yargs wiring, irisFetch at runtime, rendered output. A full bun install needs ~2GB and fails on node-gyp-build / tree-sitter-bash, so the assembled command could not be executed. Worth a smoke test on a machine that can build — the signed-out path especially, since that is the user it exists for.

Related: #183182

🤖 Generated with Claude Code

https://claude.ai/code/session_01WcmgfXD81U3cgNv9L2ZzfL

…sign up

IRIS's conversion event is an install: someone runs the CLI or the desktop app and the
agent is meant to hand them everything after that. It could not hand them the one thing
that closes the loop. There is no pricing, plans, billing, account or subscribe verb;
`packages` is operator tooling for EDITING the catalogue, not a way for a user to buy. A
user who installed the CLI had no in-terminal path to a plan — they had to already know a
URL nobody had told them.

Two properties, both learned from live bugs rather than chosen:

WORKS SIGNED OUT. The person who needs this most has just installed and has no account.
Gating pricing behind auth fails exactly the user it exists for. The catalogue read is
tolerant of any failure and still prints the pricing URL, because a URL with no table beats
a table nobody can reach.

NEVER PRINTS THE OTHER BRAND'S URL. heyiris.io/register and heyiris.io/pricing both shipped
redirects to freelabel.net — an IRIS visitor handed another company's page. An agent
repeating that in a terminal is trusted more than a web page is, and no analytics catches
it. Filtering is on each package's own brand field.

The brand mapping is not cosmetic. The catalogue's stored values are "iris" and "elon" —
NOT "freelabel". The first version of this file filtered on "freelabel" and matched zero of
the 24 live packages, rendering an empty list. Caught by running the filter against the
real catalogue rather than against what the word ought to have been. BRAND_VALUES maps the
user-facing word to the stored legacy one so the CLI's vocabulary stays honest without
asking the catalogue to migrate.

Verified against all 24 live packages: --brand iris returns 19, --brand freelabel returns
5, and neither leaks a plan or a URL belonging to the other. Not verified: yargs wiring,
irisFetch at runtime, and rendered output — a full `bun install` needs ~2GB and fails on a
native build script, so the assembled command could not be executed here.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WcmgfXD81U3cgNv9L2ZzfL
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant