yakmesh 2.8.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +637 -0
- package/CONTRIBUTING.md +42 -0
- package/Caddyfile +77 -0
- package/README.md +119 -29
- package/adapters/adapter-mlv-bible/README.md +124 -0
- package/adapters/adapter-mlv-bible/index.js +400 -0
- package/adapters/chat-mod-adapter.js +532 -0
- package/adapters/content-adapter.js +273 -0
- package/content/api.js +50 -41
- package/content/index.js +2 -2
- package/content/store.js +355 -173
- package/dashboard/index.html +19 -3
- package/database/replication.js +117 -37
- package/docs/CRYPTO-AGILITY.md +204 -0
- package/docs/MTLS-RESEARCH.md +367 -0
- package/docs/NAMCHE-SPEC.md +681 -0
- package/docs/PEERQUANTA-YAKMESH-INTEGRATION.md +407 -0
- package/docs/PRECISION-DISCLOSURE.md +96 -0
- package/docs/README.md +76 -0
- package/docs/ROADMAP-2.4.0.md +447 -0
- package/docs/ROADMAP-2.5.0.md +244 -0
- package/docs/SECURITY-AUDIT-REPORT.md +306 -0
- package/docs/SST-INTEGRATION.md +712 -0
- package/docs/STEADYWATCH-IMPLEMENTATION.md +303 -0
- package/docs/TERNARY-AUDIT-REPORT.md +247 -0
- package/docs/TME-FAQ.md +221 -0
- package/docs/WHITEPAPER.md +623 -0
- package/docs/adapters.html +1001 -0
- package/docs/advanced-systems.html +1045 -0
- package/docs/annex.html +1046 -0
- package/docs/api.html +970 -0
- package/docs/business/response-templates.md +160 -0
- package/docs/c2c.html +1225 -0
- package/docs/cli.html +1332 -0
- package/docs/configuration.html +1248 -0
- package/docs/darshan.html +1085 -0
- package/docs/dharma.html +966 -0
- package/docs/docs-bundle.html +1075 -0
- package/docs/docs.css +3120 -0
- package/docs/docs.js +556 -0
- package/docs/doko.html +969 -0
- package/docs/geo-proof.html +858 -0
- package/docs/getting-started.html +840 -0
- package/docs/gumba-tutorial.html +1144 -0
- package/docs/gumba.html +1098 -0
- package/docs/index.html +914 -0
- package/docs/jhilke.html +1312 -0
- package/docs/karma.html +1100 -0
- package/docs/katha.html +1037 -0
- package/docs/lama.html +978 -0
- package/docs/mandala.html +1067 -0
- package/docs/mani.html +964 -0
- package/docs/mantra.html +967 -0
- package/docs/mesh.html +1409 -0
- package/docs/nakpak.html +869 -0
- package/docs/namche.html +928 -0
- package/docs/nav-order.json +53 -0
- package/docs/prahari.html +1043 -0
- package/docs/prism-bash.min.js +1 -0
- package/docs/prism-javascript.min.js +1 -0
- package/docs/prism-json.min.js +1 -0
- package/docs/prism-tomorrow.min.css +1 -0
- package/docs/prism.min.js +1 -0
- package/docs/privacy.html +699 -0
- package/docs/quick-reference.html +1181 -0
- package/docs/sakshi.html +1402 -0
- package/docs/sandboxing.md +386 -0
- package/docs/seva.html +911 -0
- package/docs/sherpa.html +871 -0
- package/docs/studio.html +860 -0
- package/docs/stupa.html +995 -0
- package/docs/tailwind.min.css +2 -0
- package/docs/tattva.html +1332 -0
- package/docs/terms.html +686 -0
- package/docs/time-server-deployment.md +166 -0
- package/docs/time-sources.html +1392 -0
- package/docs/tivra.html +1127 -0
- package/docs/trademark-policy.html +686 -0
- package/docs/tribhuj.html +1183 -0
- package/docs/trust-security.html +1029 -0
- package/docs/tutorials/backup-recovery.html +654 -0
- package/docs/tutorials/dashboard.html +604 -0
- package/docs/tutorials/domain-setup.html +605 -0
- package/docs/tutorials/host-website.html +456 -0
- package/docs/tutorials/mesh-network.html +505 -0
- package/docs/tutorials/mobile-access.html +445 -0
- package/docs/tutorials/privacy.html +467 -0
- package/docs/tutorials/raspberry-pi.html +600 -0
- package/docs/tutorials/security-basics.html +539 -0
- package/docs/tutorials/share-files.html +431 -0
- package/docs/tutorials/troubleshooting.html +637 -0
- package/docs/tutorials/trust-karma.html +419 -0
- package/docs/tutorials/yak-protocol.html +456 -0
- package/docs/tutorials.html +1034 -0
- package/docs/vani.html +1270 -0
- package/docs/webserver.html +809 -0
- package/docs/yak-protocol.html +940 -0
- package/docs/yak-timeserver-design.md +475 -0
- package/docs/yakapp.html +1015 -0
- package/docs/ypc27.html +1069 -0
- package/docs/yurt.html +1344 -0
- package/embedded-docs/bundle.js +334 -74
- package/gossip/protocol.js +247 -27
- package/identity/key-resolver.js +262 -0
- package/identity/machine-seed.js +632 -0
- package/identity/node-key.js +669 -368
- package/identity/tribhuj-ratchet.js +506 -0
- package/knowledge-base.js +37 -8
- package/launcher/yakmesh.bat +62 -0
- package/launcher/yakmesh.sh +70 -0
- package/mesh/annex.js +462 -108
- package/mesh/beacon-broadcast.js +113 -1
- package/mesh/darshan.js +1718 -0
- package/mesh/gumba.js +1567 -0
- package/mesh/jhilke.js +651 -0
- package/mesh/katha.js +1012 -0
- package/mesh/nakpak-routing.js +8 -5
- package/mesh/network.js +724 -34
- package/mesh/pulse-sync.js +4 -1
- package/mesh/rate-limiter.js +127 -15
- package/mesh/seva.js +526 -0
- package/mesh/sherpa-discovery.js +89 -8
- package/mesh/sybil-defense.js +19 -5
- package/mesh/temporal-encoder.js +4 -3
- package/mesh/vani.js +1364 -0
- package/mesh/yurt.js +1340 -0
- package/models/entropy-sentinel.onnx +0 -0
- package/models/karma-trust.onnx +0 -0
- package/models/manifest.json +43 -0
- package/models/sakshi-anomaly.onnx +0 -0
- package/oracle/code-proof-protocol.js +7 -6
- package/oracle/codebase-lock.js +257 -28
- package/oracle/index.js +74 -15
- package/oracle/ma902-snmp.js +678 -0
- package/oracle/module-sealer.js +5 -3
- package/oracle/network-identity.js +16 -0
- package/oracle/packet-checksum.js +201 -0
- package/oracle/sst.js +579 -0
- package/oracle/ternary-144t.js +714 -0
- package/oracle/ternary-ml.js +481 -0
- package/oracle/time-api.js +239 -0
- package/oracle/time-source.js +137 -47
- package/oracle/validation-oracle-hardened.js +1111 -1071
- package/oracle/validation-oracle.js +4 -2
- package/oracle/ypc27.js +211 -0
- package/package.json +20 -3
- package/protocol/yak-handler.js +35 -9
- package/protocol/yak-protocol.js +28 -13
- package/reference/cpp/yakmesh_mceliece_shard.cpp +168 -0
- package/reference/cpp/yakmesh_ypc27.cpp +179 -0
- package/sbom.json +87 -0
- package/scripts/security-audit.mjs +264 -0
- package/scripts/update-docs-nav.js +194 -0
- package/scripts/update-docs-sidebar.cjs +164 -0
- package/security/crypto-config.js +4 -3
- package/security/dharma-moderation.js +517 -0
- package/security/doko-identity.js +193 -143
- package/security/domain-consensus.js +86 -85
- package/security/fs-hardening.js +620 -0
- package/security/hardware-attestation.js +5 -3
- package/security/hybrid-trust.js +227 -87
- package/security/karma-rate-limiter.js +692 -0
- package/security/khata-protocol.js +22 -21
- package/security/khata-trust-integration.js +277 -150
- package/security/memory-safety.js +635 -0
- package/security/mesh-auth.js +11 -10
- package/security/mesh-revocation.js +373 -5
- package/security/namche-gateway.js +298 -69
- package/security/sakshi.js +460 -3
- package/security/sangha.js +770 -0
- package/security/secure-config.js +473 -0
- package/security/silicon-parity.js +13 -10
- package/security/steadywatch.js +1142 -0
- package/security/strike-system.js +32 -3
- package/security/temporal-signing.js +488 -0
- package/security/trit-commitment.js +464 -0
- package/server/crypto/annex.js +247 -0
- package/server/darshan-api.js +343 -0
- package/server/index.js +3259 -362
- package/server/komm-api.js +668 -0
- package/utils/accel.js +2273 -0
- package/utils/ternary-id.js +79 -0
- package/utils/verify-worker.js +57 -0
- package/webserver/index.js +95 -5
- package/assets/yakmesh-logo.png +0 -0
- package/assets/yakmesh-logo.svg +0 -80
- package/assets/yakmesh-logo2.png +0 -0
- package/assets/yakmesh-logo2sm.png +0 -0
- package/assets/ymsm.png +0 -0
- package/website/assets/silhouettes/adapters.svg +0 -107
- package/website/assets/silhouettes/api-endpoints.svg +0 -115
- package/website/assets/silhouettes/atomic-clock.svg +0 -83
- package/website/assets/silhouettes/base-camp.svg +0 -81
- package/website/assets/silhouettes/bridge.svg +0 -69
- package/website/assets/silhouettes/docs-bundle.svg +0 -113
- package/website/assets/silhouettes/doko-basket.svg +0 -70
- package/website/assets/silhouettes/fortress.svg +0 -93
- package/website/assets/silhouettes/gateway.svg +0 -54
- package/website/assets/silhouettes/gears.svg +0 -93
- package/website/assets/silhouettes/globe-satellite.svg +0 -67
- package/website/assets/silhouettes/karma-wheel.svg +0 -137
- package/website/assets/silhouettes/lama-council.svg +0 -141
- package/website/assets/silhouettes/mandala-network.svg +0 -169
- package/website/assets/silhouettes/mani-stones.svg +0 -149
- package/website/assets/silhouettes/mantra-wheel.svg +0 -116
- package/website/assets/silhouettes/mesh-nodes.svg +0 -113
- package/website/assets/silhouettes/nakpak.svg +0 -56
- package/website/assets/silhouettes/peak-lightning.svg +0 -73
- package/website/assets/silhouettes/sherpa.svg +0 -69
- package/website/assets/silhouettes/stupa-tower.svg +0 -119
- package/website/assets/silhouettes/tattva-eye.svg +0 -78
- package/website/assets/silhouettes/terminal.svg +0 -74
- package/website/assets/silhouettes/webserver.svg +0 -145
- package/website/assets/silhouettes/yak.svg +0 -78
- package/website/assets/yakmesh-logo.png +0 -0
- package/website/assets/yakmesh-logo.webp +0 -0
- package/website/assets/yakmesh-logo128x140.webp +0 -0
- package/website/assets/yakmesh-logo2.png +0 -0
- package/website/assets/yakmesh-logo2.svg +0 -51
- package/website/assets/yakmesh-logo40x44.webp +0 -0
- package/website/assets/yakmesh.gif +0 -0
- package/website/assets/yakmesh.ico +0 -0
- package/website/assets/yakmesh.jpg +0 -0
- package/website/assets/yakmesh.pdf +0 -0
- package/website/assets/yakmesh.png +0 -0
- package/website/assets/yakmesh.svg +0 -70
- package/website/assets/yakmesh128.webp +0 -0
- package/website/assets/yakmesh32.png +0 -0
- package/website/assets/yakmesh32.svg +0 -65
- package/website/assets/yakmesh32o.ico +0 -2
- package/website/assets/yakmesh32o.svg +0 -65
- package/website/assets/yakmesh32o.svgz +0 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* update-docs-nav.js - Update documentation navigation links
|
|
4
|
+
*
|
|
5
|
+
* Reads docs/nav-order.json and updates prev/next links in all doc pages.
|
|
6
|
+
* Handles two navigation formats:
|
|
7
|
+
* 1. Journey Navigation cards (with icons and descriptions)
|
|
8
|
+
* 2. Simple nav-footer links
|
|
9
|
+
*
|
|
10
|
+
* Usage: node scripts/update-docs-nav.js [--dry-run] [--verbose]
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const fs = require('fs');
|
|
14
|
+
const path = require('path');
|
|
15
|
+
|
|
16
|
+
const DOCS_DIR = path.join(__dirname, '..', 'docs');
|
|
17
|
+
const NAV_ORDER_FILE = path.join(DOCS_DIR, 'nav-order.json');
|
|
18
|
+
|
|
19
|
+
// Parse args
|
|
20
|
+
const args = process.argv.slice(2);
|
|
21
|
+
const DRY_RUN = args.includes('--dry-run');
|
|
22
|
+
const VERBOSE = args.includes('--verbose');
|
|
23
|
+
|
|
24
|
+
function log(...msg) {
|
|
25
|
+
if (VERBOSE) console.log(...msg);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function loadNavOrder() {
|
|
29
|
+
const content = fs.readFileSync(NAV_ORDER_FILE, 'utf8');
|
|
30
|
+
return JSON.parse(content).pages;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Generate Journey Navigation card HTML
|
|
35
|
+
*/
|
|
36
|
+
function generateJourneyCard(page, direction) {
|
|
37
|
+
if (!page) return '';
|
|
38
|
+
|
|
39
|
+
const borderClass = direction === 'prev'
|
|
40
|
+
? 'border-mountain-700'
|
|
41
|
+
: 'border-theme-primary';
|
|
42
|
+
const label = direction === 'prev' ? '← Previous' : 'Next →';
|
|
43
|
+
|
|
44
|
+
return [
|
|
45
|
+
' <a href="' + page.file + '" class="flex-1 block bg-mountain-800 border ' + borderClass + ' rounded-xl p-4 hover:border-theme-accent transition group">',
|
|
46
|
+
' <div class="text-xs text-mountain-400 mb-1">' + label + '</div>',
|
|
47
|
+
' <div class="flex items-center gap-2">',
|
|
48
|
+
' <span class="text-xl">' + page.icon + '</span>',
|
|
49
|
+
' <span class="font-semibold group-hover:text-theme-accent">' + page.title + '</span>',
|
|
50
|
+
' </div>',
|
|
51
|
+
' <p class="text-mountain-400 text-sm mt-1">' + page.description + '</p>',
|
|
52
|
+
' </a>'
|
|
53
|
+
].join('\n');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Generate Journey Navigation section
|
|
58
|
+
*/
|
|
59
|
+
function generateJourneyNav(prevPage, nextPage) {
|
|
60
|
+
const cards = [];
|
|
61
|
+
if (prevPage) cards.push(generateJourneyCard(prevPage, 'prev'));
|
|
62
|
+
if (nextPage) cards.push(generateJourneyCard(nextPage, 'next'));
|
|
63
|
+
|
|
64
|
+
return [
|
|
65
|
+
' <!-- Journey Navigation -->',
|
|
66
|
+
' <div class="border-t border-mountain-700 mt-12 pt-8">',
|
|
67
|
+
' <h2 class="text-xl font-bold mb-6">Continue the Journey</h2>',
|
|
68
|
+
' <div class="flex flex-col sm:flex-row gap-4">',
|
|
69
|
+
cards.join('\n'),
|
|
70
|
+
' </div>',
|
|
71
|
+
' </div>'
|
|
72
|
+
].join('\n');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Generate simple nav-footer HTML
|
|
77
|
+
*/
|
|
78
|
+
function generateNavFooter(prevPage, nextPage) {
|
|
79
|
+
const links = [];
|
|
80
|
+
if (prevPage) {
|
|
81
|
+
links.push(' <a href="' + prevPage.file + '">← ' + prevPage.title + '</a>');
|
|
82
|
+
}
|
|
83
|
+
if (nextPage) {
|
|
84
|
+
const mlAuto = prevPage ? ' class="ml-auto"' : '';
|
|
85
|
+
links.push(' <a href="' + nextPage.file + '"' + mlAuto + '>' + nextPage.title + ' →</a>');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return [
|
|
89
|
+
' <!-- Navigation -->',
|
|
90
|
+
' <nav class="docs-nav-footer">',
|
|
91
|
+
links.join('\n'),
|
|
92
|
+
' </nav>'
|
|
93
|
+
].join('\n');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Update navigation in a single file
|
|
98
|
+
*/
|
|
99
|
+
function updateFileNav(filePath, prevPage, nextPage) {
|
|
100
|
+
let content = fs.readFileSync(filePath, 'utf8');
|
|
101
|
+
const fileName = path.basename(filePath);
|
|
102
|
+
let modified = false;
|
|
103
|
+
|
|
104
|
+
// Pattern 1: Journey Navigation cards
|
|
105
|
+
const journeyPattern = /<!-- Journey Navigation -->.*?<\/div>\s*<\/div>\s*<\/div>/s;
|
|
106
|
+
if (journeyPattern.test(content)) {
|
|
107
|
+
const newNav = generateJourneyNav(prevPage, nextPage);
|
|
108
|
+
content = content.replace(journeyPattern, newNav);
|
|
109
|
+
modified = true;
|
|
110
|
+
log(' Updated Journey Navigation in', fileName);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Pattern 2: Simple nav-footer (if no Journey Navigation)
|
|
114
|
+
const navFooterPattern = /<!-- Navigation -->\s*<nav class="docs-nav-footer">.*?<\/nav>/s;
|
|
115
|
+
if (!modified && navFooterPattern.test(content)) {
|
|
116
|
+
const newNav = generateNavFooter(prevPage, nextPage);
|
|
117
|
+
content = content.replace(navFooterPattern, newNav);
|
|
118
|
+
modified = true;
|
|
119
|
+
log(' Updated nav-footer in', fileName);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Pattern 3: Alternative Journey Navigation format (closing with </div></div>)
|
|
123
|
+
const altJourneyPattern = /<div class="border-t border-mountain-700 mt-12 pt-8">\s*<h2 class="text-xl font-bold mb-6">Continue the Journey<\/h2>.*?<\/div>\s*<\/div>/s;
|
|
124
|
+
if (!modified && altJourneyPattern.test(content)) {
|
|
125
|
+
const newNav = generateJourneyNav(prevPage, nextPage);
|
|
126
|
+
content = content.replace(altJourneyPattern, newNav.replace(' <!-- Journey Navigation -->\n', ''));
|
|
127
|
+
modified = true;
|
|
128
|
+
log(' Updated alt Journey Navigation in', fileName);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (modified) {
|
|
132
|
+
if (!DRY_RUN) {
|
|
133
|
+
fs.writeFileSync(filePath, content, 'utf8');
|
|
134
|
+
}
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
log(' No navigation section found in', fileName);
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Main update function
|
|
144
|
+
*/
|
|
145
|
+
function updateAllNavigation() {
|
|
146
|
+
console.log('📚 Updating documentation navigation links...');
|
|
147
|
+
if (DRY_RUN) console.log(' (DRY RUN - no files will be modified)');
|
|
148
|
+
console.log('');
|
|
149
|
+
|
|
150
|
+
const pages = loadNavOrder();
|
|
151
|
+
console.log('Found', pages.length, 'pages in nav-order.json');
|
|
152
|
+
console.log('');
|
|
153
|
+
|
|
154
|
+
let updated = 0;
|
|
155
|
+
let skipped = 0;
|
|
156
|
+
let notFound = 0;
|
|
157
|
+
|
|
158
|
+
for (let i = 0; i < pages.length; i++) {
|
|
159
|
+
const current = pages[i];
|
|
160
|
+
const prev = i > 0 ? pages[i - 1] : null;
|
|
161
|
+
const next = i < pages.length - 1 ? pages[i + 1] : null;
|
|
162
|
+
|
|
163
|
+
const filePath = path.join(DOCS_DIR, current.file);
|
|
164
|
+
|
|
165
|
+
if (!fs.existsSync(filePath)) {
|
|
166
|
+
console.log('⚠️ File not found:', current.file);
|
|
167
|
+
notFound++;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (updateFileNav(filePath, prev, next)) {
|
|
172
|
+
console.log('✅', current.file, '→',
|
|
173
|
+
prev ? '← ' + prev.file : '(no prev)',
|
|
174
|
+
next ? '→ ' + next.file : '(no next)');
|
|
175
|
+
updated++;
|
|
176
|
+
} else {
|
|
177
|
+
skipped++;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
console.log('');
|
|
182
|
+
console.log('Summary:');
|
|
183
|
+
console.log(' Updated:', updated);
|
|
184
|
+
console.log(' Skipped:', skipped, '(no nav section)');
|
|
185
|
+
console.log(' Not found:', notFound);
|
|
186
|
+
|
|
187
|
+
if (DRY_RUN) {
|
|
188
|
+
console.log('');
|
|
189
|
+
console.log('Run without --dry-run to apply changes.');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Run
|
|
194
|
+
updateAllNavigation();
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* update-docs-sidebar.cjs - Update sidebar navigation in all doc pages
|
|
4
|
+
*
|
|
5
|
+
* Reads docs/nav-order.json and updates the <ul class="sidebar-nav"> section
|
|
6
|
+
* in all HTML files to match the canonical navigation order.
|
|
7
|
+
*
|
|
8
|
+
* Usage: node scripts/update-docs-sidebar.cjs [--dry-run] [--verbose]
|
|
9
|
+
*
|
|
10
|
+
* This ensures all pages have consistent sidebar navigation without manual updates.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const fs = require('fs');
|
|
14
|
+
const path = require('path');
|
|
15
|
+
|
|
16
|
+
// Support both /docs and /website/docs
|
|
17
|
+
const SCRIPTS_DIR = __dirname;
|
|
18
|
+
const ROOT_DIR = path.join(SCRIPTS_DIR, '..');
|
|
19
|
+
const NAV_ORDER_FILE = path.join(ROOT_DIR, 'docs', 'nav-order.json');
|
|
20
|
+
|
|
21
|
+
// Target directories to scan
|
|
22
|
+
const DOCS_DIRS = [
|
|
23
|
+
path.join(ROOT_DIR, 'docs'),
|
|
24
|
+
path.join(ROOT_DIR, 'website', 'docs'),
|
|
25
|
+
path.join(ROOT_DIR, 'website', 'docs', 'tutorials')
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
// Parse args
|
|
29
|
+
const args = process.argv.slice(2);
|
|
30
|
+
const DRY_RUN = args.includes('--dry-run');
|
|
31
|
+
const VERBOSE = args.includes('--verbose');
|
|
32
|
+
|
|
33
|
+
function log(...msg) {
|
|
34
|
+
if (VERBOSE) console.log(...msg);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function loadNavOrder() {
|
|
38
|
+
const content = fs.readFileSync(NAV_ORDER_FILE, 'utf8');
|
|
39
|
+
return JSON.parse(content).pages;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Generate sidebar nav list items from nav-order.json
|
|
44
|
+
* @param {string} currentFile - The current file name (for "active" class)
|
|
45
|
+
* @param {string} prefix - Path prefix (e.g., "../" for subdirectory pages)
|
|
46
|
+
*/
|
|
47
|
+
function generateSidebarNavItems(currentFile, prefix = '') {
|
|
48
|
+
const pages = loadNavOrder();
|
|
49
|
+
|
|
50
|
+
const items = pages.map(page => {
|
|
51
|
+
const isActive = page.file === currentFile;
|
|
52
|
+
const activeClass = isActive ? ' class="active"' : '';
|
|
53
|
+
const href = prefix + page.file;
|
|
54
|
+
|
|
55
|
+
// Icon handling - some use classes like yak-icon
|
|
56
|
+
let iconHtml;
|
|
57
|
+
if (page.title === 'YAK://') {
|
|
58
|
+
iconHtml = '<span class="yak-icon"></span>';
|
|
59
|
+
} else {
|
|
60
|
+
iconHtml = `<span>${page.icon}</span>`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return ` <li><a href="${href}"${activeClass}>${iconHtml} <span>${page.title}</span></a></li>`;
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
return items.join('\n');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Update sidebar in a single file
|
|
71
|
+
*/
|
|
72
|
+
function updateFileSidebar(filePath) {
|
|
73
|
+
let content = fs.readFileSync(filePath, 'utf8');
|
|
74
|
+
const fileName = path.basename(filePath);
|
|
75
|
+
|
|
76
|
+
// Determine prefix for subdirectory pages (tutorials/)
|
|
77
|
+
const inSubdir = filePath.includes(path.sep + 'tutorials' + path.sep);
|
|
78
|
+
const prefix = inSubdir ? '../' : '';
|
|
79
|
+
|
|
80
|
+
// Match the sidebar-nav ul section
|
|
81
|
+
const sidebarPattern = /<ul class="sidebar-nav">\s*(?:<li>.*?<\/li>\s*)+<\/ul>/s;
|
|
82
|
+
|
|
83
|
+
if (!sidebarPattern.test(content)) {
|
|
84
|
+
log(' No sidebar-nav found in', fileName);
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const newNavItems = generateSidebarNavItems(fileName, prefix);
|
|
89
|
+
const newSidebar = `<ul class="sidebar-nav">\n${newNavItems}\n </ul>`;
|
|
90
|
+
|
|
91
|
+
const newContent = content.replace(sidebarPattern, newSidebar);
|
|
92
|
+
|
|
93
|
+
if (newContent === content) {
|
|
94
|
+
log(' No changes needed in', fileName);
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (!DRY_RUN) {
|
|
99
|
+
fs.writeFileSync(filePath, newContent, 'utf8');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Get all HTML files in a directory
|
|
107
|
+
*/
|
|
108
|
+
function getHtmlFiles(dir) {
|
|
109
|
+
if (!fs.existsSync(dir)) return [];
|
|
110
|
+
|
|
111
|
+
return fs.readdirSync(dir)
|
|
112
|
+
.filter(f => f.endsWith('.html'))
|
|
113
|
+
.map(f => path.join(dir, f));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Main update function
|
|
118
|
+
*/
|
|
119
|
+
function updateAllSidebars() {
|
|
120
|
+
console.log('🧭 Updating documentation sidebars...');
|
|
121
|
+
if (DRY_RUN) console.log(' (DRY RUN - no files will be modified)');
|
|
122
|
+
console.log('');
|
|
123
|
+
|
|
124
|
+
const pages = loadNavOrder();
|
|
125
|
+
console.log(`Loaded ${pages.length} pages from nav-order.json`);
|
|
126
|
+
console.log('');
|
|
127
|
+
|
|
128
|
+
let updated = 0;
|
|
129
|
+
let skipped = 0;
|
|
130
|
+
|
|
131
|
+
// Collect all HTML files from all directories
|
|
132
|
+
const allFiles = [];
|
|
133
|
+
for (const dir of DOCS_DIRS) {
|
|
134
|
+
allFiles.push(...getHtmlFiles(dir));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
console.log(`Found ${allFiles.length} HTML files to process`);
|
|
138
|
+
console.log('');
|
|
139
|
+
|
|
140
|
+
for (const filePath of allFiles) {
|
|
141
|
+
const relativePath = path.relative(ROOT_DIR, filePath);
|
|
142
|
+
|
|
143
|
+
if (updateFileSidebar(filePath)) {
|
|
144
|
+
console.log('✅', relativePath);
|
|
145
|
+
updated++;
|
|
146
|
+
} else {
|
|
147
|
+
log('⏭️ ', relativePath);
|
|
148
|
+
skipped++;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
console.log('');
|
|
153
|
+
console.log('Summary:');
|
|
154
|
+
console.log(' Updated:', updated);
|
|
155
|
+
console.log(' Skipped:', skipped);
|
|
156
|
+
|
|
157
|
+
if (DRY_RUN) {
|
|
158
|
+
console.log('');
|
|
159
|
+
console.log('Run without --dry-run to apply changes.');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Run
|
|
164
|
+
updateAllSidebars();
|
|
@@ -276,12 +276,13 @@ export function getBackupSignatureName(level = activeLevel) {
|
|
|
276
276
|
/**
|
|
277
277
|
* Generate a backup (SLH-DSA) keypair using the current security level
|
|
278
278
|
* Note: SLH-DSA keys are much smaller than ML-DSA, but signatures are larger
|
|
279
|
+
* @param {Uint8Array} [seed] - Optional seed for deterministic generation
|
|
279
280
|
* @param {number} [level] - Optional security level
|
|
280
281
|
* @returns {Object} { publicKey, secretKey }
|
|
281
282
|
*/
|
|
282
|
-
export function generateBackupSignatureKeyPair(level = activeLevel) {
|
|
283
|
+
export function generateBackupSignatureKeyPair(seed = null, level = activeLevel) {
|
|
283
284
|
const algo = CRYPTO_PROFILES[level].backupSignature.algorithm;
|
|
284
|
-
return algo.keygen();
|
|
285
|
+
return seed ? algo.keygen(seed) : algo.keygen();
|
|
285
286
|
}
|
|
286
287
|
|
|
287
288
|
/**
|
|
@@ -324,7 +325,7 @@ export function verifyBackup(signature, message, publicKey, level = activeLevel)
|
|
|
324
325
|
export function generateDualSignatureKeyPairs(seed, level = activeLevel) {
|
|
325
326
|
return {
|
|
326
327
|
primary: generateSignatureKeyPair(seed, level),
|
|
327
|
-
backup: generateBackupSignatureKeyPair(level),
|
|
328
|
+
backup: generateBackupSignatureKeyPair(null, level),
|
|
328
329
|
};
|
|
329
330
|
}
|
|
330
331
|
|