跳到正文
Indiana
控制台
章节目录 / Indiana CLI

Indiana CLI

在终端配置作用域、完成浏览器授权、查询 App,并校验 Funnel / Paywall 文档。

CLI 0.3.5更新于

当前能力

Indiana CLI 使用控制台成员身份,通过浏览器审批取得指定 App 和环境的管理授权。当前公开下载版本为 0.3.5,要求 Node.js >=22。

已实现命令与边界
命令用途
config / profiles / context本地服务地址、profile 与 Org/App/环境选择
doctor / capabilities服务就绪检查与命令覆盖清单
update --check / update检查公开新版本并升级当前 CLI
login / whoami / auth status / logout浏览器登录、本设备授权状态与撤销
projects list读取已授权 App 的名称与环境,权限为 project.read
funnels validate / funnels diff本地 Funnel 文档校验与比较
offerings validate / offerings diff本地 Offering 层级、发布结构与比较
coupons / rewards / referral-programs已授权的目录、代码和生命周期管理;不包含订阅优惠执行
operations list / operations describe有限操作目录、所需权限与开放状态
customers / features / productsCustomer 与目录的读取和当前操作
offerings apply / paywalls apply / funnels apply复用控制台的远端编辑、发布与修订检查
paywalls validate / paywalls diff本地 Paywall 文档校验与比较

已实现命令与边界

  • config / profiles / context

    用途
    本地服务地址、profile 与 Org/App/环境选择
  • doctor / capabilities

    用途
    服务就绪检查与命令覆盖清单
  • update --check / update

    用途
    检查公开新版本并升级当前 CLI
  • login / whoami / auth status / logout

    用途
    浏览器登录、本设备授权状态与撤销
  • projects list

    用途
    读取已授权 App 的名称与环境,权限为 project.read
  • funnels validate / funnels diff

    用途
    本地 Funnel 文档校验与比较
  • offerings validate / offerings diff

    用途
    本地 Offering 层级、发布结构与比较
  • coupons / rewards / referral-programs

    用途
    已授权的目录、代码和生命周期管理;不包含订阅优惠执行
  • operations list / operations describe

    用途
    有限操作目录、所需权限与开放状态
  • customers / features / products

    用途
    Customer 与目录的读取和当前操作
  • offerings apply / paywalls apply / funnels apply

    用途
    复用控制台的远端编辑、发布与修订检查
  • paywalls validate / paywalls diff

    用途
    本地 Paywall 文档校验与比较
运行 operations list --available 查看当前服务开放的操作,用 operations describe 查看权限与输入。未开放操作返回 CAPABILITY_UNAVAILABLE(退出码 7);操作可用时仍需账号授权。

安装与配置

安装包由 Indiana 官网公开提供。macOS/Linux 推荐 curl 安装:依赖已包含在下载中,安装过程不调用 npm、不需要 npm 账号或 sudo。请先安装 Node.js 22 或更高版本;当前安装包不包含 Node.js 运行环境。

curl 支持 macOS arm64/x64,以及 Linux arm64/x64 的 glibc/musl 环境。脚本自动选择系统与架构并校验 SHA-256,默认安装到 ~/.local/bin/indiana,版本文件放在 ~/.local/share/indiana/releases;请按上例将 ~/.local/bin 加入 PATH。可用绝对路径 INDIANA_BIN_DIR、INDIANA_INSTALL_ROOT 修改位置。重复执行 curl 命令即可升级,脚本不会覆盖非本安装器管理的已有命令。安装包及校验记录见 https://tinker.cash/downloads/cli/portable.json。

也可以使用 npm,Windows 请使用这一方式。以下命令从官网下载 CLI,再从 npm 公共仓库安装依赖;不需要代码仓库权限或 npm 账号。

0.3.3 起支持更新检测和 indiana update。交互终端中的成功命令每天最多查询一次官网版本,有新版时提示升级;检查最长 1.5 秒,离线不影响命令结果。JSON、CI、非交互、help 和 version 不触发提示。INDIANA_NO_UPDATE_CHECK=1 可关闭自动检测,update --check --json 可主动检查。升级校验下载文件和安装后的版本,保留 curl 自定义目录或 npm 全局安装位置,以及配置和登录凭据。更新源固定为官网,不受 --server 影响。

已安装 0.3.2 或更早版本的用户,请先执行一次本页 curl 或 npm 安装命令升级到 0.3.3;之后即可收到新版本提示并直接运行 indiana update。源码或无法识别的安装方式会给出安装指引。

curl 默认安装的卸载:删除 ~/.local/bin/indiana 和 ~/.local/share/indiana;配置和登录凭据仍会保留。npm 安装的卸载:npm uninstall -g @indiana/cli;也可重新执行本页当前版本安装命令升级。npm 包元数据见 https://tinker.cash/downloads/cli/latest.json。公开安装不扩大账号权限,管理操作仍需登录并审批授权。

设置目标服务地址和已有 Organization/App 的 ID,运行 doctor 检查连接与登录配置。登录时选择所需的 Account、Organization、App 或 Environment 授权;context use 保存当前选择,访问范围由账号与审批结果决定。

config init 创建 indiana.config.json,不覆盖已有文件。作用域优先级为显式参数、项目配置、所选 profile;context use 更新已有项目配置,否则更新 profile。配置可提交,但不要写令牌或 SDK Key。用 INDIANA_CLI_CONFIG_DIR 更改用户配置目录。

terminal.shShell
curl -fsSL https://tinker.cash/install.sh | shexport PATH="$HOME/.local/bin:$PATH"indiana --versionindiana --helpindiana capabilities --only-supported --jsonindiana config init --server https://tinker.cashindiana profiles add work --server https://tinker.cashindiana profiles use workindiana context use --org <org-uuid> --app <app-uuid> --env sandboxindiana doctor --json
npm-install.shShell
npm install -g https://tinker.cash/downloads/cli/0.3.5/indiana-cli-0.3.5.tgz
update.shShell
indiana update --checkindiana updateindiana --version

登录与 App 授权

  • CLI 打开系统浏览器,以现有控制台账号登录并确认 OAuth 身份授权。
  • 浏览器再显示本设备请求的 App、环境和权限。核对设备说明与请求范围后确认。
  • CLI 等待审批通过,随后保存凭据。待审批请求有效期为 10 分钟,管理授权有效期为 30 天;刷新令牌不延长授权期限。

默认登录只请求 project.read。需要资源读取时,在登录命令中显式加入 --permissions project.read,coupons.read,rewards.read;写入另需对应的 customers.write、features.write、plans.write、platform.write 等资源权限。只请求本次工作所需权限,现有授权不会自动扩大。

登录需要浏览器,并临时监听本机 http://127.0.0.1:43187/callback。端口被占用时先释放端口再重试。

CLI 使用控制台账号登录,自动刷新已保存的登录凭据。账号、成员资格或设备授权失效后需重新登录。不支持用浏览器 Cookie、SDK Key 或 CI 服务账号登录。

terminal.shShell
indiana login --profile workindiana whoami --profile work --jsonindiana auth status --profile work --jsonindiana projects list --profile work --json

凭据与设备撤销

凭据默认写入系统凭据库,并绑定管理 origin、profile、issuer、客户端、用户和会话。系统凭据库不可用时明确失败,不会自动回退到文件。仅 POSIX 系统可显式选择 --credential-store file,目录权限为 0700、文件权限为 0600;Windows 不支持此文件模式。

whoami 返回服务端核验过的身份与授权范围,不显示 token。没有本地凭据时 logout 直接成功;有凭据时先确认服务端已撤销本设备的准确授权,再删除本地凭据。网络失败时保留凭据并报告撤销未完成。logout --local 仅清理本地,服务端授权仍可能有效。在所选管理服务的 /cli/sessions 页面可逐设备查看和撤销;撤销一台设备不影响其他设备。

terminal.shShell
indiana logout --profile work

调用业务操作

operations describe 的 requiredPermissions 列出完整权限依赖。Customer 创建还需要 plans.read、features.read;Feature 修改需要 plans.write、balances.read;Product 写入还需要 features.read、customers.read、balances.read、rewards.read。缺少依赖时在写入前明确拒绝,避免遗漏默认 Product 或既有引用。

customer-create.json 内容为 { "input": { "externalUserId": "user-42", "name": "Alex" } };更新文件为 { "requestId": "<新 UUID>", "patch": { "name": "Alex Updated" } }。App/环境从已审批选择解析,冲突值会被拒绝。设计操作继续使用控制台当前 DTO,并保留 revision、requestId 和发布校验。

查询参数使用可重复的 --query key=value,例如 features list --query id=<feature-uuid>。--file - 从 stdin 读取。call <operationId> --input envelope.json 接收 {params,query,body},只能选择目录内操作,不能指定任意 URL 或 RPC。--input 不与其他输入参数混用。

需要扩大权限时先 logout,再按本次操作所需资源重新 login --permissions;已有设备授权不会自动扩大。--out <新文件> 以 0600 权限保存 JSON,不覆盖已有文件;失败时删除本次未完成输出。写入失败不会自动重试。

terminal.shShell
indiana operations list --available --jsonindiana operations describe console.customers.post --jsonindiana customers list --jsonindiana customers create --file customer-create.json --jsonindiana customers get <customer-uuid> --jsonindiana customers update <customer-uuid> --file customer-update.json --jsonindiana features list --jsonindiana products list --timeout 30000 --jsonindiana offerings list --jsonindiana paywalls apply --file paywall-operation.json --jsonindiana funnels apply --file funnel-operation.json --json

查询配置、分析与财务明细

terminal.shShell
indiana growth features list --query limit=25 --jsonindiana growth features get checkout_enabled --jsonindiana growth features revisions list --query parentId=checkout_enabled --jsonindiana growth experiments list --jsonindiana growth metrics fact-metrics list --jsonindiana growth insights reports get <report-uuid> --jsonindiana snapshots list --query parentId=<experiment-uuid> --jsonindiana snapshots get <snapshot-uuid> --jsonindiana snapshots status <snapshot-uuid> --jsonindiana snapshots run --file snapshot.json --jsonindiana snapshots cancel <snapshot-uuid> --jsonindiana operations describe console.growth.read.get --query resource=reports --jsonindiana customers invoices get <customer-uuid> <invoice-uuid> --jsonindiana customers invoices refunds get <customer-uuid> <invoice-uuid> --jsonindiana customers credit-statement get <customer-uuid> --query from=2026-10-01T00:00:00Z --query to=2026-10-02T00:00:00Z --jsonindiana customers entities get <customer-uuid> --jsonindiana customers seats get <customer-uuid> --jsonindiana overview list --query from=2026-10-01 --query to=2026-10-02 --jsonindiana events list --query name=payment.failed --json

Snapshot 使用独立的 snapshots 命令组:list/get 查询记录,status <id> 查询一次计算及其查询任务的进度,run --file snapshot.json 发起计算,cancel <id> 取消计算。snapshot.json 包含 { "experimentId": "<experiment-uuid>" },可按原接口添加 phase、endDate 或 dimension。status 可用 --query sql=1 显示授权范围内的查询详情;所有操作保留原有 App、环境和权限校验。

GrowthBook 配置读取需要 App 级 platform.read;Snapshot、Dashboard、Report、Saved Query 和 Safe Rollout 结果还需要所选环境的 platform.read 与 analytics.read。用 operations describe --query resource=... 查询具体要求。私有对象仍受其可见范围限制。

GrowthBook 查询返回 {resource,rows,ids,nextCursor},默认 25 条、最多 100 条。续页与筛选参数见下表。

筛选与分页
查询参数
GrowthBook将非空 nextCursor 原样传入 --query after=...。ids[n] 对应 rows[n],可原样用于 get,包括复合标识。
parentId筛选 Feature 修订/历史/引用、Experiment Snapshot/Dashboard/Report 或 Safe Rollout Snapshot。
Invoice使用 after 续页。
积分对账单续页时一起传回 snapshotAt、afterAt、afterId、afterPosition。
Overview / events日期使用 UTC,范围最多 90 天;事件续页同时传 before 和 after。

筛选与分页

  • GrowthBook

    参数
    将非空 nextCursor 原样传入 --query after=...。ids[n] 对应 rows[n],可原样用于 get,包括复合标识。
  • parentId

    参数
    筛选 Feature 修订/历史/引用、Experiment Snapshot/Dashboard/Report 或 Safe Rollout Snapshot。
  • Invoice

    参数
    使用 after 续页。
  • 积分对账单

    参数
    续页时一起传回 snapshotAt、afterAt、afterId、afterPosition。
  • Overview / events

    参数
    日期使用 UTC,范围最多 90 天;事件续页同时传 before 和 after。

校验与比较设计文档

校验当前 Funnel 可编辑文档、Paywall 文档和 Offering(lookupKey / displayName / items / metadata),严格校验 UTF-8 和 JSON,最大 1,000,000 字节。draft 允许未完成草稿,publish 检查发布结构;validate 的 --file - 可从 stdin 读取。旧格式被明确拒绝。

校验结果标注 validation=local 和 serverChecks=not_run。结构通过不代表可以发布;租户权限、固定引用、提供商和当前状态仍需服务端校验。diff 输出 JSON Pointer、改动种类和稳定 SHA-256,不输出文档值;最多显示 100 项,并提供 total / truncated。

terminal.shShell
indiana funnels validate --file funnel.json --mode publish --jsonindiana paywalls validate --file paywall.json --mode draft --jsonindiana offerings validate --file offering.json --mode publish --jsonindiana funnels diff --against before.json --file after.json --jsonindiana paywalls diff --against before.json --file after.json --json

通过代码编辑模板

以下 Paywall、Popup 和 Page 源码编辑命令尚未包含在公开下载中,需要支持这些命令的 CLI 与服务版本。

使用新的输出目录。screen.json 保存结构、文案和动作;HTML/CSS 在 html/<node-id>/ 下按语言编辑。indiana.source.json 保留目标、App/环境及拉取基线。可以使用本地编辑器或 AI 工具修改,然后校验、审阅并提交草稿;也可导入网页代码编辑器审阅。

pull 使用 platform.read,push 使用 platform.write 并保留原有作者角色检查。check/diff 离线运行;push 保留原始修订检查,冲突不覆盖本地文件,模板库目标另存私有模板。命令不发布、不监听文件,也不启动本地预览服务器。

terminal.shShell
indiana code pull paywall/<uuid> --out ./templateindiana code pull funnel/<uuid>/screen/<screen-id> --out ./popupindiana code pull template/<uuid> --out ./private-templateindiana code check ./template --jsonindiana code diff ./template --jsonindiana code push ./template --json

脚本输出与故障处理

--json 向 stdout 输出一个 JSON 结果,登录进度写入 stderr。按 error.code 与 message 处理错误,记录可用的 status/requestId。retryable、recovery 和 retryAfterSeconds 等扩展字段尚未包含在公开下载中。--non-interactive 不发起新的浏览器登录;--timeout 为每次请求期限,1–60000 毫秒,默认 10000。

管理 API 专用错误码
code含义与处理
INVALID_SERVER_RESPONSE服务端响应不符合当前契约;保留诊断信息,写操作先恢复原结果。
RESPONSE_TOO_LARGE服务端结果超出管理响应预算;缩小查询或使用分页。
AMBIGUOUS_AUTHENTICATION请求混用了 Bearer 与浏览器登录 Cookie;使用该入口要求的一种身份。
BROWSER_REQUIRED该审批操作需要浏览器成员会话。
INVALID_REDIRECT_URIOAuth 回调地址未被允许;核对客户端注册。
AUTHORIZATION_UNAVAILABLE授权请求当前不可用;核对请求、审批状态和有效期。
UNREGISTERED_CLIENTOAuth 客户端未注册或不可用;由管理员检查配置。
MANAGEMENT_OPERATION_FAILED管理操作失败;保留 requestId,写操作先读取原结果。

管理 API 专用错误码

  • INVALID_SERVER_RESPONSE

    含义与处理
    服务端响应不符合当前契约;保留诊断信息,写操作先恢复原结果。
  • RESPONSE_TOO_LARGE

    含义与处理
    服务端结果超出管理响应预算;缩小查询或使用分页。
  • AMBIGUOUS_AUTHENTICATION

    含义与处理
    请求混用了 Bearer 与浏览器登录 Cookie;使用该入口要求的一种身份。
  • BROWSER_REQUIRED

    含义与处理
    该审批操作需要浏览器成员会话。
  • INVALID_REDIRECT_URI

    含义与处理
    OAuth 回调地址未被允许;核对客户端注册。
  • AUTHORIZATION_UNAVAILABLE

    含义与处理
    授权请求当前不可用;核对请求、审批状态和有效期。
  • UNREGISTERED_CLIENT

    含义与处理
    OAuth 客户端未注册或不可用;由管理员检查配置。
  • MANAGEMENT_OPERATION_FAILED

    含义与处理
    管理操作失败;保留 requestId,写操作先读取原结果。

连接失败时运行 doctor --json,检查错误的 host、stage 和排查建议(扩展诊断字段需配套 CLI 版本)。TIMEOUT/NETWORK_ERROR 表示请求结果可能未知:写入先恢复原操作,登录失败先检查 auth status。CLI 不自动重发写请求。通用错误与 recovery 规则见「请求与错误」。

如果网络要求代理,检查 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY。在 Node.js 22.21+(22.x)或 24+ 上,NODE_USE_ENV_PROXY=1 indiana doctor --json 可让本次进程使用环境变量代理;它不会创建代理或设置代理地址。HTTP 407 表示代理需要认证,无法明确识别的代理隧道失败仍可能报告 unknown。CLI 不自动修改 shell 配置。

相关:通用错误码与恢复规则

退出码
值含义
0命令成功
2参数、配置、文件或文档非法
3未登录、授权拒绝、刷新或会话失效
4权限、origin 绑定或重定向约束失败
5配置/资源修订冲突或写锁占用
6服务、网络或响应协议错误
7运行时、管理 API 或授权未就绪

退出码

  • 0

    含义
    命令成功
  • 2

    含义
    参数、配置、文件或文档非法
  • 3

    含义
    未登录、授权拒绝、刷新或会话失效
  • 4

    含义
    权限、origin 绑定或重定向约束失败
  • 5

    含义
    配置/资源修订冲突或写锁占用
  • 6

    含义
    服务、网络或响应协议错误
  • 7

    含义
    运行时、管理 API 或授权未就绪
  • doctor 返回 ready=false:先根据输出检查服务 origin 和 OAuth 配置,服务就绪后再登录。
  • 授权过期、被撤销或成员资格改变:查看 auth status,按当前权限重新登录并审批。
  • 切换服务器:建立对应 origin 的独立 profile;不能把已保存的令牌带到另一个服务。