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.
Files changed (2) hide show
  1. package/README.md +68 -0
  2. 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.1.2",
3
+ "version": "0.3.0",
4
4
  "sefy": {
5
- "binary": "v0.1.2"
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": ["cli", "secrets", "password-manager", "encryption", "vault"],
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": ["download.js", "install.js", "run.js", "README.md"],
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": ["win32", "darwin", "linux"],
35
+ "os": [
36
+ "win32",
37
+ "darwin",
38
+ "linux"
39
+ ],
25
40
  "engines": {
26
41
  "node": ">=18"
27
42
  }