Merge pull request #140 from foomo/feature/docs2
Some checks failed
Test Branch / test (push) Has been cancelled

docs: add gh pages
This commit is contained in:
Kevin Franklin Kim
2026-05-27 23:35:58 +02:00
committed by GitHub
47 changed files with 803 additions and 324 deletions

View File

@@ -1,17 +0,0 @@
name: Cleanup Branch
on:
pull_request:
types: [ closed ]
permissions:
contents: read
jobs:
delete:
runs-on: ubuntu-latest
steps:
- uses: snnaplab/delete-branch-cache-action@v1
with:
# Specify explicitly because the ref at the time of merging will be a branch name such as 'main', 'develop'
ref: refs/pull/${{ github.event.number }}/merge

41
.github/workflows/docs.yml vendored Normal file
View File

@@ -0,0 +1,41 @@
name: Publish docs
on:
push:
tags:
- v*.*.*
workflow_dispatch:
permissions:
pages: write
contents: write
id-token: write
jobs:
docs:
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/checkout@v6
- uses: oven-sh/setup-bun@v2
- name: Install dependencies
working-directory: docs
run: bun install --frozen-lockfile
- name: Build docs
working-directory: docs
run: bun run build
- uses: actions/configure-pages@v6
- uses: actions/upload-pages-artifact@v5
with:
path: docs/.vitepress/dist
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v5

3
.gitignore vendored
View File

@@ -42,6 +42,9 @@ tmp/
## Vitepress
!docs/.vitepress
docs/.vitepress/*
!docs/.vitepress/theme/
!docs/.vitepress/config.mts
## Golang
go.work

View File

@@ -4,7 +4,7 @@ project_name: squadron
builds:
- binary: squadron
main: ./cmd/main.go
main: ./cmd/squadron
env:
- CGO_ENABLED=0
flags:
@@ -12,7 +12,7 @@ builds:
- -tags=safe
ldflags:
- -s -w
- -X github.com/foomo/squadron/cmd/actions.version={{.Version}}
- -X github.com/foomo/squadron/internal/cli.version={{.Version}}
goos:
- windows
- darwin

View File

@@ -88,13 +88,13 @@ test.update:
build:
@mkdir -p bin
@echo "〉building bin/squadron"
@go build -tags=safe -o bin/squadron cmd/main.go
@go build -tags=safe -o bin/squadron ./cmd/squadron
.PHONY: install
## Install binary
install:
@echo "〉installing ${GOPATH}/bin/squadron"
@go build -tags=safe -o ${GOPATH}/bin/squadron cmd/main.go
@go build -tags=safe -o ${GOPATH}/bin/squadron ./cmd/squadron
### Security
@@ -140,7 +140,7 @@ docs: docs.cli
## Generate cli
docs.cli:
@echo "〉generating cli reference"
@go run scripts/cmd-reference/main.go
@go run ./cmd/squadron-docs
.PHONY: godocs
## Open go docs

166
README.md
View File

@@ -1,9 +1,8 @@
[![GitHub Release](https://img.shields.io/github/release/foomo/squadron.svg?style=flat-square)](https://github.com/foomo/squadron/releases)
[![Github All Releases](https://img.shields.io/github/downloads/foomo/squadron/total.svg?style=flat-square)](https://github.com/foomo/squadron/releases)
[![Docker Pulls](https://img.shields.io/docker/pulls/foomo/squadron?style=flat-square)](https://hub.docker.com/r/foomo/squadron)
[![GitHub stars](https://img.shields.io/github/stars/foomo/squadron.svg?style=flat-square)](https://github.com/foomo/squadron)
[![Go Report Card](https://goreportcard.com/badge/github.com/foomo/squadron)](https://goreportcard.com/report/github.com/foomo/squadron)
[![GoDoc](https://godoc.org/github.com/foomo/squadron?status.svg)](https://godoc.org/github.com/foomo/squadron)
[![Go Report Card](https://goreportcard.com/badge/github.com/foomo/squadron?style=flat-square)](https://goreportcard.com/report/github.com/foomo/squadron)
[![GoDoc](https://img.shields.io/badge/GoDoc-✓-informational.svg?style=flat-square&logo=go)](https://godoc.org/github.com/foomo/squadron)
[![GitHub Downloads](https://img.shields.io/github/downloads/foomo/squadron/total.svg?style=flat-square&logo=github)](https://github.com/foomo/squadron/releases)
[![Docker Pulls](https://img.shields.io/docker/pulls/foomo/squadron.svg?style=flat-square&logo=docker)](https://hub.docker.com/r/foomo/squadron)
[![GitHub Stars](https://img.shields.io/github/stars/foomo/squadron.svg?style=flat-square&logo=github)](https://github.com/foomo/squadron)
<p align="center">
<img alt="foomo/squadron" src="docs/public/logo.png" width="400" height="400"/>
@@ -11,125 +10,56 @@
# Squadron
Application for managing kubernetes microservice environments.
**Docker Compose for Kubernetes.**
Use it, if a helm chart is not enough in order to organize multiple services into an effective squadron.
Squadron is a CLI that orchestrates multiple Helm charts and Docker image builds
as one cohesive deployment, driven by a single declarative `squadron.yaml`. It
brings the familiar `docker-compose` workflow — define your services once, bring
the whole stack up with one command — to Kubernetes, where each service is a real
Helm release. In production, a squadron is just another set of Helm charts.
Another way to think of it would be `helm-compose`, because it makes k8s and helm way more approachable, not matter if it is development or production (where it just becomes another helm chart)
📖 **[Read the documentation →](https://foomo.github.io/squadron)**
## Configuration `squadron.yaml`
Configure your squadron
```yaml
# https://raw.githubusercontent.com/foomo/squadron/refs/heads/main/squadron.schema.json
version: '2.3'
# squadron template vars
vars: {}
# helm global vars
global: {}
# squadron definitions
squadron:
# squadron units
site:
# squadron unit
frontend:
# optional release name override
name: my-frontend
# optional release namespace override
namespace: my-namespace
# helm chart definition
chart:
name: mychart
version: 0.1.0
repository: http://helm.mycompany.com/repository
# container bakes
bakes:
service:
tags:
- docker.mycompany.com/mycomapny/frontend:latest
dockerfile: Dockerfile
args:
foo: foo
bar: bar
# container builds
builds:
service:
tag: latest
file: Dockerfile
image: docker.mycompany.com/mycomapny/frontend
build_arg:
- "foo=foo"
- "bar=bar"
# helm chart values
values:
image: docker.mycompany.com/mycomapny/frontend:latest
# squadron unit
backend:
# helm chart definition
chart: <% env "PROJECT_ROOT" %>/path/to/chart
# kustomize path
kustomize: <% env "PROJECT_ROOT" %>/path/to/kustomize
# container bakes
bakes:
service:
tags:
- docker.mycompany.com/mycomapny/backend:latest
dockerfile: Dockerfile
args:
foo: foo
bar: bar
# container builds
builds:
service:
tag: latest
file: Dockerfile
image: docker.mycompany.com/mycomapny/backend
build_arg:
- "foo=foo"
- "bar=bar"
# helm chart values
values:
image: docker.mycompany.com/mycomapny/backend:latest
```
## Usage
## Install
```shell
$ squadron help
Docker compose for kubernetes
Usage:
squadron [command]
Available Commands:
bake bake or rebake squadron units
build build or rebuild squadron units
completion Generate completion script
config generate and view the squadron config
diff shows the diff between the installed and local chart
down uninstalls the squadron or given units
help Help about any command
list list squadron units
push pushes the squadron or given units
rollback rolls back the squadron or given units
schema generate squadron json schema
status installs the squadron or given units
template render chart templates locally and display the output
up installs the squadron or given units
version show version information
Flags:
-d, --debug show all output
-f, --file strings specify alternative squadron files (default [squadron.yaml])
-h, --help help for squadron
Use "squadron [command] --help" for more information about a command.
go install github.com/foomo/squadron/cmd/squadron@latest
```
See the [installation guide](https://foomo.github.io/squadron/guide/installation)
for release binaries and the Docker image.
## Example
```yaml
# squadron.yaml
version: '2.3'
squadron:
storefinder:
backend:
chart: <% env "PROJECT_ROOT" %>/charts/backend
builds:
default:
image: docker.mycompany.com/storefinder/backend
tag: latest
context: ./app
values:
image:
repository: <% .Squadron.storefinder.backend.builds.default.image %>
tag: <% .Squadron.storefinder.backend.builds.default.tag | quote %>
```
```shell
squadron build # build the images
squadron up # install / upgrade the releases
squadron status # check release status
squadron down # tear it down
```
See the [Quick Start](https://foomo.github.io/squadron/guide/quickstart) and the
[configuration reference](https://foomo.github.io/squadron/guide/configuration)
for the full picture.
## How to Contribute
Contributions are welcome! Please read the [contributing guide](docs/CONTRIBUTING.md).

View File

@@ -7,22 +7,22 @@ export PROJECT_ROOT=$(PWD)
.PHONY: list
## Show config
list:
@go run ../../cmd/main.go list
@go run ../../cmd/squadron list
.PHONY: config
## Show config
config:
@go run ../../cmd/main.go config
@go run ../../cmd/squadron config
.PHONY: build
## Show config
build:
@go run ../../cmd/main.go build
@go run ../../cmd/squadron build
.PHONY: template
## Show config
template:
@go run ../../cmd/main.go template
@go run ../../cmd/squadron template
## === Utils ===

View File

@@ -7,22 +7,22 @@ export PROJECT_ROOT=$(PWD)
.PHONY: list
## Show config
list:
@go run ../../cmd/main.go list
@go run ../../cmd/squadron list
.PHONY: config
## Show config
config:
@go run ../../cmd/main.go config
@go run ../../cmd/squadron config
.PHONY: build
## Show config
build:
@go run ../../cmd/main.go build
@go run ../../cmd/squadron build
.PHONY: template
## Show config
template:
@go run ../../cmd/main.go template
@go run ../../cmd/squadron template
## === Utils ===

View File

@@ -9,22 +9,22 @@ files=$(shell find . -name 'squadron.yaml' | tail -r | xargs echo -n | tr " ", "
.PHONY: list
## Show config
list:
@go run ../../cmd/main.go -f ${files} list --builds --charts
@go run ../../cmd/squadron -f ${files} list --builds --charts
.PHONY: config
## Show config
config:
@go run ../../cmd/main.go -f ${files} config
@go run ../../cmd/squadron -f ${files} config
.PHONY: build
## Show config
build:
@go run ../../cmd/main.go -f ${files} build
@go run ../../cmd/squadron -f ${files} build
.PHONY: template
## Show config
template:
@go run ../../cmd/main.go -f ${files} template
@go run ../../cmd/squadron -f ${files} template
## === Utils ===

View File

@@ -18,7 +18,10 @@
"linter": {
"enabled": true,
"rules": {
"recommended": true
"recommended": true,
"complexity": {
"noImportantStyles": "off"
}
}
},
"json": {

View File

@@ -1,9 +0,0 @@
package main
import (
"github.com/foomo/squadron/cmd/actions"
)
func main() {
actions.Execute()
}

View File

@@ -8,7 +8,7 @@ import (
"path/filepath"
"strings"
"github.com/foomo/squadron/cmd/actions"
"github.com/foomo/squadron/internal/cli"
"github.com/spf13/cobra/doc"
)
@@ -28,7 +28,7 @@ func main() {
log.Fatal(err)
}
c := actions.NewRoot()
c := cli.NewRoot()
c.DisableAutoGenTag = true
filePrepender := func(filename string) string {

9
cmd/squadron/main.go Normal file
View File

@@ -0,0 +1,9 @@
package main
import (
"github.com/foomo/squadron/internal/cli"
)
func main() {
cli.Execute()
}

View File

@@ -1,59 +1,111 @@
import { defineConfig } from "vitepress";
import {
groupIconMdPlugin,
groupIconVitePlugin,
} from "vitepress-plugin-group-icons";
import llmstxt, {
copyOrDownloadAsMarkdownButtons,
} from "vitepress-plugin-llms";
import { withSidebar } from "vitepress-sidebar";
const version = "latest";
const vitepressConfig = {
export default defineConfig({
title: "Squadron",
description: "Docker Compose for Kubernetes",
lang: "en-US",
cleanUrls: true,
lastUpdated: true,
appearance: "dark",
ignoreDeadLinks: false,
base: "/squadron/",
sitemap: {
hostname: "https://foomo.github.io/squadron",
},
themeConfig: {
logo: "/logo.png",
outline: [2, 4],
nav: [
{ text: "Guide", link: "/guide/introduction" },
{ text: "Reference", link: "/reference/" },
],
sidebar: [
{
text: "Guide",
link: "/guide/",
items: [
{ text: "Introduction", link: "/guide/introduction" },
{ text: "Installation", link: "/guide/installation" },
{ text: "Quick Start", link: "/guide/quickstart" },
{ text: "Core Concepts", link: "/guide/concepts" },
{ text: "Configuration", link: "/guide/configuration" },
],
},
{
text: `${version}`,
text: "Reference",
items: [
{ text: "Overview", link: "/reference/" },
{
text: "CLI",
link: "/reference/cli/squadron",
collapsed: true,
items: [
{ text: "squadron", link: "/reference/cli/squadron" },
{ text: "up", link: "/reference/cli/squadron_up" },
{ text: "down", link: "/reference/cli/squadron_down" },
{ text: "diff", link: "/reference/cli/squadron_diff" },
{ text: "status", link: "/reference/cli/squadron_status" },
{ text: "rollback", link: "/reference/cli/squadron_rollback" },
{ text: "bake", link: "/reference/cli/squadron_bake" },
{ text: "build", link: "/reference/cli/squadron_build" },
{ text: "push", link: "/reference/cli/squadron_push" },
{ text: "list", link: "/reference/cli/squadron_list" },
{ text: "config", link: "/reference/cli/squadron_config" },
{ text: "template", link: "/reference/cli/squadron_template" },
{ text: "schema", link: "/reference/cli/squadron_schema" },
{
text: "completion",
link: "/reference/cli/squadron_completion",
},
{ text: "version", link: "/reference/cli/squadron_version" },
],
},
],
},
{
text: "Contributing",
collapsed: true,
items: [
{
text: "Release Notes",
link: "https://github.com/foomo/squadron/releases",
text: "Guideline",
link: "/CONTRIBUTING.md",
},
{
text: "Code of conduct",
link: "/CODE_OF_CONDUCT.md",
},
{
text: "Security guidelines",
link: "/SECURITY.md",
},
],
},
],
outline: {
level: [2, 3],
},
socialLinks: [
{ icon: "github", link: "https://github.com/foomo/squadron" },
],
editLink: {
pattern: "https://github.com/foomo/squadron/edit/main/docs/:path",
text: "Suggest changes to this page",
},
search: {
provider: "local",
},
footer: {
message: "Released under the MIT License.",
message:
'Made with ♥ <a href="https://www.foomo.org">foomo</a> by <a href="https://www.bestbytes.com">bestbytes</a>',
},
},
markdown: {
// https://github.com/vuejs/vitepress/discussions/3724
theme: {
light: "catppuccin-latte",
dark: "catppuccin-frappe",
},
socialLinks: [
{
icon: "github",
link: "https://github.com/foomo/squadron",
},
],
},
head: [
["meta", { name: "theme-color", content: "#ffffff" }],
["link", { rel: "icon", href: "/logo.png" }],
["meta", { name: "author", content: "foomo by bestbytes" }],
// OpenGraph
["meta", { property: "og:title", content: "foomo/squadron" }],
[
"meta",
@@ -87,35 +139,4 @@ const vitepressConfig = {
},
],
],
markdown: {
theme: {
dark: "one-dark-pro",
light: "github-light",
},
config(md) {
md.use(groupIconMdPlugin);
md.use(copyOrDownloadAsMarkdownButtons);
},
},
vite: {
plugins: [
groupIconVitePlugin(),
llmstxt({
excludeIndexPage: false,
}),
],
},
sitemap: {
hostname: "https://foomo.github.io/squadron",
},
ignoreDeadLinks: true,
};
export default defineConfig(
withSidebar(vitepressConfig, {
useTitleFromFrontmatter: true,
frontmatterOrderDefaultValue: 10,
useFolderTitleFromIndexFile: true,
sortMenusByFrontmatterOrder: true,
}),
);
});

View File

@@ -0,0 +1,91 @@
@font-face {
font-family: "Bebas Neue";
src: url("/fonts/BebasNeue-Regular.ttf") format("truetype");
font-weight: 400;
font-style: normal;
font-display: swap;
}
/* Inter variable (normal) */
@font-face {
font-family: "Inter";
src: url("/fonts/Inter-VariableFont_opsz,wght.ttf") format("truetype");
font-weight: 100 900;
font-optical-sizing: auto;
font-style: normal;
font-display: swap;
}
/* Inter variable (italic) */
@font-face {
font-family: "Inter";
src: url("/fonts/Inter-Italic-VariableFont_opsz,wght.ttf") format("truetype");
font-weight: 100 900;
font-optical-sizing: auto;
font-style: italic;
font-display: swap;
}
/* JetBrains Mono variable (normal) */
@font-face {
font-family: "JetBrains Mono";
src: url("/fonts/JetBrainsMono-VariableFont_wght.ttf") format("truetype");
font-weight: 100 900;
font-stretch: 100%;
font-style: normal;
font-display: swap;
}
/* JetBrains Mono variable (italic) */
@font-face {
font-family: "JetBrains Mono";
src: url("/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf")
format("truetype");
font-weight: 100 900;
font-stretch: 100%;
font-style: italic;
font-display: swap;
}
:root {
--vp-font-family-base:
"Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
--vp-font-family-mono:
"JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Monaco, Consolas,
"Liberation Mono", "Courier New", monospace;
--vp-font-family-display:
"Bebas Neue", "Inter", ui-sans-serif, system-ui, -apple-system,
BlinkMacSystemFont, sans-serif;
}
.VPNavBarTitle .logo {
height: 36px !important;
width: auto !important;
}
h1,
.vp-doc h1 {
font-family: var(--vp-font-family-display);
font-weight: 400;
letter-spacing: 2px;
text-transform: uppercase;
}
.home-page .section-title {
font-family: var(--vp-font-family-display);
font-weight: 400 !important;
letter-spacing: 2px !important;
text-transform: uppercase !important;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
}
.hero-title,
.title-main {
font-family: var(--vp-font-family-display);
font-weight: 400;
letter-spacing: 4px;
text-transform: uppercase;
}

View File

@@ -0,0 +1,9 @@
import type { Theme } from "vitepress";
import DefaultTheme from "vitepress/theme";
import "@catppuccin/vitepress/theme/frappe/blue.css";
import "./custom.css";
export default {
extends: DefaultTheme,
} satisfies Theme;

View File

@@ -5,11 +5,11 @@
"": {
"name": "docs",
"devDependencies": {
"@catppuccin/vitepress": "^0.1.2",
"micromark-util-decode-string": "2.0.1",
"vitepress": "1.6.4",
"vitepress-plugin-group-icons": "1.6.5",
"vitepress-plugin-llms": "1.9.3",
"vitepress-sidebar": "1.33.1",
},
},
},
@@ -60,6 +60,8 @@
"@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="],
"@catppuccin/vitepress": ["@catppuccin/vitepress@0.1.2", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-dqhgo6U6GWbgh3McAgwemUC8Y2Aj48rRcQx/9iuPzBPAgo7NA3yi7ZcR0wolAENMmoOMAHBV+rz/5DfiGxtZLA=="],
"@docsearch/css": ["@docsearch/css@3.8.2", "", {}, "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ=="],
"@docsearch/js": ["@docsearch/js@3.8.2", "", { "dependencies": { "@docsearch/react": "3.8.2", "preact": "^10.0.0" } }, "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ=="],
@@ -126,8 +128,6 @@
"@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="],
"@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.53.3", "", { "os": "android", "cpu": "arm" }, "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w=="],
@@ -280,8 +280,6 @@
"copy-anything": ["copy-anything@4.0.5", "", { "dependencies": { "is-what": "^5.2.0" } }, "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA=="],
"cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
"csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
@@ -292,8 +290,6 @@
"devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
"eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
"emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
"emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="],
@@ -318,16 +314,12 @@
"focus-trap": ["focus-trap@7.6.6", "", { "dependencies": { "tabbable": "^6.3.0" } }, "sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q=="],
"foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
"format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="],
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
"get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
"glob": ["glob@11.1.0", "", { "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw=="],
"gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="],
"hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="],
@@ -346,10 +338,6 @@
"is-what": ["is-what@5.5.0", "", {}, "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw=="],
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
"jackspeak": ["jackspeak@4.1.1", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" } }, "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ=="],
"js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
"kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
@@ -358,8 +346,6 @@
"longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
"lru-cache": ["lru-cache@11.2.4", "", {}, "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg=="],
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
"mark.js": ["mark.js@8.11.1", "", {}, "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ=="],
@@ -430,8 +416,6 @@
"minimatch": ["minimatch@10.1.1", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ=="],
"minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
"minisearch": ["minisearch@7.2.0", "", {}, "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg=="],
"mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="],
@@ -444,14 +428,8 @@
"oniguruma-to-es": ["oniguruma-to-es@3.1.1", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ=="],
"package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
"package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
"path-scurry": ["path-scurry@2.0.1", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA=="],
"path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],
"pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
@@ -472,8 +450,6 @@
"punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="],
"qsu": ["qsu@1.10.4", "", {}, "sha512-v5RhwvHMkDdbXEaAxQh5re8q7DiG6EE70+CNwYVA6wZsa4gUrpur+D8lIO3PrzeCj3azc/S79X5v3BH8ILfr9A=="],
"regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="],
"regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
@@ -498,14 +474,8 @@
"section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="],
"shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
"shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
"shiki": ["shiki@2.5.0", "", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/langs": "2.5.0", "@shikijs/themes": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ=="],
"signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
"space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
@@ -516,14 +486,10 @@
"string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
"string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
"stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
"strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
"strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
"strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="],
"superjson": ["superjson@2.2.6", "", { "dependencies": { "copy-anything": "^4" } }, "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA=="],
@@ -538,6 +504,8 @@
"trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
"uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="],
"ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="],
@@ -568,16 +536,10 @@
"vitepress-plugin-llms": ["vitepress-plugin-llms@1.9.3", "", { "dependencies": { "gray-matter": "^4.0.3", "markdown-it": "^14.1.0", "markdown-title": "^1.0.2", "mdast-util-from-markdown": "^2.0.2", "millify": "^6.1.0", "minimatch": "^10.0.3", "path-to-regexp": "^8.3.0", "picocolors": "^1.1.1", "pretty-bytes": "^7.0.1", "remark": "^15.0.1", "remark-frontmatter": "^5.0.0", "tokenx": "^1.1.0", "unist-util-remove": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-iU6LQVGS35urNGW/RXHTtt9gj6kprV9ptJDX7ZiC+kgFtqiBMDo2bdXh2YG+KUGU3geKZWkWZcurhnrNCmofsA=="],
"vitepress-sidebar": ["vitepress-sidebar@1.33.1", "", { "dependencies": { "glob": "11.1.0", "gray-matter": "4.0.3", "qsu": "^1.10.4" } }, "sha512-wPUbXezGakVldawixeRW5tKQTLKoMj2t4nWoThKfCltBM/9a38IE+wCXmmRNW22ZKC32SD/X/sG6NyCTK8QBRg=="],
"vue": ["vue@3.5.25", "", { "dependencies": { "@vue/compiler-dom": "3.5.25", "@vue/compiler-sfc": "3.5.25", "@vue/runtime-dom": "3.5.25", "@vue/server-renderer": "3.5.25", "@vue/shared": "3.5.25" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g=="],
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
"wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
"wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
"y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
"yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
@@ -586,18 +548,6 @@
"zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
"@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
"@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
"@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
"js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
"@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
"@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
"@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
}
}

95
docs/guide/concepts.md Normal file
View File

@@ -0,0 +1,95 @@
---
title: Core Concepts
---
# Core Concepts
## Squadrons and units
A `squadron.yaml` describes one or more **squadrons**, and each squadron
contains one or more **units**:
```yaml
squadron:
<squadron>: # a named group, e.g. "storefinder"
<unit>: # a deployable service, e.g. "backend"
chart: ...
builds: ...
values: ...
```
A **unit** is the core building block. It maps to a single Helm release and,
optionally, the Docker image(s) that release runs. A **squadron** is just a
named group of units you want to manage together.
## What a unit contains
| Field | Purpose |
| ----------- | ----------------------------------------------------------------------- |
| `chart` | The Helm chart to deploy (inline path, or `name`/`version`/`repository`). |
| `values` | Helm values passed to the chart. |
| `builds` | Docker images to build with `docker build`. |
| `bakes` | Docker images to build with `docker buildx bake`. |
| `tags` | Labels used to filter which units a command acts on. |
| `priority` | Install ordering — higher priority is applied first. |
| `name` | Override the Helm release name (defaults to the unit name). |
| `namespace` | Override the target namespace. |
| `extends` | Merge values from an external file. |
| `kustomize` | Path to Kustomize resources to include. |
See [Configuration](/guide/configuration) for the full field reference.
## Builds vs. bakes
Both produce the container images your charts run; they differ in the engine:
- **`builds`** invoke `docker build` directly — one image per build entry, with
the familiar build options (`context`, `dockerfile`, `buildArg`, `platform`,
`target`, `secret`, `cacheFrom`/`cacheTo`, …).
- **`bakes`** generate a `docker buildx bake` HCL file and build through Buildx,
which is better for building many targets together, advanced caching, and
multi-platform output. Bake targets can `inherit` from one another.
Use `builds` for straightforward single-image units; reach for `bakes` when you
want Buildx orchestration across multiple targets.
## The lifecycle
When you run a command, Squadron processes your configuration in stages:
1. **Merge** — multiple `-f` config files are conflated into one (later files
override earlier ones).
2. **Filter** — narrow to the requested squadron, units, or `--tags`.
3. **Render** — execute Go templates in the configuration values.
4. **Build / Bake** — build and (optionally) push images.
5. **Deploy** — run the Helm operation (`up`, `diff`, `down`, `rollback`, …).
The build and deploy stages run concurrently across units where possible, and
`priority` controls install ordering.
## Templating
Configuration values are rendered as Go templates **before** they reach Helm.
Squadron uses `<% %>` delimiters (so they don't clash with Helm's `{{ }}`) and
includes the full [Sprig](https://masterminds.github.io/sprig/) function set
plus Squadron-specific helpers:
| Helper | Description |
| ----------------- | -------------------------------------------------------- |
| `env "NAME"` | Read an environment variable (errors if missing). |
| `envDefault` | Read an environment variable with a fallback. |
| `file` | Read and render a file from disk. |
| `git` | Read git metadata (e.g. commit, branch). |
| `op` / `opDoc` | Fetch secrets / documents from 1Password. |
| `kubeseal` | Encrypt a value with Sealed Secrets. |
| `quote`/`quoteAll`| Quote a value / all values in a list. |
| `toYaml`/`fromYaml`, `toJson`/`fromJson`, `toToml`/`fromToml` | Convert between formats. |
Within templates you can also reference the rendered configuration itself —
for example `.Squadron.<squadron>.<unit>.builds.<name>.tag` — to keep values in
sync with builds, as the [Quick Start](/guide/quickstart) shows.
::: warning Deprecated helpers
`indent`, `base64`, and `defaultIndex` still work but are deprecated; prefer the
Sprig equivalents.
:::

144
docs/guide/configuration.md Normal file
View File

@@ -0,0 +1,144 @@
---
title: Configuration
---
# Configuration
Squadron is configured with one or more YAML files (default: `squadron.yaml`),
schema version `2.3`. Values support Go templating with `<% %>` delimiters — see
[Core Concepts](/guide/concepts#templating).
You can pass several files with repeated `-f` flags; they are merged in order,
with later files overriding earlier ones.
## Top-level structure
```yaml
# yaml-language-server: $schema=https://raw.githubusercontent.com/foomo/squadron/refs/heads/main/squadron.schema.json
version: '2.3' # required, schema version
vars: {} # template variables, available as <% .Vars.* %>
global: {} # Helm global values shared across units
builds: {} # reusable top-level builds, referenced by units
bake: '' # path/override for the generated buildx bake file
squadron: # the squadrons → units tree
<squadron>:
<unit>:
...
```
| Field | Type | Description |
| ---------- | ------ | -------------------------------------------------------- |
| `version` | string | Schema version. Required. Currently `2.3`. |
| `vars` | map | Template variables, referenced as `<% .Vars.x %>`. |
| `global` | map | Helm global values merged into every unit. |
| `builds` | map | Shared build definitions units can reference. |
| `bake` | string | Override for the generated `buildx bake` file. |
| `squadron` | map | The squadrons, each containing units. |
## Unit
```yaml
squadron:
storefinder:
backend:
name: my-backend # optional release name (default: unit name)
namespace: my-namespace # optional target namespace
priority: 0 # higher is installed first
tags: [web, api] # filter labels for --tags
extends: ./defaults.yaml # merge values from an external file
kustomize: ./kustomize # path to Kustomize resources
chart: ... # Helm chart (see below)
builds: ... # docker build targets (see below)
bakes: ... # docker buildx bake targets (see below)
values: {} # Helm values for the chart
```
| Field | Type | Description |
| ----------- | ----------- | ------------------------------------------------------ |
| `chart` | string/map | Chart to deploy. Inline path string, or a chart map. |
| `values` | map | Helm values passed to the chart. |
| `builds` | map | Named `docker build` targets. |
| `bakes` | map | Named `docker buildx bake` targets. |
| `tags` | list | Labels used by `--tags` filtering. |
| `priority` | int | Install ordering; higher comes first. |
| `name` | string | Override the Helm release name. |
| `namespace` | string | Override the target namespace. |
| `extends` | string | File whose values are merged into this unit. |
| `kustomize` | string | Path to Kustomize resources. |
## Chart
`chart` can be an inline path string:
```yaml
chart: <% env "PROJECT_ROOT" %>/path/to/chart
```
…or a structured reference to a packaged chart:
```yaml
chart:
name: mychart
version: 0.1.0
repository: https://helm.mycompany.com/repository
alias: my-alias # optional
schema: ./values.schema.json # optional values schema
```
## Builds
Each entry under `builds` is a `docker build` target. Common fields:
```yaml
builds:
default:
image: docker.mycompany.com/mycompany/backend
tag: latest
context: <% env "PROJECT_ROOT" %>/app
dockerfile: <% env "PROJECT_ROOT" %>/Dockerfile
buildArg:
- "FOO=foo"
platform:
- linux/amd64
target: production
```
Builds expose the full `docker build` / Buildx option surface — including
`platform`, `target`, `secret`, `ssh`, `cacheFrom`/`cacheTo`, `provenance`,
`sbom`, `output`, and `push`. See [`squadron build`](/reference/cli/squadron_build).
## Bakes
Each entry under `bakes` is a `docker buildx bake` target, mapping to the HCL
bake schema:
```yaml
bakes:
service:
tags:
- docker.mycompany.com/mycompany/frontend:latest
dockerfile: Dockerfile
context: .
args:
FOO: foo
platforms:
- linux/amd64
- linux/arm64
inherits:
- base
```
Bake targets support `inherits`, `contexts`, `cacheFrom`/`cacheTo`, `secret`,
`ssh`, `outputs`, and the other Buildx bake attributes. See
[`squadron bake`](/reference/cli/squadron_bake).
## JSON schema
The full machine-readable schema lives at
[`squadron.schema.json`](https://github.com/foomo/squadron/blob/main/squadron.schema.json)
and can be regenerated with [`squadron schema`](/reference/cli/squadron_schema).
Add the language-server hint shown above to get autocompletion and validation in
your editor.

View File

@@ -1,4 +1,13 @@
---
title: Guide
order: 1
---
# Guide
Get started with Squadron:
- [Introduction](/guide/introduction) — why Squadron exists and what it does.
- [Installation](/guide/installation) — install the CLI.
- [Quick Start](/guide/quickstart) — deploy the `helloworld` example.
- [Core Concepts](/guide/concepts) — squadrons, units, builds, bakes, templating.
- [Configuration](/guide/configuration) — the `squadron.yaml` reference.

View File

@@ -0,0 +1,65 @@
---
title: Installation
---
# Installation
Squadron is a single Go binary. Pick whichever method fits your workflow.
## Prerequisites
Squadron shells out to the standard toolchain, so make sure these are available
on your `PATH`:
- [`helm`](https://helm.sh) — chart install / upgrade / diff / rollback
- [`docker`](https://docs.docker.com/get-docker/) (with `buildx`) — image builds and bakes
- [`kubectl`](https://kubernetes.io/docs/tasks/tools/) — access to your cluster
## Install with `go install`
```shell
go install github.com/foomo/squadron/cmd/squadron@latest
```
This installs the `squadron` binary into `$GOPATH/bin`.
## Download a release binary
Pre-built binaries for Linux, macOS, and Windows are attached to every
[GitHub release](https://github.com/foomo/squadron/releases). Download the
archive for your platform, extract it, and move `squadron` onto your `PATH`.
## Docker image
```shell
docker run --rm foomo/squadron version
```
Images are published to [Docker Hub](https://hub.docker.com/r/foomo/squadron).
## From source
```shell
git clone https://github.com/foomo/squadron.git
cd squadron
make install # builds and installs to $GOPATH/bin
```
This repository uses [mise](https://mise.jdx.dev) to pin tool versions (Go,
golangci-lint, lefthook, bun, biome); run `mise install` once to match them.
## Verify
```shell
squadron version
```
## Shell completion
Squadron can generate completion scripts for bash, zsh, fish, and PowerShell:
```shell
squadron completion zsh > "${fpath[1]}/_squadron"
```
See [`squadron completion`](/reference/cli/squadron_completion) for the other shells.

View File

@@ -1,33 +1,59 @@
---
title: Introduction
order: 1
---
# Introduction
Welcome to **Squadron** Docker Compose for Kubernetes.
Squadron is a tool that brings Docker Compose paradigms to Kubernetes, enabling developers to keep working with the same familiar patterns they already know. Instead of learning new deployment models, you define your infrastructure once using Docker Compose concepts and deploy it to Kubernetes without friction.
**Squadron** is _Docker Compose for Kubernetes_: a single CLI that orchestrates
multiple Helm charts and Docker image builds as one cohesive deployment, driven
by one declarative file — `squadron.yaml`.
## Why Squadron?
Docker Compose is intuitive and powerful for local development. Kubernetes is the industry standard for production. Squadron lets you use the same thinking and workflows for both—no paradigm shift required.
`docker-compose` made multi-service local development easy: one file lists every
service, and one command brings the whole stack up. Kubernetes and Helm are the
production standard, but the developer experience is different — every service
becomes its own Helm chart and release, each with its own values, lifecycle, and
`helm` invocation. Coordinating a dozen of those by hand is tedious and
error-prone.
With Squadron, you:
Squadron closes that gap. You describe your services once, grouped into
**squadrons** of **units**, and Squadron handles the rest:
- **Use familiar Docker Compose patterns** — define services, networks, and volumes the way you already do
- **Deploy to Kubernetes seamlessly** — same definitions work in production without rewrites
- **Keep your workflow consistent** — think in the same mental model across all environments
- **Focus on your application** — not on learning Kubernetes-specific abstractions
- **One file, many charts** — group related releases and manage them together.
- **Build and deploy in one workflow** — define Docker builds (or `buildx bake`
targets) alongside the chart that consumes them.
- **Templated configuration** — share and compute values across units with Go
templates and helpers like `env`, `file`, and `git`.
- **The full Helm lifecycle** — `up`, `down`, `diff`, `status`, `rollback`, and
`template`, scoped to the whole squadron, individual units, or by tag.
## Production-Ready
In production a squadron is just another set of Helm releases, so you keep all
the tooling and guarantees you already rely on.
Squadron is battle-tested and used in production by BestBytes. It's designed for real-world workloads and proven to scale reliably.
## Coming from docker-compose
## Connect with Us
| docker-compose | Squadron |
| ------------------------- | ----------------------------------------------------- |
| `docker-compose.yml` | `squadron.yaml` |
| a `service` | a **unit** (a Helm release + optional image build) |
| the whole compose project | a **squadron** (a named group of units) |
| `build:` | `builds:` / `bakes:` (Docker build / `buildx bake`) |
| `docker compose up` | `squadron up` |
| `docker compose down` | `squadron down` |
| environment interpolation | Go templates with `env`, `file`, `git`, and more |
- **GitHub**: [foomo/squadron](https://github.com/foomo/squadron)
- **Learn More**: Visit [foomo.org](https://www.foomo.org) to discover our other open source projects
The big difference: each unit is backed by a **Helm chart**, so you get real
Kubernetes deployments instead of local containers — without writing a `helm`
command per service.
---
## Production-ready
Questions? Ideas? We'd love to hear from you. Check out our [Contributing Guidelines](../CONTRIBUTING.md) and join the community!
Squadron is battle-tested and used in production at BestBytes.
## Next steps
- [Installation](/guide/installation) — install the CLI.
- [Quick Start](/guide/quickstart) — deploy the `helloworld` example.
- [Core Concepts](/guide/concepts) — squadrons, units, builds, bakes, templating.
- [Configuration](/guide/configuration) — the `squadron.yaml` reference.

View File

@@ -1,8 +1,96 @@
---
title: Quick Start
order: 2
---
# Quick Start
Get up and running with Squadron in minutes using the helloworld example.
This walkthrough uses the [`helloworld`
example](https://github.com/foomo/squadron/tree/main/_examples/helloworld) from
the repository. It defines a single squadron (`storefinder`) with one unit
(`backend`) that builds a small Go HTTP server and deploys it with a Helm chart.
## The configuration
`_examples/helloworld/squadron.yaml`:
```yaml
version: '2.3'
squadron:
storefinder:
backend:
chart: <% env "PROJECT_ROOT" %>/../common/charts/backend
builds:
default:
tag: latest
context: <% env "PROJECT_ROOT" %>/app
dockerfile: <% env "PROJECT_ROOT" %>/../common/docker/backend.Dockerfile
image: helloworld/app
values:
image:
tag: <% .Squadron.storefinder.backend.builds.default.tag | quote %>
repository: <% .Squadron.storefinder.backend.builds.default.image %>
service:
ports:
- 80
```
A few things to notice:
- `<% ... %>` are Go template expressions — Squadron uses `<% %>` delimiters, not
the `{{ }}` Helm uses.
- `env "PROJECT_ROOT"` reads an environment variable, so paths resolve relative
to the example directory.
- The `values` reference the build's own fields
(`.Squadron.storefinder.backend.builds.default...`), so the image tag and
repository stay in sync with the build definition automatically.
## Run it
From `_examples/helloworld` (which exports `PROJECT_ROOT`):
```shell
# 1. Inspect the fully merged & rendered config
squadron config
# 2. List the squadrons and units
squadron list
# 3. Build the Docker image for the unit
squadron build
# 4. Render the Helm templates locally (no cluster needed)
squadron template
# 5. Install / upgrade the releases on your current kube-context
squadron up
# 6. Check release status
squadron status
# 7. Tear it down
squadron down
```
::: tip
`squadron template` and `squadron config` don't touch your cluster, so they're a
safe way to explore what Squadron will do before running `up`.
:::
## Scope your commands
Every lifecycle command accepts squadron and unit selectors, so you can act on
part of the fleet:
```shell
squadron up storefinder # everything in the storefinder squadron
squadron up storefinder backend # just the backend unit
squadron up --tags web # only units tagged "web"
squadron up --tags web,-legacy # include "web", exclude "legacy"
```
## Next steps
- [Core Concepts](/guide/concepts) — how squadrons, units, builds, and bakes fit together.
- [Configuration](/guide/configuration) — the full `squadron.yaml` reference.
- [CLI Reference](/reference/cli/squadron) — every command and flag.

View File

@@ -9,19 +9,23 @@ hero:
tagline: Docker Compose for Kubernetes
actions:
- theme: brand
text: Guide
text: Get Started
link: /guide/introduction
- theme: alt
text: Quick Start
link: /guide/quickstart
- theme: alt
text: GitHub
link: https://github.com/foomo/squadron
features:
- title: One file, many charts
details: Orchestrate multiple Helm charts and Docker builds from a single squadron.yaml.
link: /guide/concepts
- title: Familiar workflow
details: An easy transition from docker-compose — define services once, deploy to Kubernetes.
link: /guide/introduction
- title: Production ready
details: Squadron is used in production by BestBytes
- title: foomo
details: Our combined open source efforts, general guides for programmers and project managers
link: https://www.foomo.org
- title: Handbook
details: Guides for our employees
link: /handbook/introduction
details: Battle-tested and used in production by BestBytes. In prod it's just another Helm chart.
link: /guide/quickstart
---

View File

@@ -3,11 +3,11 @@
"name": "docs",
"version": "0.1.0",
"devDependencies": {
"@catppuccin/vitepress": "^0.1.2",
"micromark-util-decode-string": "2.0.1",
"vitepress": "1.6.4",
"vitepress-plugin-group-icons": "1.6.5",
"vitepress-plugin-llms": "1.9.3",
"vitepress-sidebar": "1.33.1"
"vitepress-plugin-llms": "1.9.3"
},
"scripts": {
"dev": "vitepress dev",

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,21 @@
---
title: Reference
order: 2
---
# Reference
Technical reference for Squadron.
## CLI
Every command and flag, generated from the Squadron binary:
- [`squadron`](/reference/cli/squadron) — root command and global flags
The CLI reference is generated from source with `make docs.cli`, so it stays in
sync with the binary.
## Configuration
- [Configuration guide](/guide/configuration) — annotated `squadron.yaml` reference
- [`squadron.schema.json`](https://github.com/foomo/squadron/blob/main/squadron.schema.json) — machine-readable JSON schema

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"os"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"github.com/foomo/squadron"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"os"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"os"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"github.com/foomo/squadron"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"github.com/pkg/errors"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"context"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"io"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"github.com/foomo/squadron"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"github.com/pkg/errors"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"fmt"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"os"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"github.com/pkg/errors"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"os"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"os"

View File

@@ -1,4 +1,4 @@
package actions
package cli
import (
"github.com/pterm/pterm"