aptly 0.1.0 → 0.1.2
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.en.md +23 -5
- package/README.ja.md +23 -5
- package/README.md +23 -5
- package/README.zh-CN.md +23 -5
- package/dist/bin/aptly.js +85 -7
- package/dist/src/cli-input.d.ts +5 -0
- package/dist/src/cli-input.js +49 -0
- package/dist/src/core.d.ts +1 -0
- package/dist/src/core.js +24 -9
- package/dist/src/credential-setup.d.ts +18 -0
- package/dist/src/credential-setup.js +89 -0
- package/dist/src/files.js +10 -3
- package/dist/src/ledger-lock.d.ts +8 -0
- package/dist/src/ledger-lock.js +153 -0
- package/dist/src/provider.js +13 -4
- package/dist/src/runtime.d.ts +5 -1
- package/dist/src/runtime.js +19 -3
- package/dist/src/secret-store.d.ts +27 -0
- package/dist/src/secret-store.js +263 -0
- package/dist/src/server.js +2 -1
- package/dist/src/setup.d.ts +14 -0
- package/dist/src/setup.js +297 -29
- package/dist/src/types.d.ts +4 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/windows-powershell.d.ts +2 -0
- package/dist/src/windows-powershell.js +11 -0
- package/dist/src/windows-private.d.ts +11 -0
- package/dist/src/windows-private.js +98 -0
- package/docs/guide/en.md +148 -15
- package/docs/guide/ja.md +148 -15
- package/docs/guide/ko.md +148 -15
- package/docs/guide/zh-CN.md +148 -15
- package/package.json +3 -2
package/docs/guide/ko.md
CHANGED
|
@@ -4,47 +4,158 @@
|
|
|
4
4
|
|
|
5
5
|
[README로 돌아가기](../../README.md)
|
|
6
6
|
|
|
7
|
-
한국어가 정본입니다. 이 안내는
|
|
7
|
+
한국어가 정본입니다. 이 안내는 Aptly의 일반적인 설치·사용 방법을 설명합니다. 패키지를 설치할 수 있다는 사실이 모든 계정의 모델 접근 가능성을 뜻하지는 않습니다. 실제 자식 실행·승인·샌드박스·MCP 권한은 Claude Code 또는 Codex가 담당합니다.
|
|
8
8
|
|
|
9
9
|
## 설치
|
|
10
10
|
|
|
11
|
-
Node.js 24 이상과 Claude Code 또는 Codex가 필요합니다.
|
|
11
|
+
Node.js 24 이상과 Claude Code 또는 Codex가 필요합니다. npm의 최신 안정 버전을 전역 설치하려면 다음 명령을 사용하십시오:
|
|
12
|
+
|
|
13
|
+
**기존 영속 원장을 0.1.2 이상으로 업그레이드하기 전에**, 해당 원장을 사용하는 모든 호스트·MCP 서버·별도 CLI와 구버전 프로세스를 정지하십시오. 새 영구 잠금은 구버전 writer와 함께 사용할 수 없습니다. 새 설치에는 기존 잠금 격리가 필요하지 않습니다. 이전 빈 잠금이 남았다면 [원장 잠금 전환 절차](#중단된-프로세스와-원장-잠금)를 따라 확인된 기존 잠금만 오프라인으로 격리하고, JSON 원장·`unknown`·비용·완료 캐시는 보존하십시오.
|
|
12
14
|
|
|
13
15
|
```sh
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
npm install -g aptly@latest
|
|
17
|
+
aptly setup --client all --mode defaults
|
|
18
|
+
aptly --version
|
|
17
19
|
```
|
|
18
20
|
|
|
19
|
-
|
|
21
|
+
`aptly --version`으로 설치된 버전을 확인하십시오. Node.js 환경을 바꾸면 재설치가 필요할 수 있습니다.
|
|
20
22
|
|
|
21
23
|
`postinstall`은 현재 사용자의 기존 호스트 설정 디렉터리에 MCP와 `PreToolUse` Hook을 등록합니다. `CODEX_HOME`·`CLAUDE_CONFIG_DIR`을 사용한다면 설치 프로세스에도 같은 환경을 전달하십시오. 아직 없는 호스트 디렉터리는 자동 등록에서 건너뛰고, 명시적인 `setup`으로 만들 수 있습니다. 필요한 호스트만 등록하려면 `--client codex` 또는 `--client claude`를 사용하십시오.
|
|
22
24
|
|
|
23
25
|
새 등록은 `ROUTER_PROVIDER=decisions`, Hook `defaults` 정책과 호스트별 비공개 원장을 지정합니다. 기존 다른 설정·Hook, 기존 Aptly의 실행 명령·환경·분류 방식·원장 경로는 보존합니다. 기존 fixture 설정을 자동으로 유료 모드로 바꾸지 않습니다.
|
|
24
26
|
|
|
27
|
+
### CLI로 설정하기
|
|
28
|
+
|
|
29
|
+
`set` 명령은 0.1.1부터 지원합니다. 명령은 기존 실행 경로를 자동 전환하지 않습니다. API 키 설정은 현재 패키지의 표준 Node/서버 등록과 OS 자격 저장소 참조 지원이 확인된 실행 경로에만 허용됩니다. 사용자 지정 래퍼·구버전·다른 설치 위치는 `credential_launcher_unverified`로 거절하며, 등록을 명시적으로 전환하거나 업그레이드한 뒤 다시 실행해야 합니다.
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
aptly set default
|
|
33
|
+
aptly set env APTLY_CODEX_MODELS
|
|
34
|
+
aptly set env OPENAI_API_KEY
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
첫 명령은 Claude Code와 Codex 등록 및 누락된 기본 환경변수를 추가합니다. 기존 실행 명령·환경 목록·provider·사용자 후보·advisory 정책은 덮어쓰지 않습니다. 두 번째 명령은 값을 화면에 표시하지 않는 대화형 입력을 받으며, 명시한 변수만 변경합니다. 세 번째 명령은 API 키를 OS 자격 저장소에 보관하고 선택한 호스트가 시작할 때 읽도록 연결합니다. 값을 명령 인자로 붙이지 마십시오.
|
|
38
|
+
|
|
39
|
+
기본 대상은 두 호스트입니다. `--client codex`, `--client claude`, `--client all`로 대상을 선택할 수 있습니다. 예를 들어 Claude 후보 입력에는 `["haiku","sonnet","opus"]` 같은 JSON 문자열을 사용합니다.
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
aptly set env APTLY_CLAUDE_MODELS --client claude
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
자동화에서는 `--stdin`을 명시하십시오. 일반 변수의 예는 다음과 같습니다. 실제 키를 `printf` 명령이나 셸 기록에 넣지 마십시오.
|
|
46
|
+
|
|
47
|
+
```sh
|
|
48
|
+
printf '%s\n' '["gpt-6.1-terra"]' | aptly set env APTLY_CODEX_MODELS --stdin
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
일반 설정 허용 키는 `ROUTER_PROVIDER`(`fixture` 또는 `decisions`), `APTLY_CLAUDE_MODELS`, `APTLY_CODEX_MODELS`, `CLAUDE_MODELS`, `CODEX_MODELS`, `APTLY_MODEL_INFO_PATH`입니다. 후보는 지원하는 모델의 JSON 배열 문자열이며 잘못된 값·중복·기본 이름과 별칭 충돌은 거절합니다. `[]`는 해당 호스트 추천을 끄고, 모델 캐시 경로는 비공개 디렉터리 안의 절대 경로여야 합니다. 원장·Hook 정책 경로 같은 관리 항목은 이 명령으로 변경하지 않습니다.
|
|
52
|
+
|
|
53
|
+
API 키는 macOS Keychain, Linux의 설치된 `secret-tool`, 또는 Windows Credential Manager에 저장합니다. Windows 백엔드는 PowerShell과 Win32 Generic 자격 증명을 사용하며 현재 사용자 범위에 UTF-8 데이터 최대 2,560바이트를 저장합니다. Windows CI에서 합성 키의 저장·조회·수정·삭제, 한글 경로와 격리된 호스트 설정·키 참조·ACL 보존을 확인했습니다. Windows의 실제 Claude Code·Codex 세션 실행을 검증한 것은 아닙니다. 자격 저장소를 사용할 수 없으면 오류를 반환하고 평문 파일로 대체하지 않습니다. 키는 호스트별 계정으로 분리하고 MCP 파일에는 `APTLY_SECRET_BACKEND=os`·`APTLY_SECRET_CLIENT` 참조만 씁니다. OS 저장소를 명시한 뒤 키가 없거나 읽기에 실패해도 다른 환경변수 키로 조용히 대체하지 않습니다. 기존 래퍼/환경 인증은 `set default`에서 유지하며, `set env OPENAI_API_KEY`를 실행해야 OS 저장소 인증을 명시적으로 선택합니다.
|
|
54
|
+
|
|
55
|
+
명령 결과는 키 값 대신 호스트별 상태와 오류 코드만 제공합니다. `partial`이면 호스트별 결과를 확인하십시오. `credential_store_failed`는 저장소 접근·지원 상태를, `credential_rollback_failed`는 이전 키 복원 여부를 별도로 확인해야 한다는 뜻입니다. 실패한 호스트의 키는 가능한 경우 이전 값으로 복원합니다. 다른 호스트의 성공까지 전체 원자적 성공으로 간주하지 마십시오.
|
|
56
|
+
|
|
57
|
+
저장 시간 초과나 응답 해석 실패는 OS가 새 값을 기록한 뒤에도 발생할 수 있습니다. 실패하면 이전 값을 복원하거나, 이전 값이 없었다면 새 항목을 제거한 뒤 재조회합니다. 복구 여부를 확인하지 못하면 원래 오류 코드와 함께 `credential_rollback_failed`를 반환합니다. 어느 키가 활성 상태인지 단정하지 말고 재시도 전에 OS 자격 증명 저장소를 확인하십시오. 이는 가능한 범위의 복구이며 프로세스·호스트 전체의 원자적 트랜잭션이 아닙니다.
|
|
58
|
+
|
|
59
|
+
변경 후 MCP를 재시작하고 `get_routing_capabilities`의 `provider`, 후보 목록, `credential_status`를 확인하십시오. `os_store`는 저장소에서 키를 읽었다는 뜻이며 API 유효성 검증은 아닙니다. 기본 설정과 일반 변수 설정은 기존 사용자 지정 래퍼를 보존합니다. API 키 설정은 호환성이 확인되지 않은 실행 경로의 호스트 설정을 변경하지 않으며, 이미 저장을 시도했다면 해당 호스트의 이전 키를 가능한 경우 복원합니다. 새 키가 기존 래퍼에도 자동 적용된다고 가정하지 마십시오. 명령은 Codex의 `/hooks` 신뢰 승인이나 호스트 권한을 우회하지 않습니다.
|
|
60
|
+
|
|
61
|
+
### 실행 경로 오류 복구
|
|
62
|
+
|
|
63
|
+
아래 옵션은 Aptly 0.1.2부터 지원하며 npm 0.1.1에는 없습니다. 소스에서 시험하려면 `npm ci --ignore-scripts`와 `npm run build` 후 `aptly` 대신 `node bin/aptly.ts`를 사용합니다.
|
|
64
|
+
|
|
65
|
+
키 설정은 입력·저장 전에 선택한 호스트를 진단합니다. 하나라도 실패하면 입력을 받지 않고 모든 호스트를 그대로 둡니다. `--check`는 키나 자격 저장소에 접근하지 않습니다. `credential_node_mismatch`, `credential_server_mismatch`, `credential_runtime_unsupported`는 각각 Node 경로, 서버 경로, OS 저장소 지원의 불일치입니다.
|
|
66
|
+
|
|
67
|
+
Claude만 실패했다면 다음 순서로 진단하고, `launcher_migration_available`일 때만 이전을 검토하십시오:
|
|
68
|
+
|
|
69
|
+
```sh
|
|
70
|
+
aptly set env OPENAI_API_KEY --client claude --check
|
|
71
|
+
aptly setup --client claude --migrate-launcher --dry-run
|
|
72
|
+
aptly setup --client claude --migrate-launcher
|
|
73
|
+
aptly set env OPENAI_API_KEY --client claude
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
`--dry-run`은 변경하지 않습니다. 이전 명령은 소유 기록과 일치하는 Aptly 표준 등록의 Node·서버 경로를 현재 빌드로 바꿉니다. 기존 환경·Hook·정책·다른 호스트는 보존하며 키를 읽거나 저장하지 않습니다. 오래된 실행 파일을 실행하지 않습니다. 사용자 래퍼, 소유 기록이 없거나 수정된 등록은 거절합니다. 이 경우 로컬에서 등록을 검토하고 래퍼의 안전한 환경 전달을 사용하거나 별도로 검토한 표준 등록으로 전환하십시오. 소유 기록을 삭제하거나 편집해 검증을 우회하지 마십시오.
|
|
77
|
+
|
|
78
|
+
이미 성공한 Codex는 재설정할 필요가 없습니다. 실패한 호스트만 지정해 재시도하고 MCP를 재시작하십시오. Codex를 대상으로 하면 `/hooks` 신뢰 검토가 계속 필요합니다. 진단 이후 설정 변경은 `concurrent_configuration_change`로 중단합니다. 저장 실패 후 다른 키가 관찰되거나 현재 키를 읽지 못하면 덮어쓰지 않고 `credential_rollback_failed`를 반환합니다. 파일과 OS 저장소 사이의 원자적 트랜잭션은 아니므로 다른 설정 작업을 동시에 실행하지 마십시오.
|
|
79
|
+
|
|
25
80
|
### 키와 재시작
|
|
26
81
|
|
|
27
|
-
`OPENAI_API_KEY
|
|
82
|
+
분류용 `OPENAI_API_KEY`를 안전한 환경이나 자격 주입 래퍼를 통해 MCP 프로세스에 전달하십시오. 호스트 구독 로그인과 별개입니다. 키 값을 명령 인자·요청·설정 파일·소스·로그·임시 파일에 기록하지 마십시오.
|
|
28
83
|
|
|
29
|
-
|
|
84
|
+
### MCP 환경변수 설정 순서
|
|
30
85
|
|
|
31
|
-
|
|
86
|
+
`setup` 후 아래 예제를 기존 `aptly` 등록에 병합하십시오. `command`, `args`, 자격 주입 래퍼, `ROUTER_LEDGER_PATH`, `APTLY_HOOK_POLICY_PATH`는 보존하십시오. Setup이 비공개 원장·정책 디렉터리를 만듭니다. 원장 경로를 직접 지정한다면 사용자 소유·권한 700인 디렉터리 안의 절대 경로여야 합니다.
|
|
32
87
|
|
|
33
|
-
|
|
88
|
+
#### 설정 파일 위치
|
|
89
|
+
|
|
90
|
+
| 호스트 | Aptly가 사용하는 사용자 등록 위치 |
|
|
34
91
|
|---|---|
|
|
35
|
-
|
|
|
36
|
-
| `
|
|
37
|
-
|
|
92
|
+
| Codex | `$CODEX_HOME/config.toml`; `CODEX_HOME` 미지정 시 `~/.codex/config.toml` |
|
|
93
|
+
| Claude Code | `~/.claude.json`의 `mcpServers.aptly`; `CLAUDE_CONFIG_DIR` 지정 시 해당 디렉터리의 `.claude.json` |
|
|
94
|
+
|
|
95
|
+
Claude Code의 Hook 파일은 기본적으로 `~/.claude/settings.json`이며, `CLAUDE_CONFIG_DIR`을 지정하면 `$CLAUDE_CONFIG_DIR/settings.json`입니다. MCP 등록 파일과는 별개입니다. 프로젝트 `.mcp.json`·관리 설정·계정별 디렉터리를 사용한다면 수정하거나 등록하기 전에 `/mcp`에서 활성 항목을 확인하십시오.
|
|
96
|
+
|
|
97
|
+
#### API 키 전달
|
|
98
|
+
|
|
99
|
+
직접 실행할 때는 **Bash**에서 키를 화면·명령 기록에 남기지 않고 입력한 뒤 같은 셸에서 호스트를 시작합니다. zsh에서는 먼저 `bash`를 실행하십시오:
|
|
100
|
+
|
|
101
|
+
```sh
|
|
102
|
+
read -rsp 'OpenAI API key: ' OPENAI_API_KEY
|
|
103
|
+
printf '\n'
|
|
104
|
+
export OPENAI_API_KEY
|
|
105
|
+
codex
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Claude Code는 `codex` 대신 `claude`를 실행하십시오. 키는 영구 저장되지 않습니다. 실행 중인 GUI는 다른 터미널의 환경을 상속하지 않으므로 앱의 안전한 환경 전달 기능이나 기존 자격 주입 래퍼를 사용하십시오.
|
|
109
|
+
|
|
110
|
+
#### Codex 예제
|
|
111
|
+
|
|
112
|
+
기존 `[mcp_servers.aptly]` 테이블을 편집하고 같은 테이블을 중복 추가하지 마십시오. `env_vars`의 기존 항목을 유지하면서 `OPENAI_API_KEY`를 추가하십시오. `env_vars`는 호스트 환경변수를 이름으로 전달하고 `.env`는 MCP의 고정 값을 지정합니다.
|
|
113
|
+
|
|
114
|
+
```toml
|
|
115
|
+
[mcp_servers.aptly]
|
|
116
|
+
env_vars = ["OPENAI_API_KEY"]
|
|
117
|
+
|
|
118
|
+
[mcp_servers.aptly.env]
|
|
119
|
+
ROUTER_PROVIDER = "decisions"
|
|
120
|
+
APTLY_CLAUDE_MODELS = '["haiku","sonnet","opus"]'
|
|
121
|
+
APTLY_CODEX_MODELS = '["gpt-6-luna","gpt-6.1-terra","gpt-6.1-sol"]'
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
#### Claude Code 예제
|
|
125
|
+
|
|
126
|
+
기존 `mcpServers.aptly.env` 객체에 다음 값을 병합하십시오:
|
|
127
|
+
|
|
128
|
+
```json
|
|
129
|
+
{
|
|
130
|
+
"ROUTER_PROVIDER": "decisions",
|
|
131
|
+
"APTLY_CLAUDE_MODELS": "[\"haiku\",\"sonnet\",\"opus\"]",
|
|
132
|
+
"APTLY_CODEX_MODELS": "[\"gpt-6-luna\",\"gpt-6.1-terra\",\"gpt-6.1-sol\"]"
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
직접 실행에서는 다음 선택적 참조로 Claude Code 환경에 이미 있는 키를 전달할 수 있습니다. 자격 주입 래퍼에는 추가하지 마십시오. 변수가 없으면 키가 전달되지 않고 참조 문자열이 그대로 남을 수 있습니다:
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"OPENAI_API_KEY": "${OPENAI_API_KEY}"
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
모델 후보는 **JSON 문자열**입니다. 미지정하면 기본 후보를 사용하고 `[]`는 해당 호스트 추천을 끕니다. Aptly는 MCP 시작 환경을 읽으며 프로젝트 `.env` 파일을 자동 로드하지 않습니다.
|
|
145
|
+
|
|
146
|
+
변경 후 호스트 또는 MCP를 재시작하십시오. **Codex에서는 `/hooks`에서 새 Hook을 검토하고 신뢰를 승인하십시오.** `/mcp`와 `get_routing_capabilities`에서 `provider`, 후보, `automatic_hook.mode`를 확인하십시오. 무료 상태 조회는 키 인증을 검증하지 않으며 `recommend_agent`는 비용이 발생할 수 있습니다. `unauthorized`면 키 전달을, `needs_context`면 작업 요약을 확인하십시오.
|
|
147
|
+
|
|
148
|
+
설정 위치·전달 방식의 공식 설명은 [Codex 구성 참조](https://learn.chatgpt.com/docs/config-file/config-reference)와 [Claude Code MCP 안내](https://code.claude.com/docs/en/mcp)를 참고하십시오.
|
|
38
149
|
|
|
39
150
|
### 건너뛰기·제거
|
|
40
151
|
|
|
41
152
|
```sh
|
|
42
|
-
APTLY_SKIP_SETUP=1 npm install
|
|
153
|
+
APTLY_SKIP_SETUP=1 npm install -g aptly@latest
|
|
43
154
|
aptly setup --client codex --mode defaults
|
|
44
155
|
aptly remove --client all
|
|
45
156
|
```
|
|
46
157
|
|
|
47
|
-
`CI
|
|
158
|
+
`CI`나 npm `--ignore-scripts`도 등록을 건너뜁니다. 이후 `setup`으로 등록하십시오. 모드를 바꾸려면 등록을 제거하고 원하는 `--mode`로 다시 설정하십시오. `advisory`는 추천만 전달합니다. `partial`이면 호스트별 오류 코드를 확인하십시오. 제거 시 사용자 변경 항목은 보존하고 충돌을 알립니다.
|
|
48
159
|
|
|
49
160
|
## 자동 Hook
|
|
50
161
|
|
|
@@ -66,6 +177,20 @@ aptly remove --client all
|
|
|
66
177
|
| `get_routing_precedence` | 호출의 보존 근거와 미확인 설정 출처를 설명합니다 |
|
|
67
178
|
| `route_spawn_hook` | 설치한 정책에 따라 대상 호출의 기본값을 선택하거나 추천만 전달합니다 |
|
|
68
179
|
|
|
180
|
+
### 외부 전송과 자동 공유 끄기
|
|
181
|
+
|
|
182
|
+
자동 분류의 `summary`는 허용된 작업 라벨과 본문의 **첫 문단을 잘라 붙인 발췌문**입니다. 의미를 새로 요약하거나 익명화하지 않습니다. UTF-8 크기는 `min(4000, max_summary_bytes)` 이하이며 전체 HTTP 요청의 크기 제한은 아닙니다. Codex의 opaque 메시지 fallback은 본문을 해독·전송하지 않고 충분히 구체적인 `task_name`만 사용합니다. 라벨에도 민감한 정보가 들어갈 수 있습니다.
|
|
183
|
+
|
|
184
|
+
Decisions에는 `client`, `task.summary`, `task.operation`, `task.context_sufficient`와 후보 프로필 ID·모델·effort 설명 및 설정된 모델 특성이 전달됩니다. 분류용 API 키는 `Authorization` 헤더로, 요청 ID는 `X-Client-Request-Id` 헤더로 전송됩니다. 자동 경로의 ID는 해시이며 직접 추천의 ID는 호출자가 지정합니다. ID나 후보 설명에도 비밀을 넣지 마십시오.
|
|
185
|
+
|
|
186
|
+
자동 공유를 끄려면 `APTLY_HOOK_POLICY_PATH`가 가리키는 기존 비공개 정책 파일에서 **`enabled`만 `false`로 변경**하십시오. 나머지 필드와 소유권 기록은 유지하십시오. 이후 자동 Hook 호출은 분류 API나 호출 바인딩 파일을 만들기 전에 원래 호출을 보존합니다. 이미 시작한 전송을 되돌리거나 서버가 받은 내용을 회수하지는 못합니다. 생성된 정책을 바꾸면 설치·설정·제거 명령의 소유권 검사에서 충돌할 수 있으며, 해당 명령은 끄기 설정을 덮어쓰지 않습니다. 소유권 기록을 수정해 검사를 우회하지 마십시오.
|
|
187
|
+
|
|
188
|
+
`mode: advisory`도 분류 정보를 전송하므로 개인정보 보호용 비활성화가 아닙니다. `APTLY_HOOK_POLICY_PATH`를 지우면 기존 strict 경로로 전환될 수 있으므로 공유 끄기의 대안으로 사용하지 마십시오. `enabled: false`는 명시적인 `recommend_agent`·`aptly recommend` 요청까지 차단하지 않습니다.
|
|
189
|
+
|
|
190
|
+
공유할 요약을 직접 선택하려면 자동 공유를 끈 뒤 직접 추천에 필요한 정보만 작성하십시오. Aptly는 요약에 적은 URL의 문서나 소스 파일을 자동으로 읽어 첨부하지 않습니다. 알려진 키·Bearer 패턴을 거르는 검사는 완전한 비밀 탐지나 전송 안전성 보장이 아닙니다.
|
|
191
|
+
|
|
192
|
+
원장과 Hook 바인딩에는 요청 메타데이터·해시·캐시 결과를 저장하며 작업 발췌문을 저장하지 않습니다. Aptly의 진단 결과에도 원문을 넣지 않습니다. 다만 로컬 호스트가 실행을 이어가도록 Hook의 `updatedInput`에는 원래 작업이 유지됩니다. 호스트 자체의 대화·로그 저장은 Aptly가 제어하지 않습니다.
|
|
193
|
+
|
|
69
194
|
## 직접 추천
|
|
70
195
|
|
|
71
196
|
`recommend_agent` MCP와 CLI `recommend`는 작업 요약을 받아 프로필을 추천합니다. 자식을 직접 생성하지 않습니다. 아래 JSON을 MCP 도구 인자로 전달하거나 파일에 저장해 CLI의 표준 입력으로 제공하십시오.
|
|
@@ -164,6 +289,14 @@ Codex가 자식 `message`를 암호문으로 Hook에 전달하는 환경에서
|
|
|
164
289
|
|
|
165
290
|
측정은 **명시적 MCP 추천 → 추천 프로필을 인자로 전달한 호스트의 기본 실행**입니다. 자동 Hook의 URL 수집·전달 기능 검증이 아닙니다. 기준군은 직전 실측을 재사용했고 조건별 표본은 3회입니다. 문서 전체 읽기·원문 인용 일치·출력 형식은 확인했지만 품질 동등성, 통계적 유의성, 다른 업무의 절감을 보장하지 않습니다.
|
|
166
291
|
|
|
292
|
+
### 중단된 프로세스와 원장 잠금
|
|
293
|
+
|
|
294
|
+
이 잠금 방식은 Aptly `0.1.2`부터 지원하며 npm `0.1.1`에는 없습니다. JSON 원장의 요청 ID·`unknown`·완료 캐시·호출 수·비용 예약 형식은 유지합니다. 영속 원장에만 Node.js 24 내장 SQLite를 사용하며, 원장 옆의 `ledger.json.lock`은 정상 종료 후에도 남는 잠금 파일입니다. 파일이 있다는 사실만으로 활성 잠금을 뜻하지 않습니다. 새 방식에서는 프로세스 종료 시 OS 잠금이 해제되므로 후속 요청이 같은 원장을 다시 사용할 수 있습니다. 결과가 불명확했던 기존 ID를 재호출하거나 예약 비용을 되돌리지는 않습니다.
|
|
295
|
+
|
|
296
|
+
원장과 잠금 파일은 하드 링크를 지원하는 로컬 파일시스템의 비공개 디렉터리에 두고, 하나의 원장을 동일한 정규 경로로 사용하십시오. 네트워크 공유·클라우드 동기화 디렉터리·경로 별칭은 지원 범위가 아닙니다. 새 잠금 파일과 SQLite journal을 삭제·교체하거나, 사용 중 다른 DB 도구로 열지 마십시오. 잠금 파일의 나이와 PID만으로 소유자가 종료됐다고 판단하지 않습니다.
|
|
297
|
+
|
|
298
|
+
이전 버전의 빈 `.lock` 파일은 살아 있는 소유자가 있는지 확인할 수 없어 자동으로 초기화하거나 제거하지 않습니다. 구버전을 포함한 모든 관련 호스트·MCP·원장 접근 프로세스를 정지하고, 모든 writer를 새 버전으로 전환하십시오. 파일이 기존 방식의 잠금임을 확인한 경우에만 그 파일을 별도로 격리한 뒤 같은 JSON 원장 경로로 다시 시작합니다. 원장·`unknown`·비용·완료 결과는 초기화하거나 삭제하지 마십시오. 소유자나 형식을 확신할 수 없으면 차단 상태를 유지하고 조사하십시오.
|
|
299
|
+
|
|
167
300
|
## 진단과 개발
|
|
168
301
|
|
|
169
302
|
```sh
|
package/docs/guide/zh-CN.md
CHANGED
|
@@ -4,47 +4,158 @@
|
|
|
4
4
|
|
|
5
5
|
[返回 README](../../README.zh-CN.md)
|
|
6
6
|
|
|
7
|
-
韩语文档是正本。本指南介绍
|
|
7
|
+
韩语文档是正本。本指南介绍 Aptly 的常规安装与使用方法。可以安装软件包,并不表示所有账户都能访问相关模型。子代理的实际执行、审批、沙箱与 MCP 权限仍由 Claude Code 或 Codex 负责。
|
|
8
8
|
|
|
9
9
|
## 安装
|
|
10
10
|
|
|
11
|
-
需要 Node.js 24 或更高版本,以及 Claude Code 或 Codex
|
|
11
|
+
需要 Node.js 24 或更高版本,以及 Claude Code 或 Codex。请使用以下命令全局安装 npm 上的最新稳定版本:
|
|
12
|
+
|
|
13
|
+
**将现有持久化账本升级到 0.1.2 或更高版本前**,请停止所有可能访问该账本的宿主、MCP 服务器、独立 CLI 和旧版进程。新的持久锁不能与旧版写入进程并用。全新安装无需隔离旧锁。如果仍有旧版空锁,请遵循[账本迁移步骤](#进程中断与账本锁定),仅在离线状态下隔离已确认的旧锁,并保留 JSON 账本、`unknown` 记录、成本和已完成缓存。
|
|
12
14
|
|
|
13
15
|
```sh
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
npm install -g aptly@latest
|
|
17
|
+
aptly setup --client all --mode defaults
|
|
18
|
+
aptly --version
|
|
17
19
|
```
|
|
18
20
|
|
|
19
|
-
|
|
21
|
+
请运行 `aptly --version` 确认已安装的版本。切换 Node.js 环境后可能需要重新安装。
|
|
20
22
|
|
|
21
23
|
`postinstall` 会在当前用户现有的宿主配置目录中注册 MCP 和 `PreToolUse` Hook。如果使用 `CODEX_HOME` 或 `CLAUDE_CONFIG_DIR`,请向安装进程传递相同的环境。自动注册会跳过尚不存在的宿主目录;显式运行 `setup` 可以创建这些目录。若只需注册某个宿主,请使用 `--client codex` 或 `--client claude`。
|
|
22
24
|
|
|
23
25
|
新注册项会指定 `ROUTER_PROVIDER=decisions`、Hook 的 `defaults` 策略,以及各宿主独立的私有账本。其他现有配置与 Hook,以及 Aptly 原有的命令、环境、分类方式和账本路径都会保留。现有 fixture 配置不会自动切换为付费模式。
|
|
24
26
|
|
|
27
|
+
### 使用 CLI 设置
|
|
28
|
+
|
|
29
|
+
`set` 命令需要 0.1.1 或更高版本。命令不会自动切换现有启动路径。API 密钥设置仅允许当前软件包的标准 Node/服务器注册,并要求确认运行时支持系统凭据引用。自定义包装程序、旧版本及其他安装位置会以 `credential_launcher_unverified` 被拒绝;请先明确切换注册项或完成升级,再重新执行。
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
aptly set default
|
|
33
|
+
aptly set env APTLY_CODEX_MODELS
|
|
34
|
+
aptly set env OPENAI_API_KEY
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
第一条命令注册 Claude Code 和 Codex,并补充缺失的默认环境设置,不覆盖现有启动命令、环境变量白名单、分类方式、自定义候选或 advisory 策略。第二条命令以隐藏输入方式询问值,仅修改指定变量。第三条命令把 API 密钥存入操作系统凭据存储,并在所选宿主启动时读取。请勿把值作为命令参数传入。
|
|
38
|
+
|
|
39
|
+
默认选择两个宿主。可用 `--client codex`、`--client claude` 或 `--client all` 指定目标。例如,Claude 候选值可输入 `["haiku","sonnet","opus"]` 这样的 JSON 字符串。
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
aptly set env APTLY_CLAUDE_MODELS --client claude
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
自动化时请显式使用 `--stdin`。下面是公开变量的示例;不要把真实密钥放入 `printf` 命令或 shell 历史。
|
|
46
|
+
|
|
47
|
+
```sh
|
|
48
|
+
printf '%s\n' '["gpt-6.1-terra"]' | aptly set env APTLY_CODEX_MODELS --stdin
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
允许设置的公开键为 `ROUTER_PROVIDER`(`fixture` 或 `decisions`)、`APTLY_CLAUDE_MODELS`、`APTLY_CODEX_MODELS`、`CLAUDE_MODELS`、`CODEX_MODELS` 和 `APTLY_MODEL_INFO_PATH`。候选必须是受支持模型的 JSON 数组字符串;无效值、重复值及主名称与别名冲突会被拒绝。`[]` 关闭对应宿主的推荐;模型缓存必须使用私有目录内的绝对路径。账本及 Hook 策略路径等受管理项不能通过此命令更改。
|
|
52
|
+
|
|
53
|
+
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` 才明确选择系统存储认证。
|
|
54
|
+
|
|
55
|
+
命令只返回宿主状态和固定错误代码,不返回密钥值。结果为 `partial` 时,请逐个检查宿主。`credential_store_failed` 表示应检查存储访问或支持情况;`credential_rollback_failed` 表示需确认旧密钥是否恢复。失败宿主会在可能时恢复旧密钥,不能把其他宿主的成功视为所有宿主的原子成功。
|
|
56
|
+
|
|
57
|
+
保存超时或响应解析失败也可能发生在 OS 已写入新值之后。失败时会尝试恢复旧值;若原来没有值,则删除新条目,然后重新读取确认。如果无法确认恢复结果,会在原始错误代码之外添加 `credential_rollback_failed`。不要假定任一密钥仍然有效,请在重试前检查 OS 凭据存储。这是尽力恢复,并非跨进程或宿主的原子事务。
|
|
58
|
+
|
|
59
|
+
修改后请重启 MCP,并通过 `get_routing_capabilities` 查看 `provider`、候选和 `credential_status`。`os_store` 仅表示读到了密钥,不代表 API 已通过认证。默认设置和公开变量设置仍会保留自定义包装程序。API 密钥设置不会修改未经确认的启动路径所对应的宿主设置;如果已尝试保存,则会在可能时恢复该宿主的旧密钥。不要假定新密钥会通过现有包装程序自动生效。命令不会绕过 Codex 的 `/hooks` 信任批准或宿主权限。
|
|
60
|
+
|
|
61
|
+
### 恢复不兼容的启动路径
|
|
62
|
+
|
|
63
|
+
以下选项需要 Aptly 0.1.2 或更高版本,npm 0.1.1 不包含这些选项。如需从源码测试,请运行 `npm ci --ignore-scripts` 和 `npm run build`,然后将下文的 `aptly` 替换为 `node bin/aptly.ts`。
|
|
64
|
+
|
|
65
|
+
密钥设置会在输入和保存前诊断所选宿主。任一宿主失败时,不提示输入,也不修改任何宿主。`--check` 不访问密钥或凭据存储。`credential_node_mismatch`、`credential_server_mismatch` 和 `credential_runtime_unsupported` 分别表示 Node 路径、服务器路径及 OS 存储支持不兼容。
|
|
66
|
+
|
|
67
|
+
如果只有 Claude 失败,按以下顺序诊断,仅在返回 `launcher_migration_available` 时考虑迁移:
|
|
68
|
+
|
|
69
|
+
```sh
|
|
70
|
+
aptly set env OPENAI_API_KEY --client claude --check
|
|
71
|
+
aptly setup --client claude --migrate-launcher --dry-run
|
|
72
|
+
aptly setup --client claude --migrate-launcher
|
|
73
|
+
aptly set env OPENAI_API_KEY --client claude
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
`--dry-run` 不修改文件。迁移仅将与所有权记录一致的 Aptly 标准注册的 Node 和服务器路径更新到当前构建,保留环境设置、Hook、策略及其他宿主,不访问凭据,也不执行旧启动程序。自定义包装程序、缺少所有权记录或已修改的注册会被拒绝。请在本地检查此类注册,使用包装程序的安全环境传递方式,或切换到另行审核的标准注册。不要编辑或删除所有权记录以绕过验证。
|
|
77
|
+
|
|
78
|
+
已成功的 Codex 无需重新设置。仅指定失败的宿主重试,然后重启 MCP。Codex 仍需通过 `/hooks` 审核信任。诊断后的配置变更会以 `concurrent_configuration_change` 中止。恢复时若发现其他密钥或无法读取当前值,不会覆盖存储,而是返回 `credential_rollback_failed`。文件与 OS 存储之间不是原子事务,请避免同时运行配置操作。
|
|
79
|
+
|
|
25
80
|
### 密钥与重启
|
|
26
81
|
|
|
27
|
-
`OPENAI_API_KEY`
|
|
82
|
+
通过安全环境或凭据启动程序将分类用的 `OPENAI_API_KEY` 传递给 MCP 进程。它与宿主订阅登录无关。不要将密钥值写入命令参数、请求、配置文件、源码、日志或临时文件。
|
|
28
83
|
|
|
29
|
-
|
|
84
|
+
### MCP 环境变量设置步骤
|
|
30
85
|
|
|
31
|
-
|
|
86
|
+
运行 `setup` 后,将以下示例合并到现有 `aptly` 注册中。保留 `command`、`args`、凭据启动程序、`ROUTER_LEDGER_PATH` 和 `APTLY_HOOK_POLICY_PATH`。Setup 会创建私有账本和策略目录。手动指定账本时,应使用用户所有、权限为 700 的目录内的绝对路径。
|
|
32
87
|
|
|
33
|
-
|
|
88
|
+
#### 配置文件位置
|
|
89
|
+
|
|
90
|
+
| 宿主 | Aptly 使用的用户注册位置 |
|
|
34
91
|
|---|---|
|
|
35
|
-
| `
|
|
36
|
-
| `
|
|
37
|
-
|
|
92
|
+
| Codex | `$CODEX_HOME/config.toml`;未设置 `CODEX_HOME` 时为 `~/.codex/config.toml` |
|
|
93
|
+
| Claude Code | `~/.claude.json` 中的 `mcpServers.aptly`;设置 `CLAUDE_CONFIG_DIR` 时为该目录中的 `.claude.json` |
|
|
94
|
+
|
|
95
|
+
Claude Code 默认将 Hook 存储在 `~/.claude/settings.json`;设置 `CLAUDE_CONFIG_DIR` 时则使用 `$CLAUDE_CONFIG_DIR/settings.json`。此文件与 MCP 注册分开。若使用项目 `.mcp.json`、托管设置或账户专用目录,请先通过 `/mcp` 确认当前注册,再编辑或添加。
|
|
96
|
+
|
|
97
|
+
#### 传递 API 密钥
|
|
98
|
+
|
|
99
|
+
直接启动时,在 **Bash** 中输入密钥,不回显也不记录到命令历史,然后从同一 shell 启动宿主。使用 zsh 时请先运行 `bash`:
|
|
100
|
+
|
|
101
|
+
```sh
|
|
102
|
+
read -rsp 'OpenAI API key: ' OPENAI_API_KEY
|
|
103
|
+
printf '\n'
|
|
104
|
+
export OPENAI_API_KEY
|
|
105
|
+
codex
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Claude Code 用户将 `codex` 替换为 `claude`。密钥不会永久保存。已运行的 GUI 不会继承其他终端的环境,请使用应用的安全环境传递功能或保留现有凭据启动程序。
|
|
109
|
+
|
|
110
|
+
#### Codex 示例
|
|
111
|
+
|
|
112
|
+
编辑现有 `[mcp_servers.aptly]` 表,不要重复添加同名表。向 `env_vars` 添加 `OPENAI_API_KEY`,保留已有条目。`env_vars` 按名称转发宿主环境变量,`.env` 向 MCP 提供固定值。
|
|
113
|
+
|
|
114
|
+
```toml
|
|
115
|
+
[mcp_servers.aptly]
|
|
116
|
+
env_vars = ["OPENAI_API_KEY"]
|
|
117
|
+
|
|
118
|
+
[mcp_servers.aptly.env]
|
|
119
|
+
ROUTER_PROVIDER = "decisions"
|
|
120
|
+
APTLY_CLAUDE_MODELS = '["haiku","sonnet","opus"]'
|
|
121
|
+
APTLY_CODEX_MODELS = '["gpt-6-luna","gpt-6.1-terra","gpt-6.1-sol"]'
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
#### Claude Code 示例
|
|
125
|
+
|
|
126
|
+
将以下值合并到现有 `mcpServers.aptly.env` 对象:
|
|
127
|
+
|
|
128
|
+
```json
|
|
129
|
+
{
|
|
130
|
+
"ROUTER_PROVIDER": "decisions",
|
|
131
|
+
"APTLY_CLAUDE_MODELS": "[\"haiku\",\"sonnet\",\"opus\"]",
|
|
132
|
+
"APTLY_CODEX_MODELS": "[\"gpt-6-luna\",\"gpt-6.1-terra\",\"gpt-6.1-sol\"]"
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
直接启动时,可用以下可选引用传递 Claude Code 环境中已有的密钥。使用凭据启动程序时不要添加。若变量缺失,密钥不会传入,引用字符串也可能保持未展开状态:
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"OPENAI_API_KEY": "${OPENAI_API_KEY}"
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
模型候选使用 **JSON 字符串**。不设置则采用默认值,`[]` 禁用该宿主的推荐。Aptly 读取 MCP 启动环境,不会自动加载项目 `.env` 文件。
|
|
145
|
+
|
|
146
|
+
修改后重启宿主或 MCP。**在 Codex 的 `/hooks` 中审核新 Hook 并批准信任。** 通过 `/mcp` 和 `get_routing_capabilities` 检查 `provider`、候选和 `automatic_hook.mode`。免费状态查询不验证密钥认证;`recommend_agent` 可能产生费用。`unauthorized` 时检查密钥传递,`needs_context` 时检查任务摘要。
|
|
147
|
+
|
|
148
|
+
配置位置与传递方式的官方说明,请参阅 [Codex 配置参考](https://learn.chatgpt.com/docs/config-file/config-reference)和 [Claude Code MCP 指南](https://code.claude.com/docs/en/mcp)。
|
|
38
149
|
|
|
39
150
|
### 跳过与移除
|
|
40
151
|
|
|
41
152
|
```sh
|
|
42
|
-
APTLY_SKIP_SETUP=1 npm install
|
|
153
|
+
APTLY_SKIP_SETUP=1 npm install -g aptly@latest
|
|
43
154
|
aptly setup --client codex --mode defaults
|
|
44
155
|
aptly remove --client all
|
|
45
156
|
```
|
|
46
157
|
|
|
47
|
-
|
|
158
|
+
`CI` 或 npm `--ignore-scripts` 也会跳过注册,可随后运行 `setup`。更改模式时,先移除注册,再使用所需 `--mode` 重新设置;`advisory` 只提供建议。出现 `partial` 时检查各宿主错误代码。移除操作保留用户修改的条目并报告冲突。
|
|
48
159
|
|
|
49
160
|
## 自动 Hook
|
|
50
161
|
|
|
@@ -66,6 +177,20 @@ aptly remove --client all
|
|
|
66
177
|
| `get_routing_precedence` | 解释调用的保留依据与未确认的配置来源 |
|
|
67
178
|
| `route_spawn_hook` | 根据已安装的策略选择目标调用的默认值,或仅传递推荐 |
|
|
68
179
|
|
|
180
|
+
### 对外传输与关闭自动共享
|
|
181
|
+
|
|
182
|
+
自动分类的 `summary` 是由有效任务标签与正文**截取后的首段拼接成的摘录**,并不是重新进行语义摘要或匿名化。其 UTF-8 大小不超过 `min(4000, max_summary_bytes)`;这不是整个 HTTP 请求的大小限制。Codex 的 opaque 消息回退仅使用足够具体的 `task_name`,不会解码或传输该正文。标签也可能包含敏感信息。
|
|
183
|
+
|
|
184
|
+
Decisions 会收到 `client`、`task.summary`、`task.operation`、`task.context_sufficient`,以及候选配置 ID、模型与 effort 说明、已配置的模型特性。分类 API 密钥通过 `Authorization` 请求头发送,请求 ID 通过 `X-Client-Request-Id` 发送。自动路径使用哈希 ID,直接推荐的 ID 由调用方提供。请勿在 ID 或候选说明中放入秘密信息。
|
|
185
|
+
|
|
186
|
+
如需关闭自动共享,请在 `APTLY_HOOK_POLICY_PATH` 指向的现有私有策略文件中,**仅将 `enabled` 改为 `false`**,保留其他字段和所有权记录。之后的自动 Hook 调用会在分类或创建调用绑定文件之前保留原始调用。这无法撤销已开始的传输,也无法收回服务器已收到的信息。修改生成的策略后,安装、配置或移除命令的所有权检查可能报告冲突;这些命令不会覆盖已关闭的策略。请勿修改所有权记录来绕过检查。
|
|
187
|
+
|
|
188
|
+
`mode: advisory` 仍会传输分类数据,不是隐私共享的关闭方式。删除 `APTLY_HOOK_POLICY_PATH` 可能启用既有 strict 路径,请勿以此代替关闭共享。`enabled: false` 不会阻止显式发起的 `recommend_agent` 或 `aptly recommend` 请求。
|
|
189
|
+
|
|
190
|
+
如需自行控制共享摘要,请先关闭自动共享,再为直接推荐编写必要的信息。Aptly 不会自动获取摘要中 URL 的文档,也不会附加提到的源文件。已知密钥和 Bearer 模式检查不能完整检测所有秘密,也不能保证文本适合对外传输。
|
|
191
|
+
|
|
192
|
+
账本与 Hook 绑定保存请求元数据、哈希和缓存结果,不保存任务摘录。Aptly 诊断也不包含任务原文。但本地 Hook 的 `updatedInput` 会保留原任务,以便宿主继续执行。宿主自身的会话和日志保留不受 Aptly 控制。
|
|
193
|
+
|
|
69
194
|
## 直接推荐
|
|
70
195
|
|
|
71
196
|
`recommend_agent` MCP 与 CLI 的 `recommend` 接收任务摘要并推荐执行配置,不会直接创建子代理。请将以下 JSON 作为 MCP 工具参数传递,或保存为文件并通过 CLI 的标准输入提供。
|
|
@@ -164,6 +289,14 @@ export APTLY_MODEL_INFO_PATH=/absolute/private-aptly-state/model-info.json
|
|
|
164
289
|
|
|
165
290
|
测量路径为**显式 MCP 推荐 → 将推荐配置作为参数传递给宿主原生调用**。这不是对自动 Hook 的 URL 收集或传递功能的验证。基准组复用了紧接在此前的实测数据,每个条件的样本为 3 次。已确认各次执行读取了完整文档,并检查了原文引用的一致性和输出格式。这些检查不能证明结果质量相同或差异具有统计显著性,也不能保证其他任务会降低成本。
|
|
166
291
|
|
|
292
|
+
### 进程中断与账本锁定
|
|
293
|
+
|
|
294
|
+
此锁定方案需要 Aptly `0.1.2` 或更高版本,npm `0.1.1` 不包含。JSON 账本保留原有的请求 ID、`unknown` 记录、已完成缓存、调用次数和预留成本。只有持久化账本使用 Node.js 24 内置的 SQLite。相邻的 `ledger.json.lock` 在正常退出后仍会保留;仅凭文件存在,不能判断锁仍被占用。新方案在进程退出时释放 OS 锁,后续请求可继续使用同一账本,但不会重试原有的结果不明 ID,也不会退回预留成本。
|
|
295
|
+
|
|
296
|
+
请将账本和锁放在支持硬链接的本地文件系统私有目录中,并为每个账本使用同一个规范路径。网络共享、云同步目录和路径别名不在支持范围内。不要删除或替换新锁文件及 SQLite journal,也不要在使用期间用其他数据库工具打开它们。仅凭文件年龄或 PID,无法确认所有者已退出。
|
|
297
|
+
|
|
298
|
+
旧版空 `.lock` 文件无法证明所有者是否仍存活,因此不会自动初始化或删除。请先停止所有相关宿主、MCP 进程及访问账本的进程,包括旧版本,并升级所有写入进程。只有确认该文件属于旧锁定方案后,才可将其单独隔离,再使用相同的 JSON 账本路径重新启动。请勿重置或删除账本、`unknown` 记录、成本或已完成结果。若无法确认所有者或格式,请保持阻止访问并调查原因。
|
|
299
|
+
|
|
167
300
|
## 诊断与开发
|
|
168
301
|
|
|
169
302
|
```sh
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aptly",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
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": "
|
|
25
|
+
"description": "Model and reasoning recommendations for subagents, powered by the OpenAI Decisions API.",
|
|
25
26
|
"license": "MIT",
|
|
26
27
|
"bin": {
|
|
27
28
|
"aptly": "dist/bin/aptly.js"
|