sefy-cli 0.1.2 → 0.3.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/README.md +68 -0
- package/package.json +20 -5
package/README.md
CHANGED
|
@@ -106,6 +106,21 @@ error: 2 items match "ma":
|
|
|
106
106
|
narrow the text, or use an id
|
|
107
107
|
```
|
|
108
108
|
|
|
109
|
+
Two machines, two copies, both edited? Fold one into the other. Where they
|
|
110
|
+
disagree about the same item, sefy keeps both versions rather than letting a
|
|
111
|
+
timestamp decide which password you get to keep:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
$ sefy merge ~/from-laptop.bak
|
|
115
|
+
Password for /home/you/from-laptop.bak:
|
|
116
|
+
merged: 1 added, 1 updated, 1 unchanged
|
|
117
|
+
|
|
118
|
+
1 item changed on both sides and could not be resolved here.
|
|
119
|
+
This vault's version was kept; the incoming one is beside it:
|
|
120
|
+
"mail" → also kept as "mail (conflicted copy)"
|
|
121
|
+
Compare them, keep the right one, and remove the other.
|
|
122
|
+
```
|
|
123
|
+
|
|
109
124
|
A vault is never a trap. `sefy export` writes everything back out as plain
|
|
110
125
|
JSON - which is exactly as sensitive as the vault and protects nothing, so the
|
|
111
126
|
command makes you say so out loud:
|
|
@@ -119,6 +134,34 @@ pass --i-know-this-writes-plaintext to go ahead
|
|
|
119
134
|
|
|
120
135
|
Full command reference: **[lacodda.github.io/sefy](https://lacodda.github.io/sefy/)**.
|
|
121
136
|
|
|
137
|
+
## Transports
|
|
138
|
+
|
|
139
|
+
Carrying a vault to another machine is the job of a **plugin**: any executable
|
|
140
|
+
named `sefy-plugin-*`, found in sefy's data directory or on `PATH`. sefy knows
|
|
141
|
+
nothing about git, FTP or any cloud drive - it asks a plugin what it can do and
|
|
142
|
+
what happened.
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
$ sefy plugin list
|
|
146
|
+
ftp 0.2.1 push
|
|
147
|
+
future 9.0.0 unusable: it speaks protocol 99 and this build speaks 1
|
|
148
|
+
github 0.1.0 pull, push
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
A transport is handed the **path of the sealed file** and nothing else - no
|
|
152
|
+
master password, no key, no item. What it carries is what anyone would find on
|
|
153
|
+
your disk: a blob it cannot read. That is also why a plugin cannot merge; it
|
|
154
|
+
fetches the other copy to a file, and `sefy merge` folds the two together where
|
|
155
|
+
both sides can actually be read.
|
|
156
|
+
|
|
157
|
+
Broken plugins are listed with the reason rather than skipped: an omitted line
|
|
158
|
+
would look exactly like a plugin that was never installed.
|
|
159
|
+
|
|
160
|
+
The protocol is small enough to implement in a shell script - manifest on
|
|
161
|
+
`--manifest`, one JSON request on stdin for `run`. Writing one:
|
|
162
|
+
[plugin reference](https://lacodda.github.io/sefy/reference/plugin/) ·
|
|
163
|
+
[ADR-0002](https://github.com/lacodda/sefy/blob/main/docs/adr/0002-plugin-protocol.md).
|
|
164
|
+
|
|
122
165
|
## How it works
|
|
123
166
|
|
|
124
167
|
- The master password is stretched into a key with **Argon2id**.
|
|
@@ -137,6 +180,18 @@ Details and rationale: [ADR-0001](https://github.com/lacodda/sefy/blob/main/docs
|
|
|
137
180
|
|
|
138
181
|
## Install
|
|
139
182
|
|
|
183
|
+
**One-line installers.** Windows (PowerShell):
|
|
184
|
+
|
|
185
|
+
```powershell
|
|
186
|
+
irm https://raw.githubusercontent.com/lacodda/sefy/main/tools/install.ps1 | iex
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
macOS / Linux:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
curl -fsSL https://raw.githubusercontent.com/lacodda/sefy/main/tools/install.sh | sh
|
|
193
|
+
```
|
|
194
|
+
|
|
140
195
|
**cargo** - `cargo install sefy`
|
|
141
196
|
|
|
142
197
|
**npm** - `npm install -g sefy-cli`
|
|
@@ -145,6 +200,9 @@ Details and rationale: [ADR-0001](https://github.com/lacodda/sefy/blob/main/docs
|
|
|
145
200
|
(Windows x86_64, Linux x86_64, macOS arm64), unpack and put `sefy` on your
|
|
146
201
|
`PATH`.
|
|
147
202
|
|
|
203
|
+
Both installers take the newest release by default; set `SEFY_VERSION` to a tag
|
|
204
|
+
to pin one, and `SEFY_INSTALL_DIR` to choose where the binary lands.
|
|
205
|
+
|
|
148
206
|
Shell completions: `sefy completions bash` (also `zsh`, `fish`, `powershell`,
|
|
149
207
|
`elvish`).
|
|
150
208
|
|
|
@@ -155,6 +213,16 @@ will stay readable: any future change to the format arrives as version 2, able
|
|
|
155
213
|
to read version 1 and migrate it. The Argon2 parameters are part of that
|
|
156
214
|
promise, not a tuning knob.
|
|
157
215
|
|
|
216
|
+
The database inside the ciphertext is versioned separately, and it does move:
|
|
217
|
+
0.2.0 added an identity to items so two copies of a vault can be merged. A vault
|
|
218
|
+
from 0.1.x opens, is migrated on the way in, and is still readable by 0.1.x
|
|
219
|
+
afterwards - the file on disk did not change shape.
|
|
220
|
+
|
|
221
|
+
The **plugin protocol is at version 1** as of 0.3.0. Optional fields may be
|
|
222
|
+
added to the manifest without breaking a plugin that predates them; changing
|
|
223
|
+
what an existing field means would arrive as version 2, with both accepted for a
|
|
224
|
+
time.
|
|
225
|
+
|
|
158
226
|
Released versions and what landed in each: [CHANGELOG on the Releases page](https://github.com/lacodda/sefy/releases).
|
|
159
227
|
|
|
160
228
|
## Building
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sefy-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"sefy": {
|
|
5
|
-
"binary": "v0.
|
|
5
|
+
"binary": "v0.3.0"
|
|
6
6
|
},
|
|
7
7
|
"description": "An inconspicuous encrypted store for notes, credentials and files",
|
|
8
8
|
"license": "MIT",
|
|
@@ -12,16 +12,31 @@
|
|
|
12
12
|
"type": "git",
|
|
13
13
|
"url": "git+https://github.com/lacodda/sefy.git"
|
|
14
14
|
},
|
|
15
|
-
"keywords": [
|
|
15
|
+
"keywords": [
|
|
16
|
+
"cli",
|
|
17
|
+
"secrets",
|
|
18
|
+
"password-manager",
|
|
19
|
+
"encryption",
|
|
20
|
+
"vault"
|
|
21
|
+
],
|
|
16
22
|
"bin": {
|
|
17
23
|
"sefy": "run.js"
|
|
18
24
|
},
|
|
19
|
-
"files": [
|
|
25
|
+
"files": [
|
|
26
|
+
"download.js",
|
|
27
|
+
"install.js",
|
|
28
|
+
"run.js",
|
|
29
|
+
"README.md"
|
|
30
|
+
],
|
|
20
31
|
"scripts": {
|
|
21
32
|
"prepack": "node -e \"require('fs').copyFileSync('../README.md','README.md')\"",
|
|
22
33
|
"postinstall": "node install.js"
|
|
23
34
|
},
|
|
24
|
-
"os": [
|
|
35
|
+
"os": [
|
|
36
|
+
"win32",
|
|
37
|
+
"darwin",
|
|
38
|
+
"linux"
|
|
39
|
+
],
|
|
25
40
|
"engines": {
|
|
26
41
|
"node": ">=18"
|
|
27
42
|
}
|