@bankr/cli 0.3.38 → 0.3.43

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
@@ -1,198 +1,90 @@
1
1
  # @bankr/cli
2
2
 
3
- Official CLI for the [Bankr](https://bankr.bot) AI agent platform. Interact with the Bankr AI agent directly from your terminal.
3
+ Official CLI for the [Bankr](https://bankr.bot) AI agent platform. Prompt the Bankr agent, manage your wallet, launch tokens and claim their fees, and use the Bankr LLM gateway from your terminal.
4
4
 
5
- ## Installation
6
-
7
- ```bash
8
- npm install -g @bankr/cli
9
- ```
5
+ The full command reference is at [docs.bankr.bot/cli](https://docs.bankr.bot/cli), and every command takes `--help`.
10
6
 
11
- ## Quick Start
12
-
13
- A [Bankr Club subscription](https://bankr.bot) or LLM credits (Max Mode) is required to use the agent. There is no free tier.
7
+ ## Installation
14
8
 
15
9
  ```bash
16
- # Authenticate with your API key
17
- bankr login
10
+ npm install -g @bankr/cli # or: bun install -g @bankr/cli
18
11
 
19
- # Send a prompt
20
- bankr agent "what's trending on base?"
21
-
22
- # Or use the shorthand (no subcommand)
23
- bankr "what is the price of ETH?"
12
+ # Later: update with whichever package manager installed it
13
+ bankr update
24
14
  ```
25
15
 
26
- ## Commands
27
-
28
- ### Authentication
16
+ ## Log in
29
17
 
30
18
  ```bash
31
- # Log in (interactive menu)
19
+ # Interactive: sign in with email, open bankr.bot to create a key, or paste one
32
20
  bankr login
33
21
 
34
- # Log in with email (interactive — prompts for OTP and key options)
35
- bankr login email
22
+ # Headless email login, for scripts and agents
23
+ bankr login email you@example.com # step 1: send a one-time code
24
+ bankr login email you@example.com --code 123456 # step 2: verify and create an API key (new accounts get a wallet)
36
25
 
37
- # Log in with email (headless two-step, for scripts and agents):
38
- bankr login email user@example.com # Step 1: send OTP
39
- bankr login email user@example.com --code 123456 \ # Step 2: verify + complete
40
- --accept-terms --key-name "My Key" --read-write --llm
41
-
42
- # Log in directly with an API key (non-interactive)
26
+ # An existing bk_... key from bankr.bot/api-keys (checked against the API before it's saved)
43
27
  bankr login --api-key bk_YOUR_KEY
44
28
 
45
- # Log in with a separate LLM gateway key
46
- bankr login --api-key bk_YOUR_KEY --llm-key YOUR_LLM_KEY
47
-
48
- # Print the dashboard URL without opening a browser (non-interactive)
49
- bankr login --url
50
-
51
- # Log in with a custom API URL
52
- bankr login --api-url https://api.bankr.bot
29
+ # Sign-In with Ethereum, for headless agents
30
+ bankr login siwe --private-key 0xYOUR_PRIVATE_KEY
53
31
 
54
- # Show current auth info and validate connection
32
+ # Show the key in use, check the connection, and list your account details
55
33
  bankr whoami
56
-
57
- # Clear stored credentials
58
- bankr logout
59
34
  ```
60
35
 
61
- Accounts with two-factor authentication enabled get a browser step during `bankr login email`: the CLI prints (and, when interactive, opens) an approval link on bankr.bot, you verify with your passkey there, and the CLI continues once it sees the approval. The link is valid for five minutes; in a headless run, pass it along to whoever holds the passkey. The approval also covers the rest of that login for five minutes, so if you linger on the key-name prompts past that you'll get a second link. If it expires, or you'd rather skip the hop, generate a key at [bankr.bot/api-keys](https://bankr.bot/api-keys) and use `bankr login --api-key`.
36
+ - Completing a headless email login (`--code` or `--ni`) or a SIWE login accepts the [Terms of Service](https://bankr.bot/terms).
37
+ - Email-login keys get Wallet, Agent and Token Launch API access and can transact. Opt out with `--no-wallet-api`, `--no-agent-api`, `--no-token-launch` or `--read-only`, and add LLM gateway access with `--llm`. SIWE keys are read-only unless you pass `--read-write`.
38
+ - On an account with passkey MFA, email login prints a bankr.bot approval link (valid for five minutes) and continues once you approve it with your passkey.
39
+
40
+ ## Prompt the agent
62
41
 
63
- ### Prompts
42
+ Prompting the agent from the CLI needs a Bankr Club membership or LLM credits for Max Mode — see [Access](https://docs.bankr.bot/agent/access).
64
43
 
65
44
  ```bash
66
- # Send a prompt and wait for the response
45
+ bankr "what is the price of ETH?" # shorthand for bankr agent
67
46
  bankr agent "swap 10 USDC to ETH on base"
68
-
69
- # Shorthand — just pass the prompt directly
70
- bankr "what are the top holders of VIRTUAL?"
71
-
72
- # Continue the most recent conversation
73
- bankr agent --continue "and what about SOL?"
74
- bankr agent -c "compare them"
75
-
76
- # Continue a specific thread
47
+ bankr agent --continue "and what about SOL?" # continue the last thread (-c)
77
48
  bankr agent --thread thr_ABC123 "tell me more"
78
-
79
- # Max Mode: pick the model. Only the two newest releases of each line, and
80
- # only frontier / flagship / balanced lines, are accepted (the same set the
81
- # web picker shows); anything else is rejected and the error lists every
82
- # valid id.
83
- bankr agent --model claude-opus-5 "audit this contract"
84
- ```
85
-
86
- ### Token Launch
87
-
88
- ```bash
89
- # Interactive wizard — guides you through name, image, tweet, and fee recipient
90
- bankr launch
91
-
92
- # Non-interactive with all options
93
- bankr launch --name "TESTCOIN" --image "https://example.com/img.png" \
94
- --tweet "https://x.com/user/status/123" --fee "@vitalik" --fee-type x -y
95
-
96
- # Quick launch (name only, skip confirmation)
97
- bankr launch --name "TESTCOIN" -y
98
-
99
- # Pair the pool with a tokenized stock or another listed quote token instead of WETH (Robinhood Chain or Base)
100
- bankr launch quotes --chain robinhood # list the quote tokens you can pair with
101
- bankr launch --name "TESTCOIN" --chain robinhood --quote TSLA -y
102
- bankr launch --name "TESTCOIN" --chain robinhood --quote musebook -y
103
- bankr launch --name "TESTCOIN" --chain robinhood --quote BNKR -y # the Robinhood Chain BNKR contract
104
-
105
- # Fee recipient types: x, farcaster, ens, wallet
106
- bankr launch --name "TESTCOIN" --fee "vitalik.eth" --fee-type ens -y
107
- bankr launch --name "TESTCOIN" --fee "0x1234..." --fee-type wallet -y
108
- ```
109
-
110
- ### Job Management
111
-
112
- ```bash
113
- # Check the status of a job
114
- bankr agent status job_ABC123DEF456
115
-
116
- # Cancel a running job
49
+ bankr agent --model claude-opus-5 "audit this contract" # Max Mode, billed to LLM credits
50
+ echo 'buy $50 of ETH on base' | bankr agent prompt # piped prompt; single quotes keep $50 intact
51
+ bankr agent status job_ABC123DEF456 --wait # follow a job until it finishes
117
52
  bankr agent cancel job_ABC123DEF456
118
53
  ```
119
54
 
120
- ### LLM Gateway
121
-
122
- Launch Claude Code / OpenCode routed through the Bankr gateway:
123
-
124
- ```bash
125
- # Claude Code — `bankr claude` is a top-level alias for `bankr llm claude`
126
- # (auto-translates dotted model IDs to the Anthropic wire format)
127
- bankr claude --model claude-opus-5
128
-
129
- # Or use dotted form — bankr claude rewrites it to claude-opus-4-8
130
- bankr claude --model claude-opus-4.8
131
-
132
- # The [1m] suffix is optional via the gateway, but MUST be quoted if used
133
- # (zsh reads [1m] as a glob)
134
- bankr claude --model "claude-opus-5[1m]"
135
-
136
- # OpenCode (use the bankr/ prefix with the gateway-canonical dotted form)
137
- bankr llm opencode -m bankr/claude-opus-4.8
138
- ```
139
-
140
- Because `claude` is a command, it shadows the default prompt fallthrough:
141
- `bankr claude ...` launches Claude Code rather than prompting the agent. Use
142
- `bankr agent "..."` to send the agent a prompt starting with that word.
143
-
144
- **Claude Code model format**: Claude Code's `--model` flag expects Anthropic
145
- wire IDs, which use dashes rather than dots in the version (`claude-opus-5`,
146
- `claude-sonnet-5`, `claude-opus-4-8`, `claude-haiku-4-5`). If you pass the
147
- gateway-canonical dotted form (`claude-opus-4.8`), Claude Code silently falls
148
- back to its default — the flag appears honored but the real request is a
149
- different model.
150
-
151
- `bankr claude` translates dotted → dashed for you. If you use older
152
- versions of the CLI (or invoke `claude` directly via `ANTHROPIC_BASE_URL`),
153
- pass the dashed form explicitly.
154
-
155
- **1M context tier**: the gateway strips Claude Code's `[1m]` suffix and enables
156
- the 1M beta from the model's own context window, so it's **optional here** —
157
- `claude-opus-5` and `claude-opus-5[1m]` send an identical upstream request. If
158
- you do use it, **quote it**: in zsh (the macOS default) `[1m]` is a glob
159
- character class, so an unquoted id aborts with `zsh: no matches found:
160
- claude-opus-5[1m]` before the CLI ever runs. Bash passes it through literally,
161
- so the same command can work on one machine and fail on another.
55
+ The agent's progress lines print on stderr while it works, so they stay out of piped output.
162
56
 
163
- ### Configuration
164
-
165
- ```bash
166
- # View all config
167
- bankr config get
57
+ ## Commands
168
58
 
169
- # Get a specific value
170
- bankr config get apiUrl
59
+ | Command | What it does |
60
+ | -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
61
+ | `bankr wallet` | Portfolio, transfer, swap, sign and submit, without the agent |
62
+ | `bankr tokens` | Token search and info |
63
+ | `bankr launch` | Launch a token on Base, Robinhood Chain or Arbitrum; `bankr launch quotes` lists the tokens a launch can pair with |
64
+ | `bankr fees` | Creator-fee dashboard and claims, including `fees claim-wallet` with your own private key |
65
+ | `bankr llm`, `bankr claude` | LLM gateway: models, credits and auto top-up, coding-tool config, and Claude Code or OpenCode run through the gateway |
66
+ | `bankr project` | Your project page |
67
+ | `bankr club` | Bankr Club status, sign-up and cancellation |
68
+ | `bankr files` | Your wallet's file storage |
69
+ | `bankr x402`, `bankr webhooks` | Deploy and manage paid x402 endpoints and webhooks that trigger the agent |
70
+ | `bankr config`, `bankr sounds`, `bankr update`, `bankr logout` | Settings and maintenance |
171
71
 
172
- # Set a value
173
- bankr config set apiUrl https://api.bankr.bot
72
+ Add `--ni` (or set `BANKR_NOT_INTERACTIVE=1`) to any command to skip confirmations and fail fast instead of prompting.
174
73
 
175
- # Set a separate LLM gateway key
176
- bankr config set llmKey YOUR_LLM_KEY
177
- ```
74
+ The package also exports its API client (`submitPrompt`, `pollJob`, `getUserInfo`, `getBalances` and more) for Node.js — see [Programmatic usage](https://docs.bankr.bot/cli#programmatic-usage).
178
75
 
179
76
  ## Configuration
180
77
 
181
- Credentials are stored in `~/.bankr/config.json`.
182
-
183
- Environment variables override stored values:
184
-
185
- | Variable | Description |
186
- | --------------- | -------------------------------------------------------------------------- |
187
- | `BANKR_API_KEY` | API key (overrides stored key) |
188
- | `BANKR_API_URL` | API URL (default: `https://api.bankr.bot`) |
189
- | `BANKR_WEB_URL` | Web app URL for browser approval links (default: derived from the API URL) |
190
- | `BANKR_LLM_KEY` | LLM gateway key (falls back to `BANKR_API_KEY` if not set) |
191
- | `BANKR_LLM_URL` | LLM gateway URL (default: `https://llm.bankr.bot`) |
78
+ Credentials are stored in `~/.bankr/config.json`; use `--config <path>` or `BANKR_CONFIG` for another file. Environment variables override stored values:
192
79
 
193
- ## API Key
80
+ | Variable | Description |
81
+ | --------------- | ------------------------------------------------------ |
82
+ | `BANKR_API_KEY` | API key |
83
+ | `BANKR_LLM_KEY` | LLM gateway key (falls back to the API key if not set) |
84
+ | `BANKR_API_URL` | API URL (default: `https://api.bankr.bot`) |
85
+ | `BANKR_LLM_URL` | LLM gateway URL (default: `https://llm.bankr.bot`) |
194
86
 
195
- Generate an API key at [bankr.bot/api-keys](https://bankr.bot/api-keys). Keys start with `bk_` and require Agent API access to be enabled.
87
+ Read and set stored values with `bankr config get|set apiKey|apiUrl|llmKey|llmUrl`.
196
88
 
197
89
  ## License
198
90
 
package/dist/cli.js CHANGED
@@ -17,7 +17,7 @@ import { launchCommand } from "./commands/launch.js";
17
17
  import { launchQuotesCommand } from "./commands/launchQuotes.js";
18
18
  import { loginCommand } from "./commands/login.js";
19
19
  import { logoutCommand } from "./commands/logout.js";
20
- import { promptCommand } from "./commands/prompt.js";
20
+ import { MAX_MODE_MODEL_EXAMPLE, promptCommand } from "./commands/prompt.js";
21
21
  import { signCommand } from "./commands/sign.js";
22
22
  import { soundsDisableCommand, soundsEnableCommand, soundsInstallCommand, soundsListCommand, soundsMuteCommand, soundsSearchCommand, soundsStatusCommand, soundsTestCommand, soundsUnmuteCommand, soundsUseCommand, soundsVolumeCommand, } from "./commands/sounds.js";
23
23
  import { statusCommand } from "./commands/status.js";
@@ -27,7 +27,7 @@ import { whoamiCommand } from "./commands/whoami.js";
27
27
  import { tokensSearchCommand, tokensInfoCommand } from "./commands/tokens.js";
28
28
  import { x402InitCommand, x402AddCommand, x402ConfigureCommand, x402DeployCommand, x402ListCommand, x402PauseResumeCommand, x402DeleteCommand, x402RevenueCommand, x402EnvSetCommand, x402EnvListCommand, x402EnvUnsetCommand, x402SearchCommand, x402SchemaCommand, x402CallCommand, } from "./commands/x402.js";
29
29
  import { webhooksInitCommand, webhooksAddCommand, webhooksDeployCommand, webhooksListCommand, webhooksPauseResumeCommand, webhooksDeleteCommand, webhooksLogsCommand, webhooksEnvSetCommand, webhooksEnvListCommand, webhooksEnvUnsetCommand, } from "./commands/webhooks.js";
30
- import { profileViewCommand, profileCreateCommand, profileUpdateCommand, profileDeleteCommand, profileAddUpdateCommand, } from "./commands/profile.js";
30
+ import { projectViewCommand, projectCreateCommand, projectUpdateCommand, projectDeleteCommand, projectAddUpdateCommand, } from "./commands/project.js";
31
31
  import { filesListCommand, filesUploadCommand, filesDownloadCommand, filesMkdirCommand, filesRmCommand, filesStorageCommand, filesCatCommand, filesEditCommand, filesWriteCommand, filesSearchCommand, filesMvCommand, filesRenameCommand, filesInfoCommand, } from "./commands/files.js";
32
32
  import { clubStatusCommand, clubSignupCommand, clubCancelCommand, } from "./commands/club.js";
33
33
  import * as output from "./lib/output.js";
@@ -121,8 +121,8 @@ loginCmd
121
121
  .command("email [address]")
122
122
  .description("Sign in with email (sends verification code)")
123
123
  .option("--code <otp>", "OTP code (step 2 of headless login)")
124
- .option("--accept-terms", "Accept Terms of Service (skips prompt)")
125
- .option("--key-name <name>", "API key name (default: CLI)")
124
+ .option("--accept-terms", "Accept Terms of Service (skips prompt; implied by headless login)")
125
+ .option("--key-name <name>", "API key name (default: CLI-<date>-<time>)")
126
126
  .optionsGroup("API Permissions")
127
127
  .option("--read-only", "Restrict the API key to read operations")
128
128
  .option("--read-write", "Allow transactions (the default for new keys)")
@@ -300,10 +300,10 @@ walletSubmitCmd
300
300
  program.commandsGroup("Agent");
301
301
  const agentCmd = program
302
302
  .command("agent [text...]")
303
- .description("AI agent commands (prompt, status, cancel, profile, skills)")
303
+ .description("AI agent commands (prompt, status, cancel, skills)")
304
304
  .option("--thread <id>", "Continue a specific conversation thread")
305
305
  .option("-c, --continue", "Continue the most recent thread")
306
- .option("-m, --model <model>", "Use Max Mode with a specific model (e.g. claude-opus-4.6)")
306
+ .option("-m, --model <model>", `Use Max Mode with a specific model (e.g. ${MAX_MODE_MODEL_EXAMPLE})`)
307
307
  .action(async (text, opts, cmd) => {
308
308
  opts.model ?? (opts.model = cmd.parent?.opts()?.model);
309
309
  const joined = text.join(" ").trim();
@@ -321,7 +321,7 @@ agentCmd
321
321
  .description("Send a prompt to the Bankr AI agent")
322
322
  .option("--thread <id>", "Continue a specific conversation thread")
323
323
  .option("-c, --continue", "Continue the most recent thread")
324
- .option("-m, --model <model>", "Use Max Mode with a specific model (e.g. claude-opus-4.6)")
324
+ .option("-m, --model <model>", `Use Max Mode with a specific model (e.g. ${MAX_MODE_MODEL_EXAMPLE})`)
325
325
  .action(async (text, opts, cmd) => {
326
326
  // Commander hoists --model to the parent when both define it;
327
327
  // fall back to parent/grandparent opts so `bankr agent prompt --model` works.
@@ -332,6 +332,7 @@ agentCmd
332
332
  agentCmd
333
333
  .command("status <jobId>")
334
334
  .description("Check the status of a job")
335
+ .option("-w, --wait", "Follow the job until it finishes, printing progress as it arrives")
335
336
  .action(statusCommand);
336
337
  agentCmd
337
338
  .command("cancel <jobId>")
@@ -408,76 +409,6 @@ feesCmd
408
409
  .option("--all", "Claim all tokens without selection prompt")
409
410
  .option("-y, --yes", "Skip confirmation prompt")
410
411
  .action(feesClaimWalletCommand);
411
- // Profile under agent namespace
412
- const profileCmd = agentCmd
413
- .command("profile")
414
- .description("Manage your agent profile page")
415
- .option("--json", "Output raw JSON")
416
- .action(async (opts) => {
417
- await profileViewCommand({ json: opts.json });
418
- });
419
- profileCmd
420
- .command("create")
421
- .description("Create a new agent profile")
422
- .option("--name <name>", "Project name")
423
- .option("--description <text>", "Project description")
424
- .option("--token <address>", "Token contract address")
425
- .option("--image <url>", "Profile image URL")
426
- .option("--website <url>", "Project website URL")
427
- .option("--json", "Output raw JSON")
428
- .action(async (opts) => {
429
- await profileCreateCommand({
430
- name: opts.name,
431
- description: opts.description,
432
- token: opts.token,
433
- image: opts.image,
434
- website: opts.website,
435
- json: opts.json,
436
- });
437
- });
438
- profileCmd
439
- .command("update")
440
- .description("Update your agent profile")
441
- .option("--slug <slug>", "Project slug (required if multiple profiles)")
442
- .option("--name <name>", "Project name")
443
- .option("--description <text>", "Project description")
444
- .option("--token <address>", "Token contract address")
445
- .option("--image <url>", "Profile image URL")
446
- .option("--website <url>", "Project website URL")
447
- .option("--json", "Output raw JSON")
448
- .action(async (opts) => {
449
- await profileUpdateCommand({
450
- slug: opts.slug,
451
- name: opts.name,
452
- description: opts.description,
453
- token: opts.token,
454
- image: opts.image,
455
- website: opts.website,
456
- json: opts.json,
457
- });
458
- });
459
- profileCmd
460
- .command("delete")
461
- .description("Delete your agent profile")
462
- .option("--slug <slug>", "Project slug (required if multiple profiles)")
463
- .action(async (opts) => {
464
- await profileDeleteCommand({ slug: opts.slug });
465
- });
466
- profileCmd
467
- .command("add-update")
468
- .description("Add a project update to your profile")
469
- .option("--slug <slug>", "Project slug (required if multiple profiles)")
470
- .option("--title <title>", "Update title")
471
- .option("--content <text>", "Update content")
472
- .option("--json", "Output raw JSON")
473
- .action(async (opts) => {
474
- await profileAddUpdateCommand({
475
- slug: opts.slug,
476
- title: opts.title,
477
- content: opts.content,
478
- json: opts.json,
479
- });
480
- });
481
412
  program.commandsGroup("LLM");
482
413
  const llmCmd = program
483
414
  .command("llm")
@@ -637,76 +568,89 @@ program
637
568
  deprecatedCmd("cancel", "agent cancel");
638
569
  await cancelCommand(jobId);
639
570
  });
640
- const profileAliasCmd = program
641
- .command("profile", { hidden: true })
642
- .description("Deprecated: use `bankr agent profile` instead")
643
- .option("--json", "Output raw JSON")
644
- .action(async (opts) => {
645
- deprecatedCmd("profile", "agent profile");
646
- await profileViewCommand({ json: opts.json });
647
- });
648
- profileAliasCmd
649
- .command("create")
650
- .option("--name <name>", "Project name")
651
- .option("--description <text>", "Project description")
652
- .option("--token <address>", "Token contract address")
653
- .option("--image <url>", "Profile image URL")
654
- .option("--website <url>", "Project website URL")
655
- .option("--json", "Output raw JSON")
656
- .action(async (opts) => {
657
- deprecatedCmd("profile create", "agent profile create");
658
- await profileCreateCommand({
659
- name: opts.name,
660
- description: opts.description,
661
- token: opts.token,
662
- image: opts.image,
663
- website: opts.website,
664
- json: opts.json,
571
+ /**
572
+ * Registers the deprecated `profile` tree on `parent`. It runs the project
573
+ * commands; `oldPrefix` is the command path the warning tells users to drop.
574
+ */
575
+ function registerProfileAlias(parent, oldPrefix) {
576
+ const aliasCmd = parent
577
+ .command("profile", { hidden: true })
578
+ .description("Deprecated: use `bankr project` instead")
579
+ .option("--json", "Output raw JSON")
580
+ .action(async (opts) => {
581
+ deprecatedCmd(oldPrefix, "project");
582
+ await projectViewCommand({ json: opts.json });
665
583
  });
666
- });
667
- profileAliasCmd
668
- .command("update")
669
- .option("--slug <slug>", "Project slug")
670
- .option("--name <name>", "Project name")
671
- .option("--description <text>", "Project description")
672
- .option("--token <address>", "Token contract address")
673
- .option("--image <url>", "Profile image URL")
674
- .option("--website <url>", "Project website URL")
675
- .option("--json", "Output raw JSON")
676
- .action(async (opts) => {
677
- deprecatedCmd("profile update", "agent profile update");
678
- await profileUpdateCommand({
679
- slug: opts.slug,
680
- name: opts.name,
681
- description: opts.description,
682
- token: opts.token,
683
- image: opts.image,
684
- website: opts.website,
685
- json: opts.json,
584
+ aliasCmd
585
+ .command("create")
586
+ .description("Deprecated: use `bankr project create`")
587
+ .option("--name <name>", "Project name")
588
+ .option("--description <text>", "Project description")
589
+ .option("--token <address>", "Token contract address")
590
+ .option("--image <url>", "Project image URL")
591
+ .option("--website <url>", "Project website URL")
592
+ .option("--json", "Output raw JSON")
593
+ .action(async (opts) => {
594
+ deprecatedCmd(`${oldPrefix} create`, "project create");
595
+ await projectCreateCommand({
596
+ name: opts.name,
597
+ description: opts.description,
598
+ token: opts.token,
599
+ image: opts.image,
600
+ website: opts.website,
601
+ json: opts.json,
602
+ });
686
603
  });
687
- });
688
- profileAliasCmd
689
- .command("delete")
690
- .option("--slug <slug>", "Project slug")
691
- .action(async (opts) => {
692
- deprecatedCmd("profile delete", "agent profile delete");
693
- await profileDeleteCommand({ slug: opts.slug });
694
- });
695
- profileAliasCmd
696
- .command("add-update")
697
- .option("--slug <slug>", "Project slug")
698
- .option("--title <title>", "Update title")
699
- .option("--content <text>", "Update content")
700
- .option("--json", "Output raw JSON")
701
- .action(async (opts) => {
702
- deprecatedCmd("profile add-update", "agent profile add-update");
703
- await profileAddUpdateCommand({
704
- slug: opts.slug,
705
- title: opts.title,
706
- content: opts.content,
707
- json: opts.json,
604
+ aliasCmd
605
+ .command("update")
606
+ .description("Deprecated: use `bankr project update`")
607
+ .option("--slug <slug>", "Project slug")
608
+ .option("--name <name>", "Project name")
609
+ .option("--description <text>", "Project description")
610
+ .option("--token <address>", "Token contract address")
611
+ .option("--image <url>", "Project image URL")
612
+ .option("--website <url>", "Project website URL")
613
+ .option("--json", "Output raw JSON")
614
+ .action(async (opts) => {
615
+ deprecatedCmd(`${oldPrefix} update`, "project update");
616
+ await projectUpdateCommand({
617
+ slug: opts.slug,
618
+ name: opts.name,
619
+ description: opts.description,
620
+ token: opts.token,
621
+ image: opts.image,
622
+ website: opts.website,
623
+ json: opts.json,
624
+ });
708
625
  });
709
- });
626
+ aliasCmd
627
+ .command("delete")
628
+ .description("Deprecated: use `bankr project delete`")
629
+ .option("--slug <slug>", "Project slug")
630
+ .action(async (opts) => {
631
+ deprecatedCmd(`${oldPrefix} delete`, "project delete");
632
+ await projectDeleteCommand({ slug: opts.slug });
633
+ });
634
+ aliasCmd
635
+ .command("add-update")
636
+ .description("Deprecated: use `bankr project add-update`")
637
+ .option("--slug <slug>", "Project slug")
638
+ .option("--title <title>", "Update title")
639
+ .option("--content <text>", "Update content")
640
+ .option("--json", "Output raw JSON")
641
+ .action(async (opts) => {
642
+ deprecatedCmd(`${oldPrefix} add-update`, "project add-update");
643
+ await projectAddUpdateCommand({
644
+ slug: opts.slug,
645
+ title: opts.title,
646
+ content: opts.content,
647
+ json: opts.json,
648
+ });
649
+ });
650
+ }
651
+ // `bankr agent profile` (now `bankr project`) and the older top-level `bankr profile`.
652
+ registerProfileAlias(agentCmd, "agent profile");
653
+ registerProfileAlias(program, "profile");
710
654
  program
711
655
  .command("sign", { hidden: true })
712
656
  .description("Deprecated: use `bankr wallet sign` instead")
@@ -861,6 +805,76 @@ clubCmd
861
805
  .description("Cancel your Bankr Club subscription")
862
806
  .option("-y, --yes", "Skip confirmation prompt")
863
807
  .action(clubCancelCommand);
808
+ // ── Project Pages ─────────────────────────────────────────────
809
+ const projectCmd = program
810
+ .command("project")
811
+ .description("Manage your project page")
812
+ .option("--json", "Output raw JSON")
813
+ .action(async (opts) => {
814
+ await projectViewCommand({ json: opts.json });
815
+ });
816
+ projectCmd
817
+ .command("create")
818
+ .description("Create a new project")
819
+ .option("--name <name>", "Project name")
820
+ .option("--description <text>", "Project description")
821
+ .option("--token <address>", "Token contract address")
822
+ .option("--image <url>", "Project image URL")
823
+ .option("--website <url>", "Project website URL")
824
+ .option("--json", "Output raw JSON")
825
+ .action(async (opts) => {
826
+ await projectCreateCommand({
827
+ name: opts.name,
828
+ description: opts.description,
829
+ token: opts.token,
830
+ image: opts.image,
831
+ website: opts.website,
832
+ json: opts.json,
833
+ });
834
+ });
835
+ projectCmd
836
+ .command("update")
837
+ .description("Update your project")
838
+ .option("--slug <slug>", "Project slug (required if multiple projects)")
839
+ .option("--name <name>", "Project name")
840
+ .option("--description <text>", "Project description")
841
+ .option("--token <address>", "Token contract address")
842
+ .option("--image <url>", "Project image URL")
843
+ .option("--website <url>", "Project website URL")
844
+ .option("--json", "Output raw JSON")
845
+ .action(async (opts) => {
846
+ await projectUpdateCommand({
847
+ slug: opts.slug,
848
+ name: opts.name,
849
+ description: opts.description,
850
+ token: opts.token,
851
+ image: opts.image,
852
+ website: opts.website,
853
+ json: opts.json,
854
+ });
855
+ });
856
+ projectCmd
857
+ .command("delete")
858
+ .description("Delete your project")
859
+ .option("--slug <slug>", "Project slug (required if multiple projects)")
860
+ .action(async (opts) => {
861
+ await projectDeleteCommand({ slug: opts.slug });
862
+ });
863
+ projectCmd
864
+ .command("add-update")
865
+ .description("Add a project update to your project page")
866
+ .option("--slug <slug>", "Project slug (required if multiple projects)")
867
+ .option("--title <title>", "Update title")
868
+ .option("--content <text>", "Update content")
869
+ .option("--json", "Output raw JSON")
870
+ .action(async (opts) => {
871
+ await projectAddUpdateCommand({
872
+ slug: opts.slug,
873
+ title: opts.title,
874
+ content: opts.content,
875
+ json: opts.json,
876
+ });
877
+ });
864
878
  // ── x402 Endpoint Hosting ─────────────────────────────────────────────
865
879
  program.commandsGroup("Protocol");
866
880
  const x402Cmd = program
@@ -1059,7 +1073,7 @@ program
1059
1073
  .arguments("[text...]")
1060
1074
  .option("--thread <id>", "Continue a specific conversation thread")
1061
1075
  .option("-c, --continue", "Continue the most recent thread")
1062
- .option("-m, --model <model>", "Use Max Mode with a specific model (e.g. claude-opus-4.6)")
1076
+ .option("-m, --model <model>", `Use Max Mode with a specific model (e.g. ${MAX_MODE_MODEL_EXAMPLE})`)
1063
1077
  .action(async (text, opts) => {
1064
1078
  if (text.length === 0) {
1065
1079
  if (output.isNonInteractive()) {