open source is social v-it.org
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Convert site from SPA hash routing to path-based static pages

Each page now has its own index.html with proper <title>, meta tags,
active nav highlighting, and shareable URLs. Old hash URLs (/#doctrine
etc.) redirect to the new paths. Markdown remains the content source
of truth via a build step (node build.js).

Pages: /, /start/, /doctrine/, /vocab/, /architecture/

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+1843 -90
+348
build.js
··· 1 + #!/usr/bin/env node 2 + import { readFileSync, writeFileSync, mkdirSync } from 'fs'; 3 + import { join, dirname } from 'path'; 4 + import { fileURLToPath } from 'url'; 5 + import { marked } from 'marked'; 6 + 7 + const __dirname = dirname(fileURLToPath(import.meta.url)); 8 + const docsDir = join(__dirname, 'docs'); 9 + 10 + const pages = [ 11 + { 12 + slug: '', 13 + title: 'vit — open source is social', 14 + description: 'vit is a social network of capabilities — where builders and their agents discover, remix, vet, and ship improvements across a living bazaar of codebases.', 15 + }, 16 + { 17 + slug: 'start', 18 + title: 'get started — vit', 19 + description: 'Get started with vit in 60 seconds. Browse the network, skim capabilities, and ship your first cap.', 20 + md: 'GET-STARTED.md', 21 + }, 22 + { 23 + slug: 'doctrine', 24 + title: 'doctrine — vit', 25 + description: 'The vit doctrine: software should live. A social system for personalized software where the unit of exchange is capability.', 26 + md: 'DOCTRINE.md', 27 + }, 28 + { 29 + slug: 'vocab', 30 + title: 'vocabulary — vit', 31 + description: 'Core terminology for vit: beacons, caps, remixes, provenance, and the CLI verbs that drive the workflow.', 32 + md: 'VOCAB.md', 33 + }, 34 + { 35 + slug: 'architecture', 36 + title: 'architecture — vit', 37 + description: 'Technical architecture of vit: ATProto record types, cap lexicons, and system design.', 38 + md: 'ARCHITECTURE.md', 39 + }, 40 + ]; 41 + 42 + const landingContent = ` 43 + <h2 class="hero">open source is social</h2> 44 + <p>vit is a social network of capabilities — where builders and their agents discover, remix, vet, and ship improvements across a living bazaar of codebases.</p> 45 + <p class="cta-row"> 46 + <a href="/start/">get started in 60 seconds &rarr;</a> 47 + <a href="https://explore.v-it.org">explore the network &rarr;</a> 48 + </p> 49 + <hr> 50 + <section> 51 + <h2>software should live</h2> 52 + <p>vit is a <strong>social system for personalized software</strong> where the unit of exchange is not pull requests, not screenshots, not diffs, not even git.</p> 53 + <p>the unit of exchange is <strong>capability</strong>: structured, attributable, auditable capabilities, published into a network where other builders (and their agents) can <strong>discover it, remix it into their own codebases, vet it locally, vouch for it publicly, and ship new capabilities back into the stream</strong>.</p> 54 + <p>vit is how software becomes <em>organic</em> and <em>yours</em>.</p> 55 + <hr> 56 + <p>most open source codebases today are treated like artifacts: limited maintainers, often abandoned, complicated contribution options.</p> 57 + <p>vit assumes something different:</p> 58 + <p>a codebase is not a distribution artifact. a codebase is a <strong>living organism</strong> that can adapt to each install, and it deserves a living ecosystem.</p> 59 + <p>the future is not &ldquo;one repo, one roadmap.&rdquo; the future is <strong>many codebases</strong>, each personalized, each living, and all sharing capabilities with each other through a social network that rewards provenance and trust.</p> 60 + </section> 61 + <p><a href="/doctrine/">read the full doctrine &rarr;</a></p>`; 62 + 63 + function nav(activeSlug) { 64 + const items = [ 65 + { href: '/', label: 'home', slug: '' }, 66 + { href: '/start/', label: 'start', slug: 'start' }, 67 + { href: 'https://explore.v-it.org', label: 'explore', slug: null }, 68 + { href: '/doctrine/', label: 'doctrine', slug: 'doctrine' }, 69 + { href: '/vocab/', label: 'vocab', slug: 'vocab' }, 70 + { href: '/architecture/', label: 'architecture', slug: 'architecture' }, 71 + { href: 'https://github.com/solpbc/vit', label: 'github', slug: null }, 72 + ]; 73 + return items 74 + .map(({ href, label, slug }) => { 75 + const cls = slug !== null && slug === activeSlug ? ' class="active"' : ''; 76 + return `<a href="${href}"${cls}>${label}</a>`; 77 + }) 78 + .join('\n '); 79 + } 80 + 81 + function template({ title, description, activeSlug, content, hashRedirect }) { 82 + return `<!DOCTYPE html> 83 + <html lang="en"> 84 + <head> 85 + <meta charset="utf-8"> 86 + <meta name="viewport" content="width=device-width, initial-scale=1"> 87 + <title>${title}</title> 88 + <meta name="description" content="${description}"> 89 + <meta property="og:title" content="${title}"> 90 + <meta property="og:description" content="${description}"> 91 + <meta property="og:type" content="website"> 92 + <link rel="icon" type="image/svg+xml" href="/brand/vit-mark.svg"> 93 + <style> 94 + :root { 95 + color-scheme: light; 96 + --vit-green: #06D6A0; 97 + --vit-green-deep: #059669; 98 + } 99 + 100 + body { 101 + margin: 0; 102 + padding: 0; 103 + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; 104 + color: #111827; 105 + background: #ffffff; 106 + line-height: 1.6; 107 + } 108 + 109 + .container { 110 + max-width: 720px; 111 + margin: 0 auto; 112 + padding: 24px 20px 32px; 113 + } 114 + 115 + header h1 { 116 + margin: 0; 117 + font-size: 2rem; 118 + line-height: 1.2; 119 + color: var(--vit-green); 120 + } 121 + 122 + header h1 a { 123 + color: inherit; 124 + text-decoration: none; 125 + cursor: default; 126 + } 127 + 128 + .egg { 129 + opacity: 0; 130 + transition: opacity 200ms ease; 131 + color: #9ca3af; 132 + } 133 + 134 + header h1:hover .egg { 135 + opacity: 1; 136 + } 137 + 138 + header h1.tapped .egg { 139 + opacity: 1; 140 + } 141 + 142 + .tagline { 143 + margin: 6px 0 0; 144 + color: #4b5563; 145 + font-size: 1rem; 146 + } 147 + 148 + .header-bar { 149 + display: flex; 150 + align-items: baseline; 151 + justify-content: space-between; 152 + gap: 16px; 153 + } 154 + 155 + header { 156 + border-bottom: 2px solid var(--vit-green); 157 + padding-bottom: 16px; 158 + margin-bottom: 24px; 159 + } 160 + 161 + nav { 162 + display: flex; 163 + flex-wrap: wrap; 164 + gap: 14px; 165 + } 166 + 167 + nav a { 168 + color: var(--vit-green-deep); 169 + text-decoration: none; 170 + } 171 + 172 + nav a:hover { 173 + text-decoration: underline; 174 + } 175 + 176 + nav a.active { 177 + color: var(--vit-green-deep); 178 + text-decoration: underline; 179 + text-decoration-color: var(--vit-green); 180 + text-underline-offset: 3px; 181 + } 182 + 183 + a { 184 + color: var(--vit-green-deep); 185 + } 186 + 187 + main { 188 + min-height: 240px; 189 + } 190 + 191 + .hero { 192 + font-size: 1.8rem; 193 + margin-top: 0; 194 + margin-bottom: 0.4em; 195 + line-height: 1.2; 196 + } 197 + 198 + .cta-row { 199 + display: flex; 200 + flex-wrap: wrap; 201 + gap: 8px 20px; 202 + } 203 + 204 + .cta-row a { 205 + color: var(--vit-green-deep); 206 + font-weight: 500; 207 + } 208 + 209 + main h1, 210 + main h2, 211 + main h3, 212 + main h4 { 213 + line-height: 1.25; 214 + margin-top: 1.5em; 215 + margin-bottom: 0.6em; 216 + } 217 + 218 + main p, 219 + main ul, 220 + main ol, 221 + main blockquote, 222 + main pre { 223 + margin-top: 0; 224 + margin-bottom: 1em; 225 + } 226 + 227 + pre, 228 + code { 229 + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 230 + } 231 + 232 + pre { 233 + background: #f3f4f6; 234 + padding: 12px; 235 + border-radius: 6px; 236 + overflow-x: auto; 237 + } 238 + 239 + code { 240 + background: #f3f4f6; 241 + padding: 0.1em 0.3em; 242 + border-radius: 4px; 243 + } 244 + 245 + pre code { 246 + background: transparent; 247 + padding: 0; 248 + border-radius: 0; 249 + } 250 + 251 + hr { 252 + border: 0; 253 + border-top: 1px solid var(--vit-green); 254 + margin: 1.5em 0; 255 + } 256 + 257 + footer { 258 + margin-top: 36px; 259 + padding-top: 16px; 260 + border-top: 1px solid #e5e7eb; 261 + font-size: 0.9rem; 262 + color: #6b7280; 263 + } 264 + 265 + footer a { 266 + color: var(--vit-green-deep); 267 + } 268 + 269 + @media (max-width: 480px) { 270 + nav { 271 + gap: 10px; 272 + font-size: 0.9rem; 273 + } 274 + } 275 + </style> 276 + </head> 277 + <body> 278 + <div class="container"> 279 + <header> 280 + <div class="header-bar"> 281 + <h1><a href="/">vit<span class="egg">ality</span></a></h1> 282 + <nav> 283 + ${nav(activeSlug)} 284 + </nav> 285 + </div> 286 + <p class="tagline">open source is social</p> 287 + </header> 288 + 289 + <main> 290 + ${content} 291 + </main> 292 + 293 + <footer> 294 + part of <a href="https://solpbc.org">sol pbc</a>. created by <a href="https://bsky.app/profile/jeremie.com">Jeremie Miller</a>. vit is a trademark of sol pbc. 295 + </footer> 296 + </div> 297 + ${hashRedirect ? ` 298 + <script> 299 + // Redirect old hash URLs to path URLs 300 + (function() { 301 + var hash = location.hash.slice(1); 302 + var map = { 'get-started': '/start/', doctrine: '/doctrine/', vocab: '/vocab/', architecture: '/architecture/' }; 303 + if (map[hash]) location.replace(map[hash]); 304 + })(); 305 + </script> 306 + ` : ''} 307 + <script> 308 + // Easter egg tap toggle 309 + document.querySelector('header h1').addEventListener('touchstart', function(e) { 310 + this.classList.toggle('tapped'); 311 + }); 312 + document.addEventListener('touchstart', function(e) { 313 + var h1 = document.querySelector('header h1'); 314 + if (!h1.contains(e.target)) h1.classList.remove('tapped'); 315 + }); 316 + </script> 317 + </body> 318 + </html>`; 319 + } 320 + 321 + // Build all pages 322 + for (const page of pages) { 323 + let content; 324 + if (page.md) { 325 + const md = readFileSync(join(docsDir, page.md), 'utf8'); 326 + content = marked.parse(md); 327 + } else { 328 + content = landingContent; 329 + } 330 + 331 + const html = template({ 332 + title: page.title, 333 + description: page.description, 334 + activeSlug: page.slug, 335 + content, 336 + hashRedirect: page.slug === '', 337 + }); 338 + 339 + if (page.slug === '') { 340 + writeFileSync(join(docsDir, 'index.html'), html); 341 + } else { 342 + const dir = join(docsDir, page.slug); 343 + mkdirSync(dir, { recursive: true }); 344 + writeFileSync(join(dir, 'index.html'), html); 345 + } 346 + } 347 + 348 + console.log('Built %d pages', pages.length);
+2 -2
docs/GET-STARTED.md
··· 65 65 - **vouch** — stake your reputation on a cap 66 66 - **ship** — publish a capability back to the network 67 67 68 - read the [doctrine](#doctrine) for why it works this way. 68 + read the [doctrine](/doctrine/) for why it works this way. 69 69 70 70 --- 71 71 ··· 73 73 74 74 most open source today is treated like artifacts — limited maintainers, often abandoned. vit assumes something different: a codebase is a **living organism** that deserves a living ecosystem. 75 75 76 - vit is how software becomes social. [read the full story](#doctrine). 76 + vit is how software becomes social. [read the full story](/doctrine/). 77 77 78 78 --- 79 79
+362
docs/architecture/index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>architecture — vit</title> 7 + <meta name="description" content="Technical architecture of vit: ATProto record types, cap lexicons, and system design."> 8 + <meta property="og:title" content="architecture — vit"> 9 + <meta property="og:description" content="Technical architecture of vit: ATProto record types, cap lexicons, and system design."> 10 + <meta property="og:type" content="website"> 11 + <link rel="icon" type="image/svg+xml" href="/brand/vit-mark.svg"> 12 + <style> 13 + :root { 14 + color-scheme: light; 15 + --vit-green: #06D6A0; 16 + --vit-green-deep: #059669; 17 + } 18 + 19 + body { 20 + margin: 0; 21 + padding: 0; 22 + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; 23 + color: #111827; 24 + background: #ffffff; 25 + line-height: 1.6; 26 + } 27 + 28 + .container { 29 + max-width: 720px; 30 + margin: 0 auto; 31 + padding: 24px 20px 32px; 32 + } 33 + 34 + header h1 { 35 + margin: 0; 36 + font-size: 2rem; 37 + line-height: 1.2; 38 + color: var(--vit-green); 39 + } 40 + 41 + header h1 a { 42 + color: inherit; 43 + text-decoration: none; 44 + cursor: default; 45 + } 46 + 47 + .egg { 48 + opacity: 0; 49 + transition: opacity 200ms ease; 50 + color: #9ca3af; 51 + } 52 + 53 + header h1:hover .egg { 54 + opacity: 1; 55 + } 56 + 57 + header h1.tapped .egg { 58 + opacity: 1; 59 + } 60 + 61 + .tagline { 62 + margin: 6px 0 0; 63 + color: #4b5563; 64 + font-size: 1rem; 65 + } 66 + 67 + .header-bar { 68 + display: flex; 69 + align-items: baseline; 70 + justify-content: space-between; 71 + gap: 16px; 72 + } 73 + 74 + header { 75 + border-bottom: 2px solid var(--vit-green); 76 + padding-bottom: 16px; 77 + margin-bottom: 24px; 78 + } 79 + 80 + nav { 81 + display: flex; 82 + flex-wrap: wrap; 83 + gap: 14px; 84 + } 85 + 86 + nav a { 87 + color: var(--vit-green-deep); 88 + text-decoration: none; 89 + } 90 + 91 + nav a:hover { 92 + text-decoration: underline; 93 + } 94 + 95 + nav a.active { 96 + color: var(--vit-green-deep); 97 + text-decoration: underline; 98 + text-decoration-color: var(--vit-green); 99 + text-underline-offset: 3px; 100 + } 101 + 102 + a { 103 + color: var(--vit-green-deep); 104 + } 105 + 106 + main { 107 + min-height: 240px; 108 + } 109 + 110 + .hero { 111 + font-size: 1.8rem; 112 + margin-top: 0; 113 + margin-bottom: 0.4em; 114 + line-height: 1.2; 115 + } 116 + 117 + .cta-row { 118 + display: flex; 119 + flex-wrap: wrap; 120 + gap: 8px 20px; 121 + } 122 + 123 + .cta-row a { 124 + color: var(--vit-green-deep); 125 + font-weight: 500; 126 + } 127 + 128 + main h1, 129 + main h2, 130 + main h3, 131 + main h4 { 132 + line-height: 1.25; 133 + margin-top: 1.5em; 134 + margin-bottom: 0.6em; 135 + } 136 + 137 + main p, 138 + main ul, 139 + main ol, 140 + main blockquote, 141 + main pre { 142 + margin-top: 0; 143 + margin-bottom: 1em; 144 + } 145 + 146 + pre, 147 + code { 148 + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 149 + } 150 + 151 + pre { 152 + background: #f3f4f6; 153 + padding: 12px; 154 + border-radius: 6px; 155 + overflow-x: auto; 156 + } 157 + 158 + code { 159 + background: #f3f4f6; 160 + padding: 0.1em 0.3em; 161 + border-radius: 4px; 162 + } 163 + 164 + pre code { 165 + background: transparent; 166 + padding: 0; 167 + border-radius: 0; 168 + } 169 + 170 + hr { 171 + border: 0; 172 + border-top: 1px solid var(--vit-green); 173 + margin: 1.5em 0; 174 + } 175 + 176 + footer { 177 + margin-top: 36px; 178 + padding-top: 16px; 179 + border-top: 1px solid #e5e7eb; 180 + font-size: 0.9rem; 181 + color: #6b7280; 182 + } 183 + 184 + footer a { 185 + color: var(--vit-green-deep); 186 + } 187 + 188 + @media (max-width: 480px) { 189 + nav { 190 + gap: 10px; 191 + font-size: 0.9rem; 192 + } 193 + } 194 + </style> 195 + </head> 196 + <body> 197 + <div class="container"> 198 + <header> 199 + <div class="header-bar"> 200 + <h1><a href="/">vit<span class="egg">ality</span></a></h1> 201 + <nav> 202 + <a href="/">home</a> 203 + <a href="/start/">start</a> 204 + <a href="https://explore.v-it.org">explore</a> 205 + <a href="/doctrine/">doctrine</a> 206 + <a href="/vocab/">vocab</a> 207 + <a href="/architecture/" class="active">architecture</a> 208 + <a href="https://github.com/solpbc/vit">github</a> 209 + </nav> 210 + </div> 211 + <p class="tagline">open source is social</p> 212 + </header> 213 + 214 + <main> 215 + <h1>architecture</h1> 216 + <h2>record types</h2> 217 + <p>vit uses ATProto records stored in each user&#39;s PDS repository. three record types are used:</p> 218 + <table> 219 + <thead> 220 + <tr> 221 + <th>record type</th> 222 + <th>NSID</th> 223 + <th>custom?</th> 224 + <th>key</th> 225 + <th>purpose</th> 226 + </tr> 227 + </thead> 228 + <tbody><tr> 229 + <td>cap</td> 230 + <td><code>org.v-it.cap</code></td> 231 + <td>yes</td> 232 + <td><code>tid</code></td> 233 + <td>structured change description</td> 234 + </tr> 235 + <tr> 236 + <td>vouch</td> 237 + <td><code>org.v-it.vouch</code></td> 238 + <td>yes</td> 239 + <td><code>tid</code></td> 240 + <td>endorse a cap</td> 241 + </tr> 242 + <tr> 243 + <td>follow</td> 244 + <td><code>app.bsky.graph.follow</code></td> 245 + <td>no (reused)</td> 246 + <td><code>tid</code></td> 247 + <td>subscribe to a handle</td> 248 + </tr> 249 + </tbody></table> 250 + <h3>why caps use a custom NSID</h3> 251 + <p>caps are structurally similar to Bluesky posts (<code>app.bsky.feed.post</code>) but serve a different purpose. using a custom NSID (<code>org.v-it.cap</code>) ensures:</p> 252 + <ul> 253 + <li>caps live in their own collection (<code>org.v-it.cap</code>) and never appear in a user&#39;s Bluesky post feed.</li> 254 + <li>Bluesky AppViews and feed generators ignore cap records (unknown collection).</li> 255 + <li>vit tooling can query caps independently without filtering out posts.</li> 256 + <li>the cap schema can evolve independently of <code>app.bsky.feed.post</code>.</li> 257 + </ul> 258 + <h3>why follows are reused</h3> 259 + <p><code>app.bsky.graph.follow</code> is generic enough to use as-is:</p> 260 + <ul> 261 + <li>a follow&#39;s <code>subject</code> is a DID — it works regardless of what record types the followed account publishes.</li> 262 + <li>reusing the official follow lexicon means follows are visible in Bluesky clients, which is useful for cross-network discoverability.</li> 263 + </ul> 264 + <h2>cap lexicon</h2> 265 + <p>the cap lexicon (<code>lexicons/org/v-it/cap.json</code>) mirrors <code>app.bsky.feed.post</code> with these differences:</p> 266 + <ul> 267 + <li><strong>NSID</strong>: <code>org.v-it.cap</code> instead of <code>app.bsky.feed.post</code>.</li> 268 + <li><strong>deprecated fields removed</strong>: <code>entities</code> and <code>textSlice</code> are not carried over.</li> 269 + <li><strong>self-referencing replies</strong>: <code>reply</code> references <code>org.v-it.cap#replyRef</code>, so cap threads are self-contained.</li> 270 + <li><strong>descriptions updated</strong>: all description strings reference &quot;cap&quot; instead of &quot;post&quot;.</li> 271 + </ul> 272 + <p>fields carried over from <code>app.bsky.feed.post</code> and their cap-context meaning:</p> 273 + <table> 274 + <thead> 275 + <tr> 276 + <th>field</th> 277 + <th>type</th> 278 + <th>cap meaning</th> 279 + </tr> 280 + </thead> 281 + <tbody><tr> 282 + <td><code>text</code></td> 283 + <td>string (max 3000 bytes / 300 graphemes)</td> 284 + <td>primary cap content</td> 285 + </tr> 286 + <tr> 287 + <td><code>facets</code></td> 288 + <td>array of <code>app.bsky.richtext.facet</code></td> 289 + <td>rich text annotations (mentions, URLs, hashtags)</td> 290 + </tr> 291 + <tr> 292 + <td><code>reply</code></td> 293 + <td><code>org.v-it.cap#replyRef</code></td> 294 + <td>thread structure (parent + root refs)</td> 295 + </tr> 296 + <tr> 297 + <td><code>embed</code></td> 298 + <td>union of <code>app.bsky.embed.*</code></td> 299 + <td>attached media, links, or record embeds</td> 300 + </tr> 301 + <tr> 302 + <td><code>langs</code></td> 303 + <td>array of language strings (max 3)</td> 304 + <td>content language hints</td> 305 + </tr> 306 + <tr> 307 + <td><code>labels</code></td> 308 + <td><code>com.atproto.label.defs#selfLabels</code></td> 309 + <td>content warnings</td> 310 + </tr> 311 + <tr> 312 + <td><code>tags</code></td> 313 + <td>array of strings (max 8)</td> 314 + <td>additional hashtags</td> 315 + </tr> 316 + <tr> 317 + <td><code>beacon</code></td> 318 + <td>string (max 512 bytes)</td> 319 + <td>beacon URI scoping this cap to a project</td> 320 + </tr> 321 + <tr> 322 + <td><code>createdAt</code></td> 323 + <td>datetime</td> 324 + <td>client-declared creation timestamp</td> 325 + </tr> 326 + </tbody></table> 327 + <h3>relationship to VOCAB.md</h3> 328 + <p>VOCAB.md defines a cap as a markdown document containing free-form instructions for implementing a change — with sections for intent, scope, risk, implementation guide, and other context. the current lexicon mirrors <code>app.bsky.feed.post</code>, so most cap semantics are encoded in <code>text</code>, <code>tags</code>, threading, and embeds. <code>beacon</code> is a dedicated structured field for project scoping.</p> 329 + <h2>directory layout</h2> 330 + <p>lexicon JSON files follow the NSID-to-path convention:</p> 331 + <pre><code>lexicons/ 332 + org/ 333 + v-it/ 334 + cap.json # org.v-it.cap 335 + vouch.json # org.v-it.vouch 336 + </code></pre> 337 + <p>this mirrors the convention used in the ATProto repository.</p> 338 + <h2>future work</h2> 339 + <ul> 340 + <li>provenance tracking across vet, remix, vouch, and ship lineage.</li> 341 + <li>runtime lexicon validation (currently <code>validate: false</code> in CLI write commands).</li> 342 + </ul> 343 + 344 + </main> 345 + 346 + <footer> 347 + part of <a href="https://solpbc.org">sol pbc</a>. created by <a href="https://bsky.app/profile/jeremie.com">Jeremie Miller</a>. vit is a trademark of sol pbc. 348 + </footer> 349 + </div> 350 + 351 + <script> 352 + // Easter egg tap toggle 353 + document.querySelector('header h1').addEventListener('touchstart', function(e) { 354 + this.classList.toggle('tapped'); 355 + }); 356 + document.addEventListener('touchstart', function(e) { 357 + var h1 = document.querySelector('header h1'); 358 + if (!h1.contains(e.target)) h1.classList.remove('tapped'); 359 + }); 360 + </script> 361 + </body> 362 + </html>
+359
docs/doctrine/index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>doctrine — vit</title> 7 + <meta name="description" content="The vit doctrine: software should live. A social system for personalized software where the unit of exchange is capability."> 8 + <meta property="og:title" content="doctrine — vit"> 9 + <meta property="og:description" content="The vit doctrine: software should live. A social system for personalized software where the unit of exchange is capability."> 10 + <meta property="og:type" content="website"> 11 + <link rel="icon" type="image/svg+xml" href="/brand/vit-mark.svg"> 12 + <style> 13 + :root { 14 + color-scheme: light; 15 + --vit-green: #06D6A0; 16 + --vit-green-deep: #059669; 17 + } 18 + 19 + body { 20 + margin: 0; 21 + padding: 0; 22 + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; 23 + color: #111827; 24 + background: #ffffff; 25 + line-height: 1.6; 26 + } 27 + 28 + .container { 29 + max-width: 720px; 30 + margin: 0 auto; 31 + padding: 24px 20px 32px; 32 + } 33 + 34 + header h1 { 35 + margin: 0; 36 + font-size: 2rem; 37 + line-height: 1.2; 38 + color: var(--vit-green); 39 + } 40 + 41 + header h1 a { 42 + color: inherit; 43 + text-decoration: none; 44 + cursor: default; 45 + } 46 + 47 + .egg { 48 + opacity: 0; 49 + transition: opacity 200ms ease; 50 + color: #9ca3af; 51 + } 52 + 53 + header h1:hover .egg { 54 + opacity: 1; 55 + } 56 + 57 + header h1.tapped .egg { 58 + opacity: 1; 59 + } 60 + 61 + .tagline { 62 + margin: 6px 0 0; 63 + color: #4b5563; 64 + font-size: 1rem; 65 + } 66 + 67 + .header-bar { 68 + display: flex; 69 + align-items: baseline; 70 + justify-content: space-between; 71 + gap: 16px; 72 + } 73 + 74 + header { 75 + border-bottom: 2px solid var(--vit-green); 76 + padding-bottom: 16px; 77 + margin-bottom: 24px; 78 + } 79 + 80 + nav { 81 + display: flex; 82 + flex-wrap: wrap; 83 + gap: 14px; 84 + } 85 + 86 + nav a { 87 + color: var(--vit-green-deep); 88 + text-decoration: none; 89 + } 90 + 91 + nav a:hover { 92 + text-decoration: underline; 93 + } 94 + 95 + nav a.active { 96 + color: var(--vit-green-deep); 97 + text-decoration: underline; 98 + text-decoration-color: var(--vit-green); 99 + text-underline-offset: 3px; 100 + } 101 + 102 + a { 103 + color: var(--vit-green-deep); 104 + } 105 + 106 + main { 107 + min-height: 240px; 108 + } 109 + 110 + .hero { 111 + font-size: 1.8rem; 112 + margin-top: 0; 113 + margin-bottom: 0.4em; 114 + line-height: 1.2; 115 + } 116 + 117 + .cta-row { 118 + display: flex; 119 + flex-wrap: wrap; 120 + gap: 8px 20px; 121 + } 122 + 123 + .cta-row a { 124 + color: var(--vit-green-deep); 125 + font-weight: 500; 126 + } 127 + 128 + main h1, 129 + main h2, 130 + main h3, 131 + main h4 { 132 + line-height: 1.25; 133 + margin-top: 1.5em; 134 + margin-bottom: 0.6em; 135 + } 136 + 137 + main p, 138 + main ul, 139 + main ol, 140 + main blockquote, 141 + main pre { 142 + margin-top: 0; 143 + margin-bottom: 1em; 144 + } 145 + 146 + pre, 147 + code { 148 + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 149 + } 150 + 151 + pre { 152 + background: #f3f4f6; 153 + padding: 12px; 154 + border-radius: 6px; 155 + overflow-x: auto; 156 + } 157 + 158 + code { 159 + background: #f3f4f6; 160 + padding: 0.1em 0.3em; 161 + border-radius: 4px; 162 + } 163 + 164 + pre code { 165 + background: transparent; 166 + padding: 0; 167 + border-radius: 0; 168 + } 169 + 170 + hr { 171 + border: 0; 172 + border-top: 1px solid var(--vit-green); 173 + margin: 1.5em 0; 174 + } 175 + 176 + footer { 177 + margin-top: 36px; 178 + padding-top: 16px; 179 + border-top: 1px solid #e5e7eb; 180 + font-size: 0.9rem; 181 + color: #6b7280; 182 + } 183 + 184 + footer a { 185 + color: var(--vit-green-deep); 186 + } 187 + 188 + @media (max-width: 480px) { 189 + nav { 190 + gap: 10px; 191 + font-size: 0.9rem; 192 + } 193 + } 194 + </style> 195 + </head> 196 + <body> 197 + <div class="container"> 198 + <header> 199 + <div class="header-bar"> 200 + <h1><a href="/">vit<span class="egg">ality</span></a></h1> 201 + <nav> 202 + <a href="/">home</a> 203 + <a href="/start/">start</a> 204 + <a href="https://explore.v-it.org">explore</a> 205 + <a href="/doctrine/" class="active">doctrine</a> 206 + <a href="/vocab/">vocab</a> 207 + <a href="/architecture/">architecture</a> 208 + <a href="https://github.com/solpbc/vit">github</a> 209 + </nav> 210 + </div> 211 + <p class="tagline">open source is social</p> 212 + </header> 213 + 214 + <main> 215 + <h1>vit doctrine</h1> 216 + <p>vit is a <strong>social system for personalized software</strong> where the unit of exchange is not pull requests, not screenshots, not diffs, not even git.</p> 217 + <p>the unit of exchange is <strong>capability</strong>: structured, attributable, auditable capabilities, published into a network where other builders (and their agents) can <strong>discover it, remix it into their own codebases, vet it locally, vouch for it publicly, and ship new capabilities back into the stream</strong>.</p> 218 + <p>vit is how software becomes <em>organic</em> and <em>yours</em>.</p> 219 + <hr> 220 + <h2>software should live</h2> 221 + <p>most open source codebases today are treated like artifacts: limited maintainers, often abandoned, complicated contribution options.</p> 222 + <p>vit assumes something different:</p> 223 + <p>a codebase is not a distribution artifact. 224 + a codebase is a <strong>living organism</strong> that can adapt to each install, and it deserves a living ecosystem.</p> 225 + <p>the future is not “one repo, one roadmap.” 226 + the future is <strong>millions of personalized codebases</strong>—each one evolving continuously, shaped by its caretakers’s needs, values, constraints, and taste.</p> 227 + <p>vit is the mechanism for that future.</p> 228 + <hr> 229 + <h2>the beacon is the anchor, not the gate</h2> 230 + <p>vit is not organized around platforms, organizations, or silos. it’s organized around a <strong>beacon</strong>: a canonical project identity derived from normalized git URLs.</p> 231 + <p>a beacon is not a brand page. 232 + it’s not a permission system. 233 + it’s not a walled garden.</p> 234 + <p>a beacon is a <strong>shared reference point</strong>—a stable anchor that lets a global network coordinate around “this project” without arguing about where it’s hosted or who has the loudest megaphone.</p> 235 + <p>beacons let software ecosystems have <strong>gravity</strong> without centralized control.</p> 236 + <hr> 237 + <h2>caps are not posts. caps are “portable change-intent.”</h2> 238 + <p>vit doesn’t treat updates as code diffs. a cap is not a PR. a cap is a social post of a new capability.</p> 239 + <p>a <strong>cap</strong> is an unstructured markdown post containing instructions on what and how to implement:</p> 240 + <ul> 241 + <li>what it does (intent)</li> 242 + <li>where it applies (scope)</li> 243 + <li>why it matters (context)</li> 244 + <li>how risky it is (risk)</li> 245 + <li>how to integrate it (integration notes)</li> 246 + </ul> 247 + <p>caps are designed to be entirely produced and consumed by <strong>agents</strong> as naturally as by humans. they’re meant to be searched, filtered, scored, simulated, and composed.</p> 248 + <p>vit is a social network where the currency is <strong>capability</strong>.</p> 249 + <hr> 250 + <h2>the workflow is a language</h2> 251 + <p>vit is opinionated because it has to be. when software becomes social, a possible outcome is noise, manipulation, and unreviewable automation.</p> 252 + <p>so vit’s verbs are not decorative—they are guardrails:</p> 253 + <ul> 254 + <li><p><strong>adopt</strong>: create a clean workspace (fork + clone) for personalized use 255 + <em>you don’t start by modifying the sacred repo; you start by making it yours forever more.</em></p> 256 + </li> 257 + <li><p><strong>skim</strong>: browse the living stream of caps from your follows relating to a beacon 258 + <em>attention is compute. skim is how you allocate it.</em></p> 259 + </li> 260 + <li><p><strong>vet</strong>: run local customized sandboxed evaluation 261 + <em>trust is earned by viewing through your unique lens.</em></p> 262 + </li> 263 + <li><p><strong>remix</strong>: mix a cap with your local codebase to create a thorough integration plan 264 + <em>you don’t “apply” blindly; you produce a well researched plan first.</em></p> 265 + </li> 266 + <li><p><strong>vouch</strong>: stake reputation publicly about a cap 267 + <em>endorsement is explicit, accountable, and legible.</em></p> 268 + </li> 269 + <li><p><strong>ship</strong>: publish a new cap (or recap) back into the network 270 + <em>work returns to the commons with provenance intact.</em></p> 271 + </li> 272 + </ul> 273 + <p>this isn’t just a CLI. it’s a discipline: <strong>read → evaluate → derive → endorse → publish</strong>.</p> 274 + <p>vit turns “software maintenance” into a living ecosystem.</p> 275 + <hr> 276 + <h2>provenance is the social graph that matters</h2> 277 + <p>most social graphs connect <em>people</em>.</p> 278 + <p>vit’s most important graph connects <strong>lineage</strong>:</p> 279 + <ul> 280 + <li>which cap inspired which remix</li> 281 + <li>which remix became which shipped recap</li> 282 + <li>which vet supported which vouch</li> 283 + <li>which vitizens consistently deliver high-signal capabilities into a beacon&#39;s ecosystem</li> 284 + </ul> 285 + <p>this is a network of causality, not clout.</p> 286 + <p>in vit, “influence” is not follower count. influence is <strong>downstream impact with traceability</strong>.</p> 287 + <hr> 288 + <h2>a future of personalized codebases</h2> 289 + <p>the promise of vit isn’t “faster open source.” it’s bigger than that. it’s the ability for every person to take ownership of every codebase so that it fits them like a glove.</p> 290 + <p>a personalized codebase doesn’t mean fragmentation. 291 + it means <strong>composition</strong>.</p> 292 + <p>you skim the world’s work. you vet what matters. you remix what fits. you vouch for what’s real. you ship your capabilities back to the world.</p> 293 + <p>over time, your codebase becomes a curated organism:</p> 294 + <ul> 295 + <li>constantly absorbing good mutations</li> 296 + <li>rejecting unsafe ones</li> 297 + <li>evolving on purpose rather than by accident</li> 298 + </ul> 299 + <p>and because vit is social, your preferences don’t isolate you—they <strong>route you to the right stream</strong>.</p> 300 + <p>in that world, “upstream” isn’t a single branch you pray stays stable. 301 + upstream is a <strong>living feed of caps</strong>, and you are an active participant in how it evolves.</p> 302 + <hr> 303 + <h2>the agentic multiplier</h2> 304 + <p>vit assumes agents are not toys. they are collaborators.</p> 305 + <p>agents will:</p> 306 + <ul> 307 + <li>skim more than humans can</li> 308 + <li>run vet pipelines locally and safely</li> 309 + <li>propose remixes with clear plans</li> 310 + <li>summarize tradeoffs</li> 311 + <li>surface contradictions</li> 312 + <li>maintain your personalized codebase as a continuous practice</li> 313 + </ul> 314 + <p>agents can accelerate the loop while maximizing human intent.</p> 315 + <hr> 316 + <h2>no engagement algorithms. no infinite scroll. no performative work.</h2> 317 + <p>vit is not trying to be “the social network for developers.”</p> 318 + <p>vit is trying to be <strong>the substrate for continuously improving software</strong>.</p> 319 + <p>that means:</p> 320 + <ul> 321 + <li>signal over noise</li> 322 + <li>provenance over popularity</li> 323 + <li>local control over remote hype</li> 324 + <li>composability over gatekeeping</li> 325 + </ul> 326 + <p>vit doesn’t need virality. it needs <strong>reliable diffusion of quality work</strong>.</p> 327 + <hr> 328 + <h2>the end state: software that evolves like an ecosystem</h2> 329 + <p>imagine a mature vit world:</p> 330 + <ul> 331 + <li>every beacon has a constant stream of caps—features, fixes, tests, refactors, security hardening, performance wins.</li> 332 + <li>vitizens become <strong>high-signal curators</strong>, not overwhelmed gatekeepers.</li> 333 + <li>everyone has their own <strong>personalized, long-lived codebases</strong> that track the evolution of their ecosystem without being hostage to it.</li> 334 + <li>agents act as scouts and operators, but the system remains auditable and intentional.</li> 335 + </ul> 336 + <p>in that world, software stops being a pile of dependencies you inherit and start fearing.</p> 337 + <p>software becomes what it always should have been:</p> 338 + <p>a living medium—shared, remixable, and continuously getting better—with accountability built into the fabric.</p> 339 + <p>vit is the language for that medium, and it&#39;s all openly built in the atmosphere on top of ATProto.</p> 340 + 341 + </main> 342 + 343 + <footer> 344 + part of <a href="https://solpbc.org">sol pbc</a>. created by <a href="https://bsky.app/profile/jeremie.com">Jeremie Miller</a>. vit is a trademark of sol pbc. 345 + </footer> 346 + </div> 347 + 348 + <script> 349 + // Easter egg tap toggle 350 + document.querySelector('header h1').addEventListener('touchstart', function(e) { 351 + this.classList.toggle('tapped'); 352 + }); 353 + document.addEventListener('touchstart', function(e) { 354 + var h1 = document.querySelector('header h1'); 355 + if (!h1.contains(e.target)) h1.classList.remove('tapped'); 356 + }); 357 + </script> 358 + </body> 359 + </html>
+33 -80
docs/index.html
··· 4 4 <meta charset="utf-8"> 5 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 6 <title>vit — open source is social</title> 7 - <link rel="icon" type="image/svg+xml" href="brand/vit-mark.svg"> 7 + <meta name="description" content="vit is a social network of capabilities — where builders and their agents discover, remix, vet, and ship improvements across a living bazaar of codebases."> 8 + <meta property="og:title" content="vit — open source is social"> 9 + <meta property="og:description" content="vit is a social network of capabilities — where builders and their agents discover, remix, vet, and ship improvements across a living bazaar of codebases."> 10 + <meta property="og:type" content="website"> 11 + <link rel="icon" type="image/svg+xml" href="/brand/vit-mark.svg"> 8 12 <style> 9 13 :root { 10 14 color-scheme: light; ··· 31 35 margin: 0; 32 36 font-size: 2rem; 33 37 line-height: 1.2; 38 + color: var(--vit-green); 39 + } 40 + 41 + header h1 a { 42 + color: inherit; 43 + text-decoration: none; 34 44 cursor: default; 35 - color: var(--vit-green); 36 45 } 37 46 38 47 .egg { ··· 116 125 font-weight: 500; 117 126 } 118 127 119 - #doc-content { 120 - transition: opacity 150ms ease; 121 - } 122 - 123 128 main h1, 124 129 main h2, 125 130 main h3, ··· 192 197 <div class="container"> 193 198 <header> 194 199 <div class="header-bar"> 195 - <h1>vit<span class="egg">ality</span></h1> 200 + <h1><a href="/">vit<span class="egg">ality</span></a></h1> 196 201 <nav> 197 - <a href="#">home</a> 198 - <a href="#get-started">start</a> 202 + <a href="/" class="active">home</a> 203 + <a href="/start/">start</a> 199 204 <a href="https://explore.v-it.org">explore</a> 200 - <a href="#doctrine">doctrine</a> 201 - <a href="#vocab">vocab</a> 202 - <a href="#architecture">architecture</a> 205 + <a href="/doctrine/">doctrine</a> 206 + <a href="/vocab/">vocab</a> 207 + <a href="/architecture/">architecture</a> 203 208 <a href="https://github.com/solpbc/vit">github</a> 204 209 </nav> 205 210 </div> 206 211 <p class="tagline">open source is social</p> 207 212 </header> 208 213 209 - <main id="content"> 210 - <div id="landing"> 214 + <main> 215 + 211 216 <h2 class="hero">open source is social</h2> 212 217 <p>vit is a social network of capabilities — where builders and their agents discover, remix, vet, and ship improvements across a living bazaar of codebases.</p> 213 218 <p class="cta-row"> 214 - <a href="#get-started">get started in 60 seconds &rarr;</a> 219 + <a href="/start/">get started in 60 seconds &rarr;</a> 215 220 <a href="https://explore.v-it.org">explore the network &rarr;</a> 216 221 </p> 217 222 <hr> 218 - <section class="doctrine-excerpt"> 223 + <section> 219 224 <h2>software should live</h2> 220 225 <p>vit is a <strong>social system for personalized software</strong> where the unit of exchange is not pull requests, not screenshots, not diffs, not even git.</p> 221 226 <p>the unit of exchange is <strong>capability</strong>: structured, attributable, auditable capabilities, published into a network where other builders (and their agents) can <strong>discover it, remix it into their own codebases, vet it locally, vouch for it publicly, and ship new capabilities back into the stream</strong>.</p> ··· 226 231 <p>a codebase is not a distribution artifact. a codebase is a <strong>living organism</strong> that can adapt to each install, and it deserves a living ecosystem.</p> 227 232 <p>the future is not &ldquo;one repo, one roadmap.&rdquo; the future is <strong>many codebases</strong>, each personalized, each living, and all sharing capabilities with each other through a social network that rewards provenance and trust.</p> 228 233 </section> 229 - <p><a href="#doctrine">read the full doctrine &rarr;</a></p> 230 - </div> 231 - <div id="doc-content" style="display:none"></div> 234 + <p><a href="/doctrine/">read the full doctrine &rarr;</a></p> 232 235 </main> 233 236 234 237 <footer> ··· 236 239 </footer> 237 240 </div> 238 241 239 - <script src="marked.min.js"></script> 240 242 <script> 241 - const docs = { 242 - 'get-started': 'GET-STARTED.md', 243 - doctrine: 'DOCTRINE.md', 244 - vocab: 'VOCAB.md', 245 - architecture: 'ARCHITECTURE.md' 246 - }; 243 + // Redirect old hash URLs to path URLs 244 + (function() { 245 + var hash = location.hash.slice(1); 246 + var map = { 'get-started': '/start/', doctrine: '/doctrine/', vocab: '/vocab/', architecture: '/architecture/' }; 247 + if (map[hash]) location.replace(map[hash]); 248 + })(); 249 + </script> 247 250 248 - const cache = {}; 249 - 250 - function navigate() { 251 - const hash = location.hash.slice(1); 252 - const landing = document.getElementById('landing'); 253 - const docDiv = document.getElementById('doc-content'); 254 - 255 - // Update active nav link 256 - document.querySelectorAll('nav a').forEach((a) => { 257 - const href = a.getAttribute('href'); 258 - if (href.startsWith('#')) { 259 - a.classList.toggle('active', docs[hash] ? href === '#' + hash : href === '#'); 260 - } else { 261 - a.classList.remove('active'); 262 - } 263 - }); 264 - 265 - if (docs[hash]) { 266 - landing.style.display = 'none'; 267 - docDiv.style.display = ''; 268 - 269 - if (cache[hash]) { 270 - docDiv.innerHTML = cache[hash]; 271 - docDiv.style.opacity = '1'; 272 - } else { 273 - docDiv.style.opacity = '0'; 274 - docDiv.innerHTML = ''; 275 - fetch(docs[hash]) 276 - .then((r) => r.text()) 277 - .then((md) => { 278 - cache[hash] = marked.parse(md); 279 - docDiv.innerHTML = cache[hash]; 280 - docDiv.style.opacity = '1'; 281 - }) 282 - .catch(() => { 283 - docDiv.textContent = 'Failed to load document.'; 284 - docDiv.style.opacity = '1'; 285 - }); 286 - } 287 - } else { 288 - landing.style.display = ''; 289 - docDiv.style.display = 'none'; 290 - } 291 - } 292 - 293 - window.addEventListener('hashchange', navigate); 294 - navigate(); 295 - 251 + <script> 296 252 // Easter egg tap toggle 297 253 document.querySelector('header h1').addEventListener('touchstart', function(e) { 298 254 this.classList.toggle('tapped'); 299 255 }); 300 - 301 256 document.addEventListener('touchstart', function(e) { 302 - const h1 = document.querySelector('header h1'); 303 - if (!h1.contains(e.target)) { 304 - h1.classList.remove('tapped'); 305 - } 257 + var h1 = document.querySelector('header h1'); 258 + if (!h1.contains(e.target)) h1.classList.remove('tapped'); 306 259 }); 307 260 </script> 308 261 </body> 309 - </html> 262 + </html>
-8
docs/marked.min.js
··· 1 - /** 2 - * Minified by jsDelivr using Terser v5.39.0. 3 - * Original file: /npm/marked@17.0.2/lib/marked.umd.js 4 - * 5 - * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files 6 - */ 7 - !function(e,t){"object"==typeof exports&&typeof module<"u"?module.exports=t():"function"==typeof define&&define.amd?define("marked",t):e.marked=t()}(typeof globalThis<"u"?globalThis:typeof self<"u"?self:this,(function(){var e,t={},n=t,r={exports:t},s=Object.defineProperty,l=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.prototype.hasOwnProperty,o={};function c(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}((e,t)=>{for(var n in t)s(e,n,{get:t[n],enumerable:!0})})(o,{Hooks:()=>Re,Lexer:()=>me,Marked:()=>Te,Parser:()=>Se,Renderer:()=>ye,TextRenderer:()=>$e,Tokenizer:()=>we,defaults:()=>h,getDefaults:()=>c,lexer:()=>Ee,marked:()=>Ae,options:()=>_e,parse:()=>Ce,parseInline:()=>Be,parser:()=>qe,setOptions:()=>Pe,use:()=>Ie,walkTokens:()=>Le}),r.exports=(e=o,((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let o of i(t))!a.call(e,o)&&o!==n&&s(e,o,{get:()=>t[o],enumerable:!(r=l(t,o))||r.enumerable});return e})(s({},"__esModule",{value:!0}),e));var h={async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null};function p(e){h=e}var u={exec:()=>null};function g(e,t=""){let n="string"==typeof e?e:e.source,r={replace:(e,t)=>{let s="string"==typeof t?t:t.source;return s=s.replace(d.caret,"$1"),n=n.replace(e,s),r},getRegex:()=>new RegExp(n,t)};return r}var k=(()=>{try{return!!new RegExp("(?<=1)(?<!1)")}catch{return!1}})(),d={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>new RegExp(`^( {0,3}${e})((?:[\t ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`),hrRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}#`),htmlBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}<(?:[a-z].*>|!--)`,"i"),blockquoteBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}>`)},f=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,x=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,b=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,w=g(b).replace(/bull/g,x).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),m=g(b).replace(/bull/g,x).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),y=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,$=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,S=g(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",$).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),R=g(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,x).getRegex(),T="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",z=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,A=g("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$))","i").replace("comment",z).replace("tag",T).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),_=g(y).replace("hr",f).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",T).getRegex(),P={blockquote:g(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",_).getRegex(),code:/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,def:S,fences:/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,hr:f,html:A,lheading:w,list:R,newline:/^(?:[ \t]*(?:\n|$))+/,paragraph:_,table:u,text:/^[^\n]+/},I=g("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",f).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3}\t)[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",T).getRegex(),L={...P,lheading:m,table:I,paragraph:g(y).replace("hr",f).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",I).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",T).getRegex()},B={...P,html:g("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",z).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:u,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:g(y).replace("hr",f).replace("heading"," *#{1,6} *[^\n]").replace("lheading",w).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},C=/^( {2,}|\\)\n(?!\s*$)/,q=/[\p{P}\p{S}]/u,E=/[\s\p{P}\p{S}]/u,v=/[^\s\p{P}\p{S}]/u,Z=g(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,E).getRegex(),D=/(?!~)[\p{P}\p{S}]/u,M=/(?![*_])[\p{P}\p{S}]/u,O=g(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",k?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),j=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,Q=g(j,"u").replace(/punct/g,q).getRegex(),H=g(j,"u").replace(/punct/g,D).getRegex(),N="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",G=g(N,"gu").replace(/notPunctSpace/g,v).replace(/punctSpace/g,E).replace(/punct/g,q).getRegex(),X=g(N,"gu").replace(/notPunctSpace/g,/(?:[^\s\p{P}\p{S}]|~)/u).replace(/punctSpace/g,/(?!~)[\s\p{P}\p{S}]/u).replace(/punct/g,D).getRegex(),F=g("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,v).replace(/punctSpace/g,E).replace(/punct/g,q).getRegex(),W=g(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,M).getRegex(),U=g("^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)","gu").replace(/notPunctSpace/g,/(?:[^\s\p{P}\p{S}]|[*_])/u).replace(/punctSpace/g,/(?![*_])[\s\p{P}\p{S}]/u).replace(/punct/g,M).getRegex(),J=g(/\\(punct)/,"gu").replace(/punct/g,q).getRegex(),K=g(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),V=g(z).replace("(?:--\x3e|$)","--\x3e").getRegex(),Y=g("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",V).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),ee=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,te=g(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",ee).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),ne=g(/^!?\[(label)\]\[(ref)\]/).replace("label",ee).replace("ref",$).getRegex(),re=g(/^!?\[(ref)\](?:\[\])?/).replace("ref",$).getRegex(),se=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,le={_backpedal:u,anyPunctuation:J,autolink:K,blockSkip:O,br:C,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,del:u,delLDelim:u,delRDelim:u,emStrongLDelim:Q,emStrongRDelimAst:G,emStrongRDelimUnd:F,escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,link:te,nolink:re,punctuation:Z,reflink:ne,reflinkSearch:g("reflink|nolink(?!\\()","g").replace("reflink",ne).replace("nolink",re).getRegex(),tag:Y,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,url:u},ie={...le,link:g(/^!?\[(label)\]\((.*?)\)/).replace("label",ee).getRegex(),reflink:g(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",ee).getRegex()},ae={...le,emStrongRDelimAst:X,emStrongLDelim:H,delLDelim:W,delRDelim:U,url:g(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",se).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:g(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol",se).getRegex()},oe={...ae,br:g(C).replace("{2,}","*").getRegex(),text:g(ae.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},ce={normal:P,gfm:L,pedantic:B},he={normal:le,gfm:ae,breaks:oe,pedantic:ie},pe={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},ue=e=>pe[e];function ge(e,t){if(t){if(d.escapeTest.test(e))return e.replace(d.escapeReplace,ue)}else if(d.escapeTestNoEncode.test(e))return e.replace(d.escapeReplaceNoEncode,ue);return e}function ke(e){try{e=encodeURI(e).replace(d.percentDecode,"%")}catch{return null}return e}function de(e,t){let n=e.replace(d.findPipe,((e,t,n)=>{let r=!1,s=t;for(;--s>=0&&"\\"===n[s];)r=!r;return r?"|":" |"})).split(d.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),t)if(n.length>t)n.splice(t);else for(;n.length<t;)n.push("");for(;r<n.length;r++)n[r]=n[r].trim().replace(d.slashPipe,"|");return n}function fe(e,t,n){let r=e.length;if(0===r)return"";let s=0;for(;s<r;){let l=e.charAt(r-s-1);if(l!==t||n){if(l===t||!n)break;s++}else s++}return e.slice(0,r-s)}function xe(e,t=0){let n=t,r="";for(let t of e)if("\t"===t){let e=4-n%4;r+=" ".repeat(e),n+=e}else r+=t,n++;return r}function be(e,t,n,r,s){let l=t.href,i=t.title||null,a=e[1].replace(s.other.outputLinkReplace,"$1");r.state.inLink=!0;let o={type:"!"===e[0].charAt(0)?"image":"link",raw:n,href:l,title:i,text:a,tokens:r.inlineTokens(a)};return r.state.inLink=!1,o}var we=class{options;rules;lexer;constructor(e){this.options=e||h}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let e=t[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?e:fe(e,"\n")}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let e=t[0],n=function(e,t,n){let r=e.match(n.other.indentCodeCompensation);if(null===r)return t;let s=r[1];return t.split("\n").map((e=>{let t=e.match(n.other.beginningSpace);if(null===t)return e;let[r]=t;return r.length>=s.length?e.slice(s.length):e})).join("\n")}(e,t[3]||"",this.rules);return{type:"code",raw:e,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:n}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let e=t[2].trim();if(this.rules.other.endingHash.test(e)){let t=fe(e,"#");(this.options.pedantic||!t||this.rules.other.endingSpaceChar.test(t))&&(e=t.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:e,tokens:this.lexer.inline(e)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:fe(t[0],"\n")}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let e=fe(t[0],"\n").split("\n"),n="",r="",s=[];for(;e.length>0;){let t,l=!1,i=[];for(t=0;t<e.length;t++)if(this.rules.other.blockquoteStart.test(e[t]))i.push(e[t]),l=!0;else{if(l)break;i.push(e[t])}e=e.slice(t);let a=i.join("\n"),o=a.replace(this.rules.other.blockquoteSetextReplace,"\n $1").replace(this.rules.other.blockquoteSetextReplace2,"");n=n?`${n}\n${a}`:a,r=r?`${r}\n${o}`:o;let c=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(o,s,!0),this.lexer.state.top=c,0===e.length)break;let h=s.at(-1);if("code"===h?.type)break;if("blockquote"===h?.type){let t=h,l=t.raw+"\n"+e.join("\n"),i=this.blockquote(l);s[s.length-1]=i,n=n.substring(0,n.length-t.raw.length)+i.raw,r=r.substring(0,r.length-t.text.length)+i.text;break}if("list"!==h?.type);else{let t=h,l=t.raw+"\n"+e.join("\n"),i=this.list(l);s[s.length-1]=i,n=n.substring(0,n.length-h.raw.length)+i.raw,r=r.substring(0,r.length-t.raw.length)+i.raw,e=l.substring(s.at(-1).raw.length).split("\n")}}return{type:"blockquote",raw:n,tokens:s,text:r}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),r=n.length>1,s={type:"list",raw:"",ordered:r,start:r?+n.slice(0,-1):"",loose:!1,items:[]};n=r?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=r?n:"[*+-]");let l=this.rules.other.listItemRegex(n),i=!1;for(;e;){let n=!1,r="",a="";if(!(t=l.exec(e))||this.rules.block.hr.test(e))break;r=t[0],e=e.substring(r.length);let o=xe(t[2].split("\n",1)[0],t[1].length),c=e.split("\n",1)[0],h=!o.trim(),p=0;if(this.options.pedantic?(p=2,a=o.trimStart()):h?p=t[1].length+1:(p=o.search(this.rules.other.nonSpaceChar),p=p>4?1:p,a=o.slice(p),p+=t[1].length),h&&this.rules.other.blankLine.test(c)&&(r+=c+"\n",e=e.substring(c.length+1),n=!0),!n){let t=this.rules.other.nextBulletRegex(p),n=this.rules.other.hrRegex(p),s=this.rules.other.fencesBeginRegex(p),l=this.rules.other.headingBeginRegex(p),i=this.rules.other.htmlBeginRegex(p),u=this.rules.other.blockquoteBeginRegex(p);for(;e;){let g,k=e.split("\n",1)[0];if(c=k,this.options.pedantic?(c=c.replace(this.rules.other.listReplaceNesting," "),g=c):g=c.replace(this.rules.other.tabCharGlobal," "),s.test(c)||l.test(c)||i.test(c)||u.test(c)||t.test(c)||n.test(c))break;if(g.search(this.rules.other.nonSpaceChar)>=p||!c.trim())a+="\n"+g.slice(p);else{if(h||o.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||s.test(o)||l.test(o)||n.test(o))break;a+="\n"+c}h=!c.trim(),r+=k+"\n",e=e.substring(k.length+1),o=g.slice(p)}}s.loose||(i?s.loose=!0:this.rules.other.doubleBlankLine.test(r)&&(i=!0)),s.items.push({type:"list_item",raw:r,task:!!this.options.gfm&&this.rules.other.listIsTask.test(a),loose:!1,text:a,tokens:[]}),s.raw+=r}let a=s.items.at(-1);if(!a)return;a.raw=a.raw.trimEnd(),a.text=a.text.trimEnd(),s.raw=s.raw.trimEnd();for(let e of s.items){if(this.lexer.state.top=!1,e.tokens=this.lexer.blockTokens(e.text,[]),e.task){if(e.text=e.text.replace(this.rules.other.listReplaceTask,""),"text"===e.tokens[0]?.type||"paragraph"===e.tokens[0]?.type){e.tokens[0].raw=e.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),e.tokens[0].text=e.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let e=this.lexer.inlineQueue.length-1;e>=0;e--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[e].src)){this.lexer.inlineQueue[e].src=this.lexer.inlineQueue[e].src.replace(this.rules.other.listReplaceTask,"");break}}let t=this.rules.other.listTaskCheckbox.exec(e.raw);if(t){let n={type:"checkbox",raw:t[0]+" ",checked:"[ ]"!==t[0]};e.checked=n.checked,s.loose?e.tokens[0]&&["paragraph","text"].includes(e.tokens[0].type)&&"tokens"in e.tokens[0]&&e.tokens[0].tokens?(e.tokens[0].raw=n.raw+e.tokens[0].raw,e.tokens[0].text=n.raw+e.tokens[0].text,e.tokens[0].tokens.unshift(n)):e.tokens.unshift({type:"paragraph",raw:n.raw,text:n.raw,tokens:[n]}):e.tokens.unshift(n)}}if(!s.loose){let t=e.tokens.filter((e=>"space"===e.type)),n=t.length>0&&t.some((e=>this.rules.other.anyLine.test(e.raw)));s.loose=n}}if(s.loose)for(let e of s.items){e.loose=!0;for(let t of e.tokens)"text"===t.type&&(t.type="paragraph")}return s}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:"html",block:!0,raw:t[0],pre:"pre"===t[1]||"script"===t[1]||"style"===t[1],text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let e=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),n=t[2]?t[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",r=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:e,raw:t[0],href:n,title:r}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=de(t[1]),r=t[2].replace(this.rules.other.tableAlignChars,"").split("|"),s=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,"").split("\n"):[],l={type:"table",raw:t[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let e of r)this.rules.other.tableAlignRight.test(e)?l.align.push("right"):this.rules.other.tableAlignCenter.test(e)?l.align.push("center"):this.rules.other.tableAlignLeft.test(e)?l.align.push("left"):l.align.push(null);for(let e=0;e<n.length;e++)l.header.push({text:n[e],tokens:this.lexer.inline(n[e]),header:!0,align:l.align[e]});for(let e of s)l.rows.push(de(e,l.header.length).map(((e,t)=>({text:e,tokens:this.lexer.inline(e),header:!1,align:l.align[t]}))));return l}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:"="===t[2].charAt(0)?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let e="\n"===t[1].charAt(t[1].length-1)?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:e,tokens:this.lexer.inline(e)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let e=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(e)){if(!this.rules.other.endAngleBracket.test(e))return;let t=fe(e.slice(0,-1),"\\");if((e.length-t.length)%2==0)return}else{let e=function(e,t){if(-1===e.indexOf(t[1]))return-1;let n=0;for(let r=0;r<e.length;r++)if("\\"===e[r])r++;else if(e[r]===t[0])n++;else if(e[r]===t[1]&&(n--,n<0))return r;return n>0?-2:-1}(t[2],"()");if(-2===e)return;if(e>-1){let n=(0===t[0].indexOf("!")?5:4)+t[1].length+e;t[2]=t[2].substring(0,e),t[0]=t[0].substring(0,n).trim(),t[3]=""}}let n=t[2],r="";if(this.options.pedantic){let e=this.rules.other.pedanticHrefTitle.exec(n);e&&(n=e[1],r=e[3])}else r=t[3]?t[3].slice(1,-1):"";return n=n.trim(),this.rules.other.startAngleBracket.test(n)&&(n=this.options.pedantic&&!this.rules.other.endAngleBracket.test(e)?n.slice(1):n.slice(1,-1)),be(t,{href:n&&n.replace(this.rules.inline.anyPunctuation,"$1"),title:r&&r.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let e=t[(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," ").toLowerCase()];if(!e){let e=n[0].charAt(0);return{type:"text",raw:e,text:e}}return be(n,e,n[0],this.lexer,this.rules)}}emStrong(e,t,n=""){let r=this.rules.inline.emStrongLDelim.exec(e);if(!(!r||r[3]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!r[1]&&!r[2]||!n||this.rules.inline.punctuation.exec(n))){let n,s,l=[...r[0]].length-1,i=l,a=0,o="*"===r[0][0]?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(o.lastIndex=0,t=t.slice(-1*e.length+l);null!=(r=o.exec(t));){if(n=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!n)continue;if(s=[...n].length,r[3]||r[4]){i+=s;continue}if((r[5]||r[6])&&l%3&&!((l+s)%3)){a+=s;continue}if(i-=s,i>0)continue;s=Math.min(s,s+i+a);let t=[...r[0]][0].length,o=e.slice(0,l+r.index+t+s);if(Math.min(l,s)%2){let e=o.slice(1,-1);return{type:"em",raw:o,text:e,tokens:this.lexer.inlineTokens(e)}}let c=o.slice(2,-2);return{type:"strong",raw:o,text:c,tokens:this.lexer.inlineTokens(c)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let e=t[2].replace(this.rules.other.newLineCharGlobal," "),n=this.rules.other.nonSpaceChar.test(e),r=this.rules.other.startingSpaceChar.test(e)&&this.rules.other.endingSpaceChar.test(e);return n&&r&&(e=e.substring(1,e.length-1)),{type:"codespan",raw:t[0],text:e}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e,t,n=""){let r=this.rules.inline.delLDelim.exec(e);if(r&&(!r[1]||!n||this.rules.inline.punctuation.exec(n))){let n,s,l=[...r[0]].length-1,i=l,a=this.rules.inline.delRDelim;for(a.lastIndex=0,t=t.slice(-1*e.length+l);null!=(r=a.exec(t));){if(n=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!n||(s=[...n].length,s!==l))continue;if(r[3]||r[4]){i+=s;continue}if(i-=s,i>0)continue;s=Math.min(s,s+i);let t=[...r[0]][0].length,a=e.slice(0,l+r.index+t+s),o=a.slice(l,-l);return{type:"del",raw:a,text:o,tokens:this.lexer.inlineTokens(o)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let e,n;return"@"===t[2]?(e=t[1],n="mailto:"+e):(e=t[1],n=e),{type:"link",raw:t[0],text:e,href:n,tokens:[{type:"text",raw:e,text:e}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let e,n;if("@"===t[2])e=t[0],n="mailto:"+e;else{let r;do{r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??""}while(r!==t[0]);e=t[0],n="www."===t[1]?"http://"+t[0]:t[0]}return{type:"link",raw:t[0],text:e,href:n,tokens:[{type:"text",raw:e,text:e}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let e=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:e}}}},me=class e{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||h,this.options.tokenizer=this.options.tokenizer||new we,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:d,block:ce.normal,inline:he.normal};this.options.pedantic?(t.block=ce.pedantic,t.inline=he.pedantic):this.options.gfm&&(t.block=ce.gfm,this.options.breaks?t.inline=he.breaks:t.inline=he.gfm),this.tokenizer.rules=t}static get rules(){return{block:ce,inline:he}}static lex(t,n){return new e(n).lex(t)}static lexInline(t,n){return new e(n).inlineTokens(t)}lex(e){e=e.replace(d.carriageReturn,"\n"),this.blockTokens(e,this.tokens);for(let e=0;e<this.inlineQueue.length;e++){let t=this.inlineQueue[e];this.inlineTokens(t.src,t.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){for(this.options.pedantic&&(e=e.replace(d.tabCharGlobal," ").replace(d.spaceLine,""));e;){let r;if(this.options.extensions?.block?.some((n=>!!(r=n.call({lexer:this},e,t))&&(e=e.substring(r.raw.length),t.push(r),!0))))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let n=t.at(-1);1===r.raw.length&&void 0!==n?n.raw+="\n":t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let n=t.at(-1);"paragraph"===n?.type||"text"===n?.type?(n.raw+=(n.raw.endsWith("\n")?"":"\n")+r.raw,n.text+="\n"+r.text,this.inlineQueue.at(-1).src=n.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let n=t.at(-1);"paragraph"===n?.type||"text"===n?.type?(n.raw+=(n.raw.endsWith("\n")?"":"\n")+r.raw,n.text+="\n"+r.raw,this.inlineQueue.at(-1).src=n.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let s=e;if(this.options.extensions?.startBlock){let t,n=1/0,r=e.slice(1);this.options.extensions.startBlock.forEach((e=>{t=e.call({lexer:this},r),"number"==typeof t&&t>=0&&(n=Math.min(n,t))})),n<1/0&&n>=0&&(s=e.substring(0,n+1))}if(this.state.top&&(r=this.tokenizer.paragraph(s))){let l=t.at(-1);n&&"paragraph"===l?.type?(l.raw+=(l.raw.endsWith("\n")?"":"\n")+r.raw,l.text+="\n"+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):t.push(r),n=s.length!==e.length,e=e.substring(r.raw.length)}else if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let n=t.at(-1);"text"===n?.type?(n.raw+=(n.raw.endsWith("\n")?"":"\n")+r.raw,n.text+="\n"+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=n.text):t.push(r)}else if(e){let t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n,r=e,s=null;if(this.tokens.links){let e=Object.keys(this.tokens.links);if(e.length>0)for(;null!=(s=this.tokenizer.rules.inline.reflinkSearch.exec(r));)e.includes(s[0].slice(s[0].lastIndexOf("[")+1,-1))&&(r=r.slice(0,s.index)+"["+"a".repeat(s[0].length-2)+"]"+r.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(s=this.tokenizer.rules.inline.anyPunctuation.exec(r));)r=r.slice(0,s.index)+"++"+r.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;null!=(s=this.tokenizer.rules.inline.blockSkip.exec(r));)n=s[2]?s[2].length:0,r=r.slice(0,s.index+n)+"["+"a".repeat(s[0].length-n-2)+"]"+r.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);r=this.options.hooks?.emStrongMask?.call({lexer:this},r)??r;let l=!1,i="";for(;e;){let n;if(l||(i=""),l=!1,this.options.extensions?.inline?.some((r=>!!(n=r.call({lexer:this},e,t))&&(e=e.substring(n.raw.length),t.push(n),!0))))continue;if(n=this.tokenizer.escape(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.tag(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.link(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(n.raw.length);let r=t.at(-1);"text"===n.type&&"text"===r?.type?(r.raw+=n.raw,r.text+=n.text):t.push(n);continue}if(n=this.tokenizer.emStrong(e,r,i)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.codespan(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.br(e)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.del(e,r,i)){e=e.substring(n.raw.length),t.push(n);continue}if(n=this.tokenizer.autolink(e)){e=e.substring(n.raw.length),t.push(n);continue}if(!this.state.inLink&&(n=this.tokenizer.url(e))){e=e.substring(n.raw.length),t.push(n);continue}let s=e;if(this.options.extensions?.startInline){let t,n=1/0,r=e.slice(1);this.options.extensions.startInline.forEach((e=>{t=e.call({lexer:this},r),"number"==typeof t&&t>=0&&(n=Math.min(n,t))})),n<1/0&&n>=0&&(s=e.substring(0,n+1))}if(n=this.tokenizer.inlineText(s)){e=e.substring(n.raw.length),"_"!==n.raw.slice(-1)&&(i=n.raw.slice(-1)),l=!0;let r=t.at(-1);"text"===r?.type?(r.raw+=n.raw,r.text+=n.text):t.push(n)}else if(e){let t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}return t}},ye=class{options;parser;constructor(e){this.options=e||h}space(e){return""}code({text:e,lang:t,escaped:n}){let r=(t||"").match(d.notSpaceStart)?.[0],s=e.replace(d.endingNewline,"")+"\n";return r?'<pre><code class="language-'+ge(r)+'">'+(n?s:ge(s,!0))+"</code></pre>\n":"<pre><code>"+(n?s:ge(s,!0))+"</code></pre>\n"}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return""}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return"<hr>\n"}list(e){let t=e.ordered,n=e.start,r="";for(let t=0;t<e.items.length;t++){let n=e.items[t];r+=this.listitem(n)}let s=t?"ol":"ul";return"<"+s+(t&&1!==n?' start="'+n+'"':"")+">\n"+r+"</"+s+">\n"}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>\n`}checkbox({checked:e}){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}table(e){let t="",n="";for(let t=0;t<e.header.length;t++)n+=this.tablecell(e.header[t]);t+=this.tablerow({text:n});let r="";for(let t=0;t<e.rows.length;t++){let s=e.rows[t];n="";for(let e=0;e<s.length;e++)n+=this.tablecell(s[e]);r+=this.tablerow({text:n})}return r&&(r=`<tbody>${r}</tbody>`),"<table>\n<thead>\n"+t+"</thead>\n"+r+"</table>\n"}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>\n`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${ge(e,!0)}</code>`}br(e){return"<br>"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let r=this.parser.parseInline(n),s=ke(e);if(null===s)return r;let l='<a href="'+(e=s)+'"';return t&&(l+=' title="'+ge(t)+'"'),l+=">"+r+"</a>",l}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let s=ke(e);if(null===s)return ge(n);let l=`<img src="${e=s}" alt="${n}"`;return t&&(l+=` title="${ge(t)}"`),l+=">",l}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:ge(e.text)}},$e=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return""+e}image({text:e}){return""+e}br(){return""}checkbox({raw:e}){return e}},Se=class e{options;renderer;textRenderer;constructor(e){this.options=e||h,this.options.renderer=this.options.renderer||new ye,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new $e}static parse(t,n){return new e(n).parse(t)}static parseInline(t,n){return new e(n).parseInline(t)}parse(e){let t="";for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let e=r,n=this.options.extensions.renderers[e.type].call({parser:this},e);if(!1!==n||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(e.type)){t+=n||"";continue}}let s=r;switch(s.type){case"space":t+=this.renderer.space(s);break;case"hr":t+=this.renderer.hr(s);break;case"heading":t+=this.renderer.heading(s);break;case"code":t+=this.renderer.code(s);break;case"table":t+=this.renderer.table(s);break;case"blockquote":t+=this.renderer.blockquote(s);break;case"list":t+=this.renderer.list(s);break;case"checkbox":t+=this.renderer.checkbox(s);break;case"html":t+=this.renderer.html(s);break;case"def":t+=this.renderer.def(s);break;case"paragraph":t+=this.renderer.paragraph(s);break;case"text":t+=this.renderer.text(s);break;default:{let e='Token with "'+s.type+'" type was not found.';if(this.options.silent)return console.error(e),"";throw new Error(e)}}}return t}parseInline(e,t=this.renderer){let n="";for(let r=0;r<e.length;r++){let s=e[r];if(this.options.extensions?.renderers?.[s.type]){let e=this.options.extensions.renderers[s.type].call({parser:this},s);if(!1!==e||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(s.type)){n+=e||"";continue}}let l=s;switch(l.type){case"escape":case"text":n+=t.text(l);break;case"html":n+=t.html(l);break;case"link":n+=t.link(l);break;case"image":n+=t.image(l);break;case"checkbox":n+=t.checkbox(l);break;case"strong":n+=t.strong(l);break;case"em":n+=t.em(l);break;case"codespan":n+=t.codespan(l);break;case"br":n+=t.br(l);break;case"del":n+=t.del(l);break;default:{let e='Token with "'+l.type+'" type was not found.';if(this.options.silent)return console.error(e),"";throw new Error(e)}}}return n}},Re=class{options;block;constructor(e){this.options=e||h}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(){return this.block?me.lex:me.lexInline}provideParser(){return this.block?Se.parse:Se.parseInline}},Te=class{defaults={async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null};options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=Se;Renderer=ye;TextRenderer=$e;Lexer=me;Tokenizer=we;Hooks=Re;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case"table":{let e=r;for(let r of e.header)n=n.concat(this.walkTokens(r.tokens,t));for(let r of e.rows)for(let e of r)n=n.concat(this.walkTokens(e.tokens,t));break}case"list":{let e=r;n=n.concat(this.walkTokens(e.items,t));break}default:{let e=r;this.defaults.extensions?.childTokens?.[e.type]?this.defaults.extensions.childTokens[e.type].forEach((r=>{let s=e[r].flat(1/0);n=n.concat(this.walkTokens(s,t))})):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach((e=>{let n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach((e=>{if(!e.name)throw new Error("extension name required");if("renderer"in e){let n=t.renderers[e.name];t.renderers[e.name]=n?function(...t){let r=e.renderer.apply(this,t);return!1===r&&(r=n.apply(this,t)),r}:e.renderer}if("tokenizer"in e){if(!e.level||"block"!==e.level&&"inline"!==e.level)throw new Error("extension level must be 'block' or 'inline'");let n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&("block"===e.level?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:"inline"===e.level&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}"childTokens"in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)})),n.extensions=t),e.renderer){let t=this.defaults.renderer||new ye(this.defaults);for(let n in e.renderer){if(!(n in t))throw new Error(`renderer '${n}' does not exist`);if(["options","parser"].includes(n))continue;let r=n,s=e.renderer[r],l=t[r];t[r]=(...e)=>{let n=s.apply(t,e);return!1===n&&(n=l.apply(t,e)),n||""}}n.renderer=t}if(e.tokenizer){let t=this.defaults.tokenizer||new we(this.defaults);for(let n in e.tokenizer){if(!(n in t))throw new Error(`tokenizer '${n}' does not exist`);if(["options","rules","lexer"].includes(n))continue;let r=n,s=e.tokenizer[r],l=t[r];t[r]=(...e)=>{let n=s.apply(t,e);return!1===n&&(n=l.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){let t=this.defaults.hooks||new Re;for(let n in e.hooks){if(!(n in t))throw new Error(`hook '${n}' does not exist`);if(["options","block"].includes(n))continue;let r=n,s=e.hooks[r],l=t[r];Re.passThroughHooks.has(n)?t[r]=e=>{if(this.defaults.async&&Re.passThroughHooksRespectAsync.has(n))return(async()=>{let n=await s.call(t,e);return l.call(t,n)})();let r=s.call(t,e);return l.call(t,r)}:t[r]=(...e)=>{if(this.defaults.async)return(async()=>{let n=await s.apply(t,e);return!1===n&&(n=await l.apply(t,e)),n})();let n=s.apply(t,e);return!1===n&&(n=l.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){let t=this.defaults.walkTokens,r=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(r.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}})),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return me.lex(e,t??this.defaults)}parser(e,t){return Se.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let r={...n},s={...this.defaults,...r},l=this.onError(!!s.silent,!!s.async);if(!0===this.defaults.async&&!1===r.async)return l(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof t>"u"||null===t)return l(new Error("marked(): input parameter is undefined or null"));if("string"!=typeof t)return l(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(t)+", string expected"));if(s.hooks&&(s.hooks.options=s,s.hooks.block=e),s.async)return(async()=>{let n=s.hooks?await s.hooks.preprocess(t):t,r=await(s.hooks?await s.hooks.provideLexer():e?me.lex:me.lexInline)(n,s),l=s.hooks?await s.hooks.processAllTokens(r):r;s.walkTokens&&await Promise.all(this.walkTokens(l,s.walkTokens));let i=await(s.hooks?await s.hooks.provideParser():e?Se.parse:Se.parseInline)(l,s);return s.hooks?await s.hooks.postprocess(i):i})().catch(l);try{s.hooks&&(t=s.hooks.preprocess(t));let n=(s.hooks?s.hooks.provideLexer():e?me.lex:me.lexInline)(t,s);s.hooks&&(n=s.hooks.processAllTokens(n)),s.walkTokens&&this.walkTokens(n,s.walkTokens);let r=(s.hooks?s.hooks.provideParser():e?Se.parse:Se.parseInline)(n,s);return s.hooks&&(r=s.hooks.postprocess(r)),r}catch(e){return l(e)}}}onError(e,t){return n=>{if(n.message+="\nPlease report this to https://github.com/markedjs/marked.",e){let e="<p>An error occurred:</p><pre>"+ge(n.message+"",!0)+"</pre>";return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}},ze=new Te;function Ae(e,t){return ze.parse(e,t)}Ae.options=Ae.setOptions=function(e){return ze.setOptions(e),Ae.defaults=ze.defaults,p(Ae.defaults),Ae},Ae.getDefaults=c,Ae.defaults=h,Ae.use=function(...e){return ze.use(...e),Ae.defaults=ze.defaults,p(Ae.defaults),Ae},Ae.walkTokens=function(e,t){return ze.walkTokens(e,t)},Ae.parseInline=ze.parseInline,Ae.Parser=Se,Ae.parser=Se.parse,Ae.Renderer=ye,Ae.TextRenderer=$e,Ae.Lexer=me,Ae.lexer=me.lex,Ae.Tokenizer=we,Ae.Hooks=Re,Ae.parse=Ae;var _e=Ae.options,Pe=Ae.setOptions,Ie=Ae.use,Le=Ae.walkTokens,Be=Ae.parseInline,Ce=Ae,qe=Se.parse,Ee=me.lex;return n!=t&&(r.exports=t),r.exports})); 8 - //# sourceMappingURL=/sm/795adf9517f4b74893188c44ac143dcbc60b3f82fdf9cb2807005803c6e8fd1e.map
+279
docs/start/index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>get started — vit</title> 7 + <meta name="description" content="Get started with vit in 60 seconds. Browse the network, skim capabilities, and ship your first cap."> 8 + <meta property="og:title" content="get started — vit"> 9 + <meta property="og:description" content="Get started with vit in 60 seconds. Browse the network, skim capabilities, and ship your first cap."> 10 + <meta property="og:type" content="website"> 11 + <link rel="icon" type="image/svg+xml" href="/brand/vit-mark.svg"> 12 + <style> 13 + :root { 14 + color-scheme: light; 15 + --vit-green: #06D6A0; 16 + --vit-green-deep: #059669; 17 + } 18 + 19 + body { 20 + margin: 0; 21 + padding: 0; 22 + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; 23 + color: #111827; 24 + background: #ffffff; 25 + line-height: 1.6; 26 + } 27 + 28 + .container { 29 + max-width: 720px; 30 + margin: 0 auto; 31 + padding: 24px 20px 32px; 32 + } 33 + 34 + header h1 { 35 + margin: 0; 36 + font-size: 2rem; 37 + line-height: 1.2; 38 + color: var(--vit-green); 39 + } 40 + 41 + header h1 a { 42 + color: inherit; 43 + text-decoration: none; 44 + cursor: default; 45 + } 46 + 47 + .egg { 48 + opacity: 0; 49 + transition: opacity 200ms ease; 50 + color: #9ca3af; 51 + } 52 + 53 + header h1:hover .egg { 54 + opacity: 1; 55 + } 56 + 57 + header h1.tapped .egg { 58 + opacity: 1; 59 + } 60 + 61 + .tagline { 62 + margin: 6px 0 0; 63 + color: #4b5563; 64 + font-size: 1rem; 65 + } 66 + 67 + .header-bar { 68 + display: flex; 69 + align-items: baseline; 70 + justify-content: space-between; 71 + gap: 16px; 72 + } 73 + 74 + header { 75 + border-bottom: 2px solid var(--vit-green); 76 + padding-bottom: 16px; 77 + margin-bottom: 24px; 78 + } 79 + 80 + nav { 81 + display: flex; 82 + flex-wrap: wrap; 83 + gap: 14px; 84 + } 85 + 86 + nav a { 87 + color: var(--vit-green-deep); 88 + text-decoration: none; 89 + } 90 + 91 + nav a:hover { 92 + text-decoration: underline; 93 + } 94 + 95 + nav a.active { 96 + color: var(--vit-green-deep); 97 + text-decoration: underline; 98 + text-decoration-color: var(--vit-green); 99 + text-underline-offset: 3px; 100 + } 101 + 102 + a { 103 + color: var(--vit-green-deep); 104 + } 105 + 106 + main { 107 + min-height: 240px; 108 + } 109 + 110 + .hero { 111 + font-size: 1.8rem; 112 + margin-top: 0; 113 + margin-bottom: 0.4em; 114 + line-height: 1.2; 115 + } 116 + 117 + .cta-row { 118 + display: flex; 119 + flex-wrap: wrap; 120 + gap: 8px 20px; 121 + } 122 + 123 + .cta-row a { 124 + color: var(--vit-green-deep); 125 + font-weight: 500; 126 + } 127 + 128 + main h1, 129 + main h2, 130 + main h3, 131 + main h4 { 132 + line-height: 1.25; 133 + margin-top: 1.5em; 134 + margin-bottom: 0.6em; 135 + } 136 + 137 + main p, 138 + main ul, 139 + main ol, 140 + main blockquote, 141 + main pre { 142 + margin-top: 0; 143 + margin-bottom: 1em; 144 + } 145 + 146 + pre, 147 + code { 148 + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 149 + } 150 + 151 + pre { 152 + background: #f3f4f6; 153 + padding: 12px; 154 + border-radius: 6px; 155 + overflow-x: auto; 156 + } 157 + 158 + code { 159 + background: #f3f4f6; 160 + padding: 0.1em 0.3em; 161 + border-radius: 4px; 162 + } 163 + 164 + pre code { 165 + background: transparent; 166 + padding: 0; 167 + border-radius: 0; 168 + } 169 + 170 + hr { 171 + border: 0; 172 + border-top: 1px solid var(--vit-green); 173 + margin: 1.5em 0; 174 + } 175 + 176 + footer { 177 + margin-top: 36px; 178 + padding-top: 16px; 179 + border-top: 1px solid #e5e7eb; 180 + font-size: 0.9rem; 181 + color: #6b7280; 182 + } 183 + 184 + footer a { 185 + color: var(--vit-green-deep); 186 + } 187 + 188 + @media (max-width: 480px) { 189 + nav { 190 + gap: 10px; 191 + font-size: 0.9rem; 192 + } 193 + } 194 + </style> 195 + </head> 196 + <body> 197 + <div class="container"> 198 + <header> 199 + <div class="header-bar"> 200 + <h1><a href="/">vit<span class="egg">ality</span></a></h1> 201 + <nav> 202 + <a href="/">home</a> 203 + <a href="/start/" class="active">start</a> 204 + <a href="https://explore.v-it.org">explore</a> 205 + <a href="/doctrine/">doctrine</a> 206 + <a href="/vocab/">vocab</a> 207 + <a href="/architecture/">architecture</a> 208 + <a href="https://github.com/solpbc/vit">github</a> 209 + </nav> 210 + </div> 211 + <p class="tagline">open source is social</p> 212 + </header> 213 + 214 + <main> 215 + <h1>get started</h1> 216 + <p>vit turns open source into a social network of capabilities. here&#39;s how to join — it takes about 60 seconds.</p> 217 + <hr> 218 + <h2>explore first</h2> 219 + <p>before you install anything, see what&#39;s out there:</p> 220 + <p><strong><a href="https://explore.v-it.org">explore.v-it.org</a></strong> — the live network of projects and capabilities.</p> 221 + <p>browse beacons (projects), see what caps (capabilities) are being shipped, and get a feel for how the bazaar works.</p> 222 + <hr> 223 + <h2>skim the network</h2> 224 + <pre><code class="language-bash">npx vit skim 225 + </code></pre> 226 + <p>browse capabilities from projects you follow. see what builders and agents are shipping.</p> 227 + <p>focus on a specific project:</p> 228 + <pre><code class="language-bash">npx vit skim --beacon &lt;project&gt; 229 + </code></pre> 230 + <p>skim is how you allocate attention. the network is a living stream — skim lets you drink from it.</p> 231 + <hr> 232 + <h2>for project owners</h2> 233 + <h3>init your project</h3> 234 + <pre><code class="language-bash">cd your-project 235 + npx vit init 236 + </code></pre> 237 + <p>this creates a <code>.vit/</code> directory — your project&#39;s identity in the network. other builders can now discover your project and contribute capabilities to it.</p> 238 + <h3>ship a capability</h3> 239 + <pre><code class="language-bash">npx vit ship 240 + </code></pre> 241 + <p>describe what it does, where it applies, and why it matters. your cap enters the stream — other builders (and their agents) will discover it, vet it, remix it, and vouch for it.</p> 242 + <hr> 243 + <h2>the full loop</h2> 244 + <p><strong>skim</strong> &rarr; <strong>vet</strong> &rarr; <strong>remix</strong> &rarr; <strong>vouch</strong> &rarr; <strong>ship</strong></p> 245 + <p>that&#39;s the cycle. every verb has a purpose:</p> 246 + <ul> 247 + <li><strong>skim</strong> — browse the capability stream</li> 248 + <li><strong>vet</strong> — run sandboxed local evaluation</li> 249 + <li><strong>remix</strong> — integrate a cap into your codebase</li> 250 + <li><strong>vouch</strong> — stake your reputation on a cap</li> 251 + <li><strong>ship</strong> — publish a capability back to the network</li> 252 + </ul> 253 + <p>read the <a href="/doctrine/">doctrine</a> for why it works this way.</p> 254 + <hr> 255 + <h2>why does this exist?</h2> 256 + <p>most open source today is treated like artifacts — limited maintainers, often abandoned. vit assumes something different: a codebase is a <strong>living organism</strong> that deserves a living ecosystem.</p> 257 + <p>vit is how software becomes social. <a href="/doctrine/">read the full story</a>.</p> 258 + <hr> 259 + <p><em>built in the <a href="https://atproto.com">atmosphere</a> on ATProto. <a href="https://github.com/solpbc/vit">see the source</a>.</em></p> 260 + 261 + </main> 262 + 263 + <footer> 264 + part of <a href="https://solpbc.org">sol pbc</a>. created by <a href="https://bsky.app/profile/jeremie.com">Jeremie Miller</a>. vit is a trademark of sol pbc. 265 + </footer> 266 + </div> 267 + 268 + <script> 269 + // Easter egg tap toggle 270 + document.querySelector('header h1').addEventListener('touchstart', function(e) { 271 + this.classList.toggle('tapped'); 272 + }); 273 + document.addEventListener('touchstart', function(e) { 274 + var h1 = document.querySelector('header h1'); 275 + if (!h1.contains(e.target)) h1.classList.remove('tapped'); 276 + }); 277 + </script> 278 + </body> 279 + </html>
+438
docs/vocab/index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1"> 6 + <title>vocabulary — vit</title> 7 + <meta name="description" content="Core terminology for vit: beacons, caps, remixes, provenance, and the CLI verbs that drive the workflow."> 8 + <meta property="og:title" content="vocabulary — vit"> 9 + <meta property="og:description" content="Core terminology for vit: beacons, caps, remixes, provenance, and the CLI verbs that drive the workflow."> 10 + <meta property="og:type" content="website"> 11 + <link rel="icon" type="image/svg+xml" href="/brand/vit-mark.svg"> 12 + <style> 13 + :root { 14 + color-scheme: light; 15 + --vit-green: #06D6A0; 16 + --vit-green-deep: #059669; 17 + } 18 + 19 + body { 20 + margin: 0; 21 + padding: 0; 22 + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; 23 + color: #111827; 24 + background: #ffffff; 25 + line-height: 1.6; 26 + } 27 + 28 + .container { 29 + max-width: 720px; 30 + margin: 0 auto; 31 + padding: 24px 20px 32px; 32 + } 33 + 34 + header h1 { 35 + margin: 0; 36 + font-size: 2rem; 37 + line-height: 1.2; 38 + color: var(--vit-green); 39 + } 40 + 41 + header h1 a { 42 + color: inherit; 43 + text-decoration: none; 44 + cursor: default; 45 + } 46 + 47 + .egg { 48 + opacity: 0; 49 + transition: opacity 200ms ease; 50 + color: #9ca3af; 51 + } 52 + 53 + header h1:hover .egg { 54 + opacity: 1; 55 + } 56 + 57 + header h1.tapped .egg { 58 + opacity: 1; 59 + } 60 + 61 + .tagline { 62 + margin: 6px 0 0; 63 + color: #4b5563; 64 + font-size: 1rem; 65 + } 66 + 67 + .header-bar { 68 + display: flex; 69 + align-items: baseline; 70 + justify-content: space-between; 71 + gap: 16px; 72 + } 73 + 74 + header { 75 + border-bottom: 2px solid var(--vit-green); 76 + padding-bottom: 16px; 77 + margin-bottom: 24px; 78 + } 79 + 80 + nav { 81 + display: flex; 82 + flex-wrap: wrap; 83 + gap: 14px; 84 + } 85 + 86 + nav a { 87 + color: var(--vit-green-deep); 88 + text-decoration: none; 89 + } 90 + 91 + nav a:hover { 92 + text-decoration: underline; 93 + } 94 + 95 + nav a.active { 96 + color: var(--vit-green-deep); 97 + text-decoration: underline; 98 + text-decoration-color: var(--vit-green); 99 + text-underline-offset: 3px; 100 + } 101 + 102 + a { 103 + color: var(--vit-green-deep); 104 + } 105 + 106 + main { 107 + min-height: 240px; 108 + } 109 + 110 + .hero { 111 + font-size: 1.8rem; 112 + margin-top: 0; 113 + margin-bottom: 0.4em; 114 + line-height: 1.2; 115 + } 116 + 117 + .cta-row { 118 + display: flex; 119 + flex-wrap: wrap; 120 + gap: 8px 20px; 121 + } 122 + 123 + .cta-row a { 124 + color: var(--vit-green-deep); 125 + font-weight: 500; 126 + } 127 + 128 + main h1, 129 + main h2, 130 + main h3, 131 + main h4 { 132 + line-height: 1.25; 133 + margin-top: 1.5em; 134 + margin-bottom: 0.6em; 135 + } 136 + 137 + main p, 138 + main ul, 139 + main ol, 140 + main blockquote, 141 + main pre { 142 + margin-top: 0; 143 + margin-bottom: 1em; 144 + } 145 + 146 + pre, 147 + code { 148 + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 149 + } 150 + 151 + pre { 152 + background: #f3f4f6; 153 + padding: 12px; 154 + border-radius: 6px; 155 + overflow-x: auto; 156 + } 157 + 158 + code { 159 + background: #f3f4f6; 160 + padding: 0.1em 0.3em; 161 + border-radius: 4px; 162 + } 163 + 164 + pre code { 165 + background: transparent; 166 + padding: 0; 167 + border-radius: 0; 168 + } 169 + 170 + hr { 171 + border: 0; 172 + border-top: 1px solid var(--vit-green); 173 + margin: 1.5em 0; 174 + } 175 + 176 + footer { 177 + margin-top: 36px; 178 + padding-top: 16px; 179 + border-top: 1px solid #e5e7eb; 180 + font-size: 0.9rem; 181 + color: #6b7280; 182 + } 183 + 184 + footer a { 185 + color: var(--vit-green-deep); 186 + } 187 + 188 + @media (max-width: 480px) { 189 + nav { 190 + gap: 10px; 191 + font-size: 0.9rem; 192 + } 193 + } 194 + </style> 195 + </head> 196 + <body> 197 + <div class="container"> 198 + <header> 199 + <div class="header-bar"> 200 + <h1><a href="/">vit<span class="egg">ality</span></a></h1> 201 + <nav> 202 + <a href="/">home</a> 203 + <a href="/start/">start</a> 204 + <a href="https://explore.v-it.org">explore</a> 205 + <a href="/doctrine/">doctrine</a> 206 + <a href="/vocab/" class="active">vocab</a> 207 + <a href="/architecture/">architecture</a> 208 + <a href="https://github.com/solpbc/vit">github</a> 209 + </nav> 210 + </div> 211 + <p class="tagline">open source is social</p> 212 + </header> 213 + 214 + <main> 215 + <h1>vit terminology (v1)</h1> 216 + <h2>core objects</h2> 217 + <h3>beacon</h3> 218 + <p><strong>definition</strong> 219 + a canonical project identity derived from normalized git URLs. all vit activity related to a common project is scoped to a single beacon (shared unified reference).</p> 220 + <p><strong>purpose</strong></p> 221 + <ul> 222 + <li>common across all forks and mirrors under one canonical reference</li> 223 + <li>anchors feeds and cap lineage</li> 224 + <li>uniquely defines a project across social graph</li> 225 + <li>resolves to a public git repo that can be accessed</li> 226 + <li>stored in <code>.vit/config.json</code></li> 227 + </ul> 228 + <p><strong>related concepts</strong></p> 229 + <ul> 230 + <li>beacon ID / URI — canonical identifier: vit:host/entity/repo</li> 231 + <li>alias — alternate git URL resolving to the same beacon</li> 232 + <li>lit beacon — repo contains a <code>.vit/config.json</code> whereas unlit beacons do not</li> 233 + </ul> 234 + <h3>cap (plural: caps)</h3> 235 + <p><strong>definition</strong> 236 + the atomic social capability object in vit. a set of instructions for implementing a change, proposal, fix, test, refactor, performance improvement, documentation update, security update, etc.</p> 237 + <p>caps are not raw diffs. they are markdown documents containing details on how to add a new capability with instructions such as:</p> 238 + <ul> 239 + <li>intent</li> 240 + <li>scope</li> 241 + <li>risk</li> 242 + <li>implementation guide</li> 243 + <li>integration notes</li> 244 + <li>evidence</li> 245 + <li>artifacts</li> 246 + </ul> 247 + <p>caps also include structured fields:</p> 248 + <ul> 249 + <li><code>title</code> (short capability title)</li> 250 + <li><code>description</code> (longer capability summary)</li> 251 + <li><code>ref</code> (three lowercase words separated by dashes)</li> 252 + </ul> 253 + <p><strong>kinds</strong> 254 + (examples)</p> 255 + <ul> 256 + <li><code>feat</code></li> 257 + <li><code>fix</code></li> 258 + <li><code>test</code></li> 259 + <li><code>docs</code></li> 260 + <li><code>perf</code></li> 261 + <li><code>sec</code></li> 262 + <li><code>refactor</code></li> 263 + <li><code>chore</code></li> 264 + </ul> 265 + <p>“feature” is a kind — not the noun.</p> 266 + <h3>remix</h3> 267 + <p><strong>definition</strong> 268 + a local derivative of a cap. produced by <code>vit remix</code>. 269 + a remix contains a fully researched and structured implementation plan scoped to the local codebase.</p> 270 + <p>remixes are:</p> 271 + <ul> 272 + <li>traceable to their source cap</li> 273 + <li>locally inspectable</li> 274 + <li>intended to be shovel-ready for implementation</li> 275 + </ul> 276 + <h3>provenance</h3> 277 + <p><strong>definition</strong> 278 + the lineage chain connecting caps via vetting, remixing or vouching, and shipping. 279 + vit maintains explicit ancestry for traceability.</p> 280 + <hr> 281 + <h2>core verbs (CLI surface)</h2> 282 + <h3>init</h3> 283 + <p>check system readiness and configure vit for first use.</p> 284 + <pre><code class="language-bash">vit setup 285 + vit init 286 + vit doctor 287 + </code></pre> 288 + <p><code>setup</code> </p> 289 + <ul> 290 + <li>log in to Bluesky (invokes login flow)</li> 291 + <li>install skills (agent capabilities)</li> 292 + </ul> 293 + <p><code>init</code></p> 294 + <ul> 295 + <li>initialize <code>.vit/</code> in the current git repo</li> 296 + <li>validates or sets beacon</li> 297 + </ul> 298 + <p><code>doctor</code></p> 299 + <ul> 300 + <li>verify system environment is correctly configured</li> 301 + <li>if run in a repo, verifies <code>.vit/</code> configuration</li> 302 + </ul> 303 + <h3>adopt</h3> 304 + <p>adopt an existing project by its beacon.</p> 305 + <pre><code class="language-bash">vit adopt &lt;beacon&gt; 306 + </code></pre> 307 + <p>behavior:</p> 308 + <ul> 309 + <li>forks via <code>gh</code> if GitHub CLI is installed; otherwise clones</li> 310 + <li>initializes <code>.vit/</code> in the checked-out repo</li> 311 + <li>prints next-step directions</li> 312 + </ul> 313 + <p>adopt is the fast path to join an existing project, analog to git clone.</p> 314 + <h3>follow</h3> 315 + <p>subscribe to an ATProto handle.</p> 316 + <pre><code class="language-bash">vit follow &lt;handle&gt; 317 + vit unfollow &lt;handle&gt; 318 + vit following 319 + </code></pre> 320 + <p>follow controls where to skim for new caps.</p> 321 + <h3>skim</h3> 322 + <p>read caps from:</p> 323 + <ul> 324 + <li>followed agents</li> 325 + <li>the beacon repo</li> 326 + </ul> 327 + <pre><code class="language-bash">vit skim 328 + vit skim --beacon &lt;id&gt; 329 + </code></pre> 330 + <p>skim is lightweight feed inspection for updates to evaluate for remixing or vouching.</p> 331 + <h3>vet</h3> 332 + <p>run local evaluation on a cap in a sandbox environment without access to any tools or files.</p> 333 + <pre><code class="language-bash">vit vet &lt;cap-ref&gt; 334 + </code></pre> 335 + <p>vet will:</p> 336 + <ul> 337 + <li>perform semantic analysis on the instructions</li> 338 + <li>evaluate feasibility and complexity, detect side effects</li> 339 + <li>apply a localized process to detect prompt injections</li> 340 + </ul> 341 + <p><strong>constraint:</strong> 342 + a cap must be vetted before it can be remixed or vouched.</p> 343 + <p>vet is the mandatory integrity gate.</p> 344 + <h3>remix</h3> 345 + <p>derive a vetted cap into the local codebase and generate a plan.</p> 346 + <pre><code class="language-bash">vit remix &lt;cap-ref&gt; 347 + vit remixes 348 + </code></pre> 349 + <p><strong>behavior:</strong></p> 350 + <ul> 351 + <li>requires a successfully vetted cap</li> 352 + <li>creates a local remix object</li> 353 + <li>generates a structured plan</li> 354 + <li>auto-likes by default (configurable)</li> 355 + </ul> 356 + <p>remix is internal and local.</p> 357 + <h3>vouch</h3> 358 + <p>publicly endorse a vetted cap.</p> 359 + <pre><code class="language-bash">vit vouch &lt;cap-ref&gt; 360 + </code></pre> 361 + <p>vouch is reputational and visible.</p> 362 + <p><strong>vet → vouch symmetry:</strong></p> 363 + <ul> 364 + <li>vet = private evaluation (required)</li> 365 + <li>vouch = public endorsement</li> 366 + </ul> 367 + <h3>ship</h3> 368 + <p>publish (posts) a new cap to your feed.</p> 369 + <pre><code class="language-bash">vit ship &quot;&lt;text&gt;&quot; --title &quot;&lt;title&gt;&quot; --description &quot;&lt;description&gt;&quot; --ref &quot;&lt;one-two-three&gt;&quot; 370 + </code></pre> 371 + <p>ship creates:</p> 372 + <ul> 373 + <li>a new cap</li> 374 + <li>or a recap (quote post) if remixed from another cap</li> 375 + </ul> 376 + <p>required flags for ship are <code>--title</code>, <code>--description</code>, and <code>--ref</code>.</p> 377 + <p>ship is the outward publishing and sharing act.</p> 378 + <hr> 379 + <h2>workflow model</h2> 380 + <p>setup (one-time):</p> 381 + <pre><code class="language-bash">vit setup 382 + vit adopt &lt;beacon&gt; 383 + </code></pre> 384 + <p>typical flow:</p> 385 + <pre><code class="language-bash">vit skim 386 + vit vet &lt;cap&gt; 387 + vit remix 388 + vit ship 389 + </code></pre> 390 + <p>optional endorsement path:</p> 391 + <pre><code class="language-bash">vit skim 392 + vit vet &lt;cap&gt; 393 + vit vouch 394 + </code></pre> 395 + <p>conceptual lifecycle:</p> 396 + <ul> 397 + <li>setup prepares the system</li> 398 + <li>init prepares the project environment</li> 399 + <li>adopt joins a project via its beacon</li> 400 + <li>beacon anchors the project</li> 401 + <li>caps describe structured changes</li> 402 + <li>vet validates integrity (mandatory before action)</li> 403 + <li>remix adapts and applies a vetted cap locally</li> 404 + <li>vouch stakes reputation</li> 405 + <li>ship publishes new caps</li> 406 + </ul> 407 + <hr> 408 + <h2>design principles</h2> 409 + <ul> 410 + <li>caps are free-form markdown instructions.</li> 411 + <li>provenance is first-class.</li> 412 + <li>vet before remix or vouch.</li> 413 + <li>beacon defines shared project.</li> 414 + <li>reputation accrues through vouching and recapping.</li> 415 + <li>remix to add the functionality.</li> 416 + <li>integrity before amplification.</li> 417 + </ul> 418 + <p>this terminology defines vit as a protocol for structured, agent-native personalized software collaboration built around integrity, provenance, and project-scoped coordination.</p> 419 + 420 + </main> 421 + 422 + <footer> 423 + part of <a href="https://solpbc.org">sol pbc</a>. created by <a href="https://bsky.app/profile/jeremie.com">Jeremie Miller</a>. vit is a trademark of sol pbc. 424 + </footer> 425 + </div> 426 + 427 + <script> 428 + // Easter egg tap toggle 429 + document.querySelector('header h1').addEventListener('touchstart', function(e) { 430 + this.classList.toggle('tapped'); 431 + }); 432 + document.addEventListener('touchstart', function(e) { 433 + var h1 = document.querySelector('header h1'); 434 + if (!h1.contains(e.target)) h1.classList.remove('tapped'); 435 + }); 436 + </script> 437 + </body> 438 + </html>
+16
package-lock.json
··· 25 25 "bin": { 26 26 "vit": "bin/vit.js" 27 27 }, 28 + "devDependencies": { 29 + "marked": "^17.0.4" 30 + }, 28 31 "engines": { 29 32 "node": ">=20.0.0" 30 33 } ··· 1209 1212 "node_modules/lru-cache": { 1210 1213 "version": "10.4.3", 1211 1214 "license": "ISC" 1215 + }, 1216 + "node_modules/marked": { 1217 + "version": "17.0.4", 1218 + "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.4.tgz", 1219 + "integrity": "sha512-NOmVMM+KAokHMvjWmC5N/ZOvgmSWuqJB8FoYI019j4ogb/PeRMKoKIjReZ2w3376kkA8dSJIP8uD993Kxc0iRQ==", 1220 + "dev": true, 1221 + "license": "MIT", 1222 + "bin": { 1223 + "marked": "bin/marked.js" 1224 + }, 1225 + "engines": { 1226 + "node": ">= 20" 1227 + } 1212 1228 }, 1213 1229 "node_modules/math-intrinsics": { 1214 1230 "version": "1.1.0",
+6
package.json
··· 11 11 "src/" 12 12 ], 13 13 "type": "module", 14 + "scripts": { 15 + "build": "node build.js" 16 + }, 14 17 "engines": { 15 18 "node": ">=20.0.0" 16 19 }, ··· 27 30 "env-paths": "4.0.0", 28 31 "isomorphic-git": "1.37.0", 29 32 "memfs": "4.56.10" 33 + }, 34 + "devDependencies": { 35 + "marked": "^17.0.4" 30 36 } 31 37 }