From f258e01de0913eb7aa3c48546033476dc1563666 Mon Sep 17 00:00:00 2001 From: Muhammad Dhiyaul Atha Date: Thu, 22 Oct 2026 22:36:50 +0700 Subject: [PATCH] docs: add logo and favicon, strengthen SEO metadata Terminal-prompt SVG logo as brand mark and favicon, 180px apple-touch icon, and a dedicated 1200x630 og card as home image. Head gains robots/author/theme-color, og:locale/image dims/alt, twitter:image:alt, and an enriched SoftwareApplication JSON-LD (logo, image, author, downloadUrl, license). --- docs/web/dist/apple-touch-icon.png | Bin 0 -> 1900 bytes docs/web/dist/assets/index-BUMrIfxi.css | 1 - docs/web/dist/assets/index-DZzeKXFv.css | 1 + .../{index-Bpn6tfSv.js => index-y37U0USe.js} | 2 +- docs/web/dist/assets/site.css | 2 +- docs/web/dist/detect/index.html | 12 ++++++++-- docs/web/dist/exit-codes/index.html | 12 ++++++++-- docs/web/dist/favicon.svg | 5 ++++ docs/web/dist/getting-started/index.html | 12 ++++++++-- docs/web/dist/img/og.png | Bin 0 -> 36611 bytes docs/web/dist/index.html | 18 ++++++++++---- docs/web/dist/init/index.html | 12 ++++++++-- docs/web/dist/logo.svg | 5 ++++ docs/web/dist/validate/index.html | 12 ++++++++-- docs/web/dist/wizard/index.html | 12 ++++++++-- docs/web/public/apple-touch-icon.png | Bin 0 -> 1900 bytes docs/web/public/favicon.svg | 5 ++++ docs/web/public/img/og.png | Bin 0 -> 36611 bytes docs/web/public/logo.svg | 5 ++++ docs/web/src/components/Layout.jsx | 2 +- docs/web/src/entry-server.jsx | 22 +++++++++++++++++- docs/web/src/routes.jsx | 2 +- docs/web/src/styles/site.css | 9 +------ 23 files changed, 121 insertions(+), 30 deletions(-) create mode 100644 docs/web/dist/apple-touch-icon.png delete mode 100644 docs/web/dist/assets/index-BUMrIfxi.css create mode 100644 docs/web/dist/assets/index-DZzeKXFv.css rename docs/web/dist/assets/{index-Bpn6tfSv.js => index-y37U0USe.js} (98%) create mode 100644 docs/web/dist/favicon.svg create mode 100644 docs/web/dist/img/og.png create mode 100644 docs/web/dist/logo.svg create mode 100644 docs/web/public/apple-touch-icon.png create mode 100644 docs/web/public/favicon.svg create mode 100644 docs/web/public/img/og.png create mode 100644 docs/web/public/logo.svg diff --git a/docs/web/dist/apple-touch-icon.png b/docs/web/dist/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc895e7c2eecb2ebdd5d5c9e0ed0ec7c5095d7f GIT binary patch literal 1900 zcmbVNdsNcd7REcN#p_fy}y0dS>M`copru* zq zeZThX0TLYofk{@wKpOYcNeIN)AkY{1HYrR!sGA6jKuX^%qg+mM*$b0|=P|NVv#|<6 zc6NV$wf`AX(av&zQ;gq1V$nVL&A$f{i?;jyu+A%gox?(8`+{24q^?V#%;V?TWs9K$ z33UU>D>K{Kujq$Z=ew2e1B)+|jVI^cRtY!qc6!40hMXHkVQCQKHRewLAD$SB5+4oZ z_x}TTeBzgJj=y8q&(Q09YE=u+DA;c!GPkCs@#U$J5p75P^EgvII;*~40)WqEx6(o! z5xWUyj9-OBS{U4_h; z+!c0TO(TC%o5)OGnl5YqQg=i9eQ+jwfR`Y@kk`uC$Uu26_H7OREz51L2PN}?BXir} z<5U~XzPLN<4EJFuwUX%!_YfoYSzYP&UJ_gTQYdSlbE=%qIp1iemBzJa|1H+XHGi>g z*p7WcQ%nH^rbR9$bi3B_zMRM;q^6JpD!8VVlbr9IB@yKpCOQ2I*X#x-E%ljTyg*f= zf(!Y3&})4rdzr`Co#zwso*C9Uh9js0D_Zrf(Pqy9KdFCmB5;fBlYtPgie;j+cRFyL zmrraGaP3=J+?Q4NEULXGIlSb~p;+9dG2*PGno%D% zn3DxfM|YgTe2);nj$A#H0@Xp%EB|1P4aYtRp9W>UeqRaq?-;pjv8@a+ z#5_LV>6|_g#=^U!7|~~eEd0pelMKkI`xe`30V7Q2j*-ghEV%{u*cUf(Px%31_=O;= zP?#CD7m)&1*fhWBxsdIAX>21p{<6ZI@f@{n3u9#epJzHpl9>+sQ}Ogyh@6G?tI5eWApik{f?)>f{1Il zxA(t5`6@5!^-NfU#}J`s@=!uAcX*ILm<3{e#s_9|EBCNIj8c{nHgV)tJP{LJvaUG* zj8IJrijufKIMnTl{S17G9bg=`_svNwGE8f*Wpu$(Lt??SmGeWH-dzB}W++r)&gu3* zuN|u{v}7`kP>gPB;N=z_GY$llcD!s=iF;xazGOH&4U0otE`JHerO%{*IURmH$+ElVsy9Ij39WlJ7eyLpMR7Tr21J=pP8SuGfw0Q0S3JP>7VXZuRU02DYi*jC^b?+3s}@4tV69SzAR7qQy*3CPh!Rg zvz{53q{d>`%aW43D2yYeXT!BzFf`d9dU z`*KFyTI-`wYZ7DbT1Oysm43vPo5ONM2A`V#3GyqUi;oH|cK=heOXcFFj+`n8ZV59o z7kqSWVk}5$k2h{;n+$zaq2Q;+|0(ldz5j`<7#Gx&F$Qh5m-Rm+B+&1WZ=H8I=RZS^ BaCZOz literal 0 HcmV?d00001 diff --git a/docs/web/dist/assets/index-BUMrIfxi.css b/docs/web/dist/assets/index-BUMrIfxi.css deleted file mode 100644 index 3788710..0000000 --- a/docs/web/dist/assets/index-BUMrIfxi.css +++ /dev/null @@ -1 +0,0 @@ -@import "https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap";:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--ui-bg:#f3ede3;--ui-surface:#fffaf2;--ui-surface-2:#f7f0e6;--ui-text:#332820;--ui-text-soft:#5e4d3f;--ui-muted:#756455;--ui-border:#e2d5c5;--ui-border-strong:#d3c2ad;--ui-accent:#8a5b3d;--ui-accent-strong:#7a4f33;--ui-accent-soft:#efe0cf;--ui-accent-contrast:#fffaf2;--ui-badge-ok-bg:#e4ecd9;--ui-badge-ok-fg:#55683f;--ui-badge-warn-bg:#fbf0d2;--ui-badge-warn-fg:#7a5c17;--ui-badge-err-bg:#f9e2db;--ui-badge-err-fg:#8a4a38;--ui-badge-info-bg:#efe6ec;--ui-badge-info-fg:#6e4a63;--ui-note:#f4ead9;--ui-tip:#edf0e2;--ui-caution:#fbf0d2;--ui-danger:#f9e2db;--ui-code:#2d231c;--ui-code-text:#f8f1e8;--ui-code-bar:#efe2d2;--ui-code-bar-text:#5e3c27;--ui-shadow-color:#4a34261a;--ui-shadow-strong:#4a342629;--ui-radius-sm:6px;--ui-radius:10px;--ui-radius-lg:16px;--font-display:"DM Sans", ui-sans-serif, system-ui, sans-serif;--sl-font:"DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--sl-font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*{scrollbar-color:var(--ui-border-strong) var(--ui-bg);box-sizing:border-box}html{scroll-behavior:smooth}body{background:var(--ui-bg);color:var(--ui-text);font-family:var(--sl-font);text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;font-size:1rem;font-weight:400;line-height:1.75}::selection{background:var(--ui-accent-soft);color:var(--ui-accent-strong)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-track{background:var(--ui-bg)}::-webkit-scrollbar-thumb{background:var(--ui-border-strong);border:3px solid var(--ui-bg);border-radius:999px}::-webkit-scrollbar-thumb:hover{background:var(--ui-accent)}:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px}.skip{z-index:99;background:var(--ui-accent);color:var(--ui-accent-contrast);border-radius:var(--ui-radius-sm);font-family:var(--sl-font);padding:8px 16px;font-weight:600;position:absolute;top:0;left:-9999px}.skip:focus{left:8px}.topbar{background:var(--ui-surface);border-bottom:1px solid var(--ui-border);align-items:center;gap:16px;padding:.6rem clamp(1rem,3vw,2rem);display:flex}.brand{color:var(--ui-text);align-items:center;gap:10px;text-decoration:none;display:inline-flex}.brand-mark{border-radius:var(--ui-radius);background:var(--ui-accent-soft);width:2.25rem;height:2.25rem;color:var(--ui-accent-strong);box-shadow:0 2px 8px var(--ui-shadow-color);font-family:var(--font-display);place-items:center;font-size:.95rem;font-weight:700;display:grid}.brand-name{font-family:var(--font-display);letter-spacing:-.015em;font-size:1rem;font-weight:700}.brand-sub{background:var(--ui-accent-soft);color:var(--ui-accent-strong);letter-spacing:.08em;border-radius:999px;padding:.16rem .45rem;font-size:.58rem;font-weight:700}.gh-pill{border:1px solid var(--ui-border);background:var(--ui-surface-2);height:2.25rem;box-shadow:none;color:var(--ui-text-soft);font-family:var(--sl-font);border-radius:8px;align-items:center;gap:.4rem;margin-left:auto;padding:0 1rem;font-size:.8rem;font-weight:600;text-decoration:none;transition:background .15s,border-color .15s;display:inline-flex}.gh-pill:hover{background:var(--ui-accent-soft);border-color:var(--ui-border-strong);color:var(--ui-accent-strong)}.shell{grid-template-columns:210px minmax(0,1fr);align-items:start;gap:clamp(1.5rem,3vw,2.5rem);max-width:1200px;margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem);display:grid}.sidebar{padding-block:.25rem;position:sticky;top:1.5rem}.side-home{margin-bottom:.4rem}.side-group+.side-group{margin-top:1.25rem}.group-label{color:var(--ui-muted);letter-spacing:.12em;text-transform:uppercase;margin:0 0 .4rem;padding:0 .6rem;font-size:.66rem;font-weight:700}.sidebar ul{margin:0;padding:0;list-style:none}.sidebar a,.side-link{color:var(--ui-text-soft);text-transform:capitalize;border-radius:7px;padding:.4rem .6rem;font-weight:500;line-height:1.35;text-decoration:none;transition:background .15s,color .15s;display:block}.sidebar a:hover,.side-link:hover{background:var(--ui-surface-2);color:var(--ui-text)}.sidebar a.is-active,.side-link.is-active{background:var(--ui-accent-soft);color:var(--ui-accent-strong);box-shadow:inset 3px 0 0 var(--ui-accent);font-weight:600}main{min-width:0}.page-head{margin-bottom:26px}.kicker{background:var(--ui-accent-soft);color:var(--ui-accent-strong);letter-spacing:.12em;text-transform:uppercase;border-radius:999px;margin:0 0 12px;padding:.22rem .7rem;font-size:.66rem;font-weight:700;display:inline-block}.violet{background:var(--ui-badge-info-bg);color:var(--ui-badge-info-fg)}.blue{background:var(--ui-note);color:var(--ui-text-soft)}.pink,.yellow{background:var(--ui-caution);color:var(--ui-badge-warn-fg)}h1{color:var(--ui-text);box-shadow:none;font-family:var(--font-display);letter-spacing:-.03em;overflow-wrap:anywhere;background:0 0;margin:0 0 14px;padding:0;font-size:clamp(1.9rem,3.8vw,2.6rem);font-weight:700;line-height:1.12;display:block}.lede{background:var(--ui-surface);max-width:46rem;color:var(--ui-text-soft);border:1px solid var(--ui-border);border-inline-start:3px solid var(--ui-accent);border-radius:8px;margin-block:0 8px;padding:1rem 1.25rem;font-size:1.02rem;line-height:1.7;display:block}h2{border-bottom:1px solid var(--ui-border);font-family:var(--font-display);letter-spacing:-.025em;align-items:center;gap:.6rem;margin-block:2.5rem 1rem;padding-bottom:.55rem;font-size:clamp(1.25rem,2.3vw,1.45rem);font-weight:600;display:flex}h2:before{content:"";background:var(--ui-accent);border-radius:999px;flex:none;width:.35rem;height:1.1em}h3{font-family:var(--font-display);margin-block:1.75rem .6rem;font-size:1.08rem;font-weight:600}strong{color:var(--ui-accent-strong);font-weight:600}code:not(.code-block code){background:var(--ui-surface-2);color:var(--ui-accent-strong);border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);font-family:var(--sl-font-mono);-webkit-box-decoration-break:clone;box-decoration-break:clone;padding:.08em .35em;font-size:.88em;font-weight:500}a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong);text-underline-offset:3px;text-decoration-thickness:1px}a:hover{color:var(--ui-accent);-webkit-text-decoration-color:var(--ui-accent);text-decoration-color:var(--ui-accent);background:0 0}.btn:hover,.gh-pill:hover,.sidebar a:hover,.side-link:hover{background-color:inherit}a.btn:hover{color:var(--ui-accent-contrast);background:var(--ui-accent-strong);text-decoration:none}.hero{background:var(--ui-surface);color:var(--ui-text);border:1px solid var(--ui-border);border-radius:var(--ui-radius-lg);box-shadow:0 16px 40px var(--ui-shadow-color);grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);align-items:center;gap:clamp(1.5rem,4vw,3rem);margin:.5rem 0 2rem;padding:clamp(1.5rem,4vw,3rem);display:grid;position:relative}.hero-cta{flex-wrap:wrap;gap:.75rem;margin-top:6px;display:flex}.btn{border:1px solid var(--ui-accent);background:var(--ui-accent);color:var(--ui-accent-contrast);box-shadow:0 2px 6px var(--ui-shadow-color);border-radius:9px;padding:.6rem 1.1rem;font-weight:600;text-decoration:none;transition:background .15s,border-color .15s,box-shadow .15s,transform .15s;display:inline-block}.btn:hover{box-shadow:0 6px 16px var(--ui-shadow-strong);transform:translateY(-1px)}.btn-pink{background:var(--ui-surface-2);color:var(--ui-text);border-color:var(--ui-border)}.btn-pink:hover{background:var(--ui-accent-soft);border-color:var(--ui-border-strong);color:var(--ui-accent-strong)}.btn-yellow{background:var(--ui-surface-2);color:var(--ui-text);border-color:var(--ui-border)}.cards{grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1.25rem;display:grid}.card{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);box-shadow:0 1px 2px var(--ui-shadow-color);color:inherit;padding:1.5rem;text-decoration:none;transition:transform .18s,box-shadow .18s,border-color .18s}.card h3{margin-top:0;font-size:.98rem}.card p,.card li{color:var(--ui-muted);font-size:.9rem;line-height:1.6}.card:hover{border-color:var(--ui-border-strong);box-shadow:0 10px 24px var(--ui-shadow-color);transform:translateY(-2px)}a.card h3{color:var(--ui-accent-strong)}.core .card:hover{border-color:var(--ui-accent)}.shot{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);box-shadow:0 8px 24px var(--ui-shadow-color);max-width:100%;margin:22px 0;padding:10px}.shot img{border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);width:100%;height:auto;display:block}.shot figcaption{color:var(--ui-muted);margin-top:10px;font-size:.85rem;font-weight:500}.shot a:hover{color:inherit;background:0 0}.shot-feature{max-width:880px}.screen-strip{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));align-items:start;gap:22px;display:grid}.screen-strip .shot{margin:0 0 12px}.code-block{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-code);color:var(--ui-code-text);box-shadow:0 10px 30px var(--ui-shadow-color);margin:20px 0;position:relative;overflow:hidden}.code-label{background:var(--ui-code-bar);color:var(--ui-code-bar-text);font-family:var(--sl-font-mono);letter-spacing:.06em;text-transform:uppercase;padding:.45rem .9rem;font-size:.7rem;font-weight:600;position:absolute;top:0;left:0;right:0}.code-block pre{font-family:var(--sl-font-mono);margin:0;padding:2.2rem 18px 16px;font-size:.86rem;line-height:1.6;overflow-x:auto}.code-block code{color:inherit;font-size:inherit;background:0 0;border:0;padding:0}.table-wrap{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-surface);box-shadow:0 1px 2px var(--ui-shadow-color);margin:18px 0;overflow:auto}table{border-collapse:collapse;width:100%;font-size:.92rem}th,td{text-align:left;vertical-align:top;padding:.65rem .75rem}th{background:var(--ui-surface-2);color:var(--ui-muted);letter-spacing:.06em;text-transform:uppercase;font-size:.7rem;font-weight:700}td{border-top:1px solid var(--ui-border)}tbody tr:nth-child(2n) td{background:var(--ui-surface-2)}td code{white-space:nowrap}.num{font-weight:700}.badge{font-family:var(--sl-font-mono);letter-spacing:.01em;border:0;border-radius:999px;padding:.05rem .5rem;font-size:.74rem;font-weight:600;display:inline-block;transform:none}.badge-ok{background:var(--ui-badge-ok-bg);color:var(--ui-badge-ok-fg)}.badge-warn{background:var(--ui-badge-warn-bg);color:var(--ui-badge-warn-fg)}.badge-err{background:var(--ui-badge-err-bg);color:var(--ui-badge-err-fg)}.badge-info{background:var(--ui-badge-info-bg);color:var(--ui-badge-info-fg)}.kbd{border:1px solid var(--ui-border);background:var(--ui-surface-2);color:var(--ui-text);box-shadow:none;font-family:var(--sl-font-mono);border-radius:5px;padding:.1em .4em;font-size:.84rem;display:inline-block}.callout{background:var(--ui-note);color:var(--ui-text);border:1px solid var(--ui-border);border-inline-start:3px solid var(--ui-accent);border-radius:8px;margin:20px 0;padding:1rem 1.25rem;font-weight:500}.callout p{margin:0}.callout-info,.callout-ok{background:var(--ui-tip)}ul,ol{padding-inline-start:1.5rem}li::marker{color:var(--ui-accent)}.step-list{counter-reset:steps;padding-left:0;list-style:none}.step-list li{counter-increment:steps;margin-top:14px;padding-left:48px;position:relative}.step-list li:before{content:counter(steps);background:var(--ui-accent-soft);width:30px;height:30px;color:var(--ui-accent-strong);box-shadow:none;font-family:var(--font-display);border-radius:999px;place-items:center;font-weight:600;display:grid;position:absolute;top:0;left:0}.flag-name{font-family:var(--sl-font-mono);font-weight:600}.footer{max-width:1200px;color:var(--ui-muted);margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem) 2.5rem;font-size:.9rem}.footer a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong)}.footer a:hover{background:var(--ui-accent-soft)}.footer-links{margin-top:6px}.file-tree{font-family:var(--sl-font-mono);white-space:pre;font-size:.9rem;overflow-x:auto}@media (width<=900px){.shell{grid-template-columns:1fr}.sidebar{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);flex-wrap:wrap;align-items:center;gap:.4rem;padding:.75rem 1rem;display:flex;position:static}.side-group{display:contents;margin:0!important}.sidebar ul{flex-wrap:wrap;gap:.25rem;display:flex}.group-label{margin:0 .2rem}.sidebar a,.side-link{background:var(--ui-surface-2);border-radius:999px;padding:.3rem .7rem}.sidebar a.is-active,.side-link.is-active{box-shadow:none}}@media (width<=720px){.hero{border-radius:var(--ui-radius);box-shadow:0 8px 24px var(--ui-shadow-color);grid-template-columns:1fr;padding:1.5rem}.shot,.code-block{box-shadow:0 4px 16px var(--ui-shadow-color)}th,td{padding:.5rem .55rem}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}} diff --git a/docs/web/dist/assets/index-DZzeKXFv.css b/docs/web/dist/assets/index-DZzeKXFv.css new file mode 100644 index 0000000..005c0fb --- /dev/null +++ b/docs/web/dist/assets/index-DZzeKXFv.css @@ -0,0 +1 @@ +@import "https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap";:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--ui-bg:#f3ede3;--ui-surface:#fffaf2;--ui-surface-2:#f7f0e6;--ui-text:#332820;--ui-text-soft:#5e4d3f;--ui-muted:#756455;--ui-border:#e2d5c5;--ui-border-strong:#d3c2ad;--ui-accent:#8a5b3d;--ui-accent-strong:#7a4f33;--ui-accent-soft:#efe0cf;--ui-accent-contrast:#fffaf2;--ui-badge-ok-bg:#e4ecd9;--ui-badge-ok-fg:#55683f;--ui-badge-warn-bg:#fbf0d2;--ui-badge-warn-fg:#7a5c17;--ui-badge-err-bg:#f9e2db;--ui-badge-err-fg:#8a4a38;--ui-badge-info-bg:#efe6ec;--ui-badge-info-fg:#6e4a63;--ui-note:#f4ead9;--ui-tip:#edf0e2;--ui-caution:#fbf0d2;--ui-danger:#f9e2db;--ui-code:#2d231c;--ui-code-text:#f8f1e8;--ui-code-bar:#efe2d2;--ui-code-bar-text:#5e3c27;--ui-shadow-color:#4a34261a;--ui-shadow-strong:#4a342629;--ui-radius-sm:6px;--ui-radius:10px;--ui-radius-lg:16px;--font-display:"DM Sans", ui-sans-serif, system-ui, sans-serif;--sl-font:"DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--sl-font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*{scrollbar-color:var(--ui-border-strong) var(--ui-bg);box-sizing:border-box}html{scroll-behavior:smooth}body{background:var(--ui-bg);color:var(--ui-text);font-family:var(--sl-font);text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;font-size:1rem;font-weight:400;line-height:1.75}::selection{background:var(--ui-accent-soft);color:var(--ui-accent-strong)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-track{background:var(--ui-bg)}::-webkit-scrollbar-thumb{background:var(--ui-border-strong);border:3px solid var(--ui-bg);border-radius:999px}::-webkit-scrollbar-thumb:hover{background:var(--ui-accent)}:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px}.skip{z-index:99;background:var(--ui-accent);color:var(--ui-accent-contrast);border-radius:var(--ui-radius-sm);font-family:var(--sl-font);padding:8px 16px;font-weight:600;position:absolute;top:0;left:-9999px}.skip:focus{left:8px}.topbar{background:var(--ui-surface);border-bottom:1px solid var(--ui-border);align-items:center;gap:16px;padding:.6rem clamp(1rem,3vw,2rem);display:flex}.brand{color:var(--ui-text);align-items:center;gap:10px;text-decoration:none;display:inline-flex}.brand-mark{width:2.25rem;height:2.25rem;box-shadow:0 2px 8px var(--ui-shadow-color);display:block}.brand-name{font-family:var(--font-display);letter-spacing:-.015em;font-size:1rem;font-weight:700}.brand-sub{background:var(--ui-accent-soft);color:var(--ui-accent-strong);letter-spacing:.08em;border-radius:999px;padding:.16rem .45rem;font-size:.58rem;font-weight:700}.gh-pill{border:1px solid var(--ui-border);background:var(--ui-surface-2);height:2.25rem;box-shadow:none;color:var(--ui-text-soft);font-family:var(--sl-font);border-radius:8px;align-items:center;gap:.4rem;margin-left:auto;padding:0 1rem;font-size:.8rem;font-weight:600;text-decoration:none;transition:background .15s,border-color .15s;display:inline-flex}.gh-pill:hover{background:var(--ui-accent-soft);border-color:var(--ui-border-strong);color:var(--ui-accent-strong)}.shell{grid-template-columns:210px minmax(0,1fr);align-items:start;gap:clamp(1.5rem,3vw,2.5rem);max-width:1200px;margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem);display:grid}.sidebar{padding-block:.25rem;position:sticky;top:1.5rem}.side-home{margin-bottom:.4rem}.side-group+.side-group{margin-top:1.25rem}.group-label{color:var(--ui-muted);letter-spacing:.12em;text-transform:uppercase;margin:0 0 .4rem;padding:0 .6rem;font-size:.66rem;font-weight:700}.sidebar ul{margin:0;padding:0;list-style:none}.sidebar a,.side-link{color:var(--ui-text-soft);text-transform:capitalize;border-radius:7px;padding:.4rem .6rem;font-weight:500;line-height:1.35;text-decoration:none;transition:background .15s,color .15s;display:block}.sidebar a:hover,.side-link:hover{background:var(--ui-surface-2);color:var(--ui-text)}.sidebar a.is-active,.side-link.is-active{background:var(--ui-accent-soft);color:var(--ui-accent-strong);box-shadow:inset 3px 0 0 var(--ui-accent);font-weight:600}main{min-width:0}.page-head{margin-bottom:26px}.kicker{background:var(--ui-accent-soft);color:var(--ui-accent-strong);letter-spacing:.12em;text-transform:uppercase;border-radius:999px;margin:0 0 12px;padding:.22rem .7rem;font-size:.66rem;font-weight:700;display:inline-block}.violet{background:var(--ui-badge-info-bg);color:var(--ui-badge-info-fg)}.blue{background:var(--ui-note);color:var(--ui-text-soft)}.pink,.yellow{background:var(--ui-caution);color:var(--ui-badge-warn-fg)}h1{color:var(--ui-text);box-shadow:none;font-family:var(--font-display);letter-spacing:-.03em;overflow-wrap:anywhere;background:0 0;margin:0 0 14px;padding:0;font-size:clamp(1.9rem,3.8vw,2.6rem);font-weight:700;line-height:1.12;display:block}.lede{background:var(--ui-surface);max-width:46rem;color:var(--ui-text-soft);border:1px solid var(--ui-border);border-inline-start:3px solid var(--ui-accent);border-radius:8px;margin-block:0 8px;padding:1rem 1.25rem;font-size:1.02rem;line-height:1.7;display:block}h2{border-bottom:1px solid var(--ui-border);font-family:var(--font-display);letter-spacing:-.025em;align-items:center;gap:.6rem;margin-block:2.5rem 1rem;padding-bottom:.55rem;font-size:clamp(1.25rem,2.3vw,1.45rem);font-weight:600;display:flex}h2:before{content:"";background:var(--ui-accent);border-radius:999px;flex:none;width:.35rem;height:1.1em}h3{font-family:var(--font-display);margin-block:1.75rem .6rem;font-size:1.08rem;font-weight:600}strong{color:var(--ui-accent-strong);font-weight:600}code:not(.code-block code){background:var(--ui-surface-2);color:var(--ui-accent-strong);border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);font-family:var(--sl-font-mono);-webkit-box-decoration-break:clone;box-decoration-break:clone;padding:.08em .35em;font-size:.88em;font-weight:500}a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong);text-underline-offset:3px;text-decoration-thickness:1px}a:hover{color:var(--ui-accent);-webkit-text-decoration-color:var(--ui-accent);text-decoration-color:var(--ui-accent);background:0 0}.btn:hover,.gh-pill:hover,.sidebar a:hover,.side-link:hover{background-color:inherit}a.btn:hover{color:var(--ui-accent-contrast);background:var(--ui-accent-strong);text-decoration:none}.hero{background:var(--ui-surface);color:var(--ui-text);border:1px solid var(--ui-border);border-radius:var(--ui-radius-lg);box-shadow:0 16px 40px var(--ui-shadow-color);grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);align-items:center;gap:clamp(1.5rem,4vw,3rem);margin:.5rem 0 2rem;padding:clamp(1.5rem,4vw,3rem);display:grid;position:relative}.hero-cta{flex-wrap:wrap;gap:.75rem;margin-top:6px;display:flex}.btn{border:1px solid var(--ui-accent);background:var(--ui-accent);color:var(--ui-accent-contrast);box-shadow:0 2px 6px var(--ui-shadow-color);border-radius:9px;padding:.6rem 1.1rem;font-weight:600;text-decoration:none;transition:background .15s,border-color .15s,box-shadow .15s,transform .15s;display:inline-block}.btn:hover{box-shadow:0 6px 16px var(--ui-shadow-strong);transform:translateY(-1px)}.btn-pink{background:var(--ui-surface-2);color:var(--ui-text);border-color:var(--ui-border)}.btn-pink:hover{background:var(--ui-accent-soft);border-color:var(--ui-border-strong);color:var(--ui-accent-strong)}.btn-yellow{background:var(--ui-surface-2);color:var(--ui-text);border-color:var(--ui-border)}.cards{grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1.25rem;display:grid}.card{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);box-shadow:0 1px 2px var(--ui-shadow-color);color:inherit;padding:1.5rem;text-decoration:none;transition:transform .18s,box-shadow .18s,border-color .18s}.card h3{margin-top:0;font-size:.98rem}.card p,.card li{color:var(--ui-muted);font-size:.9rem;line-height:1.6}.card:hover{border-color:var(--ui-border-strong);box-shadow:0 10px 24px var(--ui-shadow-color);transform:translateY(-2px)}a.card h3{color:var(--ui-accent-strong)}.core .card:hover{border-color:var(--ui-accent)}.shot{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);box-shadow:0 8px 24px var(--ui-shadow-color);max-width:100%;margin:22px 0;padding:10px}.shot img{border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);width:100%;height:auto;display:block}.shot figcaption{color:var(--ui-muted);margin-top:10px;font-size:.85rem;font-weight:500}.shot a:hover{color:inherit;background:0 0}.shot-feature{max-width:880px}.screen-strip{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));align-items:start;gap:22px;display:grid}.screen-strip .shot{margin:0 0 12px}.code-block{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-code);color:var(--ui-code-text);box-shadow:0 10px 30px var(--ui-shadow-color);margin:20px 0;position:relative;overflow:hidden}.code-label{background:var(--ui-code-bar);color:var(--ui-code-bar-text);font-family:var(--sl-font-mono);letter-spacing:.06em;text-transform:uppercase;padding:.45rem .9rem;font-size:.7rem;font-weight:600;position:absolute;top:0;left:0;right:0}.code-block pre{font-family:var(--sl-font-mono);margin:0;padding:2.2rem 18px 16px;font-size:.86rem;line-height:1.6;overflow-x:auto}.code-block code{color:inherit;font-size:inherit;background:0 0;border:0;padding:0}.table-wrap{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-surface);box-shadow:0 1px 2px var(--ui-shadow-color);margin:18px 0;overflow:auto}table{border-collapse:collapse;width:100%;font-size:.92rem}th,td{text-align:left;vertical-align:top;padding:.65rem .75rem}th{background:var(--ui-surface-2);color:var(--ui-muted);letter-spacing:.06em;text-transform:uppercase;font-size:.7rem;font-weight:700}td{border-top:1px solid var(--ui-border)}tbody tr:nth-child(2n) td{background:var(--ui-surface-2)}td code{white-space:nowrap}.num{font-weight:700}.badge{font-family:var(--sl-font-mono);letter-spacing:.01em;border:0;border-radius:999px;padding:.05rem .5rem;font-size:.74rem;font-weight:600;display:inline-block;transform:none}.badge-ok{background:var(--ui-badge-ok-bg);color:var(--ui-badge-ok-fg)}.badge-warn{background:var(--ui-badge-warn-bg);color:var(--ui-badge-warn-fg)}.badge-err{background:var(--ui-badge-err-bg);color:var(--ui-badge-err-fg)}.badge-info{background:var(--ui-badge-info-bg);color:var(--ui-badge-info-fg)}.kbd{border:1px solid var(--ui-border);background:var(--ui-surface-2);color:var(--ui-text);box-shadow:none;font-family:var(--sl-font-mono);border-radius:5px;padding:.1em .4em;font-size:.84rem;display:inline-block}.callout{background:var(--ui-note);color:var(--ui-text);border:1px solid var(--ui-border);border-inline-start:3px solid var(--ui-accent);border-radius:8px;margin:20px 0;padding:1rem 1.25rem;font-weight:500}.callout p{margin:0}.callout-info,.callout-ok{background:var(--ui-tip)}ul,ol{padding-inline-start:1.5rem}li::marker{color:var(--ui-accent)}.step-list{counter-reset:steps;padding-left:0;list-style:none}.step-list li{counter-increment:steps;margin-top:14px;padding-left:48px;position:relative}.step-list li:before{content:counter(steps);background:var(--ui-accent-soft);width:30px;height:30px;color:var(--ui-accent-strong);box-shadow:none;font-family:var(--font-display);border-radius:999px;place-items:center;font-weight:600;display:grid;position:absolute;top:0;left:0}.flag-name{font-family:var(--sl-font-mono);font-weight:600}.footer{max-width:1200px;color:var(--ui-muted);margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem) 2.5rem;font-size:.9rem}.footer a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong)}.footer a:hover{background:var(--ui-accent-soft)}.footer-links{margin-top:6px}.file-tree{font-family:var(--sl-font-mono);white-space:pre;font-size:.9rem;overflow-x:auto}@media (width<=900px){.shell{grid-template-columns:1fr}.sidebar{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);flex-wrap:wrap;align-items:center;gap:.4rem;padding:.75rem 1rem;display:flex;position:static}.side-group{display:contents;margin:0!important}.sidebar ul{flex-wrap:wrap;gap:.25rem;display:flex}.group-label{margin:0 .2rem}.sidebar a,.side-link{background:var(--ui-surface-2);border-radius:999px;padding:.3rem .7rem}.sidebar a.is-active,.side-link.is-active{box-shadow:none}}@media (width<=720px){.hero{border-radius:var(--ui-radius);box-shadow:0 8px 24px var(--ui-shadow-color);grid-template-columns:1fr;padding:1.5rem}.shot,.code-block{box-shadow:0 4px 16px var(--ui-shadow-color)}th,td{padding:.5rem .55rem}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}} diff --git a/docs/web/dist/assets/index-Bpn6tfSv.js b/docs/web/dist/assets/index-y37U0USe.js similarity index 98% rename from docs/web/dist/assets/index-Bpn6tfSv.js rename to docs/web/dist/assets/index-y37U0USe.js index 6aa11c9..f4f0aa8 100644 --- a/docs/web/dist/assets/index-Bpn6tfSv.js +++ b/docs/web/dist/assets/index-y37U0USe.js @@ -22,4 +22,4 @@ case $? in 3) devopsgen init --force --stack go --registry ghcr --image you/myapp --port 8080 ;; 2) echo "fix your flags" >&2 ;; *) echo "see devopsgen validate output" >&2 ;; -esac`}),(0,d.jsx)(`div`,{className:`callout callout-info`,children:`Codes are part of DevOpsGen's compatibility promise: bumping a major version may add new codes, but existing ones keep their meaning.`})]})}var re=`https://devopsgen.bangkah.tech/`,x=[{path:``,component:_,title:`DevOpsGen — DevOps scaffolding for Go & Node.js projects`,description:`DevOpsGen generates production-ready Dockerfiles, GitHub Actions pipelines and Kubernetes manifests for Go and Node.js projects, with safe dry-run plans, automatic backups and config validation.`,keywords:`DevOpsGen, dockerfile generator, github actions generator, kubernetes manifests, go, nodejs, scaffolding, ci cd`,ogImage:`img/init-success.png`},{path:`getting-started`,component:v,title:`Getting Started — DevOpsGen Docs`,description:`Install DevOpsGen via go install or a release binary, then generate a complete Docker, CI and Kubernetes setup for your project with a single command.`,keywords:`DevOpsGen install, go install, quickstart, getting started`,ogImage:`img/init-success.png`},{path:`wizard`,component:y,title:`Interactive Wizard — DevOpsGen Docs`,description:`DevOpsGen launches an interactive TUI wizard that walks through stack detection, ports, container images and Kubernetes options, then writes the generated configuration.`,keywords:`DevOpsGen wizard, tui, bubbletea, interactive`,ogImage:`img/wizard.png`},{path:`init`,component:b,title:`init command — DevOpsGen Docs`,description:`Full reference for devopsgen init flags: stack, app type, CI provider, registry, image, port, Kubernetes ingress, health path, dry-run and force overwrite behaviour.`,keywords:`devopsgen init, flags, dry-run, force, image, ingress`,ogImage:`img/init-success.png`},{path:`detect`,component:ee,title:`detect command — DevOpsGen Docs`,description:`devopsgen detect inspects the current project and reports the programming stack, the files it based its decision on, and candidate application types.`,keywords:`devopsgen detect, stack detection, go.mod, package.json`,ogImage:`img/detect.png`},{path:`validate`,component:te,title:`validate command — DevOpsGen Docs`,description:`devopsgen validate statically checks generated Dockerfiles, GitHub Actions workflows and Kubernetes manifests: FROM digests, action pinning, naming rules, probes and more.`,keywords:`devopsgen validate, dockerfile lint, workflow lint, kubernetes manifest lint`,ogImage:`img/validate.png`},{path:`exit-codes`,component:ne,title:`Exit codes — DevOpsGen Docs`,description:`Every devopsgen command exits with a documented status code: 0 success, 1 general error, 2 invalid configuration, 3 file conflicts, 4 validation failure, 5 ambiguous detection.`,keywords:`devopsgen exit codes, ci integration, pipeline status`,ogImage:`img/validate.png`}],ie=[{label:`Overview`,items:[`getting-started`,`wizard`]},{label:`Command reference`,items:[`init`,`detect`,`validate`]},{label:`Operations`,items:[`exit-codes`]}];function S({rel:e,activePath:t,children:n}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(`a`,{className:`skip`,href:`#main`,children:`skip to content`}),(0,d.jsxs)(`header`,{className:`topbar`,children:[(0,d.jsxs)(`a`,{className:`brand`,href:e||`./`,children:[(0,d.jsx)(`span`,{className:`brand-mark`,children:`DG`}),(0,d.jsx)(`span`,{className:`brand-name`,children:`DevOpsGen`}),(0,d.jsx)(`span`,{className:`brand-sub`,children:`DOCS`})]}),(0,d.jsx)(`a`,{className:`gh-pill`,href:`https://github.com/Bangkahdev/DevOpsGen`,rel:`noopener noreferrer`,target:`_blank`,children:`GitHub`})]}),(0,d.jsxs)(`div`,{className:`shell`,children:[(0,d.jsxs)(`aside`,{className:`sidebar`,"aria-label":`Documentation navigation`,children:[(0,d.jsx)(`a`,{className:`side-link side-home${t===``?` is-active`:``}`,href:e||`./`,children:`Home`}),ie.map(n=>(0,d.jsxs)(`div`,{className:`side-group`,children:[(0,d.jsx)(`p`,{className:`group-label`,children:n.label}),(0,d.jsx)(`ul`,{children:n.items.map(n=>{let r=x.find(e=>e.path===n);return(0,d.jsx)(`li`,{children:(0,d.jsx)(`a`,{className:`side-link${t===n?` is-active`:``}`,href:`${e}${n}/`,"aria-current":t===n?`page`:void 0,children:r?r.path.replace(/-/g,` `):n})},n)})})]},n.label))]}),(0,d.jsx)(`main`,{id:`main`,children:n})]}),(0,d.jsxs)(`footer`,{className:`footer`,children:[(0,d.jsxs)(`p`,{children:[`DevOpsGen — deterministic DevOps scaffolding for Go & Node.js.`,` `,(0,d.jsx)(`a`,{href:`${e}getting-started/`,children:`Get started`}),` or browse the`,` `,(0,d.jsx)(`a`,{href:`${e}exit-codes/`,children:`exit codes`}),`.`]}),(0,d.jsxs)(`p`,{className:`footer-links`,children:[(0,d.jsx)(`a`,{href:re,children:`canonical site`}),` · `,(0,d.jsx)(`a`,{href:`https://github.com/Bangkahdev/DevOpsGen`,children:`source code`})]})]})]})}var ae=x.find(e=>e.path===location.pathname.replace(/\/$/,``).replace(/^.*\//,``))??null,oe=ae&&ae.path===``?``:`../`,se=ae??x[0];(0,l.createRoot)(document.getElementById(`root`)).render((0,d.jsx)(S,{rel:oe,activePath:ae?ae.path:``,children:(0,d.jsx)(se.component,{rel:oe})})); \ No newline at end of file +esac`}),(0,d.jsx)(`div`,{className:`callout callout-info`,children:`Codes are part of DevOpsGen's compatibility promise: bumping a major version may add new codes, but existing ones keep their meaning.`})]})}var re=`https://devopsgen.bangkah.tech/`,x=[{path:``,component:_,title:`DevOpsGen — DevOps scaffolding for Go & Node.js projects`,description:`DevOpsGen generates production-ready Dockerfiles, GitHub Actions pipelines and Kubernetes manifests for Go and Node.js projects, with safe dry-run plans, automatic backups and config validation.`,keywords:`DevOpsGen, dockerfile generator, github actions generator, kubernetes manifests, go, nodejs, scaffolding, ci cd`,ogImage:`img/og.png`},{path:`getting-started`,component:v,title:`Getting Started — DevOpsGen Docs`,description:`Install DevOpsGen via go install or a release binary, then generate a complete Docker, CI and Kubernetes setup for your project with a single command.`,keywords:`DevOpsGen install, go install, quickstart, getting started`,ogImage:`img/init-success.png`},{path:`wizard`,component:y,title:`Interactive Wizard — DevOpsGen Docs`,description:`DevOpsGen launches an interactive TUI wizard that walks through stack detection, ports, container images and Kubernetes options, then writes the generated configuration.`,keywords:`DevOpsGen wizard, tui, bubbletea, interactive`,ogImage:`img/wizard.png`},{path:`init`,component:b,title:`init command — DevOpsGen Docs`,description:`Full reference for devopsgen init flags: stack, app type, CI provider, registry, image, port, Kubernetes ingress, health path, dry-run and force overwrite behaviour.`,keywords:`devopsgen init, flags, dry-run, force, image, ingress`,ogImage:`img/init-success.png`},{path:`detect`,component:ee,title:`detect command — DevOpsGen Docs`,description:`devopsgen detect inspects the current project and reports the programming stack, the files it based its decision on, and candidate application types.`,keywords:`devopsgen detect, stack detection, go.mod, package.json`,ogImage:`img/detect.png`},{path:`validate`,component:te,title:`validate command — DevOpsGen Docs`,description:`devopsgen validate statically checks generated Dockerfiles, GitHub Actions workflows and Kubernetes manifests: FROM digests, action pinning, naming rules, probes and more.`,keywords:`devopsgen validate, dockerfile lint, workflow lint, kubernetes manifest lint`,ogImage:`img/validate.png`},{path:`exit-codes`,component:ne,title:`Exit codes — DevOpsGen Docs`,description:`Every devopsgen command exits with a documented status code: 0 success, 1 general error, 2 invalid configuration, 3 file conflicts, 4 validation failure, 5 ambiguous detection.`,keywords:`devopsgen exit codes, ci integration, pipeline status`,ogImage:`img/validate.png`}],ie=[{label:`Overview`,items:[`getting-started`,`wizard`]},{label:`Command reference`,items:[`init`,`detect`,`validate`]},{label:`Operations`,items:[`exit-codes`]}];function S({rel:e,activePath:t,children:n}){let r=t===``;return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(`a`,{className:`skip`,href:`#main`,children:`skip to content`}),(0,d.jsxs)(`header`,{className:`topbar`,children:[(0,d.jsxs)(`a`,{className:`brand`,href:e||`./`,children:[(0,d.jsx)(`img`,{className:`brand-mark`,src:`${e}logo.svg`,width:`36`,height:`36`,alt:``}),(0,d.jsx)(`span`,{className:`brand-name`,children:`DevOpsGen`}),(0,d.jsx)(`span`,{className:`brand-sub`,children:`DOCS`})]}),(0,d.jsx)(`a`,{className:`gh-pill`,href:`https://github.com/Bangkahdev/DevOpsGen`,rel:`noopener noreferrer`,target:`_blank`,children:`GitHub`})]}),(0,d.jsxs)(`div`,{className:`shell`,children:[(0,d.jsxs)(`aside`,{className:`sidebar`,"aria-label":`Documentation navigation`,children:[(0,d.jsx)(`a`,{className:`side-link side-home${r?` is-active`:``}`,href:e||`./`,children:`Home`}),ie.map(n=>(0,d.jsxs)(`div`,{className:`side-group`,children:[(0,d.jsx)(`p`,{className:`group-label`,children:n.label}),(0,d.jsx)(`ul`,{children:n.items.map(n=>{let r=x.find(e=>e.path===n);return(0,d.jsx)(`li`,{children:(0,d.jsx)(`a`,{className:`side-link${t===n?` is-active`:``}`,href:`${e}${n}/`,"aria-current":t===n?`page`:void 0,children:r?r.path.replace(/-/g,` `):n})},n)})})]},n.label))]}),(0,d.jsx)(`main`,{id:`main`,children:n})]}),(0,d.jsxs)(`footer`,{className:`footer`,children:[(0,d.jsxs)(`p`,{children:[`DevOpsGen — deterministic DevOps scaffolding for Go & Node.js.`,` `,(0,d.jsx)(`a`,{href:`${e}getting-started/`,children:`Get started`}),` or browse the`,` `,(0,d.jsx)(`a`,{href:`${e}exit-codes/`,children:`exit codes`}),`.`]}),(0,d.jsxs)(`p`,{className:`footer-links`,children:[(0,d.jsx)(`a`,{href:re,children:`canonical site`}),` · `,(0,d.jsx)(`a`,{href:`https://github.com/Bangkahdev/DevOpsGen`,children:`source code`})]})]})]})}var ae=x.find(e=>e.path===location.pathname.replace(/\/$/,``).replace(/^.*\//,``))??null,oe=ae&&ae.path===``?``:`../`,se=ae??x[0];(0,l.createRoot)(document.getElementById(`root`)).render((0,d.jsx)(S,{rel:oe,activePath:ae?ae.path:``,children:(0,d.jsx)(se.component,{rel:oe})})); \ No newline at end of file diff --git a/docs/web/dist/assets/site.css b/docs/web/dist/assets/site.css index 3788710..005c0fb 100644 --- a/docs/web/dist/assets/site.css +++ b/docs/web/dist/assets/site.css @@ -1 +1 @@ -@import "https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap";:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--ui-bg:#f3ede3;--ui-surface:#fffaf2;--ui-surface-2:#f7f0e6;--ui-text:#332820;--ui-text-soft:#5e4d3f;--ui-muted:#756455;--ui-border:#e2d5c5;--ui-border-strong:#d3c2ad;--ui-accent:#8a5b3d;--ui-accent-strong:#7a4f33;--ui-accent-soft:#efe0cf;--ui-accent-contrast:#fffaf2;--ui-badge-ok-bg:#e4ecd9;--ui-badge-ok-fg:#55683f;--ui-badge-warn-bg:#fbf0d2;--ui-badge-warn-fg:#7a5c17;--ui-badge-err-bg:#f9e2db;--ui-badge-err-fg:#8a4a38;--ui-badge-info-bg:#efe6ec;--ui-badge-info-fg:#6e4a63;--ui-note:#f4ead9;--ui-tip:#edf0e2;--ui-caution:#fbf0d2;--ui-danger:#f9e2db;--ui-code:#2d231c;--ui-code-text:#f8f1e8;--ui-code-bar:#efe2d2;--ui-code-bar-text:#5e3c27;--ui-shadow-color:#4a34261a;--ui-shadow-strong:#4a342629;--ui-radius-sm:6px;--ui-radius:10px;--ui-radius-lg:16px;--font-display:"DM Sans", ui-sans-serif, system-ui, sans-serif;--sl-font:"DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--sl-font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*{scrollbar-color:var(--ui-border-strong) var(--ui-bg);box-sizing:border-box}html{scroll-behavior:smooth}body{background:var(--ui-bg);color:var(--ui-text);font-family:var(--sl-font);text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;font-size:1rem;font-weight:400;line-height:1.75}::selection{background:var(--ui-accent-soft);color:var(--ui-accent-strong)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-track{background:var(--ui-bg)}::-webkit-scrollbar-thumb{background:var(--ui-border-strong);border:3px solid var(--ui-bg);border-radius:999px}::-webkit-scrollbar-thumb:hover{background:var(--ui-accent)}:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px}.skip{z-index:99;background:var(--ui-accent);color:var(--ui-accent-contrast);border-radius:var(--ui-radius-sm);font-family:var(--sl-font);padding:8px 16px;font-weight:600;position:absolute;top:0;left:-9999px}.skip:focus{left:8px}.topbar{background:var(--ui-surface);border-bottom:1px solid var(--ui-border);align-items:center;gap:16px;padding:.6rem clamp(1rem,3vw,2rem);display:flex}.brand{color:var(--ui-text);align-items:center;gap:10px;text-decoration:none;display:inline-flex}.brand-mark{border-radius:var(--ui-radius);background:var(--ui-accent-soft);width:2.25rem;height:2.25rem;color:var(--ui-accent-strong);box-shadow:0 2px 8px var(--ui-shadow-color);font-family:var(--font-display);place-items:center;font-size:.95rem;font-weight:700;display:grid}.brand-name{font-family:var(--font-display);letter-spacing:-.015em;font-size:1rem;font-weight:700}.brand-sub{background:var(--ui-accent-soft);color:var(--ui-accent-strong);letter-spacing:.08em;border-radius:999px;padding:.16rem .45rem;font-size:.58rem;font-weight:700}.gh-pill{border:1px solid var(--ui-border);background:var(--ui-surface-2);height:2.25rem;box-shadow:none;color:var(--ui-text-soft);font-family:var(--sl-font);border-radius:8px;align-items:center;gap:.4rem;margin-left:auto;padding:0 1rem;font-size:.8rem;font-weight:600;text-decoration:none;transition:background .15s,border-color .15s;display:inline-flex}.gh-pill:hover{background:var(--ui-accent-soft);border-color:var(--ui-border-strong);color:var(--ui-accent-strong)}.shell{grid-template-columns:210px minmax(0,1fr);align-items:start;gap:clamp(1.5rem,3vw,2.5rem);max-width:1200px;margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem);display:grid}.sidebar{padding-block:.25rem;position:sticky;top:1.5rem}.side-home{margin-bottom:.4rem}.side-group+.side-group{margin-top:1.25rem}.group-label{color:var(--ui-muted);letter-spacing:.12em;text-transform:uppercase;margin:0 0 .4rem;padding:0 .6rem;font-size:.66rem;font-weight:700}.sidebar ul{margin:0;padding:0;list-style:none}.sidebar a,.side-link{color:var(--ui-text-soft);text-transform:capitalize;border-radius:7px;padding:.4rem .6rem;font-weight:500;line-height:1.35;text-decoration:none;transition:background .15s,color .15s;display:block}.sidebar a:hover,.side-link:hover{background:var(--ui-surface-2);color:var(--ui-text)}.sidebar a.is-active,.side-link.is-active{background:var(--ui-accent-soft);color:var(--ui-accent-strong);box-shadow:inset 3px 0 0 var(--ui-accent);font-weight:600}main{min-width:0}.page-head{margin-bottom:26px}.kicker{background:var(--ui-accent-soft);color:var(--ui-accent-strong);letter-spacing:.12em;text-transform:uppercase;border-radius:999px;margin:0 0 12px;padding:.22rem .7rem;font-size:.66rem;font-weight:700;display:inline-block}.violet{background:var(--ui-badge-info-bg);color:var(--ui-badge-info-fg)}.blue{background:var(--ui-note);color:var(--ui-text-soft)}.pink,.yellow{background:var(--ui-caution);color:var(--ui-badge-warn-fg)}h1{color:var(--ui-text);box-shadow:none;font-family:var(--font-display);letter-spacing:-.03em;overflow-wrap:anywhere;background:0 0;margin:0 0 14px;padding:0;font-size:clamp(1.9rem,3.8vw,2.6rem);font-weight:700;line-height:1.12;display:block}.lede{background:var(--ui-surface);max-width:46rem;color:var(--ui-text-soft);border:1px solid var(--ui-border);border-inline-start:3px solid var(--ui-accent);border-radius:8px;margin-block:0 8px;padding:1rem 1.25rem;font-size:1.02rem;line-height:1.7;display:block}h2{border-bottom:1px solid var(--ui-border);font-family:var(--font-display);letter-spacing:-.025em;align-items:center;gap:.6rem;margin-block:2.5rem 1rem;padding-bottom:.55rem;font-size:clamp(1.25rem,2.3vw,1.45rem);font-weight:600;display:flex}h2:before{content:"";background:var(--ui-accent);border-radius:999px;flex:none;width:.35rem;height:1.1em}h3{font-family:var(--font-display);margin-block:1.75rem .6rem;font-size:1.08rem;font-weight:600}strong{color:var(--ui-accent-strong);font-weight:600}code:not(.code-block code){background:var(--ui-surface-2);color:var(--ui-accent-strong);border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);font-family:var(--sl-font-mono);-webkit-box-decoration-break:clone;box-decoration-break:clone;padding:.08em .35em;font-size:.88em;font-weight:500}a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong);text-underline-offset:3px;text-decoration-thickness:1px}a:hover{color:var(--ui-accent);-webkit-text-decoration-color:var(--ui-accent);text-decoration-color:var(--ui-accent);background:0 0}.btn:hover,.gh-pill:hover,.sidebar a:hover,.side-link:hover{background-color:inherit}a.btn:hover{color:var(--ui-accent-contrast);background:var(--ui-accent-strong);text-decoration:none}.hero{background:var(--ui-surface);color:var(--ui-text);border:1px solid var(--ui-border);border-radius:var(--ui-radius-lg);box-shadow:0 16px 40px var(--ui-shadow-color);grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);align-items:center;gap:clamp(1.5rem,4vw,3rem);margin:.5rem 0 2rem;padding:clamp(1.5rem,4vw,3rem);display:grid;position:relative}.hero-cta{flex-wrap:wrap;gap:.75rem;margin-top:6px;display:flex}.btn{border:1px solid var(--ui-accent);background:var(--ui-accent);color:var(--ui-accent-contrast);box-shadow:0 2px 6px var(--ui-shadow-color);border-radius:9px;padding:.6rem 1.1rem;font-weight:600;text-decoration:none;transition:background .15s,border-color .15s,box-shadow .15s,transform .15s;display:inline-block}.btn:hover{box-shadow:0 6px 16px var(--ui-shadow-strong);transform:translateY(-1px)}.btn-pink{background:var(--ui-surface-2);color:var(--ui-text);border-color:var(--ui-border)}.btn-pink:hover{background:var(--ui-accent-soft);border-color:var(--ui-border-strong);color:var(--ui-accent-strong)}.btn-yellow{background:var(--ui-surface-2);color:var(--ui-text);border-color:var(--ui-border)}.cards{grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1.25rem;display:grid}.card{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);box-shadow:0 1px 2px var(--ui-shadow-color);color:inherit;padding:1.5rem;text-decoration:none;transition:transform .18s,box-shadow .18s,border-color .18s}.card h3{margin-top:0;font-size:.98rem}.card p,.card li{color:var(--ui-muted);font-size:.9rem;line-height:1.6}.card:hover{border-color:var(--ui-border-strong);box-shadow:0 10px 24px var(--ui-shadow-color);transform:translateY(-2px)}a.card h3{color:var(--ui-accent-strong)}.core .card:hover{border-color:var(--ui-accent)}.shot{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);box-shadow:0 8px 24px var(--ui-shadow-color);max-width:100%;margin:22px 0;padding:10px}.shot img{border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);width:100%;height:auto;display:block}.shot figcaption{color:var(--ui-muted);margin-top:10px;font-size:.85rem;font-weight:500}.shot a:hover{color:inherit;background:0 0}.shot-feature{max-width:880px}.screen-strip{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));align-items:start;gap:22px;display:grid}.screen-strip .shot{margin:0 0 12px}.code-block{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-code);color:var(--ui-code-text);box-shadow:0 10px 30px var(--ui-shadow-color);margin:20px 0;position:relative;overflow:hidden}.code-label{background:var(--ui-code-bar);color:var(--ui-code-bar-text);font-family:var(--sl-font-mono);letter-spacing:.06em;text-transform:uppercase;padding:.45rem .9rem;font-size:.7rem;font-weight:600;position:absolute;top:0;left:0;right:0}.code-block pre{font-family:var(--sl-font-mono);margin:0;padding:2.2rem 18px 16px;font-size:.86rem;line-height:1.6;overflow-x:auto}.code-block code{color:inherit;font-size:inherit;background:0 0;border:0;padding:0}.table-wrap{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-surface);box-shadow:0 1px 2px var(--ui-shadow-color);margin:18px 0;overflow:auto}table{border-collapse:collapse;width:100%;font-size:.92rem}th,td{text-align:left;vertical-align:top;padding:.65rem .75rem}th{background:var(--ui-surface-2);color:var(--ui-muted);letter-spacing:.06em;text-transform:uppercase;font-size:.7rem;font-weight:700}td{border-top:1px solid var(--ui-border)}tbody tr:nth-child(2n) td{background:var(--ui-surface-2)}td code{white-space:nowrap}.num{font-weight:700}.badge{font-family:var(--sl-font-mono);letter-spacing:.01em;border:0;border-radius:999px;padding:.05rem .5rem;font-size:.74rem;font-weight:600;display:inline-block;transform:none}.badge-ok{background:var(--ui-badge-ok-bg);color:var(--ui-badge-ok-fg)}.badge-warn{background:var(--ui-badge-warn-bg);color:var(--ui-badge-warn-fg)}.badge-err{background:var(--ui-badge-err-bg);color:var(--ui-badge-err-fg)}.badge-info{background:var(--ui-badge-info-bg);color:var(--ui-badge-info-fg)}.kbd{border:1px solid var(--ui-border);background:var(--ui-surface-2);color:var(--ui-text);box-shadow:none;font-family:var(--sl-font-mono);border-radius:5px;padding:.1em .4em;font-size:.84rem;display:inline-block}.callout{background:var(--ui-note);color:var(--ui-text);border:1px solid var(--ui-border);border-inline-start:3px solid var(--ui-accent);border-radius:8px;margin:20px 0;padding:1rem 1.25rem;font-weight:500}.callout p{margin:0}.callout-info,.callout-ok{background:var(--ui-tip)}ul,ol{padding-inline-start:1.5rem}li::marker{color:var(--ui-accent)}.step-list{counter-reset:steps;padding-left:0;list-style:none}.step-list li{counter-increment:steps;margin-top:14px;padding-left:48px;position:relative}.step-list li:before{content:counter(steps);background:var(--ui-accent-soft);width:30px;height:30px;color:var(--ui-accent-strong);box-shadow:none;font-family:var(--font-display);border-radius:999px;place-items:center;font-weight:600;display:grid;position:absolute;top:0;left:0}.flag-name{font-family:var(--sl-font-mono);font-weight:600}.footer{max-width:1200px;color:var(--ui-muted);margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem) 2.5rem;font-size:.9rem}.footer a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong)}.footer a:hover{background:var(--ui-accent-soft)}.footer-links{margin-top:6px}.file-tree{font-family:var(--sl-font-mono);white-space:pre;font-size:.9rem;overflow-x:auto}@media (width<=900px){.shell{grid-template-columns:1fr}.sidebar{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);flex-wrap:wrap;align-items:center;gap:.4rem;padding:.75rem 1rem;display:flex;position:static}.side-group{display:contents;margin:0!important}.sidebar ul{flex-wrap:wrap;gap:.25rem;display:flex}.group-label{margin:0 .2rem}.sidebar a,.side-link{background:var(--ui-surface-2);border-radius:999px;padding:.3rem .7rem}.sidebar a.is-active,.side-link.is-active{box-shadow:none}}@media (width<=720px){.hero{border-radius:var(--ui-radius);box-shadow:0 8px 24px var(--ui-shadow-color);grid-template-columns:1fr;padding:1.5rem}.shot,.code-block{box-shadow:0 4px 16px var(--ui-shadow-color)}th,td{padding:.5rem .55rem}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}} +@import "https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap";:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--ui-bg:#f3ede3;--ui-surface:#fffaf2;--ui-surface-2:#f7f0e6;--ui-text:#332820;--ui-text-soft:#5e4d3f;--ui-muted:#756455;--ui-border:#e2d5c5;--ui-border-strong:#d3c2ad;--ui-accent:#8a5b3d;--ui-accent-strong:#7a4f33;--ui-accent-soft:#efe0cf;--ui-accent-contrast:#fffaf2;--ui-badge-ok-bg:#e4ecd9;--ui-badge-ok-fg:#55683f;--ui-badge-warn-bg:#fbf0d2;--ui-badge-warn-fg:#7a5c17;--ui-badge-err-bg:#f9e2db;--ui-badge-err-fg:#8a4a38;--ui-badge-info-bg:#efe6ec;--ui-badge-info-fg:#6e4a63;--ui-note:#f4ead9;--ui-tip:#edf0e2;--ui-caution:#fbf0d2;--ui-danger:#f9e2db;--ui-code:#2d231c;--ui-code-text:#f8f1e8;--ui-code-bar:#efe2d2;--ui-code-bar-text:#5e3c27;--ui-shadow-color:#4a34261a;--ui-shadow-strong:#4a342629;--ui-radius-sm:6px;--ui-radius:10px;--ui-radius-lg:16px;--font-display:"DM Sans", ui-sans-serif, system-ui, sans-serif;--sl-font:"DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--sl-font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*{scrollbar-color:var(--ui-border-strong) var(--ui-bg);box-sizing:border-box}html{scroll-behavior:smooth}body{background:var(--ui-bg);color:var(--ui-text);font-family:var(--sl-font);text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;font-size:1rem;font-weight:400;line-height:1.75}::selection{background:var(--ui-accent-soft);color:var(--ui-accent-strong)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-track{background:var(--ui-bg)}::-webkit-scrollbar-thumb{background:var(--ui-border-strong);border:3px solid var(--ui-bg);border-radius:999px}::-webkit-scrollbar-thumb:hover{background:var(--ui-accent)}:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px}.skip{z-index:99;background:var(--ui-accent);color:var(--ui-accent-contrast);border-radius:var(--ui-radius-sm);font-family:var(--sl-font);padding:8px 16px;font-weight:600;position:absolute;top:0;left:-9999px}.skip:focus{left:8px}.topbar{background:var(--ui-surface);border-bottom:1px solid var(--ui-border);align-items:center;gap:16px;padding:.6rem clamp(1rem,3vw,2rem);display:flex}.brand{color:var(--ui-text);align-items:center;gap:10px;text-decoration:none;display:inline-flex}.brand-mark{width:2.25rem;height:2.25rem;box-shadow:0 2px 8px var(--ui-shadow-color);display:block}.brand-name{font-family:var(--font-display);letter-spacing:-.015em;font-size:1rem;font-weight:700}.brand-sub{background:var(--ui-accent-soft);color:var(--ui-accent-strong);letter-spacing:.08em;border-radius:999px;padding:.16rem .45rem;font-size:.58rem;font-weight:700}.gh-pill{border:1px solid var(--ui-border);background:var(--ui-surface-2);height:2.25rem;box-shadow:none;color:var(--ui-text-soft);font-family:var(--sl-font);border-radius:8px;align-items:center;gap:.4rem;margin-left:auto;padding:0 1rem;font-size:.8rem;font-weight:600;text-decoration:none;transition:background .15s,border-color .15s;display:inline-flex}.gh-pill:hover{background:var(--ui-accent-soft);border-color:var(--ui-border-strong);color:var(--ui-accent-strong)}.shell{grid-template-columns:210px minmax(0,1fr);align-items:start;gap:clamp(1.5rem,3vw,2.5rem);max-width:1200px;margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem);display:grid}.sidebar{padding-block:.25rem;position:sticky;top:1.5rem}.side-home{margin-bottom:.4rem}.side-group+.side-group{margin-top:1.25rem}.group-label{color:var(--ui-muted);letter-spacing:.12em;text-transform:uppercase;margin:0 0 .4rem;padding:0 .6rem;font-size:.66rem;font-weight:700}.sidebar ul{margin:0;padding:0;list-style:none}.sidebar a,.side-link{color:var(--ui-text-soft);text-transform:capitalize;border-radius:7px;padding:.4rem .6rem;font-weight:500;line-height:1.35;text-decoration:none;transition:background .15s,color .15s;display:block}.sidebar a:hover,.side-link:hover{background:var(--ui-surface-2);color:var(--ui-text)}.sidebar a.is-active,.side-link.is-active{background:var(--ui-accent-soft);color:var(--ui-accent-strong);box-shadow:inset 3px 0 0 var(--ui-accent);font-weight:600}main{min-width:0}.page-head{margin-bottom:26px}.kicker{background:var(--ui-accent-soft);color:var(--ui-accent-strong);letter-spacing:.12em;text-transform:uppercase;border-radius:999px;margin:0 0 12px;padding:.22rem .7rem;font-size:.66rem;font-weight:700;display:inline-block}.violet{background:var(--ui-badge-info-bg);color:var(--ui-badge-info-fg)}.blue{background:var(--ui-note);color:var(--ui-text-soft)}.pink,.yellow{background:var(--ui-caution);color:var(--ui-badge-warn-fg)}h1{color:var(--ui-text);box-shadow:none;font-family:var(--font-display);letter-spacing:-.03em;overflow-wrap:anywhere;background:0 0;margin:0 0 14px;padding:0;font-size:clamp(1.9rem,3.8vw,2.6rem);font-weight:700;line-height:1.12;display:block}.lede{background:var(--ui-surface);max-width:46rem;color:var(--ui-text-soft);border:1px solid var(--ui-border);border-inline-start:3px solid var(--ui-accent);border-radius:8px;margin-block:0 8px;padding:1rem 1.25rem;font-size:1.02rem;line-height:1.7;display:block}h2{border-bottom:1px solid var(--ui-border);font-family:var(--font-display);letter-spacing:-.025em;align-items:center;gap:.6rem;margin-block:2.5rem 1rem;padding-bottom:.55rem;font-size:clamp(1.25rem,2.3vw,1.45rem);font-weight:600;display:flex}h2:before{content:"";background:var(--ui-accent);border-radius:999px;flex:none;width:.35rem;height:1.1em}h3{font-family:var(--font-display);margin-block:1.75rem .6rem;font-size:1.08rem;font-weight:600}strong{color:var(--ui-accent-strong);font-weight:600}code:not(.code-block code){background:var(--ui-surface-2);color:var(--ui-accent-strong);border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);font-family:var(--sl-font-mono);-webkit-box-decoration-break:clone;box-decoration-break:clone;padding:.08em .35em;font-size:.88em;font-weight:500}a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong);text-underline-offset:3px;text-decoration-thickness:1px}a:hover{color:var(--ui-accent);-webkit-text-decoration-color:var(--ui-accent);text-decoration-color:var(--ui-accent);background:0 0}.btn:hover,.gh-pill:hover,.sidebar a:hover,.side-link:hover{background-color:inherit}a.btn:hover{color:var(--ui-accent-contrast);background:var(--ui-accent-strong);text-decoration:none}.hero{background:var(--ui-surface);color:var(--ui-text);border:1px solid var(--ui-border);border-radius:var(--ui-radius-lg);box-shadow:0 16px 40px var(--ui-shadow-color);grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);align-items:center;gap:clamp(1.5rem,4vw,3rem);margin:.5rem 0 2rem;padding:clamp(1.5rem,4vw,3rem);display:grid;position:relative}.hero-cta{flex-wrap:wrap;gap:.75rem;margin-top:6px;display:flex}.btn{border:1px solid var(--ui-accent);background:var(--ui-accent);color:var(--ui-accent-contrast);box-shadow:0 2px 6px var(--ui-shadow-color);border-radius:9px;padding:.6rem 1.1rem;font-weight:600;text-decoration:none;transition:background .15s,border-color .15s,box-shadow .15s,transform .15s;display:inline-block}.btn:hover{box-shadow:0 6px 16px var(--ui-shadow-strong);transform:translateY(-1px)}.btn-pink{background:var(--ui-surface-2);color:var(--ui-text);border-color:var(--ui-border)}.btn-pink:hover{background:var(--ui-accent-soft);border-color:var(--ui-border-strong);color:var(--ui-accent-strong)}.btn-yellow{background:var(--ui-surface-2);color:var(--ui-text);border-color:var(--ui-border)}.cards{grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1.25rem;display:grid}.card{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);box-shadow:0 1px 2px var(--ui-shadow-color);color:inherit;padding:1.5rem;text-decoration:none;transition:transform .18s,box-shadow .18s,border-color .18s}.card h3{margin-top:0;font-size:.98rem}.card p,.card li{color:var(--ui-muted);font-size:.9rem;line-height:1.6}.card:hover{border-color:var(--ui-border-strong);box-shadow:0 10px 24px var(--ui-shadow-color);transform:translateY(-2px)}a.card h3{color:var(--ui-accent-strong)}.core .card:hover{border-color:var(--ui-accent)}.shot{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);box-shadow:0 8px 24px var(--ui-shadow-color);max-width:100%;margin:22px 0;padding:10px}.shot img{border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);width:100%;height:auto;display:block}.shot figcaption{color:var(--ui-muted);margin-top:10px;font-size:.85rem;font-weight:500}.shot a:hover{color:inherit;background:0 0}.shot-feature{max-width:880px}.screen-strip{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));align-items:start;gap:22px;display:grid}.screen-strip .shot{margin:0 0 12px}.code-block{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-code);color:var(--ui-code-text);box-shadow:0 10px 30px var(--ui-shadow-color);margin:20px 0;position:relative;overflow:hidden}.code-label{background:var(--ui-code-bar);color:var(--ui-code-bar-text);font-family:var(--sl-font-mono);letter-spacing:.06em;text-transform:uppercase;padding:.45rem .9rem;font-size:.7rem;font-weight:600;position:absolute;top:0;left:0;right:0}.code-block pre{font-family:var(--sl-font-mono);margin:0;padding:2.2rem 18px 16px;font-size:.86rem;line-height:1.6;overflow-x:auto}.code-block code{color:inherit;font-size:inherit;background:0 0;border:0;padding:0}.table-wrap{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-surface);box-shadow:0 1px 2px var(--ui-shadow-color);margin:18px 0;overflow:auto}table{border-collapse:collapse;width:100%;font-size:.92rem}th,td{text-align:left;vertical-align:top;padding:.65rem .75rem}th{background:var(--ui-surface-2);color:var(--ui-muted);letter-spacing:.06em;text-transform:uppercase;font-size:.7rem;font-weight:700}td{border-top:1px solid var(--ui-border)}tbody tr:nth-child(2n) td{background:var(--ui-surface-2)}td code{white-space:nowrap}.num{font-weight:700}.badge{font-family:var(--sl-font-mono);letter-spacing:.01em;border:0;border-radius:999px;padding:.05rem .5rem;font-size:.74rem;font-weight:600;display:inline-block;transform:none}.badge-ok{background:var(--ui-badge-ok-bg);color:var(--ui-badge-ok-fg)}.badge-warn{background:var(--ui-badge-warn-bg);color:var(--ui-badge-warn-fg)}.badge-err{background:var(--ui-badge-err-bg);color:var(--ui-badge-err-fg)}.badge-info{background:var(--ui-badge-info-bg);color:var(--ui-badge-info-fg)}.kbd{border:1px solid var(--ui-border);background:var(--ui-surface-2);color:var(--ui-text);box-shadow:none;font-family:var(--sl-font-mono);border-radius:5px;padding:.1em .4em;font-size:.84rem;display:inline-block}.callout{background:var(--ui-note);color:var(--ui-text);border:1px solid var(--ui-border);border-inline-start:3px solid var(--ui-accent);border-radius:8px;margin:20px 0;padding:1rem 1.25rem;font-weight:500}.callout p{margin:0}.callout-info,.callout-ok{background:var(--ui-tip)}ul,ol{padding-inline-start:1.5rem}li::marker{color:var(--ui-accent)}.step-list{counter-reset:steps;padding-left:0;list-style:none}.step-list li{counter-increment:steps;margin-top:14px;padding-left:48px;position:relative}.step-list li:before{content:counter(steps);background:var(--ui-accent-soft);width:30px;height:30px;color:var(--ui-accent-strong);box-shadow:none;font-family:var(--font-display);border-radius:999px;place-items:center;font-weight:600;display:grid;position:absolute;top:0;left:0}.flag-name{font-family:var(--sl-font-mono);font-weight:600}.footer{max-width:1200px;color:var(--ui-muted);margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem) 2.5rem;font-size:.9rem}.footer a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong)}.footer a:hover{background:var(--ui-accent-soft)}.footer-links{margin-top:6px}.file-tree{font-family:var(--sl-font-mono);white-space:pre;font-size:.9rem;overflow-x:auto}@media (width<=900px){.shell{grid-template-columns:1fr}.sidebar{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);flex-wrap:wrap;align-items:center;gap:.4rem;padding:.75rem 1rem;display:flex;position:static}.side-group{display:contents;margin:0!important}.sidebar ul{flex-wrap:wrap;gap:.25rem;display:flex}.group-label{margin:0 .2rem}.sidebar a,.side-link{background:var(--ui-surface-2);border-radius:999px;padding:.3rem .7rem}.sidebar a.is-active,.side-link.is-active{box-shadow:none}}@media (width<=720px){.hero{border-radius:var(--ui-radius);box-shadow:0 8px 24px var(--ui-shadow-color);grid-template-columns:1fr;padding:1.5rem}.shot,.code-block{box-shadow:0 4px 16px var(--ui-shadow-color)}th,td{padding:.5rem .55rem}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}} diff --git a/docs/web/dist/detect/index.html b/docs/web/dist/detect/index.html index a1718c7..db0bdd8 100644 --- a/docs/web/dist/detect/index.html +++ b/docs/web/dist/detect/index.html @@ -6,21 +6,29 @@ detect command — DevOpsGen Docs + + + + + + + + - + -
DGDevOpsGenDOCSGitHub

command reference

devopsgen detect

Inspect the current project and report what DevOpsGen would scaffold for it: the programming stack, the exact files that shaped the decision, and the candidate application types.

devopsgen detect output in a terminal reporting stack go with indicators go.mod
devopsgen detect inside a Go module — chain of evidence straight from the filesystem.

Reading the output

LineMeaning
stack: goThe detected programming stack (go or nodejs).
indicators: go.mod, ...The files that produced evidence — your audit trail for why the stack matched.
app-type candidates: binaryApplication types plausible for this project; the wizard default comes from here too.

How it decides

  • Go — go.mod and its module directive looking like module example.com/app.
  • Node.js — package.json, plus its dependencies, and lockfile flavours (npm / pnpm) that later steer Docker image commands.
  • Ambiguity or zero indicators produce a distinct exit code (5) so scripts can branch safely — see exit codes.
Detection semantics: DevOpsGen detects in the current working directory, not in --output-dir. Run it from the project you want scanned.
+
DevOpsGenDOCSGitHub

command reference

devopsgen detect

Inspect the current project and report what DevOpsGen would scaffold for it: the programming stack, the exact files that shaped the decision, and the candidate application types.

devopsgen detect output in a terminal reporting stack go with indicators go.mod
devopsgen detect inside a Go module — chain of evidence straight from the filesystem.

Reading the output

LineMeaning
stack: goThe detected programming stack (go or nodejs).
indicators: go.mod, ...The files that produced evidence — your audit trail for why the stack matched.
app-type candidates: binaryApplication types plausible for this project; the wizard default comes from here too.

How it decides

  • Go — go.mod and its module directive looking like module example.com/app.
  • Node.js — package.json, plus its dependencies, and lockfile flavours (npm / pnpm) that later steer Docker image commands.
  • Ambiguity or zero indicators produce a distinct exit code (5) so scripts can branch safely — see exit codes.
Detection semantics: DevOpsGen detects in the current working directory, not in --output-dir. Run it from the project you want scanned.
\ No newline at end of file diff --git a/docs/web/dist/exit-codes/index.html b/docs/web/dist/exit-codes/index.html index 60ced99..544b905 100644 --- a/docs/web/dist/exit-codes/index.html +++ b/docs/web/dist/exit-codes/index.html @@ -6,22 +6,30 @@ Exit codes — DevOpsGen Docs + + + + + + + + - + -
DGDevOpsGenDOCSGitHub

ci integration

Exit codes

Every DevOpsGen command exits with a stable, documented status code so shells, scripts and CI jobs can branch deterministically — no output parsing required.

CodeClassificationMeaningTypical example
0successEverything requested completed; dry-run plans that resolved cleanly also end here.init created 5 files; --dry-run --force plan is green.
1general errorUnexpected failure — I/O errors, template issues, or a run that failed mid-write and rolled back.Disk full while writing deployment.yaml.
2invalid inputConfiguration failed validation before anything was planned or written.--image BANGKAH/my-app; port -1; Ingress without host.
3conflictTarget files already exist and would be overwritten; nothing was written. Retried with --force.Second init without --force.
4validation failedRejected output: a template rendering failure, required artifacts missing, or generated documents failing the static lint rules.A workflow that never publishes the commit SHA tag.
5detectionStack detection was ambiguous or found nothing at all.Empty directory without go.mod / package.json.

In practice

devopsgen validate reporting internal validation passed with exit code 0
Exit 0 — internal validation passed.
shell script branching
devopsgen init --stack go --registry ghcr --image you/myapp --port 8080
+
DevOpsGenDOCSGitHub

ci integration

Exit codes

Every DevOpsGen command exits with a stable, documented status code so shells, scripts and CI jobs can branch deterministically — no output parsing required.

CodeClassificationMeaningTypical example
0successEverything requested completed; dry-run plans that resolved cleanly also end here.init created 5 files; --dry-run --force plan is green.
1general errorUnexpected failure — I/O errors, template issues, or a run that failed mid-write and rolled back.Disk full while writing deployment.yaml.
2invalid inputConfiguration failed validation before anything was planned or written.--image BANGKAH/my-app; port -1; Ingress without host.
3conflictTarget files already exist and would be overwritten; nothing was written. Retried with --force.Second init without --force.
4validation failedRejected output: a template rendering failure, required artifacts missing, or generated documents failing the static lint rules.A workflow that never publishes the commit SHA tag.
5detectionStack detection was ambiguous or found nothing at all.Empty directory without go.mod / package.json.

In practice

devopsgen validate reporting internal validation passed with exit code 0
Exit 0 — internal validation passed.
shell script branching
devopsgen init --stack go --registry ghcr --image you/myapp --port 8080
 case $? in
   0) echo "ready" ;;
   3) devopsgen init --force --stack go --registry ghcr --image you/myapp --port 8080 ;;
diff --git a/docs/web/dist/favicon.svg b/docs/web/dist/favicon.svg
new file mode 100644
index 0000000..07a976b
--- /dev/null
+++ b/docs/web/dist/favicon.svg
@@ -0,0 +1,5 @@
+
+  
+  
+  
+
diff --git a/docs/web/dist/getting-started/index.html b/docs/web/dist/getting-started/index.html
index 7dfdaf0..af03a74 100644
--- a/docs/web/dist/getting-started/index.html
+++ b/docs/web/dist/getting-started/index.html
@@ -6,22 +6,30 @@
   Getting Started — DevOpsGen Docs
   
   
+  
+  
+  
+  
+  
   
   
   
+  
   
   
   
   
+  
   
   
   
   
+  
   
-  
+  
 
 
-
DGDevOpsGenDOCSGitHub

getting started

Zero to CI in one command

Install DevOpsGen, point it at any Go or Node.js project, and get a full Docker + GitHub Actions + Kubernetes baseline in seconds.

Install

go install (go 1.22+)
go install devopsgen.dev/devopsgen@latest

Or grab a prebuilt binary from the project GitHub releases, or build from source:

from source
git clone https://github.com/Bangkahdev/DevOpsGen.git
+
DevOpsGenDOCSGitHub

getting started

Zero to CI in one command

Install DevOpsGen, point it at any Go or Node.js project, and get a full Docker + GitHub Actions + Kubernetes baseline in seconds.

Install

go install (go 1.22+)
go install devopsgen.dev/devopsgen@latest

Or grab a prebuilt binary from the project GitHub releases, or build from source:

from source
git clone https://github.com/Bangkahdev/DevOpsGen.git
 cd DevOpsGen
 make build

Two ways to run it

  • Interactive: run devopsgen init in a terminal — the wizard detects your stack and interviews you step by step.
  • Headless: pass every required parameter as flags — the process never waits for stdin, which makes it script- and CI-friendly.

Headless quickstart

inside your project
devopsgen init   --stack go   --ci github-actions   --registry ghcr   --image you/myapp   --port 8080
Terminal capture of devopsgen init completing successfully and reporting five files created
A successful first run — five files created, exit code 0.

Inside a Go project this writes:

what you get
.github/workflows/ci.yml   # tests (when configured), docker build & push
 kubernetes/deployment.yaml  # image, port, resources, optional probes
diff --git a/docs/web/dist/img/og.png b/docs/web/dist/img/og.png
new file mode 100644
index 0000000000000000000000000000000000000000..bcdb7b03801ddd2fc7b34ad97548fd92975ea76b
GIT binary patch
literal 36611
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 — DevOps scaffolding for Go & Node.js projects
   
   
+  
+  
+  
+  
+  
   
   
   
+  
   
   
   
-  
+  
+  
+  
+  
   
   
   
-  
+  
+  
   
-  
+  
 
 
-
DGDevOpsGenDOCSGitHub

docker · github actions · kubernetes

DevOps scaffolding,
deterministically.

DevOpsGen reads your Go or Node.js project and writes a complete, opinionated DevOps baseline: hardened Dockerfile, GitHub Actions pipeline and ready-to-apply Kubernetes manifests — with dry-run plans, automatic backups and config validation built in.

DevOpsGen interactive wizard running in a Windows terminal, asking for the project stack
The interactive wizard — press Enter to accept smart defaults.

Why DevOpsGen

Deterministic

Same inputs, same bytes — every run. Machine-friendly for code review: a second generation with --force produces bit-identical files.

Safe by default

Existing files are never overwritten without --force. Overwrites get .bak backups, failed runs roll back automatically, and --dry-run prints the full plan first.

Validated output

Built-in validation checks Dockerfile structure, GitHub Actions workflow wiring and Kubernetes manifests (selector consistency, port ranges, Ingress paths) before anything ships.

Stack aware

Detects Go and Node.js projects (npm, pnpm, Express, Next.js, Vite, NestJS) from go.mod / package.json and tailors templates accordingly.

Everything a project needs on day one

One init command writes the whole baseline tree. Preview the real terminal output of every command below — all screenshots are live captures, not mockups.

generated in one command
$ devopsgen init --stack go --ci github-actions --registry ghcr --image you/myapp --port 8080
+
DevOpsGenDOCSGitHub

docker · github actions · kubernetes

DevOps scaffolding,
deterministically.

DevOpsGen reads your Go or Node.js project and writes a complete, opinionated DevOps baseline: hardened Dockerfile, GitHub Actions pipeline and ready-to-apply Kubernetes manifests — with dry-run plans, automatic backups and config validation built in.

DevOpsGen interactive wizard running in a Windows terminal, asking for the project stack
The interactive wizard — press Enter to accept smart defaults.

Why DevOpsGen

Deterministic

Same inputs, same bytes — every run. Machine-friendly for code review: a second generation with --force produces bit-identical files.

Safe by default

Existing files are never overwritten without --force. Overwrites get .bak backups, failed runs roll back automatically, and --dry-run prints the full plan first.

Validated output

Built-in validation checks Dockerfile structure, GitHub Actions workflow wiring and Kubernetes manifests (selector consistency, port ranges, Ingress paths) before anything ships.

Stack aware

Detects Go and Node.js projects (npm, pnpm, Express, Next.js, Vite, NestJS) from go.mod / package.json and tailors templates accordingly.

Everything a project needs on day one

One init command writes the whole baseline tree. Preview the real terminal output of every command below — all screenshots are live captures, not mockups.

generated in one command
$ devopsgen init --stack go --ci github-actions --registry ghcr --image you/myapp --port 8080
 created 5 file(s), replaced 0 file(s) in .
 exit code: 0
Terminal showing a successful DevOpsGen init run creating five files with exit code 0
init — first run creates the complete baseline and exits 0.
Terminal showing a DevOpsGen dry-run plan listing five create entries with exit code 0
--dry-run on a fresh project prints the pure create plan and exits 0.
Terminal showing a DevOpsGen dry-run force plan where every file would be replaced, exit code 0
--dry-run --force previews the full replace plan — still nothing written.

What gets generated

Template setFilesPurpose
docker (+ .dockerignore)DockerfileHardened multi-stage build (Go runs as USER 1000:1000 on a scratch base). For Node.js, RUN steps and install/prune commands follow the detected package manager (npm / pnpm) and lockfile. The generated .dockerignore keeps state, tool caches and env files out of the image.
github-actions.github/workflows/ci.ymlRuns your tests when a test command is configured, then builds and pushes the image with both the commit SHA tag and your alias tag, authenticating to the chosen registry via secrets.
kubernetesdeployment.yaml, service.yaml, optional ingress.yamlDNS 1035-safe resource names, container port wiring, resource requests and limits, health probes when --health-path is given, and an optional host-based Ingress (RFC 1123 hostname).

Explore the docs

Command cheatsheet

Terminal showing the full devopsgen help output listing all commands
devopsgen --help — all commands at a glance.
Terminal showing the devopsgen list output with available stacks, app types and registries
devopsgen list — supported stacks, app types and registries.
Terminal showing the devopsgen version output
devopsgen version.
diff --git a/docs/web/dist/init/index.html b/docs/web/dist/init/index.html index 2e1a428..12f2753 100644 --- a/docs/web/dist/init/index.html +++ b/docs/web/dist/init/index.html @@ -6,21 +6,29 @@ init command — DevOpsGen Docs + + + + + + + + - + -
DGDevOpsGenDOCSGitHub

command reference

devopsgen init

Initialize DevOps configuration. In an interactive terminal with no complete configuration the TUI wizard is launched; when all required parameters are supplied via flags the process runs headless and never waits for stdin.

synopsis
devopsgen init [flags]

Flags

FlagDefaultDescription
--stackauto-detectedProject stack: go or nodejs.
--app-typeauto-detectedApplication type (see devopsgen list).
--cigithub-actionsCI provider.
--registrydockerhubContainer registry: dockerhub or ghcr.
--image—Image repository as namespace/repository — no host and no tag.
--taglatestAdditional image tag alias.
--port—Application port, 1–65535.
--k8strueGenerate Kubernetes manifests.
--ingressoffEnable Kubernetes Ingress (requires --ingress-host).
--ingress-host—Ingress hostname, validated as RFC 1123.
--health-path—HTTP health probe path wired into manifests.
--build-cmd—Build command.
--build-path.Go package path to build inside the container.
--start-cmd—Startup command.
--test-cmd—Test command.
--output-dir.Output directory.
--dry-runoffSimulate without writing anything.
--forceoffOverwrite existing regular files.

Success & conflict behaviour

A clean run writes every template and exits with 0. A second run over an existing project stops before touching anything and exits with 3 until you add --force; a detailed walkthrough of that re-run path is on the exit codes page.

devopsgen init success output with exit code 0
First run: five files created, exit code 0.

Preview plans with --dry-run

--dry-run prints the byte-plan and writes nothing. On a fresh project it lists pure create rows and exits 0; combined with --force over an existing project it lists the exact files that would be replaced — still 0:

devopsgen dry-run plan output showing five create entries with exit code 0
--dry-run on a fresh project: pure create plan, exit code 0.
devopsgen dry-run force plan output where every file would be replaced, exit code 0
--dry-run --force: every file replaced in plan form, exit code 0.

Config validation

Invalid configuration fails fast with 2 before any file is planned and never writes files — e.g. an image that must be namespace/repository without host or tag, a port outside 1–65535, or an Ingress without a host. The full code table lives on the exit codes page.

Overwrites performed with --force keep the previous content as <file>.devopsgen.bak backups, and any failure mid-run triggers a best-effort rollback to the pre-run state.
+
DevOpsGenDOCSGitHub

command reference

devopsgen init

Initialize DevOps configuration. In an interactive terminal with no complete configuration the TUI wizard is launched; when all required parameters are supplied via flags the process runs headless and never waits for stdin.

synopsis
devopsgen init [flags]

Flags

FlagDefaultDescription
--stackauto-detectedProject stack: go or nodejs.
--app-typeauto-detectedApplication type (see devopsgen list).
--cigithub-actionsCI provider.
--registrydockerhubContainer registry: dockerhub or ghcr.
--image—Image repository as namespace/repository — no host and no tag.
--taglatestAdditional image tag alias.
--port—Application port, 1–65535.
--k8strueGenerate Kubernetes manifests.
--ingressoffEnable Kubernetes Ingress (requires --ingress-host).
--ingress-host—Ingress hostname, validated as RFC 1123.
--health-path—HTTP health probe path wired into manifests.
--build-cmd—Build command.
--build-path.Go package path to build inside the container.
--start-cmd—Startup command.
--test-cmd—Test command.
--output-dir.Output directory.
--dry-runoffSimulate without writing anything.
--forceoffOverwrite existing regular files.

Success & conflict behaviour

A clean run writes every template and exits with 0. A second run over an existing project stops before touching anything and exits with 3 until you add --force; a detailed walkthrough of that re-run path is on the exit codes page.

devopsgen init success output with exit code 0
First run: five files created, exit code 0.

Preview plans with --dry-run

--dry-run prints the byte-plan and writes nothing. On a fresh project it lists pure create rows and exits 0; combined with --force over an existing project it lists the exact files that would be replaced — still 0:

devopsgen dry-run plan output showing five create entries with exit code 0
--dry-run on a fresh project: pure create plan, exit code 0.
devopsgen dry-run force plan output where every file would be replaced, exit code 0
--dry-run --force: every file replaced in plan form, exit code 0.

Config validation

Invalid configuration fails fast with 2 before any file is planned and never writes files — e.g. an image that must be namespace/repository without host or tag, a port outside 1–65535, or an Ingress without a host. The full code table lives on the exit codes page.

Overwrites performed with --force keep the previous content as <file>.devopsgen.bak backups, and any failure mid-run triggers a best-effort rollback to the pre-run state.
\ No newline at end of file diff --git a/docs/web/dist/logo.svg b/docs/web/dist/logo.svg new file mode 100644 index 0000000..3e42dd3 --- /dev/null +++ b/docs/web/dist/logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/web/dist/validate/index.html b/docs/web/dist/validate/index.html index 4ce6d68..24b7201 100644 --- a/docs/web/dist/validate/index.html +++ b/docs/web/dist/validate/index.html @@ -6,22 +6,30 @@ validate command — DevOpsGen Docs + + + + + + + + - + -
DGDevOpsGenDOCSGitHub

command reference

devopsgen validate

Statically lint DevOpsGen output — Dockerfiles, GitHub Actions workflows and Kubernetes manifests — so problems surface on your laptop instead of pipeline number forty.

devopsgen validate passing with the message internal validation passed and exit code 0
Everything checks out — exit code 0.
synopsis
devopsgen validate [flags]          # validate the current project
+
DevOpsGenDOCSGitHub

command reference

devopsgen validate

Statically lint DevOpsGen output — Dockerfiles, GitHub Actions workflows and Kubernetes manifests — so problems surface on your laptop instead of pipeline number forty.

devopsgen validate passing with the message internal validation passed and exit code 0
Everything checks out — exit code 0.
synopsis
devopsgen validate [flags]          # validate the current project
 devopsgen validate --output-dir ./configs

What it checks

Docker

  • FROM instruction is present
  • no docker login (credentials) inside image builds
  • COPY/ADD free of shell chaining (&&, ||, 2>/dev/null)

GitHub Actions

  • parses as a single workflow document with name, on, jobs and steps
  • a actions/checkout step exists
  • the image push references the commit SHA tag
  • no unrendered template actions leak into the output

Kubernetes

  • Deployment: selector ↔ template label consistency, unique container names, integer containerPort in 1–65535
  • Service: selector plus port/targetPort pairs
  • Ingress: networking.k8s.io/v1, valid pathType, wired backend.service
  • Service ↔ Ingress backends stay consistent

Exit behaviour

  • 0 — all documents passed.
  • 4 — a document failed lint rules, does not parse, or required artifacts are missing.
  • 1 — the output directory itself could not be read.
  • 2 — malformed input (invalid flags).

Combine with devopsgen init in CI: generate, commit, validate, deploy — the exit codes page maps every failure class.

Combine with devopsgen init in CI: generate, commit, validate, deploy — the exit codes page maps every failure class.

\ No newline at end of file diff --git a/docs/web/dist/wizard/index.html b/docs/web/dist/wizard/index.html index e3f1709..bfbfcd8 100644 --- a/docs/web/dist/wizard/index.html +++ b/docs/web/dist/wizard/index.html @@ -6,21 +6,29 @@ Interactive Wizard — DevOpsGen Docs + + + + + + + + - + -
DGDevOpsGenDOCSGitHub

interactive wizard

The TUI wizard

When you run devopsgen init in a real terminal without a flags-only invocation, a keyboard-driven wizard takes over — Enter accepts the recommended default at every step.

DevOpsGen wizard TUI showing the stack selection list with a highlighted highlighted selection and instructions
Step 1 — stack choice. DevOpsGen pre-selects what its detector recommends.

How the interview flows

  • Stack — go or nodejs, pre-selected by the detector.
  • Application type (Node.js only) — express, nextjs, vite, nestjs or generic.
  • Commands — optional build / test / start commands; Enter keeps the defaults harvested from the project files.
  • Port — the application port, 1–65535, validated on the spot.
  • Registry — Docker Hub or GHCR (same as the --registry flag).
  • Container image — namespace/repository, no host, no tag.
  • Kubernetes — whether to emit manifests, plus an optional host-based Ingress (RFC 1123 hostname).
  • Summary & confirm — review every chosen value, confirm, and the files are written to the project root.
A wizard run is fully replayable: the same answers as equivalent flags. To automate the same result, pass the flags headless (init reference).

Keyboard

KeyAction
EnterConfirm current selection / printed default
↑ ↓Move within list choices
typed textFill textual answers (port, image, host)
Ctrl+CAbort the wizard without writing anything

Safety during the run

Everything until the final confirmation is bound to memory only — aborting leaves the project untouched. The write itself follows the same rules as headless mode: never-overwrite-unless---force, backups, and rollback on mid-run failure.

+
DevOpsGenDOCSGitHub

interactive wizard

The TUI wizard

When you run devopsgen init in a real terminal without a flags-only invocation, a keyboard-driven wizard takes over — Enter accepts the recommended default at every step.

DevOpsGen wizard TUI showing the stack selection list with a highlighted highlighted selection and instructions
Step 1 — stack choice. DevOpsGen pre-selects what its detector recommends.

How the interview flows

  • Stack — go or nodejs, pre-selected by the detector.
  • Application type (Node.js only) — express, nextjs, vite, nestjs or generic.
  • Commands — optional build / test / start commands; Enter keeps the defaults harvested from the project files.
  • Port — the application port, 1–65535, validated on the spot.
  • Registry — Docker Hub or GHCR (same as the --registry flag).
  • Container image — namespace/repository, no host, no tag.
  • Kubernetes — whether to emit manifests, plus an optional host-based Ingress (RFC 1123 hostname).
  • Summary & confirm — review every chosen value, confirm, and the files are written to the project root.
A wizard run is fully replayable: the same answers as equivalent flags. To automate the same result, pass the flags headless (init reference).

Keyboard

KeyAction
EnterConfirm current selection / printed default
↑ ↓Move within list choices
typed textFill textual answers (port, image, host)
Ctrl+CAbort the wizard without writing anything

Safety during the run

Everything until the final confirmation is bound to memory only — aborting leaves the project untouched. The write itself follows the same rules as headless mode: never-overwrite-unless---force, backups, and rollback on mid-run failure.

\ No newline at end of file diff --git a/docs/web/public/apple-touch-icon.png b/docs/web/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc895e7c2eecb2ebdd5d5c9e0ed0ec7c5095d7f GIT binary patch literal 1900 zcmbVNdsNcd7REcN#p_fy}y0dS>M`copru* zq zeZThX0TLYofk{@wKpOYcNeIN)AkY{1HYrR!sGA6jKuX^%qg+mM*$b0|=P|NVv#|<6 zc6NV$wf`AX(av&zQ;gq1V$nVL&A$f{i?;jyu+A%gox?(8`+{24q^?V#%;V?TWs9K$ z33UU>D>K{Kujq$Z=ew2e1B)+|jVI^cRtY!qc6!40hMXHkVQCQKHRewLAD$SB5+4oZ z_x}TTeBzgJj=y8q&(Q09YE=u+DA;c!GPkCs@#U$J5p75P^EgvII;*~40)WqEx6(o! z5xWUyj9-OBS{U4_h; z+!c0TO(TC%o5)OGnl5YqQg=i9eQ+jwfR`Y@kk`uC$Uu26_H7OREz51L2PN}?BXir} z<5U~XzPLN<4EJFuwUX%!_YfoYSzYP&UJ_gTQYdSlbE=%qIp1iemBzJa|1H+XHGi>g z*p7WcQ%nH^rbR9$bi3B_zMRM;q^6JpD!8VVlbr9IB@yKpCOQ2I*X#x-E%ljTyg*f= zf(!Y3&})4rdzr`Co#zwso*C9Uh9js0D_Zrf(Pqy9KdFCmB5;fBlYtPgie;j+cRFyL zmrraGaP3=J+?Q4NEULXGIlSb~p;+9dG2*PGno%D% zn3DxfM|YgTe2);nj$A#H0@Xp%EB|1P4aYtRp9W>UeqRaq?-;pjv8@a+ z#5_LV>6|_g#=^U!7|~~eEd0pelMKkI`xe`30V7Q2j*-ghEV%{u*cUf(Px%31_=O;= zP?#CD7m)&1*fhWBxsdIAX>21p{<6ZI@f@{n3u9#epJzHpl9>+sQ}Ogyh@6G?tI5eWApik{f?)>f{1Il zxA(t5`6@5!^-NfU#}J`s@=!uAcX*ILm<3{e#s_9|EBCNIj8c{nHgV)tJP{LJvaUG* zj8IJrijufKIMnTl{S17G9bg=`_svNwGE8f*Wpu$(Lt??SmGeWH-dzB}W++r)&gu3* zuN|u{v}7`kP>gPB;N=z_GY$llcD!s=iF;xazGOH&4U0otE`JHerO%{*IURmH$+ElVsy9Ij39WlJ7eyLpMR7Tr21J=pP8SuGfw0Q0S3JP>7VXZuRU02DYi*jC^b?+3s}@4tV69SzAR7qQy*3CPh!Rg zvz{53q{d>`%aW43D2yYeXT!BzFf`d9dU z`*KFyTI-`wYZ7DbT1Oysm43vPo5ONM2A`V#3GyqUi;oH|cK=heOXcFFj+`n8ZV59o z7kqSWVk}5$k2h{;n+$zaq2Q;+|0(ldz5j`<7#Gx&F$Qh5m-Rm+B+&1WZ=H8I=RZS^ BaCZOz literal 0 HcmV?d00001 diff --git a/docs/web/public/favicon.svg b/docs/web/public/favicon.svg new file mode 100644 index 0000000..07a976b --- /dev/null +++ b/docs/web/public/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/web/public/img/og.png b/docs/web/public/img/og.png new file mode 100644 index 0000000000000000000000000000000000000000..bcdb7b03801ddd2fc7b34ad97548fd92975ea76b GIT binary patch literal 36611 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 z + + + + diff --git a/docs/web/src/components/Layout.jsx b/docs/web/src/components/Layout.jsx index e5884ff..6a3febd 100644 --- a/docs/web/src/components/Layout.jsx +++ b/docs/web/src/components/Layout.jsx @@ -13,7 +13,7 @@ export default function Layout({ rel, activePath, children }) { skip to content
- DG + DevOpsGen DOCS diff --git a/docs/web/src/entry-server.jsx b/docs/web/src/entry-server.jsx index 3a74502..83535f8 100644 --- a/docs/web/src/entry-server.jsx +++ b/docs/web/src/entry-server.jsx @@ -43,13 +43,25 @@ export function renderDocument(route) { applicationCategory: 'DeveloperApplication', operatingSystem: 'Linux, Windows, macOS', description: route.description, + keywords: route.keywords, url: SITE_URL, + image: [`${SITE_URL}img/og.png`, image], + logo: { '@type': 'ImageObject', url: `${SITE_URL}logo.svg` }, + author: { '@type': 'Person', name: 'Bangkah', url: 'https://github.com/Bangkahdev' }, + downloadUrl: 'https://github.com/Bangkahdev/DevOpsGen/releases', + license: 'https://github.com/Bangkahdev/DevOpsGen#readme', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' }, }, { '@type': 'BreadcrumbList', itemListElement: r }, ], }; + const ogSizeMeta = route.ogImage === 'img/og.png' + ? ` + +` + : ''; + return ` @@ -58,17 +70,25 @@ export function renderDocument(route) { ${escapeHtml(route.title)} + + + + + + - + +${ogSizeMeta} + diff --git a/docs/web/src/routes.jsx b/docs/web/src/routes.jsx index abdfb1c..6c9315d 100644 --- a/docs/web/src/routes.jsx +++ b/docs/web/src/routes.jsx @@ -17,7 +17,7 @@ export const ROUTES = [ description: 'DevOpsGen generates production-ready Dockerfiles, GitHub Actions pipelines and Kubernetes manifests for Go and Node.js projects, with safe dry-run plans, automatic backups and config validation.', keywords: 'DevOpsGen, dockerfile generator, github actions generator, kubernetes manifests, go, nodejs, scaffolding, ci cd', - ogImage: 'img/init-success.png', + ogImage: 'img/og.png', }, { path: 'getting-started', diff --git a/docs/web/src/styles/site.css b/docs/web/src/styles/site.css index 6f7fa22..53a70f3 100644 --- a/docs/web/src/styles/site.css +++ b/docs/web/src/styles/site.css @@ -102,17 +102,10 @@ body { } .brand-mark { - display: grid; - place-items: center; + display: block; width: 2.25rem; height: 2.25rem; - border-radius: var(--ui-radius); - background: var(--ui-accent-soft); - color: var(--ui-accent-strong); box-shadow: 0 2px 8px var(--ui-shadow-color); - font-family: var(--font-display); - font-size: 0.95rem; - font-weight: 700; } .brand-name {