Deployed 05a21ba2ec99 to 0.x with MkDocs 1.6.1 and mike 2.1.3
Marco Ricci

Marco Ricci commited on 2025-01-07 15:51:52
Zeige 26 geänderte Dateien mit 8479 Einfügungen und 434 Löschungen.

... ...
@@ -161,6 +161,26 @@
161 161
   
162 162
   
163 163
   
164
+    
165
+    
166
+      <li class="md-tabs__item">
167
+        <a href="/derivepassphrase/0.x/explanation/" class="md-tabs__link">
168
+          
169
+  
170
+    
171
+  
172
+  Design & Background
173
+
174
+        </a>
175
+      </li>
176
+    
177
+  
178
+
179
+      
180
+        
181
+  
182
+  
183
+  
164 184
     <li class="md-tabs__item">
165 185
       <a href="/derivepassphrase/0.x/changelog/" class="md-tabs__link">
166 186
         
... ...
@@ -889,6 +909,92 @@
889 909
   
890 910
   
891 911
   
912
+    
913
+    
914
+      
915
+        
916
+          
917
+        
918
+      
919
+        
920
+      
921
+    
922
+    
923
+      
924
+      
925
+        
926
+      
927
+    
928
+    
929
+    <li class="md-nav__item md-nav__item--nested">
930
+      
931
+        
932
+        
933
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
934
+        
935
+          
936
+          
937
+          <div class="md-nav__link md-nav__container">
938
+            <a href="/derivepassphrase/0.x/explanation/" class="md-nav__link ">
939
+              
940
+  
941
+  <span class="md-ellipsis">
942
+    Design & Background
943
+  </span>
944
+  
945
+
946
+            </a>
947
+            
948
+              
949
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
950
+                <span class="md-nav__icon md-icon"></span>
951
+              </label>
952
+            
953
+          </div>
954
+        
955
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
956
+          <label class="md-nav__title" for="__nav_5">
957
+            <span class="md-nav__icon md-icon"></span>
958
+            Design & Background
959
+          </label>
960
+          <ul class="md-nav__list" data-md-scrollfix>
961
+            
962
+              
963
+            
964
+              
965
+                
966
+  
967
+  
968
+  
969
+  
970
+    <li class="md-nav__item">
971
+      <a href="/derivepassphrase/0.x/explanation/faq-altered-versions/" class="md-nav__link">
972
+        
973
+  
974
+  <span class="md-ellipsis">
975
+    "altered versions" license requirement
976
+  </span>
977
+  
978
+
979
+      </a>
980
+    </li>
981
+  
982
+
983
+              
984
+            
985
+          </ul>
986
+        </nav>
987
+      
988
+    </li>
989
+  
990
+
991
+    
992
+      
993
+      
994
+  
995
+  
996
+  
997
+  
892 998
     <li class="md-nav__item">
893 999
       <a href="/derivepassphrase/0.x/changelog/" class="md-nav__link">
894 1000
         
... ...
@@ -950,7 +1056,7 @@
950 1056
       <div class="md-copyright">
951 1057
   
952 1058
     <div class="md-copyright__highlight">
953
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
1059
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
954 1060
     </div>
955 1061
   
956 1062
   
... ...
@@ -168,6 +168,26 @@
168 168
   
169 169
   
170 170
   
171
+    
172
+    
173
+      <li class="md-tabs__item">
174
+        <a href="../explanation/" class="md-tabs__link">
175
+          
176
+  
177
+    
178
+  
179
+  Design & Background
180
+
181
+        </a>
182
+      </li>
183
+    
184
+  
185
+
186
+      
187
+        
188
+  
189
+  
190
+  
171 191
     <li class="md-tabs__item">
172 192
       <a href="../changelog/" class="md-tabs__link">
173 193
         
... ...
@@ -896,6 +916,92 @@
896 916
   
897 917
   
898 918
   
919
+    
920
+    
921
+      
922
+        
923
+          
924
+        
925
+      
926
+        
927
+      
928
+    
929
+    
930
+      
931
+      
932
+        
933
+      
934
+    
935
+    
936
+    <li class="md-nav__item md-nav__item--nested">
937
+      
938
+        
939
+        
940
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
941
+        
942
+          
943
+          
944
+          <div class="md-nav__link md-nav__container">
945
+            <a href="../explanation/" class="md-nav__link ">
946
+              
947
+  
948
+  <span class="md-ellipsis">
949
+    Design & Background
950
+  </span>
951
+  
952
+
953
+            </a>
954
+            
955
+              
956
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
957
+                <span class="md-nav__icon md-icon"></span>
958
+              </label>
959
+            
960
+          </div>
961
+        
962
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
963
+          <label class="md-nav__title" for="__nav_5">
964
+            <span class="md-nav__icon md-icon"></span>
965
+            Design & Background
966
+          </label>
967
+          <ul class="md-nav__list" data-md-scrollfix>
968
+            
969
+              
970
+            
971
+              
972
+                
973
+  
974
+  
975
+  
976
+  
977
+    <li class="md-nav__item">
978
+      <a href="../explanation/faq-altered-versions/" class="md-nav__link">
979
+        
980
+  
981
+  <span class="md-ellipsis">
982
+    "altered versions" license requirement
983
+  </span>
984
+  
985
+
986
+      </a>
987
+    </li>
988
+  
989
+
990
+              
991
+            
992
+          </ul>
993
+        </nav>
994
+      
995
+    </li>
996
+  
997
+
998
+    
999
+      
1000
+      
1001
+  
1002
+  
1003
+  
1004
+  
899 1005
     <li class="md-nav__item">
900 1006
       <a href="../changelog/" class="md-nav__link">
901 1007
         
... ...
@@ -1140,7 +1246,7 @@
1140 1246
       <div class="md-copyright">
1141 1247
   
1142 1248
     <div class="md-copyright__highlight">
1143
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
1249
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1144 1250
     </div>
1145 1251
   
1146 1252
   
... ...
@@ -15,7 +15,7 @@
15 15
         <link rel="canonical" href="https://the13thletter.info/derivepassphrase/0.x/changelog/">
16 16
       
17 17
       
18
-        <link rel="prev" href="../reference/prerequisites-ssh-key/">
18
+        <link rel="prev" href="../explanation/faq-altered-versions/">
19 19
       
20 20
       
21 21
       
... ...
@@ -172,6 +172,26 @@
172 172
   
173 173
     
174 174
     
175
+      <li class="md-tabs__item">
176
+        <a href="../explanation/" class="md-tabs__link">
177
+          
178
+  
179
+    
180
+  
181
+  Design & Background
182
+
183
+        </a>
184
+      </li>
185
+    
186
+  
187
+
188
+      
189
+        
190
+  
191
+  
192
+    
193
+  
194
+  
175 195
     <li class="md-tabs__item md-tabs__item--active">
176 196
       <a href="./" class="md-tabs__link">
177 197
         
... ...
@@ -902,6 +922,92 @@
902 922
   
903 923
     
904 924
     
925
+      
926
+        
927
+          
928
+        
929
+      
930
+        
931
+      
932
+    
933
+    
934
+      
935
+      
936
+        
937
+      
938
+    
939
+    
940
+    <li class="md-nav__item md-nav__item--nested">
941
+      
942
+        
943
+        
944
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
945
+        
946
+          
947
+          
948
+          <div class="md-nav__link md-nav__container">
949
+            <a href="../explanation/" class="md-nav__link ">
950
+              
951
+  
952
+  <span class="md-ellipsis">
953
+    Design & Background
954
+  </span>
955
+  
956
+
957
+            </a>
958
+            
959
+              
960
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
961
+                <span class="md-nav__icon md-icon"></span>
962
+              </label>
963
+            
964
+          </div>
965
+        
966
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
967
+          <label class="md-nav__title" for="__nav_5">
968
+            <span class="md-nav__icon md-icon"></span>
969
+            Design & Background
970
+          </label>
971
+          <ul class="md-nav__list" data-md-scrollfix>
972
+            
973
+              
974
+            
975
+              
976
+                
977
+  
978
+  
979
+  
980
+  
981
+    <li class="md-nav__item">
982
+      <a href="../explanation/faq-altered-versions/" class="md-nav__link">
983
+        
984
+  
985
+  <span class="md-ellipsis">
986
+    "altered versions" license requirement
987
+  </span>
988
+  
989
+
990
+      </a>
991
+    </li>
992
+  
993
+
994
+              
995
+            
996
+          </ul>
997
+        </nav>
998
+      
999
+    </li>
1000
+  
1001
+
1002
+    
1003
+      
1004
+      
1005
+  
1006
+  
1007
+    
1008
+  
1009
+  
1010
+  
905 1011
     <li class="md-nav__item md-nav__item--active">
906 1012
       
907 1013
       <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
... ...
@@ -946,6 +1052,39 @@
946 1052
     </label>
947 1053
     <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
948 1054
       
1055
+        <li class="md-nav__item">
1056
+  <a href="#040-2025-01-07" class="md-nav__link">
1057
+    <span class="md-ellipsis">
1058
+      0.4.0 (2025-01-07)
1059
+    </span>
1060
+  </a>
1061
+  
1062
+    <nav class="md-nav" aria-label="0.4.0 (2025-01-07)">
1063
+      <ul class="md-nav__list">
1064
+        
1065
+          <li class="md-nav__item">
1066
+  <a href="#added" class="md-nav__link">
1067
+    <span class="md-ellipsis">
1068
+      Added
1069
+    </span>
1070
+  </a>
1071
+  
1072
+</li>
1073
+        
1074
+          <li class="md-nav__item">
1075
+  <a href="#changed" class="md-nav__link">
1076
+    <span class="md-ellipsis">
1077
+      Changed
1078
+    </span>
1079
+  </a>
1080
+  
1081
+</li>
1082
+        
1083
+      </ul>
1084
+    </nav>
1085
+  
1086
+</li>
1087
+      
949 1088
         <li class="md-nav__item">
950 1089
   <a href="#033-2024-11-28" class="md-nav__link">
951 1090
     <span class="md-ellipsis">
... ...
@@ -957,7 +1096,7 @@
957 1096
       <ul class="md-nav__list">
958 1097
         
959 1098
           <li class="md-nav__item">
960
-  <a href="#added" class="md-nav__link">
1099
+  <a href="#added_1" class="md-nav__link">
961 1100
     <span class="md-ellipsis">
962 1101
       Added
963 1102
     </span>
... ...
@@ -1038,7 +1177,7 @@
1038 1177
       <ul class="md-nav__list">
1039 1178
         
1040 1179
           <li class="md-nav__item">
1041
-  <a href="#added_1" class="md-nav__link">
1180
+  <a href="#added_2" class="md-nav__link">
1042 1181
     <span class="md-ellipsis">
1043 1182
       Added
1044 1183
     </span>
... ...
@@ -1047,7 +1186,7 @@
1047 1186
 </li>
1048 1187
         
1049 1188
           <li class="md-nav__item">
1050
-  <a href="#changed" class="md-nav__link">
1189
+  <a href="#changed_1" class="md-nav__link">
1051 1190
     <span class="md-ellipsis">
1052 1191
       Changed
1053 1192
     </span>
... ...
@@ -1080,7 +1219,7 @@
1080 1219
       <ul class="md-nav__list">
1081 1220
         
1082 1221
           <li class="md-nav__item">
1083
-  <a href="#added_2" class="md-nav__link">
1222
+  <a href="#added_3" class="md-nav__link">
1084 1223
     <span class="md-ellipsis">
1085 1224
       Added
1086 1225
     </span>
... ...
@@ -1098,7 +1237,7 @@
1098 1237
 </li>
1099 1238
         
1100 1239
           <li class="md-nav__item">
1101
-  <a href="#changed_1" class="md-nav__link">
1240
+  <a href="#changed_2" class="md-nav__link">
1102 1241
     <span class="md-ellipsis">
1103 1242
       Changed
1104 1243
     </span>
... ...
@@ -1203,7 +1342,7 @@
1203 1342
       <ul class="md-nav__list">
1204 1343
         
1205 1344
           <li class="md-nav__item">
1206
-  <a href="#added_3" class="md-nav__link">
1345
+  <a href="#added_4" class="md-nav__link">
1207 1346
     <span class="md-ellipsis">
1208 1347
       Added
1209 1348
     </span>
... ...
@@ -1250,6 +1389,39 @@
1250 1389
     </label>
1251 1390
     <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1252 1391
       
1392
+        <li class="md-nav__item">
1393
+  <a href="#040-2025-01-07" class="md-nav__link">
1394
+    <span class="md-ellipsis">
1395
+      0.4.0 (2025-01-07)
1396
+    </span>
1397
+  </a>
1398
+  
1399
+    <nav class="md-nav" aria-label="0.4.0 (2025-01-07)">
1400
+      <ul class="md-nav__list">
1401
+        
1402
+          <li class="md-nav__item">
1403
+  <a href="#added" class="md-nav__link">
1404
+    <span class="md-ellipsis">
1405
+      Added
1406
+    </span>
1407
+  </a>
1408
+  
1409
+</li>
1410
+        
1411
+          <li class="md-nav__item">
1412
+  <a href="#changed" class="md-nav__link">
1413
+    <span class="md-ellipsis">
1414
+      Changed
1415
+    </span>
1416
+  </a>
1417
+  
1418
+</li>
1419
+        
1420
+      </ul>
1421
+    </nav>
1422
+  
1423
+</li>
1424
+      
1253 1425
         <li class="md-nav__item">
1254 1426
   <a href="#033-2024-11-28" class="md-nav__link">
1255 1427
     <span class="md-ellipsis">
... ...
@@ -1261,7 +1433,7 @@
1261 1433
       <ul class="md-nav__list">
1262 1434
         
1263 1435
           <li class="md-nav__item">
1264
-  <a href="#added" class="md-nav__link">
1436
+  <a href="#added_1" class="md-nav__link">
1265 1437
     <span class="md-ellipsis">
1266 1438
       Added
1267 1439
     </span>
... ...
@@ -1342,7 +1514,7 @@
1342 1514
       <ul class="md-nav__list">
1343 1515
         
1344 1516
           <li class="md-nav__item">
1345
-  <a href="#added_1" class="md-nav__link">
1517
+  <a href="#added_2" class="md-nav__link">
1346 1518
     <span class="md-ellipsis">
1347 1519
       Added
1348 1520
     </span>
... ...
@@ -1351,7 +1523,7 @@
1351 1523
 </li>
1352 1524
         
1353 1525
           <li class="md-nav__item">
1354
-  <a href="#changed" class="md-nav__link">
1526
+  <a href="#changed_1" class="md-nav__link">
1355 1527
     <span class="md-ellipsis">
1356 1528
       Changed
1357 1529
     </span>
... ...
@@ -1384,7 +1556,7 @@
1384 1556
       <ul class="md-nav__list">
1385 1557
         
1386 1558
           <li class="md-nav__item">
1387
-  <a href="#added_2" class="md-nav__link">
1559
+  <a href="#added_3" class="md-nav__link">
1388 1560
     <span class="md-ellipsis">
1389 1561
       Added
1390 1562
     </span>
... ...
@@ -1402,7 +1574,7 @@
1402 1574
 </li>
1403 1575
         
1404 1576
           <li class="md-nav__item">
1405
-  <a href="#changed_1" class="md-nav__link">
1577
+  <a href="#changed_2" class="md-nav__link">
1406 1578
     <span class="md-ellipsis">
1407 1579
       Changed
1408 1580
     </span>
... ...
@@ -1507,7 +1679,7 @@
1507 1679
       <ul class="md-nav__list">
1508 1680
         
1509 1681
           <li class="md-nav__item">
1510
-  <a href="#added_3" class="md-nav__link">
1682
+  <a href="#added_4" class="md-nav__link">
1511 1683
     <span class="md-ellipsis">
1512 1684
       Added
1513 1685
     </span>
... ...
@@ -1570,9 +1742,92 @@ effectively constitute a new <q>major</q> release.)
1570 1742
 </aside>
1571 1743
 <!-- scriv changelog start -->
1572 1744
 
1573
-<h2 id="033-2024-11-28">0.3.3 (2024-11-28)<a class="headerlink" href="#033-2024-11-28" title="Permanent link">&para;</a></h2>
1745
+<h2 id="040-2025-01-07">0.4.0 (2025-01-07)<a class="headerlink" href="#040-2025-01-07" title="Permanent link">&para;</a></h2>
1574 1746
 <h3 id="added">Added<a class="headerlink" href="#added" title="Permanent link">&para;</a></h3>
1575 1747
 <ul>
1748
+<li>
1749
+<p>Both <code>derivepassphrase vault</code> and <code>derivepassphrase export vault</code> now
1750
+    support changing the amount of diagnostic output they emit via new
1751
+    command-line options <code>--debug</code>, <code>-v</code>/<code>--verbose</code> and <code>-q</code>/<code>--quiet</code>.
1752
+    Internally, this uses Python&rsquo;s standard <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/logging.html#module-logging">logging</a> and <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/warnings.html#module-warnings">warnings</a>
1753
+    systems.</p>
1754
+</li>
1755
+<li>
1756
+<p><code>derivepassphrase</code> now uses a central configuration file, and additional
1757
+    data files, some of which are service-specific.  (The <code>vault.json</code>
1758
+    configuration file is now rebranded as a data file.)  The configuration
1759
+    files are user-editable, the data files are <code>derivepassphrase</code>-editable.</p>
1760
+<p>The configuration files are in TOML format, so installing
1761
+<code>derivepassphrase</code> on Python 3.10 and older requires the
1762
+<a href="https://pypi.org/project/tomli/"><code>tomli</code></a> package.</p>
1763
+</li>
1764
+<li>
1765
+<p><code>derivepassphrase vault --config</code> now supports an <code>--unset</code> option which
1766
+    unsets any given named setting prior to applying any other configuration
1767
+    changes.</p>
1768
+</li>
1769
+<li>
1770
+<p><code>derivepassphrase vault --export</code> can now also export the current
1771
+    configuration as a POSIX <code>sh</code> script, using the <code>--export-as=sh</code> option.
1772
+    The default (and previous behavior) is <code>--export-as=json</code>.</p>
1773
+</li>
1774
+<li>
1775
+<p><code>derivepassphrase</code> now includes basic support for localization: if the
1776
+    necessary translations are installed, then the diagnostics and help
1777
+    texts can be emitted in different languages.  Internally, this uses
1778
+    Python&rsquo;s standard <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/gettext.html#module-gettext"><code>gettext</code></a> system.</p>
1779
+<p>(As of this version, no translations have actually been prepared yet.)</p>
1780
+</li>
1781
+<li>
1782
+<p><code>derivepassphrase</code> now explicitly supports shell completion, in
1783
+    particular filename and service name completion in the <code>export vault</code>
1784
+    and <code>vault</code> subcommands.</p>
1785
+<p>However, because of restrictions regarding the exchange of data between
1786
+<code>derivepassphrase</code> and the shell, <code>derivepassphrase</code> will not offer any
1787
+service names containing ASCII control characters for completion, and
1788
+a warning will be issued when importing or configuring such a service.
1789
+They may still otherwise be used normally.</p>
1790
+</li>
1791
+<li>
1792
+<p>Support the semi-standard <code>NO_COLOR</code> and the <code>FORCE_COLOR</code> environment
1793
+    variables to suppress or force color output from <code>derivepassphrase</code>.
1794
+    (<code>FORCE_COLOR</code> overrides <code>NO_COLOR</code> if both are set.)</p>
1795
+</li>
1796
+</ul>
1797
+<h3 id="changed">Changed<a class="headerlink" href="#changed" title="Permanent link">&para;</a></h3>
1798
+<ul>
1799
+<li>
1800
+<p>Calling [<code>derivepassphrase_export</code>]
1801
+    [derivepassphrase.cli.derivepassphrase_export],
1802
+    [<code>derivepassphrase_export_vault</code>]
1803
+    [derivepassphrase.cli.derivepassphrase_export_vault] or
1804
+    [<code>derivepassphrase_vault</code>]
1805
+    [derivepassphrase.cli.derivepassphrase_vault], or calling
1806
+    <a class="autorefs autorefs-internal" href="../reference/derivepassphrase.cli/#derivepassphrase.cli.derivepassphrase"><code>derivepassphrase</code></a> via its
1807
+    <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.BaseCommand.main"><code>.main</code></a> method, causes those functions to use
1808
+    the standard Python <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/logging.html#module-logging">logging</a> and <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/warnings.html#module-warnings">warnings</a> facilities to issue
1809
+    diagnostic messages, without output to standard error.  (This includes
1810
+    using <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.testing.CliRunner"><code>click.testing.CliRunner</code></a>, which uses <code>.main</code> calls under the
1811
+    hood.)  Calling [<code>derivepassphrase</code>]
1812
+    [derivepassphrase.cli.derivepassphrase] directly as a function diverts
1813
+    diagnostic messages to standard error.</p>
1814
+</li>
1815
+<li>
1816
+<p>Unicode normalization settings for <code>vault</code> service names and stored
1817
+    passphrases are now stored in the central configuration file, instead of
1818
+    the <code>vault</code> data file.</p>
1819
+</li>
1820
+<li>
1821
+<p><code>derivepassphrase</code> changed its license from <a href="https://spdx.org/licenses/MIT.html">MIT</a> to <a href="https://spdx.org/licenses/Zlib.html">zlib/libpng</a>.
1822
+    This should only make a difference to people redistributing altered
1823
+    versions of <code>derivepassphrase</code>; the basic freedoms, and the
1824
+    combinability of <code>derivepassphrase</code> with other software should be
1825
+    unaffected.</p>
1826
+</li>
1827
+</ul>
1828
+<h2 id="033-2024-11-28">0.3.3 (2024-11-28)<a class="headerlink" href="#033-2024-11-28" title="Permanent link">&para;</a></h2>
1829
+<h3 id="added_1">Added<a class="headerlink" href="#added_1" title="Permanent link">&para;</a></h3>
1830
+<ul>
1576 1831
 <li>Checking whether an SSH key is suitable now also depends on the SSH
1577 1832
     agent in use.  API functions now optionally take an additional
1578 1833
     <a class="autorefs autorefs-internal" href="../reference/derivepassphrase.ssh_agent/#derivepassphrase.ssh_agent.SSHAgentClient"><code>SSHAgentClient</code></a> object to
... ...
@@ -1601,7 +1856,7 @@ effectively constitute a new <q>major</q> release.)
1601 1856
     turned into a subcommand in v0.2.0.</li>
1602 1857
 </ul>
1603 1858
 <h2 id="030-2024-10-15">0.3.0 (2024-10-15)<a class="headerlink" href="#030-2024-10-15" title="Permanent link">&para;</a></h2>
1604
-<h3 id="added_1">Added<a class="headerlink" href="#added_1" title="Permanent link">&para;</a></h3>
1859
+<h3 id="added_2">Added<a class="headerlink" href="#added_2" title="Permanent link">&para;</a></h3>
1605 1860
 <ul>
1606 1861
 <li>Convert changelog management from towncrier to <a href="https://pypi.org/project/scriv">scriv</a>.</li>
1607 1862
 <li>Add SSH agent spawning support to the test suite.  Use this support to
... ...
@@ -1623,7 +1878,7 @@ effectively constitute a new <q>major</q> release.)
1623 1878
     deserialization from the SSH agent wire format.</li>
1624 1879
 <li>Support Python 3.9 and 3.13.</li>
1625 1880
 </ul>
1626
-<h3 id="changed">Changed<a class="headerlink" href="#changed" title="Permanent link">&para;</a></h3>
1881
+<h3 id="changed_1">Changed<a class="headerlink" href="#changed_1" title="Permanent link">&para;</a></h3>
1627 1882
 <ul>
1628 1883
 <li>
1629 1884
 <p>Change links to point to public project repositories, if possible.  For
... ...
@@ -1698,7 +1953,7 @@ configuration with such falsy values will still generate errors when
1698 1953
     which didn&rsquo;t match the declared type annotation.</li>
1699 1954
 </ul>
1700 1955
 <h2 id="020-2024-09-12">0.2.0 (2024-09-12)<a class="headerlink" href="#020-2024-09-12" title="Permanent link">&para;</a></h2>
1701
-<h3 id="added_2">Added<a class="headerlink" href="#added_2" title="Permanent link">&para;</a></h3>
1956
+<h3 id="added_3">Added<a class="headerlink" href="#added_3" title="Permanent link">&para;</a></h3>
1702 1957
 <ul>
1703 1958
 <li>
1704 1959
 <p>Support configuration data export from <code>vault</code> in v0.2, v0.3 and
... ...
@@ -1713,7 +1968,7 @@ even if <code>vault</code> is not installed. (<a href="https://github.com/the-13
1713 1968
     the &ldquo;0.<var>x</var>&rdquo; version of the documentation with the contents so
1714 1969
     far.</li>
1715 1970
 </ul>
1716
-<h3 id="changed_1">Changed<a class="headerlink" href="#changed_1" title="Permanent link">&para;</a></h3>
1971
+<h3 id="changed_2">Changed<a class="headerlink" href="#changed_2" title="Permanent link">&para;</a></h3>
1717 1972
 <ul>
1718 1973
 <li>Changed <code>sequin</code> and <code>ssh_agent_client</code> to be submodules of
1719 1974
     <code>derivepassphrase</code>.  Further moved <code>derivepassphrase.Vault</code> and
... ...
@@ -1788,7 +2043,7 @@ global settings file if no subsystem-specific configuration was found.
1788 2043
     metadata and the Python package metadata.</li>
1789 2044
 </ul>
1790 2045
 <h2 id="010-2024-07-14">0.1.0 (2024-07-14)<a class="headerlink" href="#010-2024-07-14" title="Permanent link">&para;</a></h2>
1791
-<h3 id="added_3">Added<a class="headerlink" href="#added_3" title="Permanent link">&para;</a></h3>
2046
+<h3 id="added_4">Added<a class="headerlink" href="#added_4" title="Permanent link">&para;</a></h3>
1792 2047
 <ul>
1793 2048
 <li>Initial release.</li>
1794 2049
 </ul>
... ...
@@ -1820,7 +2075,7 @@ global settings file if no subsystem-specific configuration was found.
1820 2075
       <nav class="md-footer__inner md-grid" aria-label="Footer" >
1821 2076
         
1822 2077
           
1823
-          <a href="../reference/prerequisites-ssh-key/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Using derivepassphrase vault with an SSH key">
2078
+          <a href="../explanation/faq-altered-versions/" class="md-footer__link md-footer__link--prev" aria-label="Previous: &#34;altered versions&#34; license requirement">
1824 2079
             <div class="md-footer__button md-icon">
1825 2080
               
1826 2081
               <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
... ...
@@ -1830,7 +2085,7 @@ global settings file if no subsystem-specific configuration was found.
1830 2085
                 Previous
1831 2086
               </span>
1832 2087
               <div class="md-ellipsis">
1833
-                Using derivepassphrase vault with an SSH key
2088
+                "altered versions" license requirement
1834 2089
               </div>
1835 2090
             </div>
1836 2091
           </a>
... ...
@@ -1844,7 +2099,7 @@ global settings file if no subsystem-specific configuration was found.
1844 2099
       <div class="md-copyright">
1845 2100
   
1846 2101
     <div class="md-copyright__highlight">
1847
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
2102
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1848 2103
     </div>
1849 2104
   
1850 2105
   
... ...
@@ -0,0 +1,1194 @@
1
+
2
+<!doctype html>
3
+<html lang="en" class="no-js">
4
+  <head>
5
+    
6
+      <meta charset="utf-8">
7
+      <meta name="viewport" content="width=device-width,initial-scale=1">
8
+      
9
+        <meta name="description" content="An almost faithful Python reimplementation of James Coglan's vault.">
10
+      
11
+      
12
+        <meta name="author" content="Marco Ricci">
13
+      
14
+      
15
+        <link rel="canonical" href="https://the13thletter.info/derivepassphrase/0.x/explanation/faq-altered-versions/">
16
+      
17
+      
18
+        <link rel="prev" href="../">
19
+      
20
+      
21
+        <link rel="next" href="../../changelog/">
22
+      
23
+      
24
+      <link rel="icon" href="../../assets/images/favicon.png">
25
+      <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
26
+    
27
+    
28
+      
29
+        <title>"altered versions" license requirement - derivepassphrase</title>
30
+      
31
+    
32
+    
33
+      <link rel="stylesheet" href="../../assets/stylesheets/main.0253249f.min.css">
34
+      
35
+      
36
+
37
+
38
+    
39
+    
40
+    
41
+  
42
+    
43
+    
44
+        <style>:root{--md-text-font:"Noto Sans";--md-code-font:"Noto Mono"}</style>
45
+  
46
+
47
+    
48
+      <link rel="stylesheet" href="../../assets/_mkdocstrings.css">
49
+    
50
+      <link rel="stylesheet" href="../../mkdocstrings_recommended_styles.css">
51
+    
52
+    
53
+    
54
+    
55
+    
56
+  </head>
57
+  
58
+  
59
+    <body dir="ltr">
60
+  
61
+    
62
+    <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
63
+    <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
64
+    <label class="md-overlay" for="__drawer"></label>
65
+    <div data-md-component="skip">
66
+      
67
+        
68
+        <a href="#how-to-comply-with-the-altered-versions-clause-of-the-license" class="md-skip">
69
+          Skip to content
70
+        </a>
71
+      
72
+    </div>
73
+    <div data-md-component="announce">
74
+      
75
+    </div>
76
+    
77
+      <div data-md-color-scheme="default" data-md-component="outdated" hidden>
78
+        
79
+      </div>
80
+    
81
+    
82
+      
83
+    
84
+    <div class="md-container" data-md-component="container">
85
+      
86
+      
87
+        
88
+          
89
+            
90
+<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
91
+  <div class="md-grid">
92
+    <ul class="md-tabs__list">
93
+      
94
+        
95
+  
96
+  
97
+  
98
+    <li class="md-tabs__item">
99
+      <a href="../.." class="md-tabs__link">
100
+        
101
+  
102
+    
103
+  
104
+  Overview
105
+
106
+      </a>
107
+    </li>
108
+  
109
+
110
+      
111
+        
112
+  
113
+  
114
+  
115
+    
116
+    
117
+      <li class="md-tabs__item">
118
+        <a href="../../tutorials/" class="md-tabs__link">
119
+          
120
+  
121
+    
122
+  
123
+  Tutorials & Examples
124
+
125
+        </a>
126
+      </li>
127
+    
128
+  
129
+
130
+      
131
+        
132
+  
133
+  
134
+  
135
+    
136
+    
137
+      <li class="md-tabs__item">
138
+        <a href="../../how-tos/" class="md-tabs__link">
139
+          
140
+  
141
+    
142
+  
143
+  How-Tos
144
+
145
+        </a>
146
+      </li>
147
+    
148
+  
149
+
150
+      
151
+        
152
+  
153
+  
154
+  
155
+    
156
+    
157
+      <li class="md-tabs__item">
158
+        <a href="../../reference/" class="md-tabs__link">
159
+          
160
+  
161
+    
162
+  
163
+  Reference
164
+
165
+        </a>
166
+      </li>
167
+    
168
+  
169
+
170
+      
171
+        
172
+  
173
+  
174
+    
175
+  
176
+  
177
+    
178
+    
179
+      <li class="md-tabs__item md-tabs__item--active">
180
+        <a href="../" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
197
+    <li class="md-tabs__item">
198
+      <a href="../../changelog/" class="md-tabs__link">
199
+        
200
+  
201
+    
202
+  
203
+  Changelog
204
+
205
+      </a>
206
+    </li>
207
+  
208
+
209
+      
210
+    </ul>
211
+  </div>
212
+</nav>
213
+          
214
+        
215
+      
216
+      <main class="md-main" data-md-component="main">
217
+        <div class="md-main__inner md-grid">
218
+          
219
+            
220
+              
221
+              <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
222
+                <div class="md-sidebar__scrollwrap">
223
+                  <div class="md-sidebar__inner">
224
+                    
225
+
226
+
227
+  
228
+
229
+
230
+<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
231
+  <label class="md-nav__title" for="__drawer">
232
+    <a href="../.." title="derivepassphrase" class="md-nav__button md-logo" aria-label="derivepassphrase" data-md-component="logo">
233
+      
234
+  
235
+  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
236
+
237
+    </a>
238
+    derivepassphrase
239
+  </label>
240
+  
241
+    <div class="md-nav__source">
242
+      <a href="https://github.com/the-13th-letter/derivepassphrase" title="Go to repository" class="md-source" data-md-component="source">
243
+  <div class="md-source__icon md-icon">
244
+    
245
+    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
246
+  </div>
247
+  <div class="md-source__repository">
248
+    the-13th-letter/derivepassphrase
249
+  </div>
250
+</a>
251
+    </div>
252
+  
253
+  <ul class="md-nav__list" data-md-scrollfix>
254
+    
255
+      
256
+      
257
+  
258
+  
259
+  
260
+  
261
+    <li class="md-nav__item">
262
+      <a href="../.." class="md-nav__link">
263
+        
264
+  
265
+  <span class="md-ellipsis">
266
+    Overview
267
+  </span>
268
+  
269
+
270
+      </a>
271
+    </li>
272
+  
273
+
274
+    
275
+      
276
+      
277
+  
278
+  
279
+  
280
+  
281
+    
282
+    
283
+      
284
+        
285
+          
286
+        
287
+      
288
+        
289
+      
290
+    
291
+    
292
+      
293
+      
294
+        
295
+      
296
+    
297
+    
298
+    <li class="md-nav__item md-nav__item--nested">
299
+      
300
+        
301
+        
302
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
303
+        
304
+          
305
+          
306
+          <div class="md-nav__link md-nav__container">
307
+            <a href="../../tutorials/" class="md-nav__link ">
308
+              
309
+  
310
+  <span class="md-ellipsis">
311
+    Tutorials & Examples
312
+  </span>
313
+  
314
+
315
+            </a>
316
+            
317
+              
318
+              <label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="0">
319
+                <span class="md-nav__icon md-icon"></span>
320
+              </label>
321
+            
322
+          </div>
323
+        
324
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
325
+          <label class="md-nav__title" for="__nav_2">
326
+            <span class="md-nav__icon md-icon"></span>
327
+            Tutorials & Examples
328
+          </label>
329
+          <ul class="md-nav__list" data-md-scrollfix>
330
+            
331
+              
332
+            
333
+              
334
+                
335
+  
336
+  
337
+  
338
+  
339
+    <li class="md-nav__item">
340
+      <a href="../../tutorials/basic-setup-passphrase/" class="md-nav__link">
341
+        
342
+  
343
+  <span class="md-ellipsis">
344
+    Setting up derivepassphrase vault for three accounts, with a master passphrase
345
+  </span>
346
+  
347
+
348
+      </a>
349
+    </li>
350
+  
351
+
352
+              
353
+            
354
+          </ul>
355
+        </nav>
356
+      
357
+    </li>
358
+  
359
+
360
+    
361
+      
362
+      
363
+  
364
+  
365
+  
366
+  
367
+    
368
+    
369
+      
370
+        
371
+          
372
+        
373
+      
374
+        
375
+      
376
+    
377
+    
378
+      
379
+      
380
+        
381
+      
382
+    
383
+    
384
+    <li class="md-nav__item md-nav__item--nested">
385
+      
386
+        
387
+        
388
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
389
+        
390
+          
391
+          
392
+          <div class="md-nav__link md-nav__container">
393
+            <a href="../../how-tos/" class="md-nav__link ">
394
+              
395
+  
396
+  <span class="md-ellipsis">
397
+    How-Tos
398
+  </span>
399
+  
400
+
401
+            </a>
402
+            
403
+              
404
+              <label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="0">
405
+                <span class="md-nav__icon md-icon"></span>
406
+              </label>
407
+            
408
+          </div>
409
+        
410
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
411
+          <label class="md-nav__title" for="__nav_3">
412
+            <span class="md-nav__icon md-icon"></span>
413
+            How-Tos
414
+          </label>
415
+          <ul class="md-nav__list" data-md-scrollfix>
416
+            
417
+              
418
+            
419
+              
420
+                
421
+  
422
+  
423
+  
424
+  
425
+    <li class="md-nav__item">
426
+      <a href="../../how-tos/ssh-key/" class="md-nav__link">
427
+        
428
+  
429
+  <span class="md-ellipsis">
430
+    How to set up derivepassphrase vault with an SSH key
431
+  </span>
432
+  
433
+
434
+      </a>
435
+    </li>
436
+  
437
+
438
+              
439
+            
440
+          </ul>
441
+        </nav>
442
+      
443
+    </li>
444
+  
445
+
446
+    
447
+      
448
+      
449
+  
450
+  
451
+  
452
+  
453
+    
454
+    
455
+      
456
+        
457
+          
458
+        
459
+      
460
+        
461
+      
462
+        
463
+      
464
+        
465
+      
466
+    
467
+    
468
+      
469
+      
470
+        
471
+      
472
+    
473
+    
474
+    <li class="md-nav__item md-nav__item--nested">
475
+      
476
+        
477
+        
478
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
479
+        
480
+          
481
+          
482
+          <div class="md-nav__link md-nav__container">
483
+            <a href="../../reference/" class="md-nav__link ">
484
+              
485
+  
486
+  <span class="md-ellipsis">
487
+    Reference
488
+  </span>
489
+  
490
+
491
+            </a>
492
+            
493
+              
494
+              <label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="0">
495
+                <span class="md-nav__icon md-icon"></span>
496
+              </label>
497
+            
498
+          </div>
499
+        
500
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
501
+          <label class="md-nav__title" for="__nav_4">
502
+            <span class="md-nav__icon md-icon"></span>
503
+            Reference
504
+          </label>
505
+          <ul class="md-nav__list" data-md-scrollfix>
506
+            
507
+              
508
+            
509
+              
510
+                
511
+  
512
+  
513
+  
514
+  
515
+    
516
+    
517
+      
518
+        
519
+      
520
+        
521
+      
522
+        
523
+      
524
+        
525
+      
526
+    
527
+    
528
+      
529
+      
530
+        
531
+      
532
+    
533
+    
534
+    <li class="md-nav__item md-nav__item--nested">
535
+      
536
+        
537
+        
538
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_2" >
539
+        
540
+          
541
+          <label class="md-nav__link" for="__nav_4_2" id="__nav_4_2_label" tabindex="0">
542
+            
543
+  
544
+  <span class="md-ellipsis">
545
+    Man pages
546
+  </span>
547
+  
548
+
549
+            <span class="md-nav__icon md-icon"></span>
550
+          </label>
551
+        
552
+        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_2_label" aria-expanded="false">
553
+          <label class="md-nav__title" for="__nav_4_2">
554
+            <span class="md-nav__icon md-icon"></span>
555
+            Man pages
556
+          </label>
557
+          <ul class="md-nav__list" data-md-scrollfix>
558
+            
559
+              
560
+                
561
+  
562
+  
563
+  
564
+  
565
+    <li class="md-nav__item">
566
+      <a href="../../reference/derivepassphrase.1/" class="md-nav__link">
567
+        
568
+  
569
+  <span class="md-ellipsis">
570
+    derivepassphrase(1)
571
+  </span>
572
+  
573
+
574
+      </a>
575
+    </li>
576
+  
577
+
578
+              
579
+            
580
+              
581
+                
582
+  
583
+  
584
+  
585
+  
586
+    <li class="md-nav__item">
587
+      <a href="../../reference/derivepassphrase-vault.1/" class="md-nav__link">
588
+        
589
+  
590
+  <span class="md-ellipsis">
591
+    derivepassphrase-vault(1)
592
+  </span>
593
+  
594
+
595
+      </a>
596
+    </li>
597
+  
598
+
599
+              
600
+            
601
+              
602
+                
603
+  
604
+  
605
+  
606
+  
607
+    <li class="md-nav__item">
608
+      <a href="../../reference/derivepassphrase-export.1/" class="md-nav__link">
609
+        
610
+  
611
+  <span class="md-ellipsis">
612
+    derivepassphrase-export(1)
613
+  </span>
614
+  
615
+
616
+      </a>
617
+    </li>
618
+  
619
+
620
+              
621
+            
622
+              
623
+                
624
+  
625
+  
626
+  
627
+  
628
+    <li class="md-nav__item">
629
+      <a href="../../reference/derivepassphrase-export-vault.1/" class="md-nav__link">
630
+        
631
+  
632
+  <span class="md-ellipsis">
633
+    derivepassphrase-export-vault(1)
634
+  </span>
635
+  
636
+
637
+      </a>
638
+    </li>
639
+  
640
+
641
+              
642
+            
643
+          </ul>
644
+        </nav>
645
+      
646
+    </li>
647
+  
648
+
649
+              
650
+            
651
+              
652
+                
653
+  
654
+  
655
+  
656
+  
657
+    
658
+    
659
+      
660
+        
661
+      
662
+        
663
+      
664
+        
665
+      
666
+        
667
+      
668
+        
669
+      
670
+        
671
+      
672
+    
673
+    
674
+      
675
+      
676
+        
677
+      
678
+    
679
+    
680
+    <li class="md-nav__item md-nav__item--nested">
681
+      
682
+        
683
+        
684
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_3" >
685
+        
686
+          
687
+          <label class="md-nav__link" for="__nav_4_3" id="__nav_4_3_label" tabindex="0">
688
+            
689
+  
690
+  <span class="md-ellipsis">
691
+    API docs: Module derivepassphrase
692
+  </span>
693
+  
694
+
695
+            <span class="md-nav__icon md-icon"></span>
696
+          </label>
697
+        
698
+        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_3_label" aria-expanded="false">
699
+          <label class="md-nav__title" for="__nav_4_3">
700
+            <span class="md-nav__icon md-icon"></span>
701
+            API docs: Module derivepassphrase
702
+          </label>
703
+          <ul class="md-nav__list" data-md-scrollfix>
704
+            
705
+              
706
+                
707
+  
708
+  
709
+  
710
+  
711
+    <li class="md-nav__item">
712
+      <a href="../../reference/derivepassphrase.cli/" class="md-nav__link">
713
+        
714
+  
715
+  <span class="md-ellipsis">
716
+    Submodule cli
717
+  </span>
718
+  
719
+
720
+      </a>
721
+    </li>
722
+  
723
+
724
+              
725
+            
726
+              
727
+                
728
+  
729
+  
730
+  
731
+  
732
+    <li class="md-nav__item">
733
+      <a href="../../reference/derivepassphrase.exporter/" class="md-nav__link">
734
+        
735
+  
736
+  <span class="md-ellipsis">
737
+    Subpackage exporter
738
+  </span>
739
+  
740
+
741
+      </a>
742
+    </li>
743
+  
744
+
745
+              
746
+            
747
+              
748
+                
749
+  
750
+  
751
+  
752
+  
753
+    <li class="md-nav__item">
754
+      <a href="../../reference/derivepassphrase.sequin/" class="md-nav__link">
755
+        
756
+  
757
+  <span class="md-ellipsis">
758
+    Submodule sequin
759
+  </span>
760
+  
761
+
762
+      </a>
763
+    </li>
764
+  
765
+
766
+              
767
+            
768
+              
769
+                
770
+  
771
+  
772
+  
773
+  
774
+    <li class="md-nav__item">
775
+      <a href="../../reference/derivepassphrase.ssh_agent/" class="md-nav__link">
776
+        
777
+  
778
+  <span class="md-ellipsis">
779
+    Submodule ssh_agent
780
+  </span>
781
+  
782
+
783
+      </a>
784
+    </li>
785
+  
786
+
787
+              
788
+            
789
+              
790
+                
791
+  
792
+  
793
+  
794
+  
795
+    <li class="md-nav__item">
796
+      <a href="../../reference/derivepassphrase._types/" class="md-nav__link">
797
+        
798
+  
799
+  <span class="md-ellipsis">
800
+    Submodule _types
801
+  </span>
802
+  
803
+
804
+      </a>
805
+    </li>
806
+  
807
+
808
+              
809
+            
810
+              
811
+                
812
+  
813
+  
814
+  
815
+  
816
+    <li class="md-nav__item">
817
+      <a href="../../reference/derivepassphrase.vault/" class="md-nav__link">
818
+        
819
+  
820
+  <span class="md-ellipsis">
821
+    Submodule vault
822
+  </span>
823
+  
824
+
825
+      </a>
826
+    </li>
827
+  
828
+
829
+              
830
+            
831
+          </ul>
832
+        </nav>
833
+      
834
+    </li>
835
+  
836
+
837
+              
838
+            
839
+              
840
+                
841
+  
842
+  
843
+  
844
+  
845
+    
846
+    
847
+      
848
+        
849
+      
850
+    
851
+    
852
+      
853
+      
854
+        
855
+      
856
+    
857
+    
858
+    <li class="md-nav__item md-nav__item--nested">
859
+      
860
+        
861
+        
862
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_4" >
863
+        
864
+          
865
+          <label class="md-nav__link" for="__nav_4_4" id="__nav_4_4_label" tabindex="0">
866
+            
867
+  
868
+  <span class="md-ellipsis">
869
+    Technical prerequisites
870
+  </span>
871
+  
872
+
873
+            <span class="md-nav__icon md-icon"></span>
874
+          </label>
875
+        
876
+        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_4_label" aria-expanded="false">
877
+          <label class="md-nav__title" for="__nav_4_4">
878
+            <span class="md-nav__icon md-icon"></span>
879
+            Technical prerequisites
880
+          </label>
881
+          <ul class="md-nav__list" data-md-scrollfix>
882
+            
883
+              
884
+                
885
+  
886
+  
887
+  
888
+  
889
+    <li class="md-nav__item">
890
+      <a href="../../reference/prerequisites-ssh-key/" class="md-nav__link">
891
+        
892
+  
893
+  <span class="md-ellipsis">
894
+    Using derivepassphrase vault with an SSH key
895
+  </span>
896
+  
897
+
898
+      </a>
899
+    </li>
900
+  
901
+
902
+              
903
+            
904
+          </ul>
905
+        </nav>
906
+      
907
+    </li>
908
+  
909
+
910
+              
911
+            
912
+          </ul>
913
+        </nav>
914
+      
915
+    </li>
916
+  
917
+
918
+    
919
+      
920
+      
921
+  
922
+  
923
+    
924
+  
925
+  
926
+  
927
+    
928
+    
929
+      
930
+        
931
+          
932
+        
933
+      
934
+        
935
+      
936
+    
937
+    
938
+      
939
+        
940
+        
941
+      
942
+      
943
+        
944
+      
945
+    
946
+    
947
+    <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
948
+      
949
+        
950
+        
951
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" checked>
952
+        
953
+          
954
+          
955
+          <div class="md-nav__link md-nav__container">
956
+            <a href="../" class="md-nav__link ">
957
+              
958
+  
959
+  <span class="md-ellipsis">
960
+    Design & Background
961
+  </span>
962
+  
963
+
964
+            </a>
965
+            
966
+              
967
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="">
968
+                <span class="md-nav__icon md-icon"></span>
969
+              </label>
970
+            
971
+          </div>
972
+        
973
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="true">
974
+          <label class="md-nav__title" for="__nav_5">
975
+            <span class="md-nav__icon md-icon"></span>
976
+            Design & Background
977
+          </label>
978
+          <ul class="md-nav__list" data-md-scrollfix>
979
+            
980
+              
981
+            
982
+              
983
+                
984
+  
985
+  
986
+    
987
+  
988
+  
989
+  
990
+    <li class="md-nav__item md-nav__item--active">
991
+      
992
+      <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
993
+      
994
+      
995
+        
996
+      
997
+      
998
+      <a href="./" class="md-nav__link md-nav__link--active">
999
+        
1000
+  
1001
+  <span class="md-ellipsis">
1002
+    "altered versions" license requirement
1003
+  </span>
1004
+  
1005
+
1006
+      </a>
1007
+      
1008
+    </li>
1009
+  
1010
+
1011
+              
1012
+            
1013
+          </ul>
1014
+        </nav>
1015
+      
1016
+    </li>
1017
+  
1018
+
1019
+    
1020
+      
1021
+      
1022
+  
1023
+  
1024
+  
1025
+  
1026
+    <li class="md-nav__item">
1027
+      <a href="../../changelog/" class="md-nav__link">
1028
+        
1029
+  
1030
+  <span class="md-ellipsis">
1031
+    Changelog
1032
+  </span>
1033
+  
1034
+
1035
+      </a>
1036
+    </li>
1037
+  
1038
+
1039
+    
1040
+  </ul>
1041
+</nav>
1042
+                  </div>
1043
+                </div>
1044
+              </div>
1045
+            
1046
+            
1047
+              
1048
+              <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
1049
+                <div class="md-sidebar__scrollwrap">
1050
+                  <div class="md-sidebar__inner">
1051
+                    
1052
+
1053
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1054
+  
1055
+  
1056
+  
1057
+    
1058
+  
1059
+  
1060
+</nav>
1061
+                  </div>
1062
+                </div>
1063
+              </div>
1064
+            
1065
+          
1066
+          
1067
+            <div class="md-content" data-md-component="content">
1068
+              <article class="md-content__inner md-typeset">
1069
+                
1070
+                  
1071
+
1072
+  
1073
+  
1074
+    
1075
+      
1076
+    
1077
+    <a href="https://github.com/the-13th-letter/derivepassphrase/raw/master/docs/explanation/faq-altered-versions.md" title="View source of this page" class="md-content__button md-icon">
1078
+      
1079
+      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
1080
+    </a>
1081
+  
1082
+
1083
+
1084
+<h1 id="how-to-comply-with-the-altered-versions-clause-of-the-license">How to comply with the &ldquo;altered versions&rdquo; clause of the license<a class="headerlink" href="#how-to-comply-with-the-altered-versions-clause-of-the-license" title="Permanent link">&para;</a></h1>
1085
+<p><strong>Short answer:</strong> change the package name and/or change the version number to include a <a href="https://peps.python.org/pep-0440/">PEP 440</a> &ldquo;local version identifier&rdquo;.
1086
+If <code>derivepassphrase</code> ever rebrands, this applies to rebranded names too.
1087
+We try not to clash with anyone else, and will yank our offending releases if we do.</p>
1088
+<p><strong>Long answer:</strong> We, upstream <code>derivepassphrase</code>, reserve the name <code>derivepassphrase</code> and certain version numbers for ourselves.
1089
+Specifically, our version numbers adhere to <a href="https://peps.python.org/pep-0440/">PEP 440</a> (or newer revisions) and generally do not include a &ldquo;local version identifier&rdquo;.
1090
+To mark an altered version, we thus recommend that you change the software package name <code>derivepassphrase</code>, or use a version number with a local version identifier.
1091
+If we (upstream) decide to use a local version identifier, we will avoid all clashing local version identifiers we are aware of, and if informed of a clashing local version identifier after our release, will yank our offending version(s).</p>
1092
+<p>Should we (upstream) change the package name, we shall apply the same guidelines and checks concerning local version identifiers to the new package name.
1093
+A change of package name does <em>not</em> by itself imply permission to use the old package name for future releases of altered versions without marking them.</p>
1094
+<hr />
1095
+<p>See also <a href="https://github.com/madler/zlib/blob/v1.3.1/FAQ" title="see question #24">the zlib project&rsquo;s take on how to mark altered versions</a>.
1096
+Like them, we recommend keeping our upstream Changelog (up to the point where you introduced modifications) and describing your modifications both there and in the README, in the appropriate level of detail.
1097
+We also request (but do not require) that you provide clear instructions in the README (and potentially other suitable places) on where and how to report problems that stem from your modifications, not from the upstream software package.</p>
1098
+
1099
+
1100
+
1101
+
1102
+
1103
+
1104
+
1105
+
1106
+
1107
+
1108
+
1109
+
1110
+                
1111
+              </article>
1112
+            </div>
1113
+          
1114
+          
1115
+        </div>
1116
+        
1117
+      </main>
1118
+      
1119
+        <footer class="md-footer">
1120
+  
1121
+    
1122
+      
1123
+      <nav class="md-footer__inner md-grid" aria-label="Footer" >
1124
+        
1125
+          
1126
+          <a href="../" class="md-footer__link md-footer__link--prev" aria-label="Previous: Explanation overview">
1127
+            <div class="md-footer__button md-icon">
1128
+              
1129
+              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
1130
+            </div>
1131
+            <div class="md-footer__title">
1132
+              <span class="md-footer__direction">
1133
+                Previous
1134
+              </span>
1135
+              <div class="md-ellipsis">
1136
+                Explanation overview
1137
+              </div>
1138
+            </div>
1139
+          </a>
1140
+        
1141
+        
1142
+          
1143
+          <a href="../../changelog/" class="md-footer__link md-footer__link--next" aria-label="Next: Changelog">
1144
+            <div class="md-footer__title">
1145
+              <span class="md-footer__direction">
1146
+                Next
1147
+              </span>
1148
+              <div class="md-ellipsis">
1149
+                Changelog
1150
+              </div>
1151
+            </div>
1152
+            <div class="md-footer__button md-icon">
1153
+              
1154
+              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
1155
+            </div>
1156
+          </a>
1157
+        
1158
+      </nav>
1159
+    
1160
+  
1161
+  <div class="md-footer-meta md-typeset">
1162
+    <div class="md-footer-meta__inner md-grid">
1163
+      <div class="md-copyright">
1164
+  
1165
+    <div class="md-copyright__highlight">
1166
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1167
+    </div>
1168
+  
1169
+  
1170
+    Made with
1171
+    <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1172
+      Material for MkDocs
1173
+    </a>
1174
+    and
1175
+    <a href="https://mkdocstrings.github.io/python/" target="_blank" rel="noopener">
1176
+        mkdocstrings-python
1177
+    </a>
1178
+  
1179
+</div>
1180
+      
1181
+    </div>
1182
+  </div>
1183
+</footer>
1184
+      
1185
+    </div>
1186
+    <div class="md-dialog" data-md-component="dialog">
1187
+      <div class="md-dialog__inner md-typeset"></div>
1188
+    </div>
1189
+    
1190
+    
1191
+    
1192
+    
1193
+  </body>
1194
+</html>
0 1195
\ No newline at end of file
... ...
@@ -0,0 +1,1172 @@
1
+
2
+<!doctype html>
3
+<html lang="en" class="no-js">
4
+  <head>
5
+    
6
+      <meta charset="utf-8">
7
+      <meta name="viewport" content="width=device-width,initial-scale=1">
8
+      
9
+        <meta name="description" content="An almost faithful Python reimplementation of James Coglan's vault.">
10
+      
11
+      
12
+        <meta name="author" content="Marco Ricci">
13
+      
14
+      
15
+        <link rel="canonical" href="https://the13thletter.info/derivepassphrase/0.x/explanation/">
16
+      
17
+      
18
+        <link rel="prev" href="../reference/prerequisites-ssh-key/">
19
+      
20
+      
21
+        <link rel="next" href="faq-altered-versions/">
22
+      
23
+      
24
+      <link rel="icon" href="../assets/images/favicon.png">
25
+      <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
26
+    
27
+    
28
+      
29
+        <title>Explanation overview - derivepassphrase</title>
30
+      
31
+    
32
+    
33
+      <link rel="stylesheet" href="../assets/stylesheets/main.0253249f.min.css">
34
+      
35
+      
36
+
37
+
38
+    
39
+    
40
+    
41
+  
42
+    
43
+    
44
+        <style>:root{--md-text-font:"Noto Sans";--md-code-font:"Noto Mono"}</style>
45
+  
46
+
47
+    
48
+      <link rel="stylesheet" href="../assets/_mkdocstrings.css">
49
+    
50
+      <link rel="stylesheet" href="../mkdocstrings_recommended_styles.css">
51
+    
52
+    
53
+    
54
+    
55
+    
56
+  </head>
57
+  
58
+  
59
+    <body dir="ltr">
60
+  
61
+    
62
+    <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
63
+    <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
64
+    <label class="md-overlay" for="__drawer"></label>
65
+    <div data-md-component="skip">
66
+      
67
+    </div>
68
+    <div data-md-component="announce">
69
+      
70
+    </div>
71
+    
72
+      <div data-md-color-scheme="default" data-md-component="outdated" hidden>
73
+        
74
+      </div>
75
+    
76
+    
77
+      
78
+    
79
+    <div class="md-container" data-md-component="container">
80
+      
81
+      
82
+        
83
+          
84
+            
85
+<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
86
+  <div class="md-grid">
87
+    <ul class="md-tabs__list">
88
+      
89
+        
90
+  
91
+  
92
+  
93
+    <li class="md-tabs__item">
94
+      <a href=".." class="md-tabs__link">
95
+        
96
+  
97
+    
98
+  
99
+  Overview
100
+
101
+      </a>
102
+    </li>
103
+  
104
+
105
+      
106
+        
107
+  
108
+  
109
+  
110
+    
111
+    
112
+      <li class="md-tabs__item">
113
+        <a href="../tutorials/" class="md-tabs__link">
114
+          
115
+  
116
+    
117
+  
118
+  Tutorials & Examples
119
+
120
+        </a>
121
+      </li>
122
+    
123
+  
124
+
125
+      
126
+        
127
+  
128
+  
129
+  
130
+    
131
+    
132
+      <li class="md-tabs__item">
133
+        <a href="../how-tos/" class="md-tabs__link">
134
+          
135
+  
136
+    
137
+  
138
+  How-Tos
139
+
140
+        </a>
141
+      </li>
142
+    
143
+  
144
+
145
+      
146
+        
147
+  
148
+  
149
+  
150
+    
151
+    
152
+      <li class="md-tabs__item">
153
+        <a href="../reference/" class="md-tabs__link">
154
+          
155
+  
156
+    
157
+  
158
+  Reference
159
+
160
+        </a>
161
+      </li>
162
+    
163
+  
164
+
165
+      
166
+        
167
+  
168
+  
169
+    
170
+  
171
+  
172
+    
173
+    
174
+      <li class="md-tabs__item md-tabs__item--active">
175
+        <a href="./" class="md-tabs__link">
176
+          
177
+  
178
+    
179
+  
180
+  Design & Background
181
+
182
+        </a>
183
+      </li>
184
+    
185
+  
186
+
187
+      
188
+        
189
+  
190
+  
191
+  
192
+    <li class="md-tabs__item">
193
+      <a href="../changelog/" class="md-tabs__link">
194
+        
195
+  
196
+    
197
+  
198
+  Changelog
199
+
200
+      </a>
201
+    </li>
202
+  
203
+
204
+      
205
+    </ul>
206
+  </div>
207
+</nav>
208
+          
209
+        
210
+      
211
+      <main class="md-main" data-md-component="main">
212
+        <div class="md-main__inner md-grid">
213
+          
214
+            
215
+              
216
+              <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
217
+                <div class="md-sidebar__scrollwrap">
218
+                  <div class="md-sidebar__inner">
219
+                    
220
+
221
+
222
+  
223
+
224
+
225
+<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
226
+  <label class="md-nav__title" for="__drawer">
227
+    <a href=".." title="derivepassphrase" class="md-nav__button md-logo" aria-label="derivepassphrase" data-md-component="logo">
228
+      
229
+  
230
+  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
231
+
232
+    </a>
233
+    derivepassphrase
234
+  </label>
235
+  
236
+    <div class="md-nav__source">
237
+      <a href="https://github.com/the-13th-letter/derivepassphrase" title="Go to repository" class="md-source" data-md-component="source">
238
+  <div class="md-source__icon md-icon">
239
+    
240
+    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
241
+  </div>
242
+  <div class="md-source__repository">
243
+    the-13th-letter/derivepassphrase
244
+  </div>
245
+</a>
246
+    </div>
247
+  
248
+  <ul class="md-nav__list" data-md-scrollfix>
249
+    
250
+      
251
+      
252
+  
253
+  
254
+  
255
+  
256
+    <li class="md-nav__item">
257
+      <a href=".." class="md-nav__link">
258
+        
259
+  
260
+  <span class="md-ellipsis">
261
+    Overview
262
+  </span>
263
+  
264
+
265
+      </a>
266
+    </li>
267
+  
268
+
269
+    
270
+      
271
+      
272
+  
273
+  
274
+  
275
+  
276
+    
277
+    
278
+      
279
+        
280
+          
281
+        
282
+      
283
+        
284
+      
285
+    
286
+    
287
+      
288
+      
289
+        
290
+      
291
+    
292
+    
293
+    <li class="md-nav__item md-nav__item--nested">
294
+      
295
+        
296
+        
297
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
298
+        
299
+          
300
+          
301
+          <div class="md-nav__link md-nav__container">
302
+            <a href="../tutorials/" class="md-nav__link ">
303
+              
304
+  
305
+  <span class="md-ellipsis">
306
+    Tutorials & Examples
307
+  </span>
308
+  
309
+
310
+            </a>
311
+            
312
+              
313
+              <label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="0">
314
+                <span class="md-nav__icon md-icon"></span>
315
+              </label>
316
+            
317
+          </div>
318
+        
319
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
320
+          <label class="md-nav__title" for="__nav_2">
321
+            <span class="md-nav__icon md-icon"></span>
322
+            Tutorials & Examples
323
+          </label>
324
+          <ul class="md-nav__list" data-md-scrollfix>
325
+            
326
+              
327
+            
328
+              
329
+                
330
+  
331
+  
332
+  
333
+  
334
+    <li class="md-nav__item">
335
+      <a href="../tutorials/basic-setup-passphrase/" class="md-nav__link">
336
+        
337
+  
338
+  <span class="md-ellipsis">
339
+    Setting up derivepassphrase vault for three accounts, with a master passphrase
340
+  </span>
341
+  
342
+
343
+      </a>
344
+    </li>
345
+  
346
+
347
+              
348
+            
349
+          </ul>
350
+        </nav>
351
+      
352
+    </li>
353
+  
354
+
355
+    
356
+      
357
+      
358
+  
359
+  
360
+  
361
+  
362
+    
363
+    
364
+      
365
+        
366
+          
367
+        
368
+      
369
+        
370
+      
371
+    
372
+    
373
+      
374
+      
375
+        
376
+      
377
+    
378
+    
379
+    <li class="md-nav__item md-nav__item--nested">
380
+      
381
+        
382
+        
383
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
384
+        
385
+          
386
+          
387
+          <div class="md-nav__link md-nav__container">
388
+            <a href="../how-tos/" class="md-nav__link ">
389
+              
390
+  
391
+  <span class="md-ellipsis">
392
+    How-Tos
393
+  </span>
394
+  
395
+
396
+            </a>
397
+            
398
+              
399
+              <label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="0">
400
+                <span class="md-nav__icon md-icon"></span>
401
+              </label>
402
+            
403
+          </div>
404
+        
405
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
406
+          <label class="md-nav__title" for="__nav_3">
407
+            <span class="md-nav__icon md-icon"></span>
408
+            How-Tos
409
+          </label>
410
+          <ul class="md-nav__list" data-md-scrollfix>
411
+            
412
+              
413
+            
414
+              
415
+                
416
+  
417
+  
418
+  
419
+  
420
+    <li class="md-nav__item">
421
+      <a href="../how-tos/ssh-key/" class="md-nav__link">
422
+        
423
+  
424
+  <span class="md-ellipsis">
425
+    How to set up derivepassphrase vault with an SSH key
426
+  </span>
427
+  
428
+
429
+      </a>
430
+    </li>
431
+  
432
+
433
+              
434
+            
435
+          </ul>
436
+        </nav>
437
+      
438
+    </li>
439
+  
440
+
441
+    
442
+      
443
+      
444
+  
445
+  
446
+  
447
+  
448
+    
449
+    
450
+      
451
+        
452
+          
453
+        
454
+      
455
+        
456
+      
457
+        
458
+      
459
+        
460
+      
461
+    
462
+    
463
+      
464
+      
465
+        
466
+      
467
+    
468
+    
469
+    <li class="md-nav__item md-nav__item--nested">
470
+      
471
+        
472
+        
473
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
474
+        
475
+          
476
+          
477
+          <div class="md-nav__link md-nav__container">
478
+            <a href="../reference/" class="md-nav__link ">
479
+              
480
+  
481
+  <span class="md-ellipsis">
482
+    Reference
483
+  </span>
484
+  
485
+
486
+            </a>
487
+            
488
+              
489
+              <label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="0">
490
+                <span class="md-nav__icon md-icon"></span>
491
+              </label>
492
+            
493
+          </div>
494
+        
495
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
496
+          <label class="md-nav__title" for="__nav_4">
497
+            <span class="md-nav__icon md-icon"></span>
498
+            Reference
499
+          </label>
500
+          <ul class="md-nav__list" data-md-scrollfix>
501
+            
502
+              
503
+            
504
+              
505
+                
506
+  
507
+  
508
+  
509
+  
510
+    
511
+    
512
+      
513
+        
514
+      
515
+        
516
+      
517
+        
518
+      
519
+        
520
+      
521
+    
522
+    
523
+      
524
+      
525
+        
526
+      
527
+    
528
+    
529
+    <li class="md-nav__item md-nav__item--nested">
530
+      
531
+        
532
+        
533
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_2" >
534
+        
535
+          
536
+          <label class="md-nav__link" for="__nav_4_2" id="__nav_4_2_label" tabindex="0">
537
+            
538
+  
539
+  <span class="md-ellipsis">
540
+    Man pages
541
+  </span>
542
+  
543
+
544
+            <span class="md-nav__icon md-icon"></span>
545
+          </label>
546
+        
547
+        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_2_label" aria-expanded="false">
548
+          <label class="md-nav__title" for="__nav_4_2">
549
+            <span class="md-nav__icon md-icon"></span>
550
+            Man pages
551
+          </label>
552
+          <ul class="md-nav__list" data-md-scrollfix>
553
+            
554
+              
555
+                
556
+  
557
+  
558
+  
559
+  
560
+    <li class="md-nav__item">
561
+      <a href="../reference/derivepassphrase.1/" class="md-nav__link">
562
+        
563
+  
564
+  <span class="md-ellipsis">
565
+    derivepassphrase(1)
566
+  </span>
567
+  
568
+
569
+      </a>
570
+    </li>
571
+  
572
+
573
+              
574
+            
575
+              
576
+                
577
+  
578
+  
579
+  
580
+  
581
+    <li class="md-nav__item">
582
+      <a href="../reference/derivepassphrase-vault.1/" class="md-nav__link">
583
+        
584
+  
585
+  <span class="md-ellipsis">
586
+    derivepassphrase-vault(1)
587
+  </span>
588
+  
589
+
590
+      </a>
591
+    </li>
592
+  
593
+
594
+              
595
+            
596
+              
597
+                
598
+  
599
+  
600
+  
601
+  
602
+    <li class="md-nav__item">
603
+      <a href="../reference/derivepassphrase-export.1/" class="md-nav__link">
604
+        
605
+  
606
+  <span class="md-ellipsis">
607
+    derivepassphrase-export(1)
608
+  </span>
609
+  
610
+
611
+      </a>
612
+    </li>
613
+  
614
+
615
+              
616
+            
617
+              
618
+                
619
+  
620
+  
621
+  
622
+  
623
+    <li class="md-nav__item">
624
+      <a href="../reference/derivepassphrase-export-vault.1/" class="md-nav__link">
625
+        
626
+  
627
+  <span class="md-ellipsis">
628
+    derivepassphrase-export-vault(1)
629
+  </span>
630
+  
631
+
632
+      </a>
633
+    </li>
634
+  
635
+
636
+              
637
+            
638
+          </ul>
639
+        </nav>
640
+      
641
+    </li>
642
+  
643
+
644
+              
645
+            
646
+              
647
+                
648
+  
649
+  
650
+  
651
+  
652
+    
653
+    
654
+      
655
+        
656
+      
657
+        
658
+      
659
+        
660
+      
661
+        
662
+      
663
+        
664
+      
665
+        
666
+      
667
+    
668
+    
669
+      
670
+      
671
+        
672
+      
673
+    
674
+    
675
+    <li class="md-nav__item md-nav__item--nested">
676
+      
677
+        
678
+        
679
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_3" >
680
+        
681
+          
682
+          <label class="md-nav__link" for="__nav_4_3" id="__nav_4_3_label" tabindex="0">
683
+            
684
+  
685
+  <span class="md-ellipsis">
686
+    API docs: Module derivepassphrase
687
+  </span>
688
+  
689
+
690
+            <span class="md-nav__icon md-icon"></span>
691
+          </label>
692
+        
693
+        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_3_label" aria-expanded="false">
694
+          <label class="md-nav__title" for="__nav_4_3">
695
+            <span class="md-nav__icon md-icon"></span>
696
+            API docs: Module derivepassphrase
697
+          </label>
698
+          <ul class="md-nav__list" data-md-scrollfix>
699
+            
700
+              
701
+                
702
+  
703
+  
704
+  
705
+  
706
+    <li class="md-nav__item">
707
+      <a href="../reference/derivepassphrase.cli/" class="md-nav__link">
708
+        
709
+  
710
+  <span class="md-ellipsis">
711
+    Submodule cli
712
+  </span>
713
+  
714
+
715
+      </a>
716
+    </li>
717
+  
718
+
719
+              
720
+            
721
+              
722
+                
723
+  
724
+  
725
+  
726
+  
727
+    <li class="md-nav__item">
728
+      <a href="../reference/derivepassphrase.exporter/" class="md-nav__link">
729
+        
730
+  
731
+  <span class="md-ellipsis">
732
+    Subpackage exporter
733
+  </span>
734
+  
735
+
736
+      </a>
737
+    </li>
738
+  
739
+
740
+              
741
+            
742
+              
743
+                
744
+  
745
+  
746
+  
747
+  
748
+    <li class="md-nav__item">
749
+      <a href="../reference/derivepassphrase.sequin/" class="md-nav__link">
750
+        
751
+  
752
+  <span class="md-ellipsis">
753
+    Submodule sequin
754
+  </span>
755
+  
756
+
757
+      </a>
758
+    </li>
759
+  
760
+
761
+              
762
+            
763
+              
764
+                
765
+  
766
+  
767
+  
768
+  
769
+    <li class="md-nav__item">
770
+      <a href="../reference/derivepassphrase.ssh_agent/" class="md-nav__link">
771
+        
772
+  
773
+  <span class="md-ellipsis">
774
+    Submodule ssh_agent
775
+  </span>
776
+  
777
+
778
+      </a>
779
+    </li>
780
+  
781
+
782
+              
783
+            
784
+              
785
+                
786
+  
787
+  
788
+  
789
+  
790
+    <li class="md-nav__item">
791
+      <a href="../reference/derivepassphrase._types/" class="md-nav__link">
792
+        
793
+  
794
+  <span class="md-ellipsis">
795
+    Submodule _types
796
+  </span>
797
+  
798
+
799
+      </a>
800
+    </li>
801
+  
802
+
803
+              
804
+            
805
+              
806
+                
807
+  
808
+  
809
+  
810
+  
811
+    <li class="md-nav__item">
812
+      <a href="../reference/derivepassphrase.vault/" class="md-nav__link">
813
+        
814
+  
815
+  <span class="md-ellipsis">
816
+    Submodule vault
817
+  </span>
818
+  
819
+
820
+      </a>
821
+    </li>
822
+  
823
+
824
+              
825
+            
826
+          </ul>
827
+        </nav>
828
+      
829
+    </li>
830
+  
831
+
832
+              
833
+            
834
+              
835
+                
836
+  
837
+  
838
+  
839
+  
840
+    
841
+    
842
+      
843
+        
844
+      
845
+    
846
+    
847
+      
848
+      
849
+        
850
+      
851
+    
852
+    
853
+    <li class="md-nav__item md-nav__item--nested">
854
+      
855
+        
856
+        
857
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_4" >
858
+        
859
+          
860
+          <label class="md-nav__link" for="__nav_4_4" id="__nav_4_4_label" tabindex="0">
861
+            
862
+  
863
+  <span class="md-ellipsis">
864
+    Technical prerequisites
865
+  </span>
866
+  
867
+
868
+            <span class="md-nav__icon md-icon"></span>
869
+          </label>
870
+        
871
+        <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_4_label" aria-expanded="false">
872
+          <label class="md-nav__title" for="__nav_4_4">
873
+            <span class="md-nav__icon md-icon"></span>
874
+            Technical prerequisites
875
+          </label>
876
+          <ul class="md-nav__list" data-md-scrollfix>
877
+            
878
+              
879
+                
880
+  
881
+  
882
+  
883
+  
884
+    <li class="md-nav__item">
885
+      <a href="../reference/prerequisites-ssh-key/" class="md-nav__link">
886
+        
887
+  
888
+  <span class="md-ellipsis">
889
+    Using derivepassphrase vault with an SSH key
890
+  </span>
891
+  
892
+
893
+      </a>
894
+    </li>
895
+  
896
+
897
+              
898
+            
899
+          </ul>
900
+        </nav>
901
+      
902
+    </li>
903
+  
904
+
905
+              
906
+            
907
+          </ul>
908
+        </nav>
909
+      
910
+    </li>
911
+  
912
+
913
+    
914
+      
915
+      
916
+  
917
+  
918
+    
919
+  
920
+  
921
+  
922
+    
923
+    
924
+      
925
+        
926
+          
927
+        
928
+      
929
+        
930
+      
931
+    
932
+    
933
+      
934
+        
935
+        
936
+      
937
+      
938
+        
939
+      
940
+    
941
+    
942
+    <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
943
+      
944
+        
945
+        
946
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" checked>
947
+        
948
+          
949
+          
950
+          <div class="md-nav__link md-nav__container">
951
+            <a href="./" class="md-nav__link md-nav__link--active">
952
+              
953
+  
954
+  <span class="md-ellipsis">
955
+    Design & Background
956
+  </span>
957
+  
958
+
959
+            </a>
960
+            
961
+              
962
+              <label class="md-nav__link md-nav__link--active" for="__nav_5" id="__nav_5_label" tabindex="">
963
+                <span class="md-nav__icon md-icon"></span>
964
+              </label>
965
+            
966
+          </div>
967
+        
968
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="true">
969
+          <label class="md-nav__title" for="__nav_5">
970
+            <span class="md-nav__icon md-icon"></span>
971
+            Design & Background
972
+          </label>
973
+          <ul class="md-nav__list" data-md-scrollfix>
974
+            
975
+              
976
+            
977
+              
978
+                
979
+  
980
+  
981
+  
982
+  
983
+    <li class="md-nav__item">
984
+      <a href="faq-altered-versions/" class="md-nav__link">
985
+        
986
+  
987
+  <span class="md-ellipsis">
988
+    "altered versions" license requirement
989
+  </span>
990
+  
991
+
992
+      </a>
993
+    </li>
994
+  
995
+
996
+              
997
+            
998
+          </ul>
999
+        </nav>
1000
+      
1001
+    </li>
1002
+  
1003
+
1004
+    
1005
+      
1006
+      
1007
+  
1008
+  
1009
+  
1010
+  
1011
+    <li class="md-nav__item">
1012
+      <a href="../changelog/" class="md-nav__link">
1013
+        
1014
+  
1015
+  <span class="md-ellipsis">
1016
+    Changelog
1017
+  </span>
1018
+  
1019
+
1020
+      </a>
1021
+    </li>
1022
+  
1023
+
1024
+    
1025
+  </ul>
1026
+</nav>
1027
+                  </div>
1028
+                </div>
1029
+              </div>
1030
+            
1031
+            
1032
+              
1033
+              <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
1034
+                <div class="md-sidebar__scrollwrap">
1035
+                  <div class="md-sidebar__inner">
1036
+                    
1037
+
1038
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1039
+  
1040
+  
1041
+  
1042
+  
1043
+</nav>
1044
+                  </div>
1045
+                </div>
1046
+              </div>
1047
+            
1048
+          
1049
+          
1050
+            <div class="md-content" data-md-component="content">
1051
+              <article class="md-content__inner md-typeset">
1052
+                
1053
+                  
1054
+
1055
+  
1056
+  
1057
+    
1058
+      
1059
+    
1060
+    <a href="https://github.com/the-13th-letter/derivepassphrase/raw/master/docs/explanation/index.md" title="View source of this page" class="md-content__button md-icon">
1061
+      
1062
+      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
1063
+    </a>
1064
+  
1065
+
1066
+
1067
+  <h1>Explanation overview</h1>
1068
+
1069
+<ul>
1070
+<li><a href="faq-altered-versions/">How to comply with the &ldquo;altered versions&rdquo; clause of the
1071
+  license</a></li>
1072
+</ul>
1073
+
1074
+
1075
+
1076
+
1077
+
1078
+
1079
+
1080
+  
1081
+  
1082
+
1083
+
1084
+
1085
+
1086
+
1087
+
1088
+                
1089
+              </article>
1090
+            </div>
1091
+          
1092
+          
1093
+        </div>
1094
+        
1095
+      </main>
1096
+      
1097
+        <footer class="md-footer">
1098
+  
1099
+    
1100
+      
1101
+      <nav class="md-footer__inner md-grid" aria-label="Footer" >
1102
+        
1103
+          
1104
+          <a href="../reference/prerequisites-ssh-key/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Using derivepassphrase vault with an SSH key">
1105
+            <div class="md-footer__button md-icon">
1106
+              
1107
+              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
1108
+            </div>
1109
+            <div class="md-footer__title">
1110
+              <span class="md-footer__direction">
1111
+                Previous
1112
+              </span>
1113
+              <div class="md-ellipsis">
1114
+                Using derivepassphrase vault with an SSH key
1115
+              </div>
1116
+            </div>
1117
+          </a>
1118
+        
1119
+        
1120
+          
1121
+          <a href="faq-altered-versions/" class="md-footer__link md-footer__link--next" aria-label="Next: &#34;altered versions&#34; license requirement">
1122
+            <div class="md-footer__title">
1123
+              <span class="md-footer__direction">
1124
+                Next
1125
+              </span>
1126
+              <div class="md-ellipsis">
1127
+                "altered versions" license requirement
1128
+              </div>
1129
+            </div>
1130
+            <div class="md-footer__button md-icon">
1131
+              
1132
+              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
1133
+            </div>
1134
+          </a>
1135
+        
1136
+      </nav>
1137
+    
1138
+  
1139
+  <div class="md-footer-meta md-typeset">
1140
+    <div class="md-footer-meta__inner md-grid">
1141
+      <div class="md-copyright">
1142
+  
1143
+    <div class="md-copyright__highlight">
1144
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1145
+    </div>
1146
+  
1147
+  
1148
+    Made with
1149
+    <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
1150
+      Material for MkDocs
1151
+    </a>
1152
+    and
1153
+    <a href="https://mkdocstrings.github.io/python/" target="_blank" rel="noopener">
1154
+        mkdocstrings-python
1155
+    </a>
1156
+  
1157
+</div>
1158
+      
1159
+    </div>
1160
+  </div>
1161
+</footer>
1162
+      
1163
+    </div>
1164
+    <div class="md-dialog" data-md-component="dialog">
1165
+      <div class="md-dialog__inner md-typeset"></div>
1166
+    </div>
1167
+    
1168
+    
1169
+    
1170
+    
1171
+  </body>
1172
+</html>
0 1173
\ No newline at end of file
... ...
@@ -169,6 +169,26 @@
169 169
   
170 170
   
171 171
   
172
+    
173
+    
174
+      <li class="md-tabs__item">
175
+        <a href="../explanation/" class="md-tabs__link">
176
+          
177
+  
178
+    
179
+  
180
+  Design & Background
181
+
182
+        </a>
183
+      </li>
184
+    
185
+  
186
+
187
+      
188
+        
189
+  
190
+  
191
+  
172 192
     <li class="md-tabs__item">
173 193
       <a href="../changelog/" class="md-tabs__link">
174 194
         
... ...
@@ -902,6 +922,92 @@
902 922
   
903 923
   
904 924
   
925
+    
926
+    
927
+      
928
+        
929
+          
930
+        
931
+      
932
+        
933
+      
934
+    
935
+    
936
+      
937
+      
938
+        
939
+      
940
+    
941
+    
942
+    <li class="md-nav__item md-nav__item--nested">
943
+      
944
+        
945
+        
946
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
947
+        
948
+          
949
+          
950
+          <div class="md-nav__link md-nav__container">
951
+            <a href="../explanation/" class="md-nav__link ">
952
+              
953
+  
954
+  <span class="md-ellipsis">
955
+    Design & Background
956
+  </span>
957
+  
958
+
959
+            </a>
960
+            
961
+              
962
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
963
+                <span class="md-nav__icon md-icon"></span>
964
+              </label>
965
+            
966
+          </div>
967
+        
968
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
969
+          <label class="md-nav__title" for="__nav_5">
970
+            <span class="md-nav__icon md-icon"></span>
971
+            Design & Background
972
+          </label>
973
+          <ul class="md-nav__list" data-md-scrollfix>
974
+            
975
+              
976
+            
977
+              
978
+                
979
+  
980
+  
981
+  
982
+  
983
+    <li class="md-nav__item">
984
+      <a href="../explanation/faq-altered-versions/" class="md-nav__link">
985
+        
986
+  
987
+  <span class="md-ellipsis">
988
+    "altered versions" license requirement
989
+  </span>
990
+  
991
+
992
+      </a>
993
+    </li>
994
+  
995
+
996
+              
997
+            
998
+          </ul>
999
+        </nav>
1000
+      
1001
+    </li>
1002
+  
1003
+
1004
+    
1005
+      
1006
+      
1007
+  
1008
+  
1009
+  
1010
+  
905 1011
     <li class="md-nav__item">
906 1012
       <a href="../changelog/" class="md-nav__link">
907 1013
         
... ...
@@ -1034,7 +1140,7 @@
1034 1140
       <div class="md-copyright">
1035 1141
   
1036 1142
     <div class="md-copyright__highlight">
1037
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
1143
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1038 1144
     </div>
1039 1145
   
1040 1146
   
... ...
@@ -174,6 +174,26 @@
174 174
   
175 175
   
176 176
   
177
+    
178
+    
179
+      <li class="md-tabs__item">
180
+        <a href="../../explanation/" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
177 197
     <li class="md-tabs__item">
178 198
       <a href="../../changelog/" class="md-tabs__link">
179 199
         
... ...
@@ -965,6 +985,92 @@
965 985
   
966 986
   
967 987
   
988
+    
989
+    
990
+      
991
+        
992
+          
993
+        
994
+      
995
+        
996
+      
997
+    
998
+    
999
+      
1000
+      
1001
+        
1002
+      
1003
+    
1004
+    
1005
+    <li class="md-nav__item md-nav__item--nested">
1006
+      
1007
+        
1008
+        
1009
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1010
+        
1011
+          
1012
+          
1013
+          <div class="md-nav__link md-nav__container">
1014
+            <a href="../../explanation/" class="md-nav__link ">
1015
+              
1016
+  
1017
+  <span class="md-ellipsis">
1018
+    Design & Background
1019
+  </span>
1020
+  
1021
+
1022
+            </a>
1023
+            
1024
+              
1025
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1026
+                <span class="md-nav__icon md-icon"></span>
1027
+              </label>
1028
+            
1029
+          </div>
1030
+        
1031
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1032
+          <label class="md-nav__title" for="__nav_5">
1033
+            <span class="md-nav__icon md-icon"></span>
1034
+            Design & Background
1035
+          </label>
1036
+          <ul class="md-nav__list" data-md-scrollfix>
1037
+            
1038
+              
1039
+            
1040
+              
1041
+                
1042
+  
1043
+  
1044
+  
1045
+  
1046
+    <li class="md-nav__item">
1047
+      <a href="../../explanation/faq-altered-versions/" class="md-nav__link">
1048
+        
1049
+  
1050
+  <span class="md-ellipsis">
1051
+    "altered versions" license requirement
1052
+  </span>
1053
+  
1054
+
1055
+      </a>
1056
+    </li>
1057
+  
1058
+
1059
+              
1060
+            
1061
+          </ul>
1062
+        </nav>
1063
+      
1064
+    </li>
1065
+  
1066
+
1067
+    
1068
+      
1069
+      
1070
+  
1071
+  
1072
+  
1073
+  
968 1074
     <li class="md-nav__item">
969 1075
       <a href="../../changelog/" class="md-nav__link">
970 1076
         
... ...
@@ -1214,7 +1320,7 @@ section &ldquo;Should I use one master SSH key, or many keys?&rdquo; (TODO)</p>
1214 1320
       <div class="md-copyright">
1215 1321
   
1216 1322
     <div class="md-copyright__highlight">
1217
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
1323
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1218 1324
     </div>
1219 1325
   
1220 1326
   
... ...
@@ -172,6 +172,26 @@
172 172
   
173 173
   
174 174
   
175
+    
176
+    
177
+      <li class="md-tabs__item">
178
+        <a href="explanation/" class="md-tabs__link">
179
+          
180
+  
181
+    
182
+  
183
+  Design & Background
184
+
185
+        </a>
186
+      </li>
187
+    
188
+  
189
+
190
+      
191
+        
192
+  
193
+  
194
+  
175 195
     <li class="md-tabs__item">
176 196
       <a href="changelog/" class="md-tabs__link">
177 197
         
... ...
@@ -1015,6 +1035,92 @@
1015 1035
   
1016 1036
   
1017 1037
   
1038
+    
1039
+    
1040
+      
1041
+        
1042
+          
1043
+        
1044
+      
1045
+        
1046
+      
1047
+    
1048
+    
1049
+      
1050
+      
1051
+        
1052
+      
1053
+    
1054
+    
1055
+    <li class="md-nav__item md-nav__item--nested">
1056
+      
1057
+        
1058
+        
1059
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1060
+        
1061
+          
1062
+          
1063
+          <div class="md-nav__link md-nav__container">
1064
+            <a href="explanation/" class="md-nav__link ">
1065
+              
1066
+  
1067
+  <span class="md-ellipsis">
1068
+    Design & Background
1069
+  </span>
1070
+  
1071
+
1072
+            </a>
1073
+            
1074
+              
1075
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1076
+                <span class="md-nav__icon md-icon"></span>
1077
+              </label>
1078
+            
1079
+          </div>
1080
+        
1081
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1082
+          <label class="md-nav__title" for="__nav_5">
1083
+            <span class="md-nav__icon md-icon"></span>
1084
+            Design & Background
1085
+          </label>
1086
+          <ul class="md-nav__list" data-md-scrollfix>
1087
+            
1088
+              
1089
+            
1090
+              
1091
+                
1092
+  
1093
+  
1094
+  
1095
+  
1096
+    <li class="md-nav__item">
1097
+      <a href="explanation/faq-altered-versions/" class="md-nav__link">
1098
+        
1099
+  
1100
+  <span class="md-ellipsis">
1101
+    "altered versions" license requirement
1102
+  </span>
1103
+  
1104
+
1105
+      </a>
1106
+    </li>
1107
+  
1108
+
1109
+              
1110
+            
1111
+          </ul>
1112
+        </nav>
1113
+      
1114
+    </li>
1115
+  
1116
+
1117
+    
1118
+      
1119
+      
1120
+  
1121
+  
1122
+  
1123
+  
1018 1124
     <li class="md-nav__item">
1019 1125
       <a href="changelog/" class="md-nav__link">
1020 1126
         
... ...
@@ -1219,7 +1325,7 @@ This choice can be made either specifically for the service (in this case, <code
1219 1325
 <span class="go">oXDGCvMhLWPQyCzYtaobOq2Wh9olYj</span>
1220 1326
 </code></pre></div>
1221 1327
 <h2 id="license">License<a class="headerlink" href="#license" title="Permanent link">&para;</a></h2>
1222
-<p><code>derivepassphrase</code> is distributed under the terms of the <a href="https://spdx.org/licenses/MIT.html">MIT</a> license.</p>
1328
+<p><code>derivepassphrase</code> is distributed under the terms of the <a href="https://spdx.org/licenses/Zlib.html">zlib/libpng license</a>.</p>
1223 1329
 
1224 1330
 
1225 1331
 
... ...
@@ -1272,7 +1378,7 @@ This choice can be made either specifically for the service (in this case, <code
1272 1378
       <div class="md-copyright">
1273 1379
   
1274 1380
     <div class="md-copyright__highlight">
1275
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
1381
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1276 1382
     </div>
1277 1383
   
1278 1384
   
... ...
@@ -174,6 +174,26 @@
174 174
   
175 175
   
176 176
   
177
+    
178
+    
179
+      <li class="md-tabs__item">
180
+        <a href="../../explanation/" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
177 197
     <li class="md-tabs__item">
178 198
       <a href="../../changelog/" class="md-tabs__link">
179 199
         
... ...
@@ -1012,6 +1032,92 @@
1012 1032
   
1013 1033
   
1014 1034
   
1035
+    
1036
+    
1037
+      
1038
+        
1039
+          
1040
+        
1041
+      
1042
+        
1043
+      
1044
+    
1045
+    
1046
+      
1047
+      
1048
+        
1049
+      
1050
+    
1051
+    
1052
+    <li class="md-nav__item md-nav__item--nested">
1053
+      
1054
+        
1055
+        
1056
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1057
+        
1058
+          
1059
+          
1060
+          <div class="md-nav__link md-nav__container">
1061
+            <a href="../../explanation/" class="md-nav__link ">
1062
+              
1063
+  
1064
+  <span class="md-ellipsis">
1065
+    Design & Background
1066
+  </span>
1067
+  
1068
+
1069
+            </a>
1070
+            
1071
+              
1072
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1073
+                <span class="md-nav__icon md-icon"></span>
1074
+              </label>
1075
+            
1076
+          </div>
1077
+        
1078
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1079
+          <label class="md-nav__title" for="__nav_5">
1080
+            <span class="md-nav__icon md-icon"></span>
1081
+            Design & Background
1082
+          </label>
1083
+          <ul class="md-nav__list" data-md-scrollfix>
1084
+            
1085
+              
1086
+            
1087
+              
1088
+                
1089
+  
1090
+  
1091
+  
1092
+  
1093
+    <li class="md-nav__item">
1094
+      <a href="../../explanation/faq-altered-versions/" class="md-nav__link">
1095
+        
1096
+  
1097
+  <span class="md-ellipsis">
1098
+    "altered versions" license requirement
1099
+  </span>
1100
+  
1101
+
1102
+      </a>
1103
+    </li>
1104
+  
1105
+
1106
+              
1107
+            
1108
+          </ul>
1109
+        </nav>
1110
+      
1111
+    </li>
1112
+  
1113
+
1114
+    
1115
+      
1116
+      
1117
+  
1118
+  
1119
+  
1120
+  
1015 1121
     <li class="md-nav__item">
1016 1122
       <a href="../../changelog/" class="md-nav__link">
1017 1123
         
... ...
@@ -1240,7 +1346,7 @@ password is interpreted as a UTF-8 byte string.</dd>
1240 1346
       <div class="md-copyright">
1241 1347
   
1242 1348
     <div class="md-copyright__highlight">
1243
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
1349
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1244 1350
     </div>
1245 1351
   
1246 1352
   
... ...
@@ -174,6 +174,26 @@
174 174
   
175 175
   
176 176
   
177
+    
178
+    
179
+      <li class="md-tabs__item">
180
+        <a href="../../explanation/" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
177 197
     <li class="md-tabs__item">
178 198
       <a href="../../changelog/" class="md-tabs__link">
179 199
         
... ...
@@ -1012,6 +1032,92 @@
1012 1032
   
1013 1033
   
1014 1034
   
1035
+    
1036
+    
1037
+      
1038
+        
1039
+          
1040
+        
1041
+      
1042
+        
1043
+      
1044
+    
1045
+    
1046
+      
1047
+      
1048
+        
1049
+      
1050
+    
1051
+    
1052
+    <li class="md-nav__item md-nav__item--nested">
1053
+      
1054
+        
1055
+        
1056
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1057
+        
1058
+          
1059
+          
1060
+          <div class="md-nav__link md-nav__container">
1061
+            <a href="../../explanation/" class="md-nav__link ">
1062
+              
1063
+  
1064
+  <span class="md-ellipsis">
1065
+    Design & Background
1066
+  </span>
1067
+  
1068
+
1069
+            </a>
1070
+            
1071
+              
1072
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1073
+                <span class="md-nav__icon md-icon"></span>
1074
+              </label>
1075
+            
1076
+          </div>
1077
+        
1078
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1079
+          <label class="md-nav__title" for="__nav_5">
1080
+            <span class="md-nav__icon md-icon"></span>
1081
+            Design & Background
1082
+          </label>
1083
+          <ul class="md-nav__list" data-md-scrollfix>
1084
+            
1085
+              
1086
+            
1087
+              
1088
+                
1089
+  
1090
+  
1091
+  
1092
+  
1093
+    <li class="md-nav__item">
1094
+      <a href="../../explanation/faq-altered-versions/" class="md-nav__link">
1095
+        
1096
+  
1097
+  <span class="md-ellipsis">
1098
+    "altered versions" license requirement
1099
+  </span>
1100
+  
1101
+
1102
+      </a>
1103
+    </li>
1104
+  
1105
+
1106
+              
1107
+            
1108
+          </ul>
1109
+        </nav>
1110
+      
1111
+    </li>
1112
+  
1113
+
1114
+    
1115
+      
1116
+      
1117
+  
1118
+  
1119
+  
1120
+  
1015 1121
     <li class="md-nav__item">
1016 1122
       <a href="../../changelog/" class="md-nav__link">
1017 1123
         
... ...
@@ -1224,7 +1330,7 @@ subcommand must be specified explicitly.</p>
1224 1330
       <div class="md-copyright">
1225 1331
   
1226 1332
     <div class="md-copyright__highlight">
1227
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
1333
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1228 1334
     </div>
1229 1335
   
1230 1336
   
... ...
@@ -174,6 +174,26 @@
174 174
   
175 175
   
176 176
   
177
+    
178
+    
179
+      <li class="md-tabs__item">
180
+        <a href="../../explanation/" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
177 197
     <li class="md-tabs__item">
178 198
       <a href="../../changelog/" class="md-tabs__link">
179 199
         
... ...
@@ -657,9 +677,9 @@
657 677
       <ul class="md-nav__list">
658 678
         
659 679
           <li class="md-nav__item">
660
-  <a href="#password-generation" class="md-nav__link">
680
+  <a href="#passphrase-generation" class="md-nav__link">
661 681
     <span class="md-ellipsis">
662
-      Password generation
682
+      Passphrase generation
663 683
     </span>
664 684
   </a>
665 685
   
... ...
@@ -681,6 +701,15 @@
681 701
     </span>
682 702
   </a>
683 703
   
704
+</li>
705
+        
706
+          <li class="md-nav__item">
707
+  <a href="#compatibility-and-extension-options" class="md-nav__link">
708
+    <span class="md-ellipsis">
709
+      Compatibility and extension options
710
+    </span>
711
+  </a>
712
+  
684 713
 </li>
685 714
         
686 715
           <li class="md-nav__item">
... ...
@@ -698,12 +727,123 @@
698 727
 </li>
699 728
       
700 729
         <li class="md-nav__item">
701
-  <a href="#warnings" class="md-nav__link">
730
+  <a href="#shell-script-export-format" class="md-nav__link">
731
+    <span class="md-ellipsis">
732
+      SHELL SCRIPT EXPORT FORMAT
733
+    </span>
734
+  </a>
735
+  
736
+</li>
737
+      
738
+        <li class="md-nav__item">
739
+  <a href="#ssh-key-suitability" class="md-nav__link">
740
+    <span class="md-ellipsis">
741
+      SSH KEY SUITABILITY
742
+    </span>
743
+  </a>
744
+  
745
+</li>
746
+      
747
+        <li class="md-nav__item">
748
+  <a href="#environment" class="md-nav__link">
749
+    <span class="md-ellipsis">
750
+      ENVIRONMENT
751
+    </span>
752
+  </a>
753
+  
754
+</li>
755
+      
756
+        <li class="md-nav__item">
757
+  <a href="#files" class="md-nav__link">
758
+    <span class="md-ellipsis">
759
+      FILES
760
+    </span>
761
+  </a>
762
+  
763
+</li>
764
+      
765
+        <li class="md-nav__item">
766
+  <a href="#security" class="md-nav__link">
767
+    <span class="md-ellipsis">
768
+      SECURITY
769
+    </span>
770
+  </a>
771
+  
772
+</li>
773
+      
774
+        <li class="md-nav__item">
775
+  <a href="#examples" class="md-nav__link">
776
+    <span class="md-ellipsis">
777
+      EXAMPLES
778
+    </span>
779
+  </a>
780
+  
781
+</li>
782
+      
783
+        <li class="md-nav__item">
784
+  <a href="#diagnostics" class="md-nav__link">
785
+    <span class="md-ellipsis">
786
+      DIAGNOSTICS
787
+    </span>
788
+  </a>
789
+  
790
+    <nav class="md-nav" aria-label="DIAGNOSTICS">
791
+      <ul class="md-nav__list">
792
+        
793
+          <li class="md-nav__item">
794
+  <a href="#fatal-error-messsages-on-standard-error" class="md-nav__link">
795
+    <span class="md-ellipsis">
796
+      Fatal error messsages on standard error
797
+    </span>
798
+  </a>
799
+  
800
+</li>
801
+        
802
+          <li class="md-nav__item">
803
+  <a href="#non-fatal-warning-and-info-messages-on-standard-error" class="md-nav__link">
804
+    <span class="md-ellipsis">
805
+      Non-fatal warning and info messages on standard error
806
+    </span>
807
+  </a>
808
+  
809
+</li>
810
+        
811
+      </ul>
812
+    </nav>
813
+  
814
+</li>
815
+      
816
+        <li class="md-nav__item">
817
+  <a href="#compatibility" class="md-nav__link">
818
+    <span class="md-ellipsis">
819
+      COMPATIBILITY
820
+    </span>
821
+  </a>
822
+  
823
+    <nav class="md-nav" aria-label="COMPATIBILITY">
824
+      <ul class="md-nav__list">
825
+        
826
+          <li class="md-nav__item">
827
+  <a href="#with-other-software" class="md-nav__link">
828
+    <span class="md-ellipsis">
829
+      With other software
830
+    </span>
831
+  </a>
832
+  
833
+</li>
834
+        
835
+          <li class="md-nav__item">
836
+  <a href="#forward-and-backward-compatibility" class="md-nav__link">
702 837
     <span class="md-ellipsis">
703
-      WARNINGS
838
+      Forward and backward compatibility
704 839
     </span>
705 840
   </a>
706 841
   
842
+</li>
843
+        
844
+      </ul>
845
+    </nav>
846
+  
707 847
 </li>
708 848
       
709 849
         <li class="md-nav__item">
... ...
@@ -713,6 +853,24 @@
713 853
     </span>
714 854
   </a>
715 855
   
856
+</li>
857
+      
858
+        <li class="md-nav__item">
859
+  <a href="#author" class="md-nav__link">
860
+    <span class="md-ellipsis">
861
+      AUTHOR
862
+    </span>
863
+  </a>
864
+  
865
+</li>
866
+      
867
+        <li class="md-nav__item">
868
+  <a href="#bugs" class="md-nav__link">
869
+    <span class="md-ellipsis">
870
+      BUGS
871
+    </span>
872
+  </a>
873
+  
716 874
 </li>
717 875
       
718 876
     </ul>
... ...
@@ -1054,6 +1212,92 @@
1054 1212
   
1055 1213
   
1056 1214
   
1215
+    
1216
+    
1217
+      
1218
+        
1219
+          
1220
+        
1221
+      
1222
+        
1223
+      
1224
+    
1225
+    
1226
+      
1227
+      
1228
+        
1229
+      
1230
+    
1231
+    
1232
+    <li class="md-nav__item md-nav__item--nested">
1233
+      
1234
+        
1235
+        
1236
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1237
+        
1238
+          
1239
+          
1240
+          <div class="md-nav__link md-nav__container">
1241
+            <a href="../../explanation/" class="md-nav__link ">
1242
+              
1243
+  
1244
+  <span class="md-ellipsis">
1245
+    Design & Background
1246
+  </span>
1247
+  
1248
+
1249
+            </a>
1250
+            
1251
+              
1252
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1253
+                <span class="md-nav__icon md-icon"></span>
1254
+              </label>
1255
+            
1256
+          </div>
1257
+        
1258
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1259
+          <label class="md-nav__title" for="__nav_5">
1260
+            <span class="md-nav__icon md-icon"></span>
1261
+            Design & Background
1262
+          </label>
1263
+          <ul class="md-nav__list" data-md-scrollfix>
1264
+            
1265
+              
1266
+            
1267
+              
1268
+                
1269
+  
1270
+  
1271
+  
1272
+  
1273
+    <li class="md-nav__item">
1274
+      <a href="../../explanation/faq-altered-versions/" class="md-nav__link">
1275
+        
1276
+  
1277
+  <span class="md-ellipsis">
1278
+    "altered versions" license requirement
1279
+  </span>
1280
+  
1281
+
1282
+      </a>
1283
+    </li>
1284
+  
1285
+
1286
+              
1287
+            
1288
+          </ul>
1289
+        </nav>
1290
+      
1291
+    </li>
1292
+  
1293
+
1294
+    
1295
+      
1296
+      
1297
+  
1298
+  
1299
+  
1300
+  
1057 1301
     <li class="md-nav__item">
1058 1302
       <a href="../../changelog/" class="md-nav__link">
1059 1303
         
... ...
@@ -1132,9 +1376,9 @@
1132 1376
       <ul class="md-nav__list">
1133 1377
         
1134 1378
           <li class="md-nav__item">
1135
-  <a href="#password-generation" class="md-nav__link">
1379
+  <a href="#passphrase-generation" class="md-nav__link">
1136 1380
     <span class="md-ellipsis">
1137
-      Password generation
1381
+      Passphrase generation
1138 1382
     </span>
1139 1383
   </a>
1140 1384
   
... ...
@@ -1156,6 +1400,15 @@
1156 1400
     </span>
1157 1401
   </a>
1158 1402
   
1403
+</li>
1404
+        
1405
+          <li class="md-nav__item">
1406
+  <a href="#compatibility-and-extension-options" class="md-nav__link">
1407
+    <span class="md-ellipsis">
1408
+      Compatibility and extension options
1409
+    </span>
1410
+  </a>
1411
+  
1159 1412
 </li>
1160 1413
         
1161 1414
           <li class="md-nav__item">
... ...
@@ -1173,12 +1426,123 @@
1173 1426
 </li>
1174 1427
       
1175 1428
         <li class="md-nav__item">
1176
-  <a href="#warnings" class="md-nav__link">
1429
+  <a href="#shell-script-export-format" class="md-nav__link">
1177 1430
     <span class="md-ellipsis">
1178
-      WARNINGS
1431
+      SHELL SCRIPT EXPORT FORMAT
1179 1432
     </span>
1180 1433
   </a>
1181 1434
   
1435
+</li>
1436
+      
1437
+        <li class="md-nav__item">
1438
+  <a href="#ssh-key-suitability" class="md-nav__link">
1439
+    <span class="md-ellipsis">
1440
+      SSH KEY SUITABILITY
1441
+    </span>
1442
+  </a>
1443
+  
1444
+</li>
1445
+      
1446
+        <li class="md-nav__item">
1447
+  <a href="#environment" class="md-nav__link">
1448
+    <span class="md-ellipsis">
1449
+      ENVIRONMENT
1450
+    </span>
1451
+  </a>
1452
+  
1453
+</li>
1454
+      
1455
+        <li class="md-nav__item">
1456
+  <a href="#files" class="md-nav__link">
1457
+    <span class="md-ellipsis">
1458
+      FILES
1459
+    </span>
1460
+  </a>
1461
+  
1462
+</li>
1463
+      
1464
+        <li class="md-nav__item">
1465
+  <a href="#security" class="md-nav__link">
1466
+    <span class="md-ellipsis">
1467
+      SECURITY
1468
+    </span>
1469
+  </a>
1470
+  
1471
+</li>
1472
+      
1473
+        <li class="md-nav__item">
1474
+  <a href="#examples" class="md-nav__link">
1475
+    <span class="md-ellipsis">
1476
+      EXAMPLES
1477
+    </span>
1478
+  </a>
1479
+  
1480
+</li>
1481
+      
1482
+        <li class="md-nav__item">
1483
+  <a href="#diagnostics" class="md-nav__link">
1484
+    <span class="md-ellipsis">
1485
+      DIAGNOSTICS
1486
+    </span>
1487
+  </a>
1488
+  
1489
+    <nav class="md-nav" aria-label="DIAGNOSTICS">
1490
+      <ul class="md-nav__list">
1491
+        
1492
+          <li class="md-nav__item">
1493
+  <a href="#fatal-error-messsages-on-standard-error" class="md-nav__link">
1494
+    <span class="md-ellipsis">
1495
+      Fatal error messsages on standard error
1496
+    </span>
1497
+  </a>
1498
+  
1499
+</li>
1500
+        
1501
+          <li class="md-nav__item">
1502
+  <a href="#non-fatal-warning-and-info-messages-on-standard-error" class="md-nav__link">
1503
+    <span class="md-ellipsis">
1504
+      Non-fatal warning and info messages on standard error
1505
+    </span>
1506
+  </a>
1507
+  
1508
+</li>
1509
+        
1510
+      </ul>
1511
+    </nav>
1512
+  
1513
+</li>
1514
+      
1515
+        <li class="md-nav__item">
1516
+  <a href="#compatibility" class="md-nav__link">
1517
+    <span class="md-ellipsis">
1518
+      COMPATIBILITY
1519
+    </span>
1520
+  </a>
1521
+  
1522
+    <nav class="md-nav" aria-label="COMPATIBILITY">
1523
+      <ul class="md-nav__list">
1524
+        
1525
+          <li class="md-nav__item">
1526
+  <a href="#with-other-software" class="md-nav__link">
1527
+    <span class="md-ellipsis">
1528
+      With other software
1529
+    </span>
1530
+  </a>
1531
+  
1532
+</li>
1533
+        
1534
+          <li class="md-nav__item">
1535
+  <a href="#forward-and-backward-compatibility" class="md-nav__link">
1536
+    <span class="md-ellipsis">
1537
+      Forward and backward compatibility
1538
+    </span>
1539
+  </a>
1540
+  
1541
+</li>
1542
+        
1543
+      </ul>
1544
+    </nav>
1545
+  
1182 1546
 </li>
1183 1547
       
1184 1548
         <li class="md-nav__item">
... ...
@@ -1188,6 +1552,24 @@
1188 1552
     </span>
1189 1553
   </a>
1190 1554
   
1555
+</li>
1556
+      
1557
+        <li class="md-nav__item">
1558
+  <a href="#author" class="md-nav__link">
1559
+    <span class="md-ellipsis">
1560
+      AUTHOR
1561
+    </span>
1562
+  </a>
1563
+  
1564
+</li>
1565
+      
1566
+        <li class="md-nav__item">
1567
+  <a href="#bugs" class="md-nav__link">
1568
+    <span class="md-ellipsis">
1569
+      BUGS
1570
+    </span>
1571
+  </a>
1572
+  
1191 1573
 </li>
1192 1574
       
1193 1575
     </ul>
... ...
@@ -1218,89 +1600,425 @@
1218 1600
 
1219 1601
 <h1 id="derivepassphrase-vault1">derivepassphrase-vault(1)<a class="headerlink" href="#derivepassphrase-vault1" title="Permanent link">&para;</a></h1>
1220 1602
 <h2 id="name">NAME<a class="headerlink" href="#name" title="Permanent link">&para;</a></h2>
1221
-<p>derivepassphrase-vault – derive a passphrase using the vault(1)
1222
-derivation scheme</p>
1603
+<p>derivepassphrase-vault – derive a passphrase using the vault derivation scheme</p>
1223 1604
 <h2 id="synopsis">SYNOPSIS<a class="headerlink" href="#synopsis" title="Permanent link">&para;</a></h2>
1224
-<div class="highlight"><pre><span></span><code>derivepassphrase vault [OPTIONS] [SERVICE]
1225
-</code></pre></div>
1605
+<pre>
1606
+<code><b>derivepassphrase vault</b> [--phrase | --key] [--length <var>n</var>] [--repeat <var>n</var>] [--lower <var>n</var>] [--upper <var>n</var>] [--number <var>n</var>] [--space <var>n</var>] [--dash <var>n</var>] [--symbol <var>n</var>] <var>SERVICE</var></code>
1607
+<code><b>derivepassphrase vault</b> {--phrase | --key | … | --symbol <var>n</var>} … --config [--unset <var>setting</var> …] [--overwrite-existing | --merge-existing] [<var>SERVICE</var>]</code>
1608
+<code><b>derivepassphrase vault</b> {--notes <var>SERVICE</var> | --delete <var>SERVICE</var> | --delete-globals | --clear}</code>
1609
+<code><b>derivepassphrase vault</b> [--export-as {json | sh}] {--import <var>PATH</var> | --export <var>PATH</var>}</code>
1610
+</pre>
1611
+
1226 1612
 <h2 id="description">DESCRIPTION<a class="headerlink" href="#description" title="Permanent link">&para;</a></h2>
1227
-<p>Using a master passphrase or a master SSH key, derive a passphrase for
1228
-<i>SERVICE</i>, subject to length, character and character repetition
1229
-constraints.  The derivation is cryptographically strong, meaning that even
1230
-if a single passphrase is compromised, guessing the master passphrase or
1231
-a different service&rsquo;s passphrase is computationally infeasible.  The
1232
-derivation is also deterministic, given the same inputs, thus the resulting
1233
-passphrase need not be stored explicitly. The service name and constraints
1234
-themselves also need not be kept secret; the latter are usually stored in
1235
-a world-readable file.</p>
1236
-<p>If operating on global settings, or importing/exporting settings, then
1237
-<i>SERVICE</i> must be omitted.  Otherwise it is required.</p>
1613
+<p>Using a master passphrase, derive a passphrase for <var>SERVICE</var>, subject to length, character and character repetition constraints, in a manner compatible with James Coglan&rsquo;s <i>vault</i>(1).</p>
1614
+<p>The derivation is <em>strong</em>: derived passphrases have as much entropy as permitted by the master passphrase and the passphrase constraints (whichever is more restrictive), and even if multiple derived passphrases are compromised, the master passphrase remains cryptographically difficult to discern from these compromised passphrases.
1615
+The derivation is also <em>deterministic</em>, given the same inputs, thus the resulting passphrase need not be stored explicitly.</p>
1616
+<p>The service name and constraints themselves also need not be kept secret; the latter are usually stored in a world-readable file to ease repeated entry of passphrase constraints.</p>
1617
+<p>In lieu of a master passphrase, a master SSH key can also be used if there is a reachable, running SSH agent currently holding this key and if the key type is supported.  (See <a href="#ssh-key-suitability">&ldquo;SSH KEY SUITABILITY&rdquo;</a> and <a href="#bugs">&ldquo;BUGS&rdquo;</a> below.)  This too is compatible with <i>vault</i>(1).</p>
1238 1618
 <h2 id="options">OPTIONS<a class="headerlink" href="#options" title="Permanent link">&para;</a></h2>
1239
-<h3 id="password-generation">Password generation<a class="headerlink" href="#password-generation" title="Permanent link">&para;</a></h3>
1619
+<h3 id="passphrase-generation">Passphrase generation<a class="headerlink" href="#passphrase-generation" title="Permanent link">&para;</a></h3>
1620
+<p>The passphrase generation options can be divided into &ldquo;passphrase source&rdquo; options (<code>--phrase</code>, <code>--key</code>) and &ldquo;passphrase constraint&rdquo; options (all others).
1621
+The passphrase source options are mutually exclusive &mdash; you may only specify one of them &mdash; while the passphrase constraint options may be combined in any way.
1622
+The <var>SERVICE</var> is mandatory (see synopsis #1), unless the <code>--config</code> option is specified (see synopsis #2).
1623
+All character constraints refer to ASCII printable characters only (space (<code>U+0020</code>) to tilde (<code>U+007E</code>), excluding the grave accent (<code>U+0060</code>)).</p>
1240 1624
 <dl>
1241 1625
 <dt><b>-p</b>, <b>-</b><b>-phrase</b></dt>
1242
-<dd>prompts you for your passphrase</dd>
1626
+<dd>
1627
+<p>Prompt for a passphrase.</p>
1628
+<p>See also <a href="#configuration">&ldquo;Configuration&rdquo;</a> for how this interacts with a stored passphrase or SSH key.</p>
1629
+</dd>
1243 1630
 <dt><b>-k</b>, <b>-</b><b>-key</b></dt>
1244
-<dd>uses your SSH private key to generate passwords</dd>
1245
-<dt><b>-l</b>, <b>-</b><b>-length</b> <var>NUMBER</var></dt>
1246
-<dd>emits password of length <var>NUMBER</var></dd>
1247
-<dt><b>-r</b>, <b>-</b><b>-repeat</b> <var>NUMBER</var></dt>
1248
-<dd>allows maximum of <var>NUMBER</var> repeated adjacent chars</dd>
1249
-<dt><b>-</b><b>-lower</b> <var>NUMBER</var></dt>
1250
-<dd>includes at least <var>NUMBER</var> lowercase letters</dd>
1251
-<dt><b>-</b><b>-upper</b> <var>NUMBER</var></dt>
1252
-<dd>includes at least <var>NUMBER</var> uppercase letters</dd>
1253
-<dt><b>-</b><b>-number</b> <var>NUMBER</var></dt>
1254
-<dd>includes at least <var>NUMBER</var> digits</dd>
1255
-<dt><b>-</b><b>-space</b> <var>NUMBER</var></dt>
1256
-<dd>includes at least <var>NUMBER</var> spaces</dd>
1257
-<dt><b>-</b><b>-dash</b> <var>NUMBER</var></dt>
1258
-<dd>includes at least <var>NUMBER</var> <code>-</code> or <code>_</code></dd>
1259
-<dt><b>-</b><b>-symbol</b> <var>NUMBER</var></dt>
1260
-<dd>includes at least <var>NUMBER</var> symbol chars</dd>
1631
+<dd>
1632
+<p>Select an SSH key.</p>
1633
+<p>An SSH agent such as OpenSSH’s <i>ssh-agent</i>(1) or PuTTY’s <i>pageant</i>(1) must be running and accessible, and have the desired key loaded.
1634
+The SSH key must also be <i>suitable</i> for this purpose; see <a href="#ssh-key-suitability">&ldquo;SSH KEY SUITABILITY&rdquo;</a> for details.</p>
1635
+<p>See also <a href="#configuration">&ldquo;Configuration&rdquo;</a> for how this interacts with a stored passphrase or SSH key.</p>
1636
+</dd>
1637
+<dt><b>-l</b> <var>n</var>, <b>-</b><b>-length</b> <var>n</var></dt>
1638
+<dd>Force the passphrase to have the length <var>n</var>.
1639
+Defaults to the length <b>20</b> if not specified, or if explicitly specified as <code>0</code>.</dd>
1640
+<dt><b>-r</b> <var>n</var>, <b>-</b><b>-repeat</b> <var>n</var></dt>
1641
+<dd>Permit only runs of up to <var>n</var> consecutive occurrences of the same character.
1642
+Alternatively, forbid immediate additional repetitions of length <var>n</var> (or more) for any character in the derived passphrase.
1643
+Setting <var>n</var> = <code>0</code> disables repetition constraints, which is the default.</dd>
1644
+<dt><b>-</b><b>-lower</b> <var>n</var></dt>
1645
+<dd>Include at least <var>n</var> lowercase characters in the derived passphrase.
1646
+Setting <var>n</var> = <code>0</code> forbids these characters entirely.
1647
+The default is to not constrain the occurrences in any manner.</dd>
1648
+<dt><b>-</b><b>-upper</b> <var>n</var></dt>
1649
+<dd>Include at least <var>n</var> uppercase characters in the derived passphrase.
1650
+Setting <var>n</var> = <code>0</code> forbids these characters entirely.
1651
+The default is to not constrain the occurrences in any manner.</dd>
1652
+<dt><b>-</b><b>-number</b> <var>n</var></dt>
1653
+<dd>Include at least <var>n</var> digits in the derived passphrase.
1654
+Setting <var>n</var> = <code>0</code> forbids these characters entirely.
1655
+The default is to not constrain the occurrences in any manner.</dd>
1656
+<dt><b>-</b><b>-space</b> <var>n</var></dt>
1657
+<dd>Include at least <var>n</var> spaces in the derived passphrase.
1658
+Setting <var>n</var> = <code>0</code> forbids these characters entirely.
1659
+The default is to not constrain the occurrences in any manner.</dd>
1660
+<dt><b>-</b><b>-dash</b> <var>n</var></dt>
1661
+<dd>Include at least <var>n</var> &ldquo;dashes&rdquo; (<code>-</code> or <code>_</code>) in the derived passphrase.
1662
+Setting <var>n</var> = <code>0</code> forbids these characters entirely.
1663
+The default is to not constrain the occurrences in any manner.</dd>
1664
+<dt><b>-</b><b>-symbol</b> <var>n</var></dt>
1665
+<dd>Include at least <var>n</var> symbols (any of <code>!"#$%&amp;'()*+,./:;&lt;=&gt;?@[\]^{|}~-_</code>) in the derived passphrase.
1666
+Setting <var>n</var> = <code>0</code> forbids these characters entirely, effectively also implying <code>--dash 0</code>.
1667
+The default is to not constrain the occurrences in any manner.</dd>
1261 1668
 </dl>
1262
-<p>Use <var>NUMBER</var>=0, e.g. <code>--symbol 0</code>, to exclude a character type from
1263
-the output.</p>
1264 1669
 <h3 id="configuration">Configuration<a class="headerlink" href="#configuration" title="Permanent link">&para;</a></h3>
1670
+<p>The configuration options directly modify the stored settings: default settings, known services, and service-specific settings.
1671
+They are mutually exclusive; you may only specify one of them.
1672
+The <var>SERVICE</var> is mandatory for <code>--notes</code> and <code>--delete</code>, optional for <code>--config</code>, and forbidden for <code>--delete-globals</code> and <code>--clear</code> (see synopsis #2 and synopsis #3).</p>
1265 1673
 <dl>
1266 1674
 <dt><b>-n</b>, <b>-</b><b>-notes</b></dt>
1267
-<dd>spawn an editor to edit notes for <var>SERVICE</var></dd>
1675
+<dd>Spawn an editor to edit notes for <var>SERVICE</var>.
1676
+Use the <code>VISUAL</code> or <code>EDITOR</code> environment variables to configure the spawned editor.</dd>
1268 1677
 <dt><b>-c</b>, <b>-</b><b>-config</b></dt>
1269
-<dd>saves the given settings for <var>SERVICE</var> or global</dd>
1678
+<dd>
1679
+<p>Save the given settings for <var>SERVICE</var> (if given), or save the given settings as global default settings.</p>
1680
+<p>See the <a href="#passphrase-generation">&ldquo;Passphrase generation&rdquo;</a> and <a href="#compatibility-and-extension-options">&ldquo;Compatibility and extension options&rdquo;</a> sections for other options compatible with <code>--config</code>.</p>
1681
+<div class="admonition danger">
1682
+<p class="admonition-title">Danger</p>
1683
+<p>Do <strong>not</strong> use the <code>--phrase</code> and <code>--config</code> options together.
1684
+The configuration is assumed to <em>not contain sensitive contents</em>, and is <em>not encrypted</em>.</p>
1685
+</div>
1686
+</dd>
1270 1687
 <dt><b>-x</b>, <b>-</b><b>-delete</b></dt>
1271
-<dd>deletes settings for <var>SERVICE</var></dd>
1688
+<dd>Delete all stored settings for <var>SERVICE</var>.</dd>
1272 1689
 <dt><b>-</b><b>-delete-globals</b></dt>
1273
-<dd>deletes the global shared settings</dd>
1690
+<dd>Delete all stored global default settings.</dd>
1274 1691
 <dt><b>-X</b>, <b>-</b><b>-clear</b></dt>
1275
-<dd>deletes all settings</dd>
1692
+<dd>Delete all stored settings.</dd>
1276 1693
 </dl>
1277
-<p>Use <code>$VISUAL</code> or <code>$EDITOR</code> to configure the spawned editor.</p>
1278 1694
 <h3 id="storage-management">Storage management<a class="headerlink" href="#storage-management" title="Permanent link">&para;</a></h3>
1695
+<p>The storage management options deal with importing and exporting the stored settings.
1696
+They are mutually exclusive; you may only specify one of them.
1697
+Using <code>-</code> as <var>PATH</var> for standard input/standard output is supported.</p>
1698
+<dl>
1699
+<dt><b>-e</b> <var>PATH</var>, <b>-</b><b>-export</b> <var>PATH</var></dt>
1700
+<dd>Export all saved settings into file <var>PATH</var>.</dd>
1701
+<dt><b>-i</b> <var>PATH</var>, <b>-</b><b>-import</b> <var>PATH</var></dt>
1702
+<dd>Import saved settings from file <var>PATH</var>.</dd>
1703
+</dl>
1704
+<h3 id="compatibility-and-extension-options">Compatibility and extension options<a class="headerlink" href="#compatibility-and-extension-options" title="Permanent link">&para;</a></h3>
1705
+<p>By default, <b>derivepassphrase vault</b> behaves in a manner compatible with <i>vault</i>(1).
1706
+The compatibility and extension options modify the behavior to enable additional functionality, or specifically to force compatibility.</p>
1707
+<p><i>vault</i>(1) supports none of these options, and behaves as if the option had not been given or had been left in its default state.</p>
1279 1708
 <dl>
1280
-<dt><b>-e</b>, <b>-</b><b>-export</b> <var>PATH</var></dt>
1281
-<dd>export all saved settings into file <var>PATH</var></dd>
1282
-<dt><b>-i</b>, <b>-</b><b>-import</b> <var>PATH</var></dt>
1283
-<dd>import saved settings from file <var>PATH</var></dd>
1709
+<dt><b>-</b><b>-overwrite-existing</b> / <b>-</b><b>-merge-existing</b></dt>
1710
+<dd>
1711
+<p>When importing a configuration via <code>--import</code>, or configuring the settings via <code>--config</code>, overwrite or merge (<em>default</em>) the existing configuration.</p>
1712
+<p>If overwriting the configuration, then the whole configuration (for <code>--import</code>) or the respective section (service-specific or global, for <code>--config</code>), will be written from scratch.
1713
+If merging, then each section (service-specific or global, for <code>--import</code>) or each singular setting (for <code>--config</code>) will be overwritten, but other unaffected settings/sections will not.</p>
1714
+<p>(<i>vault</i>(1) behaves as if <code>--merge-existing</code> were always given.)</p>
1715
+</dd>
1716
+<dt><b>-</b><b>-unset</b> <var>setting</var></dt>
1717
+<dd>
1718
+<p>When configuring via <code>--config</code>, also unset the specified <var>setting</var>, where <var>setting</var> is one of the passphrase generation settings (<code>phrase</code>, <code>key</code>, <code>lower</code>, …).
1719
+May be specified multiple times.
1720
+Must not overlap with any of the settings being set afterwards.</p>
1721
+<p>(vault(1) does not support this option.)</p>
1722
+</dd>
1723
+<dt><b>-</b><b>-export-as</b> { <b>json</b> | <b>sh</b> }</dt>
1724
+<dd>
1725
+<p>When exporting the configuration via <code>--export</code>, export as JSON (default) or as a shell script in <i>sh</i>(1) format.</p>
1726
+<p>The JSON format is compatible with <i>vault</i>(1).
1727
+For the shell script format, see the <a href="#shell-script-export-format">&ldquo;SHELL SCRIPT EXPORT FORMAT&rdquo;</a> section for details.</p>
1728
+<p>(vault(1) behaves as if <code>--export-as json</code> were always given.)</p>
1729
+</dd>
1284 1730
 </dl>
1285
-<p>Using <code>-</code> as <var>PATH</var> for standard input/standard output is supported.</p>
1286 1731
 <h3 id="other-options">Other Options<a class="headerlink" href="#other-options" title="Permanent link">&para;</a></h3>
1287 1732
 <dl>
1288
-<dt><b>&ndash;version</b></dt>
1733
+<dt><b>-</b><b>-version</b></dt>
1289 1734
 <dd>Show the version and exit.</dd>
1290 1735
 <dt><b>-h</b>, <b>-</b><b>-help</b></dt>
1291
-<dd>Show this message and exit.</dd>
1736
+<dd>Show a help message and exit.</dd>
1292 1737
 </dl>
1293
-<h2 id="warnings">WARNINGS<a class="headerlink" href="#warnings" title="Permanent link">&para;</a></h2>
1294
-<p>There is <strong>no way</strong> to retrieve the generated passphrases if the master
1295
-passphrase, the SSH key, or the exact passphrase settings are lost,
1296
-short of trying out all possible combinations.  You are <strong>strongly</strong>
1297
-advised to keep independent backups of the settings and the SSH key, if
1298
-any.</p>
1299
-<p>The configuration is <strong>not</strong> encrypted, and you are <strong>strongly</strong>
1300
-discouraged from using a stored passphrase.</p>
1738
+<h2 id="shell-script-export-format">SHELL SCRIPT EXPORT FORMAT<a class="headerlink" href="#shell-script-export-format" title="Permanent link">&para;</a></h2>
1739
+<p>If the shell script export format is selected, the configuration will be exported as a POSIX <i>sh</i>(1) script, containing calls to <b>derivepassphrase vault</b> to reconstruct the current configuration from scratch.
1740
+The script assumes a conforming <i>sh</i>(1), with support for &ldquo;here&rdquo; documents.</p>
1741
+<div class="admonition danger">
1742
+<p class="admonition-title">Danger</p>
1743
+<p><strong>Do not run these emitted shell scripts directly without double-checking their output first!</strong></p>
1744
+</div>
1745
+<h2 id="ssh-key-suitability">SSH KEY SUITABILITY<a class="headerlink" href="#ssh-key-suitability" title="Permanent link">&para;</a></h2>
1746
+<p>An SSH key is <dfn>suitable</dfn> for use with <b>derivepassphrase vault</b> if the SSH agent guarantees that signatures produced with this key will be <em>deterministic</em>, given the same message to be signed.
1747
+This is a property specific to the key type, and sometimes the agent used:</p>
1748
+<ul>
1749
+<li>
1750
+<p>RSA, Ed25519 and Ed448 keys are always suitable.
1751
+    OpenSSH’s <i>ssh-agent</i>(1) supports only these keys as suitable keys.</p>
1752
+</li>
1753
+<li>
1754
+<p>DSA and ECDSA keys are suitable if the SSH agent supports deterministic DSA signatures, e.g. by implementing RFC 6979.
1755
+    PuTTY’s <i>pageant</i>(1) supports this, in addition to the always-suitable keys mentioned above.</p>
1756
+</li>
1757
+</ul>
1758
+<h2 id="environment">ENVIRONMENT<a class="headerlink" href="#environment" title="Permanent link">&para;</a></h2>
1759
+<dl>
1760
+<dt><code>VISUAL</code>, <code>EDITOR</code></dt>
1761
+<dd><b>derivepassphrase vault</b> uses this editor to edit service notes when called with <code>--notes</code>.
1762
+<code>VISUAL</code> has higher precedence than <code>EDITOR</code>.</dd>
1763
+<dt><code>DERIVEPASSPHRASE_PATH</code></dt>
1764
+<dd><b>derivepassphrase</b> stores its configuration files and data in this directory.
1765
+Defaults to <code>~/.derivepassphrase</code>.</dd>
1766
+</dl>
1767
+<h2 id="files">FILES<a class="headerlink" href="#files" title="Permanent link">&para;</a></h2>
1768
+<dl>
1769
+<dt><code>$DERIVEPASSPHRASE_PATH/vault.json</code></dt>
1770
+<dd>The stored configuration for <b>derivepassphrase vault</b>: the default passphrase generation settings, the known service names, and the service-specific settings.
1771
+This file is <em>not</em> intended for the user to edit.</dd>
1772
+</dl>
1773
+<h2 id="security">SECURITY<a class="headerlink" href="#security" title="Permanent link">&para;</a></h2>
1774
+<div class="admonition danger">
1775
+<p class="admonition-title">Danger</p>
1776
+<ul>
1777
+<li>
1778
+<p>There is <strong>no way</strong> to retrieve the generated passphrases if the master passphrase, the SSH key, or the exact passphrase settings are lost, short of trying out all possible combinations.
1779
+    You are <strong>strongly</strong> advised to keep independent backups of the settings and the SSH key, if any.</p>
1780
+</li>
1781
+<li>
1782
+<p>The configuration is <strong>not</strong> encrypted, and you are <strong>strongly</strong> discouraged from using a stored passphrase.</p>
1783
+</li>
1784
+<li>
1785
+<p>You are <strong>strongly</strong> advised to avoid the (shell script) configuration export format if possible, and use the JSON format instead.
1786
+    If you <em>must</em> use the shell script format, then <strong>always</strong> validate the export before attempting to interpret or run it.</p>
1787
+</li>
1788
+</ul>
1789
+</div>
1790
+<h2 id="examples">EXAMPLES<a class="headerlink" href="#examples" title="Permanent link">&para;</a></h2>
1791
+<details class="example">
1792
+<summary><code>derivepassphrase vault --phrase email</code></summary>
1793
+<p>Prompt for a master passphrase, then generate a standard passphrase (length 20, no character or repetition constraints) for the &ldquo;email&rdquo; service.</p>
1794
+</details>
1795
+<details class="example">
1796
+<summary><code>derivepassphrase vault --key --upper 9 --lower 9 example.com</code></summary>
1797
+<p>Select an SSH key from the available suitable SSH keys in the running SSH agent, then generate a passphrase for the <code>example.com</code> service using the previously selected SSH key.
1798
+The passphrase will have (standard) length 20, and at least nine characters will be uppercase characters and at least another nine characters will be lowercase characters.</p>
1799
+</details>
1800
+<details class="example">
1801
+<summary><code>derivepassphrase example.com vault --key --upper 9 --lower 9 --number 9</code></summary>
1802
+<p>Attempt to generate a passphrase as in the previous example.
1803
+This example will <em>error out</em>, because the passphrase constraints require at least 27 characters and the standard passphrase length 20 cannot accomodate this.</p>
1804
+</details>
1805
+<details class="example">
1806
+<summary><code>derivepassphrase --config vault --key --upper 9 --lower 9 --space 2</code></summary>
1807
+<p>After selecting an SSH key, configure the default settings to use exactly nine uppercase characters, nine lowercase characters, and two spaces for each generated passphrase.
1808
+(The specific service settings, or the command-line invocation, can still override these settings.)</p>
1809
+</details>
1810
+<details class="example">
1811
+<summary><code>derivepassphrase vault example.com</code></summary>
1812
+<p>Because of the previous setting, the generated passphrase for the <code>example.com</code> service will behave as if <code>--key --upper 9 --lower 9 --space 2</code> had been specified during invocation (with the SSH key already having been selected).
1813
+In particular, it is neither necessary to specify <code>--phrase</code> or <code>--key</code> nor is it necessary to actually select an SSH key or to type in a master passphrase.</p>
1814
+</details>
1815
+<h2 id="diagnostics">DIAGNOSTICS<a class="headerlink" href="#diagnostics" title="Permanent link">&para;</a></h2>
1816
+<p>The <b>derivepassphrase vault</b> utility exits 0 on success, and &gt;0 if an error occurs.</p>
1817
+<h3 id="fatal-error-messsages-on-standard-error">Fatal error messsages on standard error<a class="headerlink" href="#fatal-error-messsages-on-standard-error" title="Permanent link">&para;</a></h3>
1818
+<p>(<code>%s</code> indicates a variable part of the message.)</p>
1819
+<details class="failure">
1820
+<summary><code>%s is mutually exclusive with %s.</code></summary>
1821
+<p>The two indicated options must not be used at the same time.</p>
1822
+</details>
1823
+<details class="failure">
1824
+<summary><code>%s requires a SERVICE or --config.</code></summary>
1825
+<p>Using the indicated passphrase generation option requires the <var>SERVICE</var> argument or the <code>--config</code> option.</p>
1826
+</details>
1827
+<details class="failure">
1828
+<summary><code>%s requires a SERVICE.</code></summary>
1829
+<p>Using the indicated option requires the <var>SERVICE</var> argument.</p>
1830
+</details>
1831
+<details class="failure">
1832
+<summary><code>%s does not take a SERVICE argument.</code></summary>
1833
+<p>The indicated option must not be specified together with the <var>SERVICE</var> argument.</p>
1834
+</details>
1835
+<details class="failure">
1836
+<summary><code>Cannot load vault settings: %s.</code></summary>
1837
+<p>There was a fatal problem loading the stored vault configuration data.
1838
+Further details are contained in the variable part of the message.</p>
1839
+</details>
1840
+<details class="failure">
1841
+<summary><code>Cannot store vault settings: %s.</code></summary>
1842
+<p>There was a fatal problem saving the vault configuration data.
1843
+Further details are contained in the variable part of the message.</p>
1844
+</details>
1845
+<details class="failure">
1846
+<summary><code>Cannot import vault settings: %s.</code></summary>
1847
+<p>There was a fatal problem loading the imported vault configuration data.
1848
+Further details are contained in the variable part of the message.</p>
1849
+</details>
1850
+<details class="failure">
1851
+<summary><code>Cannot export vault settings: %s.</code></summary>
1852
+<p>There was a fatal problem saving the exported vault configuration data.
1853
+Further details are contained in the variable part of the message.</p>
1854
+</details>
1855
+<details class="failure">
1856
+<summary><code>Cannot load user config: %s.</code></summary>
1857
+<p>There was a fatal problem loading the central user configuration file.
1858
+Further details are contained in the variable part of the message.</p>
1859
+</details>
1860
+<details class="failure">
1861
+<summary><code>The user configuration file is invalid.</code></summary>
1862
+<p>(Exactly what it says.)</p>
1863
+</details>
1864
+<details class="failure">
1865
+<summary><code>No usable SSH keys were found</code></summary>
1866
+<p>The running SSH agent does not contain any suitable SSH keys.</p>
1867
+</details>
1868
+<details class="failure">
1869
+<summary><code>No valid SSH key selected</code></summary>
1870
+<p>We requested that an SSH key be selected, but we got an invalid selection.</p>
1871
+</details>
1872
+<details class="failure">
1873
+<summary><code>The requested SSH key is not loaded into the agent.</code></summary>
1874
+<p>The running SSH agent does not contain the necessary SSH key.</p>
1875
+</details>
1876
+<details class="failure">
1877
+<summary><code>Cannot find any running SSH agent because SSH_AUTH_SOCK is not set.</code></summary>
1878
+<p>We require a running SSH agent, but cannot locate its communication channel, which is normally indicated by the <code>SSH_AUTH_SOCK</code> environment variable.</p>
1879
+</details>
1880
+<details class="failure">
1881
+<summary><code>Cannot connect to an SSH agent because this Python version does not support UNIX domain sockets.</code></summary>
1882
+<p>This Python installation does not support the communication mechanism necessary to talk to SSH agents.</p>
1883
+</details>
1884
+<details class="failure">
1885
+<summary><code>Cannot connect to the SSH agent: %s.</code></summary>
1886
+<p>We cannot connect to the SSH agent indicated by the <code>SSH_AUTH_SOCK</code> environment variable.
1887
+Further details are contained in the variable part of the message.</p>
1888
+</details>
1889
+<details class="failure">
1890
+<summary><code>The SSH agent failed to or refused to supply a list of loaded keys.</code></summary>
1891
+<p>The SSH agent&mdash;while responsive in principle&mdash;did not fulfill the request.</p>
1892
+</details>
1893
+<details class="failure">
1894
+<summary><code>The SSH agent failed to or refused to issue a signature with the selected key, necessary for deriving a service passphrase.</code></summary>
1895
+<p>The SSH agent&mdash;while responsive in principle&mdash;failed to cooperate with deriving a service passphrase from the selected master SSH key.</p>
1896
+</details>
1897
+<details class="failure">
1898
+<summary><code>The SSH agent contains no keys suitable for derivepassphrase.</code></summary>
1899
+<p>None of the keys loaded into the SSH agent (if any) are suitable for use with <b>derivepassphrase vault</b>.  See the <a href="#ssh-key-suitability">&ldquo;SSH KEY SUITABILITY&rdquo;</a> section for the requirements the SSH key and the SSH agent must fulfill to be suitable.</p>
1900
+</details>
1901
+<details class="failure">
1902
+<summary><code>Error communicating with the SSH agent</code></summary>
1903
+<p>There was a system error communicating with the SSH agent.</p>
1904
+</details>
1905
+<details class="failure">
1906
+<summary><code>Cannot understand the SSH agent's response because it violates the communication protocol.</code></summary>
1907
+<p>(Exactly what it says.)</p>
1908
+</details>
1909
+<details class="failure">
1910
+<summary><code>Not saving any new notes: the user aborted the request.</code></summary>
1911
+<p>(Exactly what it says.)</p>
1912
+</details>
1913
+<details class="failure">
1914
+<summary><code>Cannot update %s settings without actual settings.</code></summary>
1915
+<p>Using <code>--config</code> requires at least one of the <code>--phrase</code>, <code>--key</code>, <code>--length</code>, etc. options.</p>
1916
+</details>
1917
+<details class="failure">
1918
+<summary><code>Attempted to unset and set %s at the same time.</code></summary>
1919
+<p>While handling <code>--config</code>, the same configuration setting was passed as an option and as an argument to <code>--unset</code>.</p>
1920
+</details>
1921
+<details class="failure">
1922
+<summary><code>Generating a passphrase requires a SERVICE.</code></summary>
1923
+<p>(Exactly what it says.)</p>
1924
+</details>
1925
+<details class="failure">
1926
+<summary><code>No passphrase or key was given in the configuration.</code></summary>
1927
+<p><b>derivepassphrase vault</b> does not know whether to use a master SSH key or a master passphrase.</p>
1928
+</details>
1929
+<details class="failure">
1930
+<summary><code>No passphrase was given: the user aborted the request.</code></summary>
1931
+<p>(Exactly what it says.)</p>
1932
+</details>
1933
+<details class="failure">
1934
+<summary><code>No SSH key was selected: the user aborted the request.</code></summary>
1935
+<p>(Exactly what it says.)</p>
1936
+</details>
1937
+<h3 id="non-fatal-warning-and-info-messages-on-standard-error">Non-fatal warning and info messages on standard error<a class="headerlink" href="#non-fatal-warning-and-info-messages-on-standard-error" title="Permanent link">&para;</a></h3>
1938
+<p>(<code>%s</code> indicates a variable part of the message.)</p>
1939
+<details class="warning">
1940
+<summary><code>The %s passphrase is not %s-normalized.</code></summary>
1941
+<p>The indicated passphrase&mdash;as a Unicode string&mdash;is not properly normalized according to the preferred Unicode normalization form (as specified in the central configuration file).
1942
+It is therefore possible that the passphrase&mdash;as a byte string&mdash;is not the same byte string as you expect it to be (even though it <em>looks</em> correct), and that the derived passphrases thus do not match their expected values either.
1943
+Please double-check.</p>
1944
+</details>
1945
+<details class="warning">
1946
+<summary><code>An empty SERVICE is not supported by vault(1).</code></summary>
1947
+<p><i>vault</i>(1) does not support the empty string as a value for <var>SERVICE</var>; it will treat the <var>SERVICE</var> as missing.
1948
+For compatibility, <b>derivepassphrase vault</b> will do the same.
1949
+In particular, if the empty service is imported in a configuration via <code>--import</code>, then this service cannot be accessed via the <b>derivepassphrase vault</b> command-line.</p>
1950
+</details>
1951
+<details class="warning">
1952
+<summary><code>Replacing invalid value %s for key %s with %s.</code></summary>
1953
+<p>When importing a configuration, the indicated invalid value has been replaced with the indicated replacement value.
1954
+(The &ldquo;interpretation&rdquo; of the configuration doesn’t change).</p>
1955
+</details>
1956
+<details class="warning">
1957
+<summary><code>Removing ineffective setting %s = %s.</code></summary>
1958
+<p>When importing a configuration, the indicated ineffective setting has been removed.
1959
+(The &ldquo;interpretation&rdquo; of the configuration doesn’t change).</p>
1960
+</details>
1961
+<details class="warning">
1962
+<summary><code>The service name %s contains an ASCII control character, which is not supported by our shell completion code.</code></summary>
1963
+<p>Because of limitations in the shell completion code, this specific service name will not be available as a suggestion in tab completion.
1964
+(This <em>only</em> affects tab completion, not other functionality.)</p>
1965
+</details>
1966
+<details class="warning">
1967
+<summary><code>Setting a %s passphrase is ineffective because a key is also set.</code></summary>
1968
+<p>The configuration (global or key-specific) contains both a stored master passphrase and an SSH key.
1969
+The master passphrase will not take effect.</p>
1970
+</details>
1971
+<details class="warning">
1972
+<summary><code>A subcommand will be required in v1.0.</code></summary>
1973
+<p>[Since v0.2.0, until v1.0.]
1974
+This command now requires a subcommand.
1975
+For compatibility, it currently defaults to &ldquo;vault&rdquo;.</p>
1976
+</details>
1977
+<details class="warning">
1978
+<summary><code>Using deprecated v0.1-style config file %s, instead of v0.2-style %s.</code></summary>
1979
+<p>[Since v0.2.0, until v1.0.]
1980
+A configuration file has been renamed.
1981
+<b>derivepassphrase vault</b> will attempt to rename the file itself (<code>Successfully migrated to %s.</code>), or complain if it cannot rename it (<code>Failed to migrate to %s: %s</code>).</p>
1982
+</details>
1983
+<h2 id="compatibility">COMPATIBILITY<a class="headerlink" href="#compatibility" title="Permanent link">&para;</a></h2>
1984
+<h3 id="with-other-software">With other software<a class="headerlink" href="#with-other-software" title="Permanent link">&para;</a></h3>
1985
+<p><b>derivepassphrase vault</b> is <em>almost</em> drop-in compatible with James Coglan’s <i>vault</i>(1), version 0.3.0 (including &ldquo;storeroom&rdquo; support), meaning that each tool supports the same file formats and command-line arguments/options as the other one.</p>
1986
+<p>Exceptions:</p>
1987
+<ul>
1988
+<li>
1989
+<p><i>vault</i>(1) does not support the <a href="#compatibility-and-extension-options">&ldquo;Compatibility and extension options&rdquo;</a> listed above.</p>
1990
+</li>
1991
+<li>
1992
+<p><b>derivepassphrase vault</b> can import and generate configuration exports in the same format as <i>vault</i>(1), but it cannot <em>natively</em> read or write <i>vault</i>(1)&rsquo;s configuration file (non-storeroom) or configuration directory (storeroom).
1993
+    (The sister command <i>derivepassphrase-export</i>(1) can read both these formats and export the contents.)</p>
1994
+</li>
1995
+</ul>
1996
+<h3 id="forward-and-backward-compatibility">Forward and backward compatibility<a class="headerlink" href="#forward-and-backward-compatibility" title="Permanent link">&para;</a></h3>
1997
+<ul>
1998
+<li>[Since v0.2.0.]
1999
+    In v1.0, the commands <b>derivepassphrase</b> and <b>derivepassphrase export</b> will require an explicit subcommand name.
2000
+    Both default to the subcommand <b>vault</b>.</li>
2001
+<li>[Since v0.2.0.]
2002
+    In v1.0, the configuration data file for the <b>vault</b> subcommand will be named <code>vault.json</code>, instead of <code>config.json</code>.</li>
2003
+<li>[Since v0.2.0, to be removed in v1.0.]
2004
+    An existing configuration data file <code>config.json</code> will be attempted to be renamed to <code>vault.json</code>.</li>
2005
+</ul>
1301 2006
 <h2 id="see-also">SEE ALSO<a class="headerlink" href="#see-also" title="Permanent link">&para;</a></h2>
1302
-<p><a href="../derivepassphrase.1/">derivepassphrase(1)</a>,
1303
-<a href="https://www.npmjs.com/package/vault">vault(1)</a></p>
2007
+<p><a href="../derivepassphrase.1/"><i>derivepassphrase</i>(1)</a>,
2008
+<a href="https://www.chiark.greenend.org.uk/~sgtatham/putty/"><i>pageant</i>(1)</a>,
2009
+<a href="https://www.openssh.com/"><i>ssh-agent</i>(1)</a>,
2010
+<a href="https://www.npmjs.com/package/vault" title="James Coglan's 'vault'"><i>vault</i>(1)</a>.</p>
2011
+<h2 id="author">AUTHOR<a class="headerlink" href="#author" title="Permanent link">&para;</a></h2>
2012
+<p><a href="https://the13thletter.info">Marco Ricci</a> (<code>software</code> at <code>the13thletter</code> dot <code>info</code>)</p>
2013
+<h2 id="bugs">BUGS<a class="headerlink" href="#bugs" title="Permanent link">&para;</a></h2>
2014
+<ul>
2015
+<li>
2016
+<p>The defaults are dictated by <i>vault</i>(1), necessitating the <a href="#compatibility-and-extension-options">&ldquo;Compatibility and extension options&rdquo;</a>. (WONTFIX.)</p>
2017
+</li>
2018
+<li>
2019
+<p>The Windows version does not support SSH keys because Python on Windows does not support the predominant type of inter-process communication used by SSH agents on Windows.</p>
2020
+</li>
2021
+</ul>
1304 2022
 
1305 2023
 
1306 2024
 
... ...
@@ -1369,7 +2087,7 @@ discouraged from using a stored passphrase.</p>
1369 2087
       <div class="md-copyright">
1370 2088
   
1371 2089
     <div class="md-copyright__highlight">
1372
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
2090
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1373 2091
     </div>
1374 2092
   
1375 2093
   
... ...
@@ -174,6 +174,26 @@
174 174
   
175 175
   
176 176
   
177
+    
178
+    
179
+      <li class="md-tabs__item">
180
+        <a href="../../explanation/" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
177 197
     <li class="md-tabs__item">
178 198
       <a href="../../changelog/" class="md-tabs__link">
179 199
         
... ...
@@ -1021,6 +1041,92 @@
1021 1041
   
1022 1042
   
1023 1043
   
1044
+    
1045
+    
1046
+      
1047
+        
1048
+          
1049
+        
1050
+      
1051
+        
1052
+      
1053
+    
1054
+    
1055
+      
1056
+      
1057
+        
1058
+      
1059
+    
1060
+    
1061
+    <li class="md-nav__item md-nav__item--nested">
1062
+      
1063
+        
1064
+        
1065
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1066
+        
1067
+          
1068
+          
1069
+          <div class="md-nav__link md-nav__container">
1070
+            <a href="../../explanation/" class="md-nav__link ">
1071
+              
1072
+  
1073
+  <span class="md-ellipsis">
1074
+    Design & Background
1075
+  </span>
1076
+  
1077
+
1078
+            </a>
1079
+            
1080
+              
1081
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1082
+                <span class="md-nav__icon md-icon"></span>
1083
+              </label>
1084
+            
1085
+          </div>
1086
+        
1087
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1088
+          <label class="md-nav__title" for="__nav_5">
1089
+            <span class="md-nav__icon md-icon"></span>
1090
+            Design & Background
1091
+          </label>
1092
+          <ul class="md-nav__list" data-md-scrollfix>
1093
+            
1094
+              
1095
+            
1096
+              
1097
+                
1098
+  
1099
+  
1100
+  
1101
+  
1102
+    <li class="md-nav__item">
1103
+      <a href="../../explanation/faq-altered-versions/" class="md-nav__link">
1104
+        
1105
+  
1106
+  <span class="md-ellipsis">
1107
+    "altered versions" license requirement
1108
+  </span>
1109
+  
1110
+
1111
+      </a>
1112
+    </li>
1113
+  
1114
+
1115
+              
1116
+            
1117
+          </ul>
1118
+        </nav>
1119
+      
1120
+    </li>
1121
+  
1122
+
1123
+    
1124
+      
1125
+      
1126
+  
1127
+  
1128
+  
1129
+  
1024 1130
     <li class="md-nav__item">
1025 1131
       <a href="../../changelog/" class="md-nav__link">
1026 1132
         
... ...
@@ -1257,7 +1363,7 @@ subcommand must be specified explicitly.</p>
1257 1363
       <div class="md-copyright">
1258 1364
   
1259 1365
     <div class="md-copyright__highlight">
1260
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
1366
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1261 1367
     </div>
1262 1368
   
1263 1369
   
... ...
@@ -174,6 +174,26 @@
174 174
   
175 175
   
176 176
   
177
+    
178
+    
179
+      <li class="md-tabs__item">
180
+        <a href="../../explanation/" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
177 197
     <li class="md-tabs__item">
178 198
       <a href="../../changelog/" class="md-tabs__link">
179 199
         
... ...
@@ -1383,6 +1403,92 @@
1383 1403
   
1384 1404
   
1385 1405
   
1406
+    
1407
+    
1408
+      
1409
+        
1410
+          
1411
+        
1412
+      
1413
+        
1414
+      
1415
+    
1416
+    
1417
+      
1418
+      
1419
+        
1420
+      
1421
+    
1422
+    
1423
+    <li class="md-nav__item md-nav__item--nested">
1424
+      
1425
+        
1426
+        
1427
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1428
+        
1429
+          
1430
+          
1431
+          <div class="md-nav__link md-nav__container">
1432
+            <a href="../../explanation/" class="md-nav__link ">
1433
+              
1434
+  
1435
+  <span class="md-ellipsis">
1436
+    Design & Background
1437
+  </span>
1438
+  
1439
+
1440
+            </a>
1441
+            
1442
+              
1443
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1444
+                <span class="md-nav__icon md-icon"></span>
1445
+              </label>
1446
+            
1447
+          </div>
1448
+        
1449
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1450
+          <label class="md-nav__title" for="__nav_5">
1451
+            <span class="md-nav__icon md-icon"></span>
1452
+            Design & Background
1453
+          </label>
1454
+          <ul class="md-nav__list" data-md-scrollfix>
1455
+            
1456
+              
1457
+            
1458
+              
1459
+                
1460
+  
1461
+  
1462
+  
1463
+  
1464
+    <li class="md-nav__item">
1465
+      <a href="../../explanation/faq-altered-versions/" class="md-nav__link">
1466
+        
1467
+  
1468
+  <span class="md-ellipsis">
1469
+    "altered versions" license requirement
1470
+  </span>
1471
+  
1472
+
1473
+      </a>
1474
+    </li>
1475
+  
1476
+
1477
+              
1478
+            
1479
+          </ul>
1480
+        </nav>
1481
+      
1482
+    </li>
1483
+  
1484
+
1485
+    
1486
+      
1487
+      
1488
+  
1489
+  
1490
+  
1491
+  
1386 1492
     <li class="md-nav__item">
1387 1493
       <a href="../../changelog/" class="md-nav__link">
1388 1494
         
... ...
@@ -3617,6 +3723,18 @@ JSON value.</p>
3617 3723
 
3618 3724
 
3619 3725
 <a href="#derivepassphrase._types.validate_vault_config" class="headerlink" title="Permanent link">&para;</a></h3>
3726
+          <div class="doc-overloads">
3727
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">validate_vault_config</span><span class="p">(</span>
3728
+    <span class="n">obj</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">,</span>
3729
+    <span class="o">/</span><span class="p">,</span>
3730
+    <span class="o">*</span><span class="p">,</span>
3731
+    <span class="n">allow_derivepassphrase_extensions</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#bool">bool</a></span><span class="p">,</span>
3732
+    <span class="n">allow_unknown_settings</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#bool">bool</a></span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
3733
+<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
3734
+</code></pre></div><div class="doc-signature highlight"><pre><span></span><code><span class="nf">validate_vault_config</span><span class="p">(</span>
3735
+    <span class="n">obj</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">,</span> <span class="o">/</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">allow_unknown_settings</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#bool">bool</a></span> <span class="o">=</span> <span class="kc">False</span>
3736
+<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
3737
+</code></pre></div>          </div>
3620 3738
 <div class="doc-signature highlight"><pre><span></span><code><span class="nf">validate_vault_config</span><span class="p">(</span>
3621 3739
     <span class="n">obj</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">,</span>
3622 3740
     <span class="o">/</span><span class="p">,</span>
... ...
@@ -3683,7 +3801,7 @@ JSON value.</p>
3683 3801
             </td>
3684 3802
             <td>
3685 3803
               <div class="doc-md-description">
3686
-                <p>If true, allow <code>derivepassphrase</code> extensions.</p>
3804
+                <p>(Deprecated.)  Ignored since v0.4.0.</p>
3687 3805
               </div>
3688 3806
             </td>
3689 3807
             <td>
... ...
@@ -3728,6 +3846,13 @@ disallowed value.</p>
3728 3846
       </tbody>
3729 3847
     </table>
3730 3848
 
3849
+
3850
+<details class="deprecated" open>
3851
+  <summary>Deprecated</summary>
3852
+  <p>Since v0.4.0: The <code>allow_derivepassphrase_extensions</code> keyword
3853
+argument is deprecated, and will be removed in v1.0.  There are
3854
+no specified <code>derivepassphrase</code> extensions.</p>
3855
+</details>
3731 3856
     </div>
3732 3857
 
3733 3858
 </div>
... ...
@@ -4039,7 +4164,7 @@ vault configuration, then <code>None</code> is returned, directly.</p>
4039 4164
       <div class="md-copyright">
4040 4165
   
4041 4166
     <div class="md-copyright__highlight">
4042
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
4167
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
4043 4168
     </div>
4044 4169
   
4045 4170
   
... ...
@@ -174,6 +174,26 @@
174 174
   
175 175
   
176 176
   
177
+    
178
+    
179
+      <li class="md-tabs__item">
180
+        <a href="../../explanation/" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
177 197
     <li class="md-tabs__item">
178 198
       <a href="../../changelog/" class="md-tabs__link">
179 199
         
... ...
@@ -753,6 +773,105 @@
753 773
     <nav class="md-nav" aria-label=" cli">
754 774
       <ul class="md-nav__list">
755 775
         
776
+          <li class="md-nav__item">
777
+  <a href="#derivepassphrase.cli.ClickEchoStderrHandler" class="md-nav__link">
778
+    <span class="md-ellipsis">
779
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ClickEchoStderrHandler
780
+    </span>
781
+  </a>
782
+  
783
+    <nav class="md-nav" aria-label=" ClickEchoStderrHandler">
784
+      <ul class="md-nav__list">
785
+        
786
+          <li class="md-nav__item">
787
+  <a href="#derivepassphrase.cli.ClickEchoStderrHandler.emit" class="md-nav__link">
788
+    <span class="md-ellipsis">
789
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;emit
790
+    </span>
791
+  </a>
792
+  
793
+</li>
794
+        
795
+      </ul>
796
+    </nav>
797
+  
798
+</li>
799
+        
800
+          <li class="md-nav__item">
801
+  <a href="#derivepassphrase.cli.CLIofPackageFormatter" class="md-nav__link">
802
+    <span class="md-ellipsis">
803
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;CLIofPackageFormatter
804
+    </span>
805
+  </a>
806
+  
807
+    <nav class="md-nav" aria-label=" CLIofPackageFormatter">
808
+      <ul class="md-nav__list">
809
+        
810
+          <li class="md-nav__item">
811
+  <a href="#derivepassphrase.cli.CLIofPackageFormatter.format" class="md-nav__link">
812
+    <span class="md-ellipsis">
813
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;format
814
+    </span>
815
+  </a>
816
+  
817
+</li>
818
+        
819
+      </ul>
820
+    </nav>
821
+  
822
+</li>
823
+        
824
+          <li class="md-nav__item">
825
+  <a href="#derivepassphrase.cli.StandardCLILogging" class="md-nav__link">
826
+    <span class="md-ellipsis">
827
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;StandardCLILogging
828
+    </span>
829
+  </a>
830
+  
831
+    <nav class="md-nav" aria-label=" StandardCLILogging">
832
+      <ul class="md-nav__list">
833
+        
834
+          <li class="md-nav__item">
835
+  <a href="#derivepassphrase.cli.StandardCLILogging.ensure_standard_logging" class="md-nav__link">
836
+    <span class="md-ellipsis">
837
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;ensure_standard_logging
838
+    </span>
839
+  </a>
840
+  
841
+</li>
842
+        
843
+          <li class="md-nav__item">
844
+  <a href="#derivepassphrase.cli.StandardCLILogging.ensure_standard_warnings_logging" class="md-nav__link">
845
+    <span class="md-ellipsis">
846
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;ensure_standard_warnings_logging
847
+    </span>
848
+  </a>
849
+  
850
+</li>
851
+        
852
+      </ul>
853
+    </nav>
854
+  
855
+</li>
856
+        
857
+          <li class="md-nav__item">
858
+  <a href="#derivepassphrase.cli.StandardLoggingContextManager" class="md-nav__link">
859
+    <span class="md-ellipsis">
860
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;StandardLoggingContextManager
861
+    </span>
862
+  </a>
863
+  
864
+</li>
865
+        
866
+          <li class="md-nav__item">
867
+  <a href="#derivepassphrase.cli.StandardWarningsLoggingContextManager" class="md-nav__link">
868
+    <span class="md-ellipsis">
869
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;StandardWarningsLoggingContextManager
870
+    </span>
871
+  </a>
872
+  
873
+</li>
874
+        
756 875
           <li class="md-nav__item">
757 876
   <a href="#derivepassphrase.cli.OptionGroupOption" class="md-nav__link">
758 877
     <span class="md-ellipsis">
... ...
@@ -796,6 +915,42 @@
796 915
     <nav class="md-nav" aria-label=" CommandWithHelpGroups">
797 916
       <ul class="md-nav__list">
798 917
         
918
+          <li class="md-nav__item">
919
+  <a href="#derivepassphrase.cli.CommandWithHelpGroups.collect_usage_pieces" class="md-nav__link">
920
+    <span class="md-ellipsis">
921
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;collect_usage_pieces
922
+    </span>
923
+  </a>
924
+  
925
+</li>
926
+        
927
+          <li class="md-nav__item">
928
+  <a href="#derivepassphrase.cli.CommandWithHelpGroups.get_help_option" class="md-nav__link">
929
+    <span class="md-ellipsis">
930
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_help_option
931
+    </span>
932
+  </a>
933
+  
934
+</li>
935
+        
936
+          <li class="md-nav__item">
937
+  <a href="#derivepassphrase.cli.CommandWithHelpGroups.get_short_help_str" class="md-nav__link">
938
+    <span class="md-ellipsis">
939
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_short_help_str
940
+    </span>
941
+  </a>
942
+  
943
+</li>
944
+        
945
+          <li class="md-nav__item">
946
+  <a href="#derivepassphrase.cli.CommandWithHelpGroups.format_help_text" class="md-nav__link">
947
+    <span class="md-ellipsis">
948
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;format_help_text
949
+    </span>
950
+  </a>
951
+  
952
+</li>
953
+        
799 954
           <li class="md-nav__item">
800 955
   <a href="#derivepassphrase.cli.CommandWithHelpGroups.format_options" class="md-nav__link">
801 956
     <span class="md-ellipsis">
... ...
@@ -803,6 +958,57 @@
803 958
     </span>
804 959
   </a>
805 960
   
961
+</li>
962
+        
963
+          <li class="md-nav__item">
964
+  <a href="#derivepassphrase.cli.CommandWithHelpGroups.format_commands" class="md-nav__link">
965
+    <span class="md-ellipsis">
966
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;format_commands
967
+    </span>
968
+  </a>
969
+  
970
+</li>
971
+        
972
+          <li class="md-nav__item">
973
+  <a href="#derivepassphrase.cli.CommandWithHelpGroups.format_epilog" class="md-nav__link">
974
+    <span class="md-ellipsis">
975
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;format_epilog
976
+    </span>
977
+  </a>
978
+  
979
+</li>
980
+        
981
+      </ul>
982
+    </nav>
983
+  
984
+</li>
985
+        
986
+          <li class="md-nav__item">
987
+  <a href="#derivepassphrase.cli.LoggingOption" class="md-nav__link">
988
+    <span class="md-ellipsis">
989
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;LoggingOption
990
+    </span>
991
+  </a>
992
+  
993
+</li>
994
+        
995
+          <li class="md-nav__item">
996
+  <a href="#derivepassphrase.cli.ZshComplete" class="md-nav__link">
997
+    <span class="md-ellipsis">
998
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ZshComplete
999
+    </span>
1000
+  </a>
1001
+  
1002
+    <nav class="md-nav" aria-label=" ZshComplete">
1003
+      <ul class="md-nav__list">
1004
+        
1005
+          <li class="md-nav__item">
1006
+  <a href="#derivepassphrase.cli.ZshComplete.format_completion" class="md-nav__link">
1007
+    <span class="md-ellipsis">
1008
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;format_completion
1009
+    </span>
1010
+  </a>
1011
+  
806 1012
 </li>
807 1013
         
808 1014
       </ul>
... ...
@@ -811,9 +1017,9 @@
811 1017
 </li>
812 1018
         
813 1019
           <li class="md-nav__item">
814
-  <a href="#derivepassphrase.cli.PasswordGenerationOption" class="md-nav__link">
1020
+  <a href="#derivepassphrase.cli.PassphraseGenerationOption" class="md-nav__link">
815 1021
     <span class="md-ellipsis">
816
-      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;PasswordGenerationOption
1022
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;PassphraseGenerationOption
817 1023
     </span>
818 1024
   </a>
819 1025
   
... ...
@@ -835,6 +1041,42 @@
835 1041
     </span>
836 1042
   </a>
837 1043
   
1044
+</li>
1045
+        
1046
+          <li class="md-nav__item">
1047
+  <a href="#derivepassphrase.cli.CompatibilityOption" class="md-nav__link">
1048
+    <span class="md-ellipsis">
1049
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;CompatibilityOption
1050
+    </span>
1051
+  </a>
1052
+  
1053
+</li>
1054
+        
1055
+          <li class="md-nav__item">
1056
+  <a href="#derivepassphrase.cli.adjust_logging_level" class="md-nav__link">
1057
+    <span class="md-ellipsis">
1058
+      <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;adjust_logging_level
1059
+    </span>
1060
+  </a>
1061
+  
1062
+</li>
1063
+        
1064
+          <li class="md-nav__item">
1065
+  <a href="#derivepassphrase.cli.color_forcing_callback" class="md-nav__link">
1066
+    <span class="md-ellipsis">
1067
+      <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;color_forcing_callback
1068
+    </span>
1069
+  </a>
1070
+  
1071
+</li>
1072
+        
1073
+          <li class="md-nav__item">
1074
+  <a href="#derivepassphrase.cli.standard_logging_options" class="md-nav__link">
1075
+    <span class="md-ellipsis">
1076
+      <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;standard_logging_options
1077
+    </span>
1078
+  </a>
1079
+  
838 1080
 </li>
839 1081
         
840 1082
           <li class="md-nav__item">
... ...
@@ -1089,356 +1331,1983 @@
1089 1331
   
1090 1332
   
1091 1333
   
1092
-    <li class="md-nav__item">
1093
-      <a href="../../changelog/" class="md-nav__link">
1094 1334
     
1095 1335
     
1096
-  <span class="md-ellipsis">
1097
-    Changelog
1098
-  </span>
1099 1336
       
1100 1337
         
1101
-      </a>
1102
-    </li>
1103 1338
           
1104 1339
         
1105 1340
       
1106
-  </ul>
1107
-</nav>
1108
-                  </div>
1109
-                </div>
1110
-              </div>
1111 1341
         
1112 1342
       
1113 1343
     
1114
-              <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
1115
-                <div class="md-sidebar__scrollwrap">
1116
-                  <div class="md-sidebar__inner">
1117 1344
     
1118 1345
       
1119
-<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1120 1346
       
1121 1347
         
1122 1348
       
1123 1349
     
1124
-    <label class="md-nav__title" for="__toc">
1125
-      <span class="md-nav__icon md-icon"></span>
1126
-      Table of contents
1127
-    </label>
1128
-    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1129 1350
     
1130
-        <li class="md-nav__item">
1131
-  <a href="#derivepassphrase.cli" class="md-nav__link">
1132
-    <span class="md-ellipsis">
1133
-      <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;cli
1134
-    </span>
1135
-  </a>
1351
+    <li class="md-nav__item md-nav__item--nested">
1136 1352
       
1137
-    <nav class="md-nav" aria-label=" cli">
1138
-      <ul class="md-nav__list">
1139 1353
         
1140
-          <li class="md-nav__item">
1141
-  <a href="#derivepassphrase.cli.OptionGroupOption" class="md-nav__link">
1142
-    <span class="md-ellipsis">
1143
-      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;OptionGroupOption
1144
-    </span>
1145
-  </a>
1146 1354
         
1147
-    <nav class="md-nav" aria-label=" OptionGroupOption">
1148
-      <ul class="md-nav__list">
1355
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1149 1356
         
1150
-          <li class="md-nav__item">
1151
-  <a href="#derivepassphrase.cli.OptionGroupOption.option_group_name" class="md-nav__link">
1152
-    <span class="md-ellipsis">
1153
-      <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;option_group_name
1154
-    </span>
1155
-  </a>
1156 1357
           
1157
-</li>
1158 1358
           
1159
-          <li class="md-nav__item">
1160
-  <a href="#derivepassphrase.cli.OptionGroupOption.epilog" class="md-nav__link">
1359
+          <div class="md-nav__link md-nav__container">
1360
+            <a href="../../explanation/" class="md-nav__link ">
1361
+              
1362
+  
1161 1363
   <span class="md-ellipsis">
1162
-      <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;epilog
1364
+    Design & Background
1163 1365
   </span>
1366
+  
1367
+
1164 1368
             </a>
1165 1369
             
1166
-</li>
1167 1370
               
1168
-      </ul>
1169
-    </nav>
1371
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1372
+                <span class="md-nav__icon md-icon"></span>
1373
+              </label>
1170 1374
             
1171
-</li>
1375
+          </div>
1172 1376
         
1173
-          <li class="md-nav__item">
1174
-  <a href="#derivepassphrase.cli.CommandWithHelpGroups" class="md-nav__link">
1175
-    <span class="md-ellipsis">
1176
-      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;CommandWithHelpGroups
1377
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1378
+          <label class="md-nav__title" for="__nav_5">
1379
+            <span class="md-nav__icon md-icon"></span>
1380
+            Design & Background
1381
+          </label>
1382
+          <ul class="md-nav__list" data-md-scrollfix>
1383
+            
1384
+              
1385
+            
1386
+              
1387
+                
1388
+  
1389
+  
1390
+  
1391
+  
1392
+    <li class="md-nav__item">
1393
+      <a href="../../explanation/faq-altered-versions/" class="md-nav__link">
1394
+        
1395
+  
1396
+  <span class="md-ellipsis">
1397
+    "altered versions" license requirement
1177 1398
   </span>
1399
+  
1400
+
1178 1401
       </a>
1402
+    </li>
1403
+  
1404
+
1405
+              
1406
+            
1407
+          </ul>
1408
+        </nav>
1409
+      
1410
+    </li>
1411
+  
1412
+
1413
+    
1414
+      
1415
+      
1416
+  
1417
+  
1179 1418
   
1180
-    <nav class="md-nav" aria-label=" CommandWithHelpGroups">
1181
-      <ul class="md-nav__list">
1182 1419
   
1183 1420
     <li class="md-nav__item">
1184
-  <a href="#derivepassphrase.cli.CommandWithHelpGroups.format_options" class="md-nav__link">
1421
+      <a href="../../changelog/" class="md-nav__link">
1422
+        
1423
+  
1185 1424
   <span class="md-ellipsis">
1186
-      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;format_options
1425
+    Changelog
1187 1426
   </span>
1188
-  </a>
1189 1427
   
1428
+
1429
+      </a>
1190 1430
     </li>
1191 1431
   
1432
+
1433
+    
1192 1434
   </ul>
1193 1435
 </nav>
1436
+                  </div>
1437
+                </div>
1438
+              </div>
1194 1439
             
1195
-</li>
1440
+            
1441
+              
1442
+              <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
1443
+                <div class="md-sidebar__scrollwrap">
1444
+                  <div class="md-sidebar__inner">
1445
+                    
1446
+
1447
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1448
+  
1449
+  
1450
+  
1451
+  
1452
+    <label class="md-nav__title" for="__toc">
1453
+      <span class="md-nav__icon md-icon"></span>
1454
+      Table of contents
1455
+    </label>
1456
+    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1196 1457
       
1197 1458
         <li class="md-nav__item">
1198
-  <a href="#derivepassphrase.cli.PasswordGenerationOption" class="md-nav__link">
1459
+  <a href="#derivepassphrase.cli" class="md-nav__link">
1199 1460
     <span class="md-ellipsis">
1200
-      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;PasswordGenerationOption
1461
+      <code class="doc-symbol doc-symbol-toc doc-symbol-module"></code>&nbsp;cli
1201 1462
     </span>
1202 1463
   </a>
1203 1464
   
1204
-</li>
1465
+    <nav class="md-nav" aria-label=" cli">
1466
+      <ul class="md-nav__list">
1205 1467
         
1206 1468
           <li class="md-nav__item">
1207
-  <a href="#derivepassphrase.cli.ConfigurationOption" class="md-nav__link">
1469
+  <a href="#derivepassphrase.cli.ClickEchoStderrHandler" class="md-nav__link">
1208 1470
     <span class="md-ellipsis">
1209
-      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ConfigurationOption
1471
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ClickEchoStderrHandler
1210 1472
     </span>
1211 1473
   </a>
1212 1474
   
1213
-</li>
1475
+    <nav class="md-nav" aria-label=" ClickEchoStderrHandler">
1476
+      <ul class="md-nav__list">
1214 1477
         
1215 1478
           <li class="md-nav__item">
1216
-  <a href="#derivepassphrase.cli.StorageManagementOption" class="md-nav__link">
1479
+  <a href="#derivepassphrase.cli.ClickEchoStderrHandler.emit" class="md-nav__link">
1217 1480
     <span class="md-ellipsis">
1218
-      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;StorageManagementOption
1481
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;emit
1219 1482
     </span>
1220 1483
   </a>
1221 1484
   
1485
+</li>
1486
+        
1487
+      </ul>
1488
+    </nav>
1489
+  
1222 1490
 </li>
1223 1491
         
1224 1492
           <li class="md-nav__item">
1225
-  <a href="#derivepassphrase.cli.derivepassphrase" class="md-nav__link">
1493
+  <a href="#derivepassphrase.cli.CLIofPackageFormatter" class="md-nav__link">
1226 1494
     <span class="md-ellipsis">
1227
-      <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;derivepassphrase
1495
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;CLIofPackageFormatter
1228 1496
     </span>
1229 1497
   </a>
1230 1498
   
1231
-</li>
1499
+    <nav class="md-nav" aria-label=" CLIofPackageFormatter">
1500
+      <ul class="md-nav__list">
1232 1501
         
1233 1502
           <li class="md-nav__item">
1234
-  <a href="#derivepassphrase.cli.derivepassphrase_export" class="md-nav__link">
1503
+  <a href="#derivepassphrase.cli.CLIofPackageFormatter.format" class="md-nav__link">
1235 1504
     <span class="md-ellipsis">
1236
-      <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;derivepassphrase_export
1505
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;format
1237 1506
     </span>
1238 1507
   </a>
1239 1508
   
1509
+</li>
1510
+        
1511
+      </ul>
1512
+    </nav>
1513
+  
1240 1514
 </li>
1241 1515
         
1242 1516
           <li class="md-nav__item">
1243
-  <a href="#derivepassphrase.cli.derivepassphrase_export_vault" class="md-nav__link">
1517
+  <a href="#derivepassphrase.cli.StandardCLILogging" class="md-nav__link">
1244 1518
     <span class="md-ellipsis">
1245
-      <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;derivepassphrase_export_vault
1519
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;StandardCLILogging
1246 1520
     </span>
1247 1521
   </a>
1248 1522
   
1249
-</li>
1523
+    <nav class="md-nav" aria-label=" StandardCLILogging">
1524
+      <ul class="md-nav__list">
1250 1525
         
1251 1526
           <li class="md-nav__item">
1252
-  <a href="#derivepassphrase.cli.derivepassphrase_vault" class="md-nav__link">
1527
+  <a href="#derivepassphrase.cli.StandardCLILogging.ensure_standard_logging" class="md-nav__link">
1253 1528
     <span class="md-ellipsis">
1254
-      <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;derivepassphrase_vault
1529
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;ensure_standard_logging
1255 1530
     </span>
1256 1531
   </a>
1257 1532
   
1258 1533
 </li>
1259 1534
         
1260
-      </ul>
1261
-    </nav>
1535
+          <li class="md-nav__item">
1536
+  <a href="#derivepassphrase.cli.StandardCLILogging.ensure_standard_warnings_logging" class="md-nav__link">
1537
+    <span class="md-ellipsis">
1538
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;ensure_standard_warnings_logging
1539
+    </span>
1540
+  </a>
1262 1541
   
1263 1542
 </li>
1264 1543
         
1265 1544
       </ul>
1266
-  
1267 1545
     </nav>
1268
-                  </div>
1269
-                </div>
1270
-              </div>
1271
-            
1272 1546
   
1547
+</li>
1273 1548
         
1274
-            <div class="md-content" data-md-component="content">
1275
-              <article class="md-content__inner md-typeset">
1276
-                
1549
+          <li class="md-nav__item">
1550
+  <a href="#derivepassphrase.cli.StandardLoggingContextManager" class="md-nav__link">
1551
+    <span class="md-ellipsis">
1552
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;StandardLoggingContextManager
1553
+    </span>
1554
+  </a>
1277 1555
   
1556
+</li>
1278 1557
         
1558
+          <li class="md-nav__item">
1559
+  <a href="#derivepassphrase.cli.StandardWarningsLoggingContextManager" class="md-nav__link">
1560
+    <span class="md-ellipsis">
1561
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;StandardWarningsLoggingContextManager
1562
+    </span>
1563
+  </a>
1279 1564
   
1565
+</li>
1280 1566
         
1567
+          <li class="md-nav__item">
1568
+  <a href="#derivepassphrase.cli.OptionGroupOption" class="md-nav__link">
1569
+    <span class="md-ellipsis">
1570
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;OptionGroupOption
1571
+    </span>
1572
+  </a>
1281 1573
   
1574
+    <nav class="md-nav" aria-label=" OptionGroupOption">
1575
+      <ul class="md-nav__list">
1282 1576
         
1577
+          <li class="md-nav__item">
1578
+  <a href="#derivepassphrase.cli.OptionGroupOption.option_group_name" class="md-nav__link">
1579
+    <span class="md-ellipsis">
1580
+      <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;option_group_name
1581
+    </span>
1582
+  </a>
1283 1583
   
1284
-    <a href="https://github.com/the-13th-letter/derivepassphrase/raw/master/docs/reference/derivepassphrase.cli.md" title="View source of this page" class="md-content__button md-icon">
1584
+</li>
1285 1585
         
1286
-      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
1586
+          <li class="md-nav__item">
1587
+  <a href="#derivepassphrase.cli.OptionGroupOption.epilog" class="md-nav__link">
1588
+    <span class="md-ellipsis">
1589
+      <code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;epilog
1590
+    </span>
1287 1591
   </a>
1288 1592
   
1593
+</li>
1289 1594
         
1595
+      </ul>
1596
+    </nav>
1290 1597
   
1291
-  <h1>Submodule cli</h1>
1598
+</li>
1292 1599
         
1293
-<div class="doc doc-object doc-module">
1600
+          <li class="md-nav__item">
1601
+  <a href="#derivepassphrase.cli.CommandWithHelpGroups" class="md-nav__link">
1602
+    <span class="md-ellipsis">
1603
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;CommandWithHelpGroups
1604
+    </span>
1605
+  </a>
1294 1606
   
1607
+    <nav class="md-nav" aria-label=" CommandWithHelpGroups">
1608
+      <ul class="md-nav__list">
1295 1609
         
1610
+          <li class="md-nav__item">
1611
+  <a href="#derivepassphrase.cli.CommandWithHelpGroups.collect_usage_pieces" class="md-nav__link">
1612
+    <span class="md-ellipsis">
1613
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;collect_usage_pieces
1614
+    </span>
1615
+  </a>
1296 1616
   
1297
-<h2 id="derivepassphrase.cli" class="doc doc-heading">
1298
-<code class="doc-symbol doc-symbol-heading doc-symbol-module"></code>            <span class="doc doc-object-name doc-module-name">derivepassphrase.cli</span>
1617
+</li>
1299 1618
         
1619
+          <li class="md-nav__item">
1620
+  <a href="#derivepassphrase.cli.CommandWithHelpGroups.get_help_option" class="md-nav__link">
1621
+    <span class="md-ellipsis">
1622
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_help_option
1623
+    </span>
1624
+  </a>
1300 1625
   
1301
-<a href="#derivepassphrase.cli" class="headerlink" title="Permanent link">&para;</a></h2>
1626
+</li>
1302 1627
         
1303
-    <div class="doc doc-contents first">
1628
+          <li class="md-nav__item">
1629
+  <a href="#derivepassphrase.cli.CommandWithHelpGroups.get_short_help_str" class="md-nav__link">
1630
+    <span class="md-ellipsis">
1631
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;get_short_help_str
1632
+    </span>
1633
+  </a>
1304 1634
   
1305
-        <p>Command-line interface for derivepassphrase.</p>
1635
+</li>
1306 1636
         
1637
+          <li class="md-nav__item">
1638
+  <a href="#derivepassphrase.cli.CommandWithHelpGroups.format_help_text" class="md-nav__link">
1639
+    <span class="md-ellipsis">
1640
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;format_help_text
1641
+    </span>
1642
+  </a>
1307 1643
   
1644
+</li>
1308 1645
         
1646
+          <li class="md-nav__item">
1647
+  <a href="#derivepassphrase.cli.CommandWithHelpGroups.format_options" class="md-nav__link">
1648
+    <span class="md-ellipsis">
1649
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;format_options
1650
+    </span>
1651
+  </a>
1309 1652
   
1653
+</li>
1310 1654
         
1655
+          <li class="md-nav__item">
1656
+  <a href="#derivepassphrase.cli.CommandWithHelpGroups.format_commands" class="md-nav__link">
1657
+    <span class="md-ellipsis">
1658
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;format_commands
1659
+    </span>
1660
+  </a>
1311 1661
   
1662
+</li>
1312 1663
         
1664
+          <li class="md-nav__item">
1665
+  <a href="#derivepassphrase.cli.CommandWithHelpGroups.format_epilog" class="md-nav__link">
1666
+    <span class="md-ellipsis">
1667
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;format_epilog
1668
+    </span>
1669
+  </a>
1313 1670
   
1314
-  <div class="doc doc-children">
1671
+</li>
1315 1672
         
1673
+      </ul>
1674
+    </nav>
1316 1675
   
1676
+</li>
1317 1677
         
1678
+          <li class="md-nav__item">
1679
+  <a href="#derivepassphrase.cli.LoggingOption" class="md-nav__link">
1680
+    <span class="md-ellipsis">
1681
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;LoggingOption
1682
+    </span>
1683
+  </a>
1318 1684
   
1685
+</li>
1319 1686
         
1687
+          <li class="md-nav__item">
1688
+  <a href="#derivepassphrase.cli.ZshComplete" class="md-nav__link">
1689
+    <span class="md-ellipsis">
1690
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ZshComplete
1691
+    </span>
1692
+  </a>
1320 1693
   
1694
+    <nav class="md-nav" aria-label=" ZshComplete">
1695
+      <ul class="md-nav__list">
1321 1696
         
1697
+          <li class="md-nav__item">
1698
+  <a href="#derivepassphrase.cli.ZshComplete.format_completion" class="md-nav__link">
1699
+    <span class="md-ellipsis">
1700
+      <code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;format_completion
1701
+    </span>
1702
+  </a>
1322 1703
   
1323
-<div class="doc doc-object doc-class">
1704
+</li>
1324 1705
         
1706
+      </ul>
1707
+    </nav>
1325 1708
   
1709
+</li>
1326 1710
         
1327
-<h3 id="derivepassphrase.cli.OptionGroupOption" class="doc doc-heading">
1328
-<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">OptionGroupOption</span>
1711
+          <li class="md-nav__item">
1712
+  <a href="#derivepassphrase.cli.PassphraseGenerationOption" class="md-nav__link">
1713
+    <span class="md-ellipsis">
1714
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;PassphraseGenerationOption
1715
+    </span>
1716
+  </a>
1329 1717
   
1718
+</li>
1330 1719
         
1331
-<a href="#derivepassphrase.cli.OptionGroupOption" class="headerlink" title="Permanent link">&para;</a></h3>
1332
-<div class="doc-signature highlight"><pre><span></span><code><span class="nf">OptionGroupOption</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">)</span>
1333
-</code></pre></div>
1720
+          <li class="md-nav__item">
1721
+  <a href="#derivepassphrase.cli.ConfigurationOption" class="md-nav__link">
1722
+    <span class="md-ellipsis">
1723
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;ConfigurationOption
1724
+    </span>
1725
+  </a>
1334 1726
   
1335
-    <div class="doc doc-contents ">
1336
-            <p class="doc doc-class-bases">
1337
-              Bases: <code><a class="autorefs autorefs-external" title="click.Option" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Option">Option</a></code></p>
1727
+</li>
1338 1728
         
1729
+          <li class="md-nav__item">
1730
+  <a href="#derivepassphrase.cli.StorageManagementOption" class="md-nav__link">
1731
+    <span class="md-ellipsis">
1732
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;StorageManagementOption
1733
+    </span>
1734
+  </a>
1339 1735
   
1736
+</li>
1340 1737
         
1341
-        <p>A <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Option"><code>click.Option</code></a> with an associated group name and group epilog.</p>
1342
-<p>Used by <a class="autorefs autorefs-internal" href="#derivepassphrase.cli.CommandWithHelpGroups"><code>CommandWithHelpGroups</code></a> to print help sections.  Each
1343
-subclass contains its own group name and epilog.</p>
1738
+          <li class="md-nav__item">
1739
+  <a href="#derivepassphrase.cli.CompatibilityOption" class="md-nav__link">
1740
+    <span class="md-ellipsis">
1741
+      <code class="doc-symbol doc-symbol-toc doc-symbol-class"></code>&nbsp;CompatibilityOption
1742
+    </span>
1743
+  </a>
1344 1744
   
1745
+</li>
1345 1746
         
1346
-<p><span class="doc-section-title">Attributes:</span></p>
1747
+          <li class="md-nav__item">
1748
+  <a href="#derivepassphrase.cli.adjust_logging_level" class="md-nav__link">
1749
+    <span class="md-ellipsis">
1750
+      <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;adjust_logging_level
1751
+    </span>
1752
+  </a>
1753
+  
1754
+</li>
1755
+        
1756
+          <li class="md-nav__item">
1757
+  <a href="#derivepassphrase.cli.color_forcing_callback" class="md-nav__link">
1758
+    <span class="md-ellipsis">
1759
+      <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;color_forcing_callback
1760
+    </span>
1761
+  </a>
1762
+  
1763
+</li>
1764
+        
1765
+          <li class="md-nav__item">
1766
+  <a href="#derivepassphrase.cli.standard_logging_options" class="md-nav__link">
1767
+    <span class="md-ellipsis">
1768
+      <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;standard_logging_options
1769
+    </span>
1770
+  </a>
1771
+  
1772
+</li>
1773
+        
1774
+          <li class="md-nav__item">
1775
+  <a href="#derivepassphrase.cli.derivepassphrase" class="md-nav__link">
1776
+    <span class="md-ellipsis">
1777
+      <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;derivepassphrase
1778
+    </span>
1779
+  </a>
1780
+  
1781
+</li>
1782
+        
1783
+          <li class="md-nav__item">
1784
+  <a href="#derivepassphrase.cli.derivepassphrase_export" class="md-nav__link">
1785
+    <span class="md-ellipsis">
1786
+      <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;derivepassphrase_export
1787
+    </span>
1788
+  </a>
1789
+  
1790
+</li>
1791
+        
1792
+          <li class="md-nav__item">
1793
+  <a href="#derivepassphrase.cli.derivepassphrase_export_vault" class="md-nav__link">
1794
+    <span class="md-ellipsis">
1795
+      <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;derivepassphrase_export_vault
1796
+    </span>
1797
+  </a>
1798
+  
1799
+</li>
1800
+        
1801
+          <li class="md-nav__item">
1802
+  <a href="#derivepassphrase.cli.derivepassphrase_vault" class="md-nav__link">
1803
+    <span class="md-ellipsis">
1804
+      <code class="doc-symbol doc-symbol-toc doc-symbol-function"></code>&nbsp;derivepassphrase_vault
1805
+    </span>
1806
+  </a>
1807
+  
1808
+</li>
1809
+        
1810
+      </ul>
1811
+    </nav>
1812
+  
1813
+</li>
1814
+      
1815
+    </ul>
1816
+  
1817
+</nav>
1818
+                  </div>
1819
+                </div>
1820
+              </div>
1821
+            
1822
+          
1823
+          
1824
+            <div class="md-content" data-md-component="content">
1825
+              <article class="md-content__inner md-typeset">
1826
+                
1827
+                  
1828
+
1829
+  
1830
+  
1831
+    
1832
+      
1833
+    
1834
+    <a href="https://github.com/the-13th-letter/derivepassphrase/raw/master/docs/reference/derivepassphrase.cli.md" title="View source of this page" class="md-content__button md-icon">
1835
+      
1836
+      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
1837
+    </a>
1838
+  
1839
+
1840
+
1841
+  <h1>Submodule cli</h1>
1842
+
1843
+<div class="doc doc-object doc-module">
1844
+
1845
+
1846
+
1847
+<h2 id="derivepassphrase.cli" class="doc doc-heading">
1848
+<code class="doc-symbol doc-symbol-heading doc-symbol-module"></code>            <span class="doc doc-object-name doc-module-name">derivepassphrase.cli</span>
1849
+
1850
+
1851
+<a href="#derivepassphrase.cli" class="headerlink" title="Permanent link">&para;</a></h2>
1852
+
1853
+    <div class="doc doc-contents first">
1854
+
1855
+        <p>Command-line interface for derivepassphrase.</p>
1856
+
1857
+
1858
+
1859
+
1860
+
1861
+
1862
+
1863
+
1864
+  <div class="doc doc-children">
1865
+
1866
+
1867
+
1868
+
1869
+
1870
+
1871
+
1872
+
1873
+<div class="doc doc-object doc-class">
1874
+
1875
+
1876
+
1877
+<h3 id="derivepassphrase.cli.ClickEchoStderrHandler" class="doc doc-heading">
1878
+<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">ClickEchoStderrHandler</span>
1879
+
1880
+
1881
+<a href="#derivepassphrase.cli.ClickEchoStderrHandler" class="headerlink" title="Permanent link">&para;</a></h3>
1882
+
1883
+
1884
+    <div class="doc doc-contents ">
1885
+            <p class="doc doc-class-bases">
1886
+              Bases: <code><a class="autorefs autorefs-external" title="logging.Handler" href="https://docs.python.org/3/library/logging.html#logging.Handler">Handler</a></code></p>
1887
+
1888
+
1889
+
1890
+        <p>A <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/logging.html#logging.Handler"><code>logging.Handler</code></a> for <code>click</code> applications.</p>
1891
+<p>Outputs log messages to <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/sys.html#sys.stderr"><code>sys.stderr</code></a> via <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.echo"><code>click.echo</code></a>.</p>
1892
+
1893
+
1894
+
1895
+
1896
+
1897
+
1898
+
1899
+
1900
+
1901
+  <div class="doc doc-children">
1902
+
1903
+
1904
+
1905
+
1906
+
1907
+
1908
+
1909
+
1910
+
1911
+<div class="doc doc-object doc-function">
1912
+
1913
+
1914
+<h4 id="derivepassphrase.cli.ClickEchoStderrHandler.emit" class="doc doc-heading">
1915
+<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code>            <span class="doc doc-object-name doc-function-name">emit</span>
1916
+
1917
+
1918
+<a href="#derivepassphrase.cli.ClickEchoStderrHandler.emit" class="headerlink" title="Permanent link">&para;</a></h4>
1919
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">emit</span><span class="p">(</span><span class="n">record</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="logging.LogRecord" href="https://docs.python.org/3/library/logging.html#logging.LogRecord">LogRecord</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
1920
+</code></pre></div>
1921
+
1922
+    <div class="doc doc-contents ">
1923
+
1924
+        <p>Emit a log record.</p>
1925
+<p>Format the log record, then emit it via <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.echo"><code>click.echo</code></a> to
1926
+<a class="autorefs autorefs-external" href="https://docs.python.org/3/library/sys.html#sys.stderr"><code>sys.stderr</code></a>.</p>
1927
+
1928
+    </div>
1929
+
1930
+</div>
1931
+
1932
+
1933
+
1934
+  </div>
1935
+
1936
+    </div>
1937
+
1938
+</div>
1939
+
1940
+<div class="doc doc-object doc-class">
1941
+
1942
+
1943
+
1944
+<h3 id="derivepassphrase.cli.CLIofPackageFormatter" class="doc doc-heading">
1945
+<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">CLIofPackageFormatter</span>
1946
+
1947
+
1948
+<a href="#derivepassphrase.cli.CLIofPackageFormatter" class="headerlink" title="Permanent link">&para;</a></h3>
1949
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">CLIofPackageFormatter</span><span class="p">(</span>
1950
+    <span class="o">*</span><span class="p">,</span>
1951
+    <span class="n">prog_name</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></span> <span class="o">=</span> <span class="n"><span title="derivepassphrase.cli.PROG_NAME">PROG_NAME</span></span><span class="p">,</span>
1952
+    <span class="n">package_name</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
1953
+<span class="p">)</span>
1954
+</code></pre></div>
1955
+
1956
+    <div class="doc doc-contents ">
1957
+            <p class="doc doc-class-bases">
1958
+              Bases: <code><a class="autorefs autorefs-external" title="logging.Formatter" href="https://docs.python.org/3/library/logging.html#logging.Formatter">Formatter</a></code></p>
1959
+
1960
+
1961
+
1962
+        <p>A <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/logging.html#logging.LogRecord"><code>logging.LogRecord</code></a> formatter for the CLI of a Python package.</p>
1963
+<p>Assuming a package <code>PKG</code> and loggers within the same hierarchy
1964
+<code>PKG</code>, format all log records from that hierarchy for proper user
1965
+feedback on the console.  Intended for use with <a href="https://pypi.org/projects/click/"><code>click</code></a> and
1966
+when <code>PKG</code> provides a command-line tool <code>PKG</code> and when logs from
1967
+that package should show up as output of the command-line tool.</p>
1968
+<p>Essentially, this prepends certain short strings to the log message
1969
+lines to make them readable as standard error output.</p>
1970
+<p>Because this log output is intended to be displayed on standard
1971
+error as high-level diagnostic output, you are strongly discouraged
1972
+from changing the output format to include more tokens besides the
1973
+log message.  Use a dedicated log file handler instead, without this
1974
+formatter.</p>
1975
+
1976
+
1977
+
1978
+
1979
+
1980
+
1981
+
1982
+
1983
+
1984
+  <div class="doc doc-children">
1985
+
1986
+
1987
+
1988
+
1989
+
1990
+
1991
+
1992
+
1993
+
1994
+<div class="doc doc-object doc-function">
1995
+
1996
+
1997
+<h4 id="derivepassphrase.cli.CLIofPackageFormatter.format" class="doc doc-heading">
1998
+<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code>            <span class="doc doc-object-name doc-function-name">format</span>
1999
+
2000
+
2001
+<a href="#derivepassphrase.cli.CLIofPackageFormatter.format" class="headerlink" title="Permanent link">&para;</a></h4>
2002
+<div class="doc-signature highlight"><pre><span></span><code><span class="nb">format</span><span class="p">(</span><span class="nf">record</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="logging.LogRecord" href="https://docs.python.org/3/library/logging.html#logging.LogRecord">LogRecord</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></span>
2003
+</code></pre></div>
2004
+
2005
+    <div class="doc doc-contents ">
2006
+
2007
+        <p>Format a log record suitably for standard error console output.</p>
2008
+<p>Prepend the formatted string <code>"PROG_NAME: LABEL"</code> to each line
2009
+of the message, where <code>PROG_NAME</code> is the program name, and
2010
+<code>LABEL</code> depends on the record&rsquo;s level and on the logger name as
2011
+follows:</p>
2012
+<ul>
2013
+<li>For records at level <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/logging.html#logging.DEBUG"><code>logging.DEBUG</code></a>, <code>LABEL</code> is
2014
+    <code>"Debug: "</code>.</li>
2015
+<li>For records at level <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/logging.html#logging.INFO"><code>logging.INFO</code></a>, <code>LABEL</code> is the
2016
+    empty string.</li>
2017
+<li>For records at level <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/logging.html#logging.WARNING"><code>logging.WARNING</code></a>, <code>LABEL</code> is
2018
+    <code>"Deprecation warning: "</code> if the logger is named
2019
+    <code>PKG.deprecation</code> (where <code>PKG</code> is the package name), else
2020
+    <code>"Warning: "</code>.</li>
2021
+<li>For records at level <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/logging.html#logging.ERROR"><code>logging.ERROR</code></a> and
2022
+    <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/logging.html#logging.CRITICAL"><code>logging.CRITICAL</code></a> <code>"Error: "</code>, <code>LABEL</code> is the empty
2023
+    string.</li>
2024
+</ul>
2025
+<p>The level indication strings at level <code>WARNING</code> or above are
2026
+highlighted.  Use <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.echo"><code>click.echo</code></a> to output them and remove
2027
+color output if necessary.</p>
2028
+
2029
+
2030
+<p><span class="doc-section-title">Parameters:</span></p>
1347 2031
     <table>
1348 2032
       <thead>
1349 2033
         <tr>
1350 2034
           <th>Name</th>
1351 2035
           <th>Type</th>
1352 2036
           <th>Description</th>
2037
+          <th>Default</th>
1353 2038
         </tr>
1354 2039
       </thead>
1355 2040
       <tbody>
1356 2041
           <tr class="doc-section-item">
1357
-            <td><code><a class="autorefs autorefs-internal" title="derivepassphrase.cli.OptionGroupOption.option_group_name" href="#derivepassphrase.cli.OptionGroupOption.option_group_name">option_group_name</a></code></td>
1358 2042
             <td>
1359
-                  <code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></code>
2043
+                <code>record</code>
2044
+            </td>
2045
+            <td>
2046
+                  <code><a class="autorefs autorefs-external" title="logging.LogRecord" href="https://docs.python.org/3/library/logging.html#logging.LogRecord">LogRecord</a></code>
1360 2047
             </td>
1361 2048
             <td>
1362 2049
               <div class="doc-md-description">
1363
-                <p>The name of the option group.  Used as a heading on the help
1364
-text for options in this section.</p>
2050
+                <p>A log record.</p>
1365 2051
               </div>
1366 2052
             </td>
2053
+            <td>
2054
+                <em>required</em>
2055
+            </td>
2056
+          </tr>
2057
+      </tbody>
2058
+    </table>
2059
+
2060
+
2061
+    <p><span class="doc-section-title">Returns:</span></p>
2062
+    <table>
2063
+      <thead>
2064
+        <tr>
2065
+          <th>Type</th>
2066
+          <th>Description</th>
1367 2067
         </tr>
2068
+      </thead>
2069
+      <tbody>
1368 2070
           <tr class="doc-section-item">
1369
-            <td><code><a class="autorefs autorefs-internal" title="derivepassphrase.cli.OptionGroupOption.epilog" href="#derivepassphrase.cli.OptionGroupOption.epilog">epilog</a></code></td>
1370 2071
             <td>
1371 2072
                   <code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></code>
1372 2073
             </td>
1373 2074
             <td>
1374 2075
               <div class="doc-md-description">
1375
-                <p>An epilog to print after listing the options in this
1376
-section.</p>
2076
+                <p>A formatted log record.</p>
2077
+              </div>
2078
+            </td>
2079
+          </tr>
2080
+      </tbody>
2081
+    </table>
2082
+
2083
+
2084
+<p><span class="doc-section-title">Raises:</span></p>
2085
+    <table>
2086
+      <thead>
2087
+        <tr>
2088
+          <th>Type</th>
2089
+          <th>Description</th>
2090
+        </tr>
2091
+      </thead>
2092
+      <tbody>
2093
+          <tr class="doc-section-item">
2094
+            <td>
2095
+                  <code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/exceptions.html#AssertionError">AssertionError</a></code>
2096
+            </td>
2097
+            <td>
2098
+              <div class="doc-md-description">
2099
+                <p>The log level is not supported.</p>
2100
+              </div>
2101
+            </td>
2102
+          </tr>
2103
+      </tbody>
2104
+    </table>
2105
+
2106
+    </div>
2107
+
2108
+</div>
2109
+
2110
+
2111
+
2112
+  </div>
2113
+
2114
+    </div>
2115
+
2116
+</div>
2117
+
2118
+<div class="doc doc-object doc-class">
2119
+
2120
+
2121
+
2122
+<h3 id="derivepassphrase.cli.StandardCLILogging" class="doc doc-heading">
2123
+<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">StandardCLILogging</span>
2124
+
2125
+
2126
+<a href="#derivepassphrase.cli.StandardCLILogging" class="headerlink" title="Permanent link">&para;</a></h3>
2127
+
2128
+
2129
+    <div class="doc doc-contents ">
2130
+
2131
+
2132
+
2133
+        <p>Set up CLI logging handlers upon instantiation.</p>
2134
+
2135
+
2136
+
2137
+
2138
+
2139
+
2140
+
2141
+
2142
+
2143
+  <div class="doc doc-children">
2144
+
2145
+
2146
+
2147
+
2148
+
2149
+
2150
+
2151
+
2152
+
2153
+<div class="doc doc-object doc-function">
2154
+
2155
+
2156
+<h4 id="derivepassphrase.cli.StandardCLILogging.ensure_standard_logging" class="doc doc-heading">
2157
+<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code>            <span class="doc doc-object-name doc-function-name">ensure_standard_logging</span>
2158
+
2159
+
2160
+  <span class="doc doc-labels">
2161
+      <small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
2162
+  </span>
2163
+
2164
+<a href="#derivepassphrase.cli.StandardCLILogging.ensure_standard_logging" class="headerlink" title="Permanent link">&para;</a></h4>
2165
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">ensure_standard_logging</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-internal" title="derivepassphrase.cli.StandardLoggingContextManager" href="#derivepassphrase.cli.StandardLoggingContextManager">StandardLoggingContextManager</a></span>
2166
+</code></pre></div>
2167
+
2168
+    <div class="doc doc-contents ">
2169
+
2170
+        <p>Return a context manager to ensure standard logging is set up.</p>
2171
+
2172
+    </div>
2173
+
2174
+</div>
2175
+
2176
+<div class="doc doc-object doc-function">
2177
+
2178
+
2179
+<h4 id="derivepassphrase.cli.StandardCLILogging.ensure_standard_warnings_logging" class="doc doc-heading">
2180
+<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code>            <span class="doc doc-object-name doc-function-name">ensure_standard_warnings_logging</span>
2181
+
2182
+
2183
+  <span class="doc doc-labels">
2184
+      <small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
2185
+  </span>
2186
+
2187
+<a href="#derivepassphrase.cli.StandardCLILogging.ensure_standard_warnings_logging" class="headerlink" title="Permanent link">&para;</a></h4>
2188
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">ensure_standard_warnings_logging</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="p">(</span>
2189
+    <span class="n"><a class="autorefs autorefs-internal" title="derivepassphrase.cli.StandardWarningsLoggingContextManager" href="#derivepassphrase.cli.StandardWarningsLoggingContextManager">StandardWarningsLoggingContextManager</a></span>
2190
+<span class="p">)</span>
2191
+</code></pre></div>
2192
+
2193
+    <div class="doc doc-contents ">
2194
+
2195
+        <p>Return a context manager to ensure warnings logging is set up.</p>
2196
+
2197
+    </div>
2198
+
2199
+</div>
2200
+
2201
+
2202
+
2203
+  </div>
2204
+
2205
+    </div>
2206
+
2207
+</div>
2208
+
2209
+<div class="doc doc-object doc-class">
2210
+
2211
+
2212
+
2213
+<h3 id="derivepassphrase.cli.StandardLoggingContextManager" class="doc doc-heading">
2214
+<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">StandardLoggingContextManager</span>
2215
+
2216
+
2217
+<a href="#derivepassphrase.cli.StandardLoggingContextManager" class="headerlink" title="Permanent link">&para;</a></h3>
2218
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">StandardLoggingContextManager</span><span class="p">(</span>
2219
+    <span class="n">handler</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="logging.Handler" href="https://docs.python.org/3/library/logging.html#logging.Handler">Handler</a></span><span class="p">,</span> <span class="n">root_logger</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
2220
+<span class="p">)</span>
2221
+</code></pre></div>
2222
+
2223
+    <div class="doc doc-contents ">
2224
+
2225
+
2226
+
2227
+        <p>A reentrant context manager setting up standard CLI logging.</p>
2228
+<p>Ensures that the given handler (defaulting to the CLI logging
2229
+handler) is added to the named logger (defaulting to the root
2230
+logger), and if it had to be added, then that it will be removed
2231
+upon exiting the context.</p>
2232
+<p>Reentrant, but not thread safe, because it temporarily modifies
2233
+global state.</p>
2234
+
2235
+
2236
+
2237
+
2238
+
2239
+
2240
+
2241
+
2242
+
2243
+  <div class="doc doc-children">
2244
+
2245
+
2246
+
2247
+
2248
+
2249
+
2250
+
2251
+
2252
+
2253
+
2254
+
2255
+  </div>
2256
+
2257
+    </div>
2258
+
2259
+</div>
2260
+
2261
+<div class="doc doc-object doc-class">
2262
+
2263
+
2264
+
2265
+<h3 id="derivepassphrase.cli.StandardWarningsLoggingContextManager" class="doc doc-heading">
2266
+<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">StandardWarningsLoggingContextManager</span>
2267
+
2268
+
2269
+<a href="#derivepassphrase.cli.StandardWarningsLoggingContextManager" class="headerlink" title="Permanent link">&para;</a></h3>
2270
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">StandardWarningsLoggingContextManager</span><span class="p">(</span><span class="n">handler</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="logging.Handler" href="https://docs.python.org/3/library/logging.html#logging.Handler">Handler</a></span><span class="p">)</span>
2271
+</code></pre></div>
2272
+
2273
+    <div class="doc doc-contents ">
2274
+            <p class="doc doc-class-bases">
2275
+              Bases: <code><a class="autorefs autorefs-internal" title="derivepassphrase.cli.StandardLoggingContextManager" href="#derivepassphrase.cli.StandardLoggingContextManager">StandardLoggingContextManager</a></code></p>
2276
+
2277
+
2278
+
2279
+        <p>A reentrant context manager setting up standard warnings logging.</p>
2280
+<p>Ensures that warnings are being diverted to the logging system, and
2281
+that the given handler (defaulting to the CLI logging handler) is
2282
+added to the warnings logger. If the handler had to be added, then
2283
+it will be removed upon exiting the context.</p>
2284
+<p>Reentrant, but not thread safe, because it temporarily modifies
2285
+global state.</p>
2286
+
2287
+
2288
+
2289
+
2290
+
2291
+
2292
+
2293
+
2294
+
2295
+  <div class="doc doc-children">
2296
+
2297
+
2298
+
2299
+
2300
+
2301
+
2302
+
2303
+
2304
+
2305
+
2306
+
2307
+  </div>
2308
+
2309
+    </div>
2310
+
2311
+</div>
2312
+
2313
+<div class="doc doc-object doc-class">
2314
+
2315
+
2316
+
2317
+<h3 id="derivepassphrase.cli.OptionGroupOption" class="doc doc-heading">
2318
+<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">OptionGroupOption</span>
2319
+
2320
+
2321
+<a href="#derivepassphrase.cli.OptionGroupOption" class="headerlink" title="Permanent link">&para;</a></h3>
2322
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">OptionGroupOption</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">)</span>
2323
+</code></pre></div>
2324
+
2325
+    <div class="doc doc-contents ">
2326
+            <p class="doc doc-class-bases">
2327
+              Bases: <code><a class="autorefs autorefs-external" title="click.Option" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Option">Option</a></code></p>
2328
+
2329
+
2330
+
2331
+        <p>A <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Option"><code>click.Option</code></a> with an associated group name and group epilog.</p>
2332
+<p>Used by <a class="autorefs autorefs-internal" href="#derivepassphrase.cli.CommandWithHelpGroups"><code>CommandWithHelpGroups</code></a> to print help sections.  Each
2333
+subclass contains its own group name and epilog.</p>
2334
+
2335
+
2336
+<p><span class="doc-section-title">Attributes:</span></p>
2337
+    <table>
2338
+      <thead>
2339
+        <tr>
2340
+          <th>Name</th>
2341
+          <th>Type</th>
2342
+          <th>Description</th>
2343
+        </tr>
2344
+      </thead>
2345
+      <tbody>
2346
+          <tr class="doc-section-item">
2347
+            <td><code><a class="autorefs autorefs-internal" title="derivepassphrase.cli.OptionGroupOption.option_group_name" href="#derivepassphrase.cli.OptionGroupOption.option_group_name">option_group_name</a></code></td>
2348
+            <td>
2349
+                  <code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#object">object</a></code>
2350
+            </td>
2351
+            <td>
2352
+              <div class="doc-md-description">
2353
+                <p>The name of the option group.  Used as a heading on the help
2354
+text for options in this section.</p>
2355
+              </div>
2356
+            </td>
2357
+          </tr>
2358
+          <tr class="doc-section-item">
2359
+            <td><code><a class="autorefs autorefs-internal" title="derivepassphrase.cli.OptionGroupOption.epilog" href="#derivepassphrase.cli.OptionGroupOption.epilog">epilog</a></code></td>
2360
+            <td>
2361
+                  <code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#object">object</a></code>
2362
+            </td>
2363
+            <td>
2364
+              <div class="doc-md-description">
2365
+                <p>An epilog to print after listing the options in this
2366
+section.</p>
2367
+              </div>
2368
+            </td>
2369
+          </tr>
2370
+      </tbody>
2371
+    </table>
2372
+
2373
+
2374
+
2375
+
2376
+
2377
+
2378
+
2379
+
2380
+
2381
+  <div class="doc doc-children">
2382
+
2383
+
2384
+
2385
+
2386
+
2387
+
2388
+
2389
+<div class="doc doc-object doc-attribute">
2390
+
2391
+
2392
+
2393
+<h4 id="derivepassphrase.cli.OptionGroupOption.option_group_name" class="doc doc-heading">
2394
+<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code>            <span class="doc doc-object-name doc-attribute-name">option_group_name</span>
2395
+
2396
+
2397
+  <span class="doc doc-labels">
2398
+      <small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
2399
+      <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
2400
+  </span>
2401
+
2402
+<a href="#derivepassphrase.cli.OptionGroupOption.option_group_name" class="headerlink" title="Permanent link">&para;</a></h4>
2403
+<div class="doc-signature highlight"><pre><span></span><code><span class="n">option_group_name</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#object">object</a></span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
2404
+</code></pre></div>
2405
+
2406
+    <div class="doc doc-contents ">
2407
+
2408
+        
2409
+    </div>
2410
+
2411
+</div>
2412
+
2413
+<div class="doc doc-object doc-attribute">
2414
+
2415
+
2416
+
2417
+<h4 id="derivepassphrase.cli.OptionGroupOption.epilog" class="doc doc-heading">
2418
+<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code>            <span class="doc doc-object-name doc-attribute-name">epilog</span>
2419
+
2420
+
2421
+  <span class="doc doc-labels">
2422
+      <small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
2423
+      <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
2424
+  </span>
2425
+
2426
+<a href="#derivepassphrase.cli.OptionGroupOption.epilog" class="headerlink" title="Permanent link">&para;</a></h4>
2427
+<div class="doc-signature highlight"><pre><span></span><code><span class="n">epilog</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#object">object</a></span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
2428
+</code></pre></div>
2429
+
2430
+    <div class="doc doc-contents ">
2431
+
2432
+        
2433
+    </div>
2434
+
2435
+</div>
2436
+
2437
+
2438
+
2439
+
2440
+
2441
+  </div>
2442
+
2443
+    </div>
2444
+
2445
+</div>
2446
+
2447
+<div class="doc doc-object doc-class">
2448
+
2449
+
2450
+
2451
+<h3 id="derivepassphrase.cli.CommandWithHelpGroups" class="doc doc-heading">
2452
+<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">CommandWithHelpGroups</span>
2453
+
2454
+
2455
+<a href="#derivepassphrase.cli.CommandWithHelpGroups" class="headerlink" title="Permanent link">&para;</a></h3>
2456
+
2457
+
2458
+    <div class="doc doc-contents ">
2459
+            <p class="doc doc-class-bases">
2460
+              Bases: <code><a class="autorefs autorefs-external" title="click.Command" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Command">Command</a></code></p>
2461
+
2462
+
2463
+
2464
+        <p>A <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Command"><code>click.Command</code></a> with support for some help text customizations.</p>
2465
+<p>Supports help/option groups, group epilogs, and help text objects
2466
+(objects that stringify to help texts).  The latter is primarily
2467
+used to implement translations.</p>
2468
+<p>Inspired by <a href="https://github.com/pallets/click/issues/373#issuecomment-515293746">a comment on <code>pallets/click#373</code></a> for
2469
+help/option group support, and further modified to include group
2470
+epilogs and help text objects.</p>
2471
+
2472
+
2473
+
2474
+
2475
+
2476
+
2477
+
2478
+
2479
+
2480
+  <div class="doc doc-children">
2481
+
2482
+
2483
+
2484
+
2485
+
2486
+
2487
+
2488
+
2489
+
2490
+<div class="doc doc-object doc-function">
2491
+
2492
+
2493
+<h4 id="derivepassphrase.cli.CommandWithHelpGroups.collect_usage_pieces" class="doc doc-heading">
2494
+<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code>            <span class="doc doc-object-name doc-function-name">collect_usage_pieces</span>
2495
+
2496
+
2497
+<a href="#derivepassphrase.cli.CommandWithHelpGroups.collect_usage_pieces" class="headerlink" title="Permanent link">&para;</a></h4>
2498
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">collect_usage_pieces</span><span class="p">(</span><span class="n">ctx</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#list">list</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></span><span class="p">]</span>
2499
+</code></pre></div>
2500
+
2501
+    <div class="doc doc-contents ">
2502
+
2503
+        <p>Return the pieces for the usage string.</p>
2504
+<p>Based on code from click 8.1.  Subject to the following license
2505
+(3-clause BSD license):</p>
2506
+<pre><code>Copyright 2024 Pallets
2507
+
2508
+Redistribution and use in source and binary forms, with or
2509
+without modification, are permitted provided that the
2510
+following conditions are met:
2511
+
2512
+ 1. Redistributions of source code must retain the above
2513
+    copyright notice, this list of conditions and the
2514
+    following disclaimer.
2515
+
2516
+ 2. Redistributions in binary form must reproduce the above
2517
+    copyright notice, this list of conditions and the
2518
+    following disclaimer in the documentation and/or other
2519
+    materials provided with the distribution.
2520
+
2521
+ 3. Neither the name of the copyright holder nor the names
2522
+    of its contributors may be used to endorse or promote
2523
+    products derived from this software without specific
2524
+    prior written permission.
2525
+
2526
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
2527
+CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES,
2528
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
2529
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2530
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
2531
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2532
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2533
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2534
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2535
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2536
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2537
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2538
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2539
+</code></pre>
2540
+<p>Modifications are marked with respective comments.  They too are
2541
+released under the same license above.  The original code did
2542
+not contain any &ldquo;noqa&rdquo; or &ldquo;pragma&rdquo; comments.</p>
2543
+
2544
+
2545
+<p><span class="doc-section-title">Parameters:</span></p>
2546
+    <table>
2547
+      <thead>
2548
+        <tr>
2549
+          <th>Name</th>
2550
+          <th>Type</th>
2551
+          <th>Description</th>
2552
+          <th>Default</th>
2553
+        </tr>
2554
+      </thead>
2555
+      <tbody>
2556
+          <tr class="doc-section-item">
2557
+            <td>
2558
+                <code>ctx</code>
2559
+            </td>
2560
+            <td>
2561
+                  <code><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></code>
2562
+            </td>
2563
+            <td>
2564
+              <div class="doc-md-description">
2565
+                <p>The click context.</p>
2566
+              </div>
2567
+            </td>
2568
+            <td>
2569
+                <em>required</em>
2570
+            </td>
2571
+          </tr>
2572
+      </tbody>
2573
+    </table>
2574
+
2575
+    </div>
2576
+
2577
+</div>
2578
+
2579
+<div class="doc doc-object doc-function">
2580
+
2581
+
2582
+<h4 id="derivepassphrase.cli.CommandWithHelpGroups.get_help_option" class="doc doc-heading">
2583
+<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code>            <span class="doc doc-object-name doc-function-name">get_help_option</span>
2584
+
2585
+
2586
+<a href="#derivepassphrase.cli.CommandWithHelpGroups.get_help_option" class="headerlink" title="Permanent link">&para;</a></h4>
2587
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">get_help_option</span><span class="p">(</span><span class="n">ctx</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-external" title="click.Option" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Option">Option</a></span> <span class="o">|</span> <span class="kc">None</span>
2588
+</code></pre></div>
2589
+
2590
+    <div class="doc doc-contents ">
2591
+
2592
+        <p>Return a standard help option object.</p>
2593
+<p>Based on code from click 8.1.  Subject to the following license
2594
+(3-clause BSD license):</p>
2595
+<pre><code>Copyright 2024 Pallets
2596
+
2597
+Redistribution and use in source and binary forms, with or
2598
+without modification, are permitted provided that the
2599
+following conditions are met:
2600
+
2601
+ 1. Redistributions of source code must retain the above
2602
+    copyright notice, this list of conditions and the
2603
+    following disclaimer.
2604
+
2605
+ 2. Redistributions in binary form must reproduce the above
2606
+    copyright notice, this list of conditions and the
2607
+    following disclaimer in the documentation and/or other
2608
+    materials provided with the distribution.
2609
+
2610
+ 3. Neither the name of the copyright holder nor the names
2611
+    of its contributors may be used to endorse or promote
2612
+    products derived from this software without specific
2613
+    prior written permission.
2614
+
2615
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
2616
+CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES,
2617
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
2618
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2619
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
2620
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2621
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2622
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2623
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2624
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2625
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2626
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2627
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2628
+</code></pre>
2629
+<p>Modifications are marked with respective comments.  They too are
2630
+released under the same license above.  The original code did
2631
+not contain any &ldquo;noqa&rdquo; or &ldquo;pragma&rdquo; comments.</p>
2632
+
2633
+
2634
+<p><span class="doc-section-title">Parameters:</span></p>
2635
+    <table>
2636
+      <thead>
2637
+        <tr>
2638
+          <th>Name</th>
2639
+          <th>Type</th>
2640
+          <th>Description</th>
2641
+          <th>Default</th>
2642
+        </tr>
2643
+      </thead>
2644
+      <tbody>
2645
+          <tr class="doc-section-item">
2646
+            <td>
2647
+                <code>ctx</code>
2648
+            </td>
2649
+            <td>
2650
+                  <code><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></code>
2651
+            </td>
2652
+            <td>
2653
+              <div class="doc-md-description">
2654
+                <p>The click context.</p>
2655
+              </div>
2656
+            </td>
2657
+            <td>
2658
+                <em>required</em>
2659
+            </td>
2660
+          </tr>
2661
+      </tbody>
2662
+    </table>
2663
+
2664
+    </div>
2665
+
2666
+</div>
2667
+
2668
+<div class="doc doc-object doc-function">
2669
+
2670
+
2671
+<h4 id="derivepassphrase.cli.CommandWithHelpGroups.get_short_help_str" class="doc doc-heading">
2672
+<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code>            <span class="doc doc-object-name doc-function-name">get_short_help_str</span>
2673
+
2674
+
2675
+<a href="#derivepassphrase.cli.CommandWithHelpGroups.get_short_help_str" class="headerlink" title="Permanent link">&para;</a></h4>
2676
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">get_short_help_str</span><span class="p">(</span><span class="n">limit</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#int">int</a></span> <span class="o">=</span> <span class="mi">45</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></span>
2677
+</code></pre></div>
2678
+
2679
+    <div class="doc doc-contents ">
2680
+
2681
+        <p>Return the short help string for a command.</p>
2682
+<p>If only a long help string is given, shorten it.</p>
2683
+<p>Based on code from click 8.1.  Subject to the following license
2684
+(3-clause BSD license):</p>
2685
+<pre><code>Copyright 2024 Pallets
2686
+
2687
+Redistribution and use in source and binary forms, with or
2688
+without modification, are permitted provided that the
2689
+following conditions are met:
2690
+
2691
+ 1. Redistributions of source code must retain the above
2692
+    copyright notice, this list of conditions and the
2693
+    following disclaimer.
2694
+
2695
+ 2. Redistributions in binary form must reproduce the above
2696
+    copyright notice, this list of conditions and the
2697
+    following disclaimer in the documentation and/or other
2698
+    materials provided with the distribution.
2699
+
2700
+ 3. Neither the name of the copyright holder nor the names
2701
+    of its contributors may be used to endorse or promote
2702
+    products derived from this software without specific
2703
+    prior written permission.
2704
+
2705
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
2706
+CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES,
2707
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
2708
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2709
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
2710
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2711
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2712
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2713
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2714
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2715
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2716
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2717
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2718
+</code></pre>
2719
+<p>Modifications are marked with respective comments.  They too are
2720
+released under the same license above.  The original code did
2721
+not contain any &ldquo;noqa&rdquo; or &ldquo;pragma&rdquo; comments.</p>
2722
+
2723
+
2724
+<p><span class="doc-section-title">Parameters:</span></p>
2725
+    <table>
2726
+      <thead>
2727
+        <tr>
2728
+          <th>Name</th>
2729
+          <th>Type</th>
2730
+          <th>Description</th>
2731
+          <th>Default</th>
2732
+        </tr>
2733
+      </thead>
2734
+      <tbody>
2735
+          <tr class="doc-section-item">
2736
+            <td>
2737
+                <code>limit</code>
2738
+            </td>
2739
+            <td>
2740
+                  <code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#int">int</a></code>
2741
+            </td>
2742
+            <td>
2743
+              <div class="doc-md-description">
2744
+                <p>The maximum width of the short help string.</p>
2745
+              </div>
2746
+            </td>
2747
+            <td>
2748
+                  <code>45</code>
2749
+            </td>
2750
+          </tr>
2751
+      </tbody>
2752
+    </table>
2753
+
2754
+    </div>
2755
+
2756
+</div>
2757
+
2758
+<div class="doc doc-object doc-function">
2759
+
2760
+
2761
+<h4 id="derivepassphrase.cli.CommandWithHelpGroups.format_help_text" class="doc doc-heading">
2762
+<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code>            <span class="doc doc-object-name doc-function-name">format_help_text</span>
2763
+
2764
+
2765
+<a href="#derivepassphrase.cli.CommandWithHelpGroups.format_help_text" class="headerlink" title="Permanent link">&para;</a></h4>
2766
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">format_help_text</span><span class="p">(</span>
2767
+    <span class="n">ctx</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></span><span class="p">,</span> <span class="n">formatter</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.HelpFormatter" href="https://click.palletsprojects.com/en/8.1.x/api/#click.HelpFormatter">HelpFormatter</a></span>
2768
+<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
2769
+</code></pre></div>
2770
+
2771
+    <div class="doc doc-contents ">
2772
+
2773
+        <p>Format the help text prologue, if any.</p>
2774
+<p>Based on code from click 8.1.  Subject to the following license
2775
+(3-clause BSD license):</p>
2776
+<pre><code>Copyright 2024 Pallets
2777
+
2778
+Redistribution and use in source and binary forms, with or
2779
+without modification, are permitted provided that the
2780
+following conditions are met:
2781
+
2782
+ 1. Redistributions of source code must retain the above
2783
+    copyright notice, this list of conditions and the
2784
+    following disclaimer.
2785
+
2786
+ 2. Redistributions in binary form must reproduce the above
2787
+    copyright notice, this list of conditions and the
2788
+    following disclaimer in the documentation and/or other
2789
+    materials provided with the distribution.
2790
+
2791
+ 3. Neither the name of the copyright holder nor the names
2792
+    of its contributors may be used to endorse or promote
2793
+    products derived from this software without specific
2794
+    prior written permission.
2795
+
2796
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
2797
+CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES,
2798
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
2799
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2800
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
2801
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2802
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2803
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2804
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2805
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2806
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2807
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2808
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2809
+</code></pre>
2810
+<p>Modifications are marked with respective comments.  They too are
2811
+released under the same license above.  The original code did
2812
+not contain any &ldquo;noqa&rdquo; or &ldquo;pragma&rdquo; comments.</p>
2813
+
2814
+
2815
+<p><span class="doc-section-title">Parameters:</span></p>
2816
+    <table>
2817
+      <thead>
2818
+        <tr>
2819
+          <th>Name</th>
2820
+          <th>Type</th>
2821
+          <th>Description</th>
2822
+          <th>Default</th>
2823
+        </tr>
2824
+      </thead>
2825
+      <tbody>
2826
+          <tr class="doc-section-item">
2827
+            <td>
2828
+                <code>ctx</code>
2829
+            </td>
2830
+            <td>
2831
+                  <code><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></code>
2832
+            </td>
2833
+            <td>
2834
+              <div class="doc-md-description">
2835
+                <p>The click context.</p>
2836
+              </div>
2837
+            </td>
2838
+            <td>
2839
+                <em>required</em>
2840
+            </td>
2841
+          </tr>
2842
+          <tr class="doc-section-item">
2843
+            <td>
2844
+                <code>formatter</code>
2845
+            </td>
2846
+            <td>
2847
+                  <code><a class="autorefs autorefs-external" title="click.HelpFormatter" href="https://click.palletsprojects.com/en/8.1.x/api/#click.HelpFormatter">HelpFormatter</a></code>
2848
+            </td>
2849
+            <td>
2850
+              <div class="doc-md-description">
2851
+                <p>The formatter for the <code>--help</code> listing.</p>
2852
+              </div>
2853
+            </td>
2854
+            <td>
2855
+                <em>required</em>
2856
+            </td>
2857
+          </tr>
2858
+      </tbody>
2859
+    </table>
2860
+
2861
+    </div>
2862
+
2863
+</div>
2864
+
2865
+<div class="doc doc-object doc-function">
2866
+
2867
+
2868
+<h4 id="derivepassphrase.cli.CommandWithHelpGroups.format_options" class="doc doc-heading">
2869
+<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code>            <span class="doc doc-object-name doc-function-name">format_options</span>
2870
+
2871
+
2872
+<a href="#derivepassphrase.cli.CommandWithHelpGroups.format_options" class="headerlink" title="Permanent link">&para;</a></h4>
2873
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">format_options</span><span class="p">(</span>
2874
+    <span class="n">ctx</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></span><span class="p">,</span> <span class="n">formatter</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.HelpFormatter" href="https://click.palletsprojects.com/en/8.1.x/api/#click.HelpFormatter">HelpFormatter</a></span>
2875
+<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
2876
+</code></pre></div>
2877
+
2878
+    <div class="doc doc-contents ">
2879
+
2880
+        <p>Format options on the help listing, grouped into sections.</p>
2881
+<p>This is a callback for <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Command.get_help"><code>click.Command.get_help</code></a> that
2882
+implements the <code>--help</code> listing, by calling appropriate methods
2883
+of the <code>formatter</code>.  We list all options (like the base
2884
+implementation), but grouped into sections according to the
2885
+concrete <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Option"><code>click.Option</code></a> subclass being used.  If the option
2886
+is an instance of some subclass of <a class="autorefs autorefs-internal" href="#derivepassphrase.cli.OptionGroupOption"><code>OptionGroupOption</code></a>, then
2887
+the section heading and the epilog are taken from the
2888
+<a class="autorefs autorefs-internal" href="#derivepassphrase.cli.OptionGroupOption.option_group_name"><code>option_group_name</code></a> and
2889
+<a class="autorefs autorefs-internal" href="#derivepassphrase.cli.OptionGroupOption.epilog"><code>epilog</code></a> attributes; otherwise, the
2890
+section heading is &ldquo;Options&rdquo; (or &ldquo;Other options&rdquo; if there are
2891
+other option groups) and the epilog is empty.</p>
2892
+<p>We unconditionally call <a class="autorefs autorefs-internal" href="#derivepassphrase.cli.CommandWithHelpGroups.format_commands"><code>format_commands</code></a>, and rely on it to
2893
+act as a no-op if we aren&rsquo;t actually a <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.MultiCommand"><code>click.MultiCommand</code></a>.</p>
2894
+<p>Based on code from click 8.1.  Subject to the following license
2895
+(3-clause BSD license):</p>
2896
+<pre><code>Copyright 2024 Pallets
2897
+
2898
+Redistribution and use in source and binary forms, with or
2899
+without modification, are permitted provided that the
2900
+following conditions are met:
2901
+
2902
+ 1. Redistributions of source code must retain the above
2903
+    copyright notice, this list of conditions and the
2904
+    following disclaimer.
2905
+
2906
+ 2. Redistributions in binary form must reproduce the above
2907
+    copyright notice, this list of conditions and the
2908
+    following disclaimer in the documentation and/or other
2909
+    materials provided with the distribution.
2910
+
2911
+ 3. Neither the name of the copyright holder nor the names
2912
+    of its contributors may be used to endorse or promote
2913
+    products derived from this software without specific
2914
+    prior written permission.
2915
+
2916
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
2917
+CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES,
2918
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
2919
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2920
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
2921
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2922
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2923
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2924
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2925
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2926
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2927
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2928
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2929
+</code></pre>
2930
+<p>Modifications are released under the same license above.</p>
2931
+
2932
+
2933
+<p><span class="doc-section-title">Parameters:</span></p>
2934
+    <table>
2935
+      <thead>
2936
+        <tr>
2937
+          <th>Name</th>
2938
+          <th>Type</th>
2939
+          <th>Description</th>
2940
+          <th>Default</th>
2941
+        </tr>
2942
+      </thead>
2943
+      <tbody>
2944
+          <tr class="doc-section-item">
2945
+            <td>
2946
+                <code>ctx</code>
2947
+            </td>
2948
+            <td>
2949
+                  <code><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></code>
2950
+            </td>
2951
+            <td>
2952
+              <div class="doc-md-description">
2953
+                <p>The click context.</p>
2954
+              </div>
2955
+            </td>
2956
+            <td>
2957
+                <em>required</em>
2958
+            </td>
2959
+          </tr>
2960
+          <tr class="doc-section-item">
2961
+            <td>
2962
+                <code>formatter</code>
2963
+            </td>
2964
+            <td>
2965
+                  <code><a class="autorefs autorefs-external" title="click.HelpFormatter" href="https://click.palletsprojects.com/en/8.1.x/api/#click.HelpFormatter">HelpFormatter</a></code>
2966
+            </td>
2967
+            <td>
2968
+              <div class="doc-md-description">
2969
+                <p>The formatter for the <code>--help</code> listing.</p>
2970
+              </div>
2971
+            </td>
2972
+            <td>
2973
+                <em>required</em>
2974
+            </td>
2975
+          </tr>
2976
+      </tbody>
2977
+    </table>
2978
+
2979
+    </div>
2980
+
2981
+</div>
2982
+
2983
+<div class="doc doc-object doc-function">
2984
+
2985
+
2986
+<h4 id="derivepassphrase.cli.CommandWithHelpGroups.format_commands" class="doc doc-heading">
2987
+<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code>            <span class="doc doc-object-name doc-function-name">format_commands</span>
2988
+
2989
+
2990
+<a href="#derivepassphrase.cli.CommandWithHelpGroups.format_commands" class="headerlink" title="Permanent link">&para;</a></h4>
2991
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">format_commands</span><span class="p">(</span>
2992
+    <span class="n">ctx</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></span><span class="p">,</span> <span class="n">formatter</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.HelpFormatter" href="https://click.palletsprojects.com/en/8.1.x/api/#click.HelpFormatter">HelpFormatter</a></span>
2993
+<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
2994
+</code></pre></div>
2995
+
2996
+    <div class="doc doc-contents ">
2997
+
2998
+        <p>Format the subcommands, if any.</p>
2999
+<p>If called on a command object that isn&rsquo;t derived from
3000
+<a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.MultiCommand"><code>click.MultiCommand</code></a>, then do nothing.</p>
3001
+<p>Based on code from click 8.1.  Subject to the following license
3002
+(3-clause BSD license):</p>
3003
+<pre><code>Copyright 2024 Pallets
3004
+
3005
+Redistribution and use in source and binary forms, with or
3006
+without modification, are permitted provided that the
3007
+following conditions are met:
3008
+
3009
+ 1. Redistributions of source code must retain the above
3010
+    copyright notice, this list of conditions and the
3011
+    following disclaimer.
3012
+
3013
+ 2. Redistributions in binary form must reproduce the above
3014
+    copyright notice, this list of conditions and the
3015
+    following disclaimer in the documentation and/or other
3016
+    materials provided with the distribution.
3017
+
3018
+ 3. Neither the name of the copyright holder nor the names
3019
+    of its contributors may be used to endorse or promote
3020
+    products derived from this software without specific
3021
+    prior written permission.
3022
+
3023
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
3024
+CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES,
3025
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
3026
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
3027
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
3028
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3029
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
3030
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
3031
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3032
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
3033
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
3034
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3035
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3036
+</code></pre>
3037
+<p>Modifications are marked with respective comments.  They too are
3038
+released under the same license above.  The original code did
3039
+not contain any &ldquo;noqa&rdquo; or &ldquo;pragma&rdquo; comments.</p>
3040
+
3041
+
3042
+<p><span class="doc-section-title">Parameters:</span></p>
3043
+    <table>
3044
+      <thead>
3045
+        <tr>
3046
+          <th>Name</th>
3047
+          <th>Type</th>
3048
+          <th>Description</th>
3049
+          <th>Default</th>
3050
+        </tr>
3051
+      </thead>
3052
+      <tbody>
3053
+          <tr class="doc-section-item">
3054
+            <td>
3055
+                <code>ctx</code>
3056
+            </td>
3057
+            <td>
3058
+                  <code><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></code>
3059
+            </td>
3060
+            <td>
3061
+              <div class="doc-md-description">
3062
+                <p>The click context.</p>
3063
+              </div>
3064
+            </td>
3065
+            <td>
3066
+                <em>required</em>
3067
+            </td>
3068
+          </tr>
3069
+          <tr class="doc-section-item">
3070
+            <td>
3071
+                <code>formatter</code>
3072
+            </td>
3073
+            <td>
3074
+                  <code><a class="autorefs autorefs-external" title="click.HelpFormatter" href="https://click.palletsprojects.com/en/8.1.x/api/#click.HelpFormatter">HelpFormatter</a></code>
3075
+            </td>
3076
+            <td>
3077
+              <div class="doc-md-description">
3078
+                <p>The formatter for the <code>--help</code> listing.</p>
3079
+              </div>
3080
+            </td>
3081
+            <td>
3082
+                <em>required</em>
3083
+            </td>
3084
+          </tr>
3085
+      </tbody>
3086
+    </table>
3087
+
3088
+    </div>
3089
+
3090
+</div>
3091
+
3092
+<div class="doc doc-object doc-function">
3093
+
3094
+
3095
+<h4 id="derivepassphrase.cli.CommandWithHelpGroups.format_epilog" class="doc doc-heading">
3096
+<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code>            <span class="doc doc-object-name doc-function-name">format_epilog</span>
3097
+
3098
+
3099
+<a href="#derivepassphrase.cli.CommandWithHelpGroups.format_epilog" class="headerlink" title="Permanent link">&para;</a></h4>
3100
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">format_epilog</span><span class="p">(</span>
3101
+    <span class="n">ctx</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></span><span class="p">,</span> <span class="n">formatter</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.HelpFormatter" href="https://click.palletsprojects.com/en/8.1.x/api/#click.HelpFormatter">HelpFormatter</a></span>
3102
+<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
3103
+</code></pre></div>
3104
+
3105
+    <div class="doc doc-contents ">
3106
+
3107
+        <p>Format the epilog, if any.</p>
3108
+<p>Based on code from click 8.1.  Subject to the following license
3109
+(3-clause BSD license):</p>
3110
+<pre><code>Copyright 2024 Pallets
3111
+
3112
+Redistribution and use in source and binary forms, with or
3113
+without modification, are permitted provided that the
3114
+following conditions are met:
3115
+
3116
+ 1. Redistributions of source code must retain the above
3117
+    copyright notice, this list of conditions and the
3118
+    following disclaimer.
3119
+
3120
+ 2. Redistributions in binary form must reproduce the above
3121
+    copyright notice, this list of conditions and the
3122
+    following disclaimer in the documentation and/or other
3123
+    materials provided with the distribution.
3124
+
3125
+ 3. Neither the name of the copyright holder nor the names
3126
+    of its contributors may be used to endorse or promote
3127
+    products derived from this software without specific
3128
+    prior written permission.
3129
+
3130
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
3131
+CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES,
3132
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
3133
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
3134
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
3135
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3136
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
3137
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
3138
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3139
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
3140
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
3141
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3142
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3143
+</code></pre>
3144
+<p>Modifications are marked with respective comments.  They too are
3145
+released under the same license above.</p>
3146
+
3147
+
3148
+<p><span class="doc-section-title">Parameters:</span></p>
3149
+    <table>
3150
+      <thead>
3151
+        <tr>
3152
+          <th>Name</th>
3153
+          <th>Type</th>
3154
+          <th>Description</th>
3155
+          <th>Default</th>
3156
+        </tr>
3157
+      </thead>
3158
+      <tbody>
3159
+          <tr class="doc-section-item">
3160
+            <td>
3161
+                <code>ctx</code>
3162
+            </td>
3163
+            <td>
3164
+                  <code><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></code>
3165
+            </td>
3166
+            <td>
3167
+              <div class="doc-md-description">
3168
+                <p>The click context.</p>
3169
+              </div>
3170
+            </td>
3171
+            <td>
3172
+                <em>required</em>
3173
+            </td>
3174
+          </tr>
3175
+          <tr class="doc-section-item">
3176
+            <td>
3177
+                <code>formatter</code>
3178
+            </td>
3179
+            <td>
3180
+                  <code><a class="autorefs autorefs-external" title="click.HelpFormatter" href="https://click.palletsprojects.com/en/8.1.x/api/#click.HelpFormatter">HelpFormatter</a></code>
3181
+            </td>
3182
+            <td>
3183
+              <div class="doc-md-description">
3184
+                <p>The formatter for the <code>--help</code> listing.</p>
3185
+              </div>
3186
+            </td>
3187
+            <td>
3188
+                <em>required</em>
3189
+            </td>
3190
+          </tr>
3191
+      </tbody>
3192
+    </table>
3193
+
3194
+    </div>
3195
+
3196
+</div>
3197
+
3198
+
3199
+
3200
+  </div>
3201
+
3202
+    </div>
3203
+
3204
+</div>
3205
+
3206
+<div class="doc doc-object doc-class">
3207
+
3208
+
3209
+
3210
+<h3 id="derivepassphrase.cli.LoggingOption" class="doc doc-heading">
3211
+<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">LoggingOption</span>
3212
+
3213
+
3214
+<a href="#derivepassphrase.cli.LoggingOption" class="headerlink" title="Permanent link">&para;</a></h3>
3215
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">LoggingOption</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">)</span>
3216
+</code></pre></div>
3217
+
3218
+    <div class="doc doc-contents ">
3219
+            <p class="doc doc-class-bases">
3220
+              Bases: <code><a class="autorefs autorefs-internal" title="derivepassphrase.cli.OptionGroupOption" href="#derivepassphrase.cli.OptionGroupOption">OptionGroupOption</a></code></p>
3221
+
3222
+
3223
+
3224
+        <p>Logging options for the CLI.</p>
3225
+
3226
+
3227
+
3228
+
3229
+
3230
+
3231
+
3232
+
3233
+
3234
+  <div class="doc doc-children">
3235
+
3236
+
3237
+
3238
+
3239
+
3240
+
3241
+
3242
+
3243
+
3244
+
3245
+
1377 3246
   </div>
1378
-            </td>
1379
-          </tr>
1380
-      </tbody>
1381
-    </table>
1382 3247
 
3248
+    </div>
1383 3249
 
3250
+</div>
1384 3251
 
3252
+<div class="doc doc-object doc-class">
1385 3253
 
1386 3254
 
1387 3255
 
3256
+<h3 id="derivepassphrase.cli.ZshComplete" class="doc doc-heading">
3257
+<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">ZshComplete</span>
1388 3258
 
1389 3259
 
3260
+<a href="#derivepassphrase.cli.ZshComplete" class="headerlink" title="Permanent link">&para;</a></h3>
1390 3261
 
1391
-  <div class="doc doc-children">
1392 3262
 
3263
+    <div class="doc doc-contents ">
3264
+            <p class="doc doc-class-bases">
3265
+              Bases: <code><span title="click.shell_completion.ZshComplete">ZshComplete</span></code></p>
1393 3266
 
1394 3267
 
1395 3268
 
3269
+        <p>Zsh completion class that supports colons.</p>
3270
+<p><code>click</code>&rsquo;s Zsh completion class (at least v8.1.7 and v8.1.8) uses
3271
+completion helper functions (provided by Zsh) that parse each
3272
+completion item into value-description pairs, separated by a colon.
3273
+Correspondingly, any internal colons in the completion item&rsquo;s value
3274
+need to be escaped.  <code>click</code> doesn&rsquo;t do this.  So, this subclass
3275
+overrides those parts, and adds the missing escaping.</p>
1396 3276
 
1397 3277
 
1398 3278
 
1399
-<div class="doc doc-object doc-attribute">
1400 3279
 
1401 3280
 
1402 3281
 
1403
-<h4 id="derivepassphrase.cli.OptionGroupOption.option_group_name" class="doc doc-heading">
1404
-<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code>            <span class="doc doc-object-name doc-attribute-name">option_group_name</span>
1405 3282
 
1406 3283
 
1407
-  <span class="doc doc-labels">
1408
-      <small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
1409
-      <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
1410
-  </span>
1411 3284
 
1412
-<a href="#derivepassphrase.cli.OptionGroupOption.option_group_name" class="headerlink" title="Permanent link">&para;</a></h4>
1413
-<div class="doc-signature highlight"><pre><span></span><code><span class="n">option_group_name</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
1414
-</code></pre></div>
3285
+  <div class="doc doc-children">
1415 3286
 
1416
-    <div class="doc doc-contents ">
1417 3287
 
1418 3288
 
1419
-    </div>
1420 3289
 
1421
-</div>
1422 3290
 
1423
-<div class="doc doc-object doc-attribute">
1424 3291
 
1425 3292
 
1426 3293
 
1427
-<h4 id="derivepassphrase.cli.OptionGroupOption.epilog" class="doc doc-heading">
1428
-<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code>            <span class="doc doc-object-name doc-attribute-name">epilog</span>
3294
+
3295
+<div class="doc doc-object doc-function">
1429 3296
 
1430 3297
 
1431
-  <span class="doc doc-labels">
1432
-      <small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
1433
-      <small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
1434
-  </span>
3298
+<h4 id="derivepassphrase.cli.ZshComplete.format_completion" class="doc doc-heading">
3299
+<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code>            <span class="doc doc-object-name doc-function-name">format_completion</span>
1435 3300
 
1436
-<a href="#derivepassphrase.cli.OptionGroupOption.epilog" class="headerlink" title="Permanent link">&para;</a></h4>
1437
-<div class="doc-signature highlight"><pre><span></span><code><span class="n">epilog</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
3301
+
3302
+<a href="#derivepassphrase.cli.ZshComplete.format_completion" class="headerlink" title="Permanent link">&para;</a></h4>
3303
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">format_completion</span><span class="p">(</span><span class="n">item</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.shell_completion.CompletionItem" href="https://click.palletsprojects.com/en/8.1.x/api/#click.shell_completion.CompletionItem">CompletionItem</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></span>
1438 3304
 </code></pre></div>
1439 3305
 
1440 3306
     <div class="doc doc-contents ">
1441 3307
 
3308
+        <p>Return a suitable serialization of the CompletionItem.</p>
3309
+<p>This serialization ensures colons in the item value are properly
3310
+escaped.</p>
1442 3311
 
1443 3312
     </div>
1444 3313
 
... ...
@@ -1458,22 +3325,21 @@ section.</p>
1458 3325
 
1459 3326
 
1460 3327
 
1461
-<h3 id="derivepassphrase.cli.CommandWithHelpGroups" class="doc doc-heading">
1462
-<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">CommandWithHelpGroups</span>
1463
-
3328
+<h3 id="derivepassphrase.cli.PassphraseGenerationOption" class="doc doc-heading">
3329
+<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">PassphraseGenerationOption</span>
1464 3330
 
1465
-<a href="#derivepassphrase.cli.CommandWithHelpGroups" class="headerlink" title="Permanent link">&para;</a></h3>
1466 3331
 
3332
+<a href="#derivepassphrase.cli.PassphraseGenerationOption" class="headerlink" title="Permanent link">&para;</a></h3>
3333
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">PassphraseGenerationOption</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">)</span>
3334
+</code></pre></div>
1467 3335
 
1468 3336
     <div class="doc doc-contents ">
1469 3337
             <p class="doc doc-class-bases">
1470
-              Bases: <code><a class="autorefs autorefs-external" title="click.Command" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Command">Command</a></code></p>
3338
+              Bases: <code><a class="autorefs autorefs-internal" title="derivepassphrase.cli.OptionGroupOption" href="#derivepassphrase.cli.OptionGroupOption">OptionGroupOption</a></code></p>
1471 3339
 
1472 3340
 
1473 3341
 
1474
-        <p>A <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Command"><code>click.Command</code></a> with support for help/option groups.</p>
1475
-<p>Inspired by <a href="https://github.com/pallets/click/issues/373#issuecomment-515293746">a comment on <code>pallets/click#373</code></a>, and
1476
-further modified to support group epilogs.</p>
3342
+        <p>Passphrase generation options for the CLI.</p>
1477 3343
 
1478 3344
 
1479 3345
 
... ...
@@ -1493,84 +3359,51 @@ further modified to support group epilogs.</p>
1493 3359
 
1494 3360
 
1495 3361
 
1496
-<div class="doc doc-object doc-function">
1497 3362
 
1498 3363
 
1499
-<h4 id="derivepassphrase.cli.CommandWithHelpGroups.format_options" class="doc doc-heading">
1500
-<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code>            <span class="doc doc-object-name doc-function-name">format_options</span>
3364
+  </div>
1501 3365
 
3366
+    </div>
1502 3367
 
1503
-<a href="#derivepassphrase.cli.CommandWithHelpGroups.format_options" class="headerlink" title="Permanent link">&para;</a></h4>
1504
-<div class="doc-signature highlight"><pre><span></span><code><span class="nf">format_options</span><span class="p">(</span>
1505
-    <span class="n">ctx</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></span><span class="p">,</span> <span class="n">formatter</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.HelpFormatter" href="https://click.palletsprojects.com/en/8.1.x/api/#click.HelpFormatter">HelpFormatter</a></span>
1506
-<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
3368
+</div>
3369
+
3370
+<div class="doc doc-object doc-class">
3371
+
3372
+
3373
+
3374
+<h3 id="derivepassphrase.cli.ConfigurationOption" class="doc doc-heading">
3375
+<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">ConfigurationOption</span>
3376
+
3377
+
3378
+<a href="#derivepassphrase.cli.ConfigurationOption" class="headerlink" title="Permanent link">&para;</a></h3>
3379
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">ConfigurationOption</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">)</span>
1507 3380
 </code></pre></div>
1508 3381
 
1509 3382
     <div class="doc doc-contents ">
3383
+            <p class="doc doc-class-bases">
3384
+              Bases: <code><a class="autorefs autorefs-internal" title="derivepassphrase.cli.OptionGroupOption" href="#derivepassphrase.cli.OptionGroupOption">OptionGroupOption</a></code></p>
3385
+
3386
+
3387
+
3388
+        <p>Configuration options for the CLI.</p>
3389
+
3390
+
3391
+
3392
+
3393
+
3394
+
3395
+
3396
+
3397
+
3398
+  <div class="doc doc-children">
3399
+
3400
+
3401
+
1510 3402
 
1511
-        <p>Format options on the help listing, grouped into sections.</p>
1512
-<p>This is a callback for <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Command.get_help"><code>click.Command.get_help</code></a> that
1513
-implements the <code>--help</code> listing, by calling appropriate methods
1514
-of the <code>formatter</code>.  We list all options (like the base
1515
-implementation), but grouped into sections according to the
1516
-concrete <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Option"><code>click.Option</code></a> subclass being used.  If the option
1517
-is an instance of some subclass of <a class="autorefs autorefs-internal" href="#derivepassphrase.cli.OptionGroupOption"><code>OptionGroupOption</code></a>, then
1518
-the section heading and the epilog are taken from the
1519
-<a class="autorefs autorefs-internal" href="#derivepassphrase.cli.OptionGroupOption.option_group_name"><code>option_group_name</code></a> and
1520
-<a class="autorefs autorefs-internal" href="#derivepassphrase.cli.OptionGroupOption.epilog"><code>epilog</code></a> attributes; otherwise, the
1521
-section heading is &ldquo;Options&rdquo; (or &ldquo;Other options&rdquo; if there are
1522
-other option groups) and the epilog is empty.</p>
1523 3403
 
1524 3404
 
1525
-<p><span class="doc-section-title">Parameters:</span></p>
1526
-    <table>
1527
-      <thead>
1528
-        <tr>
1529
-          <th>Name</th>
1530
-          <th>Type</th>
1531
-          <th>Description</th>
1532
-          <th>Default</th>
1533
-        </tr>
1534
-      </thead>
1535
-      <tbody>
1536
-          <tr class="doc-section-item">
1537
-            <td>
1538
-                <code>ctx</code>
1539
-            </td>
1540
-            <td>
1541
-                  <code><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></code>
1542
-            </td>
1543
-            <td>
1544
-              <div class="doc-md-description">
1545
-                <p>The click context.</p>
1546
-              </div>
1547
-            </td>
1548
-            <td>
1549
-                <em>required</em>
1550
-            </td>
1551
-          </tr>
1552
-          <tr class="doc-section-item">
1553
-            <td>
1554
-                <code>formatter</code>
1555
-            </td>
1556
-            <td>
1557
-                  <code><a class="autorefs autorefs-external" title="click.HelpFormatter" href="https://click.palletsprojects.com/en/8.1.x/api/#click.HelpFormatter">HelpFormatter</a></code>
1558
-            </td>
1559
-            <td>
1560
-              <div class="doc-md-description">
1561
-                <p>The formatter for the <code>--help</code> listing.</p>
1562
-              </div>
1563
-            </td>
1564
-            <td>
1565
-                <em>required</em>
1566
-            </td>
1567
-          </tr>
1568
-      </tbody>
1569
-    </table>
1570 3405
 
1571
-    </div>
1572 3406
 
1573
-</div>
1574 3407
 
1575 3408
 
1576 3409
 
... ...
@@ -1584,12 +3417,12 @@ other option groups) and the epilog is empty.</p>
1584 3417
 
1585 3418
 
1586 3419
 
1587
-<h3 id="derivepassphrase.cli.PasswordGenerationOption" class="doc doc-heading">
1588
-<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">PasswordGenerationOption</span>
3420
+<h3 id="derivepassphrase.cli.StorageManagementOption" class="doc doc-heading">
3421
+<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">StorageManagementOption</span>
1589 3422
 
1590 3423
 
1591
-<a href="#derivepassphrase.cli.PasswordGenerationOption" class="headerlink" title="Permanent link">&para;</a></h3>
1592
-<div class="doc-signature highlight"><pre><span></span><code><span class="nf">PasswordGenerationOption</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">)</span>
3424
+<a href="#derivepassphrase.cli.StorageManagementOption" class="headerlink" title="Permanent link">&para;</a></h3>
3425
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">StorageManagementOption</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">)</span>
1593 3426
 </code></pre></div>
1594 3427
 
1595 3428
     <div class="doc doc-contents ">
... ...
@@ -1598,7 +3431,7 @@ other option groups) and the epilog is empty.</p>
1598 3431
 
1599 3432
 
1600 3433
 
1601
-        <p>Password generation options for the CLI.</p>
3434
+        <p>Storage management options for the CLI.</p>
1602 3435
 
1603 3436
 
1604 3437
 
... ...
@@ -1630,12 +3463,12 @@ other option groups) and the epilog is empty.</p>
1630 3463
 
1631 3464
 
1632 3465
 
1633
-<h3 id="derivepassphrase.cli.ConfigurationOption" class="doc doc-heading">
1634
-<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">ConfigurationOption</span>
3466
+<h3 id="derivepassphrase.cli.CompatibilityOption" class="doc doc-heading">
3467
+<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">CompatibilityOption</span>
1635 3468
 
1636 3469
 
1637
-<a href="#derivepassphrase.cli.ConfigurationOption" class="headerlink" title="Permanent link">&para;</a></h3>
1638
-<div class="doc-signature highlight"><pre><span></span><code><span class="nf">ConfigurationOption</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">)</span>
3470
+<a href="#derivepassphrase.cli.CompatibilityOption" class="headerlink" title="Permanent link">&para;</a></h3>
3471
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">CompatibilityOption</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">)</span>
1639 3472
 </code></pre></div>
1640 3473
 
1641 3474
     <div class="doc doc-contents ">
... ...
@@ -1644,7 +3477,7 @@ other option groups) and the epilog is empty.</p>
1644 3477
 
1645 3478
 
1646 3479
 
1647
-        <p>Configuration options for the CLI.</p>
3480
+        <p>Compatibility and incompatibility options for the CLI.</p>
1648 3481
 
1649 3482
 
1650 3483
 
... ...
@@ -1672,47 +3505,128 @@ other option groups) and the epilog is empty.</p>
1672 3505
 
1673 3506
 </div>
1674 3507
 
1675
-<div class="doc doc-object doc-class">
1676 3508
 
3509
+<div class="doc doc-object doc-function">
1677 3510
 
1678 3511
 
1679
-<h3 id="derivepassphrase.cli.StorageManagementOption" class="doc doc-heading">
1680
-<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code>            <span class="doc doc-object-name doc-class-name">StorageManagementOption</span>
3512
+<h3 id="derivepassphrase.cli.adjust_logging_level" class="doc doc-heading">
3513
+<code class="doc-symbol doc-symbol-heading doc-symbol-function"></code>            <span class="doc doc-object-name doc-function-name">adjust_logging_level</span>
1681 3514
 
1682 3515
 
1683
-<a href="#derivepassphrase.cli.StorageManagementOption" class="headerlink" title="Permanent link">&para;</a></h3>
1684
-<div class="doc-signature highlight"><pre><span></span><code><span class="nf">StorageManagementOption</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span><span class="p">)</span>
3516
+<a href="#derivepassphrase.cli.adjust_logging_level" class="headerlink" title="Permanent link">&para;</a></h3>
3517
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">adjust_logging_level</span><span class="p">(</span>
3518
+    <span class="n">ctx</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></span><span class="p">,</span>
3519
+    <span class="o">/</span><span class="p">,</span>
3520
+    <span class="n">param</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.Parameter" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Parameter">Parameter</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
3521
+    <span class="n">value</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#int">int</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
3522
+<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
1685 3523
 </code></pre></div>
1686 3524
 
1687 3525
     <div class="doc doc-contents ">
1688
-            <p class="doc doc-class-bases">
1689
-              Bases: <code><a class="autorefs autorefs-internal" title="derivepassphrase.cli.OptionGroupOption" href="#derivepassphrase.cli.OptionGroupOption">OptionGroupOption</a></code></p>
1690 3526
 
3527
+        <p>Change the logs that are emitted to standard error.</p>
3528
+<p>This modifies the <a class="autorefs autorefs-internal" href="#derivepassphrase.cli.StandardCLILogging"><code>StandardCLILogging</code></a> settings such that log
3529
+records at the respective level are emitted, based on the <code>param</code>
3530
+and the <code>value</code>.</p>
1691 3531
 
3532
+    </div>
1692 3533
 
1693
-        <p>Storage management options for the CLI.</p>
3534
+</div>
1694 3535
 
3536
+<div class="doc doc-object doc-function">
1695 3537
 
1696 3538
 
3539
+<h3 id="derivepassphrase.cli.color_forcing_callback" class="doc doc-heading">
3540
+<code class="doc-symbol doc-symbol-heading doc-symbol-function"></code>            <span class="doc doc-object-name doc-function-name">color_forcing_callback</span>
1697 3541
 
1698 3542
 
3543
+<a href="#derivepassphrase.cli.color_forcing_callback" class="headerlink" title="Permanent link">&para;</a></h3>
3544
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">color_forcing_callback</span><span class="p">(</span>
3545
+    <span class="n">ctx</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></span><span class="p">,</span> <span class="n">param</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.Parameter" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Parameter">Parameter</a></span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing_extensions.Any" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.Any">Any</a></span>
3546
+<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
3547
+</code></pre></div>
1699 3548
 
3549
+    <div class="doc doc-contents ">
1700 3550
 
3551
+        <p>Force the <code>click</code> context to honor <code>NO_COLOR</code> and <code>FORCE_COLOR</code>.</p>
1701 3552
 
3553
+    </div>
1702 3554
 
1703
-  <div class="doc doc-children">
3555
+</div>
1704 3556
 
3557
+<div class="doc doc-object doc-function">
1705 3558
 
1706 3559
 
3560
+<h3 id="derivepassphrase.cli.standard_logging_options" class="doc doc-heading">
3561
+<code class="doc-symbol doc-symbol-heading doc-symbol-function"></code>            <span class="doc doc-object-name doc-function-name">standard_logging_options</span>
1707 3562
 
1708 3563
 
3564
+<a href="#derivepassphrase.cli.standard_logging_options" class="headerlink" title="Permanent link">&para;</a></h3>
3565
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">standard_logging_options</span><span class="p">(</span>
3566
+    <span class="n">f</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing.Callable" href="https://docs.python.org/3/library/typing.html#typing.Callable">Callable</a></span><span class="p">[</span><span class="n"><span title="derivepassphrase.cli.P">P</span></span><span class="p">,</span> <span class="n"><span title="derivepassphrase.cli.R">R</span></span><span class="p">]</span>
3567
+<span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-external" title="typing.Callable" href="https://docs.python.org/3/library/typing.html#typing.Callable">Callable</a></span><span class="p">[</span><span class="n"><span title="derivepassphrase.cli.P">P</span></span><span class="p">,</span> <span class="n"><span title="derivepassphrase.cli.R">R</span></span><span class="p">]</span>
3568
+</code></pre></div>
1709 3569
 
3570
+    <div class="doc doc-contents ">
1710 3571
 
3572
+        <p>Decorate the function with standard logging click options.</p>
3573
+<p>Adds the three click options <code>-v</code>/<code>--verbose</code>, <code>-q</code>/<code>--quiet</code> and
3574
+<code>--debug</code>, which calls back into the <a class="autorefs autorefs-internal" href="#derivepassphrase.cli.adjust_logging_level"><code>adjust_logging_level</code></a>
3575
+function (with different argument values).</p>
1711 3576
 
1712 3577
 
3578
+<p><span class="doc-section-title">Parameters:</span></p>
3579
+    <table>
3580
+      <thead>
3581
+        <tr>
3582
+          <th>Name</th>
3583
+          <th>Type</th>
3584
+          <th>Description</th>
3585
+          <th>Default</th>
3586
+        </tr>
3587
+      </thead>
3588
+      <tbody>
3589
+          <tr class="doc-section-item">
3590
+            <td>
3591
+                <code>f</code>
3592
+            </td>
3593
+            <td>
3594
+                  <code><a class="autorefs autorefs-external" title="typing.Callable" href="https://docs.python.org/3/library/typing.html#typing.Callable">Callable</a>[<span title="derivepassphrase.cli.P">P</span>, <span title="derivepassphrase.cli.R">R</span>]</code>
3595
+            </td>
3596
+            <td>
3597
+              <div class="doc-md-description">
3598
+                <p>A callable to decorate.</p>
3599
+              </div>
3600
+            </td>
3601
+            <td>
3602
+                <em>required</em>
3603
+            </td>
3604
+          </tr>
3605
+      </tbody>
3606
+    </table>
1713 3607
 
1714 3608
 
3609
+    <p><span class="doc-section-title">Returns:</span></p>
3610
+    <table>
3611
+      <thead>
3612
+        <tr>
3613
+          <th>Type</th>
3614
+          <th>Description</th>
3615
+        </tr>
3616
+      </thead>
3617
+      <tbody>
3618
+          <tr class="doc-section-item">
3619
+            <td>
3620
+                  <code><a class="autorefs autorefs-external" title="typing.Callable" href="https://docs.python.org/3/library/typing.html#typing.Callable">Callable</a>[<span title="derivepassphrase.cli.P">P</span>, <span title="derivepassphrase.cli.R">R</span>]</code>
3621
+            </td>
3622
+            <td>
3623
+              <div class="doc-md-description">
3624
+                <p>The decorated callable.</p>
1715 3625
               </div>
3626
+            </td>
3627
+          </tr>
3628
+      </tbody>
3629
+    </table>
1716 3630
 
1717 3631
     </div>
1718 3632
 
... ...
@@ -1727,30 +3640,15 @@ other option groups) and the epilog is empty.</p>
1727 3640
 
1728 3641
 
1729 3642
 <a href="#derivepassphrase.cli.derivepassphrase" class="headerlink" title="Permanent link">&para;</a></h3>
1730
-<div class="doc-signature highlight"><pre><span></span><code><span class="nf">derivepassphrase</span><span class="p">(</span><span class="o">*</span><span class="p">,</span> <span class="n">subcommand_args</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#list">list</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></span><span class="p">])</span> <span class="o">-&gt;</span> <span class="kc">None</span>
3643
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">derivepassphrase</span><span class="p">(</span><span class="n">ctx</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
1731 3644
 </code></pre></div>
1732 3645
 
1733 3646
     <div class="doc doc-contents ">
1734 3647
 
1735 3648
         <p>Derive a strong passphrase, deterministically, from a master secret.</p>
1736
-<p>Using a master secret, derive a passphrase for a named service,
1737
-subject to constraints e.g. on passphrase length, allowed
1738
-characters, etc.  The exact derivation depends on the selected
1739
-derivation scheme.  For each scheme, it is computationally
1740
-infeasible to discern the master secret from the derived passphrase.
1741
-The derivations are also deterministic, given the same inputs, thus
1742
-the resulting passphrases need not be stored explicitly.  The
1743
-service name and constraints themselves also generally need not be
1744
-kept secret, depending on the scheme.</p>
1745
-<p>The currently implemented subcommands are &ldquo;vault&rdquo; (for the scheme
1746
-used by vault) and &ldquo;export&rdquo; (for exporting foreign configuration
1747
-data).  See the respective <code>--help</code> output for instructions.  If no
1748
-subcommand is given, we default to &ldquo;vault&rdquo;.</p>
1749
-<p>Deprecation notice: Defaulting to &ldquo;vault&rdquo; is deprecated.  Starting
1750
-in v1.0, the subcommand must be specified explicitly.</p>
1751 3649
 <p>This is a <a href="https://pypi.org/package/click/"><code>click</code></a>-powered command-line interface function,
1752
-and not intended for programmatic use.  Call with arguments
1753
-<code>['--help']</code> to see full documentation of the interface.  (See also
3650
+and not intended for programmatic use.  See the derivepassphrase(1)
3651
+manpage for full documentation of the interface.  (See also
1754 3652
 <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.testing.CliRunner"><code>click.testing.CliRunner</code></a> for controlled, programmatic
1755 3653
 invocation.)</p>
1756 3654
 
... ...
@@ -1766,26 +3664,17 @@ invocation.)</p>
1766 3664
 
1767 3665
 
1768 3666
 <a href="#derivepassphrase.cli.derivepassphrase_export" class="headerlink" title="Permanent link">&para;</a></h3>
1769
-<div class="doc-signature highlight"><pre><span></span><code><span class="nf">derivepassphrase_export</span><span class="p">(</span>
1770
-    <span class="o">*</span><span class="p">,</span> <span class="n">subcommand_args</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#list">list</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></span><span class="p">]</span>
1771
-<span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
3667
+<div class="doc-signature highlight"><pre><span></span><code><span class="nf">derivepassphrase_export</span><span class="p">(</span><span class="n">ctx</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="click.Context" href="https://click.palletsprojects.com/en/8.1.x/api/#click.Context">Context</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
1772 3668
 </code></pre></div>
1773 3669
 
1774 3670
     <div class="doc doc-contents ">
1775 3671
 
1776 3672
         <p>Export a foreign configuration to standard output.</p>
1777
-<p>Read a foreign system configuration, extract all information from
1778
-it, and export the resulting configuration to standard output.</p>
1779
-<p>The only available subcommand is &ldquo;vault&rdquo;, which implements the
1780
-vault-native configuration scheme.  If no subcommand is given, we
1781
-default to &ldquo;vault&rdquo;.</p>
1782
-<p>Deprecation notice: Defaulting to &ldquo;vault&rdquo; is deprecated.  Starting
1783
-in v1.0, the subcommand must be specified explicitly.</p>
1784 3673
 <p>This is a <a href="https://pypi.org/package/click/"><code>click</code></a>-powered command-line interface function,
1785
-and not intended for programmatic use.  Call with arguments
1786
-<code>['--help']</code> to see full documentation of the interface.  (See also
1787
-<a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.testing.CliRunner"><code>click.testing.CliRunner</code></a> for controlled, programmatic
1788
-invocation.)</p>
3674
+and not intended for programmatic use.  See the
3675
+derivepassphrase-export(1) manpage for full documentation of the
3676
+interface.  (See also <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.testing.CliRunner"><code>click.testing.CliRunner</code></a> for controlled,
3677
+programmatic invocation.)</p>
1789 3678
 
1790 3679
     </div>
1791 3680
 
... ...
@@ -1814,15 +3703,11 @@ invocation.)</p>
1814 3703
     <div class="doc doc-contents ">
1815 3704
 
1816 3705
         <p>Export a vault-native configuration to standard output.</p>
1817
-<p>Read the vault-native configuration at PATH, extract all information
1818
-from it, and export the resulting configuration to standard output.
1819
-Depending on the configuration format, PATH may either be a file or
1820
-a directory.  Supports the vault &ldquo;v0.2&rdquo;, &ldquo;v0.3&rdquo; and &ldquo;storeroom&rdquo;
1821
-formats.</p>
1822
-<p>If PATH is explicitly given as <code>VAULT_PATH</code>, then use the
1823
-<code>VAULT_PATH</code> environment variable to determine the correct path.
1824
-(Use <code>./VAULT_PATH</code> or similar to indicate a file/directory actually
1825
-named <code>VAULT_PATH</code>.)</p>
3706
+<p>This is a <a href="https://pypi.org/package/click/"><code>click</code></a>-powered command-line interface function,
3707
+and not intended for programmatic use.  See the
3708
+derivepassphrase-export-vault(1) manpage for full documentation of
3709
+the interface.  (See also <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.testing.CliRunner"><code>click.testing.CliRunner</code></a> for
3710
+controlled, programmatic invocation.)</p>
1826 3711
 
1827 3712
     </div>
1828 3713
 
... ...
@@ -1862,28 +3747,20 @@ named <code>VAULT_PATH</code>.)</p>
1862 3747
     <span class="n">import_settings</span><span class="p">:</span> <span class="p">(</span>
1863 3748
         <span class="n"><a class="autorefs autorefs-external" title="typing.TextIO" href="https://docs.python.org/3/library/typing.html#typing.TextIO">TextIO</a></span> <span class="o">|</span> <span class="n"><a class="autorefs autorefs-external" title="pathlib.Path" href="https://docs.python.org/3/library/pathlib.html#pathlib.Path">Path</a></span> <span class="o">|</span> <span class="n"><a class="autorefs autorefs-external" title="os.PathLike" href="https://docs.python.org/3/library/os.html#os.PathLike">PathLike</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span>
1864 3749
     <span class="p">)</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
3750
+    <span class="n">overwrite_config</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#bool">bool</a></span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
3751
+    <span class="n">unset_settings</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="collections.abc.Sequence" href="https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence">Sequence</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a></span><span class="p">]</span> <span class="o">=</span> <span class="p">(),</span>
3752
+    <span class="n">export_as</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-external" title="typing.Literal" href="https://docs.python.org/3/library/typing.html#typing.Literal">Literal</a></span><span class="p">[</span><span class="s2">&quot;json&quot;</span><span class="p">,</span> <span class="s2">&quot;sh&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;json&quot;</span><span class="p">,</span>
1865 3753
 <span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
1866 3754
 </code></pre></div>
1867 3755
 
1868 3756
     <div class="doc doc-contents ">
1869 3757
 
1870 3758
         <p>Derive a passphrase using the vault(1) derivation scheme.</p>
1871
-<p>Using a master passphrase or a master SSH key, derive a passphrase
1872
-for SERVICE, subject to length, character and character repetition
1873
-constraints.  The derivation is cryptographically strong, meaning
1874
-that even if a single passphrase is compromised, guessing the master
1875
-passphrase or a different service&rsquo;s passphrase is computationally
1876
-infeasible.  The derivation is also deterministic, given the same
1877
-inputs, thus the resulting passphrase need not be stored explicitly.
1878
-The service name and constraints themselves also need not be kept
1879
-secret; the latter are usually stored in a world-readable file.</p>
1880
-<p>If operating on global settings, or importing/exporting settings,
1881
-then SERVICE must be omitted.  Otherwise it is required.</p>
1882 3759
 <p>This is a <a href="https://pypi.org/package/click/"><code>click</code></a>-powered command-line interface function,
1883
-and not intended for programmatic use.  Call with arguments
1884
-<code>['--help']</code> to see full documentation of the interface.  (See also
1885
-<a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.testing.CliRunner"><code>click.testing.CliRunner</code></a> for controlled, programmatic
1886
-invocation.)</p>
3760
+and not intended for programmatic use.  See the
3761
+derivepassphrase-vault(1) manpage for full documentation of the
3762
+interface.  (See also <a class="autorefs autorefs-external" href="https://click.palletsprojects.com/en/8.1.x/api/#click.testing.CliRunner"><code>click.testing.CliRunner</code></a> for controlled,
3763
+programmatic invocation.)</p>
1887 3764
 
1888 3765
 
1889 3766
 <p><span class="doc-section-title">Parameters:</span></p>
... ...
@@ -2151,6 +4028,46 @@ input is supported.</p>
2151 4028
               </div>
2152 4029
             </td>
2153 4030
           </tr>
4031
+          <tr class="doc-section-item">
4032
+            <td><code>overwrite_config</code></td>
4033
+            <td>
4034
+                  <code><a class="autorefs autorefs-external" href="https://docs.python.org/3/library/functions.html#bool">bool</a></code>
4035
+            </td>
4036
+            <td>
4037
+              <div class="doc-md-description">
4038
+                <p>Command-line arguments <code>--overwrite-existing</code> (True) and
4039
+<code>--merge-existing</code> (False).  Controls whether config saving
4040
+and config importing overwrite existing configurations, or
4041
+merge them section-wise instead.</p>
4042
+              </div>
4043
+            </td>
4044
+          </tr>
4045
+          <tr class="doc-section-item">
4046
+            <td><code>unset_settings</code></td>
4047
+            <td>
4048
+                  <code><a class="autorefs autorefs-external" title="collections.abc.Sequence" href="https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence">Sequence</a>[<a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#str">str</a>]</code>
4049
+            </td>
4050
+            <td>
4051
+              <div class="doc-md-description">
4052
+                <p>Command-line argument <code>--unset</code>.  If given together with
4053
+<code>--config</code>, unsets the specified settings (in addition to
4054
+any other changes requested).</p>
4055
+              </div>
4056
+            </td>
4057
+          </tr>
4058
+          <tr class="doc-section-item">
4059
+            <td><code>export_as</code></td>
4060
+            <td>
4061
+                  <code><a class="autorefs autorefs-external" title="typing.Literal" href="https://docs.python.org/3/library/typing.html#typing.Literal">Literal</a>[&#39;json&#39;, &#39;sh&#39;]</code>
4062
+            </td>
4063
+            <td>
4064
+              <div class="doc-md-description">
4065
+                <p>Command-line argument <code>--export-as</code>.  If given together with
4066
+<code>--export</code>, selects the format to export the current
4067
+configuration as: JSON (&ldquo;json&rdquo;, default) or POSIX sh (&ldquo;sh&rdquo;).</p>
4068
+              </div>
4069
+            </td>
4070
+          </tr>
2154 4071
       </tbody>
2155 4072
     </table>
2156 4073
 
... ...
@@ -2233,7 +4150,7 @@ input is supported.</p>
2233 4150
       <div class="md-copyright">
2234 4151
   
2235 4152
     <div class="md-copyright__highlight">
2236
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
4153
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
2237 4154
     </div>
2238 4155
   
2239 4156
   
... ...
@@ -174,6 +174,26 @@
174 174
   
175 175
   
176 176
   
177
+    
178
+    
179
+      <li class="md-tabs__item">
180
+        <a href="../../explanation/" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
177 197
     <li class="md-tabs__item">
178 198
       <a href="../../changelog/" class="md-tabs__link">
179 199
         
... ...
@@ -1206,6 +1226,92 @@
1206 1226
   
1207 1227
   
1208 1228
   
1229
+    
1230
+    
1231
+      
1232
+        
1233
+          
1234
+        
1235
+      
1236
+        
1237
+      
1238
+    
1239
+    
1240
+      
1241
+      
1242
+        
1243
+      
1244
+    
1245
+    
1246
+    <li class="md-nav__item md-nav__item--nested">
1247
+      
1248
+        
1249
+        
1250
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1251
+        
1252
+          
1253
+          
1254
+          <div class="md-nav__link md-nav__container">
1255
+            <a href="../../explanation/" class="md-nav__link ">
1256
+              
1257
+  
1258
+  <span class="md-ellipsis">
1259
+    Design & Background
1260
+  </span>
1261
+  
1262
+
1263
+            </a>
1264
+            
1265
+              
1266
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1267
+                <span class="md-nav__icon md-icon"></span>
1268
+              </label>
1269
+            
1270
+          </div>
1271
+        
1272
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1273
+          <label class="md-nav__title" for="__nav_5">
1274
+            <span class="md-nav__icon md-icon"></span>
1275
+            Design & Background
1276
+          </label>
1277
+          <ul class="md-nav__list" data-md-scrollfix>
1278
+            
1279
+              
1280
+            
1281
+              
1282
+                
1283
+  
1284
+  
1285
+  
1286
+  
1287
+    <li class="md-nav__item">
1288
+      <a href="../../explanation/faq-altered-versions/" class="md-nav__link">
1289
+        
1290
+  
1291
+  <span class="md-ellipsis">
1292
+    "altered versions" license requirement
1293
+  </span>
1294
+  
1295
+
1296
+      </a>
1297
+    </li>
1298
+  
1299
+
1300
+              
1301
+            
1302
+          </ul>
1303
+        </nav>
1304
+      
1305
+    </li>
1306
+  
1307
+
1308
+    
1309
+      
1310
+      
1311
+  
1312
+  
1313
+  
1314
+  
1209 1315
     <li class="md-nav__item">
1210 1316
       <a href="../../changelog/" class="md-nav__link">
1211 1317
         
... ...
@@ -3593,7 +3699,7 @@ configuration formats.</p>
3593 3699
       <div class="md-copyright">
3594 3700
   
3595 3701
     <div class="md-copyright__highlight">
3596
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
3702
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
3597 3703
     </div>
3598 3704
   
3599 3705
   
... ...
@@ -174,6 +174,26 @@
174 174
   
175 175
   
176 176
   
177
+    
178
+    
179
+      <li class="md-tabs__item">
180
+        <a href="../../explanation/" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
177 197
     <li class="md-tabs__item">
178 198
       <a href="../../changelog/" class="md-tabs__link">
179 199
         
... ...
@@ -1002,6 +1022,92 @@
1002 1022
   
1003 1023
   
1004 1024
   
1025
+    
1026
+    
1027
+      
1028
+        
1029
+          
1030
+        
1031
+      
1032
+        
1033
+      
1034
+    
1035
+    
1036
+      
1037
+      
1038
+        
1039
+      
1040
+    
1041
+    
1042
+    <li class="md-nav__item md-nav__item--nested">
1043
+      
1044
+        
1045
+        
1046
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1047
+        
1048
+          
1049
+          
1050
+          <div class="md-nav__link md-nav__container">
1051
+            <a href="../../explanation/" class="md-nav__link ">
1052
+              
1053
+  
1054
+  <span class="md-ellipsis">
1055
+    Design & Background
1056
+  </span>
1057
+  
1058
+
1059
+            </a>
1060
+            
1061
+              
1062
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1063
+                <span class="md-nav__icon md-icon"></span>
1064
+              </label>
1065
+            
1066
+          </div>
1067
+        
1068
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1069
+          <label class="md-nav__title" for="__nav_5">
1070
+            <span class="md-nav__icon md-icon"></span>
1071
+            Design & Background
1072
+          </label>
1073
+          <ul class="md-nav__list" data-md-scrollfix>
1074
+            
1075
+              
1076
+            
1077
+              
1078
+                
1079
+  
1080
+  
1081
+  
1082
+  
1083
+    <li class="md-nav__item">
1084
+      <a href="../../explanation/faq-altered-versions/" class="md-nav__link">
1085
+        
1086
+  
1087
+  <span class="md-ellipsis">
1088
+    "altered versions" license requirement
1089
+  </span>
1090
+  
1091
+
1092
+      </a>
1093
+    </li>
1094
+  
1095
+
1096
+              
1097
+            
1098
+          </ul>
1099
+        </nav>
1100
+      
1101
+    </li>
1102
+  
1103
+
1104
+    
1105
+      
1106
+      
1107
+  
1108
+  
1109
+  
1110
+  
1005 1111
     <li class="md-nav__item">
1006 1112
       <a href="../../changelog/" class="md-nav__link">
1007 1113
         
... ...
@@ -1563,7 +1669,7 @@ a different base).</p>
1563 1669
       <div class="md-copyright">
1564 1670
   
1565 1671
     <div class="md-copyright__highlight">
1566
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
1672
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1567 1673
     </div>
1568 1674
   
1569 1675
   
... ...
@@ -174,6 +174,26 @@
174 174
   
175 175
   
176 176
   
177
+    
178
+    
179
+      <li class="md-tabs__item">
180
+        <a href="../../explanation/" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
177 197
     <li class="md-tabs__item">
178 198
       <a href="../../changelog/" class="md-tabs__link">
179 199
         
... ...
@@ -1110,6 +1130,92 @@
1110 1130
   
1111 1131
   
1112 1132
   
1133
+    
1134
+    
1135
+      
1136
+        
1137
+          
1138
+        
1139
+      
1140
+        
1141
+      
1142
+    
1143
+    
1144
+      
1145
+      
1146
+        
1147
+      
1148
+    
1149
+    
1150
+    <li class="md-nav__item md-nav__item--nested">
1151
+      
1152
+        
1153
+        
1154
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1155
+        
1156
+          
1157
+          
1158
+          <div class="md-nav__link md-nav__container">
1159
+            <a href="../../explanation/" class="md-nav__link ">
1160
+              
1161
+  
1162
+  <span class="md-ellipsis">
1163
+    Design & Background
1164
+  </span>
1165
+  
1166
+
1167
+            </a>
1168
+            
1169
+              
1170
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1171
+                <span class="md-nav__icon md-icon"></span>
1172
+              </label>
1173
+            
1174
+          </div>
1175
+        
1176
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1177
+          <label class="md-nav__title" for="__nav_5">
1178
+            <span class="md-nav__icon md-icon"></span>
1179
+            Design & Background
1180
+          </label>
1181
+          <ul class="md-nav__list" data-md-scrollfix>
1182
+            
1183
+              
1184
+            
1185
+              
1186
+                
1187
+  
1188
+  
1189
+  
1190
+  
1191
+    <li class="md-nav__item">
1192
+      <a href="../../explanation/faq-altered-versions/" class="md-nav__link">
1193
+        
1194
+  
1195
+  <span class="md-ellipsis">
1196
+    "altered versions" license requirement
1197
+  </span>
1198
+  
1199
+
1200
+      </a>
1201
+    </li>
1202
+  
1203
+
1204
+              
1205
+            
1206
+          </ul>
1207
+        </nav>
1208
+      
1209
+    </li>
1210
+  
1211
+
1212
+    
1213
+      
1214
+      
1215
+  
1216
+  
1217
+  
1218
+  
1113 1219
     <li class="md-nav__item">
1114 1220
       <a href="../../changelog/" class="md-nav__link">
1115 1221
         
... ...
@@ -3034,7 +3140,7 @@ it doesn&rsquo;t support extension autodiscovery.</p>
3034 3140
       <div class="md-copyright">
3035 3141
   
3036 3142
     <div class="md-copyright__highlight">
3037
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
3143
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
3038 3144
     </div>
3039 3145
   
3040 3146
   
... ...
@@ -174,6 +174,26 @@
174 174
   
175 175
   
176 176
   
177
+    
178
+    
179
+      <li class="md-tabs__item">
180
+        <a href="../../explanation/" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
177 197
     <li class="md-tabs__item">
178 198
       <a href="../../changelog/" class="md-tabs__link">
179 199
         
... ...
@@ -1020,6 +1040,92 @@
1020 1040
   
1021 1041
   
1022 1042
   
1043
+    
1044
+    
1045
+      
1046
+        
1047
+          
1048
+        
1049
+      
1050
+        
1051
+      
1052
+    
1053
+    
1054
+      
1055
+      
1056
+        
1057
+      
1058
+    
1059
+    
1060
+    <li class="md-nav__item md-nav__item--nested">
1061
+      
1062
+        
1063
+        
1064
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1065
+        
1066
+          
1067
+          
1068
+          <div class="md-nav__link md-nav__container">
1069
+            <a href="../../explanation/" class="md-nav__link ">
1070
+              
1071
+  
1072
+  <span class="md-ellipsis">
1073
+    Design & Background
1074
+  </span>
1075
+  
1076
+
1077
+            </a>
1078
+            
1079
+              
1080
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1081
+                <span class="md-nav__icon md-icon"></span>
1082
+              </label>
1083
+            
1084
+          </div>
1085
+        
1086
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1087
+          <label class="md-nav__title" for="__nav_5">
1088
+            <span class="md-nav__icon md-icon"></span>
1089
+            Design & Background
1090
+          </label>
1091
+          <ul class="md-nav__list" data-md-scrollfix>
1092
+            
1093
+              
1094
+            
1095
+              
1096
+                
1097
+  
1098
+  
1099
+  
1100
+  
1101
+    <li class="md-nav__item">
1102
+      <a href="../../explanation/faq-altered-versions/" class="md-nav__link">
1103
+        
1104
+  
1105
+  <span class="md-ellipsis">
1106
+    "altered versions" license requirement
1107
+  </span>
1108
+  
1109
+
1110
+      </a>
1111
+    </li>
1112
+  
1113
+
1114
+              
1115
+            
1116
+          </ul>
1117
+        </nav>
1118
+      
1119
+    </li>
1120
+  
1121
+
1122
+    
1123
+      
1124
+      
1125
+  
1126
+  
1127
+  
1128
+  
1023 1129
     <li class="md-nav__item">
1024 1130
       <a href="../../changelog/" class="md-nav__link">
1025 1131
         
... ...
@@ -2122,7 +2228,7 @@ deterministic.</p>
2122 2228
       <div class="md-copyright">
2123 2229
   
2124 2230
     <div class="md-copyright__highlight">
2125
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
2231
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
2126 2232
     </div>
2127 2233
   
2128 2234
   
... ...
@@ -174,6 +174,26 @@
174 174
   
175 175
   
176 176
   
177
+    
178
+    
179
+      <li class="md-tabs__item">
180
+        <a href="../explanation/" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
177 197
     <li class="md-tabs__item">
178 198
       <a href="../changelog/" class="md-tabs__link">
179 199
         
... ...
@@ -916,6 +936,92 @@
916 936
   
917 937
   
918 938
   
939
+    
940
+    
941
+      
942
+        
943
+          
944
+        
945
+      
946
+        
947
+      
948
+    
949
+    
950
+      
951
+      
952
+        
953
+      
954
+    
955
+    
956
+    <li class="md-nav__item md-nav__item--nested">
957
+      
958
+        
959
+        
960
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
961
+        
962
+          
963
+          
964
+          <div class="md-nav__link md-nav__container">
965
+            <a href="../explanation/" class="md-nav__link ">
966
+              
967
+  
968
+  <span class="md-ellipsis">
969
+    Design & Background
970
+  </span>
971
+  
972
+
973
+            </a>
974
+            
975
+              
976
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
977
+                <span class="md-nav__icon md-icon"></span>
978
+              </label>
979
+            
980
+          </div>
981
+        
982
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
983
+          <label class="md-nav__title" for="__nav_5">
984
+            <span class="md-nav__icon md-icon"></span>
985
+            Design & Background
986
+          </label>
987
+          <ul class="md-nav__list" data-md-scrollfix>
988
+            
989
+              
990
+            
991
+              
992
+                
993
+  
994
+  
995
+  
996
+  
997
+    <li class="md-nav__item">
998
+      <a href="../explanation/faq-altered-versions/" class="md-nav__link">
999
+        
1000
+  
1001
+  <span class="md-ellipsis">
1002
+    "altered versions" license requirement
1003
+  </span>
1004
+  
1005
+
1006
+      </a>
1007
+    </li>
1008
+  
1009
+
1010
+              
1011
+            
1012
+          </ul>
1013
+        </nav>
1014
+      
1015
+    </li>
1016
+  
1017
+
1018
+    
1019
+      
1020
+      
1021
+  
1022
+  
1023
+  
1024
+  
919 1025
     <li class="md-nav__item">
920 1026
       <a href="../changelog/" class="md-nav__link">
921 1027
         
... ...
@@ -1012,9 +1118,9 @@
1012 1118
 <h2 id="man-pages">Man pages<a class="headerlink" href="#man-pages" title="Permanent link">&para;</a></h2>
1013 1119
 <ul>
1014 1120
 <li><a href="derivepassphrase.1/"><code>derivepassphrase(1)</code></a>: Derive a strong passphrase, deterministically, from a master secret.<ul>
1015
-<li><a href="derivepassphrase.1/"><code>derivepassphrase-vault(1)</code></a>: Derive a passphrase using the vault(1) derivation scheme.</li>
1121
+<li><a href="derivepassphrase-vault.1/"><code>derivepassphrase-vault(1)</code></a>: Derive a passphrase using the vault(1) derivation scheme.</li>
1016 1122
 <li><a href="derivepassphrase-export.1/"><code>derivepassphrase-export(1)</code></a>: Export a foreign configuration to standard output.<ul>
1017
-<li><a href="derivepassphrase-export.1/"><code>derivepassphrase-export-vault(1)</code></a>: Export a vault-native configuration to standard output.</li>
1123
+<li><a href="derivepassphrase-export-vault.1/"><code>derivepassphrase-export-vault(1)</code></a>: Export a vault-native configuration to standard output.</li>
1018 1124
 </ul>
1019 1125
 </li>
1020 1126
 </ul>
... ...
@@ -1111,7 +1217,7 @@
1111 1217
       <div class="md-copyright">
1112 1218
   
1113 1219
     <div class="md-copyright__highlight">
1114
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
1220
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1115 1221
     </div>
1116 1222
   
1117 1223
   
... ...
@@ -0,0 +1,957 @@
1
+.Dd 2025-01-07
2
+.Dt DERIVEPASSPHRASE-VAULT 1
3
+.Os derivepassphrase 0.4.0
4
+.
5
+.Sh NAME
6
+.
7
+.Nm derivepassphrase-vault
8
+.Nd derive a passphrase using the vault derivation scheme
9
+.
10
+.Sh SYNOPSIS
11
+.
12
+.Bd -ragged
13
+.Nm derivepassphrase vault
14
+.Op Fl \-phrase | Fl \-key
15
+.Op Fl \-length Ar n
16
+.Op Fl \-repeat Ar n
17
+.Op Fl \-lower Ar n
18
+.Op Fl \-upper Ar n
19
+.Op Fl \-number Ar n
20
+.Op Fl \-space Ar n
21
+.Op Fl \-dash Ar n
22
+.Op Fl \-symbol Ar n
23
+.Ar SERVICE
24
+.
25
+.Nm derivepassphrase vault
26
+.Brq Fl \-phrase | \-key | No .\|.\|. | Fl \-symbol Ar n
27
+.No .\|.\|.
28
+.Fl \-config
29
+.Op Fl \-unset Ar setting No .\|.\|.
30
+.Op Fl \-overwrite\-existing | Fl \-merge\-existing
31
+.Op Ar SERVICE
32
+.
33
+.Nm derivepassphrase vault
34
+.Bro
35
+.Fl \-notes
36
+.Ar SERVICE
37
+|
38
+.Fl \-delete
39
+.Ar SERVICE
40
+|
41
+.Fl \-delete\-globals
42
+|
43
+.Fl \-clear
44
+.Brc
45
+.
46
+.Nm derivepassphrase vault
47
+.Op Fl \-export\-as Brq Li json | sh
48
+.Brq Fl \-import Ar PATH | Fl \-export Ar PATH
49
+.Ed
50
+.
51
+.Sh DESCRIPTION
52
+.
53
+Using a master passphrase, derive a passphrase for
54
+.Ar SERVICE ,
55
+subject to length, character and character repetition constraints, in a
56
+manner compatible with James Coglan's
57
+.Xr vault 1 .
58
+.Pp
59
+.
60
+The derivation is
61
+.Em strong :
62
+derived passphrases have as much entropy as permitted by the master
63
+passphrase and the passphrase constraints (whichever is more restrictive),
64
+and even if multiple derived passphrases are compromised, the master
65
+passphrase remains cryptographically difficult to discern from theses
66
+compromised passphrases.
67
+The derivation is also
68
+.Em deterministic ,
69
+given the same inputs, thus the resulting passphrase need not be stored
70
+explicitly.
71
+.Pp
72
+.
73
+The service name and constraints themselves also need not be kept secret;
74
+the latter are usually stored in a world-readable file to ease repeated
75
+entry of passphrase constraints.
76
+.Pp
77
+.
78
+In lieu of a master passphrase, a master
79
+.Tn SSH
80
+key can also be used if there is a reachable, running
81
+.Tn SSH
82
+agent currently holding this key and if the key type is supported.
83
+(See
84
+.Sx "SSH KEY SUITABILITY"
85
+and
86
+.Sx BUGS
87
+below.)
88
+This too is compatible with
89
+.Xr vault 1 .
90
+.
91
+.Sh OPTIONS
92
+.
93
+.Ss Passphrase generation
94
+.
95
+The passphrase generation options can be divided into
96
+.Dq passphrase source
97
+options
98
+.Fl ( \-phrase , \-key )
99
+and
100
+.Dq passphrase constraint
101
+options (all others).
102
+The passphrase source options are mutually exclusive \(em you may only
103
+specify one of them \(em while the passphrase constraint options may be
104
+combined in any way.
105
+The
106
+.Ar SERVICE
107
+is mandatory (see synopsis\~#1), unless the
108
+.Fl \-config
109
+option is specified (see synopsis\~#2).
110
+All character constraints refer to ASCII printable characters only (space
111
+.Pq Li U+0020
112
+to tilde
113
+.Pq Li U+007E ,
114
+excluding the grave accent
115
+.Pq Li U+0060 ) .
116
+.
117
+.Bl -tag -width ".Fl p , \-phrase"
118
+.
119
+.It Fl p , \-phrase
120
+Prompt for a passphrase.
121
+.Pp
122
+.
123
+See also
124
+.Sx Configuration
125
+for how this interacts with a stored passphrase or
126
+.Tn SSH
127
+key.
128
+.
129
+.It Fl k , \-key
130
+Select an SSH key.
131
+.Pp
132
+.
133
+An SSH agent such as OpenSSH's
134
+.Xr ssh-agent 1
135
+or PuTTY's
136
+.Xr pageant 1
137
+must be running and accessible, and have the desired key loaded.
138
+The SSH key must also be
139
+.Em suitable
140
+for this purpose; see
141
+.Sx SSH key suitability
142
+for details.
143
+.Pp
144
+.
145
+See also
146
+.Sx Configuration
147
+for how this interacts with a stored passphrase or
148
+.Tn SSH
149
+key.
150
+.
151
+.It Fl l Ar n , Fl \-length Ar n
152
+Force the passphrase to have the length
153
+.Ar n .
154
+Defaults to the length
155
+.Sy 20
156
+if not specified, or if explicitly specified as
157
+.Li 0 .
158
+.
159
+.It Fl r Ar n , Fl \-repeat Ar n
160
+Permit only runs of up to
161
+.Ar n
162
+consecutive occurrences of the same character.
163
+Alternatively, forbid immediate additional repetitions of length
164
+.Ar n
165
+(or more) for any character in the derived passphrase.
166
+Setting
167
+.Ar n No = Li 0
168
+disables repetition constraints, which is the default.
169
+.
170
+.It Fl \-lower Ar n
171
+Include at least
172
+.Ar n
173
+lowercase characters in the derived passphrase.
174
+Setting
175
+.Ar n No = Li 0
176
+forbids these characters entirely.
177
+The default is to not constain the occurrences in any manner.
178
+.
179
+.It Fl \-upper Ar n
180
+Include at least
181
+.Ar n
182
+uppercase characters in the derived passphrase.
183
+Setting
184
+.Ar n No = Li 0
185
+forbids these characters entirely.
186
+The default is to not constain the occurrences in any manner.
187
+.
188
+.It Fl \-number Ar n
189
+Include at least
190
+.Ar n
191
+digits in the derived passphrase.
192
+Setting
193
+.Ar n No = Li 0
194
+forbids these characters entirely.
195
+The default is to not constain the occurrences in any manner.
196
+.
197
+.It Fl \-space Ar n
198
+Include at least
199
+.Ar n
200
+spaces in the derived passphrase.
201
+Setting
202
+.Ar n No = Li 0
203
+forbids these characters entirely.
204
+The default is to not constain the occurrences in any manner.
205
+.
206
+.It Fl \-dash Ar n
207
+Include at least
208
+.Ar n
209
+.Dq dashes
210
+.Li ( \-
211
+or
212
+.Li _ )
213
+in the derived passphrase.
214
+Setting
215
+.Ar n No = Li 0
216
+forbids these characters entirely.
217
+The default is to not constain the occurrences in any manner.
218
+.
219
+.It Fl \-symbol Ar n
220
+Include at least
221
+.Ar n
222
+symbols (any of
223
+.Li !\[dq]#$%&\[aq]()*+,./:;<=>?@[\e]\(ha{|}\(ti\-_ )
224
+in the derived passphrase.
225
+Setting
226
+.Ar n No = Li 0
227
+forbids these characters entirely, and effectively also implies
228
+.Fl \-dash Li 0 .
229
+The default is to not constain the occurrences in any manner.
230
+.
231
+.El
232
+.
233
+.Ss Configuration
234
+.
235
+The configuration options directly modify the stored settings: default
236
+settings, known services, and service-specific settings.
237
+They are mutually exclusive; you may only specify one of them.
238
+The
239
+.Ar SERVICE
240
+is mandatory for
241
+.Fl \-notes
242
+and
243
+.Fl \-delete ,
244
+optional for
245
+.Fl \-config ,
246
+and forbidden for
247
+.Fl \-delete\-globals
248
+and
249
+.Fl \-clear
250
+(see synopsis\~#2 and synopsis\~#3).
251
+.
252
+.Bl -tag -width ".Fl p , \-phrase"
253
+.
254
+.It Fl n , \-notes
255
+Spawn an editor to edit notes for
256
+.Ar SERVICE .
257
+Use the
258
+.Ev VISUAL
259
+or
260
+.Ev EDITOR
261
+environment variables to configure the spawned editor.
262
+.
263
+.It Fl c , \-config
264
+Save the given settings for
265
+.Ar SERVICE
266
+(if given), or save the given settings as global default settings.
267
+.Pp
268
+.
269
+See the
270
+.Sx Passphrase generation
271
+and
272
+.Sx Compatibility and extension options
273
+sections for other options compatible with
274
+.Fl \-config .
275
+.Pp
276
+.
277
+.Bf -symbolic
278
+Do not use the
279
+.Fl \-phrase
280
+and
281
+.Fl \-config
282
+options together!
283
+The configuration file is assumed to not contain sensitive contents, and is
284
+not encrypted.
285
+.Ef
286
+.
287
+.It Fl x , \-delete
288
+Delete all stored settings for
289
+.Ar SERVICE .
290
+.
291
+.It Fl \-delete\-globals
292
+Delete all stored global default settings.
293
+.
294
+.It Fl X , \-clear
295
+Delete all stored settings.
296
+.
297
+.El
298
+.
299
+.Ss Storage management
300
+.
301
+The storage management options deal with importing and exporting the stored
302
+settings.
303
+They are mutually exclusive; you may only specify one of them.
304
+Using
305
+.Li \-
306
+as
307
+.Ar PATH
308
+for standard input/standard output is supported.
309
+.
310
+.Bl -tag -width ".Fl p , \-phrase"
311
+.
312
+.It Fl e Ar PATH , Fl \-export Ar PATH
313
+Export all saved settings into file
314
+.Ar PATH .
315
+.
316
+.It Fl i Ar PATH , Fl \-import Ar PATH
317
+Import saved settings from file
318
+.Ar PATH .
319
+.
320
+.El
321
+.
322
+.Ss Compatibility and extension options
323
+.
324
+By default,
325
+.Nm derivepassphrase vault
326
+behaves in a manner compatible with
327
+.Xr vault 1 .
328
+The compatibility and extension options modify the behavior to enable
329
+additional functionality, or specifically to force compatibility.
330
+.Pp
331
+.
332
+.Xr vault 1
333
+supports none of these options, and behaves as if the option had not been
334
+given or had been left in its default state.
335
+.
336
+.Bl -tag -width ".Fl p , \-phrase"
337
+.
338
+.It Fl \-overwrite\-existing No "" / "" Fl \-merge\-existing
339
+When importing a configuration via
340
+.Fl \-import ,
341
+or configuring the settings via
342
+.Fl \-config ,
343
+overwrite or merge
344
+.Em ( default )
345
+the existing configuration.
346
+.Pp
347
+.
348
+If overwriting the configuration, then the whole configuration
349
+.Pq for Fl \-import
350
+or the respective section
351
+.Pq service-specific or global, for Fl \-config ,
352
+will be written from scratch.
353
+If merging, then each section
354
+.Pq service-specific or global, for Fl \-import
355
+or each singular setting
356
+.Pq for Fl \-config
357
+will be overwritten, but other unaffected settings/sections will not.
358
+.Pp
359
+.
360
+.Xr ( vault 1
361
+behaves as if
362
+.Fl \-merge\-existing
363
+were always given.)
364
+.
365
+.It Fl \-unset Ar setting
366
+When configuring via
367
+.Fl \-config ,
368
+also unset the specified
369
+.Ar setting ,
370
+where
371
+.Ar setting
372
+is one of the passphrase generation settings
373
+.Pq Li phrase , key , lower , No .\|.\|. .
374
+May be specified multiple times.
375
+Must not overlap with any of the settings being set afterwards.
376
+.Pp
377
+.
378
+.Xr ( vault 1
379
+does not support this option.)
380
+.
381
+.It Fl \-export\-as Brq Li json | sh
382
+When exporting the configuration via
383
+.Fl \-export ,
384
+export as
385
+.Tn JSON
386
+(default) or as a shell script in
387
+.Xr sh 1
388
+format.
389
+.Pp
390
+.
391
+The
392
+.Tn JSON
393
+format is compatible with
394
+.Xr vault 1 .
395
+For the shell script format, see the
396
+.Sx SHELL SCRIPT EXPORT FORMAT
397
+section for details.
398
+.Pp
399
+.
400
+.Xr ( vault 1
401
+behaves as if
402
+.Fl \-export\-as Li json
403
+were always given.)
404
+.
405
+.El
406
+.
407
+.Ss Other options
408
+.
409
+.Bl -tag -width ".Fl p , \-phrase"
410
+.
411
+.It Fl \-version
412
+Show the version and exit.
413
+.
414
+.It Fl h , \-help
415
+Show a help message and exit.
416
+.
417
+.El
418
+.
419
+.Sh SHELL SCRIPT EXPORT FORMAT
420
+.
421
+If the shell script export format is selected, the configuration will be
422
+exported as a
423
+.Tn POSIX
424
+.Xr sh 1
425
+script, containing calls to
426
+.Nm derivepassphrase vault
427
+to reconstruct the current configuration from scratch.
428
+The script assumes a conforming
429
+.Xr sh 1 ,
430
+with support for
431
+.Dq here
432
+documents.
433
+.Pp
434
+.
435
+.Bf -symbolic
436
+Do not run these emitted shell scripts directly without double-checking
437
+their output first!
438
+.Ef
439
+.
440
+.Sh SSH KEY SUITABILITY
441
+.
442
+An
443
+.Tn SSH
444
+key is
445
+.Sy suitable
446
+for use with
447
+.Nm derivepassphrase vault
448
+if the
449
+.Tn SSH
450
+agent guarantees that signatures produced with this key will be
451
+.Em deterministic ,
452
+given the same message to be signed.
453
+This is a property specific to the key
454
+.Em type ,
455
+and sometimes the agent used:
456
+.
457
+.Bl -bullet
458
+.
459
+.It
460
+.Tn RSA ,
461
+Ed25519 and Ed448 keys are always suitable.
462
+.Tn OpenSSH Ns No 's
463
+.Xr ssh-agent 1
464
+supports only these keys as suitable keys.
465
+.
466
+.It
467
+.Tn DSA
468
+and
469
+.Tn ECDSA
470
+keys are suitable if the
471
+.Tn SSH
472
+agent supports deterministic
473
+.Tn DSA
474
+signatures, e.g. by implementing
475
+.Tn RFC 6979 .
476
+.Tn PuTTY Ns No 's
477
+.Xr pageant 1
478
+supports this, in addition to the always-suitable keys mentioned above.
479
+.
480
+.El
481
+.
482
+.Sh ENVIRONMENT
483
+.
484
+.Bl -tag -width ".Fl p , \-phrase"
485
+.
486
+.It Ev VISUAL , EDITOR
487
+.Nm derivepassphrase vault
488
+uses this editor to edit service notes when called with
489
+.Fl \-notes .
490
+.Ev VISUAL
491
+has higher precedence than
492
+.Ev EDITOR .
493
+.
494
+.It Ev DERIVEPASSPHRASE_PATH
495
+.Nm derivepassphrase
496
+stores its configuration files and data in this directory.
497
+Defaults to
498
+.Pa \(ti/.derivepassphrase .
499
+.
500
+.El
501
+.
502
+.Sh FILES
503
+.
504
+.Bl -tag -width ".Fl p , \-phrase"
505
+.
506
+.It Ev $DERIVEPASSPHRASE_PATH Ns Pa /vault.json
507
+The stored configuration for
508
+.Nm derivepassphrase vault :
509
+the default passphrase generation settings, the known service names, and the
510
+service-specific settings.
511
+This file is
512
+.Em not
513
+intended for the user to edit.
514
+.
515
+.El
516
+.
517
+.Sh SECURITY
518
+.
519
+.Bl -bullet
520
+.
521
+.It
522
+There is
523
+.Sy no way
524
+to retrieve the generated passphrases if the master passphrase, the SSH key,
525
+or the exact passphrase settings are lost, short of trying out all possible
526
+combinations.
527
+You are
528
+.Sy strongly
529
+advised to keep independent backups of the settings and the
530
+.Tn SSH
531
+key, if any.
532
+.
533
+.It
534
+The configuration is
535
+.Sy not
536
+encrypted, and you are
537
+.Sy strongly
538
+discouraged from using a stored passphrase.
539
+.
540
+.It
541
+You are
542
+.Sy strongly
543
+advised to avoid the
544
+.Pq shell script
545
+configuration export format if possible, and use the JSON format instead.
546
+If you
547
+.Em must
548
+use the shell script format, then
549
+.Sy always
550
+validate the export before attempting to interpret or run it.
551
+.
552
+.El
553
+.
554
+.Sh EXAMPLES
555
+.
556
+.Dl $ derivepassphrase vault \-\-phrase email
557
+.Pp
558
+Prompt for a master passphrase, then generate a standard passphrase
559
+.Pq length 20, no character or repetition constraints
560
+for the
561
+.Dq email
562
+service.
563
+.Pp
564
+.
565
+.Dl $ derivepassphrase vault \-\-key \-\-upper 9 \-\-lower 9 example.com
566
+.Pp
567
+.
568
+Select an
569
+.Tn SSH
570
+key from the available suitable
571
+.Tn SSH
572
+keys in the running
573
+.Tn SSH
574
+agent, then generate a passphrase for the
575
+.Li example.com
576
+service using the previously selected
577
+.Tn SSH
578
+key.
579
+The passphrase will have (standard) length 20, and at least nine characters
580
+will be uppercase characters and at least another nine characters will be
581
+lowercase characters.
582
+.Pp
583
+.
584
+.Dl $ derivepassphrase vault \-\-key \-\-upper 9 \-\-lower 9 \-\-number 9 example.com
585
+.Pp
586
+.
587
+Attempt to generate a passphrase as in the previous example.
588
+.Em This
589
+example will error out, because the passphrase constraints require at least
590
+27 characters and the standard passphrase length 20 cannot accomodate this.
591
+.Pp
592
+.
593
+.Dl $ derivepassphrase vault \-\-key \-\-upper 9 \-\-lower 9 \-\-space 2 \-\-config
594
+.Pp
595
+.
596
+After selecting an
597
+.Tn SSH
598
+key, configure the default settings to use exactly nine uppercase characters,
599
+nine lowercase characters, and two spaces for each generated passphrase.
600
+(The specific service settings, or the command-line invocation, can still
601
+override these settings.)
602
+.Pp
603
+.
604
+.Dl $ derivepassphrase vault example.com
605
+.Pp
606
+.
607
+Because of the previous setting, the generated passphrase for the
608
+.Li example.com
609
+service will behave as if
610
+.Fl \-key \-upper Li 9 Fl \-lower Li 9 Fl \-space Li 2
611
+had been specified during invocation (with the
612
+.Tn SSH
613
+key already having been selected).
614
+In particular, it is neither necessary to specify
615
+.Fl \-phrase No or Fl \-key
616
+nor is it necessary to actually select an
617
+.Tn SSH
618
+key or to type in a master passphrase.
619
+.
620
+.Sh DIAGNOSTICS
621
+.
622
+.Ex -std "derivepassphrase vault"
623
+.Pp
624
+.
625
+.Ss Fatal error messages on standard error
626
+.
627
+.Pq Li %s Ns No " indicates a variable part of the message."
628
+.
629
+.Bl -diag
630
+.
631
+.It %s is mutually exclusive with %s.
632
+The two indicated options must not be used at the same time.
633
+.
634
+.It %s requires a SERVICE or \-\-config.
635
+Using the indicated passphrase generation option requires the
636
+.Ar SERVICE
637
+argument or the
638
+.Fl \-config
639
+option.
640
+.
641
+.It %s requires a SERVICE.
642
+Using the indicated option requires the
643
+.Ar SERVICE
644
+argument.
645
+.
646
+.It %s does not take a SERVICE argument.
647
+The indicated option must not be specified together with the
648
+.Ar SERVICE
649
+argument.
650
+.
651
+.It Cannot load vault settings: %s.
652
+There was a fatal problem loading the stored vault configuration data.
653
+Further details are contained in the variable part of the message.
654
+.
655
+.It Cannot store vault settings: %s.
656
+There was a fatal problem saving the vault configuration data.
657
+Further details are contained in the variable part of the message.
658
+.
659
+.It Cannot import vault settings: %s.
660
+There was a fatal problem loading the imported vault configuration data.
661
+Further details are contained in the variable part of the message.
662
+.
663
+.It Cannot export vault settings: %s.
664
+There was a fatal problem saving the exported vault configuration data.
665
+Further details are contained in the variable part of the message.
666
+.
667
+.It Cannot load user config: %s.
668
+There was a fatal problem loading the central user configuration file.
669
+Further details are contained in the variable part of the message.
670
+.
671
+.It The user configuration file is invalid.
672
+(Exactly what it says.)
673
+.
674
+.It No usable SSH keys were found
675
+The running SSH agent does not contain any suitable SSH keys.
676
+.
677
+.It No valid SSH key selected
678
+We requested that an SSH key be selected, but we got an invalid selection.
679
+.
680
+.It The requested SSH key is not loaded into the agent.
681
+The running SSH agent does not contain the necessary SSH key.
682
+.
683
+.It Cannot find any running SSH agent because SSH_AUTH_SOCK is not set.
684
+We require a running SSH agent, but cannot locate its communication channel,
685
+which is normally indicated by the
686
+.Ev SSH_AUTH_SOCK
687
+environment variable.
688
+.
689
+.It Cannot connect to an SSH agent because this Python version does not support UNIX domain sockets.
690
+This Python installation does not support the communication mechanism
691
+necessary to talk to SSH agents.
692
+.
693
+.It Cannot connect to the SSH agent: %s.
694
+We cannot connect to the SSH agent indicated by the
695
+.Ev SSH_AUTH_SOCK
696
+environment variable.
697
+Further details are contained in the variable part of the message.
698
+.
699
+.It The SSH agent failed to or refused to supply a list of loaded keys.
700
+The SSH agent \(em while responsive in principle \(em did not fulfill the
701
+request.
702
+.
703
+.It "The SSH agent failed to or refused to" "issue a signature with the selected key," "necessary for deriving a service passphrase."
704
+The SSH agent \(em while responsive in principle \(em failed to cooperate with
705
+deriving a service passphrase from the selected master
706
+.Tn SSH
707
+key.
708
+.
709
+.It The SSH agent contains no keys suitable for derivepassphrase.
710
+.
711
+None of the keys loaded into the
712
+.Tn SSH
713
+agent (if any) are suitable for use with
714
+.Nm derivepassphrase vault .
715
+See the
716
+.Sx "SSH KEY SUITABILITY"
717
+section for the requirements the
718
+.Tn SSH
719
+key and the
720
+.Tn SSH
721
+agent must fulfill to be suitable.
722
+.
723
+.It Error communicating with the SSH agent
724
+There was a system error communicating with the SSH agent.
725
+.
726
+.It Cannot understand the SSH agent's response because it violates the communication protocol.
727
+.
728
+(Exactly what it says.)
729
+.
730
+.It Not saving any new notes: the user aborted the request.
731
+(Exactly what it says.)
732
+.
733
+.It Cannot update %s settings without actual settings.
734
+Using
735
+.Fl \-config
736
+requires at least one of the
737
+.Fl \-phrase , \-key , \-length , No etc.\&
738
+options.
739
+.
740
+.It Attempted to unset and set %s at the same time.
741
+While handling
742
+.Fl \-config ,
743
+the same configuration setting was passed as an option and as an argument to
744
+.Fl \-unset .
745
+.
746
+.It Generating a passphrase requires a SERVICE.
747
+(Exactly what it says.)
748
+.
749
+.It No passphrase or key was given in the configuration.
750
+.Nm derivepassphrase vault
751
+does not know whether to use a master SSH key or a master passphrase.
752
+.
753
+.It No passphrase was given: the user aborted the request.
754
+(Exactly what it says.)
755
+.
756
+.It No SSH key was selected: the user aborted the request.
757
+(Exactly what it says.)
758
+.
759
+.El
760
+.Pp
761
+.
762
+.Ss Non-fatal warning and info messages on standard error
763
+.
764
+.Pq Li %s Ns No " indicates a variable part of the message."
765
+.
766
+.Bl -diag
767
+.
768
+.It The %s passphrase is not %s-normalized.
769
+The indicated passphrase \(em as a Unicode string \(em is not properly
770
+normalized according to the preferred Unicode normalization form
771
+.Pq as specified in the central configuration file .
772
+It is therefore possible that the passphrase \(em as a byte string \(em is
773
+not the same byte string as you expect it to be
774
+.Pq even though it Em looks No correct ,
775
+and that the derived passphrases thus do not match their expected values
776
+either.
777
+Please double-check.
778
+.
779
+.It An empty SERVICE is not supported by vault(1).
780
+.Xr vault 1
781
+does not support the empty string as a value for
782
+.Ar SERVICE ;
783
+it will treat the
784
+.Ar SERVICE
785
+as missing.
786
+For compatibility,
787
+.Nm derivepassphrase vault
788
+will do the same.
789
+In particular, if the empty service is imported in a configuration via
790
+.Fl \-import ,
791
+then this service cannot be accessed via the
792
+.Nm derivepassphrase vault
793
+command-line.
794
+.
795
+.It Replacing invalid value %s for key %s with %s.
796
+When importing a configuration, the indicated invalid value has been
797
+replaced with the indicated replacement value.
798
+.Pq The Do interpretation Dc of the configuration doesn't change .
799
+.
800
+.It Removing ineffective setting %s = %s.
801
+When importing a configuration, the indicated ineffective setting has been
802
+removed.
803
+.Pq The Do interpretation Dc of the configuration doesn't change .
804
+.
805
+.It "The service name %s" "contains an ASCII control character," "which is not supported" "by our shell completion code."
806
+Because of limitations in the shell completion code, this specific service name
807
+will not be available as a suggestion in tab completion.
808
+.Po
809
+This
810
+.Em only
811
+affects tab completion, not other functionality.
812
+.Pc
813
+.
814
+.It Setting a %s passphrase is ineffective because a key is also set.
815
+The configuration (global or key-specific) contains both a stored master
816
+passphrase and an SSH key.
817
+The master passphrase will not take effect.
818
+.
819
+.It A subcommand will be required in v1.0.
820
+.Bo
821
+Since v0.2.0, until v1.0.
822
+.Bc
823
+This command now requires a subcommand.
824
+For compatibility, it currently defaults to
825
+.Dq vault .
826
+.
827
+.It Using deprecated v0.1-style config file %s, instead of v0.2-style %s.
828
+.Bo
829
+Since v0.2.0, until v1.0.
830
+.Bc
831
+A configuration file has been renamed.
832
+.Nm derivepassphrase vault
833
+will attempt to rename the file itself
834
+.Pq Qq Li Successfully migrated to %s. ,
835
+or complain if it cannot rename it
836
+.Pq Qq Li Failed to migrate to %s: %s .
837
+.
838
+.El
839
+.
840
+.Sh COMPATIBILITY
841
+.
842
+.Ss With other software
843
+.
844
+.Nm derivepassphrase vault
845
+is
846
+.Em almost
847
+drop-in compatible with James Coglan's
848
+.Xr vault 1 ,
849
+version 0.3.0
850
+.Pq including Do storeroom Dc support ,
851
+meaning that each tool supports the same file formats and command-line
852
+arguments/options as the other one.
853
+.Pp
854
+.
855
+Exceptions:
856
+.
857
+.Bl -bullet
858
+.
859
+.It
860
+.Xr vault 1
861
+does not support the
862
+.Sx "Compatibility and extension options"
863
+listed above.
864
+.
865
+.It
866
+.Nm derivepassphrase vault
867
+can import and generate configuration exports in the same format as
868
+.Xr vault 1 ,
869
+but it cannot
870
+.Em natively
871
+read or write
872
+.Xr vault 1
873
+.Ns 's
874
+configuration file
875
+.Pq non-storeroom
876
+or configuration directory
877
+.Pq storeroom .
878
+(The sister command
879
+.Xr derivepassphrase-export 1
880
+can read both these formats and export the contents.)
881
+.
882
+.El
883
+.
884
+.Ss Forward and backward compatibility
885
+.
886
+.Bl -bullet
887
+.
888
+.It
889
+.Bo Since v0.2.0 . Bc
890
+In v1.0, the commands
891
+.Nm derivepassphrase
892
+and
893
+.Nm derivepassphrase export
894
+will require an explicit subcommand name.
895
+Both default to the subcommand
896
+.Ic vault .
897
+.
898
+.It
899
+.Bo Since v0.2.0 . Bc
900
+In v1.0, the configuration data file for the
901
+.Ic vault
902
+subcommand will be named
903
+.Pa vault.json ,
904
+instead of
905
+.Pa config.json .
906
+.
907
+.It
908
+.Bo Since v0.2.0, to be removed in v1.0 . Bc
909
+An existing configuration data file
910
+.Pa config.json
911
+will be attempted to be renamed to
912
+.Pa vault.json .
913
+.El
914
+.
915
+.Sh SEE ALSO
916
+.
917
+.Xr derivepassphrase 1 ,
918
+.Xr pageant 1 ,
919
+.Xr ssh-agent 1 .
920
+.Rs
921
+.%A "James Coglan"
922
+.%T "vault(1)"
923
+.%U https://www.npmjs.com/package/vault
924
+.Re
925
+.Pp
926
+.
927
+Further online documentation for
928
+.Xr derivepassphrase 1
929
+.Pq tutorials, how-tos, reference and design documentation
930
+is available at
931
+.Lk https://the13thletter.info/derivepassphrase/ .
932
+.
933
+.Sh AUTHOR
934
+.
935
+.Lk mailto:software@the13thletter.info "Marco Ricci"
936
+.
937
+.Sh BUGS
938
+.
939
+.Bl -bullet
940
+.
941
+.It
942
+The defaults are dictated by
943
+.Xr vault 1 ,
944
+necessitating the
945
+.Sx Compatibility and extension options .
946
+.Pq WONTFIX.
947
+.
948
+.It
949
+The Windows version does not support
950
+.Tn SSH
951
+keys because Python on Windows does not support the predominant type of
952
+inter-process communication used by
953
+.Tn SSH
954
+agents on Windows.
955
+.
956
+.El
957
+.
... ...
@@ -18,7 +18,7 @@
18 18
         <link rel="prev" href="../derivepassphrase.vault/">
19 19
       
20 20
       
21
-        <link rel="next" href="../../changelog/">
21
+        <link rel="next" href="../../explanation/">
22 22
       
23 23
       
24 24
       <link rel="icon" href="../../assets/images/favicon.png">
... ...
@@ -174,6 +174,26 @@
174 174
   
175 175
   
176 176
   
177
+    
178
+    
179
+      <li class="md-tabs__item">
180
+        <a href="../../explanation/" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
177 197
     <li class="md-tabs__item">
178 198
       <a href="../../changelog/" class="md-tabs__link">
179 199
         
... ...
@@ -985,6 +1005,92 @@
985 1005
   
986 1006
   
987 1007
   
1008
+    
1009
+    
1010
+      
1011
+        
1012
+          
1013
+        
1014
+      
1015
+        
1016
+      
1017
+    
1018
+    
1019
+      
1020
+      
1021
+        
1022
+      
1023
+    
1024
+    
1025
+    <li class="md-nav__item md-nav__item--nested">
1026
+      
1027
+        
1028
+        
1029
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1030
+        
1031
+          
1032
+          
1033
+          <div class="md-nav__link md-nav__container">
1034
+            <a href="../../explanation/" class="md-nav__link ">
1035
+              
1036
+  
1037
+  <span class="md-ellipsis">
1038
+    Design & Background
1039
+  </span>
1040
+  
1041
+
1042
+            </a>
1043
+            
1044
+              
1045
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1046
+                <span class="md-nav__icon md-icon"></span>
1047
+              </label>
1048
+            
1049
+          </div>
1050
+        
1051
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1052
+          <label class="md-nav__title" for="__nav_5">
1053
+            <span class="md-nav__icon md-icon"></span>
1054
+            Design & Background
1055
+          </label>
1056
+          <ul class="md-nav__list" data-md-scrollfix>
1057
+            
1058
+              
1059
+            
1060
+              
1061
+                
1062
+  
1063
+  
1064
+  
1065
+  
1066
+    <li class="md-nav__item">
1067
+      <a href="../../explanation/faq-altered-versions/" class="md-nav__link">
1068
+        
1069
+  
1070
+  <span class="md-ellipsis">
1071
+    "altered versions" license requirement
1072
+  </span>
1073
+  
1074
+
1075
+      </a>
1076
+    </li>
1077
+  
1078
+
1079
+              
1080
+            
1081
+          </ul>
1082
+        </nav>
1083
+      
1084
+    </li>
1085
+  
1086
+
1087
+    
1088
+      
1089
+      
1090
+  
1091
+  
1092
+  
1093
+  
988 1094
     <li class="md-nav__item">
989 1095
       <a href="../../changelog/" class="md-nav__link">
990 1096
         
... ...
@@ -1326,13 +1432,13 @@ format for SSH as long as the underlying key type is compatible.</p>
1326 1432
         
1327 1433
         
1328 1434
           
1329
-          <a href="../../changelog/" class="md-footer__link md-footer__link--next" aria-label="Next: Changelog">
1435
+          <a href="../../explanation/" class="md-footer__link md-footer__link--next" aria-label="Next: Explanation overview">
1330 1436
             <div class="md-footer__title">
1331 1437
               <span class="md-footer__direction">
1332 1438
                 Next
1333 1439
               </span>
1334 1440
               <div class="md-ellipsis">
1335
-                Changelog
1441
+                Explanation overview
1336 1442
               </div>
1337 1443
             </div>
1338 1444
             <div class="md-footer__button md-icon">
... ...
@@ -1349,7 +1455,7 @@ format for SSH as long as the underlying key type is compatible.</p>
1349 1455
       <div class="md-copyright">
1350 1456
   
1351 1457
     <div class="md-copyright__highlight">
1352
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
1458
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1353 1459
     </div>
1354 1460
   
1355 1461
   
... ...
@@ -2,78 +2,86 @@
2 2
 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3 3
     <url>
4 4
          <loc>https://the13thletter.info/derivepassphrase/0.x/</loc>
5
-         <lastmod>2024-11-28</lastmod>
5
+         <lastmod>2025-01-07</lastmod>
6 6
     </url>
7 7
     <url>
8 8
          <loc>https://the13thletter.info/derivepassphrase/0.x/_future/</loc>
9
-         <lastmod>2024-11-28</lastmod>
9
+         <lastmod>2025-01-07</lastmod>
10 10
     </url>
11 11
     <url>
12 12
          <loc>https://the13thletter.info/derivepassphrase/0.x/changelog/</loc>
13
-         <lastmod>2024-11-28</lastmod>
13
+         <lastmod>2025-01-07</lastmod>
14
+    </url>
15
+    <url>
16
+         <loc>https://the13thletter.info/derivepassphrase/0.x/explanation/</loc>
17
+         <lastmod>2025-01-07</lastmod>
18
+    </url>
19
+    <url>
20
+         <loc>https://the13thletter.info/derivepassphrase/0.x/explanation/faq-altered-versions/</loc>
21
+         <lastmod>2025-01-07</lastmod>
14 22
     </url>
15 23
     <url>
16 24
          <loc>https://the13thletter.info/derivepassphrase/0.x/how-tos/</loc>
17
-         <lastmod>2024-11-28</lastmod>
25
+         <lastmod>2025-01-07</lastmod>
18 26
     </url>
19 27
     <url>
20 28
          <loc>https://the13thletter.info/derivepassphrase/0.x/how-tos/ssh-key/</loc>
21
-         <lastmod>2024-11-28</lastmod>
29
+         <lastmod>2025-01-07</lastmod>
22 30
     </url>
23 31
     <url>
24 32
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/</loc>
25
-         <lastmod>2024-11-28</lastmod>
33
+         <lastmod>2025-01-07</lastmod>
26 34
     </url>
27 35
     <url>
28 36
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase-export-vault.1/</loc>
29
-         <lastmod>2024-11-28</lastmod>
37
+         <lastmod>2025-01-07</lastmod>
30 38
     </url>
31 39
     <url>
32 40
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase-export.1/</loc>
33
-         <lastmod>2024-11-28</lastmod>
41
+         <lastmod>2025-01-07</lastmod>
34 42
     </url>
35 43
     <url>
36 44
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase-vault.1/</loc>
37
-         <lastmod>2024-11-28</lastmod>
45
+         <lastmod>2025-01-07</lastmod>
38 46
     </url>
39 47
     <url>
40 48
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase.1/</loc>
41
-         <lastmod>2024-11-28</lastmod>
49
+         <lastmod>2025-01-07</lastmod>
42 50
     </url>
43 51
     <url>
44 52
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase._types/</loc>
45
-         <lastmod>2024-11-28</lastmod>
53
+         <lastmod>2025-01-07</lastmod>
46 54
     </url>
47 55
     <url>
48 56
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase.cli/</loc>
49
-         <lastmod>2024-11-28</lastmod>
57
+         <lastmod>2025-01-07</lastmod>
50 58
     </url>
51 59
     <url>
52 60
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase.exporter/</loc>
53
-         <lastmod>2024-11-28</lastmod>
61
+         <lastmod>2025-01-07</lastmod>
54 62
     </url>
55 63
     <url>
56 64
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase.sequin/</loc>
57
-         <lastmod>2024-11-28</lastmod>
65
+         <lastmod>2025-01-07</lastmod>
58 66
     </url>
59 67
     <url>
60 68
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase.ssh_agent/</loc>
61
-         <lastmod>2024-11-28</lastmod>
69
+         <lastmod>2025-01-07</lastmod>
62 70
     </url>
63 71
     <url>
64 72
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase.vault/</loc>
65
-         <lastmod>2024-11-28</lastmod>
73
+         <lastmod>2025-01-07</lastmod>
66 74
     </url>
67 75
     <url>
68 76
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/prerequisites-ssh-key/</loc>
69
-         <lastmod>2024-11-28</lastmod>
77
+         <lastmod>2025-01-07</lastmod>
70 78
     </url>
71 79
     <url>
72 80
          <loc>https://the13thletter.info/derivepassphrase/0.x/tutorials/</loc>
73
-         <lastmod>2024-11-28</lastmod>
81
+         <lastmod>2025-01-07</lastmod>
74 82
     </url>
75 83
     <url>
76 84
          <loc>https://the13thletter.info/derivepassphrase/0.x/tutorials/basic-setup-passphrase/</loc>
77
-         <lastmod>2024-11-28</lastmod>
85
+         <lastmod>2025-01-07</lastmod>
78 86
     </url>
79 87
 </urlset>
80 88
\ No newline at end of file
... ...
@@ -174,6 +174,26 @@
174 174
   
175 175
   
176 176
   
177
+    
178
+    
179
+      <li class="md-tabs__item">
180
+        <a href="../../explanation/" class="md-tabs__link">
181
+          
182
+  
183
+    
184
+  
185
+  Design & Background
186
+
187
+        </a>
188
+      </li>
189
+    
190
+  
191
+
192
+      
193
+        
194
+  
195
+  
196
+  
177 197
     <li class="md-tabs__item">
178 198
       <a href="../../changelog/" class="md-tabs__link">
179 199
         
... ...
@@ -1049,6 +1069,92 @@
1049 1069
   
1050 1070
   
1051 1071
   
1072
+    
1073
+    
1074
+      
1075
+        
1076
+          
1077
+        
1078
+      
1079
+        
1080
+      
1081
+    
1082
+    
1083
+      
1084
+      
1085
+        
1086
+      
1087
+    
1088
+    
1089
+    <li class="md-nav__item md-nav__item--nested">
1090
+      
1091
+        
1092
+        
1093
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
1094
+        
1095
+          
1096
+          
1097
+          <div class="md-nav__link md-nav__container">
1098
+            <a href="../../explanation/" class="md-nav__link ">
1099
+              
1100
+  
1101
+  <span class="md-ellipsis">
1102
+    Design & Background
1103
+  </span>
1104
+  
1105
+
1106
+            </a>
1107
+            
1108
+              
1109
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
1110
+                <span class="md-nav__icon md-icon"></span>
1111
+              </label>
1112
+            
1113
+          </div>
1114
+        
1115
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
1116
+          <label class="md-nav__title" for="__nav_5">
1117
+            <span class="md-nav__icon md-icon"></span>
1118
+            Design & Background
1119
+          </label>
1120
+          <ul class="md-nav__list" data-md-scrollfix>
1121
+            
1122
+              
1123
+            
1124
+              
1125
+                
1126
+  
1127
+  
1128
+  
1129
+  
1130
+    <li class="md-nav__item">
1131
+      <a href="../../explanation/faq-altered-versions/" class="md-nav__link">
1132
+        
1133
+  
1134
+  <span class="md-ellipsis">
1135
+    "altered versions" license requirement
1136
+  </span>
1137
+  
1138
+
1139
+      </a>
1140
+    </li>
1141
+  
1142
+
1143
+              
1144
+            
1145
+          </ul>
1146
+        </nav>
1147
+      
1148
+    </li>
1149
+  
1150
+
1151
+    
1152
+      
1153
+      
1154
+  
1155
+  
1156
+  
1157
+  
1052 1158
     <li class="md-nav__item">
1053 1159
       <a href="../../changelog/" class="md-nav__link">
1054 1160
         
... ...
@@ -1355,9 +1461,9 @@ Because we are using a master passphrase, we also need the <code>-p</code> optio
1355 1461
 <div class="highlight"><pre><span></span><code><span class="gp">$ </span>derivepassphrase<span class="w"> </span>vault<span class="w"> </span>--config<span class="w"> </span>--length<span class="w"> </span><span class="m">12</span><span class="w"> </span>--space<span class="w"> </span><span class="m">0</span><span class="w"> </span>--upper<span class="w"> </span><span class="m">1</span><span class="w"> </span>--lower<span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="se">\</span>
1356 1462
 <span class="gp">&gt; </span><span class="w">                       </span>--number<span class="w"> </span><span class="m">1</span><span class="w"> </span>--repeat<span class="w"> </span><span class="m">3</span><span class="w"> </span>email
1357 1463
 </code></pre></div>
1358
-<div class="admonition warning">
1359
-<p class="admonition-title">Warning: <code>-p</code> and <code>--config</code></p>
1360
-<p>Do <strong>not</strong> use the <code>-p</code> and the <code>--config</code> options together to store the master passphrase!
1464
+<div class="admonition danger">
1465
+<p class="admonition-title">Security risk: use of <code>-p</code> and <code>--config</code></p>
1466
+<p>You are <strong>strongly discouraged</strong> from using the <code>-p</code> and the <code>--config</code> options together to store the master passphrase!
1361 1467
 The configuration is assumed to <em>not contain sensitive contents</em> and is <em>not encrypted</em>, so your master passphrase is then visible to <em>anyone</em> with appropriate privileges!</p>
1362 1468
 </div>
1363 1469
 <p>Check that the settings are stored correctly:</p>
... ...
@@ -1507,7 +1613,7 @@ Our configuration should look like this:</p>
1507 1613
       <div class="md-copyright">
1508 1614
   
1509 1615
     <div class="md-copyright__highlight">
1510
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
1616
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1511 1617
     </div>
1512 1618
   
1513 1619
   
... ...
@@ -169,6 +169,26 @@
169 169
   
170 170
   
171 171
   
172
+    
173
+    
174
+      <li class="md-tabs__item">
175
+        <a href="../explanation/" class="md-tabs__link">
176
+          
177
+  
178
+    
179
+  
180
+  Design & Background
181
+
182
+        </a>
183
+      </li>
184
+    
185
+  
186
+
187
+      
188
+        
189
+  
190
+  
191
+  
172 192
     <li class="md-tabs__item">
173 193
       <a href="../changelog/" class="md-tabs__link">
174 194
         
... ...
@@ -902,6 +922,92 @@
902 922
   
903 923
   
904 924
   
925
+    
926
+    
927
+      
928
+        
929
+          
930
+        
931
+      
932
+        
933
+      
934
+    
935
+    
936
+      
937
+      
938
+        
939
+      
940
+    
941
+    
942
+    <li class="md-nav__item md-nav__item--nested">
943
+      
944
+        
945
+        
946
+        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
947
+        
948
+          
949
+          
950
+          <div class="md-nav__link md-nav__container">
951
+            <a href="../explanation/" class="md-nav__link ">
952
+              
953
+  
954
+  <span class="md-ellipsis">
955
+    Design & Background
956
+  </span>
957
+  
958
+
959
+            </a>
960
+            
961
+              
962
+              <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="0">
963
+                <span class="md-nav__icon md-icon"></span>
964
+              </label>
965
+            
966
+          </div>
967
+        
968
+        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
969
+          <label class="md-nav__title" for="__nav_5">
970
+            <span class="md-nav__icon md-icon"></span>
971
+            Design & Background
972
+          </label>
973
+          <ul class="md-nav__list" data-md-scrollfix>
974
+            
975
+              
976
+            
977
+              
978
+                
979
+  
980
+  
981
+  
982
+  
983
+    <li class="md-nav__item">
984
+      <a href="../explanation/faq-altered-versions/" class="md-nav__link">
985
+        
986
+  
987
+  <span class="md-ellipsis">
988
+    "altered versions" license requirement
989
+  </span>
990
+  
991
+
992
+      </a>
993
+    </li>
994
+  
995
+
996
+              
997
+            
998
+          </ul>
999
+        </nav>
1000
+      
1001
+    </li>
1002
+  
1003
+
1004
+    
1005
+      
1006
+      
1007
+  
1008
+  
1009
+  
1010
+  
905 1011
     <li class="md-nav__item">
906 1012
       <a href="../changelog/" class="md-nav__link">
907 1013
         
... ...
@@ -1035,7 +1141,7 @@
1035 1141
       <div class="md-copyright">
1036 1142
   
1037 1143
     <div class="md-copyright__highlight">
1038
-      Copyright &copy; 2024 Marco Ricci (the-13th-letter)
1144
+      Copyright &copy; 2025 Marco Ricci (the-13th-letter)
1039 1145
     </div>
1040 1146
   
1041 1147
   
1042 1148