运行时依赖
安装命令
点击复制技能文档
市场(App-store v2 + 每用户市场后端) CRITICAL — 执行任何操作前,必须先用 Read 工具读取 ../olares-shared/SKILL.md,了解 profile 选择、登录及 HTTP 401/403 恢复规则,所有命令都依赖这些规则。
核心概念
源解析
市场后端提供多个 chart“源”。CLI 通过 -s / --source 决定与哪个源通信,未指定时按动词回退:
| 源 ID | 说明 | 默认使用者 |
|---|---|---|
| market.olares | 公共目录(只读浏览) | list、get、categories、install、upgrade、clone、status |
| cli | 本 CLI 上传的本地源 | upload、delete |
| upload | SPA“上传”UI 推送的本地源 | upload、delete |
| studio | Devbox / Studio 产出的本地源 | upload、delete |
解析逻辑集中在 cli/cmd/ctl/market/common.go:
resolveCatalogSource(opts)→ 若 opts.Source 已设则用之,否则 defaultCatalogSource = "market.olares"resolveLocalSource(opts)→ 若 opts.Source 已设则用之,否则 defaultLocalSource = "cli"validateLocalSource(s)拒绝非 localSources = {"upload", "studio", "cli"} 的值
省略 -s 时,各命令会向 stderr 打印 Using source: ,方便 agent 确认实际访问的后端。
-a / --all-sources(在支持的命令中)跳过单源解析,向用户有权限的所有源并发查询。
应用生命周期 / 状态机 后端按两个正交维度跟踪每个应用:State(当前所在阶段)与 OpType(正在进行的变更)。完整枚举见 framework/app-service/api/app.bytetrade.io/v1alpha1/appmanager_states.go。 CLI 在 cli/cmd/ctl/market/watch.go 将状态归为四类:
- 进行中
- 终态成功
- 终态失败
- 已取消 / 取消失败
OpType vs State(竞态安全) 同一 State 在不同变更下含义不同。举例:对运行中应用执行 upgrade,最初返回 state=running、opType=running,一两轮后才变为 state=upgrading、opType=upgrade。 修复逻辑在 cli/cmd/ctl/market/watch.go(waitForTerminal + watchTarget.matchOpType): 对变更类动词,轮询器拒绝将任何“成功”视为终态,直到:
- 行记录的 OpType 与 CLI 刚发出的操作匹配;或
- 行记录消失(仅 uninstall / status 合法)。
认证传输 所有请求通过工厂注入的 http.Client 发送,其 RoundTripper(refreshingTransport,见 cli/pkg/cmdutil/factory.go)自动注入 X-Authorization 并在令牌过期时透明刷新。MarketClient 本身仅为 HTTP 包装,不接触 access_token。
- Base URL:
/app-store/api/v2,在 cli/cmd/ctl/market/client.go 的 NewMarketClient / apiPrefix 构造 - 认证头:
X-Authorization:(非 Authorization: Bearer …) - MarketURL 由 Olares ID 生成(
https://market.),定义见 cli/pkg/credential/types.go(ResolvedProfile.MarketURL)
MarketClient 内双客户端:
- httpClient(30 s 超时,JSON 动词)
- uploadClient(无超时,multipart chart 上传)
401/403 仅在传输已自动刷新仍被拒时到达 executeRequest;通过 reformatMarketAuthErr 重新包装。
若 /api/refresh 本身失败,executeRequest 直接返回 credential.ErrTokenInvalidated / credential.ErrNotLoggedIn,提示用户“run profile login”,无冗余报错。
恢复规则 → 见 ../olares-shared/SKILL.md “Automatic token refresh”。
市场侧所有动词均使用可重放请求体(JSON 用 bytes.Reader,multipart 用 *bytes.Buffer),因此都能享受传输层的 401 自动重试;市场树内无流式上传场景——chart 上传前已完全缓冲。
命令速查 (以下所有动词均已实现上述规则)