@spec-engine/spec-engine 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +67 -0
  3. package/dist/cli.js +11 -0
  4. package/dist/docs/404.html +41 -0
  5. package/dist/docs/CNAME +1 -0
  6. package/dist/docs/_astro/Code.DfIJP77p.css +1 -0
  7. package/dist/docs/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js +1 -0
  8. package/dist/docs/_astro/Search.astro_astro_type_script_index_0_lang.lq3t8uE2.js +1 -0
  9. package/dist/docs/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js +1 -0
  10. package/dist/docs/_astro/common.xlUlWolS.css +1 -0
  11. package/dist/docs/_astro/ec.0vx5m.js +3 -0
  12. package/dist/docs/_astro/ec.v4551.css +1 -0
  13. package/dist/docs/_astro/page.B_tncCx8.js +1 -0
  14. package/dist/docs/_astro/print.DNXP8c50.css +1 -0
  15. package/dist/docs/_astro/spec-mark-black.ZCN22lJi.svg +7 -0
  16. package/dist/docs/_astro/spec-mark-white.DJBFLLUP.svg +7 -0
  17. package/dist/docs/_astro/ui-core.C8327L_n.js +2 -0
  18. package/dist/docs/agent-reference/index.html +108 -0
  19. package/dist/docs/architecture/index.html +81 -0
  20. package/dist/docs/checks/index.html +267 -0
  21. package/dist/docs/commands/index.html +228 -0
  22. package/dist/docs/favicon-16.png +0 -0
  23. package/dist/docs/favicon-180.png +0 -0
  24. package/dist/docs/favicon-192.png +0 -0
  25. package/dist/docs/favicon-32.png +0 -0
  26. package/dist/docs/favicon-512.png +0 -0
  27. package/dist/docs/favicon.ico +0 -0
  28. package/dist/docs/favicon.svg +8 -0
  29. package/dist/docs/format/index.html +172 -0
  30. package/dist/docs/getting-started/index.html +92 -0
  31. package/dist/docs/guides/adoption/index.html +84 -0
  32. package/dist/docs/guides/platform-setup/index.html +95 -0
  33. package/dist/docs/guides/single-repo/index.html +82 -0
  34. package/dist/docs/index.html +152 -0
  35. package/dist/docs/maskable-512.png +0 -0
  36. package/dist/docs/og-spec-engine-docs.png +0 -0
  37. package/dist/docs/og-spec-engine.png +0 -0
  38. package/dist/docs/overview/index.html +124 -0
  39. package/dist/docs/pagefind/fragment/en_3f97d08.pf_fragment +0 -0
  40. package/dist/docs/pagefind/fragment/en_51433aa.pf_fragment +0 -0
  41. package/dist/docs/pagefind/fragment/en_629887a.pf_fragment +0 -0
  42. package/dist/docs/pagefind/fragment/en_6339f38.pf_fragment +0 -0
  43. package/dist/docs/pagefind/fragment/en_74b2c3a.pf_fragment +0 -0
  44. package/dist/docs/pagefind/fragment/en_79e59c8.pf_fragment +0 -0
  45. package/dist/docs/pagefind/fragment/en_a4de4f3.pf_fragment +0 -0
  46. package/dist/docs/pagefind/fragment/en_ae342c4.pf_fragment +0 -0
  47. package/dist/docs/pagefind/fragment/en_b571467.pf_fragment +0 -0
  48. package/dist/docs/pagefind/fragment/en_cc9f632.pf_fragment +0 -0
  49. package/dist/docs/pagefind/fragment/en_dc8d1bd.pf_fragment +0 -0
  50. package/dist/docs/pagefind/index/en_4f59892.pf_index +0 -0
  51. package/dist/docs/pagefind/pagefind-component-ui.css +1509 -0
  52. package/dist/docs/pagefind/pagefind-component-ui.js +56 -0
  53. package/dist/docs/pagefind/pagefind-entry.json +1 -0
  54. package/dist/docs/pagefind/pagefind-highlight.js +1070 -0
  55. package/dist/docs/pagefind/pagefind-modular-ui.css +214 -0
  56. package/dist/docs/pagefind/pagefind-modular-ui.js +8 -0
  57. package/dist/docs/pagefind/pagefind-ui.css +1 -0
  58. package/dist/docs/pagefind/pagefind-ui.js +2 -0
  59. package/dist/docs/pagefind/pagefind-worker.js +6 -0
  60. package/dist/docs/pagefind/pagefind.en_c8da4a195d.pf_meta +0 -0
  61. package/dist/docs/pagefind/pagefind.js +6 -0
  62. package/dist/docs/pagefind/wasm.en.pagefind +0 -0
  63. package/dist/docs/pagefind/wasm.unknown.pagefind +0 -0
  64. package/dist/docs/site.webmanifest +25 -0
  65. package/dist/docs/sitemap-0.xml +1 -0
  66. package/dist/docs/sitemap-index.xml +1 -0
  67. package/dist/docs/tags/index.html +112 -0
  68. package/dist/impl.js +11050 -0
  69. package/package.json +48 -0
@@ -0,0 +1,84 @@
1
+ <!DOCTYPE html><html lang="en" dir="ltr" data-theme="dark" data-has-toc data-has-sidebar class="astro-hke2hksx"> <head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Adoption Guide | Spec Engine</title><link rel="canonical" href="https://docs.spec-engine.dev/guides/adoption/"/><link rel="sitemap" href="/sitemap-index.xml"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="true"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Archivo:wght@600;700;800;900&amp;family=IBM+Plex+Mono:wght@400;500;600&amp;family=IBM+Plex+Sans:wght@400;500;600&amp;display=swap"/><link rel="icon" href="/favicon.ico" sizes="any"/><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png"/><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png"/><link rel="apple-touch-icon" sizes="180x180" href="/favicon-180.png"/><link rel="manifest" href="/site.webmanifest"/><link rel="shortcut icon" href="/favicon.svg" type="image/svg+xml"/><meta name="generator" content="Astro v6.4.8"/><meta name="generator" content="Starlight v0.40.0"/><meta property="og:title" content="Adoption Guide"/><meta property="og:type" content="article"/><meta property="og:url" content="https://docs.spec-engine.dev/guides/adoption/"/><meta property="og:locale" content="en"/><meta property="og:description" content="Progressive adoption of Spec Engine — bottom-up, rung by rung"/><meta property="og:site_name" content="Spec Engine"/><meta name="twitter:card" content="summary_large_image"/><meta name="description" content="Progressive adoption of Spec Engine — bottom-up, rung by rung"/><meta name="theme-color" content="#0F1214"/><meta property="og:image" content="https://docs.spec-engine.dev/og-spec-engine-docs.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta name="twitter:image" content="https://docs.spec-engine.dev/og-spec-engine-docs.png"/><script>
2
+ window.StarlightThemeProvider = (() => {
3
+ const storedTheme =
4
+ typeof localStorage !== 'undefined' && localStorage.getItem('starlight-theme');
5
+ const theme =
6
+ storedTheme ||
7
+ (window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');
8
+ document.documentElement.dataset.theme = theme === 'light' ? 'light' : 'dark';
9
+ return {
10
+ updatePickers(theme = storedTheme || 'auto') {
11
+ document.querySelectorAll('starlight-theme-select').forEach((picker) => {
12
+ const select = picker.querySelector('select');
13
+ if (select) select.value = theme;
14
+ /** @type {HTMLTemplateElement | null} */
15
+ const tmpl = document.querySelector(`#theme-icons`);
16
+ const newIcon = tmpl && tmpl.content.querySelector('.' + theme);
17
+ if (newIcon) {
18
+ const oldIcon = picker.querySelector('svg.label-icon');
19
+ if (oldIcon) {
20
+ oldIcon.replaceChildren(...newIcon.cloneNode(true).childNodes);
21
+ }
22
+ }
23
+ });
24
+ },
25
+ };
26
+ })();
27
+ </script><template id="theme-icons"><svg aria-hidden="true" class="light astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M5 12a1 1 0 0 0-1-1H3a1 1 0 0 0 0 2h1a1 1 0 0 0 1-1Zm.64 5-.71.71a1 1 0 0 0 0 1.41 1 1 0 0 0 1.41 0l.71-.71A1 1 0 0 0 5.64 17ZM12 5a1 1 0 0 0 1-1V3a1 1 0 0 0-2 0v1a1 1 0 0 0 1 1Zm5.66 2.34a1 1 0 0 0 .7-.29l.71-.71a1 1 0 1 0-1.41-1.41l-.66.71a1 1 0 0 0 0 1.41 1 1 0 0 0 .66.29Zm-12-.29a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.71-.71a1.004 1.004 0 1 0-1.43 1.41l.73.71ZM21 11h-1a1 1 0 0 0 0 2h1a1 1 0 0 0 0-2Zm-2.64 6A1 1 0 0 0 17 18.36l.71.71a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.76-.66ZM12 6.5a5.5 5.5 0 1 0 5.5 5.5A5.51 5.51 0 0 0 12 6.5Zm0 9a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7Zm0 3.5a1 1 0 0 0-1 1v1a1 1 0 0 0 2 0v-1a1 1 0 0 0-1-1Z"/></svg><svg aria-hidden="true" class="dark astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.64 13a1 1 0 0 0-1.05-.14 8.049 8.049 0 0 1-3.37.73 8.15 8.15 0 0 1-8.14-8.1 8.59 8.59 0 0 1 .25-2A1 1 0 0 0 8 2.36a10.14 10.14 0 1 0 14 11.69 1 1 0 0 0-.36-1.05Zm-9.5 6.69A8.14 8.14 0 0 1 7.08 5.22v.27a10.15 10.15 0 0 0 10.14 10.14 9.784 9.784 0 0 0 2.1-.22 8.11 8.11 0 0 1-7.18 4.32v-.04Z"/></svg><svg aria-hidden="true" class="auto astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg></template><link rel="stylesheet" href="/_astro/print.DNXP8c50.css" media="print"><link rel="stylesheet" href="/_astro/common.xlUlWolS.css"><link rel="stylesheet" href="/_astro/Code.DfIJP77p.css"><script type="module" src="/_astro/page.B_tncCx8.js"></script></head> <body class="astro-hke2hksx"> <a href="#_top" class="astro-ln4bs55d">Skip to content</a> <div class="page sl-flex astro-4azfgxa5"> <header class="header astro-4azfgxa5"><div class="header astro-huokaw3t"> <div class="title-wrapper sl-flex astro-huokaw3t"> <a href="/" class="site-title sl-flex astro-pf7uwcts"> <img class="light:sl-hidden print:hidden astro-pf7uwcts" alt="Spec Engine" src="/_astro/spec-mark-white.DJBFLLUP.svg" width="512" height="512"> <img class="dark:sl-hidden print:block astro-pf7uwcts" alt="Spec Engine" src="/_astro/spec-mark-black.ZCN22lJi.svg" width="512" height="512"> <span class="astro-pf7uwcts" translate="no"> Spec Engine </span> </a> </div> <div class="sl-flex print:hidden astro-huokaw3t"> <site-search class="astro-huokaw3t astro-6oz6ysne" data-translations="{&quot;placeholder&quot;:&quot;Search&quot;}"> <button data-open-modal disabled aria-label="Search" aria-keyshortcuts="Control+K" class="astro-6oz6ysne"> <svg aria-hidden="true" class="astro-6oz6ysne astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.71 20.29 18 16.61A9 9 0 1 0 16.61 18l3.68 3.68a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.39ZM11 18a7 7 0 1 1 0-14 7 7 0 0 1 0 14Z"/></svg> <span class="sl-hidden md:sl-block astro-6oz6ysne" aria-hidden="true">Search</span> <kbd class="sl-hidden md:sl-flex astro-6oz6ysne" style="display: none;"> <kbd class="astro-6oz6ysne">Ctrl</kbd><kbd class="astro-6oz6ysne">K</kbd> </kbd> </button> <dialog style="padding:0" aria-label="Search" class="astro-6oz6ysne"> <div class="dialog-frame sl-flex astro-6oz6ysne"> <button data-close-modal class="sl-flex md:sl-hidden astro-6oz6ysne"> Cancel </button> <div class="search-container astro-6oz6ysne"> <div id="starlight__search" class="astro-6oz6ysne"></div> </div> </div> </dialog> </site-search> <script>
28
+ (() => {
29
+ const openBtn = document.querySelector('button[data-open-modal]');
30
+ const shortcut = openBtn?.querySelector('kbd');
31
+ if (!openBtn || !(shortcut instanceof HTMLElement)) return;
32
+ const platformKey = shortcut.querySelector('kbd');
33
+ if (platformKey && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)) {
34
+ platformKey.textContent = '⌘';
35
+ openBtn.setAttribute('aria-keyshortcuts', 'Meta+K');
36
+ }
37
+ shortcut.style.display = '';
38
+ })();
39
+ </script> <script type="module" src="/_astro/Search.astro_astro_type_script_index_0_lang.lq3t8uE2.js"></script> </div> <div class="sl-hidden md:sl-flex print:hidden right-group astro-huokaw3t"> <div class="sl-flex social-icons astro-huokaw3t"> <a href="https://github.com/spec-engine/spec-engine" rel="me" class="sl-flex astro-7c53pyad"><span class="sr-only astro-7c53pyad">GitHub</span><svg aria-hidden="true" class="astro-7c53pyad astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg></a> </div> <starlight-theme-select> <label style="--sl-select-width: 6.25em" class="astro-xrbm3f6n"> <span class="sr-only astro-xrbm3f6n">Select theme</span> <svg aria-hidden="true" class="icon label-icon astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> <select autocomplete="off" class="astro-xrbm3f6n"> <option value="dark" class="astro-xrbm3f6n">Dark</option><option value="light" class="astro-xrbm3f6n">Light</option><option value="auto" selected class="astro-xrbm3f6n">Auto</option> </select> <svg aria-hidden="true" class="icon caret astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> </label> </starlight-theme-select> <script>
40
+ StarlightThemeProvider.updatePickers();
41
+ </script> <script type="module">const r="starlight-theme",o=e=>e==="auto"||e==="dark"||e==="light"?e:"auto",c=()=>o(typeof localStorage<"u"&&localStorage.getItem(r));function n(e){typeof localStorage<"u"&&localStorage.setItem(r,e==="light"||e==="dark"?e:"")}const l=()=>matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";function t(e){StarlightThemeProvider.updatePickers(e),document.documentElement.dataset.theme=e==="auto"?l():e,n(e)}matchMedia("(prefers-color-scheme: light)").addEventListener("change",()=>{c()==="auto"&&t("auto")});class s extends HTMLElement{constructor(){super(),t(c()),this.querySelector("select")?.addEventListener("change",a=>{a.currentTarget instanceof HTMLSelectElement&&t(o(a.currentTarget.value))})}}customElements.define("starlight-theme-select",s);</script> <script type="module">class s extends HTMLElement{constructor(){super();const e=this.querySelector("select");e&&(e.addEventListener("change",t=>{t.currentTarget instanceof HTMLSelectElement&&(window.location.pathname=t.currentTarget.value)}),window.addEventListener("pageshow",t=>{if(!t.persisted)return;const n=e.querySelector("option[selected]")?.index;n!==e.selectedIndex&&(e.selectedIndex=n??0)}))}}customElements.define("starlight-lang-select",s);</script> </div> </div></header> <nav class="sidebar print:hidden astro-4azfgxa5" aria-label="Main"> <starlight-menu-button class="print:hidden astro-5hpi47kq"> <button aria-expanded="false" aria-label="Menu" aria-controls="starlight__sidebar" class="sl-flex md:sl-hidden astro-5hpi47kq"> <svg aria-hidden="true" class="open-menu astro-5hpi47kq astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M3 8h18a1 1 0 1 0 0-2H3a1 1 0 0 0 0 2Zm18 8H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Zm0-5H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Z"/></svg> <svg aria-hidden="true" class="close-menu astro-5hpi47kq astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="m13.41 12 6.3-6.29a1.004 1.004 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1.004 1.004 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 0 1.42.998.998 0 0 0 1.42 0l6.29-6.3 6.29 6.3a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.42L13.41 12Z"/></svg> </button> </starlight-menu-button> <script type="module">class s extends HTMLElement{constructor(){super(),this.btn=this.querySelector("button"),this.btn.addEventListener("click",()=>this.toggleExpanded());const t=this.closest("nav");t&&t.addEventListener("keyup",e=>this.closeOnEscape(e))}setExpanded(t){this.setAttribute("aria-expanded",String(t)),document.body.toggleAttribute("data-mobile-menu-expanded",t)}toggleExpanded(){this.setExpanded(this.getAttribute("aria-expanded")!=="true")}closeOnEscape(t){t.code==="Escape"&&(this.setExpanded(!1),this.btn.focus())}}customElements.define("starlight-menu-button",s);</script> <div id="starlight__sidebar" class="sidebar-pane astro-4azfgxa5"> <div class="sidebar-content sl-flex astro-4azfgxa5"> <sl-sidebar-state-persist data-hash="0fmmri7" class="astro-buzsinug"> <script aria-hidden="true">
42
+ (() => {
43
+ try {
44
+ if (!matchMedia('(min-width: 50em)').matches) return;
45
+ /** @type {HTMLElement | null} */
46
+ const target = document.querySelector('sl-sidebar-state-persist');
47
+ const state = JSON.parse(sessionStorage.getItem('sl-sidebar-state') || '0');
48
+ if (!target || !state || target.dataset.hash !== state.hash) return;
49
+ window._starlightScrollRestore = state.scroll;
50
+ customElements.define(
51
+ 'sl-sidebar-restore',
52
+ class SidebarRestore extends HTMLElement {
53
+ connectedCallback() {
54
+ try {
55
+ const idx = parseInt(this.dataset.index || '');
56
+ const details = this.closest('details');
57
+ if (details && typeof state.open[idx] === 'boolean') details.open = state.open[idx];
58
+ } catch {}
59
+ }
60
+ }
61
+ );
62
+ } catch {}
63
+ })();
64
+ </script> <ul class="top-level astro-ftvsh3ht"> <li class="astro-ftvsh3ht"> <a href="/overview/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Overview</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/getting-started/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Getting Started</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/architecture/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Architecture</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/commands/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Commands</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/format/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">SPEC.json Format</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/tags/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Tags</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/checks/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Integrity Checks</span> </a> </li><li class="astro-ftvsh3ht"> <details open class="astro-ftvsh3ht"> <summary class="astro-ftvsh3ht"> <span class="group-label astro-ftvsh3ht"> <span class="large astro-ftvsh3ht">Guides</span> </span> <svg aria-hidden="true" class="caret astro-ftvsh3ht astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <sl-sidebar-restore data-index="0"></sl-sidebar-restore> <ul class="astro-ftvsh3ht"> <li class="astro-ftvsh3ht"> <a href="/guides/adoption/" aria-current="page" class="astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Adoption Guide</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/guides/platform-setup/" class="astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Platform Setup</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/guides/single-repo/" class="astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Single Repo (Rung 1)</span> </a> </li> </ul> </details> </li><li class="astro-ftvsh3ht"> <a href="/agent-reference/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Agent Reference</span> </a> </li> </ul> <script aria-hidden="true">
65
+ (() => {
66
+ const scroller = document.getElementById('starlight__sidebar');
67
+ if (!window._starlightScrollRestore || !scroller) return;
68
+ scroller.scrollTop = window._starlightScrollRestore;
69
+ delete window._starlightScrollRestore;
70
+ })();
71
+ </script> </sl-sidebar-state-persist> <div class="md:sl-hidden"> <div class="mobile-preferences sl-flex astro-q2jvmmon"> <div class="social-icons astro-q2jvmmon"> <a href="https://github.com/spec-engine/spec-engine" rel="me" class="sl-flex astro-7c53pyad"><span class="sr-only astro-7c53pyad">GitHub</span><svg aria-hidden="true" class="astro-7c53pyad astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg></a> </div> <starlight-theme-select> <label style="--sl-select-width: 6.25em" class="astro-xrbm3f6n"> <span class="sr-only astro-xrbm3f6n">Select theme</span> <svg aria-hidden="true" class="icon label-icon astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> <select autocomplete="off" class="astro-xrbm3f6n"> <option value="dark" class="astro-xrbm3f6n">Dark</option><option value="light" class="astro-xrbm3f6n">Light</option><option value="auto" selected class="astro-xrbm3f6n">Auto</option> </select> <svg aria-hidden="true" class="icon caret astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> </label> </starlight-theme-select> <script>
72
+ StarlightThemeProvider.updatePickers();
73
+ </script> </div> </div> </div> </div> </nav> <div class="main-frame astro-4azfgxa5"> <script type="module">const a=document.getElementById("starlight__sidebar"),n=a?.querySelector("sl-sidebar-state-persist"),o="sl-sidebar-state",i=()=>{let t=[];const e=n?.dataset.hash||"";try{const s=sessionStorage.getItem(o),r=JSON.parse(s||"{}");Array.isArray(r.open)&&r.hash===e&&(t=r.open)}catch{}return{hash:e,open:t,scroll:a?.scrollTop||0}},c=t=>{try{sessionStorage.setItem(o,JSON.stringify(t))}catch{}},d=()=>c(i()),l=(t,e)=>{const s=i();s.open[e]=t,c(s)};n?.addEventListener("click",t=>{if(!(t.target instanceof Element))return;const e=t.target.closest("summary")?.closest("details");if(!e)return;const s=e.querySelector("sl-sidebar-restore"),r=parseInt(s?.dataset.index||"");isNaN(r)||l(!e.open,r)});addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&d()});addEventListener("pageHide",d);</script> <div class="lg:sl-flex astro-7dbgj2gg"> <aside class="right-sidebar-container print:hidden astro-7dbgj2gg"> <div class="right-sidebar astro-7dbgj2gg"> <div class="lg:sl-hidden astro-ungkjbep"><mobile-starlight-toc data-min-h="2" data-max-h="3" class="astro-qoe4sryv"><nav aria-labelledby="starlight__on-this-page--mobile" class="astro-qoe4sryv"><details id="starlight__mobile-toc" class="astro-qoe4sryv"><summary id="starlight__on-this-page--mobile" class="sl-flex astro-qoe4sryv"><span class="toggle sl-flex astro-qoe4sryv">On this page<svg aria-hidden="true" class="caret astro-qoe4sryv astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></span><span class="display-current astro-qoe4sryv"></span></summary><div class="dropdown astro-qoe4sryv"><ul class="isMobile astro-mc3l7tuo" style="--depth: 0;"> <li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#_top" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Overview</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#rung-1-stop-re-explaining-to-the-ai" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Rung 1: Stop re-explaining to the AI</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#rung-2-prove-it" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Rung 2: Prove it</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#rung-3-coordinate-it" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Rung 3: Coordinate it</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#dogfooding-note" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Dogfooding note</span> </a> </li> </ul></div></details></nav></mobile-starlight-toc><script type="module" src="/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js"></script></div><div class="right-sidebar-panel sl-hidden lg:sl-block astro-ungkjbep"><div class="sl-container astro-ungkjbep"><starlight-toc data-min-h="2" data-max-h="3"><nav aria-labelledby="starlight__on-this-page"><h2 id="starlight__on-this-page">On this page</h2><ul class="astro-mc3l7tuo" style="--depth: 0;"> <li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#_top" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Overview</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#rung-1-stop-re-explaining-to-the-ai" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Rung 1: Stop re-explaining to the AI</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#rung-2-prove-it" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Rung 2: Prove it</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#rung-3-coordinate-it" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Rung 3: Coordinate it</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#dogfooding-note" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Dogfooding note</span> </a> </li> </ul></nav></starlight-toc><script type="module" src="/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js"></script></div></div> </div> </aside> <div class="main-pane astro-7dbgj2gg"> <main data-pagefind-body class="astro-hke2hksx" lang="en" dir="ltr"> <div class="content-panel astro-cwqdebiv"> <div class="sl-container astro-cwqdebiv"> <h1 id="_top" class="astro-jkmikw3m">Adoption Guide</h1> </div> </div> <div class="content-panel astro-cwqdebiv"> <div class="sl-container astro-cwqdebiv"> <div class="sl-markdown-content"> <p>Spec Engine is adopted one rung at a time.</p>
74
+ <div class="sl-heading-wrapper level-h2"><h2 id="rung-1-stop-re-explaining-to-the-ai">Rung 1: Stop re-explaining to the AI</h2><a class="sl-anchor-link" href="#rung-1-stop-re-explaining-to-the-ai"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore="">Section titled “Rung 1: Stop re-explaining to the AI”</span></a></div>
75
+ <p>Durable requirements the agent retrieves instead of you re-typing context every session. One repo, specs inline, zero ceremony — <code dir="auto">spec map</code>/<code dir="auto">check</code> work against a lone repo with no sibling members and no config.</p>
76
+ <p>Free, local.</p>
77
+ <div class="sl-heading-wrapper level-h2"><h2 id="rung-2-prove-it">Rung 2: Prove it</h2><a class="sl-anchor-link" href="#rung-2-prove-it"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore="">Section titled “Rung 2: Prove it”</span></a></div>
78
+ <p><code dir="auto">@spec</code> tags bind tests to requirements; <code dir="auto">spec check --ci</code> gates. Still one repo, free, local.</p>
79
+ <div class="sl-heading-wrapper level-h2"><h2 id="rung-3-coordinate-it">Rung 3: Coordinate it</h2><a class="sl-anchor-link" href="#rung-3-coordinate-it"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore="">Section titled “Rung 3: Coordinate it”</span></a></div>
80
+ <p>Promote specs to a dedicated <code dir="auto">spec-engine</code> repo; a requirement change is approved by merging it there, and a consuming repo’s PR is blocked until the requirement it depends on is approved upstream.</p>
81
+ <p>Multiplayer — paid.</p>
82
+ <div class="sl-heading-wrapper level-h2"><h2 id="dogfooding-note">Dogfooding note</h2><a class="sl-anchor-link" href="#dogfooding-note"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore="">Section titled “Dogfooding note”</span></a></div>
83
+ <p>This repo is its own platform (monorepo mode): the root <code dir="auto">spec-engine/</code> holds the requirement domains, and every <code dir="auto">packages/*</code> workspace member carries the <code dir="auto">@spec</code> tags that bind them — one coverage column per package via the <code dir="auto">"members": "*"</code> expansion in <code dir="auto">packages/spec-engine.member.json</code>.</p>
84
+ <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.v4551.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">$</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">map</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">.</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># the requirement × package coverage matrix</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">$</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">check</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">.</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--ci</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># the self-gate; CI runs this on every push</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">$</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">query</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#984E4D">approval gate</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">.</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#919F9F;--1:#5F636F"># ranked hits — the Gate term + GATE-006</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="$ spec map . # the requirement × package coverage matrix$ spec check . --ci # the self-gate; CI runs this on every push$ spec query &#x22;approval gate&#x22; . # ranked hits — the Gate term + GATE-006"><div></div></button></div></figure></div> </div> <footer class="sl-flex astro-g7gasbrj"> <div class="meta sl-flex astro-g7gasbrj"> <a href="https://github.com/spec-engine/spec-engine/edit/main/packages/site/src/content/docs/guides/adoption.md" class="sl-flex print:hidden astro-tr6myc4c"><svg aria-hidden="true" class="astro-tr6myc4c astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.2em;"><path d="M22 7.24a1 1 0 0 0-.29-.71l-4.24-4.24a1 1 0 0 0-1.1-.22 1 1 0 0 0-.32.22l-2.83 2.83L2.29 16.05a1 1 0 0 0-.29.71V21a1 1 0 0 0 1 1h4.24a1 1 0 0 0 .76-.29l10.87-10.93L21.71 8c.1-.1.17-.2.22-.33a1 1 0 0 0 0-.24v-.14l.07-.05ZM6.83 20H4v-2.83l9.93-9.93 2.83 2.83L6.83 20ZM18.17 8.66l-2.83-2.83 1.42-1.41 2.82 2.82-1.41 1.42Z"/></svg>Edit page</a> </div> <div class="pagination-links print:hidden astro-iud5vnm7" dir="ltr"> <a href="/checks/" rel="prev" class="astro-iud5vnm7"> <svg aria-hidden="true" class="astro-iud5vnm7 astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.5rem;"><path d="M17 11H9.41l3.3-3.29a1.004 1.004 0 1 0-1.42-1.42l-5 5a1 1 0 0 0-.21.33 1 1 0 0 0 0 .76 1 1 0 0 0 .21.33l5 5a1.002 1.002 0 0 0 1.639-.325 1 1 0 0 0-.219-1.095L9.41 13H17a1 1 0 0 0 0-2Z"/></svg> <span class="astro-iud5vnm7"> Previous <br class="astro-iud5vnm7"> <span class="link-title astro-iud5vnm7">Integrity Checks</span> </span> </a> <a href="/guides/platform-setup/" rel="next" class="astro-iud5vnm7"> <svg aria-hidden="true" class="astro-iud5vnm7 astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.5rem;"><path d="M17.92 11.62a1.001 1.001 0 0 0-.21-.33l-5-5a1.003 1.003 0 1 0-1.42 1.42l3.3 3.29H7a1 1 0 0 0 0 2h7.59l-3.3 3.29a1.002 1.002 0 0 0 .325 1.639 1 1 0 0 0 1.095-.219l5-5a1 1 0 0 0 .21-.33 1 1 0 0 0 0-.76Z"/></svg> <span class="astro-iud5vnm7"> Next <br class="astro-iud5vnm7"> <span class="link-title astro-iud5vnm7">Platform Setup</span> </span> </a> </div> </footer> </div> </div> </main> </div> </div> </div> </div> </body></html>
@@ -0,0 +1,95 @@
1
+ <!DOCTYPE html><html lang="en" dir="ltr" data-theme="dark" data-has-toc data-has-sidebar class="astro-hke2hksx"> <head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Platform Setup | Spec Engine</title><link rel="canonical" href="https://docs.spec-engine.dev/guides/platform-setup/"/><link rel="sitemap" href="/sitemap-index.xml"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="true"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Archivo:wght@600;700;800;900&amp;family=IBM+Plex+Mono:wght@400;500;600&amp;family=IBM+Plex+Sans:wght@400;500;600&amp;display=swap"/><link rel="icon" href="/favicon.ico" sizes="any"/><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png"/><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png"/><link rel="apple-touch-icon" sizes="180x180" href="/favicon-180.png"/><link rel="manifest" href="/site.webmanifest"/><link rel="shortcut icon" href="/favicon.svg" type="image/svg+xml"/><meta name="generator" content="Astro v6.4.8"/><meta name="generator" content="Starlight v0.40.0"/><meta property="og:title" content="Platform Setup"/><meta property="og:type" content="article"/><meta property="og:url" content="https://docs.spec-engine.dev/guides/platform-setup/"/><meta property="og:locale" content="en"/><meta property="og:description" content="Set up a multi-repo platform from scratch"/><meta property="og:site_name" content="Spec Engine"/><meta name="twitter:card" content="summary_large_image"/><meta name="description" content="Set up a multi-repo platform from scratch"/><meta name="theme-color" content="#0F1214"/><meta property="og:image" content="https://docs.spec-engine.dev/og-spec-engine-docs.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta name="twitter:image" content="https://docs.spec-engine.dev/og-spec-engine-docs.png"/><script>
2
+ window.StarlightThemeProvider = (() => {
3
+ const storedTheme =
4
+ typeof localStorage !== 'undefined' && localStorage.getItem('starlight-theme');
5
+ const theme =
6
+ storedTheme ||
7
+ (window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');
8
+ document.documentElement.dataset.theme = theme === 'light' ? 'light' : 'dark';
9
+ return {
10
+ updatePickers(theme = storedTheme || 'auto') {
11
+ document.querySelectorAll('starlight-theme-select').forEach((picker) => {
12
+ const select = picker.querySelector('select');
13
+ if (select) select.value = theme;
14
+ /** @type {HTMLTemplateElement | null} */
15
+ const tmpl = document.querySelector(`#theme-icons`);
16
+ const newIcon = tmpl && tmpl.content.querySelector('.' + theme);
17
+ if (newIcon) {
18
+ const oldIcon = picker.querySelector('svg.label-icon');
19
+ if (oldIcon) {
20
+ oldIcon.replaceChildren(...newIcon.cloneNode(true).childNodes);
21
+ }
22
+ }
23
+ });
24
+ },
25
+ };
26
+ })();
27
+ </script><template id="theme-icons"><svg aria-hidden="true" class="light astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M5 12a1 1 0 0 0-1-1H3a1 1 0 0 0 0 2h1a1 1 0 0 0 1-1Zm.64 5-.71.71a1 1 0 0 0 0 1.41 1 1 0 0 0 1.41 0l.71-.71A1 1 0 0 0 5.64 17ZM12 5a1 1 0 0 0 1-1V3a1 1 0 0 0-2 0v1a1 1 0 0 0 1 1Zm5.66 2.34a1 1 0 0 0 .7-.29l.71-.71a1 1 0 1 0-1.41-1.41l-.66.71a1 1 0 0 0 0 1.41 1 1 0 0 0 .66.29Zm-12-.29a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.71-.71a1.004 1.004 0 1 0-1.43 1.41l.73.71ZM21 11h-1a1 1 0 0 0 0 2h1a1 1 0 0 0 0-2Zm-2.64 6A1 1 0 0 0 17 18.36l.71.71a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.76-.66ZM12 6.5a5.5 5.5 0 1 0 5.5 5.5A5.51 5.51 0 0 0 12 6.5Zm0 9a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7Zm0 3.5a1 1 0 0 0-1 1v1a1 1 0 0 0 2 0v-1a1 1 0 0 0-1-1Z"/></svg><svg aria-hidden="true" class="dark astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.64 13a1 1 0 0 0-1.05-.14 8.049 8.049 0 0 1-3.37.73 8.15 8.15 0 0 1-8.14-8.1 8.59 8.59 0 0 1 .25-2A1 1 0 0 0 8 2.36a10.14 10.14 0 1 0 14 11.69 1 1 0 0 0-.36-1.05Zm-9.5 6.69A8.14 8.14 0 0 1 7.08 5.22v.27a10.15 10.15 0 0 0 10.14 10.14 9.784 9.784 0 0 0 2.1-.22 8.11 8.11 0 0 1-7.18 4.32v-.04Z"/></svg><svg aria-hidden="true" class="auto astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg></template><link rel="stylesheet" href="/_astro/print.DNXP8c50.css" media="print"><link rel="stylesheet" href="/_astro/common.xlUlWolS.css"><link rel="stylesheet" href="/_astro/Code.DfIJP77p.css"><script type="module" src="/_astro/page.B_tncCx8.js"></script></head> <body class="astro-hke2hksx"> <a href="#_top" class="astro-ln4bs55d">Skip to content</a> <div class="page sl-flex astro-4azfgxa5"> <header class="header astro-4azfgxa5"><div class="header astro-huokaw3t"> <div class="title-wrapper sl-flex astro-huokaw3t"> <a href="/" class="site-title sl-flex astro-pf7uwcts"> <img class="light:sl-hidden print:hidden astro-pf7uwcts" alt="Spec Engine" src="/_astro/spec-mark-white.DJBFLLUP.svg" width="512" height="512"> <img class="dark:sl-hidden print:block astro-pf7uwcts" alt="Spec Engine" src="/_astro/spec-mark-black.ZCN22lJi.svg" width="512" height="512"> <span class="astro-pf7uwcts" translate="no"> Spec Engine </span> </a> </div> <div class="sl-flex print:hidden astro-huokaw3t"> <site-search class="astro-huokaw3t astro-6oz6ysne" data-translations="{&quot;placeholder&quot;:&quot;Search&quot;}"> <button data-open-modal disabled aria-label="Search" aria-keyshortcuts="Control+K" class="astro-6oz6ysne"> <svg aria-hidden="true" class="astro-6oz6ysne astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.71 20.29 18 16.61A9 9 0 1 0 16.61 18l3.68 3.68a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.39ZM11 18a7 7 0 1 1 0-14 7 7 0 0 1 0 14Z"/></svg> <span class="sl-hidden md:sl-block astro-6oz6ysne" aria-hidden="true">Search</span> <kbd class="sl-hidden md:sl-flex astro-6oz6ysne" style="display: none;"> <kbd class="astro-6oz6ysne">Ctrl</kbd><kbd class="astro-6oz6ysne">K</kbd> </kbd> </button> <dialog style="padding:0" aria-label="Search" class="astro-6oz6ysne"> <div class="dialog-frame sl-flex astro-6oz6ysne"> <button data-close-modal class="sl-flex md:sl-hidden astro-6oz6ysne"> Cancel </button> <div class="search-container astro-6oz6ysne"> <div id="starlight__search" class="astro-6oz6ysne"></div> </div> </div> </dialog> </site-search> <script>
28
+ (() => {
29
+ const openBtn = document.querySelector('button[data-open-modal]');
30
+ const shortcut = openBtn?.querySelector('kbd');
31
+ if (!openBtn || !(shortcut instanceof HTMLElement)) return;
32
+ const platformKey = shortcut.querySelector('kbd');
33
+ if (platformKey && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)) {
34
+ platformKey.textContent = '⌘';
35
+ openBtn.setAttribute('aria-keyshortcuts', 'Meta+K');
36
+ }
37
+ shortcut.style.display = '';
38
+ })();
39
+ </script> <script type="module" src="/_astro/Search.astro_astro_type_script_index_0_lang.lq3t8uE2.js"></script> </div> <div class="sl-hidden md:sl-flex print:hidden right-group astro-huokaw3t"> <div class="sl-flex social-icons astro-huokaw3t"> <a href="https://github.com/spec-engine/spec-engine" rel="me" class="sl-flex astro-7c53pyad"><span class="sr-only astro-7c53pyad">GitHub</span><svg aria-hidden="true" class="astro-7c53pyad astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg></a> </div> <starlight-theme-select> <label style="--sl-select-width: 6.25em" class="astro-xrbm3f6n"> <span class="sr-only astro-xrbm3f6n">Select theme</span> <svg aria-hidden="true" class="icon label-icon astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> <select autocomplete="off" class="astro-xrbm3f6n"> <option value="dark" class="astro-xrbm3f6n">Dark</option><option value="light" class="astro-xrbm3f6n">Light</option><option value="auto" selected class="astro-xrbm3f6n">Auto</option> </select> <svg aria-hidden="true" class="icon caret astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> </label> </starlight-theme-select> <script>
40
+ StarlightThemeProvider.updatePickers();
41
+ </script> <script type="module">const r="starlight-theme",o=e=>e==="auto"||e==="dark"||e==="light"?e:"auto",c=()=>o(typeof localStorage<"u"&&localStorage.getItem(r));function n(e){typeof localStorage<"u"&&localStorage.setItem(r,e==="light"||e==="dark"?e:"")}const l=()=>matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";function t(e){StarlightThemeProvider.updatePickers(e),document.documentElement.dataset.theme=e==="auto"?l():e,n(e)}matchMedia("(prefers-color-scheme: light)").addEventListener("change",()=>{c()==="auto"&&t("auto")});class s extends HTMLElement{constructor(){super(),t(c()),this.querySelector("select")?.addEventListener("change",a=>{a.currentTarget instanceof HTMLSelectElement&&t(o(a.currentTarget.value))})}}customElements.define("starlight-theme-select",s);</script> <script type="module">class s extends HTMLElement{constructor(){super();const e=this.querySelector("select");e&&(e.addEventListener("change",t=>{t.currentTarget instanceof HTMLSelectElement&&(window.location.pathname=t.currentTarget.value)}),window.addEventListener("pageshow",t=>{if(!t.persisted)return;const n=e.querySelector("option[selected]")?.index;n!==e.selectedIndex&&(e.selectedIndex=n??0)}))}}customElements.define("starlight-lang-select",s);</script> </div> </div></header> <nav class="sidebar print:hidden astro-4azfgxa5" aria-label="Main"> <starlight-menu-button class="print:hidden astro-5hpi47kq"> <button aria-expanded="false" aria-label="Menu" aria-controls="starlight__sidebar" class="sl-flex md:sl-hidden astro-5hpi47kq"> <svg aria-hidden="true" class="open-menu astro-5hpi47kq astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M3 8h18a1 1 0 1 0 0-2H3a1 1 0 0 0 0 2Zm18 8H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Zm0-5H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Z"/></svg> <svg aria-hidden="true" class="close-menu astro-5hpi47kq astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="m13.41 12 6.3-6.29a1.004 1.004 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1.004 1.004 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 0 1.42.998.998 0 0 0 1.42 0l6.29-6.3 6.29 6.3a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.42L13.41 12Z"/></svg> </button> </starlight-menu-button> <script type="module">class s extends HTMLElement{constructor(){super(),this.btn=this.querySelector("button"),this.btn.addEventListener("click",()=>this.toggleExpanded());const t=this.closest("nav");t&&t.addEventListener("keyup",e=>this.closeOnEscape(e))}setExpanded(t){this.setAttribute("aria-expanded",String(t)),document.body.toggleAttribute("data-mobile-menu-expanded",t)}toggleExpanded(){this.setExpanded(this.getAttribute("aria-expanded")!=="true")}closeOnEscape(t){t.code==="Escape"&&(this.setExpanded(!1),this.btn.focus())}}customElements.define("starlight-menu-button",s);</script> <div id="starlight__sidebar" class="sidebar-pane astro-4azfgxa5"> <div class="sidebar-content sl-flex astro-4azfgxa5"> <sl-sidebar-state-persist data-hash="0fmmri7" class="astro-buzsinug"> <script aria-hidden="true">
42
+ (() => {
43
+ try {
44
+ if (!matchMedia('(min-width: 50em)').matches) return;
45
+ /** @type {HTMLElement | null} */
46
+ const target = document.querySelector('sl-sidebar-state-persist');
47
+ const state = JSON.parse(sessionStorage.getItem('sl-sidebar-state') || '0');
48
+ if (!target || !state || target.dataset.hash !== state.hash) return;
49
+ window._starlightScrollRestore = state.scroll;
50
+ customElements.define(
51
+ 'sl-sidebar-restore',
52
+ class SidebarRestore extends HTMLElement {
53
+ connectedCallback() {
54
+ try {
55
+ const idx = parseInt(this.dataset.index || '');
56
+ const details = this.closest('details');
57
+ if (details && typeof state.open[idx] === 'boolean') details.open = state.open[idx];
58
+ } catch {}
59
+ }
60
+ }
61
+ );
62
+ } catch {}
63
+ })();
64
+ </script> <ul class="top-level astro-ftvsh3ht"> <li class="astro-ftvsh3ht"> <a href="/overview/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Overview</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/getting-started/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Getting Started</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/architecture/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Architecture</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/commands/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Commands</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/format/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">SPEC.json Format</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/tags/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Tags</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/checks/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Integrity Checks</span> </a> </li><li class="astro-ftvsh3ht"> <details open class="astro-ftvsh3ht"> <summary class="astro-ftvsh3ht"> <span class="group-label astro-ftvsh3ht"> <span class="large astro-ftvsh3ht">Guides</span> </span> <svg aria-hidden="true" class="caret astro-ftvsh3ht astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <sl-sidebar-restore data-index="0"></sl-sidebar-restore> <ul class="astro-ftvsh3ht"> <li class="astro-ftvsh3ht"> <a href="/guides/adoption/" class="astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Adoption Guide</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/guides/platform-setup/" aria-current="page" class="astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Platform Setup</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/guides/single-repo/" class="astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Single Repo (Rung 1)</span> </a> </li> </ul> </details> </li><li class="astro-ftvsh3ht"> <a href="/agent-reference/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Agent Reference</span> </a> </li> </ul> <script aria-hidden="true">
65
+ (() => {
66
+ const scroller = document.getElementById('starlight__sidebar');
67
+ if (!window._starlightScrollRestore || !scroller) return;
68
+ scroller.scrollTop = window._starlightScrollRestore;
69
+ delete window._starlightScrollRestore;
70
+ })();
71
+ </script> </sl-sidebar-state-persist> <div class="md:sl-hidden"> <div class="mobile-preferences sl-flex astro-q2jvmmon"> <div class="social-icons astro-q2jvmmon"> <a href="https://github.com/spec-engine/spec-engine" rel="me" class="sl-flex astro-7c53pyad"><span class="sr-only astro-7c53pyad">GitHub</span><svg aria-hidden="true" class="astro-7c53pyad astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg></a> </div> <starlight-theme-select> <label style="--sl-select-width: 6.25em" class="astro-xrbm3f6n"> <span class="sr-only astro-xrbm3f6n">Select theme</span> <svg aria-hidden="true" class="icon label-icon astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> <select autocomplete="off" class="astro-xrbm3f6n"> <option value="dark" class="astro-xrbm3f6n">Dark</option><option value="light" class="astro-xrbm3f6n">Light</option><option value="auto" selected class="astro-xrbm3f6n">Auto</option> </select> <svg aria-hidden="true" class="icon caret astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> </label> </starlight-theme-select> <script>
72
+ StarlightThemeProvider.updatePickers();
73
+ </script> </div> </div> </div> </div> </nav> <div class="main-frame astro-4azfgxa5"> <script type="module">const a=document.getElementById("starlight__sidebar"),n=a?.querySelector("sl-sidebar-state-persist"),o="sl-sidebar-state",i=()=>{let t=[];const e=n?.dataset.hash||"";try{const s=sessionStorage.getItem(o),r=JSON.parse(s||"{}");Array.isArray(r.open)&&r.hash===e&&(t=r.open)}catch{}return{hash:e,open:t,scroll:a?.scrollTop||0}},c=t=>{try{sessionStorage.setItem(o,JSON.stringify(t))}catch{}},d=()=>c(i()),l=(t,e)=>{const s=i();s.open[e]=t,c(s)};n?.addEventListener("click",t=>{if(!(t.target instanceof Element))return;const e=t.target.closest("summary")?.closest("details");if(!e)return;const s=e.querySelector("sl-sidebar-restore"),r=parseInt(s?.dataset.index||"");isNaN(r)||l(!e.open,r)});addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&d()});addEventListener("pageHide",d);</script> <div class="lg:sl-flex astro-7dbgj2gg"> <aside class="right-sidebar-container print:hidden astro-7dbgj2gg"> <div class="right-sidebar astro-7dbgj2gg"> <div class="lg:sl-hidden astro-ungkjbep"><mobile-starlight-toc data-min-h="2" data-max-h="3" class="astro-qoe4sryv"><nav aria-labelledby="starlight__on-this-page--mobile" class="astro-qoe4sryv"><details id="starlight__mobile-toc" class="astro-qoe4sryv"><summary id="starlight__on-this-page--mobile" class="sl-flex astro-qoe4sryv"><span class="toggle sl-flex astro-qoe4sryv">On this page<svg aria-hidden="true" class="caret astro-qoe4sryv astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></span><span class="display-current astro-qoe4sryv"></span></summary><div class="dropdown astro-qoe4sryv"><ul class="isMobile astro-mc3l7tuo" style="--depth: 0;"> <li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#_top" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Overview</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#step-1-create-the-domain-and-its-first-requirement" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Step 1: Create the domain and its first requirement</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#step-2-add-a-member" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Step 2: Add a member</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#step-3-pin-and-index" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Step 3: Pin and index</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#next-steps" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Next steps</span> </a> </li> </ul></div></details></nav></mobile-starlight-toc><script type="module" src="/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js"></script></div><div class="right-sidebar-panel sl-hidden lg:sl-block astro-ungkjbep"><div class="sl-container astro-ungkjbep"><starlight-toc data-min-h="2" data-max-h="3"><nav aria-labelledby="starlight__on-this-page"><h2 id="starlight__on-this-page">On this page</h2><ul class="astro-mc3l7tuo" style="--depth: 0;"> <li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#_top" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Overview</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#step-1-create-the-domain-and-its-first-requirement" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Step 1: Create the domain and its first requirement</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#step-2-add-a-member" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Step 2: Add a member</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#step-3-pin-and-index" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Step 3: Pin and index</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#next-steps" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Next steps</span> </a> </li> </ul></nav></starlight-toc><script type="module" src="/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js"></script></div></div> </div> </aside> <div class="main-pane astro-7dbgj2gg"> <main data-pagefind-body class="astro-hke2hksx" lang="en" dir="ltr"> <div class="content-panel astro-cwqdebiv"> <div class="sl-container astro-cwqdebiv"> <h1 id="_top" class="astro-jkmikw3m">Platform Setup</h1> </div> </div> <div class="content-panel astro-cwqdebiv"> <div class="sl-container astro-cwqdebiv"> <div class="sl-markdown-content"> <p>A platform is a directory holding a canonical <code dir="auto">spec-engine/</code> folder plus one or more member repos beside it. Every step below is a CLI command — you never hand-write JSON.</p>
74
+ <div class="sl-heading-wrapper level-h2"><h2 id="step-1-create-the-domain-and-its-first-requirement">Step 1: Create the domain and its first requirement</h2><a class="sl-anchor-link" href="#step-1-create-the-domain-and-its-first-requirement"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore="">Section titled “Step 1: Create the domain and its first requirement”</span></a></div>
75
+ <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.v4551.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">$</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">domain</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">new</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">ORDERS</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">created</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec-engine/ORDERS/SPEC.json</span></div></div><div class="ec-line"><div class="code">
76
+ </div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">$</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">req</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">orders</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3B61B0">--text</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#984E4D">An order total equals the sum of its line items.</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#F78C6C;--1:#AA0982">\</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#82AAFF;--1:#3B61B0">--why</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#984E4D">Mispriced orders ship money out the door silently.</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#F78C6C;--1:#AA0982">\</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#82AAFF;--1:#3B61B0">--lives</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#984E4D">checkout/src/total.ts</span><span style="--0:#D9F5DD;--1:#111111">"</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">appended</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">ORDERS-001</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">to</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec-engine/ORDERS/SPEC.json</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="$ spec domain new ORDERScreated spec-engine/ORDERS/SPEC.json$ spec req orders --text &#x22;An order total equals the sum of its line items.&#x22; \ --why &#x22;Mispriced orders ship money out the door silently.&#x22; \ --lives &#x22;checkout/src/total.ts&#x22;appended ORDERS-001 to spec-engine/ORDERS/SPEC.json"><div></div></button></div></figure></div>
77
+ <p><code dir="auto">spec req</code> appends a born-active entry through the same validated write seam every surface uses. The result on disk:</p>
78
+ <div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="json"><code><div class="ec-line"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#7FDBCA;--1:#096E72">"key"</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C789D6;--1:#7C5686">ORDERS</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#7FDBCA;--1:#096E72">"owner"</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#FF6A83;--1:#A24848">null</span><span style="--0:#D6DEEB;--1:#403F53">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#7FDBCA;--1:#096E72">"updated"</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C789D6;--1:#7C5686">2026-07-16</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#7FDBCA;--1:#096E72">"requirements"</span><span style="--0:#D6DEEB;--1:#403F53">: [</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#7FDBCA;--1:#096E72">"id"</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C789D6;--1:#7C5686">ORDERS-001</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#7FDBCA;--1:#096E72">"status"</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C789D6;--1:#7C5686">active</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#7FDBCA;--1:#096E72">"statement"</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C789D6;--1:#7C5686">An order total equals the sum of its line items.</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#7FDBCA;--1:#096E72">"why"</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C789D6;--1:#7C5686">Mispriced orders ship money out the door silently.</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#7FDBCA;--1:#096E72">"livesIn"</span><span style="--0:#D6DEEB;--1:#403F53">: [</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C789D6;--1:#7C5686">checkout/src/total.ts</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">]</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">}</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">}</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="{ &#x22;key&#x22;: &#x22;ORDERS&#x22;, &#x22;owner&#x22;: null, &#x22;updated&#x22;: &#x22;2026-07-16&#x22;, &#x22;requirements&#x22;: [ { &#x22;id&#x22;: &#x22;ORDERS-001&#x22;, &#x22;status&#x22;: &#x22;active&#x22;, &#x22;statement&#x22;: &#x22;An order total equals the sum of its line items.&#x22;, &#x22;why&#x22;: &#x22;Mispriced orders ship money out the door silently.&#x22;, &#x22;livesIn&#x22;: [&#x22;checkout/src/total.ts&#x22;] } ]}"><div></div></button></div></figure></div>
79
+ <p>Note there is no version counter in the file — the domain’s version is derived from its supersede history.</p>
80
+ <div class="sl-heading-wrapper level-h2"><h2 id="step-2-add-a-member">Step 2: Add a member</h2><a class="sl-anchor-link" href="#step-2-add-a-member"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore="">Section titled “Step 2: Add a member”</span></a></div>
81
+ <p>Beside <code dir="auto">spec-engine/</code>, make a <code dir="auto">checkout/</code> repo with tagged files:</p>
82
+ <div class="expressive-code"><figure class="frame has-title not-content"><figcaption class="header"><span class="title">checkout/src/total.ts</span></figcaption><pre data-language="ts"><code><div class="ec-line"><div class="code"><span style="--0:#C792EA;--1:#8844AE">export const </span><span style="--0:#82AAFF;--1:#3B61B0">total</span><span style="--0:#C792EA;--1:#8844AE"> = </span><span style="--0:#F78C6C;--1:#AA0982">0</span><span style="--0:#D6DEEB;--1:#403F53">; </span><span style="--0:#919F9F;--1:#5D6376">// @spec ORDERS-001</span></div></div><div class="ec-line"><div class="code">
83
+ </div></div><div class="ec-line"><div class="code"><span style="--0:#919F9F;--1:#5D6376">// checkout/test/total.test.ts</span></div></div><div class="ec-line"><div class="code"><span style="--0:#C792EA;--1:#8844AE">export const </span><span style="--0:#82AAFF;--1:#3B61B0">t</span><span style="--0:#C792EA;--1:#8844AE"> = </span><span style="--0:#F78C6C;--1:#AA0982">1</span><span style="--0:#D6DEEB;--1:#403F53">; </span><span style="--0:#919F9F;--1:#5D6376">// @spec ORDERS-001 unit</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="export const total = 0; // @spec ORDERS-001// checkout/test/total.test.tsexport const t = 1; // @spec ORDERS-001 unit"><div></div></button></div></figure></div>
84
+ <div class="sl-heading-wrapper level-h2"><h2 id="step-3-pin-and-index">Step 3: Pin and index</h2><a class="sl-anchor-link" href="#step-3-pin-and-index"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore="">Section titled “Step 3: Pin and index”</span></a></div>
85
+ <div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">$</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">init</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">checkout</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">init:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">wrote</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">checkout/spec-engine.member.json</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#82AAFF;--1:#3B61B0">pin:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec-engine@1</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#C5E478;--1:#3B61B0">source</span><span style="--0:#ECC48D;--1:#3B61B0">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">derived</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">platform</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">version</span><span style="--0:#D6DEEB;--1:#403F53"> (max </span><span style="--0:#ECC48D;--1:#3B61B0">domain</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">version</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#F78C6C;--1:#AA0982">1</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">at</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">…</span><span style="--0:#D6DEEB;--1:#403F53">)</span></div></div><div class="ec-line"><div class="code">
86
+ </div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">$</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">index</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">$</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">map</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">DOMAIN</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">REQUIREMENT</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">STATUS</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">checkout</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec-engine</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">ORDERS</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">ORDERS-001</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">Active</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">src+test</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">—</span></div></div><div class="ec-line"><div class="code">
87
+ </div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">$</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">check</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="$ spec init checkoutspec init: wrote checkout/spec-engine.member.json pin: spec-engine@1 source: derived platform version (max domain version 1 at …)$ spec index$ spec mapDOMAIN REQUIREMENT STATUS checkout spec-engineORDERS ORDERS-001 Active src+test —$ spec check"><div></div></button></div></figure></div>
88
+ <p>The default pin is the <strong>derived platform version</strong> — the max of the domains’ derived versions — so a fresh member is born current. As requirements supersede, the domain version advances; a member still pinned behind lights up as <code dir="auto">DRIFT</code> for the requirements it actually references.</p>
89
+ <div class="sl-heading-wrapper level-h2"><h2 id="next-steps">Next steps</h2><a class="sl-anchor-link" href="#next-steps"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore="">Section titled “Next steps”</span></a></div>
90
+ <ul>
91
+ <li>Add <code dir="auto">@spec</code> tags as you touch code — no big migration</li>
92
+ <li>Put <code dir="auto">spec check --ci</code> in your CI gate, and <code dir="auto">spec guard</code> in pre-commit for loss detection</li>
93
+ <li>Point your agent at <code dir="auto">spec query</code> / <code dir="auto">spec resolve</code> (or <code dir="auto">spec mcp</code>) so it retrieves requirements</li>
94
+ <li>Promote to a dedicated <code dir="auto">spec-engine</code> repo when you go multi-repo</li>
95
+ </ul> </div> <footer class="sl-flex astro-g7gasbrj"> <div class="meta sl-flex astro-g7gasbrj"> <a href="https://github.com/spec-engine/spec-engine/edit/main/packages/site/src/content/docs/guides/platform-setup.md" class="sl-flex print:hidden astro-tr6myc4c"><svg aria-hidden="true" class="astro-tr6myc4c astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.2em;"><path d="M22 7.24a1 1 0 0 0-.29-.71l-4.24-4.24a1 1 0 0 0-1.1-.22 1 1 0 0 0-.32.22l-2.83 2.83L2.29 16.05a1 1 0 0 0-.29.71V21a1 1 0 0 0 1 1h4.24a1 1 0 0 0 .76-.29l10.87-10.93L21.71 8c.1-.1.17-.2.22-.33a1 1 0 0 0 0-.24v-.14l.07-.05ZM6.83 20H4v-2.83l9.93-9.93 2.83 2.83L6.83 20ZM18.17 8.66l-2.83-2.83 1.42-1.41 2.82 2.82-1.41 1.42Z"/></svg>Edit page</a> </div> <div class="pagination-links print:hidden astro-iud5vnm7" dir="ltr"> <a href="/guides/adoption/" rel="prev" class="astro-iud5vnm7"> <svg aria-hidden="true" class="astro-iud5vnm7 astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.5rem;"><path d="M17 11H9.41l3.3-3.29a1.004 1.004 0 1 0-1.42-1.42l-5 5a1 1 0 0 0-.21.33 1 1 0 0 0 0 .76 1 1 0 0 0 .21.33l5 5a1.002 1.002 0 0 0 1.639-.325 1 1 0 0 0-.219-1.095L9.41 13H17a1 1 0 0 0 0-2Z"/></svg> <span class="astro-iud5vnm7"> Previous <br class="astro-iud5vnm7"> <span class="link-title astro-iud5vnm7">Adoption Guide</span> </span> </a> <a href="/guides/single-repo/" rel="next" class="astro-iud5vnm7"> <svg aria-hidden="true" class="astro-iud5vnm7 astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.5rem;"><path d="M17.92 11.62a1.001 1.001 0 0 0-.21-.33l-5-5a1.003 1.003 0 1 0-1.42 1.42l3.3 3.29H7a1 1 0 0 0 0 2h7.59l-3.3 3.29a1.002 1.002 0 0 0 .325 1.639 1 1 0 0 0 1.095-.219l5-5a1 1 0 0 0 .21-.33 1 1 0 0 0 0-.76Z"/></svg> <span class="astro-iud5vnm7"> Next <br class="astro-iud5vnm7"> <span class="link-title astro-iud5vnm7">Single Repo (Rung 1)</span> </span> </a> </div> </footer> </div> </div> </main> </div> </div> </div> </div> </body></html>
@@ -0,0 +1,82 @@
1
+ <!DOCTYPE html><html lang="en" dir="ltr" data-theme="dark" data-has-toc data-has-sidebar class="astro-hke2hksx"> <head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Single Repo (Rung 1) | Spec Engine</title><link rel="canonical" href="https://docs.spec-engine.dev/guides/single-repo/"/><link rel="sitemap" href="/sitemap-index.xml"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="true"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Archivo:wght@600;700;800;900&amp;family=IBM+Plex+Mono:wght@400;500;600&amp;family=IBM+Plex+Sans:wght@400;500;600&amp;display=swap"/><link rel="icon" href="/favicon.ico" sizes="any"/><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png"/><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png"/><link rel="apple-touch-icon" sizes="180x180" href="/favicon-180.png"/><link rel="manifest" href="/site.webmanifest"/><link rel="shortcut icon" href="/favicon.svg" type="image/svg+xml"/><meta name="generator" content="Astro v6.4.8"/><meta name="generator" content="Starlight v0.40.0"/><meta property="og:title" content="Single Repo (Rung 1)"/><meta property="og:type" content="article"/><meta property="og:url" content="https://docs.spec-engine.dev/guides/single-repo/"/><meta property="og:locale" content="en"/><meta property="og:description" content="Getting started with one repo, specs inline, zero ceremony"/><meta property="og:site_name" content="Spec Engine"/><meta name="twitter:card" content="summary_large_image"/><meta name="description" content="Getting started with one repo, specs inline, zero ceremony"/><meta name="theme-color" content="#0F1214"/><meta property="og:image" content="https://docs.spec-engine.dev/og-spec-engine-docs.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta name="twitter:image" content="https://docs.spec-engine.dev/og-spec-engine-docs.png"/><script>
2
+ window.StarlightThemeProvider = (() => {
3
+ const storedTheme =
4
+ typeof localStorage !== 'undefined' && localStorage.getItem('starlight-theme');
5
+ const theme =
6
+ storedTheme ||
7
+ (window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');
8
+ document.documentElement.dataset.theme = theme === 'light' ? 'light' : 'dark';
9
+ return {
10
+ updatePickers(theme = storedTheme || 'auto') {
11
+ document.querySelectorAll('starlight-theme-select').forEach((picker) => {
12
+ const select = picker.querySelector('select');
13
+ if (select) select.value = theme;
14
+ /** @type {HTMLTemplateElement | null} */
15
+ const tmpl = document.querySelector(`#theme-icons`);
16
+ const newIcon = tmpl && tmpl.content.querySelector('.' + theme);
17
+ if (newIcon) {
18
+ const oldIcon = picker.querySelector('svg.label-icon');
19
+ if (oldIcon) {
20
+ oldIcon.replaceChildren(...newIcon.cloneNode(true).childNodes);
21
+ }
22
+ }
23
+ });
24
+ },
25
+ };
26
+ })();
27
+ </script><template id="theme-icons"><svg aria-hidden="true" class="light astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M5 12a1 1 0 0 0-1-1H3a1 1 0 0 0 0 2h1a1 1 0 0 0 1-1Zm.64 5-.71.71a1 1 0 0 0 0 1.41 1 1 0 0 0 1.41 0l.71-.71A1 1 0 0 0 5.64 17ZM12 5a1 1 0 0 0 1-1V3a1 1 0 0 0-2 0v1a1 1 0 0 0 1 1Zm5.66 2.34a1 1 0 0 0 .7-.29l.71-.71a1 1 0 1 0-1.41-1.41l-.66.71a1 1 0 0 0 0 1.41 1 1 0 0 0 .66.29Zm-12-.29a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.71-.71a1.004 1.004 0 1 0-1.43 1.41l.73.71ZM21 11h-1a1 1 0 0 0 0 2h1a1 1 0 0 0 0-2Zm-2.64 6A1 1 0 0 0 17 18.36l.71.71a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.76-.66ZM12 6.5a5.5 5.5 0 1 0 5.5 5.5A5.51 5.51 0 0 0 12 6.5Zm0 9a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7Zm0 3.5a1 1 0 0 0-1 1v1a1 1 0 0 0 2 0v-1a1 1 0 0 0-1-1Z"/></svg><svg aria-hidden="true" class="dark astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.64 13a1 1 0 0 0-1.05-.14 8.049 8.049 0 0 1-3.37.73 8.15 8.15 0 0 1-8.14-8.1 8.59 8.59 0 0 1 .25-2A1 1 0 0 0 8 2.36a10.14 10.14 0 1 0 14 11.69 1 1 0 0 0-.36-1.05Zm-9.5 6.69A8.14 8.14 0 0 1 7.08 5.22v.27a10.15 10.15 0 0 0 10.14 10.14 9.784 9.784 0 0 0 2.1-.22 8.11 8.11 0 0 1-7.18 4.32v-.04Z"/></svg><svg aria-hidden="true" class="auto astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg></template><link rel="stylesheet" href="/_astro/print.DNXP8c50.css" media="print"><link rel="stylesheet" href="/_astro/common.xlUlWolS.css"><link rel="stylesheet" href="/_astro/Code.DfIJP77p.css"><script type="module" src="/_astro/page.B_tncCx8.js"></script></head> <body class="astro-hke2hksx"> <a href="#_top" class="astro-ln4bs55d">Skip to content</a> <div class="page sl-flex astro-4azfgxa5"> <header class="header astro-4azfgxa5"><div class="header astro-huokaw3t"> <div class="title-wrapper sl-flex astro-huokaw3t"> <a href="/" class="site-title sl-flex astro-pf7uwcts"> <img class="light:sl-hidden print:hidden astro-pf7uwcts" alt="Spec Engine" src="/_astro/spec-mark-white.DJBFLLUP.svg" width="512" height="512"> <img class="dark:sl-hidden print:block astro-pf7uwcts" alt="Spec Engine" src="/_astro/spec-mark-black.ZCN22lJi.svg" width="512" height="512"> <span class="astro-pf7uwcts" translate="no"> Spec Engine </span> </a> </div> <div class="sl-flex print:hidden astro-huokaw3t"> <site-search class="astro-huokaw3t astro-6oz6ysne" data-translations="{&quot;placeholder&quot;:&quot;Search&quot;}"> <button data-open-modal disabled aria-label="Search" aria-keyshortcuts="Control+K" class="astro-6oz6ysne"> <svg aria-hidden="true" class="astro-6oz6ysne astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.71 20.29 18 16.61A9 9 0 1 0 16.61 18l3.68 3.68a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.39ZM11 18a7 7 0 1 1 0-14 7 7 0 0 1 0 14Z"/></svg> <span class="sl-hidden md:sl-block astro-6oz6ysne" aria-hidden="true">Search</span> <kbd class="sl-hidden md:sl-flex astro-6oz6ysne" style="display: none;"> <kbd class="astro-6oz6ysne">Ctrl</kbd><kbd class="astro-6oz6ysne">K</kbd> </kbd> </button> <dialog style="padding:0" aria-label="Search" class="astro-6oz6ysne"> <div class="dialog-frame sl-flex astro-6oz6ysne"> <button data-close-modal class="sl-flex md:sl-hidden astro-6oz6ysne"> Cancel </button> <div class="search-container astro-6oz6ysne"> <div id="starlight__search" class="astro-6oz6ysne"></div> </div> </div> </dialog> </site-search> <script>
28
+ (() => {
29
+ const openBtn = document.querySelector('button[data-open-modal]');
30
+ const shortcut = openBtn?.querySelector('kbd');
31
+ if (!openBtn || !(shortcut instanceof HTMLElement)) return;
32
+ const platformKey = shortcut.querySelector('kbd');
33
+ if (platformKey && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)) {
34
+ platformKey.textContent = '⌘';
35
+ openBtn.setAttribute('aria-keyshortcuts', 'Meta+K');
36
+ }
37
+ shortcut.style.display = '';
38
+ })();
39
+ </script> <script type="module" src="/_astro/Search.astro_astro_type_script_index_0_lang.lq3t8uE2.js"></script> </div> <div class="sl-hidden md:sl-flex print:hidden right-group astro-huokaw3t"> <div class="sl-flex social-icons astro-huokaw3t"> <a href="https://github.com/spec-engine/spec-engine" rel="me" class="sl-flex astro-7c53pyad"><span class="sr-only astro-7c53pyad">GitHub</span><svg aria-hidden="true" class="astro-7c53pyad astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg></a> </div> <starlight-theme-select> <label style="--sl-select-width: 6.25em" class="astro-xrbm3f6n"> <span class="sr-only astro-xrbm3f6n">Select theme</span> <svg aria-hidden="true" class="icon label-icon astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> <select autocomplete="off" class="astro-xrbm3f6n"> <option value="dark" class="astro-xrbm3f6n">Dark</option><option value="light" class="astro-xrbm3f6n">Light</option><option value="auto" selected class="astro-xrbm3f6n">Auto</option> </select> <svg aria-hidden="true" class="icon caret astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> </label> </starlight-theme-select> <script>
40
+ StarlightThemeProvider.updatePickers();
41
+ </script> <script type="module">const r="starlight-theme",o=e=>e==="auto"||e==="dark"||e==="light"?e:"auto",c=()=>o(typeof localStorage<"u"&&localStorage.getItem(r));function n(e){typeof localStorage<"u"&&localStorage.setItem(r,e==="light"||e==="dark"?e:"")}const l=()=>matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";function t(e){StarlightThemeProvider.updatePickers(e),document.documentElement.dataset.theme=e==="auto"?l():e,n(e)}matchMedia("(prefers-color-scheme: light)").addEventListener("change",()=>{c()==="auto"&&t("auto")});class s extends HTMLElement{constructor(){super(),t(c()),this.querySelector("select")?.addEventListener("change",a=>{a.currentTarget instanceof HTMLSelectElement&&t(o(a.currentTarget.value))})}}customElements.define("starlight-theme-select",s);</script> <script type="module">class s extends HTMLElement{constructor(){super();const e=this.querySelector("select");e&&(e.addEventListener("change",t=>{t.currentTarget instanceof HTMLSelectElement&&(window.location.pathname=t.currentTarget.value)}),window.addEventListener("pageshow",t=>{if(!t.persisted)return;const n=e.querySelector("option[selected]")?.index;n!==e.selectedIndex&&(e.selectedIndex=n??0)}))}}customElements.define("starlight-lang-select",s);</script> </div> </div></header> <nav class="sidebar print:hidden astro-4azfgxa5" aria-label="Main"> <starlight-menu-button class="print:hidden astro-5hpi47kq"> <button aria-expanded="false" aria-label="Menu" aria-controls="starlight__sidebar" class="sl-flex md:sl-hidden astro-5hpi47kq"> <svg aria-hidden="true" class="open-menu astro-5hpi47kq astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M3 8h18a1 1 0 1 0 0-2H3a1 1 0 0 0 0 2Zm18 8H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Zm0-5H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Z"/></svg> <svg aria-hidden="true" class="close-menu astro-5hpi47kq astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="m13.41 12 6.3-6.29a1.004 1.004 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1.004 1.004 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 0 1.42.998.998 0 0 0 1.42 0l6.29-6.3 6.29 6.3a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.42L13.41 12Z"/></svg> </button> </starlight-menu-button> <script type="module">class s extends HTMLElement{constructor(){super(),this.btn=this.querySelector("button"),this.btn.addEventListener("click",()=>this.toggleExpanded());const t=this.closest("nav");t&&t.addEventListener("keyup",e=>this.closeOnEscape(e))}setExpanded(t){this.setAttribute("aria-expanded",String(t)),document.body.toggleAttribute("data-mobile-menu-expanded",t)}toggleExpanded(){this.setExpanded(this.getAttribute("aria-expanded")!=="true")}closeOnEscape(t){t.code==="Escape"&&(this.setExpanded(!1),this.btn.focus())}}customElements.define("starlight-menu-button",s);</script> <div id="starlight__sidebar" class="sidebar-pane astro-4azfgxa5"> <div class="sidebar-content sl-flex astro-4azfgxa5"> <sl-sidebar-state-persist data-hash="0fmmri7" class="astro-buzsinug"> <script aria-hidden="true">
42
+ (() => {
43
+ try {
44
+ if (!matchMedia('(min-width: 50em)').matches) return;
45
+ /** @type {HTMLElement | null} */
46
+ const target = document.querySelector('sl-sidebar-state-persist');
47
+ const state = JSON.parse(sessionStorage.getItem('sl-sidebar-state') || '0');
48
+ if (!target || !state || target.dataset.hash !== state.hash) return;
49
+ window._starlightScrollRestore = state.scroll;
50
+ customElements.define(
51
+ 'sl-sidebar-restore',
52
+ class SidebarRestore extends HTMLElement {
53
+ connectedCallback() {
54
+ try {
55
+ const idx = parseInt(this.dataset.index || '');
56
+ const details = this.closest('details');
57
+ if (details && typeof state.open[idx] === 'boolean') details.open = state.open[idx];
58
+ } catch {}
59
+ }
60
+ }
61
+ );
62
+ } catch {}
63
+ })();
64
+ </script> <ul class="top-level astro-ftvsh3ht"> <li class="astro-ftvsh3ht"> <a href="/overview/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Overview</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/getting-started/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Getting Started</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/architecture/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Architecture</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/commands/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Commands</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/format/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">SPEC.json Format</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/tags/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Tags</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/checks/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Integrity Checks</span> </a> </li><li class="astro-ftvsh3ht"> <details open class="astro-ftvsh3ht"> <summary class="astro-ftvsh3ht"> <span class="group-label astro-ftvsh3ht"> <span class="large astro-ftvsh3ht">Guides</span> </span> <svg aria-hidden="true" class="caret astro-ftvsh3ht astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <sl-sidebar-restore data-index="0"></sl-sidebar-restore> <ul class="astro-ftvsh3ht"> <li class="astro-ftvsh3ht"> <a href="/guides/adoption/" class="astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Adoption Guide</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/guides/platform-setup/" class="astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Platform Setup</span> </a> </li><li class="astro-ftvsh3ht"> <a href="/guides/single-repo/" aria-current="page" class="astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Single Repo (Rung 1)</span> </a> </li> </ul> </details> </li><li class="astro-ftvsh3ht"> <a href="/agent-reference/" class="large astro-ftvsh3ht"> <span class="astro-ftvsh3ht">Agent Reference</span> </a> </li> </ul> <script aria-hidden="true">
65
+ (() => {
66
+ const scroller = document.getElementById('starlight__sidebar');
67
+ if (!window._starlightScrollRestore || !scroller) return;
68
+ scroller.scrollTop = window._starlightScrollRestore;
69
+ delete window._starlightScrollRestore;
70
+ })();
71
+ </script> </sl-sidebar-state-persist> <div class="md:sl-hidden"> <div class="mobile-preferences sl-flex astro-q2jvmmon"> <div class="social-icons astro-q2jvmmon"> <a href="https://github.com/spec-engine/spec-engine" rel="me" class="sl-flex astro-7c53pyad"><span class="sr-only astro-7c53pyad">GitHub</span><svg aria-hidden="true" class="astro-7c53pyad astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg></a> </div> <starlight-theme-select> <label style="--sl-select-width: 6.25em" class="astro-xrbm3f6n"> <span class="sr-only astro-xrbm3f6n">Select theme</span> <svg aria-hidden="true" class="icon label-icon astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> <select autocomplete="off" class="astro-xrbm3f6n"> <option value="dark" class="astro-xrbm3f6n">Dark</option><option value="light" class="astro-xrbm3f6n">Light</option><option value="auto" selected class="astro-xrbm3f6n">Auto</option> </select> <svg aria-hidden="true" class="icon caret astro-xrbm3f6n astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> </label> </starlight-theme-select> <script>
72
+ StarlightThemeProvider.updatePickers();
73
+ </script> </div> </div> </div> </div> </nav> <div class="main-frame astro-4azfgxa5"> <script type="module">const a=document.getElementById("starlight__sidebar"),n=a?.querySelector("sl-sidebar-state-persist"),o="sl-sidebar-state",i=()=>{let t=[];const e=n?.dataset.hash||"";try{const s=sessionStorage.getItem(o),r=JSON.parse(s||"{}");Array.isArray(r.open)&&r.hash===e&&(t=r.open)}catch{}return{hash:e,open:t,scroll:a?.scrollTop||0}},c=t=>{try{sessionStorage.setItem(o,JSON.stringify(t))}catch{}},d=()=>c(i()),l=(t,e)=>{const s=i();s.open[e]=t,c(s)};n?.addEventListener("click",t=>{if(!(t.target instanceof Element))return;const e=t.target.closest("summary")?.closest("details");if(!e)return;const s=e.querySelector("sl-sidebar-restore"),r=parseInt(s?.dataset.index||"");isNaN(r)||l(!e.open,r)});addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&d()});addEventListener("pageHide",d);</script> <div class="lg:sl-flex astro-7dbgj2gg"> <aside class="right-sidebar-container print:hidden astro-7dbgj2gg"> <div class="right-sidebar astro-7dbgj2gg"> <div class="lg:sl-hidden astro-ungkjbep"><mobile-starlight-toc data-min-h="2" data-max-h="3" class="astro-qoe4sryv"><nav aria-labelledby="starlight__on-this-page--mobile" class="astro-qoe4sryv"><details id="starlight__mobile-toc" class="astro-qoe4sryv"><summary id="starlight__on-this-page--mobile" class="sl-flex astro-qoe4sryv"><span class="toggle sl-flex astro-qoe4sryv">On this page<svg aria-hidden="true" class="caret astro-qoe4sryv astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg></span><span class="display-current astro-qoe4sryv"></span></summary><div class="dropdown astro-qoe4sryv"><ul class="isMobile astro-mc3l7tuo" style="--depth: 0;"> <li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#_top" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Overview</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#layout" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Layout</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#commands" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Commands</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#promote-to-multi-repo" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Promote to multi-repo</span> </a> </li> </ul></div></details></nav></mobile-starlight-toc><script type="module" src="/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js"></script></div><div class="right-sidebar-panel sl-hidden lg:sl-block astro-ungkjbep"><div class="sl-container astro-ungkjbep"><starlight-toc data-min-h="2" data-max-h="3"><nav aria-labelledby="starlight__on-this-page"><h2 id="starlight__on-this-page">On this page</h2><ul class="astro-mc3l7tuo" style="--depth: 0;"> <li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#_top" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Overview</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#layout" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Layout</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#commands" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Commands</span> </a> </li><li class="astro-mc3l7tuo" style="--depth: 0;"> <a href="#promote-to-multi-repo" class="astro-mc3l7tuo" style="--depth: 0;"> <span class="astro-mc3l7tuo" style="--depth: 0;">Promote to multi-repo</span> </a> </li> </ul></nav></starlight-toc><script type="module" src="/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js"></script></div></div> </div> </aside> <div class="main-pane astro-7dbgj2gg"> <main data-pagefind-body class="astro-hke2hksx" lang="en" dir="ltr"> <div class="content-panel astro-cwqdebiv"> <div class="sl-container astro-cwqdebiv"> <h1 id="_top" class="astro-jkmikw3m">Single Repo (Rung 1)</h1> </div> </div> <div class="content-panel astro-cwqdebiv"> <div class="sl-container astro-cwqdebiv"> <div class="sl-markdown-content"> <p>The bottom rung of the adoption ladder: one repo, specs inline, zero ceremony — no sibling members, no <code dir="auto">spec-engine.member.json</code>, no <code dir="auto">spec init</code>.</p>
74
+ <div class="sl-heading-wrapper level-h2"><h2 id="layout">Layout</h2><a class="sl-anchor-link" href="#layout"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore="">Section titled “Layout”</span></a></div>
75
+ <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.v4551.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="plaintext"><code><div class="ec-line"><div class="code"><span style="--0:#d6deeb;--1:#403f53">my-repo/</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">spec-engine/</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">ORDERS/SPEC.json ORDERS-001 / ORDERS-002 / ORDERS-003</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">src/</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">orders.ts // @spec ORDERS-001 // @spec ORDERS-002</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">test/</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#d6deeb;--1:#403f53"> </span></span><span style="--0:#d6deeb;--1:#403f53">orders.test.ts // @spec ORDERS-001 unit</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="my-repo/ spec-engine/ ORDERS/SPEC.json ORDERS-001 / ORDERS-002 / ORDERS-003 src/ orders.ts // @spec ORDERS-001 // @spec ORDERS-002 test/ orders.test.ts // @spec ORDERS-001 unit"><div></div></button></div></figure></div>
76
+ <div class="sl-heading-wrapper level-h2"><h2 id="commands">Commands</h2><a class="sl-anchor-link" href="#commands"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore="">Section titled “Commands”</span></a></div>
77
+ <div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">$</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">index</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">.</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">$</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">map</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">.</span></div></div><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">$</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">check</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">.</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="$ spec index .$ spec map .$ spec check ."><div></div></button></div></figure></div>
78
+ <p>Spec Engine registers the repo as its own lone member and scans it for tags. The coverage column is the repo’s own basename.</p>
79
+ <div class="sl-heading-wrapper level-h2"><h2 id="promote-to-multi-repo">Promote to multi-repo</h2><a class="sl-anchor-link" href="#promote-to-multi-repo"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only" data-pagefind-ignore="">Section titled “Promote to multi-repo”</span></a></div>
80
+ <p>When you outgrow one repo:</p>
81
+ <div class="expressive-code"><figure class="frame is-terminal not-content"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#82AAFF;--1:#3B61B0">$</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">git</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">mv</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">spec-engine/</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#ECC48D;--1:#3B61B0">../spec-engine</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="$ git mv spec-engine/ ../spec-engine"><div></div></button></div></figure></div>
82
+ <p>This lifts the inline specs into a dedicated repo beside this one, turning rung 1 into a multi-repo platform. The repo then pins to it with <code dir="auto">spec init</code> like any member.</p> </div> <footer class="sl-flex astro-g7gasbrj"> <div class="meta sl-flex astro-g7gasbrj"> <a href="https://github.com/spec-engine/spec-engine/edit/main/packages/site/src/content/docs/guides/single-repo.md" class="sl-flex print:hidden astro-tr6myc4c"><svg aria-hidden="true" class="astro-tr6myc4c astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.2em;"><path d="M22 7.24a1 1 0 0 0-.29-.71l-4.24-4.24a1 1 0 0 0-1.1-.22 1 1 0 0 0-.32.22l-2.83 2.83L2.29 16.05a1 1 0 0 0-.29.71V21a1 1 0 0 0 1 1h4.24a1 1 0 0 0 .76-.29l10.87-10.93L21.71 8c.1-.1.17-.2.22-.33a1 1 0 0 0 0-.24v-.14l.07-.05ZM6.83 20H4v-2.83l9.93-9.93 2.83 2.83L6.83 20ZM18.17 8.66l-2.83-2.83 1.42-1.41 2.82 2.82-1.41 1.42Z"/></svg>Edit page</a> </div> <div class="pagination-links print:hidden astro-iud5vnm7" dir="ltr"> <a href="/guides/platform-setup/" rel="prev" class="astro-iud5vnm7"> <svg aria-hidden="true" class="astro-iud5vnm7 astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.5rem;"><path d="M17 11H9.41l3.3-3.29a1.004 1.004 0 1 0-1.42-1.42l-5 5a1 1 0 0 0-.21.33 1 1 0 0 0 0 .76 1 1 0 0 0 .21.33l5 5a1.002 1.002 0 0 0 1.639-.325 1 1 0 0 0-.219-1.095L9.41 13H17a1 1 0 0 0 0-2Z"/></svg> <span class="astro-iud5vnm7"> Previous <br class="astro-iud5vnm7"> <span class="link-title astro-iud5vnm7">Platform Setup</span> </span> </a> <a href="/agent-reference/" rel="next" class="astro-iud5vnm7"> <svg aria-hidden="true" class="astro-iud5vnm7 astro-kyfdspn7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.5rem;"><path d="M17.92 11.62a1.001 1.001 0 0 0-.21-.33l-5-5a1.003 1.003 0 1 0-1.42 1.42l3.3 3.29H7a1 1 0 0 0 0 2h7.59l-3.3 3.29a1.002 1.002 0 0 0 .325 1.639 1 1 0 0 0 1.095-.219l5-5a1 1 0 0 0 .21-.33 1 1 0 0 0 0-.76Z"/></svg> <span class="astro-iud5vnm7"> Next <br class="astro-iud5vnm7"> <span class="link-title astro-iud5vnm7">Agent Reference</span> </span> </a> </div> </footer> </div> </div> </main> </div> </div> </div> </div> </body></html>