@needmoretruth/nmts-cli 0.17.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/AGENTS.md +591 -0
- package/LICENSE +202 -0
- package/LICENSING.md +49 -0
- package/README.ko.md +641 -0
- package/README.md +657 -0
- package/dist/account-proof.js +78 -0
- package/dist/account.js +75 -0
- package/dist/api-key.js +310 -0
- package/dist/api.js +271 -0
- package/dist/args.js +137 -0
- package/dist/artifact-about.js +70 -0
- package/dist/autonomy.js +98 -0
- package/dist/code-access.js +76 -0
- package/dist/code-vault.js +233 -0
- package/dist/collision.js +133 -0
- package/dist/commands/balance.js +93 -0
- package/dist/commands/consent.js +77 -0
- package/dist/commands/create.js +356 -0
- package/dist/commands/env.js +136 -0
- package/dist/commands/expiring.js +167 -0
- package/dist/commands/extend.js +236 -0
- package/dist/commands/get.js +130 -0
- package/dist/commands/kit.js +136 -0
- package/dist/commands/listfile.js +105 -0
- package/dist/commands/login.js +335 -0
- package/dist/commands/logout.js +33 -0
- package/dist/commands/ls.js +202 -0
- package/dist/commands/marks.js +176 -0
- package/dist/commands/mcp.js +139 -0
- package/dist/commands/mode.js +54 -0
- package/dist/commands/on-collision.js +45 -0
- package/dist/commands/organise.js +296 -0
- package/dist/commands/public-code.js +89 -0
- package/dist/commands/pull.js +185 -0
- package/dist/commands/push.js +278 -0
- package/dist/commands/put.js +282 -0
- package/dist/commands/rebuild.js +160 -0
- package/dist/commands/receive.js +125 -0
- package/dist/commands/recovery-list.js +104 -0
- package/dist/commands/recovery.js +291 -0
- package/dist/commands/s3.js +241 -0
- package/dist/commands/settings.js +28 -0
- package/dist/commands/share.js +276 -0
- package/dist/commands/sweep.js +240 -0
- package/dist/commands/trash.js +288 -0
- package/dist/commands/trial.js +264 -0
- package/dist/commands/update.js +169 -0
- package/dist/commands/usage.js +84 -0
- package/dist/commands/verify.js +331 -0
- package/dist/commands/wallet.js +122 -0
- package/dist/commands/whoami.js +33 -0
- package/dist/consent.js +200 -0
- package/dist/credentials.js +311 -0
- package/dist/crypto-surface.js +54 -0
- package/dist/crypto.js +137 -0
- package/dist/download-part.js +144 -0
- package/dist/download-sink.js +213 -0
- package/dist/download.js +163 -0
- package/dist/drive-paths.js +170 -0
- package/dist/environment.js +190 -0
- package/dist/errors.js +71 -0
- package/dist/exit.js +107 -0
- package/dist/expiry.js +115 -0
- package/dist/extend-chain.js +137 -0
- package/dist/extend-plan.js +149 -0
- package/dist/extend-sign.js +130 -0
- package/dist/guards.js +15 -0
- package/dist/help.js +192 -0
- package/dist/human-check.js +54 -0
- package/dist/item-trash.js +25 -0
- package/dist/kit-file.js +133 -0
- package/dist/list-file.js +71 -0
- package/dist/list-view-find.js +71 -0
- package/dist/list-view-order.js +96 -0
- package/dist/main.js +394 -0
- package/dist/manifest-create.js +81 -0
- package/dist/manifest-write.js +244 -0
- package/dist/manifest.js +213 -0
- package/dist/mark-render.js +45 -0
- package/dist/mcp-args.js +154 -0
- package/dist/mcp-tools/context.js +50 -0
- package/dist/mcp-tools/files.js +133 -0
- package/dist/mcp-tools/organise.js +128 -0
- package/dist/mcp-tools/reads.js +89 -0
- package/dist/mcp-tools/share.js +61 -0
- package/dist/mcp.js +142 -0
- package/dist/net-retry.js +84 -0
- package/dist/network.js +43 -0
- package/dist/notice.js +45 -0
- package/dist/product.js +38 -0
- package/dist/progress.js +110 -0
- package/dist/prompt.js +145 -0
- package/dist/rebuild.js +255 -0
- package/dist/recovery-assemble.js +148 -0
- package/dist/recovery-build.js +260 -0
- package/dist/recovery-map-file.js +114 -0
- package/dist/recovery-map.js +191 -0
- package/dist/recovery-release.js +229 -0
- package/dist/recovery-seq.js +63 -0
- package/dist/recovery-source.js +143 -0
- package/dist/registration.js +83 -0
- package/dist/s3/listing.js +134 -0
- package/dist/s3/multipart.js +104 -0
- package/dist/s3/response-sink.js +41 -0
- package/dist/s3/same-file.js +117 -0
- package/dist/s3/server.js +252 -0
- package/dist/s3/sigv4.js +168 -0
- package/dist/s3/staging.js +87 -0
- package/dist/s3/xml.js +80 -0
- package/dist/safe-path.js +89 -0
- package/dist/seal.js +206 -0
- package/dist/secret-reader.js +112 -0
- package/dist/server.js +33 -0
- package/dist/session.js +49 -0
- package/dist/setup-questions.js +31 -0
- package/dist/share.js +195 -0
- package/dist/shared/lib/crypto/size-padding.js +126 -0
- package/dist/shared/lib/drive/manifest-codec.js +287 -0
- package/dist/shared/lib/drive/manifest-index.js +235 -0
- package/dist/shared/lib/drive/manifest-ops.js +267 -0
- package/dist/shared/lib/drive/manifest-settings.js +65 -0
- package/dist/shared/lib/drive/name-conflict.js +121 -0
- package/dist/shared/lib/drive/unique-name.js +48 -0
- package/dist/shared/lib/extend/epochs.js +256 -0
- package/dist/shared/lib/net/retry-budget.js +95 -0
- package/dist/shared/lib/share/shared-file-info.js +65 -0
- package/dist/shared/lib/storage-network.js +64 -0
- package/dist/shared/lib/upload/part-plan.js +28 -0
- package/dist/stdout.js +109 -0
- package/dist/trash-sweep.js +123 -0
- package/dist/units.js +19 -0
- package/dist/update-check.js +164 -0
- package/dist/update-source.js +143 -0
- package/dist/upload-api.js +98 -0
- package/dist/upload-file.js +242 -0
- package/dist/upload-price.js +117 -0
- package/dist/upload-steps.js +111 -0
- package/dist/upload-store.js +252 -0
- package/dist/upload-wire.js +25 -0
- package/dist/upload.js +294 -0
- package/dist/usage-report.js +54 -0
- package/dist/wallet-chain.js +76 -0
- package/dist/wallet.js +209 -0
- package/dist/walrus-write.js +188 -0
- package/dist/walrus.js +156 -0
- package/package.json +56 -0
- package/vendor/nmts-crypto/nmts_crypto_wasm.d.ts +469 -0
- package/vendor/nmts-crypto/nmts_crypto_wasm.js +1300 -0
- package/vendor/nmts-crypto/nmts_crypto_wasm_bg.wasm +0 -0
- package/vendor/nmts-crypto/nmts_crypto_wasm_bg.wasm.d.ts +55 -0
- package/vendor/nmts-crypto/package.json +17 -0
package/README.ko.md
ADDED
|
@@ -0,0 +1,641 @@
|
|
|
1
|
+
# nmts
|
|
2
|
+
|
|
3
|
+
*[English](README.md)*
|
|
4
|
+
|
|
5
|
+
[NMTS](https://nmts.me)를 터미널에서 쓰는 도구입니다 — 월러스 망 위의 종단 간 암호화 저장소를,
|
|
6
|
+
터미널 앞의 사람과 그 사람이 돌리는 에이전트를 위해.
|
|
7
|
+
|
|
8
|
+
> **AI 에이전트라면 [AGENTS.md](AGENTS.md)를 대신 읽으십시오.** 같은 것을 프로그램이 필요로 하는
|
|
9
|
+
> 순서로 적어 두었고, 사람이 이 도구를 가리켰을 때 따라갈 파일이 그것입니다. (영어로 되어 있습니다.)
|
|
10
|
+
|
|
11
|
+
> **이야기를 나누는 곳: [디스코드](https://discord.gg/pcmRkVmVZk).** 질문도, 의견도, 무엇을
|
|
12
|
+
> 만들고 계신지도. 영어와 한국어 둘 다 읽습니다.
|
|
13
|
+
|
|
14
|
+
> **상태: 이릅니다.** 열어 놓고 만들고 있고, 1.0 전에 인터페이스가 더 바뀔 수 있습니다. 여기 적힌
|
|
15
|
+
> 어떤 것도 「나올 기능」에 대한 약속이 아닙니다 — 지금 무엇이 있는지에 대한 정본은
|
|
16
|
+
> `nmts --help`입니다.
|
|
17
|
+
|
|
18
|
+
## NMTS가 무엇인가
|
|
19
|
+
|
|
20
|
+
**암호화가 그 기계에서 일어나고 열쇠가 기기 밖으로 나가지 않는** 저장소입니다. 서버는 암호화된
|
|
21
|
+
바이트를 받을 뿐 그것을 열 방법이 없습니다. 파일 내용도, 이름도, 폴더 구조도 전부 계정 코드만이
|
|
22
|
+
여는 암호화된 목록 안에 있습니다.
|
|
23
|
+
|
|
24
|
+
바이트 자체는 공개 저장망인 **월러스**에 있고, 값은 **Sui** 체인에서 치릅니다. 시작하시기 전에
|
|
25
|
+
알아 두실 만한 결과가 둘 있습니다.
|
|
26
|
+
|
|
27
|
+
- **저장은 영원히가 아니라 기간을 사는 것입니다.** 파일에는 기한이 있습니다. 연장할 수 있고,
|
|
28
|
+
다 되기 전에 NMTS가 알려 드립니다.
|
|
29
|
+
- **비밀번호 재설정 같은 것이 없습니다.** 계정 코드가 곧 계정입니다. 되찾을 수 없고, 파일을 그대로
|
|
30
|
+
둔 채 바꿀 수도 없습니다 — 그것은 NMTS를 포함해 누구도 그 파일을 못 열게 만드는 바로 그 성질
|
|
31
|
+
입니다.
|
|
32
|
+
|
|
33
|
+
값을 치르는 길은 둘입니다. **크레딧** — NMTS 금고가 저장을 사고 계정은 이미 갖고 있는 크레딧을
|
|
34
|
+
쓰는 것 — 또는 **직접 쓰시는 Sui 지갑**으로 공개 체인 위에서 직접 서명해 사는 것. 여기서 하는
|
|
35
|
+
업로드는 언제나 크레딧을 씁니다. 지갑을 쓰는 명령은 하나뿐이고(`nmts extend` — 이미 저장된 파일의
|
|
36
|
+
기간을 더 사는 것), 서명하기 전에 별도의 동의를 받습니다. 서명해 산 것은 NMTS가 되돌릴 수 없기
|
|
37
|
+
때문입니다.
|
|
38
|
+
|
|
39
|
+
## 설치
|
|
40
|
+
|
|
41
|
+
Node 22 이상. 이 저장소에서 바로, 한 줄로:
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
npm install -g github:needmoretruth/nmts-cli
|
|
45
|
+
nmts --help
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
그러면 기본 브랜치를 가져갑니다. 버전을 고정하시려면 태그를 적으십시오.
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
npm install -g github:needmoretruth/nmts-cli#v0.17.2
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
또는 [최신 릴리스](https://github.com/needmoretruth/nmts-cli/releases)의 tarball에서. 같은
|
|
55
|
+
꾸러미이고 복제가 필요 없습니다.
|
|
56
|
+
|
|
57
|
+
```sh
|
|
58
|
+
npm install -g https://github.com/needmoretruth/nmts-cli/releases/latest/download/nmts.tgz
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**꾸러미 저장소(npm registry)에 올라가 있지 않아서 `npm install -g nmts`로는 찾지 못합니다.** 그
|
|
62
|
+
짧은 이름은 쓸 수도 없습니다 — 저장소가 이미 올라간 이름들과 너무 비슷하다며 거절합니다. 설치에
|
|
63
|
+
대한 나머지는 바뀌지 않습니다 — 어느 쪽이든 정본은 이 저장소입니다.
|
|
64
|
+
|
|
65
|
+
**설치할 때 컴파일하는 것이 없고**, `dist/`가 이 저장소에 들어 있는 이유가 그것입니다. 저장소에서
|
|
66
|
+
바로 설치하는 것은 빌드를 못 합니다 — npm이 컴파일러가 없는 임시 복제본에서 준비하기 때문입니다.
|
|
67
|
+
커밋된 빌드는 그것을 만든 소스와 어긋날 수 있으므로, 이 저장소의 검사가 푸시마다 다시 빌드해서 한
|
|
68
|
+
바이트라도 다르면 거절합니다.
|
|
69
|
+
|
|
70
|
+
설치가 아니라 손대 보시려면:
|
|
71
|
+
|
|
72
|
+
```sh
|
|
73
|
+
git clone https://github.com/needmoretruth/nmts-cli
|
|
74
|
+
cd nmts-cli
|
|
75
|
+
npm install
|
|
76
|
+
node src/main.ts --help
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`npm run compile`이 `dist/`를 새로 만들고, `node dist/main.js`로 돌립니다 — 설치된 명령이 돌리는
|
|
80
|
+
바로 그 파일입니다. 이름이 `build`가 아니라 `compile`인 데에는 이름을 바꾸시기 전에 알아 두실
|
|
81
|
+
이유가 있습니다. npm 11에서는 `build`라는 스크립트가 있는 꾸러미를 git 주소에서 설치하면 npm이
|
|
82
|
+
자기 임시 복제본을 링크해 놓고 그것을 지워 버려서, 깨진 명령이 남는데 **성공했다고 보고합니다.**
|
|
83
|
+
|
|
84
|
+
**네이티브 빌드 단계도, C 컴파일러도 어디에도 없습니다.** 암호 엔진은 저장소에 실려 있는
|
|
85
|
+
WebAssembly 모듈입니다. Node가 도는 곳이면 어디서든 돕니다 — 리눅스, 맥, 윈도우, 그리고 루트 없는
|
|
86
|
+
컨테이너 안에서도. 시작에 80밀리초쯤 들고, 명령은 자기가 필요한 것만 불러옵니다.
|
|
87
|
+
|
|
88
|
+
## 최신으로 유지하기
|
|
89
|
+
|
|
90
|
+
```sh
|
|
91
|
+
nmts update
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
어느 릴리스가 가장 새것인지 읽어서, 지금 도는 버전과 공개된 버전을 찍고, 그 릴리스 자신의 주소
|
|
95
|
+
에서 `npm install --global`로 새것을 설치합니다. `--dry-run`은 명령만 찍고 멈춥니다. 설치된 사본이
|
|
96
|
+
아니라 소스 복제본에서 돌리면 거절합니다 — 설치하면 사본이 둘이 되고 어느 쪽이 도는지는 PATH가
|
|
97
|
+
정하게 됩니다.
|
|
98
|
+
|
|
99
|
+
그와 별개로 **하루에 한 번, 명령이 끝난 뒤에**
|
|
100
|
+
`https://github.com/needmoretruth/nmts-cli/releases/latest`에 어느 릴리스가 최신인지 묻고 그 답을
|
|
101
|
+
적어 둡니다. 그것이 지금 도는 버전보다 새것이면, 다음 실행 때 그렇다고 stderr에 한 줄 찍습니다 —
|
|
102
|
+
`--json`의 출력에 섞이지 않도록 stderr입니다.
|
|
103
|
+
|
|
104
|
+
그 요청에는 계정 코드도, API 키도, 명령 이름도 실리지 않습니다. 어떤 페이지 주소를 묻는 것이고,
|
|
105
|
+
그쪽이 볼 수 있는 것은 「누군가 그것을 물었다」입니다. 이 도구가 만드는 요청 중 **명령이 시키지
|
|
106
|
+
않은 것은 이것 하나뿐**입니다. 나머지는 전부 무언가가 필요로 해서 NMTS 서버나 저장망으로 갑니다.
|
|
107
|
+
|
|
108
|
+
`NMTS_NO_UPDATE_CHECK`에 아무 값이나 넣으면 둘 다 멈춥니다 — 조회도, 알림도. `nmts env`가 그
|
|
109
|
+
확인이 마지막으로 무엇을 찾았는지, 또는 왜 답을 못 했는지 보여 줍니다.
|
|
110
|
+
|
|
111
|
+
## 처음 돌릴 때
|
|
112
|
+
|
|
113
|
+
```sh
|
|
114
|
+
nmts env
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
아무 데도 접속하지 않고 자격도 필요 없습니다. 이 기계가 무엇인지, 여기 쓴 파일을 정말 남이 못 읽게
|
|
118
|
+
할 수 있는지, 브라우저를 열 수 있는지, 자격이 이미 보이는지를 알려 줍니다. 낯선 곳 — 컨테이너,
|
|
119
|
+
CI 러너, 남의 노트북 — 에서는 이것부터 돌리십시오.
|
|
120
|
+
|
|
121
|
+
## 자격은 둘입니다
|
|
122
|
+
|
|
123
|
+
하는 일이 다르고, 서로 바꿔 쓸 수 없습니다.
|
|
124
|
+
|
|
125
|
+
**계정 코드가 파일을 엽니다.** 계정의 모든 열쇠가 거기서 나옵니다 — 파일 열쇠도, 암호화된 목록도,
|
|
126
|
+
지갑도. 서버로는 가지 않습니다.
|
|
127
|
+
|
|
128
|
+
```sh
|
|
129
|
+
export NMTS_ACCOUNT_CODE_FILE=/path # 코드가 든 파일을 가리킵니다 — 권합니다
|
|
130
|
+
nmts login # …또는 암호 문구로 잠가 여기에 둡니다
|
|
131
|
+
export NMTS_ACCOUNT_CODE="..." # …또는 그대로 건넵니다(한 번 묻습니다 · 아래 참고)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**API 키가 서버를 답하게 합니다.** 평소의 로그인은 어떤 CLI도 지날 수 없는 사람 확인을 요구하는데,
|
|
135
|
+
[nmts.me](https://nmts.me)의 계정 화면에서 만든 키가 그것만 면제해 줍니다. **파일은 열지 못합니다.**
|
|
136
|
+
|
|
137
|
+
```sh
|
|
138
|
+
export NMTS_API_KEY_FILE=/path # 키가 든 파일을 가리킵니다 — 권합니다
|
|
139
|
+
export NMTS_API_KEY="..." # …또는 그대로 건넵니다
|
|
140
|
+
nmts login # …그리고 이것이 찾은 쪽을 적어 두거나 묻습니다
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
`nmts ls`는 둘 다 필요합니다 — 서버가 답하게 하는 키와, 그 답을 열 수 있게 하는 코드.
|
|
144
|
+
|
|
145
|
+
`nmts login`은 키를 적어 두기 전에 서버에 대고 확인하므로, 잘못된 키는 다음 명령이 아니라 붙여
|
|
146
|
+
넣으신 그 순간에 잘못된 것으로 드러납니다. 키의 공개된 손잡이만 찍고 키 자체는 절대 찍지 않습니다.
|
|
147
|
+
이미 저장된 키는 그렇게 하겠다고 말하지 않은 실행이 덮어쓰지 않습니다 — 터미널에서는 `login`이
|
|
148
|
+
묻고, 터미널이 없는 곳에서는 `nmts logout`으로 먼저 지우십시오.
|
|
149
|
+
|
|
150
|
+
**어느 자격도 명령줄 인자로는 받지 않습니다.** 리눅스에서는 어떤 프로세스든 다른 프로세스의
|
|
151
|
+
명령줄을 읽을 수 있고, 셸은 그것을 기록에 남깁니다. 그래서 둘 다 그런 옵션이 **일부러** 없습니다.
|
|
152
|
+
|
|
153
|
+
## 코드를 둘 수 있는 자리
|
|
154
|
+
|
|
155
|
+
넷이고, 도구는 각각에 대해 의견이 있습니다. 못 쓰게 막는 것은 없습니다 — 달라지는 것은 그것이
|
|
156
|
+
**실수로** 일어나느냐입니다.
|
|
157
|
+
|
|
158
|
+
| | 하는 일 | 묻는 것 |
|
|
159
|
+
|---|---|---|
|
|
160
|
+
| `NMTS_ACCOUNT_CODE_FILE=/path` | 파일에서 코드를 읽고 복사하지 않습니다 | 없음 |
|
|
161
|
+
| `nmts login` | `~/.nmts/credentials.json`에 암호 문구로 잠가 둡니다 | 없음 |
|
|
162
|
+
| `nmts login --plain` | 그대로 적습니다(권한 600) | 한 번, `unsafe-code-storage` |
|
|
163
|
+
| `NMTS_ACCOUNT_CODE`에 코드를 담기 | 환경변수에서 바로 씁니다 | 한 번, `plain-env` |
|
|
164
|
+
|
|
165
|
+
**`nmts login`은 기본이 잠그는 것입니다.** 디스크에 남는 것은 코드가 아닙니다 — 그것을 열려면 암호
|
|
166
|
+
문구가 필요하므로, 그 파일이 백업이나 동기화 폴더나 컨테이너 이미지나 도둑맞은 노트북에 있어도 그
|
|
167
|
+
자체로는 값이 없습니다. 코드가 필요한 모든 명령이 암호 문구를 묻거나 `NMTS_PASSPHRASE`에서
|
|
168
|
+
읽습니다. 그때마다 1초의 몇 분의 1과 64 MiB의 메모리가 드는데, 그것이 요점입니다 — 암호 문구를
|
|
169
|
+
추측하는 값을 비싸게 만드는 것이 그것입니다.
|
|
170
|
+
|
|
171
|
+
⚠ **암호 문구는 「나와 같은 권한으로 도는 것」으로부터 코드를 지켜 주지 않습니다.** 암호 문구를
|
|
172
|
+
건네주는 쪽도 같은 방법으로 읽힙니다. 에이전트가 사람 없이 도는 기계에서는 `NMTS_PASSPHRASE`가
|
|
173
|
+
에이전트가 닿을 수 있는 곳에 있어야 하고, 그 순간 자물쇠는 열쇠를 옆에 붙여 둔 자물쇠입니다.
|
|
174
|
+
그래서 파일 형태 — `NMTS_ACCOUNT_CODE_FILE` — 가 에이전트에게는 「덜 좋은 선택지」가 아니라
|
|
175
|
+
**권하는 것**입니다. 코드가 어디로도 복사되지 않고, 권한은 그 기계 주인이 정합니다.
|
|
176
|
+
|
|
177
|
+
**환경변수는 비밀이 아니고, 그래서 쓰시겠다면 한 번 묻습니다.** `docker inspect`는 컨테이너의
|
|
178
|
+
환경 전체를 찍습니다. 나와 같은 권한으로 도는 것은 프로세스가 살아 있는 동안 `/proc/<pid>/environ`
|
|
179
|
+
을 읽을 수 있습니다. 자식 프로세스마다 물려받고, CI 시스템은 그것을 로그에 적는 일이 흔합니다.
|
|
180
|
+
**파일을 가리키는** 변수에는 그런 것이 하나도 없고, 그래서 아무것도 묻지 않습니다.
|
|
181
|
+
|
|
182
|
+
**`nmts login --env`는 설정할 줄을 찍고 아무것도 쓰지 않습니다** — 코드를 화면에 올리는 유일한
|
|
183
|
+
명령이고, 같은 동의 뒤에 있는 이유가 그것입니다.
|
|
184
|
+
|
|
185
|
+
**이 도구 밖에서 코드를 어떻게 하실지는 그분의 몫입니다.** 메모에, 비밀번호 관리자에, 저장소에
|
|
186
|
+
두시는 것은 도구가 볼 수 없고 막으려 하지도 않습니다. 도구가 할 수 있는 것은 **자기가** 쓰는
|
|
187
|
+
모양만큼은 누군가 일부러 내린 결정이 되게 하는 것입니다.
|
|
188
|
+
|
|
189
|
+
## 에이전트에게 건네시기 전에
|
|
190
|
+
|
|
191
|
+
계정 코드는 한꺼번에 전부입니다. 그것을 가진 프로그램은 모든 파일을 읽고, 업로드하고, 지우고,
|
|
192
|
+
지갑으로 서명할 수 있습니다 — 그리고 그것으로 만든 요청은 그분 자신의 요청과 구별되지 않습니다.
|
|
193
|
+
계정을 유지한 채로 바꿀 수도 없습니다.
|
|
194
|
+
|
|
195
|
+
**잃어도 괜찮은 계정을 쓰십시오.**
|
|
196
|
+
|
|
197
|
+
## 명령
|
|
198
|
+
|
|
199
|
+
| 명령 | 하는 일 |
|
|
200
|
+
|---|---|
|
|
201
|
+
| `nmts env` | 이것이 어디서 돌고 있고 그것이 무슨 뜻인지. 아무것도 필요 없음 |
|
|
202
|
+
| `nmts login` / `logout` | 이 기계에 계정 코드를 두거나 지웁니다 |
|
|
203
|
+
| `nmts whoami` | 저장된 코드가 어느 계정의 것인지 — 오프라인, 서버 호출 없음 |
|
|
204
|
+
| `nmts expiring` | 산 저장 기간이 곧 끝나는 파일과 그 시각 |
|
|
205
|
+
| `nmts extend <path>` | 파일 하나의 저장 기간을 더 삽니다 — **지갑으로 서명하고 씁니다** |
|
|
206
|
+
| `nmts create` | 새 계정을 만들고 코드를 한 번 찍습니다. 다시 찍을 수 있는 것은 없습니다 |
|
|
207
|
+
| `nmts trial` | 이번 주 무료 크레딧이 얼마나 남았는지. `trial apply`가 신청합니다 |
|
|
208
|
+
| `nmts recovery-list` | NMTS 없이 이 계정의 바이트를 찾아내는 파일을 씁니다 |
|
|
209
|
+
| `nmts kit` | 복구 키트: 그 목록**과 계정 코드**를 한 파일에 |
|
|
210
|
+
| `nmts sweep` | 30일이 지난 휴지통 항목을 버립니다. **되돌릴 수 없어** 실행마다 묻습니다 |
|
|
211
|
+
| `nmts consent` | 이 기계가 무엇에 동의했는지 |
|
|
212
|
+
| `nmts update` | 이 도구의 가장 새 릴리스를 설치합니다 |
|
|
213
|
+
| `nmts ls` | 파일 목록 |
|
|
214
|
+
| `nmts usage` | 계정이 갖고 있는 것: 개수, 바이트, 가장 큰 파일들, 휴지통 |
|
|
215
|
+
| `nmts get <path>` | 파일 하나를 다운로드하고 복호화하고 확인합니다 |
|
|
216
|
+
| `nmts pull [folder]` | 폴더 하나 또는 계정 전체를 모양 그대로 다운로드합니다 |
|
|
217
|
+
| `nmts push <directory>` | 디렉터리 하나를 모양 그대로 업로드합니다 — **크레딧을 씁니다** |
|
|
218
|
+
| `nmts put <file>` | 파일 하나를 암호화해 업로드합니다 — **크레딧을 씁니다** |
|
|
219
|
+
| `nmts rm <paths>` | 휴지통으로 옮깁니다 — 30일 동안 되살릴 수 있습니다 |
|
|
220
|
+
| `nmts restore <paths>` | 휴지통에서 도로 꺼냅니다 |
|
|
221
|
+
| `nmts mkdir <path>` | 폴더를 만듭니다. 위에 없는 폴더도 함께 |
|
|
222
|
+
| `nmts mv <paths> <folder>` | 폴더로 옮깁니다. `/`는 드라이브의 맨 위입니다 |
|
|
223
|
+
| `nmts rename <path> <name>` | 하나에 새 이름을 줍니다 |
|
|
224
|
+
| `nmts star` / `unstar` | 별을 달거나 뗍니다 |
|
|
225
|
+
| `nmts pin` / `unpin` | 폴더 맨 위에 붙들거나 놓아 줍니다 |
|
|
226
|
+
| `nmts label <name> <files>` | 파일에 이름표를 붙입니다. `unlabel`이 뗍니다 |
|
|
227
|
+
| `nmts rebuild` | 목록이 없는 계정에서, 서버의 줄로 파일 목록을 다시 짓습니다 |
|
|
228
|
+
| `nmts listfile` | 이 기계가 가진 암호화된 파일 목록을 파일로 씁니다 |
|
|
229
|
+
| `nmts share <path> <address>` | 파일 하나를 다른 계정에 줍니다 — **거둬들여도 이미 받아 간 사본은 못 되돌립니다** |
|
|
230
|
+
| `nmts shares` | 이 계정에 공유된 것 |
|
|
231
|
+
| `nmts receive <id>` | 누군가 이 계정에 공유한 파일 하나를 다운로드합니다 |
|
|
232
|
+
| `nmts unshare <id>` | 보낸 공유를 거두거나, 받은 공유를 지웁니다 |
|
|
233
|
+
| `nmts wallet` | 계정의 지갑 주소와 SUI·WAL 잔액 |
|
|
234
|
+
| `nmts verify` | 이 계정의 한도를 여는 사람 확인을 부탁합니다 |
|
|
235
|
+
| `nmts mcp` | 위의 일부를 MCP 도구로 내줍니다 |
|
|
236
|
+
| `nmts s3` | 이 기계에서만 닿는 S3 서버로 드라이브를 내줍니다 |
|
|
237
|
+
|
|
238
|
+
`ls`는 `--json`과 `--all`(휴지통 포함)을 받습니다. 휴지통 항목은 기본으로 숨기고, 개수가 몇 개를
|
|
239
|
+
숨겼는지 항상 말합니다. `--find <text>`는 이름에 그 글자가 든 파일만 남깁니다 — 폴더는 안에 맞는
|
|
240
|
+
것이 있을 때만 나오고, 목록이 무엇을 빼고 보여 주는지 소리 내어 말합니다. `--sort name|size|date`
|
|
241
|
+
와 `--desc`가 순서를 바꿉니다.
|
|
242
|
+
|
|
243
|
+
`share`에는 주소가 필요하고, 상대는 그것을 자기 계정 화면에서 읽습니다 — 이름부(디렉터리)도 이름
|
|
244
|
+
조회도 없어서, 잘못 친 주소는 그 안에 든 검사 기호로 **여기서** 걸립니다. 남에게 물어보지 않고요.
|
|
245
|
+
**공유를 거두면 그 뒤의 다운로드는 막히지만 이미 받아 간 사본에는 닿지 못합니다.** 남에게 파일을
|
|
246
|
+
준다는 것이 그런 뜻이고, 그래서 처음 공유할 때 동의를 받습니다.
|
|
247
|
+
|
|
248
|
+
`pull`은 파일을 하나씩 가져옵니다. 못 가져온 것은 끝에 이름을 대고 나머지는 디스크에 남습니다 —
|
|
249
|
+
하나 때문에 전부를 거절하는 것은 스무 번을 돌리면서 매번 같은 열아홉 개를 잃는 길입니다. 목적지에
|
|
250
|
+
이미 있는 파일은 **건너뛰고 세어** 두며 절대 덮어쓰지 않습니다. `--force`가 덮어쓰고, 그것은
|
|
251
|
+
되돌릴 수 없습니다.
|
|
252
|
+
|
|
253
|
+
`push`는 반대 방향이고, **일부러** 다르게 굽니다. `pull`은 값이 안 드니 못 가져온 파일을 지나
|
|
254
|
+
계속 갑니다. `push`는 **돈을 쓰므로** 첫 실패에서 멈추고 이미 올라간 것을 말합니다 — 그 파일들은
|
|
255
|
+
진짜이고 값을 치른 것이며, 같은 명령을 다시 돌리면 나머지만 보냅니다. 목적지에 같은 이름이 이미
|
|
256
|
+
있는 파일은 **건너뜁니다.** 다시 돌려도 안전한 이유가 그것입니다 — 이 도구는 파일을 절대 덮어쓰지
|
|
257
|
+
않으므로, 그게 아니면 두 번째 실행이 전부의 번호 붙은 사본에 값을 치르게 됩니다. 점으로 시작하는
|
|
258
|
+
이름은 `--hidden`을 주시기 전에는 건드리지 않습니다. 소스 코드 디렉터리는 자격을 하필 그런 파일에
|
|
259
|
+
담고 있고, 업로드는 공개 저장망으로 가기 때문입니다. 심볼릭 링크는 따라가지 않습니다.
|
|
260
|
+
|
|
261
|
+
`rm`·`restore`·`mv`는 경로를 여러 개 받고 목록 쓰기는 **한 번** 합니다. 아무것도 가리키지 않는
|
|
262
|
+
경로가 하나 있으면 서버의 줄을 건드리기 전에 전체가 멈춥니다 — 다섯 중 넷을 하고 0으로 끝나는
|
|
263
|
+
것은 「끝났다」로 읽히고, 어느 하나가 빠졌는지는 드라이브를 대조해야만 알 수 있습니다.
|
|
264
|
+
|
|
265
|
+
`rebuild`는 암호화된 목록은 없어졌는데 파일은 아직 저장돼 있는 계정을 위한 것입니다. 서버 자신의
|
|
266
|
+
줄에서 다시 짓습니다 — 파일 열쇠, 해시, 날짜, 크기, 휴지통에 있던 것까지 돌아오고, 이름과 폴더와
|
|
267
|
+
배치는 돌아오지 않습니다. 그리고 그렇게 말합니다. `--yes` 없이는 아무것도 쓰지 않고, 목록이 이미
|
|
268
|
+
있으면 그 자리에서 거절합니다.
|
|
269
|
+
|
|
270
|
+
`wallet`은 읽기만 합니다 — 서명도, 보내기도, 쓰기도 없습니다. 주소는 계정 코드에서 이 기계가
|
|
271
|
+
유도하므로 `nmts wallet address`는 네트워크가 아예 필요 없습니다. 못 읽은 잔액은 0이 아니라
|
|
272
|
+
**못 읽었다고** 보고합니다.
|
|
273
|
+
|
|
274
|
+
`get`은 `--out`과 `--force`를 받습니다. 반쯤 맞는 파일을 쓰느니 거절합니다 — 복호화되지 않는
|
|
275
|
+
조각, 합이 안 맞는 조각들, 맞지 않는 파일 전체 해시는 어느 것이든 요청하신 이름 자리에 아무것도
|
|
276
|
+
남기지 않습니다. 디스크 위의 파일은 「이것이 그 파일이다」라는 주장입니다. 바이트는 도착하는 대로
|
|
277
|
+
같은 디렉터리 안 임시 이름으로 쓰이고, 파일 전체 해시가 맞은 뒤에야 제자리로 이름이 바뀝니다.
|
|
278
|
+
파일을 통째로 메모리에 들고 있지 않습니다 — 한 번에 조각 하나만 들고 있으므로, 기계에 필요한 것은
|
|
279
|
+
파일 크기가 아니라 올린 쪽이 고른 조각 크기입니다. 실패한 다운로드는 자기 임시 파일을 데리고
|
|
280
|
+
사라집니다.
|
|
281
|
+
|
|
282
|
+
`--out -`은 파일을 쓰는 대신 이 프로그램을 읽고 있는 쪽으로 보냅니다. 저장된 파일 하나를 읽는 데
|
|
283
|
+
디스크에 사본을 남기지 않으셔도 되게 하려는 것입니다. 그 모드에서는 사람이 읽는 것이 전부 stderr로
|
|
284
|
+
갑니다. 터미널이 명령으로 받아들일 바이트는 보내기를 거절합니다 — 방향을 돌리시거나 파이프로
|
|
285
|
+
넘기십시오. 파이프에는 이름 바꾸기가 없으므로 그 모드는 한 바이트를 보내기 전에 파일 전체를
|
|
286
|
+
증명하고, 그것은 곧 통째로 들고 있는다는 뜻입니다. 그래서 64 MiB를 넘으면 거절하고
|
|
287
|
+
`--out <이름>`을 쓰시라고 말합니다.
|
|
288
|
+
|
|
289
|
+
`put`은 `--dry-run`·`--name`·`--to`를 받습니다.
|
|
290
|
+
|
|
291
|
+
```sh
|
|
292
|
+
nmts put report.pdf --dry-run # 얼마가 드는지. 아무것도 안 보내고 안 씁니다.
|
|
293
|
+
nmts put report.pdf --to notes # 이미 있는 폴더 안으로
|
|
294
|
+
nmts put film.mov --part-size 256MiB # 조각을 키우면 구매는 줄고 메모리는 늡니다
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
시작된 메비바이트마다 1크레딧이고, 무엇을 쓰기 전에 찍습니다. 그 폴더에 이미 있는 이름은 덮어쓰지
|
|
298
|
+
않고 번호를 붙입니다(`report (2).pdf`) — NMTS는 이전 버전을 보관하지 않으므로 덮어쓰는 것은
|
|
299
|
+
영구적입니다.
|
|
300
|
+
|
|
301
|
+
조각 하나보다 큰 파일은 쪼개지고 **조각마다 따로 삽니다.** 파일은 한 조각씩 읽으므로 크기가
|
|
302
|
+
메모리에 묶이지 않습니다. 묶이는 것은 조각 크기입니다(기본 64 MiB). 조각마다 자기 구매 전에 먼저
|
|
303
|
+
적어 두므로, 도중에 멈춘 실행은 같은 명령을 다시 돌리면 이어집니다 — 산 적 없는 조각만 삽니다.
|
|
304
|
+
|
|
305
|
+
### `nmts balance`와 `nmts public-code`
|
|
306
|
+
|
|
307
|
+
`balance`는 이 계정이 아직 무엇을 살 수 있는지를 서버에 묻습니다 — 남은 크레딧, 그것이 뜻하는
|
|
308
|
+
바이트 수, 이미 들고 있는 양, 그리고 쓰기 한도. `usage`와는 다른 질문입니다. 그쪽은 암호화된 파일
|
|
309
|
+
목록을 더해 「내가 무엇을 갖고 있는가」에 답하고, 이쪽은 장부를 읽어 「내가 아직 무엇을 살 수
|
|
310
|
+
있는가」에 답합니다. 저장망의 시계는 읽지 않으므로, 저장된 파일이 **언제** 끝나는지는 다른 출처에서
|
|
311
|
+
두 번째 기한을 찍는 대신 `nmts expiring`을 가리킵니다.
|
|
312
|
+
|
|
313
|
+
`public-code`는 다른 계정이 파일을 보낼 때 쓰는 값을 찍습니다 — 브라우저가 계정 화면에 보여 주는
|
|
314
|
+
그 **공개 코드**를, 같은 묶음 모양으로 — 그리고 그것이 게시됐는지 말합니다. 게시되기 전에는 아무도
|
|
315
|
+
보내지 못합니다. 보내는 쪽은 그 뒤의 열쇠가 필요하고, 그것을 찾는 곳이 서버이기 때문입니다.
|
|
316
|
+
`nmts public-code --publish`가 그것을 씁니다.
|
|
317
|
+
|
|
318
|
+
그 쓰기는 영구적입니다 — 거둘 수도 바꿀 수도 없습니다. 그리고 고르는 것도 아닙니다. 계정 코드에서
|
|
319
|
+
나오므로 같은 계정 코드는 어느 기계에서든 같은 공개 코드를 내고, 서버는 자기 열쇠의 지문이 아닌
|
|
320
|
+
것을 거절합니다. 서버가 이 계정에 대해 **다른** 공개 코드를 이미 갖고 있으면 명령이 멈추고 그것이
|
|
321
|
+
무슨 뜻인지 말합니다 — 이 기계의 계정 코드가 그 계정을 만든 코드가 아니라는 뜻입니다.
|
|
322
|
+
|
|
323
|
+
⛔ 그것은 계정 코드가 아닙니다. 계정 코드는 갖고 계신 모든 파일을 열고 누구에게도 주지 않는
|
|
324
|
+
것이며, 공개 코드는 주라고 있는 것이고 그것만으로는 아무것도 열지 못합니다.
|
|
325
|
+
|
|
326
|
+
파일을 보내면 그 부수 효과로 게시됩니다 — 게시 없이는 공유가 성립하지 않기 때문입니다. 이 명령이
|
|
327
|
+
필요한 경우는 **받는** 쪽입니다.
|
|
328
|
+
|
|
329
|
+
### `nmts recovery` — 복구 프로그램 받기
|
|
330
|
+
|
|
331
|
+
별도의 복구 프로그램은 계정 코드와 복구 목록만으로 저장망에서 파일을 되살립니다 — NMTS 서버는
|
|
332
|
+
끼지 않습니다. 지금까지 그것을 얻으려면 Rust 도구를 깔고 빌드해야 했는데, 그것은 감사하시는
|
|
333
|
+
분에게는 공정한 요구이지만 방금 파일에 못 닿게 된 분에게는 불공정한 요구입니다.
|
|
334
|
+
|
|
335
|
+
```sh
|
|
336
|
+
nmts recovery --out ~/tools
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
이 기계에 어느 실행 파일이 필요한지 알아내고, 릴리스의 체크섬 파일을 **먼저** 가져와 거기서
|
|
340
|
+
릴리스 이름을 꺼낸 뒤, **그 같은 릴리스에서** 실행 파일을 가져옵니다. 둘이 서로 다른 릴리스에서
|
|
341
|
+
올 수 없게 하려는 것입니다. 무엇을 실행 가능하게 만들기 전에 바이트를 해시해 대조하고, 다르면
|
|
342
|
+
파일을 지우고 거절합니다. `--force` 없이는 그 이름의 파일을 절대 덮어쓰지 않고, PATH에 아무것도
|
|
343
|
+
올리지 않습니다.
|
|
344
|
+
|
|
345
|
+
릴리스와 어디서 받았는지와 해시를 찍고, 그 검사가 무엇을 증명하고 무엇을 증명하지 못하는지를
|
|
346
|
+
분명히 말합니다: 바이트가 그 릴리스가 낸 바이트라는 것은 증명하고, 그 릴리스를 누가 냈는지는
|
|
347
|
+
증명하지 못합니다. 소스도 그것을 빌드한 워크플로도 공개돼 있고, 확인하실 값어치가 있는 것은
|
|
348
|
+
그쪽입니다.
|
|
349
|
+
|
|
350
|
+
## 사람이 지나야 하는 확인
|
|
351
|
+
|
|
352
|
+
API 키는 서버를 답하게 할 뿐, 사람이 거기 있다는 것을 대신해 주지 않습니다. 서버는 그것을 별도의
|
|
353
|
+
질문으로 둡니다 — 최근에 이 계정 뒤에 사람이 있다는 것을 누가 확인했는가. 그 답이 아니오인 동안
|
|
354
|
+
계정은 더 좁은 한도로 돌고, 어떤 요청은 그 자리에서 거절됩니다.
|
|
355
|
+
|
|
356
|
+
```sh
|
|
357
|
+
nmts verify --status # 확인이 살아 있는가, 언제까지인가
|
|
358
|
+
nmts verify # nmts.me에서 사람이 입력할 짧은 코드를 찍고 기다립니다
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
`nmts verify`는 그 확인을 대신 지나 줄 수 없고, 그것을 돌리는 에이전트도 마찬가지입니다 — 확인
|
|
362
|
+
하려는 것이 바로 그것이기 때문입니다. 코드와 주소를 찍고, 코드가 쓰이거나 못 쓰게 될 때까지
|
|
363
|
+
기다립니다. Ctrl-C는 기다림을 끝내는 것이지 코드를 끝내는 것이 아닙니다.
|
|
364
|
+
|
|
365
|
+
며칠이 아니라 확인이 **끝나는 시각**을 찍습니다. 그 기간은 서버 자신의 주 경계에서 끝나므로,
|
|
366
|
+
경계 직전에 지난 확인은 짧은 확인이고, 그것을 정직하게 말하는 유일한 방법이 절대 시각입니다.
|
|
367
|
+
|
|
368
|
+
## 이름과 폴더와 휴지통
|
|
369
|
+
|
|
370
|
+
```sh
|
|
371
|
+
nmts mkdir photos/2026/august # 없으면 셋 다 만듭니다
|
|
372
|
+
nmts mv report.pdf photos # `/`는 드라이브 맨 위로 되돌립니다
|
|
373
|
+
nmts rename report.pdf "q3 report.pdf"
|
|
374
|
+
nmts rm photos/2026 # 그 아래 모든 파일과 함께 휴지통으로
|
|
375
|
+
nmts restore photos/2026
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
**이 중 어느 것도 값이 들지 않고 아무것도 묻지 않습니다.** 이름과 폴더와 부모는 암호화된 파일
|
|
379
|
+
목록 안에만 있습니다 — 서버는 식별자와 크기와 시각을 들고 있을 뿐 이름을 둘 자리가 없습니다.
|
|
380
|
+
그래서 이름 바꾸기와 옮기기는 NMTS에게 보이지 않고, 즉시이고, 공짜입니다.
|
|
381
|
+
|
|
382
|
+
`rm`은 절대 없애지 않습니다. 하나를 휴지통으로 옮기고, 거기서 30일 동안 되살릴 수 있습니다.
|
|
383
|
+
영구히 지우는 명령은 이 도구에 **일부러** 없습니다 — 되돌릴 수 없는 동작은 브라우저 앞의 사람의
|
|
384
|
+
것입니다. 폴더를 휴지통에 넣으면 그 아래 것이 함께 들어가고, 파일마다 자기 30일 시계를 갖습니다.
|
|
385
|
+
그래서 폴더를 되살려도 지난주에 버리신 것이 되살아나지는 않습니다.
|
|
386
|
+
|
|
387
|
+
경로는 **통째로** 맞춥니다 — `photos/a.jpg`와 `a.jpg`는 다른 것이고, 두 항목에 맞는 경로는 먼저
|
|
388
|
+
나온 쪽으로 정하지 않고 거절합니다.
|
|
389
|
+
|
|
390
|
+
업로드가 크레딧이 움직인 뒤에 끊기면 **같은 명령을 다시 돌리는 것으로 끝납니다.** 값은 더 들지
|
|
391
|
+
않습니다. 암호화된 바이트와 예약은 돈이 움직이기 전에 적어 두므로, 다시 돌리는 것은 두 번째를
|
|
392
|
+
사는 것이 아니라 이미 산 그 블롭을 그대로 밀어 넣습니다.
|
|
393
|
+
|
|
394
|
+
## 컨테이너
|
|
395
|
+
|
|
396
|
+
도커와 포드맨에서 루트 없이, 고친 것 없이 돕니다.
|
|
397
|
+
|
|
398
|
+
어디에도 공개된 이미지는 없지만, 이 저장소에 `Dockerfile`이 있어서 만드는 것은 명령 하나입니다.
|
|
399
|
+
두 컨테이너 도구 모두 이 저장소에 밀어 넣을 때마다 실제로 빌드하고 실행하므로, 이것은 믿고 넘어갈
|
|
400
|
+
말이 아니라 확인할 수 있는 말입니다.
|
|
401
|
+
|
|
402
|
+
```sh
|
|
403
|
+
docker build -t nmts . # 또는: podman build -t nmts .
|
|
404
|
+
docker run --rm nmts --version
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
이 이미지는 보통 사용자로 돌고, 저장하는 것은 `/config`에 씁니다 — 그 사용자 몫으로 만들어 둔
|
|
408
|
+
폴더라서 거기에 볼륨을 붙이면 그대로 됩니다. 이미지에 없는 경로에 볼륨을 붙이면 root 소유의
|
|
409
|
+
볼륨이 생기고 도구는 한 바이트도 못 씁니다.
|
|
410
|
+
|
|
411
|
+
```sh
|
|
412
|
+
printf '%s' "$CODE" > /tmp/nmts-code && chmod 600 /tmp/nmts-code
|
|
413
|
+
printf '%s' "$KEY" > /tmp/nmts-key && chmod 600 /tmp/nmts-key
|
|
414
|
+
docker run --rm \
|
|
415
|
+
-v /tmp/nmts-code:/run/secrets/nmts:ro \
|
|
416
|
+
-v /tmp/nmts-key:/run/secrets/api-key:ro \
|
|
417
|
+
-e NMTS_ACCOUNT_CODE_FILE=/run/secrets/nmts \
|
|
418
|
+
-e NMTS_API_KEY_FILE=/run/secrets/api-key \
|
|
419
|
+
nmts ls
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
⚠ **컨테이너에 없는 자격 파일을 가리키면 그냥 멈춥니다.** `NMTS_API_KEY_FILE`이 없는 파일을
|
|
423
|
+
가리키면 요청을 하나도 보내기 전에 종료 코드 3으로 끝납니다 — 그것이 옳은 동작이고, 위에서 두
|
|
424
|
+
파일을 다 붙인 이유입니다.
|
|
425
|
+
|
|
426
|
+
### 컨테이너에서 업로드하려면 하나가 더 필요합니다
|
|
427
|
+
|
|
428
|
+
이 도구가 한 번만 묻는 동의는 설정 폴더 안의 파일이고, 지워지는 컨테이너는 그 파일을 데리고
|
|
429
|
+
갑니다 — 그래서 새 컨테이너는 목록도 보고 다운로드도 하지만 **업로드는 매번 거절합니다.** 두
|
|
430
|
+
가지 길이 있고 둘 다 평범합니다.
|
|
431
|
+
|
|
432
|
+
```sh
|
|
433
|
+
# 이미지에 동의를 구워 넣거나
|
|
434
|
+
RUN nmts consent grant spend
|
|
435
|
+
|
|
436
|
+
# 설정 폴더를 컨테이너 밖에 두거나
|
|
437
|
+
docker run --rm -v nmts-config:/config … nmts put file
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
이 이미지는 이미 `/config`를 보고 있어서, 뒤엣것은 거기에 볼륨 하나만 붙이면 됩니다. 직접 만드신
|
|
441
|
+
이미지에서는 `NMTS_CONFIG_DIR`이 이 도구가 쓰는 것 전부 — 동의, 저장된 자격, 하루 한 번의 새 버전
|
|
442
|
+
확인 — 를 지정하신 폴더로 옮깁니다. `nmts env`가 그것이 어디에 자리 잡았는지, 그리고 그 폴더가
|
|
443
|
+
컨테이너가 지워져도 남는지 알려 줍니다.
|
|
444
|
+
|
|
445
|
+
**컨테이너 안에서 계정 코드를 환경변수에 넣지 마십시오.** 환경 전체는 그것을 들여다볼 수 있는
|
|
446
|
+
사람에게 다 보입니다 — `docker inspect`가 찍습니다. **경로**를 담은 변수는 그 사람에게 파일 이름
|
|
447
|
+
하나를 줄 뿐입니다. `NMTS_ACCOUNT_CODE_FILE`은 `--secret` 마운트와 tmpfs와 평범한 바인드 마운트
|
|
448
|
+
어느 쪽과도 씁니다.
|
|
449
|
+
|
|
450
|
+
`nmts env`가 여기가 어느 컨테이너 런타임인지, 여기의 root가 호스트의 root인지, 그리고 쓰려는
|
|
451
|
+
디렉터리가 컨테이너가 지워져도 남는지 알려 줍니다.
|
|
452
|
+
|
|
453
|
+
## 멈춰 서서 묻는 것
|
|
454
|
+
|
|
455
|
+
기계마다 한 번씩, 다섯 가지입니다: **크레딧 쓰기**, **계정 코드를 잠그지 않고 저장하기**,
|
|
456
|
+
**그것을 평문 환경변수로 쓰기**, **다른 계정에 내 파일 하나를 주기**, **지갑으로 서명하기**.
|
|
457
|
+
각각 무슨 일이 일어나는지, 무엇이 잘못될 수 있는지, 그리고 동의하는 명령 한 줄을 찍습니다.
|
|
458
|
+
|
|
459
|
+
마지막 것은 명령 하나의 것입니다 — `nmts extend`, 이미 저장된 파일의 기간을 더 사는 것. 나머지는
|
|
460
|
+
전부 크레딧으로 값을 치르는데, 크레딧은 NMTS가 발행하고 바로잡을 수 있습니다. 그 하나는 공개
|
|
461
|
+
체인 위에서 구매에 서명하고, NMTS를 포함해 아무도 그것을 되돌릴 수 없습니다. 그래서 「쓰기」 동의를
|
|
462
|
+
같이 쓰지 않고 자기 동의를 따로 갖습니다.
|
|
463
|
+
|
|
464
|
+
**기계마다 한 번** 묻는 것은 그 밖에 없습니다. 대신 **실행마다** 묻는 명령이 하나 있습니다 —
|
|
465
|
+
`nmts sweep`, 30일이 지난 휴지통 항목을 버리는 것. 그것은 그 파일들에 대한 이 계정의 열쇠 사본을
|
|
466
|
+
없애므로, 한 번 받아 둔 동의는 그 뒤의 모든 sweep을 말없이 만들 것입니다. 목록 보기, 다운로드,
|
|
467
|
+
이름 바꾸기, 옮기기는 누구에게도 멈춰 묻지 않습니다.
|
|
468
|
+
|
|
469
|
+
`nmts consent`가 무엇에 동의했는지 보여 주고 도로 거둘 수 있습니다.
|
|
470
|
+
|
|
471
|
+
## S3 도구에 드라이브 내주기
|
|
472
|
+
|
|
473
|
+
`nmts s3`는 이 기계에서 S3 프로토콜을 말하는 서버를 띄웁니다. rclone이든 AWS CLI든, S3를 이미 아는
|
|
474
|
+
백업 프로그램이든 그쪽으로 가리키시면 이 계정의 파일을 목록으로 보고 다운로드합니다.
|
|
475
|
+
|
|
476
|
+
```
|
|
477
|
+
$ nmts s3
|
|
478
|
+
This account's drive is being served at http://127.0.0.1:9000, to this machine only.
|
|
479
|
+
|
|
480
|
+
endpoint http://127.0.0.1:9000
|
|
481
|
+
bucket drive
|
|
482
|
+
access key id NMTS…
|
|
483
|
+
secret key …
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
- **버킷은 하나이고 이름은 `drive`입니다.** 키는 앞의 빗금을 뺀 파일 경로라서, 드라이브의
|
|
487
|
+
`photos/a.jpg`는 여기서도 `photos/a.jpg`입니다. 폴더는 공통 접두어로 돌아오고 빈 폴더도
|
|
488
|
+
포함됩니다 — 이 드라이브에는 진짜 폴더가 있고, 그것을 감추는 것은 브라우저에 있는 것과 다른
|
|
489
|
+
드라이브를 설명하는 일입니다.
|
|
490
|
+
- **자격은 명령이 시작할 때 만들어지고 아무 데도 저장되지 않습니다.** 멈추면 못 쓰게 됩니다.
|
|
491
|
+
- **127.0.0.1에서만 듣고, 그것을 바꾸는 옵션은 없습니다.** 요청과 계정의 모든 파일 사이에 서명
|
|
492
|
+
하나가 서 있고, 그것이 검사하는 열쇠는 터미널에 찍혔던 것입니다.
|
|
493
|
+
- **업로드와 삭제도 되고, 둘 다 쓰기 동의가 필요합니다.** 업로드는 크레딧을 쓰므로,
|
|
494
|
+
`nmts consent grant spend`를 돌린 적 없는 기계는 드라이브를 읽기 전용으로 내주고 그렇게
|
|
495
|
+
말합니다 — 모든 쓰기가 답 대신 그 문장으로 거절됩니다.
|
|
496
|
+
- **삭제는 파일을 휴지통에 넣습니다.** 거기서 30일 동안 되살릴 수 있습니다.
|
|
497
|
+
- **같은 파일을 이미 갖고 있는 키에는 `200`으로 답하고 아무것도 보내지 않습니다.** 대조하는 것은
|
|
498
|
+
이름이 아니라 **내용**입니다 — 업로드마다 평문의 해시를 이 계정만 읽을 수 있게 암호화해 적어
|
|
499
|
+
두고, 게이트웨이가 도착하는 바이트를 그것과 대조합니다. 그래서 매일 밤 도는 백업은 바뀐 파일에만
|
|
500
|
+
값을 치릅니다.
|
|
501
|
+
- ⛔ **다른 파일을 갖고 있는 키는 `409`로 거절합니다.** 이 드라이브는 파일을 덮어쓰지 않습니다 —
|
|
502
|
+
같은 이름은 번호 붙은 사본으로 도착하므로, 200으로 답하는 것은 동기화 도구에게 「복제해 놓은
|
|
503
|
+
파일을 갱신했다」고 말하는 일이 됩니다. 먼저 지우시거나 다른 키로 올리십시오. 해시를 적기 전에
|
|
504
|
+
저장된 파일은 대조할 것이 없어서, 자기 문장과 함께 같은 방식으로 거절됩니다.
|
|
505
|
+
- **큰 파일은 조각으로 올라갑니다** — S3 클라이언트가 보내는 방식 그대로. 조각은 순서 없이 동시에
|
|
506
|
+
도착하고, 하나하나가 클라이언트가 서명한 해시와 대조된 뒤에야 파일의 일부가 됩니다. 조각이 전부
|
|
507
|
+
들어오기 전에는 아무것도 저장되지 않습니다. ⚠ 위의 내용 대조는 조각이 한 파일이 된 뒤에
|
|
508
|
+
일어납니다 — 그전에는 대조할 것이 없습니다 — 그래서 안 바뀐 것으로 드러난 큰 파일은 루프백을
|
|
509
|
+
건너온 뒤에 업로드되지 않습니다.
|
|
510
|
+
- ⚠ **수정 시각은 넘어가지 않습니다.** 파일은 업로드된 시각으로 도착하므로, 시각을 비교하는
|
|
511
|
+
도구는 안 바뀐 파일을 바뀌었다고 판단하고 다시 올리려 합니다. 그것은 이제 값이 들지 않습니다 —
|
|
512
|
+
내용을 대조하고 업로드를 건너뜁니다.
|
|
513
|
+
- **다른 기기에서 올린 파일은 나타나는 데 5초쯤 걸릴 수 있습니다.** 파일 목록을 다시 가져오기
|
|
514
|
+
전까지 그만큼 재사용합니다.
|
|
515
|
+
|
|
516
|
+
rclone으로:
|
|
517
|
+
|
|
518
|
+
```
|
|
519
|
+
$ rclone config create drive s3 provider=Other region=us-east-1 \
|
|
520
|
+
endpoint=http://127.0.0.1:9000 \
|
|
521
|
+
access_key_id=<위에 찍힌 id> secret_access_key=<위에 찍힌 secret>
|
|
522
|
+
$ rclone lsf -R drive:drive
|
|
523
|
+
$ rclone copy drive:drive ./somewhere
|
|
524
|
+
$ rclone copy --size-only ./somewhere drive:drive
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
## MCP를 말하는 에이전트에게
|
|
528
|
+
|
|
529
|
+
`nmts mcp`는 로컬 MCP 서버입니다 — 이 기계에서, 표준 입출력으로, 자기를 띄운 쪽과 이야기합니다.
|
|
530
|
+
먼저 로그인하십시오(`nmts login`). 이 기계가 이미 갖고 있는 계정 코드를 읽고, 명령줄로는 절대
|
|
531
|
+
받지 않습니다.
|
|
532
|
+
|
|
533
|
+
**Claude Code**와 **Codex** 둘 다 한 줄로 더하고, 그 줄이 같습니다.
|
|
534
|
+
|
|
535
|
+
```
|
|
536
|
+
$ claude mcp add nmts -- nmts mcp --out /where/files/should/land
|
|
537
|
+
$ codex mcp add nmts -- nmts mcp --out /where/files/should/land
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
**opencode**에는 그 명령이 없습니다. `opencode.json`에 이렇게 넣으십시오.
|
|
541
|
+
|
|
542
|
+
```json
|
|
543
|
+
{ "mcp": { "nmts": { "type": "local", "command": ["nmts", "mcp", "--out", "/where/files/should/land"] } } }
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
로컬 MCP 서버를 돌리는 다른 클라이언트도 같은 둘을 받습니다 — 명령 `nmts`와 인자
|
|
547
|
+
`mcp --out <디렉터리>`. 그것을 어디에 적을지는 그 클라이언트의 일입니다.
|
|
548
|
+
|
|
549
|
+
도구를 스무 개 내줍니다 — 계정 읽기(`nmts_whoami`·`nmts_list`·`nmts_usage`·`nmts_expiring`·
|
|
550
|
+
`nmts_balance`·`nmts_shares`), 가져오기(`nmts_get`·`nmts_pull`·`nmts_receive`),
|
|
551
|
+
업로드(`nmts_put`·`nmts_push`), 정리(`nmts_mkdir`·`nmts_move`·`nmts_rename`·`nmts_mark`·
|
|
552
|
+
`nmts_trash`·`nmts_restore`), 공유(`nmts_public_code`·`nmts_share`·`nmts_unshare`).
|
|
553
|
+
|
|
554
|
+
**일부러 내주지 않는 것**과 각각의 이유:
|
|
555
|
+
|
|
556
|
+
- **자격과 동의** — 로그인·로그아웃, 키 만들기·거두기, 아래의 동의를 주는 것. 그것은 그분의
|
|
557
|
+
것입니다. 자기 권한을 스스로 줄 수 있는 통로는 권한이 없는 것과 같습니다.
|
|
558
|
+
- **사람이 지나야 하는 확인.** 기계는 못 합니다 — 확인하려는 것이 그것입니다.
|
|
559
|
+
- **영구히 없애는 것** — 휴지통 비우기, 파일 영구 삭제. 휴지통에 **넣는** 것은 있습니다. 도로
|
|
560
|
+
꺼낼 수 있기 때문입니다.
|
|
561
|
+
- **잃어버린 파일 목록 다시 짓기.** 되기는 됩니다만 되살아나는 이름이 전부 임시값이고, 그것은
|
|
562
|
+
나중에 글로 읽으실 것이 아니라 직접 보고 계셔야 하는 일입니다.
|
|
563
|
+
- **복구 파일 쓰기와 복구 프로그램 받기.** 그것들은 이 서비스가 없는 날을 위해 있고, 만들고
|
|
564
|
+
간직하는 것은 그분의 몫입니다.
|
|
565
|
+
|
|
566
|
+
내주는 것 중 어느 것도 지정하신 디렉터리 밖에 쓰지 못합니다 — 거기서 빠져나가는 경로를 요구하는
|
|
567
|
+
모델은 그 안에 있는 자기 이름의 파일을 얻거나 거절당합니다. 도구 선언 어디에도 그분 디스크의
|
|
568
|
+
경로를 적을 자리가 없고, 도구가 늘어나도 그 사실이 유지되게 하는 것이 그것입니다.
|
|
569
|
+
|
|
570
|
+
도구가 선언한 인자는 돌기 전에 검사하고, 잘못된 것은 짐작하지 않고 거절합니다 — `dry_run`이 문자열
|
|
571
|
+
`"true"`로 오면 그것은 오류이지 값을 치르는 업로드가 아닙니다.
|
|
572
|
+
|
|
573
|
+
SDK가 아니라 직접 구현했으므로 의존성이 늘지 않습니다.
|
|
574
|
+
|
|
575
|
+
## 에이전트가 스스로 판단하게 두기
|
|
576
|
+
|
|
577
|
+
기본으로는 동의되지 않은 일이 있으면 그분께 묻고, 이것을 부리는 에이전트는 대신 답하지 말라는
|
|
578
|
+
말을 듣습니다. 그것을 바꾸는 설정이 둘 있고, 둘 다 무엇인지 밝히는 플래그를 요구합니다.
|
|
579
|
+
|
|
580
|
+
```
|
|
581
|
+
$ nmts mode # 지금 무엇으로 돼 있는가
|
|
582
|
+
$ nmts mode auto --i-accept-the-risk # 에이전트가 판단하고 진행합니다
|
|
583
|
+
$ nmts mode skip-permissions --i-accept-the-risk # 에이전트가 그냥 진행합니다
|
|
584
|
+
$ nmts mode off # 다시 묻게
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
켜져 있는 동안 **모든 명령이 stderr에 그렇다고 말합니다.** 일부러 그렇습니다 — 이것은 크레딧을
|
|
588
|
+
쓰기 전에 누가 물어보느냐를 정하는 설정이고, 자기가 켜져 있다고 말하기를 그만둔 설정은 사람들이
|
|
589
|
+
켜 둔 줄 잊는 설정입니다.
|
|
590
|
+
|
|
591
|
+
동의 자체를 없애지는 않습니다. 쓰기, 지갑, 공유, 계정 코드를 어디에 둘 수 있는가는 여전히 하나씩
|
|
592
|
+
날짜와 함께 기록되고 `nmts consent`가 여전히 그것을 늘어놓습니다. 달라지는 것은 **누가 그것을
|
|
593
|
+
기록해도 되는가**입니다 — `skip-permissions`가 켜져 있으면 에이전트가 그분을 대신해 그렇게 하는
|
|
594
|
+
것이 그분이 시키신 일이고, 꺼져 있으면 에이전트가 읽는 지시가 그러지 말라고 말합니다.
|
|
595
|
+
|
|
596
|
+
## 연결이 깜빡일 때
|
|
597
|
+
|
|
598
|
+
만들지 못한 요청 — 연결 거부, 연결 끊김, 아예 맺어지지 않음, 즉 휴대폰 데이터와 와이파이 사이를
|
|
599
|
+
오갈 때 보이는 그 모양 — 은 사이 간격을 늘려 가며 20초쯤 다시 시도한 뒤에 실패를 보고합니다.
|
|
600
|
+
말없이 다시 시도하는 것은 없습니다 — 기다린다고 말합니다.
|
|
601
|
+
|
|
602
|
+
**다시 시도하지 않는 것**과 각각의 이유:
|
|
603
|
+
|
|
604
|
+
- **거절.** 서버가 아니라고 한 것 — 잘못된 키, 크레딧 없음, 없는 파일 — 은 답입니다. 다시 묻는
|
|
605
|
+
것은 같은 말을 나중에 듣는 데 기다림을 쓰는 일입니다. 거절은 대개 **무엇을 하면 되는지 한 줄**을
|
|
606
|
+
함께 찍습니다. 안 찍는 것은 덧붙일 말이 없어서입니다.
|
|
607
|
+
- **시간이 다 된 요청.** 이미 30초를 썼고, 그 기한이 있는 이유는 이것을 반복해 돌리는 에이전트가
|
|
608
|
+
하염없이 기다리지 않게 하려는 것입니다.
|
|
609
|
+
- ⛔ **멱등 키 없는 쓰기.** 서버에 닿았는데 돌아오는 길에 죽은 요청은 아예 도착하지 않은 요청과
|
|
610
|
+
똑같이 보이고, 그것을 두 번 보내면 돈이 두 번 나갈 수 있습니다. 값을 치르는 두 호출은 키를
|
|
611
|
+
지닙니다 — 두 번째 사본이 같은 요청이라는 서버의 약속입니다 — 그리고 그 둘은 다시 보냅니다.
|
|
612
|
+
쓰기를 하는 나머지는 아닙니다.
|
|
613
|
+
|
|
614
|
+
## 망
|
|
615
|
+
|
|
616
|
+
`--network mainnet` 또는 `--network testnet`, 아니면 `NMTS_NETWORK`. 절대 짐작하지 않습니다 —
|
|
617
|
+
틀린 망은 그분 파일이 저장된 적 없는 곳을 뒤지고 「망이 틀렸다」가 아니라 「없다」고 답합니다.
|
|
618
|
+
실서버를 상대로는 망이 이미 알려져 있어 이 옵션이 선택이고, 다른 서버를 상대로는 필수입니다.
|
|
619
|
+
|
|
620
|
+
## 뭔가 잘못됐다면
|
|
621
|
+
|
|
622
|
+
**`nmts@nmts.me` 로 보내 주십시오** — 결함이든, 헷갈리는 메시지든, 없는 기능이든, 걸리적거린 무엇
|
|
623
|
+
이든. 가장 사소한 거슬림도 메일 하나 값어치가 있습니다. 대개는 고치기 싸고, 이쪽에서는 보이지
|
|
624
|
+
않습니다. 무엇을 돌리셨고 무엇이라고 나왔는지 적어 주십시오. **영어 또는 한국어로 써 주십시오** —
|
|
625
|
+
둘 다 읽습니다.
|
|
626
|
+
|
|
627
|
+
그 주소는 **이 도구**가 잘못됐을 때의 자리입니다. 서비스 자체에 대한 질문과 콘텐츠 신고는
|
|
628
|
+
[nmts.me](https://nmts.me)의 문의함으로 가십시오.
|
|
629
|
+
|
|
630
|
+
## 라이선스
|
|
631
|
+
|
|
632
|
+
Apache-2.0. 전문은 [LICENSE](LICENSE)에 원문 그대로 있습니다. 2026년 8월 30일에 AGPL-3.0-only
|
|
633
|
+
에서 옮겼고, 그전에 받아 두신 사본은 그대로 AGPL로 남습니다.
|
|
634
|
+
|
|
635
|
+
**그 위에 만들고, 내놓고, 만드신 것을 파셔도 됩니다.** 프로그램을 쓰시는 데에는 아무 조건이
|
|
636
|
+
없습니다. 다시 배포하실 때 라이선스와 저작권 고지가 함께 갑니다. 그래도 다른 조건이 필요하시면
|
|
637
|
+
**nmts@nmts.me** 로 이유와 함께 알려 주십시오 — [LICENSING.md](LICENSING.md)를 봐 주십시오.
|
|
638
|
+
|
|
639
|
+
코드도 환영합니다 — 어떻게 도착하는지는 [CONTRIBUTING.ko.md](CONTRIBUTING.ko.md)에 있고,
|
|
640
|
+
[기여자 라이선스 동의서](CLA.ko.md)가 위 약속을 프로그램 전체에 대해 참으로 유지해 줍니다.
|
|
641
|
+
버그 신고와 질문, 아이디어도 환영합니다.
|