@tokentestai/ais 0.1.0
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/LICENSE +21 -0
- package/README.en.md +238 -0
- package/README.fr.md +238 -0
- package/README.ja.md +234 -0
- package/README.ko.md +234 -0
- package/README.md +234 -0
- package/dist/chunk-WVTDLVUU.js +1400 -0
- package/dist/chunk-WVTDLVUU.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +6145 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +547 -0
- package/dist/index.js +5784 -0
- package/dist/index.js.map +1 -0
- package/dist/postinstall.d.ts +27 -0
- package/dist/postinstall.js +54 -0
- package/dist/postinstall.js.map +1 -0
- package/package.json +62 -0
package/README.ja.md
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
<p align="right">
|
|
2
|
+
<a href="./README.md">简体中文</a> | <a href="./README.en.md">English</a> | <a href="./README.ko.md">한국어</a> | 日本語 | <a href="./README.fr.md">Français</a>
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# AIS
|
|
6
|
+
|
|
7
|
+
> ターミナルで `npm` のインストールコマンドを 1 行実行するだけで、**完全にローカルで動作しながら** AI エージェントが扱うパスワード、キー、接続文字列を守るためのツールです。
|
|
8
|
+
|
|
9
|
+
`AIS` の目的はとてもシンプルです。
|
|
10
|
+
|
|
11
|
+
- AI に本物の作業はそのまま任せられる
|
|
12
|
+
- ただし AI には本当のパスワードをできるだけ見せない
|
|
13
|
+
- 本物のパスワードは本当に必要な瞬間だけ自分の端末上で復元する
|
|
14
|
+
- それでも最終的な処理は普通に成功する
|
|
15
|
+
|
|
16
|
+
<p align="center">
|
|
17
|
+
<img src="./docs/images/readme-flow-ja.jpg" alt="AIS の仕組み: 本物のパスワードはローカルで先にトークンへ置き換えられ、クラウド AI はそのトークンしか見ず、必要な瞬間だけローカルで本物に戻される" width="100%" />
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
## 1 行でインストール
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install -g @tokentestai/ais
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
インストール後のコマンド名は `ais` です。
|
|
27
|
+
|
|
28
|
+
現在の対応状況:
|
|
29
|
+
|
|
30
|
+
- `macOS` と `Linux` をネイティブ対応
|
|
31
|
+
- `Windows` 対応は継続中
|
|
32
|
+
- `Claude Code`、`Codex`、`OpenClaw` をネイティブ対応
|
|
33
|
+
|
|
34
|
+
## 何を解決するのか
|
|
35
|
+
|
|
36
|
+
今では多くの人が、Web サイトのパスワード、サーバーパスワード、データベース接続文字列、API キーなどの機密情報を AI エージェントに渡して、ログイン、デプロイ、フォーム入力、コマンド実行を任せるようになっています。
|
|
37
|
+
|
|
38
|
+
これは便利であり、今後さらに増えていく流れでもあります。
|
|
39
|
+
|
|
40
|
+
ただし問題も明確です。
|
|
41
|
+
|
|
42
|
+
- **本物のパスワードを平文のまま** AI に渡すと、その値が AI から見える経路に入ってしまう
|
|
43
|
+
- 本物のパスワードが自分の端末を離れた時点で、その後にどのログ、サポート基盤、保存レイヤー、外部サービスが触れるかを自分で制御しにくくなる
|
|
44
|
+
- 公式 API を使う場合でも、サードパーティ API プロバイダーを使う場合でも、技術的にはリクエスト内容を見られる位置にいる可能性がある
|
|
45
|
+
|
|
46
|
+
`AIS` がやりたいことは 1 つです。
|
|
47
|
+
|
|
48
|
+
**本物のパスワードを、必要以上に自分の端末の外へ出さないこと。**
|
|
49
|
+
|
|
50
|
+
## いちばん簡単な理解のしかた
|
|
51
|
+
|
|
52
|
+
たとえば AI にサイトログインを任せていて、本物のパスワードが次の値だとします。
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
qwert123
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`AIS` はまず、この値をローカルで次のような置き換えトークンに変えます。
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
__SECRET_01__
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
その時点で:
|
|
65
|
+
|
|
66
|
+
- AI が見るのは `__SECRET_01__`
|
|
67
|
+
- AI サービス提供者が見るのも `__SECRET_01__`
|
|
68
|
+
- 本物の `qwert123` はそのまま外へ送られない
|
|
69
|
+
|
|
70
|
+
そして AI が実際に自分の端末上でログイン処理をするときだけ、`AIS` がローカルで次のように戻します。
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
__SECRET_01__ -> qwert123
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
そのため、最終的にサイトへ入力されるのは正しい本物のパスワード `qwert123` のままであり、保護レイヤーを入れたせいで処理が失敗することはありません。
|
|
77
|
+
|
|
78
|
+
## 仕組み
|
|
79
|
+
|
|
80
|
+
全体の流れは 5 ステップで理解できます。
|
|
81
|
+
|
|
82
|
+
1. ユーザーが AI に本物のパスワード、キー、接続文字列を渡して作業を依頼する
|
|
83
|
+
2. `AIS` がローカルでその機密値を見つけ、置き換えトークンへ変える
|
|
84
|
+
3. クラウドへ送る段階では、AI は本物ではなくトークンだけを見る
|
|
85
|
+
4. AI が自分の端末上で実際にコマンド実行、フォーム入力、設定書き込みを行う瞬間だけ、`AIS` がローカルで本物の値を復元する
|
|
86
|
+
5. 処理は通常どおり完了するが、本物の機密値はできるだけ端末の外へ出ない
|
|
87
|
+
|
|
88
|
+
つまり:
|
|
89
|
+
|
|
90
|
+
- 送る前にローカルで隠す
|
|
91
|
+
- 本当に使う瞬間だけローカルで戻す
|
|
92
|
+
|
|
93
|
+
## なぜ作ったのか
|
|
94
|
+
|
|
95
|
+
私たち自身が `Claude Code`、`Codex`、`OpenClaw` のヘビーユーザーです。
|
|
96
|
+
|
|
97
|
+
今後、人は AI により多くの権限を渡していくと考えています。
|
|
98
|
+
|
|
99
|
+
問題は「AI に作業を任せるかどうか」ではなく、
|
|
100
|
+
|
|
101
|
+
**AI にもっと多くを任せても、本物のパスワードを平文のまま流通させないで済むかどうか** です。
|
|
102
|
+
|
|
103
|
+
`AIS` はそのために作られました。
|
|
104
|
+
|
|
105
|
+
- ローカル優先
|
|
106
|
+
- オープンソース
|
|
107
|
+
- できるだけ今の使い方を変えない
|
|
108
|
+
- まずは現実的で重要な 1 層のリスクを下げる
|
|
109
|
+
|
|
110
|
+
## どんな用途に向いているか
|
|
111
|
+
|
|
112
|
+
- AI にサイトログインを任せたいが、本物のパスワード平文はクラウドへ送りたくない
|
|
113
|
+
- AI にサーバー操作を任せたいが、サーバーパスワードを外部モデル経路へそのまま出したくない
|
|
114
|
+
- AI に設定ファイル作成、API 呼び出し、スクリプト実行を任せたいが、キーや接続文字列は直接見せたくない
|
|
115
|
+
- 自動化の便利さは保ちつつ、機密情報の露出を減らしたい
|
|
116
|
+
|
|
117
|
+
## クイックスタート
|
|
118
|
+
|
|
119
|
+
まずローカル設定を作成します。
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
ais config
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
先に秘密情報を手動で保存したい場合:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
ais add github-token
|
|
129
|
+
ais add github-token ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
`Claude Code` をラップして起動:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
ais claude
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
`Codex` をラップして起動:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
ais -- codex --sandbox danger-full-access
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
`OpenClaw` をラップして起動:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
ais -- openclaw <普段使う引数>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## ターミナル UI
|
|
151
|
+
|
|
152
|
+
`AIS` にはターミナル UI もあり、次のことができます。
|
|
153
|
+
|
|
154
|
+
- どの値が保護されたか確認する
|
|
155
|
+
- 一部の値を「保護しない」に変更する
|
|
156
|
+
- ローカルの挙動を確認・調整する
|
|
157
|
+
|
|
158
|
+
起動方法:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
ais ais
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
例:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
ais ais exclude <id>
|
|
168
|
+
ais ais exclude-type PASSWORD
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## なぜ「完全ローカル」が重要なのか
|
|
172
|
+
|
|
173
|
+
大事なのは、パスワードを見た目だけ変えることではありません。
|
|
174
|
+
|
|
175
|
+
本当に大事なのは次の一点です。
|
|
176
|
+
|
|
177
|
+
**本物のパスワードは、できるだけ自分の端末の中に残すこと。**
|
|
178
|
+
|
|
179
|
+
本物のパスワードが外へ出続けるなら、その後に何が起きるかを自分でコントロールしにくくなります。
|
|
180
|
+
|
|
181
|
+
`AIS` は重要な処理をローカルに留めようとします。
|
|
182
|
+
|
|
183
|
+
- ローカル検出
|
|
184
|
+
- ローカル置換
|
|
185
|
+
- ローカル復元
|
|
186
|
+
- ローカル実行
|
|
187
|
+
|
|
188
|
+
## 現時点での限界
|
|
189
|
+
|
|
190
|
+
これは万能のセキュリティツールではありません。
|
|
191
|
+
|
|
192
|
+
有用ですが、すべてを解決するわけではありません。
|
|
193
|
+
|
|
194
|
+
たとえば:
|
|
195
|
+
|
|
196
|
+
- すでに自分の端末が侵害されているなら、このツールだけでは防げない
|
|
197
|
+
- 権限管理の代わりにはならず、最小権限・監査・分離を置き換えない
|
|
198
|
+
- 置き換えトークンが分解・変形・再構成されると、状況によっては元に戻せない
|
|
199
|
+
- ツールチェーンがローカル可視レイヤーを完全に迂回する場合、保護効果は限定される
|
|
200
|
+
|
|
201
|
+
つまり正確には:
|
|
202
|
+
|
|
203
|
+
`AIS` は **本物の秘密が端末外へ出る可能性を減らすためのツール** であり、「これで絶対に安全」という意味ではありません。
|
|
204
|
+
|
|
205
|
+
## こういう人に向いています
|
|
206
|
+
|
|
207
|
+
- AI エージェントに実運用レベルの作業を任せている人
|
|
208
|
+
- AI にもっと権限を渡したいが、パスワード平文の露出は避けたい人
|
|
209
|
+
- 公式 API やサードパーティ API プロバイダーを使いながらも、ローカル側の制御層を 1 つ追加したい人
|
|
210
|
+
- 使い勝手を大きく損なわずに自動化を少しでも安全にしたい人
|
|
211
|
+
|
|
212
|
+
## ローカル検証
|
|
213
|
+
|
|
214
|
+
現行バージョンをローカルで検証する場合:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
npm install
|
|
218
|
+
npm run lint
|
|
219
|
+
npm run build
|
|
220
|
+
npm run test
|
|
221
|
+
npm run typecheck
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## オープンソース
|
|
225
|
+
|
|
226
|
+
これはローカル優先のオープンソースツールです。
|
|
227
|
+
|
|
228
|
+
すべてのセキュリティ戦略を置き換えるものではなく、現代の AI ワークフローで最もよく見落とされる、しかし非常に現実的な 1 層を補うためのものです。
|
|
229
|
+
|
|
230
|
+
**AI にパスワードを渡さなければならないなら、まず本物のパスワードをそのまま外へ送らないようにする。**
|
|
231
|
+
|
|
232
|
+
## ライセンス
|
|
233
|
+
|
|
234
|
+
MIT
|
package/README.ko.md
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
<p align="right">
|
|
2
|
+
<a href="./README.md">简体中文</a> | <a href="./README.en.md">English</a> | 한국어 | <a href="./README.ja.md">日本語</a> | <a href="./README.fr.md">Français</a>
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# AIS
|
|
6
|
+
|
|
7
|
+
> 터미널에서 `npm` 설치 명령 한 줄만 실행하면, **순수 로컬 환경에서** AI 에이전트가 다루는 비밀번호, 키, 연결 문자열을 보호할 수 있도록 도와주는 도구입니다.
|
|
8
|
+
|
|
9
|
+
`AIS`의 목표는 단순합니다.
|
|
10
|
+
|
|
11
|
+
- 실제 작업은 계속 AI에게 맡길 수 있어야 하고
|
|
12
|
+
- AI는 실제 비밀번호를 가능한 한 보지 못해야 하며
|
|
13
|
+
- 진짜 비밀번호는 꼭 필요한 순간에만 내 컴퓨터에서 복원되어야 하고
|
|
14
|
+
- 전체 작업은 정상적으로 끝나야 합니다
|
|
15
|
+
|
|
16
|
+
<p align="center">
|
|
17
|
+
<img src="./docs/images/readme-flow-ko.jpg" alt="AIS 동작 원리: 실제 비밀번호는 로컬에서 먼저 토큰으로 바뀌고, 클라우드 AI는 토큰만 보며, 실제 비밀번호는 필요할 때만 로컬에서 다시 복원됩니다" width="100%" />
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
## 한 줄 설치
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install -g @tokentestai/ais
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
설치 후 실행 명령어는 `ais` 입니다.
|
|
27
|
+
|
|
28
|
+
현재 상태:
|
|
29
|
+
|
|
30
|
+
- `macOS`, `Linux` 기본 지원
|
|
31
|
+
- `Windows` 지원은 계속 보완 중
|
|
32
|
+
- `Claude Code`, `Codex`, `OpenClaw` 기본 지원
|
|
33
|
+
|
|
34
|
+
## 어떤 문제를 해결하나요?
|
|
35
|
+
|
|
36
|
+
이제 많은 사람들이 웹사이트 비밀번호, 서버 비밀번호, 데이터베이스 연결 문자열, API 키 같은 민감한 정보를 AI 에이전트에게 넘겨 로그인, 배포, 폼 작성, 명령 실행 같은 일을 맡깁니다.
|
|
37
|
+
|
|
38
|
+
이건 편리하고, 앞으로 더 흔해질 가능성이 큽니다.
|
|
39
|
+
|
|
40
|
+
하지만 문제도 분명합니다.
|
|
41
|
+
|
|
42
|
+
- **실제 비밀번호 평문**을 AI에게 주면, 그 정보가 AI가 볼 수 있는 경로 안으로 들어갈 수 있습니다
|
|
43
|
+
- 실제 비밀번호가 내 컴퓨터를 벗어나는 순간, 이후 어떤 로그, 지원 시스템, 저장 계층, 외부 서비스가 그 값을 다루게 될지 직접 통제하기 어려워집니다
|
|
44
|
+
- 공식 API를 쓰든, 제3자 API 공급자를 쓰든, 기술적으로는 요청 내용을 볼 수 있는 위치에 있을 수 있습니다
|
|
45
|
+
|
|
46
|
+
`AIS`가 해결하려는 핵심은 한 가지입니다.
|
|
47
|
+
|
|
48
|
+
**실제 비밀번호가 내 컴퓨터를 불필요하게 떠나지 않게 만들기.**
|
|
49
|
+
|
|
50
|
+
## 가장 쉬운 이해 방법
|
|
51
|
+
|
|
52
|
+
예를 들어 AI에게 어떤 사이트 로그인을 맡기고, 실제 비밀번호가 다음과 같다고 해봅시다.
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
qwert123
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`AIS`는 먼저 이 값을 내 컴퓨터에서 이런 식의 대체 토큰으로 바꿉니다.
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
__SECRET_01__
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
그 시점부터:
|
|
65
|
+
|
|
66
|
+
- AI가 보는 것은 `__SECRET_01__`
|
|
67
|
+
- AI 서비스 제공자가 보는 것도 `__SECRET_01__`
|
|
68
|
+
- 실제 `qwert123`은 그대로 밖으로 나가지 않음
|
|
69
|
+
|
|
70
|
+
그리고 AI가 실제로 내 컴퓨터에서 로그인 동작을 수행해야 할 순간에만 `AIS`가 로컬에서 다음처럼 복원합니다.
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
__SECRET_01__ -> qwert123
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
그래서 최종적으로 웹사이트에 입력되는 값은 여전히 진짜 비밀번호 `qwert123`이고, 보호층 때문에 작업이 실패하지도 않습니다.
|
|
77
|
+
|
|
78
|
+
## 동작 방식
|
|
79
|
+
|
|
80
|
+
전체 흐름은 5단계로 이해하면 됩니다.
|
|
81
|
+
|
|
82
|
+
1. 사용자가 AI에게 실제 비밀번호, 키, 연결 문자열을 넘겨 작업을 맡깁니다.
|
|
83
|
+
2. `AIS`가 로컬에서 민감한 값을 감지하고 대체 토큰으로 바꿉니다.
|
|
84
|
+
3. 클라우드로 나갈 때 AI는 실제 값이 아니라 토큰만 봅니다.
|
|
85
|
+
4. AI가 내 컴퓨터에서 실제 명령 실행, 폼 입력, 설정 파일 작성 같은 작업을 할 때만 `AIS`가 로컬에서 실제 값을 복원합니다.
|
|
86
|
+
5. 작업은 정상적으로 끝나지만, 실제 민감 정보는 가능한 한 내 컴퓨터 밖으로 나가지 않습니다.
|
|
87
|
+
|
|
88
|
+
쉽게 말하면:
|
|
89
|
+
|
|
90
|
+
- 보내기 전에 로컬에서 가린다
|
|
91
|
+
- 정말 쓸 때만 로컬에서 다시 꺼낸다
|
|
92
|
+
|
|
93
|
+
## 왜 만들었나요?
|
|
94
|
+
|
|
95
|
+
우리도 `Claude Code`, `Codex`, `OpenClaw`를 강하게 사용하는 팀입니다.
|
|
96
|
+
|
|
97
|
+
앞으로 사람들은 AI에게 더 많은 권한을 줄 가능성이 크다고 봅니다.
|
|
98
|
+
|
|
99
|
+
문제는 “AI가 일을 대신하게 할 것인가”가 아니라,
|
|
100
|
+
|
|
101
|
+
**AI에게 더 많은 일을 맡기면서도 실제 비밀번호가 평문으로 돌아다니지 않게 할 수 있는가** 입니다.
|
|
102
|
+
|
|
103
|
+
`AIS`는 바로 그 지점에서 출발했습니다.
|
|
104
|
+
|
|
105
|
+
- 로컬 우선
|
|
106
|
+
- 오픈소스
|
|
107
|
+
- 사용 습관은 최대한 그대로
|
|
108
|
+
- 현실적인 위험 한 층을 먼저 줄이는 도구
|
|
109
|
+
|
|
110
|
+
## 어디에 쓸 수 있나요?
|
|
111
|
+
|
|
112
|
+
- AI에게 사이트 로그인을 맡기고 싶지만 실제 비밀번호 평문은 클라우드로 보내고 싶지 않을 때
|
|
113
|
+
- AI에게 서버 작업을 맡기고 싶지만 서버 비밀번호를 외부 모델 경로에 그대로 노출하고 싶지 않을 때
|
|
114
|
+
- AI에게 설정 파일 작성, API 호출, 스크립트 실행을 맡기되 키와 연결 문자열은 직접 노출하고 싶지 않을 때
|
|
115
|
+
- 자동화 편의성은 유지하면서 민감 정보 노출은 줄이고 싶을 때
|
|
116
|
+
|
|
117
|
+
## 빠른 시작
|
|
118
|
+
|
|
119
|
+
먼저 로컬 설정을 만듭니다.
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
ais config
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
먼저 비밀번호나 키를 수동 등록하고 싶다면:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
ais add github-token
|
|
129
|
+
ais add github-token ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
`Claude Code` 실행:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
ais claude
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
`Codex` 실행:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
ais -- codex --sandbox danger-full-access
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
`OpenClaw` 실행:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
ais -- openclaw <평소에 쓰는 인자들>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## 터미널 UI
|
|
151
|
+
|
|
152
|
+
`AIS`에는 터미널 UI도 포함되어 있어서:
|
|
153
|
+
|
|
154
|
+
- 어떤 값이 보호되었는지 확인하고
|
|
155
|
+
- 어떤 값은 보호하지 않도록 바꾸고
|
|
156
|
+
- 로컬 동작 상태를 볼 수 있습니다
|
|
157
|
+
|
|
158
|
+
실행:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
ais ais
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
예시:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
ais ais exclude <id>
|
|
168
|
+
ais ais exclude-type PASSWORD
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## 왜 “로컬 전용”이 중요한가요?
|
|
172
|
+
|
|
173
|
+
핵심은 비밀번호를 보기 좋게 바꾸는 것이 아닙니다.
|
|
174
|
+
|
|
175
|
+
핵심은 이것입니다.
|
|
176
|
+
|
|
177
|
+
**실제 비밀번호는 가능하면 내 컴퓨터 안에 남아 있어야 한다.**
|
|
178
|
+
|
|
179
|
+
실제 비밀번호가 계속 밖으로 나가야 한다면, 그 뒤에 어떤 일이 벌어질지 직접 통제하기 어렵습니다.
|
|
180
|
+
|
|
181
|
+
`AIS`는 가장 중요한 단계를 로컬에 묶으려 합니다.
|
|
182
|
+
|
|
183
|
+
- 로컬 감지
|
|
184
|
+
- 로컬 치환
|
|
185
|
+
- 로컬 복원
|
|
186
|
+
- 로컬 실행
|
|
187
|
+
|
|
188
|
+
## 현재 한계
|
|
189
|
+
|
|
190
|
+
이 도구를 만능 보안 도구처럼 말하지는 않겠습니다.
|
|
191
|
+
|
|
192
|
+
분명 유용하지만, 모든 문제를 해결하지는 않습니다.
|
|
193
|
+
|
|
194
|
+
예를 들면:
|
|
195
|
+
|
|
196
|
+
- 이미 내 컴퓨터가 침해된 상태라면 이 도구만으로는 막을 수 없습니다
|
|
197
|
+
- 권한 시스템을 대신하지 않으며, 최소 권한·감사·격리 같은 기본 원칙을 대체하지 않습니다
|
|
198
|
+
- 대체 토큰이 다시 쪼개지거나 가공되면 어떤 경우에는 원래 값 복원이 실패할 수 있습니다
|
|
199
|
+
- 특정 도구 체인이 로컬에서 보이는 계층을 완전히 우회하면 보호 효과가 제한될 수 있습니다
|
|
200
|
+
|
|
201
|
+
즉, 정확한 표현은 이렇습니다.
|
|
202
|
+
|
|
203
|
+
`AIS`는 **실제 비밀값이 내 컴퓨터 밖으로 나갈 가능성을 줄여주는 도구**이지, “이제 모든 것이 절대 안전하다”는 선언이 아닙니다.
|
|
204
|
+
|
|
205
|
+
## 이런 사람에게 맞습니다
|
|
206
|
+
|
|
207
|
+
- AI 에이전트로 실제 작업을 자주 처리하는 사람
|
|
208
|
+
- AI에게 더 많은 권한을 주고 싶지만 비밀번호 평문 노출은 불안한 사람
|
|
209
|
+
- 공식 API나 제3자 API 공급자를 쓰더라도 로컬 통제층을 하나 더 두고 싶은 사람
|
|
210
|
+
- 사용성을 크게 해치지 않으면서 자동화를 더 안전하게 쓰고 싶은 사람
|
|
211
|
+
|
|
212
|
+
## 로컬 검증
|
|
213
|
+
|
|
214
|
+
현재 버전을 로컬에서 검증하려면:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
npm install
|
|
218
|
+
npm run lint
|
|
219
|
+
npm run build
|
|
220
|
+
npm run test
|
|
221
|
+
npm run typecheck
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## 오픈소스
|
|
225
|
+
|
|
226
|
+
이 도구는 로컬 우선 철학의 오픈소스 도구입니다.
|
|
227
|
+
|
|
228
|
+
모든 보안 문제를 대체하려는 것이 아니라, 현대 AI 작업 흐름에서 가장 흔하고 현실적인 한 층의 문제를 줄이려는 것입니다.
|
|
229
|
+
|
|
230
|
+
**AI에게 비밀번호를 줘야 한다면, 적어도 실제 비밀번호를 먼저 밖으로 보내지는 말자.**
|
|
231
|
+
|
|
232
|
+
## 라이선스
|
|
233
|
+
|
|
234
|
+
MIT
|
package/README.md
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
<p align="right">
|
|
2
|
+
简体中文 | <a href="./README.en.md">English</a> | <a href="./README.ko.md">한국어</a> | <a href="./README.ja.md">日本語</a> | <a href="./README.fr.md">Français</a>
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# AIS
|
|
6
|
+
|
|
7
|
+
> 一个你只需要在终端执行一行 `npm` 安装命令,就能在**纯本地运行**的情况下帮 AI agent 保护密码、密钥和连接串的工具。
|
|
8
|
+
|
|
9
|
+
`AIS` 的目标很直接:
|
|
10
|
+
|
|
11
|
+
- 你照常把密码交给 AI 去做事
|
|
12
|
+
- AI 尽量看不到真实密码
|
|
13
|
+
- 真正需要用密码时,只在你的电脑本地还原
|
|
14
|
+
- 不影响 AI 最终完成任务
|
|
15
|
+
|
|
16
|
+
<p align="center">
|
|
17
|
+
<img src="./docs/images/readme-flow-zh.png" alt="AIS 工作原理:真实密码先在本地换成代号,云端 AI 只看到代号,真正执行时再在本地还原成真实密码" width="100%" />
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
## 一行安装
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install -g @tokentestai/ais
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
安装完成后,使用的命令名是 `ais`。
|
|
27
|
+
|
|
28
|
+
当前状态:
|
|
29
|
+
|
|
30
|
+
- 原生支持 `macOS` 和 `Linux`
|
|
31
|
+
- `Windows` 支持还在持续补全
|
|
32
|
+
- 当前原生适配 `Claude Code`、`Codex`、`OpenClaw`
|
|
33
|
+
|
|
34
|
+
## 它解决什么问题
|
|
35
|
+
|
|
36
|
+
现在越来越多人会把网站密码、服务器密码、数据库连接串、接口密钥之类的信息交给 AI agent,让它代替自己登录、部署、填表、跑命令。
|
|
37
|
+
|
|
38
|
+
这样做很方便,而且基本已经是趋势。
|
|
39
|
+
|
|
40
|
+
但问题也很直接:
|
|
41
|
+
|
|
42
|
+
- 只要你把**真实密码明文**交给 AI,这些内容就可能进入 AI 可见链路
|
|
43
|
+
- 一旦真实密码离开你的电脑,你就很难再主动控制它后面会经过哪些日志、排障、留存或中转环节
|
|
44
|
+
- 如果你用的是第三方 API 供应商,对方在技术上同样可能接触到完整请求内容
|
|
45
|
+
|
|
46
|
+
`AIS` 想做的事其实只有一句话:
|
|
47
|
+
|
|
48
|
+
**别让真实密码离开你的电脑。**
|
|
49
|
+
|
|
50
|
+
## 一句话理解它的原理
|
|
51
|
+
|
|
52
|
+
比如你让 AI 帮你登录某个网站,真实密码是:
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
qwert123
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`AIS` 会先在你的电脑本地把它换成一个代号,比如:
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
__SECRET_01__
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
这时候:
|
|
65
|
+
|
|
66
|
+
- AI 看到的是 `__SECRET_01__`
|
|
67
|
+
- AI 服务提供方看到的也是 `__SECRET_01__`
|
|
68
|
+
- 真正的 `qwert123` 不会直接送出去
|
|
69
|
+
|
|
70
|
+
等到 AI 在你的电脑上真的要执行登录动作时,`AIS` 再只在本地把:
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
__SECRET_01__ -> qwert123
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
还原回去。
|
|
77
|
+
|
|
78
|
+
所以最后网站里被填进去的,依然是正确的真实密码 `qwert123`,任务不会因为加了保护层而失败。
|
|
79
|
+
|
|
80
|
+
## 它是怎么工作的
|
|
81
|
+
|
|
82
|
+
整个过程可以理解成 5 步:
|
|
83
|
+
|
|
84
|
+
1. 你把真实密码、密钥或连接串交给 AI,让它帮你完成任务。
|
|
85
|
+
2. `AIS` 在本地先识别这些敏感内容,并把它们换成代号。
|
|
86
|
+
3. 发往云端时,AI 只能看到代号,看不到真实内容。
|
|
87
|
+
4. 当 AI 真正在你的电脑上执行命令、填写表单、写配置时,`AIS` 再在本地把代号还原成真实内容。
|
|
88
|
+
5. 任务照常完成,但真实内容尽量没有离开你的电脑。
|
|
89
|
+
|
|
90
|
+
你可以把它理解成:
|
|
91
|
+
|
|
92
|
+
- 发出去之前,先在本地“遮住”
|
|
93
|
+
- 真正要用的时候,再在本地“揭开”
|
|
94
|
+
|
|
95
|
+
## 为什么我们做这个工具
|
|
96
|
+
|
|
97
|
+
我们自己也是 `Claude Code`、`Codex`、`OpenClaw` 的高强度使用者。
|
|
98
|
+
|
|
99
|
+
我们相信,未来大家只会把越来越多的权限交给 AI。
|
|
100
|
+
|
|
101
|
+
问题不在于“要不要让 AI 帮你做事”,而在于:
|
|
102
|
+
|
|
103
|
+
**能不能在把更多事情交给 AI 的同时,不让真实密码继续裸奔。**
|
|
104
|
+
|
|
105
|
+
`AIS` 就是在这个前提下做出来的:
|
|
106
|
+
|
|
107
|
+
- 纯本地运行
|
|
108
|
+
- 开源
|
|
109
|
+
- 尽量不改变原有使用习惯
|
|
110
|
+
- 先解决最基础、最现实的一层风险
|
|
111
|
+
|
|
112
|
+
## 你可以拿它做什么
|
|
113
|
+
|
|
114
|
+
- 让 AI 帮你登录网站,但不想把网站密码明文送进云端
|
|
115
|
+
- 让 AI 帮你操作服务器,但不想把服务器密码裸露给外部模型链路
|
|
116
|
+
- 让 AI 帮你写配置、调接口、跑脚本,但不想直接暴露密钥和连接串
|
|
117
|
+
- 在保持自动化体验的同时,尽量减少敏感信息外发
|
|
118
|
+
|
|
119
|
+
## 快速开始
|
|
120
|
+
|
|
121
|
+
先初始化本地配置:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
ais config
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
如果你要先手动保存一个密码或密钥:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
ais add github-token
|
|
131
|
+
ais add github-token ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
包装 `Claude Code`:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
ais claude
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
包装 `Codex`:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
ais -- codex --sandbox danger-full-access
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
包装 `OpenClaw`:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
ais -- openclaw <你原本会输入的参数>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## 终端界面
|
|
153
|
+
|
|
154
|
+
除了自动保护,`AIS` 还提供了一个终端界面,方便你:
|
|
155
|
+
|
|
156
|
+
- 查看最近哪些内容被成功保护了
|
|
157
|
+
- 把某些内容改成“不加密”
|
|
158
|
+
- 调整本地行为
|
|
159
|
+
|
|
160
|
+
打开方式:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
ais ais
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
例如:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
ais ais exclude <id>
|
|
170
|
+
ais ais exclude-type PASSWORD
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## 为什么强调“纯本地”
|
|
174
|
+
|
|
175
|
+
因为这件事的关键,不是“换一种更好看的密码展示方式”,而是:
|
|
176
|
+
|
|
177
|
+
**真实密码尽量不要被传输出你的电脑。**
|
|
178
|
+
|
|
179
|
+
只要真实密码还要离开本地,你就依然很难真正掌控它后面会经过什么。
|
|
180
|
+
|
|
181
|
+
而 `AIS` 做的,正是把这一步尽量卡在本地完成:
|
|
182
|
+
|
|
183
|
+
- 本地识别
|
|
184
|
+
- 本地替换
|
|
185
|
+
- 本地还原
|
|
186
|
+
- 本地执行
|
|
187
|
+
|
|
188
|
+
## 当前边界
|
|
189
|
+
|
|
190
|
+
我们不会把它写成“万能安全工具”。
|
|
191
|
+
|
|
192
|
+
这东西很有用,但它不解决所有问题。
|
|
193
|
+
|
|
194
|
+
至少这些边界你要知道:
|
|
195
|
+
|
|
196
|
+
- 如果你的电脑本地环境已经被攻破,它帮不了你
|
|
197
|
+
- 它不是权限系统,不能替代最小权限、审计和隔离
|
|
198
|
+
- 如果代号被再次加工、拆开、重新拼接,某些场景下可能无法还原
|
|
199
|
+
- 如果某些工具链完全绕过本地可见层,保护效果也会受影响
|
|
200
|
+
|
|
201
|
+
所以更准确的说法是:
|
|
202
|
+
|
|
203
|
+
`AIS` 的作用是**减少真实密码离开本地的机会**,不是宣布“从此绝对安全”。
|
|
204
|
+
|
|
205
|
+
## 适合谁
|
|
206
|
+
|
|
207
|
+
- 经常用 AI agent 帮自己处理真实任务的人
|
|
208
|
+
- 已经开始把更多权限交给 AI,但对密码外发不放心的人
|
|
209
|
+
- 使用官方 API 或第三方 API 供应商时,都希望先把风险再往回收一层的人
|
|
210
|
+
- 想在不明显增加操作负担的前提下,提高自动化安全感的人
|
|
211
|
+
|
|
212
|
+
## 本地验证
|
|
213
|
+
|
|
214
|
+
如果你想在本地验证当前版本:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
npm install
|
|
218
|
+
npm run lint
|
|
219
|
+
npm run build
|
|
220
|
+
npm run test
|
|
221
|
+
npm run typecheck
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## 开源说明
|
|
225
|
+
|
|
226
|
+
这是一个纯本地运行的开源工具。
|
|
227
|
+
|
|
228
|
+
我们希望它做的不是“替代你的一切安全策略”,而是补上现在很多 AI 工作流里最容易被忽略、但又最现实的一层:
|
|
229
|
+
|
|
230
|
+
**当你把密码交给 AI 时,先别把真实密码直接送出去。**
|
|
231
|
+
|
|
232
|
+
## 许可证
|
|
233
|
+
|
|
234
|
+
MIT
|