aptly 0.1.0 → 0.1.1

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.
@@ -4,47 +4,137 @@
4
4
 
5
5
  [返回 README](../../README.zh-CN.md)
6
6
 
7
- 韩语文档是正本。本指南介绍 0.1.0 本地软件包草案,并不表示软件包已发布到 npm registry,或所有账户都能访问相关模型。子代理的实际执行、审批、沙箱与 MCP 权限仍由 Claude Code 或 Codex 负责。
7
+ 韩语文档是正本。本指南以 Aptly 0.1.1 为准。可以安装软件包,并不表示所有账户都能访问相关模型。子代理的实际执行、审批、沙箱与 MCP 权限仍由 Claude Code 或 Codex 负责。
8
8
 
9
9
  ## 安装
10
10
 
11
- 需要 Node.js 24 或更高版本,以及 Claude Code 或 Codex。请指定已审核的归档文件和安装位置。
11
+ 需要 Node.js 24 或更高版本,以及 Claude Code 或 Codex。如果 0.1.1 已发布到 npm,请使用以下全局安装命令:
12
12
 
13
13
  ```sh
14
- aptly_install=/absolute/aptly-local
15
- npm install --prefix "$aptly_install" /absolute/path/aptly-0.1.0.tgz
16
- "$aptly_install/node_modules/.bin/aptly" setup --client all --mode defaults
14
+ npm install -g aptly@0.1.1
15
+ aptly setup --client all --mode defaults
16
+ aptly --version
17
17
  ```
18
18
 
19
- 后续示例中的 `aptly` 指上述安装位置的可执行文件。如果尚未将它加入 PATH,请使用完整路径运行。不要直接执行已安装 `node_modules` 中的 TypeScript 源码。
19
+ 确认 `aptly --version` 输出 `0.1.1`。切换 Node.js 环境后可能需要重新安装。
20
20
 
21
21
  `postinstall` 会在当前用户现有的宿主配置目录中注册 MCP 和 `PreToolUse` Hook。如果使用 `CODEX_HOME` 或 `CLAUDE_CONFIG_DIR`,请向安装进程传递相同的环境。自动注册会跳过尚不存在的宿主目录;显式运行 `setup` 可以创建这些目录。若只需注册某个宿主,请使用 `--client codex` 或 `--client claude`。
22
22
 
23
23
  新注册项会指定 `ROUTER_PROVIDER=decisions`、Hook 的 `defaults` 策略,以及各宿主独立的私有账本。其他现有配置与 Hook,以及 Aptly 原有的命令、环境、分类方式和账本路径都会保留。现有 fixture 配置不会自动切换为付费模式。
24
24
 
25
+ ### 使用 CLI 设置
26
+
27
+ `set` 命令需要 0.1.1 或更高版本。命令不会自动切换现有启动路径。API 密钥设置仅允许当前软件包的标准 Node/服务器注册,并要求确认运行时支持系统凭据引用。自定义包装程序、旧版本及其他安装位置会以 `credential_launcher_unverified` 被拒绝;请先明确切换注册项或完成升级,再重新执行。
28
+
29
+ ```sh
30
+ aptly set default
31
+ aptly set env APTLY_CODEX_MODELS
32
+ aptly set env OPENAI_API_KEY
33
+ ```
34
+
35
+ 第一条命令注册 Claude Code 和 Codex,并补充缺失的默认环境设置,不覆盖现有启动命令、环境变量白名单、分类方式、自定义候选或 advisory 策略。第二条命令以隐藏输入方式询问值,仅修改指定变量。第三条命令把 API 密钥存入操作系统凭据存储,并在所选宿主启动时读取。请勿把值作为命令参数传入。
36
+
37
+ 默认选择两个宿主。可用 `--client codex`、`--client claude` 或 `--client all` 指定目标。例如,Claude 候选值可输入 `["haiku","sonnet","opus"]` 这样的 JSON 字符串。
38
+
39
+ ```sh
40
+ aptly set env APTLY_CLAUDE_MODELS --client claude
41
+ ```
42
+
43
+ 自动化时请显式使用 `--stdin`。下面是公开变量的示例;不要把真实密钥放入 `printf` 命令或 shell 历史。
44
+
45
+ ```sh
46
+ printf '%s\n' '["gpt-6.1-terra"]' | aptly set env APTLY_CODEX_MODELS --stdin
47
+ ```
48
+
49
+ 允许设置的公开键为 `ROUTER_PROVIDER`(`fixture` 或 `decisions`)、`APTLY_CLAUDE_MODELS`、`APTLY_CODEX_MODELS`、`CLAUDE_MODELS`、`CODEX_MODELS` 和 `APTLY_MODEL_INFO_PATH`。候选必须是受支持模型的 JSON 数组字符串;无效值、重复值及主名称与别名冲突会被拒绝。`[]` 关闭对应宿主的推荐;模型缓存必须使用私有目录内的绝对路径。账本及 Hook 策略路径等受管理项不能通过此命令更改。
50
+
51
+ API 密钥通过 macOS Keychain、已安装的 Linux `secret-tool` 或 Windows Credential Manager 保存。Windows 后端使用 PowerShell 和当前用户范围的 Win32 Generic 凭据,UTF-8 数据上限为 2,560 字节。Windows CI 已验证合成密钥的保存、读取、更新和删除,以及 Unicode 路径、隔离的宿主设置、密钥引用和 ACL 保留;并未运行 Windows 上真实的 Claude Code 或 Codex 会话。凭据存储不可用时会返回错误,不回退到明文文件。密钥按宿主账户分开,MCP 文件只保存 `APTLY_SECRET_BACKEND=os` 和 `APTLY_SECRET_CLIENT` 引用。明确选择系统存储后,缺少密钥或读取失败时,不会静默改用其他环境变量密钥。`set default` 保留现有包装程序或环境认证;只有执行 `set env OPENAI_API_KEY` 才明确选择系统存储认证。
52
+
53
+ 命令只返回宿主状态和固定错误代码,不返回密钥值。结果为 `partial` 时,请逐个检查宿主。`credential_store_failed` 表示应检查存储访问或支持情况;`credential_rollback_failed` 表示需确认旧密钥是否恢复。失败宿主会在可能时恢复旧密钥,不能把其他宿主的成功视为所有宿主的原子成功。
54
+
55
+ 保存超时或响应解析失败也可能发生在 OS 已写入新值之后。失败时会尝试恢复旧值;若原来没有值,则删除新条目,然后重新读取确认。如果无法确认恢复结果,会在原始错误代码之外添加 `credential_rollback_failed`。不要假定任一密钥仍然有效,请在重试前检查 OS 凭据存储。这是尽力恢复,并非跨进程或宿主的原子事务。
56
+
57
+ 修改后请重启 MCP,并通过 `get_routing_capabilities` 查看 `provider`、候选和 `credential_status`。`os_store` 仅表示读到了密钥,不代表 API 已通过认证。默认设置和公开变量设置仍会保留自定义包装程序。API 密钥设置不会修改未经确认的启动路径所对应的宿主设置;如果已尝试保存,则会在可能时恢复该宿主的旧密钥。不要假定新密钥会通过现有包装程序自动生效。命令不会绕过 Codex 的 `/hooks` 信任批准或宿主权限。
58
+
25
59
  ### 密钥与重启
26
60
 
27
- `OPENAI_API_KEY` 仅用于分类,与运行子代理所用的现有登录或订阅认证是两回事。请通过用户的凭据存储或安全运行环境,**将其注入 MCP 进程的环境变量**。不要将密钥放入命令行、工具参数、请求 JSON、MCP 配置 JSON、源码、日志或临时文件。无需使用特定的凭据存储服务。
61
+ 通过安全环境或凭据启动程序将分类用的 `OPENAI_API_KEY` 传递给 MCP 进程。它与宿主订阅登录无关。不要将密钥值写入命令参数、请求、配置文件、源码、日志或临时文件。
62
+
63
+ ### MCP 环境变量设置步骤
28
64
 
29
- 请重新启动宿主或 MCP 服务器,使其读取注册项与环境。仅在另一个终端中更改环境变量,不会更新已运行的 GUI 或 MCP 环境。**Codex 要求在 `/hooks` 中审核新 Hook 的确切定义并批准信任。** 安装程序不会绕过信任批准。
65
+ 运行 `setup` 后,将以下示例合并到现有 `aptly` 注册中。保留 `command`、`args`、凭据启动程序、`ROUTER_LEDGER_PATH` 和 `APTLY_HOOK_POLICY_PATH`。Setup 会创建私有账本和策略目录。手动指定账本时,应使用用户所有、权限为 700 的目录内的绝对路径。
30
66
 
31
- 如果缺少密钥,或发生连接、认证、超时错误,则保留原始调用。直接调用 Decisions 需要以下环境。
67
+ #### 配置文件位置
32
68
 
33
- | 环境变量 | 用途 |
69
+ | 宿主 | Aptly 使用的用户注册位置 |
34
70
  |---|---|
35
- | `OPENAI_API_KEY` | 通过安全运行环境注入的分类用密钥 |
36
- | `ROUTER_PROVIDER=decisions` | 使用实际分类 API |
37
- | `ROUTER_LEDGER_PATH` | 位于归用户所有、权限为 700 的私有目录中的账本绝对路径 |
71
+ | Codex | `$CODEX_HOME/config.toml`;未设置 `CODEX_HOME` 时为 `~/.codex/config.toml` |
72
+ | Claude Code | `~/.claude.json` 中的 `mcpServers.aptly`;设置 `CLAUDE_CONFIG_DIR` 时为该目录中的 `.claude.json` |
73
+
74
+ Claude Code 默认将 Hook 存储在 `~/.claude/settings.json`;设置 `CLAUDE_CONFIG_DIR` 时则使用 `$CLAUDE_CONFIG_DIR/settings.json`。此文件与 MCP 注册分开。若使用项目 `.mcp.json`、托管设置或账户专用目录,请先通过 `/mcp` 确认当前注册,再编辑或添加。
75
+
76
+ #### 传递 API 密钥
77
+
78
+ 直接启动时,在 **Bash** 中输入密钥,不回显也不记录到命令历史,然后从同一 shell 启动宿主。使用 zsh 时请先运行 `bash`:
79
+
80
+ ```sh
81
+ read -rsp 'OpenAI API key: ' OPENAI_API_KEY
82
+ printf '\n'
83
+ export OPENAI_API_KEY
84
+ codex
85
+ ```
86
+
87
+ Claude Code 用户将 `codex` 替换为 `claude`。密钥不会永久保存。已运行的 GUI 不会继承其他终端的环境,请使用应用的安全环境传递功能或保留现有凭据启动程序。
88
+
89
+ #### Codex 示例
90
+
91
+ 编辑现有 `[mcp_servers.aptly]` 表,不要重复添加同名表。向 `env_vars` 添加 `OPENAI_API_KEY`,保留已有条目。`env_vars` 按名称转发宿主环境变量,`.env` 向 MCP 提供固定值。
92
+
93
+ ```toml
94
+ [mcp_servers.aptly]
95
+ env_vars = ["OPENAI_API_KEY"]
96
+
97
+ [mcp_servers.aptly.env]
98
+ ROUTER_PROVIDER = "decisions"
99
+ APTLY_CLAUDE_MODELS = '["haiku","sonnet","opus"]'
100
+ APTLY_CODEX_MODELS = '["gpt-6-luna","gpt-6.1-terra","gpt-6.1-sol"]'
101
+ ```
102
+
103
+ #### Claude Code 示例
104
+
105
+ 将以下值合并到现有 `mcpServers.aptly.env` 对象:
106
+
107
+ ```json
108
+ {
109
+ "ROUTER_PROVIDER": "decisions",
110
+ "APTLY_CLAUDE_MODELS": "[\"haiku\",\"sonnet\",\"opus\"]",
111
+ "APTLY_CODEX_MODELS": "[\"gpt-6-luna\",\"gpt-6.1-terra\",\"gpt-6.1-sol\"]"
112
+ }
113
+ ```
114
+
115
+ 直接启动时,可用以下可选引用传递 Claude Code 环境中已有的密钥。使用凭据启动程序时不要添加。若变量缺失,密钥不会传入,引用字符串也可能保持未展开状态:
116
+
117
+ ```json
118
+ {
119
+ "OPENAI_API_KEY": "${OPENAI_API_KEY}"
120
+ }
121
+ ```
122
+
123
+ 模型候选使用 **JSON 字符串**。不设置则采用默认值,`[]` 禁用该宿主的推荐。Aptly 读取 MCP 启动环境,不会自动加载项目 `.env` 文件。
124
+
125
+ 修改后重启宿主或 MCP。**在 Codex 的 `/hooks` 中审核新 Hook 并批准信任。** 通过 `/mcp` 和 `get_routing_capabilities` 检查 `provider`、候选和 `automatic_hook.mode`。免费状态查询不验证密钥认证;`recommend_agent` 可能产生费用。`unauthorized` 时检查密钥传递,`needs_context` 时检查任务摘要。
126
+
127
+ 配置位置与传递方式的官方说明,请参阅 [Codex 配置参考](https://learn.chatgpt.com/docs/config-file/config-reference)和 [Claude Code MCP 指南](https://code.claude.com/docs/en/mcp)。
38
128
 
39
129
  ### 跳过与移除
40
130
 
41
131
  ```sh
42
- APTLY_SKIP_SETUP=1 npm install --prefix "$aptly_install" /absolute/path/aptly-0.1.0.tgz
132
+ APTLY_SKIP_SETUP=1 npm install -g aptly@0.1.1
43
133
  aptly setup --client codex --mode defaults
44
134
  aptly remove --client all
45
135
  ```
46
136
 
47
- 在 `CI` 环境中或使用 npm `--ignore-scripts` 时,也会跳过自动注册。之后可显式运行 `setup` 进行注册。`advisory` 模式只传递推荐,不修改参数。更改策略时,请先移除原有注册,再使用所需的 `--mode` 重新注册。如果结果为 `partial`,请检查各宿主对应的错误代码。移除操作仅针对与所有权记录一致的项目;用户已修改的项目会保留,并报告冲突。
137
+ `CI` 或 npm `--ignore-scripts` 也会跳过注册,可随后运行 `setup`。更改模式时,先移除注册,再使用所需 `--mode` 重新设置;`advisory` 只提供建议。出现 `partial` 时检查各宿主错误代码。移除操作保留用户修改的条目并报告冲突。
48
138
 
49
139
  ## 自动 Hook
50
140
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aptly",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "engines": {
@@ -11,6 +11,7 @@
11
11
  "typecheck": "tsc --noEmit",
12
12
  "test": "node --test test/*.test.ts",
13
13
  "mcp": "node bin/aptly.ts serve",
14
+ "test:package": "node scripts/package-smoke.ts",
14
15
  "poc": "node scripts/poc.ts",
15
16
  "check:release": "npm run build && node scripts/release-check.ts",
16
17
  "probe:codex": "node test-support/codex-host-probe.ts",
@@ -21,7 +22,7 @@
21
22
  "smol-toml": "1.9.1",
22
23
  "zod": "4.6.7"
23
24
  },
24
- "description": "Conservative advisory subagent profile routing for Codex and Claude Code using OpenAI Decisions.",
25
+ "description": "Model and reasoning recommendations for subagents.",
25
26
  "license": "MIT",
26
27
  "bin": {
27
28
  "aptly": "dist/bin/aptly.js"