secrez 1.1.1 → 1.1.3

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 (68) hide show
  1. package/README.md +503 -444
  2. package/bin/secrez.js +50 -47
  3. package/coverage.report +91 -85
  4. package/package.json +10 -12
  5. package/src/Command.js +78 -57
  6. package/src/PreCommand.js +75 -70
  7. package/src/Welcome.js +144 -134
  8. package/src/cliConfig.js +14 -14
  9. package/src/commands/Alias.js +123 -100
  10. package/src/commands/Bash.js +10 -12
  11. package/src/commands/Cat.js +117 -107
  12. package/src/commands/Cd.js +39 -42
  13. package/src/commands/Chat.js +75 -63
  14. package/src/commands/Conf.js +123 -99
  15. package/src/commands/Contacts.js +189 -171
  16. package/src/commands/Copy.js +132 -113
  17. package/src/commands/Courier.js +123 -105
  18. package/src/commands/Ds.js +88 -76
  19. package/src/commands/Edit.js +122 -103
  20. package/src/commands/Export.js +201 -116
  21. package/src/commands/Find.js +115 -110
  22. package/src/commands/Help.js +20 -23
  23. package/src/commands/Import.js +296 -225
  24. package/src/commands/Lcat.js +36 -39
  25. package/src/commands/Lcd.js +38 -39
  26. package/src/commands/Lls.js +58 -55
  27. package/src/commands/Lpwd.js +20 -24
  28. package/src/commands/Ls.js +107 -97
  29. package/src/commands/Mkdir.js +35 -38
  30. package/src/commands/Mv.js +147 -114
  31. package/src/commands/Paste.js +68 -65
  32. package/src/commands/Pwd.js +18 -23
  33. package/src/commands/Quit.js +22 -24
  34. package/src/commands/Rm.js +78 -70
  35. package/src/commands/Shell.js +31 -32
  36. package/src/commands/Ssh.js +77 -63
  37. package/src/commands/Tag.js +133 -112
  38. package/src/commands/Totp.js +166 -136
  39. package/src/commands/Touch.js +169 -56
  40. package/src/commands/Use.js +44 -41
  41. package/src/commands/Ver.js +16 -18
  42. package/src/commands/Whoami.js +34 -37
  43. package/src/commands/chat/Contacts.js +41 -44
  44. package/src/commands/chat/Help.js +20 -23
  45. package/src/commands/chat/Join.js +59 -55
  46. package/src/commands/chat/Leave.js +16 -22
  47. package/src/commands/chat/Quit.js +19 -24
  48. package/src/commands/chat/Send.js +58 -57
  49. package/src/commands/chat/Show.js +60 -51
  50. package/src/commands/chat/Whoami.js +18 -22
  51. package/src/commands/index.js +20 -22
  52. package/src/index.js +3 -3
  53. package/src/prompts/ChatPrompt.js +87 -82
  54. package/src/prompts/ChatPromptMock.js +11 -17
  55. package/src/prompts/CommandPrompt.js +146 -138
  56. package/src/prompts/Completion.js +64 -69
  57. package/src/prompts/MainPrompt.js +84 -77
  58. package/src/prompts/MainPromptMock.js +19 -30
  59. package/src/prompts/MultiEditorPrompt.js +21 -22
  60. package/src/prompts/SigintManager.js +21 -24
  61. package/src/utils/AliasManager.js +16 -18
  62. package/src/utils/ContactManager.js +15 -17
  63. package/src/utils/Fido2Client.js +59 -49
  64. package/src/utils/HelpProto.js +130 -117
  65. package/src/utils/Logger.js +48 -50
  66. package/.eslintignore +0 -0
  67. package/.eslintrc +0 -33
  68. package/.jshintrc +0 -3
package/README.md CHANGED
@@ -5,10 +5,6 @@
5
5
  </h1>
6
6
 
7
7
  <p align="center">
8
- <a href="https://discord.gg/whsgXj">
9
- <img src="https://img.shields.io/badge/chat-on%20discord-brightgreen.svg">
10
- </a>
11
-
12
8
  <a href="https://github.com/secrez/secrez/issues">
13
9
  <img src="https://img.shields.io/github/issues/secrez/secrez.svg">
14
10
  </a>
@@ -24,92 +20,66 @@
24
20
  <a href="LICENSE">
25
21
  <img src="https://img.shields.io/github/license/secrez/secrez.svg">
26
22
  </a>
27
- </p>
28
-
29
- Secrez is:
30
- * a CLI secret manager working as an encrypted file system;
31
- * a decentralized surveillance-resistant end-to-end encrypted messaging system.
32
-
33
- ## Intro
34
-
35
- At the very basic, Secrez is a CLI application that manages a particular encrypted file system, with commands working similarly to Unix commands like `cd`, `mkdir`, `ls`, `mv`, etc.
36
-
37
- The idea is to interact with encrypted virtual files as if they are just files in a standard file system.
38
23
 
24
+ <a href="https://discord.gg/whsgXj">
25
+ <img src="https://img.shields.io/badge/chat-on%20discord-brightgreen.svg">
26
+ </a>
39
27
 
40
- ## Why Secrez?
28
+ <a href="https://gitter.im/secrez/secrez?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge" alt="Join the chat at https://gitter.im/secrez/secrez">
29
+ <img src="https://badges.gitter.im/secrez/secrez.svg">
30
+ </a>
41
31
 
42
- There are two primary approaches to secrets and password management:
32
+ </p>
43
33
 
44
- 1. Online systems that save the data online (like LastPass)
45
- 2. Desktop tools who keep data in the computer (like KeyPass)
34
+ Secrez is a CLI secret manager that functions as an encrypted file system, as well as a decentralized, surveillance-resistant, end-to-end encrypted messaging system.
46
35
 
47
- An Online Password Manager requires that you trust the remote server.
48
- I founded Passpack in 2006, and I know very well how, at any moment, you can add a backdoor —— even only for a specific user —— and most likely nobody will notice it.
36
+ ## Intro
49
37
 
50
- The second case, a desktop tool is intrinsically more secure, but it is hard to use on more than one computer.
51
- The standard solution is to backup the database on Dropbox or Google Drive and —— before using it —— download it locally, which is prone to produce unfixable problems and cause data loss.
38
+ At its core, Secrez is a command-line interface that manages an encrypted file system, with commands that work similarly to Unix commands like `cd`, `mkdir`, `ls`, `mv`, etc. The idea is to interact with encrypted virtual files as if they are just files in a standard file system.
52
39
 
53
- Secrez's goal is to be as safe as KeyPass but available everywhere, like Lastpass.
40
+ ## Why Secrez?
54
41
 
55
- To obtain this goal, Secrez assembles a few strategies:
42
+ Secrez aims to provide a secure password management solution that is available everywhere. While online password managers like LastPass require you to trust a remote server, desktop tools like KeyPass are more secure but difficult to use on multiple computers. To address this, Secrez combines the security of KeyPass with the accessibility of LastPass.
56
43
 
57
- - Any secret is a local file
58
- - Any file — besides if it is a tree version, a directory, a text file, or a binary file — is immutable
59
- - Any change can be pulled/pushed to a remote private repo
44
+ To achieve its goal, Secrez uses several strategies. First, any secret is a local file. Second, any file, whether it's a tree version, a directory, a text file, or a binary file, is immutable. Finally, any change can be pulled/pushed to a remote private repository. You can either create a private repository on GitHub, BitBucket, etc. or set up your own self-hosted Git server.
60
45
 
61
- You can either create a private repo on GitHub, BitBucket, etc. or much better setting your own, self-hosted git server.
46
+ In addition to functioning as a password manager, Secrez also includes an optional decentralized, surveillance-resistant, end-to-end encrypted messaging system. This provides an extra layer of security for your communications, ensuring that your messages cannot be intercepted or read by anyone other than the intended recipient.
62
47
 
63
- For now, this is a manual approach. In a future version, the git repo will be manageable from inside Secrez.
48
+ Overall, Secrez offers a powerful and secure solution for managing your passwords and secrets, all from the command line.
64
49
 
65
50
  ## The structure
66
51
 
67
- Secrez simulates an operating system. When you load the environment, you can execute commands like `ls`, `mv`, etc. similarly to what you normally to in a Unix terminal.
68
-
69
- Starting from version `0.6.0`, the data are organized in datasets. Think of them like separate disks, something like `/dev/disk1` and `/dev/disk2`.
70
-
71
- By default, Secrez generates two datasets: `main` and `trash`. You can create more with, for example, `use -c archive`. The advantage of multiple datasets is mostly for people who have a lot of secrets to manage. If you have 2,000, if they are all in the primary dataset, the system will probably become quite slow. The solution is to move data to separate datasets (`archive`, `backup`, `twitter`, `cryptos`, etc.)
72
-
73
-
74
- ## Secrez never lose secrets
75
-
76
- One of the primary goal of a secrets manager is that you will never lose any data.
52
+ Secrez simulates an operating system, allowing you to execute commands like ls and mv when you load the environment, similar to what you would normally do in a Unix terminal.
77
53
 
78
- However, since only the most recent index is read, some secrets could be in the folder and not been loaded.
54
+ Starting from version 0.6.0, Secrez organizes data into datasets, which act like separate disks, such as /dev/disk1 and /dev/disk2. By default, Secrez generates two datasets: main and trash. You can create more using the use -c command, such as use -c archive.
55
+ One of the primary goals of a secrets manager is to ensure that no data is ever lost. However, in some cases, secrets may exist in a folder but not be loaded if only the most recent index is read.
79
56
 
80
- Let do an example. Alice uses Secrez on computer A and computer B. The two data sets are aligned. Suddenly, GitHub is down and she has to make some change on both computers.
57
+ Here's an example: Alice uses Secrez on both computer A and B, and the two data sets are aligned. Suddenly, GitHub goes down, and she makes some changes on both computers. When GitHub comes back online, she pushes the master branch on computer A, and everything goes fine. However, when she pulls on computer B and pushes, the data online become inconsistent because the most recent tree (from B) does not contain the new changes that were previously saved on A. This means that some secrets are in one index, while others are in the other.
81
58
 
82
- When GitHub is up again, she pushes master on A and everything goes fine.
59
+ No problem. When Alice restarts Secrez, the system finds the extra secrets, reads their positions from the previous indexes, and puts them back in the tree. Since files are immutable, the recovery strategy is not always obvious. Here's what happens in different cases:
83
60
 
84
- She pulls on B and pushes.
85
- Now, the data online are not consistent because the most recent tree (from B) does not contains the new changes saved previously on A, i.e., some secrets are in one index, some are in the other one.
61
+ If the recovered secret is in a folder that does not exist in the "official" index, the entire path is added using the encrypted data of the recovered secret.
62
+ If the secret is a file in a folder that already exists, the file is added as is, but the folders with existing paths are trashed.
63
+ If the secret is a file and a file with the same name already exists in the same position, the system checks the content of the file. If it is the same, the secret is ignored. If it's different, it is added as a version.
64
+ Any unused or rewritten secrets (as versions) are trashed (you can check them in the trash dataset). In any case, all the contents are kept.
86
65
 
87
- No problem. When Alice restart Secrez, the system finds the extra secrets, reads their positions from the previous indexes and puts them back in the tree.
66
+ To avoid repeating the same process on the other computer (which will generate files with different IDs and more deleted items), Alice should align the repo on computer A before doing anything there. But if she doesn't, nothing will be lost anyway.
88
67
 
89
- Since files are immutable, the strategy is not obvious. This is what happens in different cases:
90
-
91
- 1. The recovered secret is in a folder that does not exists in the "official" index. In this case, the entire path is added using the encrypted data of the recovered secret
92
- 2. The secret is a file in a folder that actually exists. The file is added as is, but the folders with existent paths are trashed.
93
- 3. The secret is a file but a file with the same name exists in the same position. The system checks the content of the file. If it is the same, the secret is ignored, if not it is added as a version.
94
-
95
- Either any unused secret or secret that is rewritten (as a version) is trashed (you can check them in the `trash` dataset).
96
-
97
- In any case, all the contents are kept.
98
-
99
- To avoid to repeat the same process on the other computer (which will generate files with different IDs and more deleted items), Alice should align the repo on A before doing anything there. But, if she does not, nothing will be lost anyway.
68
+ Thus said, **it is a good practice to align the repo before doing anything. You never know.**
100
69
 
101
70
  ## The name convention
102
71
 
103
- A file name in Secrez looks like
72
+ In Secrez, file names follow a specific convention:
73
+
104
74
  ```
105
75
  1VAnGLojzCDWhfZRK8PCYK203WBzJkAA28FhKHdS7DM5SkJaTgYdGfN1MAjTdfUYSzvtDVsMJvGodoHWzMuK6zr
106
76
  ```
107
- where `1` is the type (DIR, other types are TEXT and BINARY), and the rest is a encrypted message with nonce, in Base58 format.
108
77
 
109
- The encrypted part is the combination of id, timestamp, and actual filename.
110
- This implies that, at bootstrap, Secrez must read all the files' names and build a tree of the entire file system. This is done using particular files: trees. Only after reading all the data, Secrez is able to understand which is the tree and, if something is missed, add the missing secrets. Since everything is encrypted, there is no information deductible from the files on disk, except what you can deduct from the Git repo (mostly about versioning and timestamp). But the idea is to use a private repo, so this is a minor issue.
78
+ The first character, 1, indicates the type of file. The remaining characters represent an encrypted message with a nonce, in Base58 format. The encrypted part consists of an ID, timestamp, and the actual filename.
79
+
80
+ During initialization, Secrez reads all file names and builds a tree of the entire file system. This is done using special files called trees. Once all data has been read, Secrez can determine the tree and add any missing secrets. Since everything is encrypted, it is not possible to deduce information from the files on disk, except for versioning and timestamps, which can be obtained from the Git repo.
111
81
 
112
- To mitigate this risk, you can create a new Git repo, save everything as the first commit, and delete the previously used repo. This way, you lose the repo's history, but you also lose info about timestamps and versions in case someone gains access to the repo.
82
+ To mitigate this risk, you can create a new Git repo, save everything as the first commit, and delete the previously used repo. This will result in losing the repo's history, but it will also prevent someone from accessing information about timestamps and versions.
113
83
 
114
84
  ## The tree
115
85
 
@@ -117,95 +87,73 @@ Secrez manages trees as single immutable files. During a session, temporary file
117
87
 
118
88
  ## The cryptographic foundation
119
89
 
120
- After comparing many possibilities, Secrez uses [NaCl](https://github.com/dchest/tweetnacl-js) as a crypto library. The advantage is that the library includes many algorithms for synchronous and asynchronous encryption.
121
-
90
+ Secrez uses [NaCl](https://github.com/dchest/tweetnacl-js) as its primary cryptographic library. NaCl is a widely respected library that provides many algorithms for both synchronous and asynchronous encryption, and its design has been rigorously reviewed by experts in the field. By using NaCl, Secrez is able to provide strong security guarantees for its users.
122
91
 
123
92
  ## How to install it
124
93
 
125
- First, Secrez require at least Node 10. If you have installed a previous version it will generates unclear errors and refuse to install or work. I suggest you install Node using `nvm`, if you can. For more info look at [https://github.com/nvm-sh/nvm](https://github.com/nvm-sh/nvm).
94
+ Secrez requires at least Node 10. If you have installed a previous version, it may generate unclear errors and refuse to install or work properly. We recommend installing Node using nvm if possible. For more information, refer to [https://github.com/nvm-sh/nvm](https://github.com/nvm-sh/nvm).
126
95
 
127
- To install Secrez globally you can use Npm
96
+ Since this monorepo uses [Pnpm](https://pnpm.io/), it is better to install secrez using pnpm because the lock file will be used to avoid unexpected conflicts among modules. To install pnpm, run:
128
97
 
129
98
  ```
130
- npm install -g secrez
99
+ npm i -g pnpm
131
100
  ```
132
101
 
133
- but, since this monorepo uses pnpm, it is even better if you use pnpm because the lock file will be used avoiding unespected conflicts among modules.
134
- To install pnpm run
102
+ and then run:
135
103
 
136
- ```
137
- npm i -g pnpm
138
- ```
139
- and later
140
104
  ```
141
105
  pnpm i -g secrez
142
106
  ```
143
107
 
144
108
  ## How to use it
145
109
 
146
- In the simplest case, you can just run
110
+ To get started with Secrez, simply run the command:
111
+
147
112
  ```
148
113
  secrez
149
114
  ```
150
115
 
151
- At first run, Secrez will ask you for the number of iterations (suggested between 500000 and 1000000, but the more the better) and a master password ideally a phrase hard to guess, but easy to remember and type, something like, for example "heavy march with 2 eggs" or "grace was a glad president".
152
-
153
- Since Secrez derives a master key from your password using `crypto.pbkdf2`, the number of iterations is a significant addition to the general security because the number of iterations is part of the salt used for the derivation. Even if you use a not-very-hard-to-guess password, if the attacker does not know the number of iterations, he has to try all the possible ones. Considering that 2,000,000 iterations require a second or so, customizable iterations increases enormously the overall security.
116
+ Upon first launch, Secrez will prompt you to enter a master password and the number of iterations. The number of iterations is used to derive a master key from your password, so the higher the number, the more secure your data will be. It's recommended to use between 500,000 and 1,000,000 iterations, but you can customize this based on your needs. For example, you can set the number of iterations explicitly by running:
154
117
 
155
- At first launch, you can also explicitly set up the number of iterations:
156
118
  ```
157
119
  secrez -i 1023896
158
120
  ```
159
- or
160
- ```
161
- secrez -si 876352
162
- ```
163
- where the `-s` option saves the number locally in a git-ignored `env.json` file. This way you don't have to retype it all the time to launch Secrez (typing a wrong number of iterations, of course, will produce an error).
164
121
 
165
- You can save locally the number of iterations adding the options `-s`, like:
122
+ You can also save the number of iterations locally by adding the -s option:
123
+
166
124
  ```
167
125
  secrez -s
168
126
  ```
169
127
 
170
- It is possible that the number of iterations you chose makes the initial decryption too slow. You can change it inside the Secrez CLI with the command `conf`.
171
-
172
- Other options at launch are:
128
+ This will save the number of iterations in a git-ignored env.json file, so you don't have to enter it every time you launch Secrez. If you mistype the number of iterations, Secrez will produce an error.
173
129
 
174
- - `-l` to set up the initial "external" folder on you computer
175
- - `-c` to set up the container (i.e, the folder) where the encrypted data are located
130
+ In addition to the master password and number of iterations, you can also specify other options at launch, such as the initial "external" folder on your computer (-l option) and the container (i.e., the folder) where the encrypted data is located (-c option). By default, both folders are set to your home directory (~). For example, if you want to set up a separate encrypted database in a different folder, you can run:
176
131
 
177
- By default, both folders are your homedir (`~`).
178
-
179
- Running Secrez in different containers (with the `-c` option), you can set up multiple independent encrypted databases. For example:
180
132
  ```
181
133
  secrez -c ~/data/secrez
182
134
  ```
183
135
 
136
+ If the number of iterations you chose makes the initial decryption too slow, you can change it inside the Secrez CLI with the conf command.
137
+
184
138
  ## The commands
185
139
 
140
+ Launching `help` you can list all available commands.
141
+
186
142
  ```
143
+ Available commands:
187
144
  alias Create aliases of other commands.
145
+ bash << deprecated - use "shell" instead
188
146
  cat Shows the content of a file.
189
147
  cd Changes the working directory.
190
148
  chat Enters the Secrez chat
191
- contacts Manages your contacts
192
- help This help.
193
- join Joins conversation.
194
- leave Leaves a room
195
- quit Quit the chat environment
196
- send Sends either a room or the chat
197
- show Show chat history in a room
198
- whoami Show data that other users need to chat with you
199
- conf Configure security data (2FA, password, number of iterations).
149
+ conf Shows current configuration and allow to change password and number of iterations).
200
150
  contacts Manages your contacts
201
151
  copy Copy a text file to the clipboard.
202
152
  courier Configure the connection to a local courier
203
153
  ds Manages datasets
204
154
  edit Edits a file containing a secret.
205
- exit << deprecated - use "quit" instead
206
155
  export Export encrypted data to the OS in the current local folder
207
156
  find Find a secret.
208
- git Pushes to a repo and pulls from a repo.
209
157
  help This help.
210
158
  import Import files from the OS into the current folder
211
159
  lcat Similar to a standard cat in the external fs.
@@ -219,7 +167,7 @@ secrez -c ~/data/secrez
219
167
  pwd Shows the path of the working directory.
220
168
  quit Quits Secrez.
221
169
  rm Removes one or more files and folders.
222
- shell Execute a bash command in the current disk folder.
170
+ shell Execute a shell command in the current disk folder.
223
171
  ssh Opens a new tab and run ssh to connect to a remote server via SSH
224
172
  tag Tags a file and shows existent tags.
225
173
  totp Generate a TOTP code if a totp field exists in the card.
@@ -227,82 +175,92 @@ secrez -c ~/data/secrez
227
175
  use Uses a specific dataset.
228
176
  ver Shows the version of Secrez.
229
177
  whoami Show data that other users need to chat with you
230
-
178
+
231
179
  ```
232
180
 
233
181
  ## Some example
234
182
 
183
+ To display the content of an encrypted file called myPrivateKey, run the following command:
184
+
235
185
  ```
236
186
  cat myPrivateKey
237
187
  ```
238
188
 
239
- This command will show the content of an encrypted file, which is called `myPrivateKey`. In particular, it will show the latest version of the file.
189
+ By default, the latest version of the file will be displayed. However, you can use additional options to view a specific version or list all versions.
240
190
 
241
- Adding options to the command, it is possible to either see a specific version or list all the versions.
191
+ Secrez uses versioning to ensure data integrity and avoid conflicts when backing up and distributing data through Git. Each time a file is modified, a new encrypted file is created with metadata about its ID and timestamp. The timestamp is used to assign a version to the file, which is a 4-letter hash of the timestamp.
242
192
 
243
- The versioning is very important in Secrez because the primary way to backup and distribute the data is using Git. In this case, you want to avoid conflicts that can be not fixable because of the encryption. So, every time there is a change, an entirely new file is created, with metadata about its id and timestamp.
244
-
245
- The timestamp is used to assign a version to the file. A version is a 4-letters hash of the timestamp.
246
-
247
- Another example:
193
+ Another useful command is the import command. For example:
248
194
 
249
195
  ```
250
196
  import ~/Desktop/myWallet.json -m
251
197
  ```
252
198
 
253
- This command takes the standard file myWallet.json, contained in the Desktop folder, encrypts it, saves it in the encrypted file system, and removes (-m) it from the original folder.
199
+ This command will encrypt the file myWallet.json located on your Desktop, save it in the encrypted file system, and then delete the original file using the -m option.
200
+
201
+ This is particularly useful if you have just downloaded a private key to access your crypto wallet and want to encrypt it as soon as possible. With Secrez, you can import the file and delete the cleartext version in one command.
254
202
 
255
- This is one of my favorite commands. In fact, let's say that you have just downloaded the private key to access your crypto wallet, you want to encrypt it as soon as possible. With Secrez, you can import the file and delete the cleartext version in one command.
203
+ ## Aliases where the fun begins :-)
256
204
 
257
- ## Aliases where the fun comes :-)
205
+ Suppose you have a bank card and want to log in to your online account. You could copy the email and password to the clipboard to paste them in the browser. If you expect to be able to move from the terminal to the browser in 4 seconds, you could run the command:
258
206
 
259
- Suppose that you have a card for your bank and want to log into it. You could copy email and password to the clipboard to paste them in the browser. Suppose that you expect to be able in 4 seconds to move from the terminal to the browser, you could run the command:
260
207
  ```
261
208
  copy bank.yml -f email password -d 4 2
262
209
  ```
263
- This will copy the email field and give you 4 seconds to paste it in the browser. Then, it will emit a beep and you have 2 seconds to paste the password. It sounds quite useful, but it can be better.
264
210
 
265
- If you use that login often, you could like to create an alias for it with:
211
+ This will copy the email field and give you 4 seconds to paste it in the browser. Then, it will emit a beep, and you have 2 seconds to paste the password. It sounds quite useful, but it can be even better.
212
+
213
+ If you use that login often, you could create an alias for it with:
214
+
266
215
  ```
267
- alias b -c "copy bank.yml -f email password -d 4 2
216
+ alias b -c "copy bank.yml -f email password -d 4 2"
268
217
  ```
269
- Next time, you can just type
218
+
219
+ Next time, you can just type:
220
+
270
221
  ```
271
222
  b
272
223
  ```
224
+
273
225
  It looks great, right? Well, it can be even better.
274
226
 
275
- Let’s say that you are using a 2FA app (like Google Authenticator) to connect to a website, for example, GitHub. Suppose that you have a file github.yml with a field totp which is the secret that GitHub gave you when you activated the 2FA. You could execute
227
+ Let’s say you're using a 2FA app like Google Authenticator to connect to a website, for example, GitHub. Suppose you have a file called github.yml with a field called totp, which is the secret that GitHub gave you when you activated 2FA. You could execute:
228
+
276
229
  ```
277
230
  totp github.yml
278
231
  ```
279
- to generate a TOTP token for GitHub. The token will be shown and copied in the clipboard. Now, you can create an alias like this
232
+
233
+ to generate a TOTP token for GitHub. The token will be shown and copied to the clipboard. Now, you can create an alias like this:
234
+
280
235
  ```
281
236
  alias G -c "copy github.yml -f username password -d 4 2 --wait && totp github.yml"
282
237
  ```
238
+
283
239
  Can you guess what this will do?
284
240
 
285
- * It copies the username in the clipboard;
286
- * it waits 5 seconds, emits a beep and copies the password;
287
- * it waits 3 seconds, emits a beep and copies the TOTP token and keep it in the clipboard.
241
+ It copies the username to the clipboard;
242
+ It waits 5 seconds, emits a beep, and copies the password;
243
+ It waits 3 seconds, emits a beep, and copies the TOTP token, keeping it in the clipboard.
244
+ You can also use parameters in aliases and create a macro like this:
288
245
 
289
- You can also use parameters in aliases and create a macro like
290
246
  ```
291
247
  alias M -c "copy $1 -f username password -d 4 2 --wait && totp $1"
292
248
  ```
293
- and call it with
249
+
250
+ and call it with:
251
+
294
252
  ```
295
253
  M github.yml
296
254
  ```
297
- It is fantastic, isn’t it?
298
255
 
299
- _Btw, using a TOTP factor in Secrez is a bit of a contradiction, because you are converting a second factor (something that you have) in a first factor (something that you know). So, use this feature only when it makes sense._
256
+ It's fantastic, isn't it?
257
+
258
+ _Btw, using a TOTP factor in Secrez is a bit of a contradiction because you are converting a second factor (something that you have) into a first factor (something that you know). So, use this feature only when it makes sense._
300
259
 
301
260
  ## Importing from other password/secret managers
302
261
 
303
- From version 0.5.2, Secrez supports import of backups from other softwares.
262
+ Secrez supports importing backups from other software. Suppose you have exported your passwords in a CSV file named export.csv like this:
304
263
 
305
- Suppose you have exported your password in a CSV file name export.csv like this:
306
264
  ```
307
265
  Path,Username,Password,Web Site,Notes
308
266
  twitter/nick1,nick1@example.com,938eyehddu373,"http://cssasasa.com"
@@ -311,15 +269,19 @@ somePath,,s83832jedjdj,"http://262626626.com","Multi
311
269
  line
312
270
  notes"
313
271
  ```
314
- It is necessary a field named `path` because if not Secrez does not know where to put the new data. The path is supposed to be relative, allowing you to import it in your favorite folder.
315
272
 
316
- For example, to import it in the `1PasswordData` you could call
273
+ A field named path is necessary because Secrez needs to know where to place the new data. The path should be relative, allowing you to import it into your favorite folder.
274
+
275
+ To import the CSV file into the 1PasswordData folder, for example, you can run:
276
+
317
277
  ```
318
278
  import export.csv -e 1PasswordData -t
319
279
  ```
320
- The parameter `-e, --expand` is necessary. If missed, Secrez will import the file as a single file.
321
280
 
322
- Internally, Secrez converts the CSV in a JSON file like this:
281
+ The parameter -e or --expand is necessary. If it's not provided, Secrez will import the file as a single file.
282
+
283
+ Internally, Secrez converts the CSV file to a JSON file like this:
284
+
323
285
  ```
324
286
  [
325
287
  {
@@ -341,12 +303,15 @@ Internally, Secrez converts the CSV in a JSON file like this:
341
303
  }
342
304
  ]
343
305
  ```
344
- which means that you can also format your data as a JSON like that and import that directly with
306
+
307
+ This means that you can also format your data as a JSON and import it directly using:
308
+
345
309
  ```
346
310
  import export.json -e 1PasswordData
347
311
  ```
348
312
 
349
- Any item will generate a single Yaml file, like, for example, the last element in the JSON, will generate the file `/1PasswordDate/somePath.yml` with the following content:
313
+ Each item in the JSON will generate a single YAML file. For example, the last element in the JSON will generate the file /1PasswordDate/somePath.yml with the following content:
314
+
350
315
  ```
351
316
  password: s83832jedjdj
352
317
  web_site: http://262626626.com
@@ -356,41 +321,43 @@ notes: |-
356
321
  notes
357
322
  ```
358
323
 
359
- When you edit the new file, Secrez recognize it as a card and asks you which field you want to edit (if you don't explicit it with, for example, `-f password`) and edit just that field.
324
+ When you edit the new file, Secrez recognizes it as a card and asks you which field you want to edit (unless you explicitly specify it with, for example, -f password) and edits just that field.
360
325
 
361
- At the end of the process, you can remove the original backup, adding the option `-m`.
362
- You can also simulate the process to see which files will be created with the option `-s`.
326
+ At the end of the process, you can remove the original backup using the -m option. You can also simulate the process to see which files will be created using the -s option.
363
327
 
364
- If in the CSV file there is also the field `tags`, you can tag automatically any entries with the options `-t, --tags`. If you don't use the option, instead, they will be saved in the yaml file like any other field.
328
+ If the CSV file also contains a tags field, you can automatically tag any entries using the -t or --tags option. If you don't use this option, the tags will be saved in the YAML file like any other field.
365
329
 
366
330
  ### What if there is no path field?
367
331
 
368
- Let's say that you want to import a CSV file exported by LastPass. There is not `path` field but you probably want to use the fields `grouping` and `name` to build the path. From version `0.8.8`, you can do it, launching, for example:
332
+ Let's say you want to import a CSV file exported by LastPass, which doesn't have a path field. In this case, you can use other fields, such as grouping and name, to build the path instead. Starting from version 0.8.8, you can do this by running:
333
+
369
334
  ```
370
335
  import ~/Downloads/lastpass_export.csv -e lastpass -P grouping name
371
336
  ```
372
- or, if you like to put everything in the folder `lastpass` without generating any subfolder, you can just run
337
+
338
+ Or, if you want to put everything in the folder `lastpass` without generating any subfolders, you can run:
339
+
373
340
  ```
374
341
  import ~/Downloads/lastpass_export.csv -e lastpass -P name -m
375
342
  ```
376
- using only the `name` field. Still, if in the name there is any slash, a subfolder will be created. The `-m` option will remove the csv file from the OS.
377
343
 
378
- In these two examples, be sure that any of your entries in LastPass has a name. If not, the import will fail because it does't know how to call the file.
344
+ By using only the name field, any entries with a slash in the name will create a subfolder. The -m option will remove the CSV file from the operating system after importing.
379
345
 
380
- ### Best practices
346
+ In both examples, make sure that all entries in the LastPass CSV file have a name. If not, the import will fail because Secrez won't know how to name the file.
381
347
 
382
- For security reason, if would be better if you do the export from you password manager and the import into Secrez as fast as possible, removing the exported file from your OS using `-m`.
348
+ ### Best practices
383
349
 
384
- Still, it is convenient to edit the exported file to fix paths and names. Doing it after than the data is imported can require a lot more time. Think about it.
350
+ For security reasons, it is better to export from your password manager and import into Secrez as quickly as possible, removing the exported file from your OS using -m.
385
351
 
386
- ## Second factor authentication?
352
+ However, if you need to edit the exported file to fix paths and names, it is more convenient to do it before importing the data, as it can take a lot more time to do so after the data is imported.
387
353
 
388
- **It has been removed in version 0.11.0 due to potentially critical issues with Python and the required libraries on MacOS (2FA will be restored as soon as a pure Javascript library is available)**
354
+ ## FIDO2 second factor authentication?
389
355
 
356
+ It has been removed in version 0.11.0 due to potential critical issues with Python and the required libraries on MacOS (2FA may be restored if a pure Javascript library becomes available).
390
357
 
391
358
  ## (experimental) End-to-end encrypted communication with other accounts
392
359
 
393
- Starting from version 0.8.0, Secrez allows to exchange encrypted messages with other users. To do it, you must set up a local Courier ([look here for more info](https://github.com/secrez/secrez/tree/master/packages/courier)).
360
+ Starting from version 0.8.0, Secrez allows you to exchange encrypted messages with other users. To do so, you must set up a local Courier ([look here for more info](https://github.com/secrez/secrez/tree/master/packages/courier)).
394
361
 
395
362
  ## Blog posts
396
363
 
@@ -400,281 +367,362 @@ Starting from version 0.8.0, Secrez allows to exchange encrypted messages with o
400
367
 
401
368
  ## Some thoughts
402
369
 
403
- Secrez does not want to compete with password managers. So, don't expect in the future to have "form filling" and staff like that. The idea behind Secrez was born in 2017, when I was participating in many ICO and I had so many files to save and any password manager I used was very bad for that. Still, Secrez, for its nature, is file oriented and I guess will remain this way. However, it is open source, and someone is welcome to built a GUI or a mobile app built on it.
370
+ Secrez is not intended to compete with password managers, so do not expect it to have features like "form filling." The idea behind Secrez originated in 2017 when I was participating in many ICOs, and I had so many files to save, but any password manager I used was not very effective. Secrez is file-oriented and will likely remain so. However, it is open source, and someone is welcome to build a GUI or mobile app built on it.
404
371
 
405
- ## TODO
372
+ ## History
406
373
 
407
- - Good documentation
408
- - Plugin architecture to allow others to add their own commands
374
+ **1.1.3**
409
375
 
410
- ## History
376
+ - add new option `--keystore, -k` to `export`. If a file contains a private key field (i.e., a field with a name containing `private_key`), it can be exported in the keystore format. The file will have the same name with the extension replaced with `.keystore.json`.
377
+ - this README has been redacted by ChatGPT to make it more clear and concise.
378
+
379
+ **1.1.2**
380
+
381
+ - New options for `touch`:
382
+ - `--wait-for-content` to prompt the user to add the content, instead of expecting it as a parameter. The content will be trimmed at the first newline, if there is any.
383
+ - `--generate-wallet` to generate an Ethereum-compatible wallet in a new card or in an existing one. It generates the fields `private_key` and `address`, with private key and address.
384
+ - `--prefix` in combination with `--generate-wallet` specifies the prefix of the field, calling the fields, for example `my_private_key` and `my_address` if the prefix is `my`.
385
+ - `--amount` in combination with `--generate-wallet` specifies the amount of wallets to generate. The default is 1.
386
+
387
+ **1.1.1** (unpublished)
388
+
389
+ - using prettier for consistent formatting
390
+
391
+ **1.1.0**
392
+
393
+ - Remove `git`. If used carefully, the command was helpful, but still it is at risk of creating conflicts. After long thoughts, I disapproved my own proposal at: https://github.com/secrez/secrez/pull/163
394
+
395
+ **1.0.4**
396
+
397
+ - Fix wrong example in `import`
398
+
399
+ **1.0.3**
400
+
401
+ - `git` asks to quit Secrez and merge manually if there are remote changes
402
+ - `totp` allows to add a totp code to an existing yaml file using the option `--set` (see the examples)
403
+ - Default duration before clipboard reverse for `totp` is now 8 seconds
404
+
405
+ **1.0.2**
406
+
407
+ - Export and Import can encrypt/decrypt files using shared keys generated from a specified public key
408
+ - Can export ecrypted file for the user itself, files that can be decrypted only from inside the secrez account that exported them
409
+
410
+ **1.0.1**
411
+
412
+ - Export and Import can handle encryption. Files can be exported encrypted using a specified password or a key shared with contacts
413
+ - Contacts can add a contact also using contact's public key (previously you need a hub url)
414
+ - Import specifies the file that have been skipped (because binary, encrypted or both)
415
+
416
+ **1.0.0**
417
+
418
+ - Requires `@secrez/utils@1.0.1` which fixes a yaml parsing error with ETH-like addresses
411
419
 
412
- __1.1.0__
413
- * Remove `git`. If used carefully, the command was helpful, but still it is at risk of creating conflicts. After long thoughts, I disapproved my own proposal at: https://github.com/secrez/secrez/pull/163
420
+ **1.0.0-beta.3**
414
421
 
415
- __1.0.4__
416
- * Fix wrong example in `import`
422
+ - Rm allows to delete specific versions of a file
417
423
 
418
- __1.0.3__
419
- * `git` asks to quit Secrez and merge manually if there are remote changes
420
- * `totp` allows to add a totp code to an existing yaml file using the option `--set` (see the examples)
421
- * Default duration before clipboard reverse for `totp` is now 8 seconds
424
+ **1.0.0-beta.2**
422
425
 
423
- __1.0.2__
424
- * Export and Import can encrypt/decrypt files using shared keys generated from a specified public key
425
- * Can export ecrypted file for the user itself, files that can be decrypted only from inside the secrez account that exported them
426
-
427
- __1.0.1__
428
- * Export and Import can handle encryption. Files can be exported encrypted using a specified password or a key shared with contacts
429
- * Contacts can add a contact also using contact's public key (previously you need a hub url)
430
- * Import specifies the file that have been skipped (because binary, encrypted or both)
426
+ - Git has new options `--init`, `--remote-url` and `--main-branch` to initiate a repo from inside Secrez
431
427
 
432
- __1.0.0__
433
- * Requires `@secrez/utils@1.0.1` which fixes a yaml parsing error with ETH-like addresses
428
+ **1.0.0-beta.1**
434
429
 
435
- __1.0.0-beta.3__
436
- * Rm allows to delete specific versions of a file
430
+ - use @secrez/core@1.0.0, which changes the encoding from base58 to base64, making the encoding much faster
431
+ - remove second factor authentication due to potentially critical issues with Python and the required libraries on macOS (2FA will be restored as soon as either a pure Javascript library is available or using external Python libraries is reliable again)
432
+ - `Bash` has been renamed `Shell`
437
433
 
438
- __1.0.0-beta.2__
439
- * Git has new options `--init`, `--remote-url` and `--main-branch` to initiate a repo from inside Secrez
434
+ **0.10.8**
440
435
 
441
- __1.0.0-beta.1__
442
- * use @secrez/core@1.0.0, which changes the encoding from base58 to base64, making the encoding much faster
443
- * remove second factor authentication due to potentially critical issues with Python and the required libraries on macOS (2FA will be restored as soon as either a pure Javascript library is available or using external Python libraries is reliable again)
444
- * `Bash` has been renamed `Shell`
436
+ - expose a prompt mock to allow other software to run commands programmatically
437
+ - fix bug in totp when the command is called but no totp is set
445
438
 
446
- __0.10.8__
447
- * expose a prompt mock to allow other software to run commands programmatically
448
- * fix bug in totp when the command is called but no totp is set
439
+ **0.10.7**
449
440
 
450
- __0.10.7__
451
- * fix bug in `git -i` showing less changed that expected
441
+ - fix bug in `git -i` showing less changed that expected
452
442
 
453
- __0.10.6__
454
- * use `£` as an alternative to `#` when getting find results (whoops, I made this for myself, because I use both English and Italian keyboards)
455
- * add `leave` to leave a room
443
+ **0.10.6**
456
444
 
457
- __10.0.5__
458
- * fix bug in `git` wrongly returning `already up to date`
459
- * fix `git`'s help
445
+ - use `£` as an alternative to `#` when getting find results (whoops, I made this for myself, because I use both English and Italian keyboards)
446
+ - add `leave` to leave a room
460
447
 
461
- __0.10.4__
462
- * remove spaces in secret when launching `totp`
463
- * add a `--test` option, to test a secret
464
- * remove deprecated `exit`
465
-
466
- __0.10.3__
467
- * since it's not possible to clear the entire terminal, the clear screen process creates a false sense of security and has been removed
468
- * fix bug in `ls -l` when there are empty files
469
- * add message to suggest user to clear or close the terminal after quitting
448
+ **10.0.5**
470
449
 
471
- __0.10.2__
472
- * add a `git` command to push changes to the repo and pull changes
473
- * allow to run `bash` without parameters, asking later for the shell command
450
+ - fix bug in `git` wrongly returning `already up to date`
451
+ - fix `git`'s help
474
452
 
475
- __0.10.1__
476
- * encrypts binary files as is, without converting them to `base64` strings, like before
453
+ **0.10.4**
477
454
 
478
- __0.10.0__
479
- * use @secrez/hub 0.2.0 and @secrez/courier 0.2.0 (which are incompatible with the previous versions)
480
- * duplicate `whoami` and `contacts` to make them working inside the `chat` environment
455
+ - remove spaces in secret when launching `totp`
456
+ - add a `--test` option, to test a secret
457
+ - remove deprecated `exit`
481
458
 
482
- __0.9.4__
483
- * fix bug during import, if a `path` contains `:`; now, they are replaced with `_`
459
+ **0.10.3**
484
460
 
485
- __0.9.3__
486
- * fix bug with `ds -l` not working
461
+ - since it's not possible to clear the entire terminal, the clear screen process creates a false sense of security and has been removed
462
+ - fix bug in `ls -l` when there are empty files
463
+ - add message to suggest user to clear or close the terminal after quitting
487
464
 
488
- __0.9.2__
489
- * fix issue in `ls -l` that was working only in the current dataset
490
- * fix dates in `ls -l` in UTC time, instead than in local time
465
+ **0.10.2**
491
466
 
492
- __0.9.1__
493
- * `ls -l` returns details: size, creation date, last update date, number of versions and name
467
+ - add a `git` command to push changes to the repo and pull changes
468
+ - allow to run `bash` without parameters, asking later for the shell command
494
469
 
495
- __0.9.0__
496
- * Add `ds` to manage datasets
497
- * `ds` is also able to delete a dataset (moving its content to the `trash` dataset)
498
- * Remove feature `--rename` from `use`, since now `ds` manages the datasets
470
+ **0.10.1**
499
471
 
500
- __0.8.10__
501
- * If the default editor is not defined (env variable EDITOR) try to use nano or vim
472
+ - encrypts binary files as is, without converting them to `base64` strings, like before
502
473
 
503
- __0.8.9__
504
- * Pause clearScreen during editing
474
+ **0.10.0**
505
475
 
506
- __0.8.8__
507
- * Add the option `pathFrom` in `import` to build the `path` field using other fields
476
+ - use @secrez/hub 0.2.0 and @secrez/courier 0.2.0 (which are incompatible with the previous versions)
477
+ - duplicate `whoami` and `contacts` to make them working inside the `chat` environment
508
478
 
509
- __0.8.7__
510
- * Importing from a CSV file generates `.yaml` file instead of `.yml`
479
+ **0.9.4**
511
480
 
512
- __0.8.6__
513
- * Uses new onBeforeRewrite in [inquirer-command-prompt](https://github.com/sullof/inquirer-command-prompt) to remove the `#\d` when autocompleting the result of a search
481
+ - fix bug during import, if a `path` contains `:`; now, they are replaced with `_`
514
482
 
515
- __0.8.5__
516
- * Fix issue with find results when they include datasets.
517
- * Improve scripts (getting coverage only for modified packages)
518
- * Add a secrez.png as a generic asset
483
+ **0.9.3**
519
484
 
520
- __0.8.4__
521
- * fix issue if a file starts with #\d, like `#2something`
485
+ - fix bug with `ds -l` not working
522
486
 
523
- __0.8.3__
524
- * add autocomplete based on `find` results; for example `cat #2` and press `tab` will complete with the second result in the search
525
-
526
- __0.8.2__
527
- * fix bug in `show` which listed all the messages
528
-
529
- __0.8.1__
530
- * fix bug in `conf` setting a 2FA
531
- * improve encapsulation of the `_Secrez` class
532
-
533
- __0.8.0__
534
- * add `contacts` to manage trusted users, i.e, trusted public keys
535
- * add `whoami` to get info about the account
536
- * add @secrez/courier to allow communication between local accounts
537
- * add @secrez/hub for the remote hub
538
- * add @secrez/tunnel to manage the tunneling for the Courier
539
- * add `chat` to enter the chat environemnt, and send/receive messages and data to any trusted user
540
- * add `chat`'s subcommands `join`, `send` and `show`.
541
- * return `find` results as a numbered list, to be used as variable (like `$1`) in following commands
542
- * deprecate `exit` in favor of `quit` to leave rooms, chat and app
543
- * add `ssh` to connect via ssh to a remote server from inside Secrez, to protect private keys without password
487
+ **0.9.2**
544
488
 
545
- __0.7.14__
546
- * fix chained aliases generating prompt duplications
547
-
548
- __0.7.13__
549
- * fix autocomplete when single command
550
-
551
- __0.7.12__
552
- * adds support for Linux to `totp --from-clipboard`, using `xclip`
553
-
554
- __0.7.11__
555
- * returns an alert if `clipboardy` does not find the required libraries
489
+ - fix issue in `ls -l` that was working only in the current dataset
490
+ - fix dates in `ls -l` in UTC time, instead than in local time
556
491
 
557
- __0.7.10__
558
- * fixes the autocomplete loading the data only when needed
492
+ **0.9.1**
559
493
 
560
- __0.7.9__
561
- * fix bug in MainPrompt.js which caused an exit if command not found
562
-
563
- __0.7.8__
564
- * upgrade `@secrez/core` to `0.7.1` which fixes an error if `env.json` does not exists
494
+ - `ls -l` returns details: size, creation date, last update date, number of versions and name
565
495
 
566
- __0.7.7__
567
- * aliases now accept params (ex. `alias x -c 'copy $1 && ls $2 $1')
496
+ **0.9.0**
568
497
 
569
- __0.7.6__
570
- * `rm` ask confirmation before delete forever from the `trash` dataset
571
- * `edit` does not crash if no path is passed
498
+ - Add `ds` to manage datasets
499
+ - `ds` is also able to delete a dataset (moving its content to the `trash` dataset)
500
+ - Remove feature `--rename` from `use`, since now `ds` manages the datasets
572
501
 
573
- __0.7.5__
574
- * `totp` can read an image to scan a qrcode and recover its secret
575
- * on MacOs, `totp` can also read the image from the clipboard to recover its secret; it requires `pngpaste`
502
+ **0.8.10**
576
503
 
577
- __0.7.4__
578
- * fix bug in autocomplete showing the error stack
579
- * add script to upgrade the versions of any changed packages
504
+ - If the default editor is not defined (env variable EDITOR) try to use nano or vim
580
505
 
581
- __0.7.3__
582
- * `find` ignores `trash` during global searches if not using `--trash-too`
583
- * update to `@secrez/fs 0.7.2`, which fixes a bug in the `DataCache` class
506
+ **0.8.9**
584
507
 
585
- __0.7.2__
586
- * `totp` allows to generate TOTP codes (like Google Authenticator)
587
- * add option `--wait` to `copy` to force it to wait the end of the execution
588
- * `alias` handles chains of commands, like `copy coinbase.yml -f email password -d 3 2 --wait && totp coinbase.yml`
508
+ - Pause clearScreen during editing
589
509
 
590
- __0.7.1__
591
- * Calling a command with unknown options will generate an error
592
- * Fix issue moving duplicates
593
- * Adds to `mv` an explicit destination field
510
+ **0.8.8**
594
511
 
595
- __0.7.0__
596
- * Introduce a more secure derivation process, using the iterations number in the salt. During the upgrade existing second factors of authentication will be removed
597
- * Allow to change password and number of iterations in `conf`. BE CAREFUl, any change in `conf` can cause conflicts in a remote repo. Don't do the same changes parallelly
512
+ - Add the option `pathFrom` in `import` to build the `path` field using other fields
598
513
 
599
- __0.6.5__
600
- * Add `duration` to `export` to delete the exported file after the duration (in seconds)
514
+ **0.8.7**
601
515
 
602
- __0.6.4__
603
- * Add `alias` to generate alias of any command
516
+ - Importing from a CSV file generates `.yaml` file instead of `.yml`
604
517
 
605
- __0.6.3__
606
- * Minor bug fix
518
+ **0.8.6**
607
519
 
608
- __0.6.2__
609
- * `copy` can put many fields in the clipboard, scheduling them
520
+ - Uses new onBeforeRewrite in [inquirer-command-prompt](https://github.com/sullof/inquirer-command-prompt) to remove the `#\d` when autocompleting the result of a search
610
521
 
611
- __0.6.1__
612
- * Add support for U2F keys (Yubikey, Solokeys, etc.)
613
- * `ls` now returns sorted results
614
- * Fixed bug with `mv` and `rm` when using wildcards
615
- * Dynamic format for help, managing large examples
522
+ **0.8.5**
616
523
 
617
- __0.6.0__
618
- * Allow multiple datasets; `main` and `trash` exists by default
619
- * At start, purges old trees after successfully loading a dataset
620
- * `use` allows to use and create new dataset
621
- * `mv` supports `-d, --destination` for the destination
622
- * `mv` allows to move files among datasets with a syntax like `mv somefile archive:/` or `mv archive:somefile main:/some/`
623
- * `mv` adds `--find` and `--content-too` to use the result of a search as input
624
- * `mv`, if no destination set, asks if like to use the active directory in the target dataset
625
- * `ls -o d` and `ls -o f` to limit the listing only to folders or files
626
- * `copy` allows to select the field to copy in yaml files
627
- * Improve autocomplete to handle datasets
628
- * Fix autocomplete in `lcat`, which was wrongly using the internal files
629
- * `tag` is able to list and show tags along all the datasets, anche can use `--find` like `mv`
524
+ - Fix issue with find results when they include datasets.
525
+ - Improve scripts (getting coverage only for modified packages)
526
+ - Add a secrez.png as a generic asset
630
527
 
631
- __0.5.13__
632
- * Find in content excludes binary contents
528
+ **0.8.4**
633
529
 
634
- __0.5.12__
635
- * Optimize find inside contents caching the data
636
- * Fix an error returning wrong cases in the results
637
- * Remove an unnecessary message when nothing is recovered
530
+ - fix issue if a file starts with #\d, like `#2something`
638
531
 
639
- __0.5.11__
640
- * Use tags to prefix the path during import
532
+ **0.8.3**
641
533
 
642
- __0.5.10__
643
- * Fix the README that was not aligned
534
+ - add autocomplete based on `find` results; for example `cat #2` and press `tab` will complete with the second result in the search
644
535
 
645
- __0.5.9__
646
- * Add Paste to paste the clipboard content in either a new or existent file, emptying the clipboard
647
- * Fix bug with Copy that was preventing the command from working
536
+ **0.8.2**
648
537
 
649
- __0.5.8__
650
- * Allow Import, with the options `-t`, to recognize tags during the import from CSV
651
- * Split Export in Export and Copy. The first only exports to the FS, the second copies to the clipboard
538
+ - fix bug in `show` which listed all the messages
652
539
 
653
- __0.5.7__
654
- * Add wildcard support for Import, Mv, Rm and Tag
655
- * Add support for recursion during import
540
+ **0.8.1**
656
541
 
657
- __0.5.6__
658
- * Add Tag command to tag files and folders
542
+ - fix bug in `conf` setting a 2FA
543
+ - improve encapsulation of the `_Secrez` class
659
544
 
660
- __0.5.5__
661
- * Optimize Import avoiding intermediate saves of the tree
662
- * Fix an issue with iterations at launch
545
+ **0.8.0**
663
546
 
664
- __0.5.4__
665
- * Add Import of many entries from CSV and JSON files
547
+ - add `contacts` to manage trusted users, i.e, trusted public keys
548
+ - add `whoami` to get info about the account
549
+ - add @secrez/courier to allow communication between local accounts
550
+ - add @secrez/hub for the remote hub
551
+ - add @secrez/tunnel to manage the tunneling for the Courier
552
+ - add `chat` to enter the chat environemnt, and send/receive messages and data to any trusted user
553
+ - add `chat`'s subcommands `join`, `send` and `show`.
554
+ - return `find` results as a numbered list, to be used as variable (like `$1`) in following commands
555
+ - deprecate `exit` in favor of `quit` to leave rooms, chat and app
556
+ - add `ssh` to connect via ssh to a remote server from inside Secrez, to protect private keys without password
666
557
 
667
- __0.5.3__
668
- * Use Yaml files as cards, being able to read and edit single fields
558
+ **0.7.14**
669
559
 
670
- __0.5.2__
671
- * Remove obfuscation of the tree before saving (it was an overkill)
560
+ - fix chained aliases generating prompt duplications
672
561
 
673
- __0.5.1__
674
- * Add Find to search in files and folders
562
+ **0.7.13**
675
563
 
676
- __0.5.0__
677
- * First stable version
564
+ - fix autocomplete when single command
565
+
566
+ **0.7.12**
567
+
568
+ - adds support for Linux to `totp --from-clipboard`, using `xclip`
569
+
570
+ **0.7.11**
571
+
572
+ - returns an alert if `clipboardy` does not find the required libraries
573
+
574
+ **0.7.10**
575
+
576
+ - fixes the autocomplete loading the data only when needed
577
+
578
+ **0.7.9**
579
+
580
+ - fix bug in MainPrompt.js which caused an exit if command not found
581
+
582
+ **0.7.8**
583
+
584
+ - upgrade `@secrez/core` to `0.7.1` which fixes an error if `env.json` does not exists
585
+
586
+ **0.7.7**
587
+
588
+ - aliases now accept params (ex. `alias x -c 'copy $1 && ls $2 $1')
589
+
590
+ **0.7.6**
591
+
592
+ - `rm` ask confirmation before delete forever from the `trash` dataset
593
+ - `edit` does not crash if no path is passed
594
+
595
+ **0.7.5**
596
+
597
+ - `totp` can read an image to scan a qrcode and recover its secret
598
+ - on MacOs, `totp` can also read the image from the clipboard to recover its secret; it requires `pngpaste`
599
+
600
+ **0.7.4**
601
+
602
+ - fix bug in autocomplete showing the error stack
603
+ - add script to upgrade the versions of any changed packages
604
+
605
+ **0.7.3**
606
+
607
+ - `find` ignores `trash` during global searches if not using `--trash-too`
608
+ - update to `@secrez/fs 0.7.2`, which fixes a bug in the `DataCache` class
609
+
610
+ **0.7.2**
611
+
612
+ - `totp` allows to generate TOTP codes (like Google Authenticator)
613
+ - add option `--wait` to `copy` to force it to wait the end of the execution
614
+ - `alias` handles chains of commands, like `copy coinbase.yml -f email password -d 3 2 --wait && totp coinbase.yml`
615
+
616
+ **0.7.1**
617
+
618
+ - Calling a command with unknown options will generate an error
619
+ - Fix issue moving duplicates
620
+ - Adds to `mv` an explicit destination field
621
+
622
+ **0.7.0**
623
+
624
+ - Introduce a more secure derivation process, using the iterations number in the salt. During the upgrade existing second factors of authentication will be removed
625
+ - Allow to change password and number of iterations in `conf`. BE CAREFUl, any change in `conf` can cause conflicts in a remote repo. Don't do the same changes parallelly
626
+
627
+ **0.6.5**
628
+
629
+ - Add `duration` to `export` to delete the exported file after the duration (in seconds)
630
+
631
+ **0.6.4**
632
+
633
+ - Add `alias` to generate alias of any command
634
+
635
+ **0.6.3**
636
+
637
+ - Minor bug fix
638
+
639
+ **0.6.2**
640
+
641
+ - `copy` can put many fields in the clipboard, scheduling them
642
+
643
+ **0.6.1**
644
+
645
+ - Add support for U2F keys (Yubikey, Solokeys, etc.)
646
+ - `ls` now returns sorted results
647
+ - Fixed bug with `mv` and `rm` when using wildcards
648
+ - Dynamic format for help, managing large examples
649
+
650
+ **0.6.0**
651
+
652
+ - Allow multiple datasets; `main` and `trash` exists by default
653
+ - At start, purges old trees after successfully loading a dataset
654
+ - `use` allows to use and create new dataset
655
+ - `mv` supports `-d, --destination` for the destination
656
+ - `mv` allows to move files among datasets with a syntax like `mv somefile archive:/` or `mv archive:somefile main:/some/`
657
+ - `mv` adds `--find` and `--content-too` to use the result of a search as input
658
+ - `mv`, if no destination set, asks if like to use the active directory in the target dataset
659
+ - `ls -o d` and `ls -o f` to limit the listing only to folders or files
660
+ - `copy` allows to select the field to copy in yaml files
661
+ - Improve autocomplete to handle datasets
662
+ - Fix autocomplete in `lcat`, which was wrongly using the internal files
663
+ - `tag` is able to list and show tags along all the datasets, anche can use `--find` like `mv`
664
+
665
+ **0.5.13**
666
+
667
+ - Find in content excludes binary contents
668
+
669
+ **0.5.12**
670
+
671
+ - Optimize find inside contents caching the data
672
+ - Fix an error returning wrong cases in the results
673
+ - Remove an unnecessary message when nothing is recovered
674
+
675
+ **0.5.11**
676
+
677
+ - Use tags to prefix the path during import
678
+
679
+ **0.5.10**
680
+
681
+ - Fix the README that was not aligned
682
+
683
+ **0.5.9**
684
+
685
+ - Add Paste to paste the clipboard content in either a new or existent file, emptying the clipboard
686
+ - Fix bug with Copy that was preventing the command from working
687
+
688
+ **0.5.8**
689
+
690
+ - Allow Import, with the options `-t`, to recognize tags during the import from CSV
691
+ - Split Export in Export and Copy. The first only exports to the FS, the second copies to the clipboard
692
+
693
+ **0.5.7**
694
+
695
+ - Add wildcard support for Import, Mv, Rm and Tag
696
+ - Add support for recursion during import
697
+
698
+ **0.5.6**
699
+
700
+ - Add Tag command to tag files and folders
701
+
702
+ **0.5.5**
703
+
704
+ - Optimize Import avoiding intermediate saves of the tree
705
+ - Fix an issue with iterations at launch
706
+
707
+ **0.5.4**
708
+
709
+ - Add Import of many entries from CSV and JSON files
710
+
711
+ **0.5.3**
712
+
713
+ - Use Yaml files as cards, being able to read and edit single fields
714
+
715
+ **0.5.2**
716
+
717
+ - Remove obfuscation of the tree before saving (it was an overkill)
718
+
719
+ **0.5.1**
720
+
721
+ - Add Find to search in files and folders
722
+
723
+ **0.5.0**
724
+
725
+ - First stable version
678
726
 
679
727
  Versions < 0.5.0 are deprecated because the format was sligtly different and they are incompatible.
680
728
 
@@ -701,145 +749,157 @@ npm i -g pnpm
701
749
  ```
702
750
 
703
751
  #### Bootstrap the monorepo
752
+
704
753
  ```
705
754
  npm run reset
706
755
  ```
756
+
707
757
  #### Install OS requirements
708
- To complete the tests, you must install some tool, depending on you operating system.
709
758
 
710
- The `copy` command does not work on Linux is `xsel` is not installed. So, if you, for example, are working on Ubuntu, install it with
759
+ To complete the tests, you must install some tools depending on your operating system.
760
+
761
+ The `copy` command does not work on Linux if `xsel` is not installed. So, if you are working on Ubuntu, install it with:
762
+
711
763
  ```
712
764
  sudo apt install xsel
713
765
  ```
714
- The `totp` command requires, on MacOS, `pngpaste`. You can install it with
766
+
767
+ The `totp` command requires `pngpaste` on macOS. You can install it with:
768
+
715
769
  ```
716
770
  brew install pngpaste
717
771
  ```
718
- The `conf` command, requires `Python-fido2`. If you don't have Python, install it. After you can install `fido2` running:
719
- ```
720
- pip install fido2
721
- ```
722
- Notice that during the execution of Secrez, an error is generated if those tools have not been found. But, nothing happens, during testing. So, please, install them.
772
+
773
+ Please note that during the execution of Secrez, an error is generated if those tools have not been found. Please make sure to install them.
723
774
 
724
775
  #### Testing
725
- Run
776
+
777
+ To run all the tests, navigate to the root directory of the project and run:
778
+
726
779
  ```
727
780
  npm run test
728
781
  ```
729
- This depends where you run it. If you run from the root it executes all the tests, if you run from inside a package, it runs only its specific tests.
730
- You can also run
782
+
783
+ If you are inside a package directory, running this command will only execute the package-specific tests. You can also skip coverage by running:
784
+
731
785
  ```
732
786
  npm run test-only
733
787
  ```
734
- to skip the coverage. This is very helpful during the development.
788
+
789
+ This is useful during development.
735
790
 
736
791
  #### Debugging
737
792
 
738
- To see if it works, you can execute your version of Secrez running, from inside `packages/secrez`
793
+ To see if Secrez works properly, you can execute your version of Secrez by running the following command from inside the `packages/secrez` directory:
794
+
739
795
  ```
740
796
  npm run dev
741
797
  ```
742
- and create a dev account for you playing.
798
+
799
+ You will create a dev account to play with it.
743
800
 
744
801
  #### Pull Requests
745
802
 
746
- To prepare the code for a PR, you should realign the versions. You can do this, from the root, calling
803
+ Before submitting a pull request, you should realign the versions. You can do this by running the following command from the root directory:
804
+
747
805
  ```
748
806
  npm run patch-versions
749
807
  ```
750
- Then, you can prepare the README inserting the coverage. To do it, run
808
+
809
+ Then, you can prepare the README file by inserting the coverage. To do this, run:
810
+
751
811
  ```
752
812
  npm run pre-push
753
813
  ```
754
- Finally, you can push to GitHub.
755
814
 
756
- Thanks a lot for any contribution 😉
815
+ Finally, you can push to GitHub.
757
816
 
817
+ Thank you for any contributions! 😉
758
818
 
759
819
  ## Test coverage
760
820
 
761
821
  ```
762
- 162 passing (28s)
822
+ 166 passing (25s)
763
823
  1 pending
764
824
 
765
825
  -----------------------|---------|----------|---------|---------|-----------------------------------
766
826
  File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
767
827
  -----------------------|---------|----------|---------|---------|-----------------------------------
768
- All files | 71.33 | 58.19 | 71.98 | 71.28 |
769
- src | 59.63 | 54.79 | 55 | 61.32 |
770
- Command.js | 79.66 | 78.72 | 76.92 | 83.93 | 35,54-59,68,71,95
771
- PreCommand.js | 21.95 | 11.54 | 14.29 | 21.95 | 9-95,108
828
+ All files | 71.47 | 58.49 | 71.98 | 71.36 |
829
+ src | 59.63 | 54.79 | 55 | 60.19 |
830
+ Command.js | 79.66 | 78.72 | 76.92 | 81.03 | 32,55-62,73,80,119
831
+ PreCommand.js | 21.95 | 11.54 | 14.29 | 21.95 | 8-98,115
772
832
  cliConfig.js | 100 | 100 | 100 | 100 |
773
- src/commands | 81.58 | 66.85 | 89.95 | 81.4 |
774
- Alias.js | 90.54 | 77.36 | 100 | 90.41 | 85,96,118,145,149,154,164
775
- Bash.js | 75 | 0 | 66.67 | 75 | 20-21
776
- Cat.js | 98.9 | 88.89 | 100 | 98.9 | 144
777
- Cd.js | 96.43 | 86.67 | 100 | 96.43 | 45
778
- Chat.js | 19.51 | 0 | 16.67 | 19.51 | 24-130
779
- Conf.js | 10.45 | 0 | 25 | 10.45 | 132-473
780
- Contacts.js | 74.67 | 65.98 | 92.86 | 74.5 | ...75-197,221,226,238,294,307,317
781
- Copy.js | 94.87 | 74.51 | 100 | 94.81 | 96,141,158,183
782
- Courier.js | 63.54 | 41.86 | 85.71 | 63.83 | ...24,139-156,168,180-183,195-201
783
- Ds.js | 92.54 | 82.05 | 100 | 92.42 | 94,103-108,120
784
- Edit.js | 13.58 | 0 | 40 | 13.58 | 78-193
785
- Export.js | 90.91 | 68 | 100 | 90.91 | 109,114-115,120,130,137,140
786
- Find.js | 93.59 | 86.67 | 100 | 93.42 | 90,153,192-196,202
787
- Help.js | 100 | 80 | 100 | 100 | 30
788
- Import.js | 93.2 | 85.48 | 100 | 93.1 | ...06,308,321,327,369,384-390,417
789
- Lcat.js | 100 | 85.71 | 100 | 100 | 55
790
- Lcd.js | 95.65 | 81.82 | 100 | 95.65 | 49
791
- Lls.js | 95.45 | 72.73 | 100 | 95.45 | 91
792
- Lpwd.js | 92.31 | 100 | 100 | 92.31 | 38
793
- Ls.js | 91.3 | 75 | 100 | 90.77 | 99,110-112,126,169
794
- Mkdir.js | 100 | 66.67 | 100 | 100 | 39-45
795
- Mv.js | 91.01 | 77.36 | 100 | 90.8 | 114,137,148-154
796
- Paste.js | 87.23 | 75 | 100 | 87.23 | 66,72,75,83,107,124
797
- Pwd.js | 92.31 | 100 | 100 | 92.31 | 36
798
- Quit.js | 90 | 50 | 100 | 90 | 29
799
- Rm.js | 94 | 80.95 | 100 | 93.88 | 61,116,124
800
- Shell.js | 88.24 | 60 | 100 | 88.24 | 39,54
801
- Ssh.js | 25 | 0 | 40 | 25 | 64-104
802
- Tag.js | 98.04 | 92.31 | 100 | 97.94 | 123,164
803
- Totp.js | 96.47 | 74.47 | 100 | 96.47 | 164-165,209
804
- Touch.js | 100 | 71.43 | 100 | 100 | 57,68
805
- Use.js | 96.77 | 89.47 | 100 | 96.77 | 65
806
- Ver.js | 90 | 66.67 | 100 | 90 | 27
807
- Whoami.js | 93.1 | 63.64 | 80 | 93.1 | 32,65
808
- chat.js | 85.37 | 53.85 | 100 | 85.37 | 94,103-116,122,128
809
- index.js | 91.67 | 60 | 100 | 91.3 | 23,32
833
+ src/commands | 81.53 | 67 | 89.95 | 81.4 |
834
+ Alias.js | 90.54 | 77.36 | 100 | 90.41 | 101,112,139,169,173,180,190
835
+ Bash.js | 75 | 0 | 66.67 | 75 | 18-19
836
+ Cat.js | 98.9 | 88.89 | 100 | 98.9 | 152
837
+ Cd.js | 96.43 | 86.67 | 100 | 96.43 | 44
838
+ Chat.js | 19.51 | 0 | 16.67 | 19.51 | 23-144
839
+ Conf.js | 10.45 | 0 | 25 | 10.45 | 134-499
840
+ Contacts.js | 74.67 | 65.98 | 92.86 | 74.5 | ...90-214,240,247,259,315,328,338
841
+ Copy.js | 94.87 | 74.51 | 100 | 94.81 | 111,162,179,204
842
+ Courier.js | 63.54 | 41.86 | 85.71 | 63.83 | ...37,152-171,188,200-203,215-221
843
+ Ds.js | 92.54 | 82.05 | 100 | 92.42 | 99,108-113,125
844
+ Edit.js | 13.58 | 0 | 40 | 13.58 | 88-214
845
+ Export.js | 87.63 | 67.74 | 100 | 87.63 | ...66,175,182-186,191,203,212,215
846
+ Find.js | 93.59 | 86.67 | 100 | 93.42 | 101,164,200-203,209
847
+ Help.js | 100 | 80 | 100 | 100 | 29
848
+ Import.js | 93.2 | 85.48 | 100 | 93.14 | ...65,367,387,393,441,456-463,490
849
+ Lcat.js | 100 | 85.71 | 100 | 100 | 54
850
+ Lcd.js | 95.65 | 81.82 | 100 | 95.65 | 50
851
+ Lls.js | 95.45 | 72.73 | 100 | 95.45 | 97
852
+ Lpwd.js | 92.31 | 100 | 100 | 92.31 | 36
853
+ Ls.js | 91.3 | 75 | 100 | 90.77 | 103,114-116,130,181
854
+ Mkdir.js | 100 | 66.67 | 100 | 100 | 38-44
855
+ Mv.js | 88.04 | 73.21 | 100 | 87.78 | 93-99,133,155,165-172
856
+ Paste.js | 87.23 | 75 | 100 | 87.23 | 72,78,81,89,113,129
857
+ Pwd.js | 92.31 | 100 | 100 | 92.31 | 33
858
+ Quit.js | 90 | 50 | 100 | 90 | 27
859
+ Rm.js | 94 | 80.95 | 100 | 93.88 | 63,126,134
860
+ Shell.js | 88.24 | 60 | 100 | 88.24 | 38,55
861
+ Ssh.js | 25 | 0 | 40 | 25 | 72-120
862
+ Tag.js | 98.04 | 92.31 | 100 | 98.02 | 122,171
863
+ Totp.js | 96.47 | 74.47 | 100 | 96.47 | 188-189,235
864
+ Touch.js | 95.92 | 81.48 | 100 | 95.83 | 152,202
865
+ Use.js | 96.77 | 89.47 | 100 | 96.77 | 68
866
+ Ver.js | 90 | 66.67 | 100 | 90 | 25
867
+ Whoami.js | 93.1 | 63.64 | 80 | 93.1 | 29,64
868
+ chat.js | 85.37 | 53.85 | 100 | 85.37 | 105,117-130,136,142
869
+ index.js | 91.67 | 60 | 100 | 91.3 | 22,31
810
870
  src/commands/chat | 79.44 | 63.29 | 92.31 | 79.33 |
811
- Contacts.js | 80 | 42.86 | 80 | 80 | 56,65,69,82
812
- Help.js | 86.67 | 60 | 100 | 86.67 | 38-39
813
- Join.js | 95.65 | 82.61 | 100 | 95.56 | 41,104
814
- Leave.js | 100 | 60 | 100 | 100 | 28,32
815
- Quit.js | 100 | 75 | 100 | 100 | 27
816
- Send.js | 67.65 | 46.67 | 100 | 67.65 | 40,44,47,74,83-92
817
- Show.js | 68.75 | 70.59 | 100 | 68.75 | 63-67,76,91-97
818
- Whoami.js | 42.86 | 0 | 60 | 42.86 | 24,32-41
819
- src/prompts | 15.14 | 0 | 14.29 | 15.36 |
820
- ChatPrompt.js | 6.17 | 0 | 0 | 6.17 | 9-155
871
+ Contacts.js | 80 | 42.86 | 80 | 80 | 54,65,69,81
872
+ Help.js | 86.67 | 60 | 100 | 86.67 | 37-38
873
+ Join.js | 95.65 | 82.61 | 100 | 95.56 | 43,110
874
+ Leave.js | 100 | 60 | 100 | 100 | 24,28
875
+ Quit.js | 100 | 75 | 100 | 100 | 24
876
+ Send.js | 67.65 | 46.67 | 100 | 67.65 | 37,41,44,77,86-95
877
+ Show.js | 68.75 | 70.59 | 100 | 68.75 | 74-78,87,102-108
878
+ Whoami.js | 42.86 | 0 | 60 | 42.86 | 22,30-39
879
+ src/prompts | 15.14 | 0 | 14.29 | 15.27 |
880
+ ChatPrompt.js | 6.17 | 0 | 0 | 6.17 | 8-163
821
881
  ChatPromptMock.js | 100 | 100 | 66.67 | 100 |
822
- CommandPrompt.js | 10.42 | 0 | 0 | 10.56 | 25-286
823
- Completion.js | 4.41 | 0 | 0 | 4.62 | 7-107
882
+ CommandPrompt.js | 10.42 | 0 | 0 | 10.56 | 24-296
883
+ Completion.js | 4.41 | 0 | 0 | 4.48 | 6-103
824
884
  MainPromptMock.js | 100 | 100 | 66.67 | 100 |
825
- MultiEditorPrompt.js | 25 | 0 | 0 | 25 | 8-35
826
- SigintManager.js | 25 | 0 | 20 | 25 | 11-37
885
+ MultiEditorPrompt.js | 25 | 0 | 0 | 25 | 7-36
886
+ SigintManager.js | 25 | 0 | 20 | 25 | 10-36
827
887
  src/utils | 69.92 | 63.28 | 56.25 | 69.55 |
828
- AliasManager.js | 100 | 91.67 | 100 | 100 | 48
829
- ContactManager.js | 71.43 | 60 | 85.71 | 71.43 | 13,36-38
830
- Fido2Client.js | 15.38 | 0 | 11.11 | 15.38 | 15-101
831
- HelpProto.js | 91.6 | 84.06 | 100 | 91.45 | 44,137-138,155-160,179
832
- Logger.js | 63.64 | 56.25 | 36.84 | 62.79 | ...38-50,58,66-70,75,85,89,94,107
888
+ AliasManager.js | 100 | 91.67 | 100 | 100 | 47
889
+ ContactManager.js | 71.43 | 60 | 85.71 | 71.43 | 12,35-37
890
+ Fido2Client.js | 15.38 | 0 | 11.11 | 15.38 | 14-108
891
+ HelpProto.js | 91.6 | 84.06 | 100 | 91.45 | 49,153-154,171-176,195
892
+ Logger.js | 63.64 | 56.25 | 36.84 | 62.79 | ...37-49,57,65-69,74,84,88,93,105
833
893
  -----------------------|---------|----------|---------|---------|-----------------------------------
834
894
 
835
895
  ```
836
896
 
837
-
838
897
  ## Copyright
839
898
 
840
899
  Secrez has been created by [Francesco Sullo](https://francesco.sullo.co) (<francesco@sullo.co>). Any opinion, help, suggestion, critic is very welcome.
841
900
 
842
901
  ## Licence
902
+
843
903
  ```
844
904
  MIT License
845
905
 
@@ -863,4 +923,3 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
863
923
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
864
924
  SOFTWARE.
865
925
  ```
866
-