From fa2cd9bd6da125c520273dbd49be46f3f3ac7d24 Mon Sep 17 00:00:00 2001 From: scanner <280983584+hivecommons-hive[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 18:17:44 -0400 Subject: [PATCH 1/2] docs: add Crux section Signed-off-by: scanner <280983584+hivecommons-hive[bot]@users.noreply.github.com> --- .github/workflows/check-internal-links.yml | 2 +- CONTRIBUTING.md | 2 +- README.md | 7 +- _typos.toml | 1 + changelog.d/added-489-crux-docs-section.md | 1 + docs/content/crux/readme.md | 208 +++++++++++++++++++++ netlify.toml | 10 + public/config/shared.json | 19 ++ public/llms.txt | 1 + scripts/check-internal-links-helpers.ts | 1 + scripts/sync-sibling-docs.ts | 9 +- src/app/docs/[...slug]/layout.tsx | 1 + src/app/docs/[...slug]/page.tsx | 4 +- src/app/docs/layout.tsx | 2 +- src/app/docs/page-map.ts | 16 ++ src/components/docs/DocsFooter.tsx | 12 ++ src/components/docs/DocsSidebar.tsx | 1 + src/components/docs/DocsSourceActions.tsx | 1 + src/config/versions.ts | 23 ++- 19 files changed, 311 insertions(+), 10 deletions(-) create mode 100644 changelog.d/added-489-crux-docs-section.md create mode 100644 docs/content/crux/readme.md diff --git a/.github/workflows/check-internal-links.yml b/.github/workflows/check-internal-links.yml index c6f5413..2aad431 100644 --- a/.github/workflows/check-internal-links.yml +++ b/.github/workflows/check-internal-links.yml @@ -68,7 +68,7 @@ jobs: run: npm run sync-hive-docs || echo "sync skipped (network unavailable); checking committed content" # Same for the sibling-project docs (hotshot, pluk, rationguard, - # promptargs, dibs, Spektacular): their synced pages carry internal + # promptargs, dibs, Crux, Spektacular): their synced pages carry internal # /docs//... links that the committed snapshot alone cannot gate. - name: Sync sibling docs run: npm run sync-sibling-docs || echo "sibling sync skipped (network unavailable); checking committed content" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3297d7a..a53ab48 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,7 +3,7 @@ Thank you for helping improve the Hive Commons documentation site ([docs.hivecommons.dev](https://docs.hivecommons.dev)). -- Hive, hotshot, pluk, rationguard, promptargs, dibs, and Spektacular page content is +- Hive, hotshot, pluk, rationguard, promptargs, dibs, Crux, and Spektacular page content is synced from the project repositories at build time — edit it there (see README "How content is sourced"). - Site code, navigation, and layout changes belong in this repository. diff --git a/README.md b/README.md index 242cee8..fb30e94 100644 --- a/README.md +++ b/README.md @@ -15,21 +15,22 @@ Official documentation site for [Hive Commons](https://hivecommons.dev), served - **[rationguard](https://github.com/hivecommons/rationguard)** — detect and rebut rationalization patterns in AI agent output - **[promptargs](https://github.com/hivecommons/promptargs)** — template expansion for AI prompts - **[dibs](https://github.com/hivecommons/dibs)** — claim ideas so contributors get credit when agents implement them +- **[Crux](https://github.com/hivecommons/crux)** — standalone runtime for AI coding agents - **[Spektacular (Spek)](https://github.com/hivecommons/spektacular)** — spec-driven development for AI coding agents (canonical site: [spektacular.dev](https://spektacular.dev)) ## How content is sourced -Hive, hotshot, pluk, rationguard, promptargs, dibs, and Spektacular docs are +Hive, hotshot, pluk, rationguard, promptargs, dibs, Crux, and Spektacular docs are **single-sourced from their repositories** and pulled at build time: - `scripts/sync-hive-docs.ts` pulls Hive docs from `hivecommons/hive` (`src/docs/`, branch `v5`; override with `HIVE_DOCS_OWNER` / `HIVE_DOCS_REPO` / `HIVE_DOCS_REF`). -- `scripts/sync-sibling-docs.ts` pulls the hotshot, pluk, rationguard, promptargs, dibs, and Spektacular docs from their repos. +- `scripts/sync-sibling-docs.ts` pulls the hotshot, pluk, rationguard, promptargs, dibs, Crux, and Spektacular docs from their repos. Spektacular also pulls its tutorials from `hivecommons/spektacular-website` (MDX, converted to Markdown by `scripts/mdx-to-markdown.ts`; override the ref with `SPEKTACULAR_WEBSITE_DOCS_REF`). Override the org for all sibling repos with `SIBLING_DOCS_OWNER` (default `hivecommons`), or the branch/ref for an individual project with `HOTSHOT_DOCS_REF`, `PLUK_DOCS_REF`, - `RATIONGUARD_DOCS_REF`, `PROMPTARGS_DOCS_REF`, `DIBS_DOCS_REF`, or `SPEKTACULAR_DOCS_REF`. + `RATIONGUARD_DOCS_REF`, `PROMPTARGS_DOCS_REF`, `DIBS_DOCS_REF`, `CRUX_DOCS_REF`, or `SPEKTACULAR_DOCS_REF`. Edit the canonical source in the project repository — not the synced copies under `docs/content/`. If a sync source is unreachable at build time, the build fails so diff --git a/_typos.toml b/_typos.toml index 3fbae4b..c755b61 100644 --- a/_typos.toml +++ b/_typos.toml @@ -9,6 +9,7 @@ extend-exclude = [ "messages/", # Synced from the project repositories at build time (README "How content # is sourced"); fix spelling in the canonical source, not the copy. + "docs/content/crux/", "docs/content/dibs/", "docs/content/hive/", "docs/content/hotshot/", diff --git a/changelog.d/added-489-crux-docs-section.md b/changelog.d/added-489-crux-docs-section.md new file mode 100644 index 0000000..48f6717 --- /dev/null +++ b/changelog.d/added-489-crux-docs-section.md @@ -0,0 +1 @@ +- Added a Crux section to the docs site (`/docs/crux/`), synced from `hivecommons/crux`, with sidebar, footer, llms.txt and project-list entries (hivecommons/docs#489). diff --git a/docs/content/crux/readme.md b/docs/content/crux/readme.md new file mode 100644 index 0000000..69b2f03 --- /dev/null +++ b/docs/content/crux/readme.md @@ -0,0 +1,208 @@ +> **Synced from crux.** This page is pulled from [hivecommons/crux@main](https://github.com/hivecommons/crux/blob/main/README.md) during the docs build. Edit the canonical source in the crux repository. + +# Crux + +## What is this? + +Crux is a program that runs AI coding agents for you. You give it a short +YAML file that says which agent to run and with which model. Crux starts +the agent, keeps an eye on it, sends it work, and stops it when you say so. +It is the engine inside [Hive](https://github.com/hivecommons/hive), split +out so other projects can use it too. + +## Why would I use it? + +Running one coding agent by hand is easy. Running several, for hours, +without watching them, is not. Agents hang, crash, lose their place, or +try to do things they were never asked to do. Crux handles that part: + +- It starts each agent inside tmux. tmux is a tool that keeps a terminal + session alive in the background, so the agent keeps running after you + close your window. +- It supports many agent CLIs behind one interface: Claude, Copilot, + Gemini, Goose, Codex, Aider and Bob. +- It sends work to a running agent. Crux calls this a "kick". A small + reminder to a stuck agent is a "nudge". +- It notices when an agent stalls or crashes over and over, and restarts + or pauses it. +- Inside Hive, every write an agent makes to GitHub goes through a proxy. + A proxy is a middle step that sees each request before it goes out, so + it can log the request or refuse it. Crux also has tool approval (an + allow list of what an agent may call) and an opt-in sandbox (a separate + container or Kubernetes Job for each piece of work). These parts are + wired up by Hive today; a plain `crux run` on your laptop does not turn + them on for you. + +Hive has run this engine in the open on real repositories. In one five-day +window in October 2026 it made 4,349 agent writes to GitHub, all through +the proxy, with 7 refused and recorded. + +## Install + +Pick one. + +```sh +# Homebrew (macOS, Linux) +brew install hivecommons/hive/crux + +# Go +go install github.com/hivecommons/crux/cmd/crux@latest + +# Container image (amd64 and arm64; tmux is already inside) +docker run --rm ghcr.io/hivecommons/crux:0.1.0 --help +``` + +Or download a release archive from the +[releases page](https://github.com/hivecommons/crux/releases). There is +one for darwin and linux, each for amd64 and arm64. The checksums are +signed with cosign. cosign is a tool that proves a file was published by +this repo's release workflow and not changed since. To check: + +```sh +# from the v0.1.0 release page, download these three files first +cosign verify-blob --bundle checksums.txt.sigstore.json checksums.txt +sha256sum -c checksums.txt --ignore-missing +tar xzf crux_0.1.0_linux_amd64.tar.gz +./crux --version +``` + +The agent CLIs themselves (for example `copilot` or `claude`) are not +included. Install and log in to the one you want to run first, and make +sure `tmux` is on your PATH. + +## Run your first agent + +Make a folder with one definition file: + +```sh +mkdir -p defs +cat > defs/scout.yaml <<'YAML' +apiVersion: hive.kubestellar.io/v1 +kind: AgentDefinition +metadata: + name: scout +spec: + backend: copilot + model: claude-sonnet-4-6 +YAML +``` + +Then run it: + +```sh +export CRUX_DEFS=./defs # where crux looks for definitions +crux run scout # start scout and stream its output; Ctrl-C stops it +``` + +From a second terminal, while it is running: + +```sh +crux ps # what is running +crux logs scout -n 50 # the last 50 lines of its screen +crux kick scout "look at issue 42" # send it work +crux stop scout # stop it +``` + +Agent files live under `--workdir` (default `$HIVE_WORK_DIR`, then +`$HOME/.crux`). While `crux run` is in the foreground it opens a small +control socket in that folder, and `ps`, `logs`, `kick` and `stop` use it +to reach the live agent. + +## Run it as a service + +`crux serve` keeps the runtime up and exposes it over HTTP+JSON, so other +programs (or you, from another shell) can drive it: + +```sh +# Serve on a unix socket. A unix socket is a file on disk that two +# programs on the same machine use to talk to each other. +crux serve --socket /run/crux/crux.sock + +# From another shell, point the CLI at it. +export CRUX_SERVER=/run/crux/crux.sock +crux ps +crux run ./defs/scout.yaml +crux logs -f scout # follow its output +``` + +`--listen 127.0.0.1:PORT --token T` adds a loopback TCP listener. It +refuses to start without a token. Set `CRUX_TOKEN` instead of passing +`--token` each time. The routes are documented in Hive's +[`crux serve`](https://github.com/hivecommons/hive/blob/v5/src/docs/crux-serve.md) +page; the Go client lives in `github.com/hivecommons/crux/api`. + +## How it fits with Hive + +Hive is a system that runs a whole team of agents against a set of +repositories, with a governor that decides what runs, a dashboard, review +and evidence. Crux is the part of Hive that touches the agent processes. +Hive is its first user and can run Crux as a sidecar: a second process +that sits next to Hive and is reached over the unix socket from +`crux serve`. In-process is still Hive's default while the sidecar mode is +proven. Nothing in Crux depends on Hive. Hive's +[security model](https://github.com/hivecommons/hive/blob/v5/src/docs/security-model.md) +lists the controls, which ones belong to Crux, and what is still missing. + +## Commands + +| Command | What it does | +|---|---| +| `crux run ` | Start an agent, stream its output, stop it on Ctrl-C. `--detach` returns right away. | +| `crux ps` | List running agents. `--json` for machine output. | +| `crux logs ` | Show recent output. `-n N`, `--buffer`, `--full`, `--json`; `-f` follows when using `--server`. | +| `crux kick ` | Send work to an agent. `-` reads the message from stdin. | +| `crux stop ` | Stop an agent. | +| `crux serve` | Serve the runtime over HTTP+JSON. `--socket`, `--listen`, `--token`, `--hive-callback`. | +| `crux agy-turn` | Internal. The runtime types this into a pane itself; do not run it by hand. | +| `crux --version` | Print the version. | + +Global flags: `--workdir`, `--defs` (same as `--config`), `--socket`, +`--local`, `--server`, `--token`. Environment variables that stand in for +them: `CRUX_DEFS`, `CRUX_SOCKET`, `CRUX_SERVER`, `CRUX_TOKEN`. + +## Status + +Current release: v0.1.0. This is early software. + +What works today: the `crux` CLI (`run`, `ps`, `logs`, `kick`, `stop`), +`crux serve` with its HTTP+JSON API and Go client, remote mode with +`--server`, and the release train (archives, container image, cosign +signatures). + +What is not there yet: + +- Hive does not use the sidecar by default. In-process is still the + default until the remaining stages prove parity. +- Credential callbacks are partial. The goal is that Crux never holds a + long-lived GitHub key and asks Hive for short, scoped tokens instead. +- The per-task sandbox is opt-in and only exists as a rootless Podman + container or a Kubernetes Job. Stronger sandboxes are under evaluation. +- No tenancy, quotas or multi-user auth. One runtime, one owner. +- Standalone `crux run` does not set up the proxy, tool approval or + sandbox for you. + +Progress is tracked in +[hivecommons/hive#14138](https://github.com/hivecommons/hive/issues/14138). +The design record is +[`src/docs/design/crux.md`](https://github.com/hivecommons/hive/blob/v5/src/docs/design/crux.md). + +## Contributing + +The Go code in this repository is not edited here. It is a copy of +[`src/crux`](https://github.com/hivecommons/hive/tree/v5/src/crux) in +hivecommons/hive, pushed by Hive's +[`crux-sync`](https://github.com/hivecommons/hive/blob/v5/.github/workflows/crux-sync.yml) +workflow on every change. `.hive-sync` names the exact Hive commit this +tree came from, and a `Sync guard` check rejects pull requests here that +touch Go files. Only the scaffolding is maintained in this repository: +`.github/`, `.goreleaser.yaml`, `Dockerfile`, this README and `LICENSE`. +The module's own README is synced to [`docs/MODULE.md`](https://github.com/hivecommons/crux/blob/main/docs/MODULE.md). + +So: file issues and code changes in +[hivecommons/hive](https://github.com/hivecommons/hive). Releases are cut +by tagging Hive `crux/vX.Y.Z`. How the publish works is in +[`src/docs/crux-publish.md`](https://github.com/hivecommons/hive/blob/v5/src/docs/crux-publish.md). + +## Licence + +Apache-2.0. Open source under Hive Commons. diff --git a/netlify.toml b/netlify.toml index 69387a6..40b27f9 100644 --- a/netlify.toml +++ b/netlify.toml @@ -113,6 +113,16 @@ to = "/docs/promptargs/overview/introduction" status = 302 +[[redirects]] + from = "/docs/crux" + to = "/docs/crux/overview/introduction" + status = 302 + +[[redirects]] + from = "/docs/crux/" + to = "/docs/crux/overview/introduction" + status = 302 + [[redirects]] from = "/docs/dibs" to = "/docs/dibs/overview/introduction" diff --git a/public/config/shared.json b/public/config/shared.json index 341687e..9b2a1bd 100644 --- a/public/config/shared.json +++ b/public/config/shared.json @@ -55,6 +55,13 @@ "isDefault": true } }, + "crux": { + "latest": { + "label": "main (Latest)", + "branch": "main", + "isDefault": true + } + }, "spektacular": { "latest": { "label": "main (Latest)", @@ -94,6 +101,11 @@ "basePath": "dibs", "currentVersion": "main" }, + "crux": { + "name": "Crux", + "basePath": "crux", + "currentVersion": "main" + }, "spektacular": { "name": "Spektacular", "basePath": "spektacular", @@ -136,6 +148,12 @@ "description": "Claim ideas so contributors get credit when agents implement them", "secondary": true }, + { + "title": "Crux", + "href": "/docs/crux/overview/introduction", + "description": "Standalone runtime for AI coding agents", + "secondary": true + }, { "title": "Spektacular", "href": "/docs/spektacular/overview/introduction", @@ -150,6 +168,7 @@ "rationguard": "https://github.com/hivecommons/rationguard/edit/main", "promptargs": "https://github.com/hivecommons/promptargs/edit/main", "spektacular": "https://github.com/hivecommons/spektacular/edit/main", + "crux": "https://github.com/hivecommons/crux/edit/main", "dibs": "https://github.com/hivecommons/dibs/edit/main" }, "updatedAt": "2026-09-24T11:55:47.068Z" diff --git a/public/llms.txt b/public/llms.txt index f007937..e87779f 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -20,6 +20,7 @@ Hive Commons thanks Akamai (Linode), Oracle Cloud (OKE), Cloudflare, GitHub Copi - [rationguard](https://docs.hivecommons.dev/docs/rationguard/overview/introduction): detect and rebut rationalization patterns in AI agent output - [promptargs](https://docs.hivecommons.dev/docs/promptargs/overview/introduction): template expansion for AI prompts - [dibs](https://docs.hivecommons.dev/docs/dibs/overview/introduction): claim ideas so contributors get credit when agents implement them +- [Crux](https://docs.hivecommons.dev/docs/crux/overview/introduction): standalone runtime for AI coding agents - [Spektacular (Spek)](https://docs.hivecommons.dev/docs/spektacular/overview/introduction): spec-driven development for AI coding agents ## Community diff --git a/scripts/check-internal-links-helpers.ts b/scripts/check-internal-links-helpers.ts index 3e742b6..3912ff9 100644 --- a/scripts/check-internal-links-helpers.ts +++ b/scripts/check-internal-links-helpers.ts @@ -83,6 +83,7 @@ export const PROJECT_FOR_NAV: Record = { RATIONGUARD: "docs/rationguard", PROMPTARGS: "docs/promptargs", DIBS: "docs/dibs", + CRUX: "docs/crux", SPEKTACULAR: "docs/spektacular", // Shared sections (Community, …) live under docs/content/
/ and // are served at /docs/
/. diff --git a/scripts/sync-sibling-docs.ts b/scripts/sync-sibling-docs.ts index 3a02b91..e26ef52 100644 --- a/scripts/sync-sibling-docs.ts +++ b/scripts/sync-sibling-docs.ts @@ -1,5 +1,5 @@ /** - * Sync hotshot, pluk, rationguard, promptargs, dibs, and Spektacular docs from their GitHub repos into docs/content/. + * Sync hotshot, pluk, rationguard, promptargs, dibs, Crux, and Spektacular docs from their GitHub repos into docs/content/. * * Same single-sourcing model as scripts/sync-hive-docs.ts: the repos own the * markdown; this script pulls it at build time (prebuild) so the site never @@ -119,6 +119,13 @@ export const PROJECTS: ProjectSync[] = [ { source: "docs/mcp-registry.md", target: "mcp-registry.md" }, ], }, + { + project: "crux", + owner: SIBLING_OWNER, + repo: "crux", + branch: process.env.CRUX_DOCS_REF || "main", + files: [{ source: "README.md", target: "readme.md", required: true }], + }, { // Canonical site is https://spektacular.dev. The repo README and // docs/knowledge-base.md come from the spektacular repo; the tutorials are diff --git a/src/app/docs/[...slug]/layout.tsx b/src/app/docs/[...slug]/layout.tsx index 9b5f51c..33db026 100644 --- a/src/app/docs/[...slug]/layout.tsx +++ b/src/app/docs/[...slug]/layout.tsx @@ -15,6 +15,7 @@ function getProjectFromSlug(slug: string[]): ProjectId { if (slug[0] === 'rationguard') return 'rationguard' if (slug[0] === 'promptargs') return 'promptargs' if (slug[0] === 'dibs') return 'dibs' + if (slug[0] === 'crux') return 'crux' if (slug[0] === 'spektacular') return 'spektacular' } return 'hive' diff --git a/src/app/docs/[...slug]/page.tsx b/src/app/docs/[...slug]/page.tsx index 0c83ae5..bedff92 100644 --- a/src/app/docs/[...slug]/page.tsx +++ b/src/app/docs/[...slug]/page.tsx @@ -16,7 +16,7 @@ import { notFound } from 'next/navigation' import type { Metadata } from 'next' const HIVE_DOCS_PATH = process.env.HIVE_DOCS_PATH -const STATIC_PROJECTS: ProjectId[] = ['hive', 'hotshot', 'pluk', 'rationguard', 'promptargs', 'dibs', 'spektacular'] +const STATIC_PROJECTS: ProjectId[] = ['hive', 'hotshot', 'pluk', 'rationguard', 'promptargs', 'dibs', 'crux', 'spektacular'] const INTEGRATIONS_DESCRIPTION = 'Hive works with Claude Code, GitHub Copilot, Codex, Antigravity, IBM Bob, Goose, vLLM, llm-d and more.' @@ -266,7 +266,7 @@ export function syncedSourceUrl(content: string): string | undefined { } function getProjectFromSlug(slug: string[]): { projectId: ProjectId | undefined; docSlug: string[] } { - const knownProjects: string[] = ['hive', 'hotshot', 'pluk', 'rationguard', 'promptargs', 'dibs', 'spektacular'] + const knownProjects: string[] = ['hive', 'hotshot', 'pluk', 'rationguard', 'promptargs', 'dibs', 'crux', 'spektacular'] if (slug.length > 0 && knownProjects.includes(slug[0])) { return { diff --git a/src/app/docs/layout.tsx b/src/app/docs/layout.tsx index ab14563..7e573a6 100644 --- a/src/app/docs/layout.tsx +++ b/src/app/docs/layout.tsx @@ -29,7 +29,7 @@ const jetbrainsMono = localFont({ const SITE_URL = 'https://docs.hivecommons.dev' const SITE_TITLE = 'Hive Commons Docs - AI Agent Collaboration Projects' const SITE_DESCRIPTION = - 'Documentation for Hive Commons projects that help AI coding agents and maintainers work together: Hive, Spektacular (Spek), hotshot, pluk, promptargs, rationguard, and dibs.' + 'Documentation for Hive Commons projects that help AI coding agents and maintainers work together: Hive, Spektacular (Spek), hotshot, pluk, promptargs, rationguard, dibs, and Crux.' const INTEGRATION_NAMES = [ 'Claude Code', diff --git a/src/app/docs/page-map.ts b/src/app/docs/page-map.ts index ff200cb..da54766 100644 --- a/src/app/docs/page-map.ts +++ b/src/app/docs/page-map.ts @@ -20,6 +20,8 @@ export function getContentPath(projectId: ProjectId): string { return path.join(process.cwd(), 'docs', 'content', 'promptargs') case 'dibs': return path.join(process.cwd(), 'docs', 'content', 'dibs') + case 'crux': + return path.join(process.cwd(), 'docs', 'content', 'crux') case 'spektacular': return path.join(process.cwd(), 'docs', 'content', 'spektacular') case 'hive': @@ -41,6 +43,8 @@ export function getBasePath(projectId: ProjectId): string { return 'docs/promptargs' case 'dibs': return 'docs/dibs' + case 'crux': + return 'docs/crux' case 'spektacular': return 'docs/spektacular' case 'hive': @@ -254,6 +258,16 @@ const NAV_STRUCTURE_DIBS: Array<{ title: string; items: NavItem[] }> = [ } ] +// Crux Navigation Structure +const NAV_STRUCTURE_CRUX: Array<{ title: string; items: NavItem[] }> = [ + { + title: 'Overview', + items: [ + { 'Introduction': 'readme.md' }, + ] + } +] + // Spektacular Navigation Structure (canonical site: https://spektacular.dev) // readme.md and knowledge-base.md are synced from hivecommons/spektacular; the // tutorials are converted from MDX in hivecommons/spektacular-website. @@ -315,6 +329,8 @@ function getProjectNavStructure(projectId: ProjectId): Array<{ title: string; it return NAV_STRUCTURE_PROMPTARGS case 'dibs': return NAV_STRUCTURE_DIBS + case 'crux': + return NAV_STRUCTURE_CRUX case 'spektacular': return NAV_STRUCTURE_SPEKTACULAR case 'hive': diff --git a/src/components/docs/DocsFooter.tsx b/src/components/docs/DocsFooter.tsx index 4d5de66..cefac1c 100644 --- a/src/components/docs/DocsFooter.tsx +++ b/src/components/docs/DocsFooter.tsx @@ -297,6 +297,18 @@ export default function Footer() { promptargs +
  • + + Crux + +
  • = { rationguard: 'https://github.com/hivecommons/rationguard/edit/main', promptargs: 'https://github.com/hivecommons/promptargs/edit/main', dibs: 'https://github.com/hivecommons/dibs/edit/main', + crux: 'https://github.com/hivecommons/crux/edit/main', spektacular: 'https://github.com/hivecommons/spektacular/edit/main', }; diff --git a/src/config/versions.ts b/src/config/versions.ts index 6da2251..6e6d4d0 100644 --- a/src/config/versions.ts +++ b/src/config/versions.ts @@ -1,5 +1,5 @@ // Multi-project versions config for the Hive Commons docs site -// Supports hive, hotshot, pluk, rationguard, promptargs, dibs, and spektacular with independent versioning +// Supports hive, hotshot, pluk, rationguard, promptargs, dibs, crux, and spektacular with independent versioning // // Versioning Strategy: // - Each project has its own version scheme @@ -24,6 +24,7 @@ export type ProjectId = | "pluk" | "rationguard" | "promptargs" + | "crux" | "dibs" | "spektacular"; @@ -113,6 +114,15 @@ const DIBS_VERSIONS: Record = { }, }; +// crux versions +const CRUX_VERSIONS: Record = { + latest: { + label: "main (Latest)", + branch: "main", + isDefault: true, + }, +}; + // spektacular versions (canonical site: https://spektacular.dev) const SPEKTACULAR_VERSIONS: Record = { latest: { @@ -172,6 +182,14 @@ export const PROJECTS: Record = { contentPath: "docs/content/dibs", versions: DIBS_VERSIONS, }, + crux: { + id: "crux", + name: "Crux", + basePath: "crux", + currentVersion: "main", + contentPath: "docs/content/crux", + versions: CRUX_VERSIONS, + }, spektacular: { id: "spektacular", name: "Spektacular", @@ -199,6 +217,9 @@ export function getProjectFromPath(pathname: string): ProjectConfig { if (pathname.startsWith("/docs/dibs")) { return PROJECTS.dibs; } + if (pathname.startsWith("/docs/crux")) { + return PROJECTS.crux; + } if (pathname.startsWith("/docs/spektacular")) { return PROJECTS.spektacular; } From 6dbe4aed770630de18b0aa7cdc5aa57aa4b3ed28 Mon Sep 17 00:00:00 2001 From: scanner <280983584+hivecommons-hive[bot]@users.noreply.github.com> Date: Mon, 26 Oct 2026 18:25:32 -0400 Subject: [PATCH 2/2] test: include crux in sibling project fixtures Signed-off-by: scanner <280983584+hivecommons-hive[bot]@users.noreply.github.com> --- scripts/sync-sibling-docs.test.ts | 1 + src/__tests__/check-internal-links-helpers.test.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/scripts/sync-sibling-docs.test.ts b/scripts/sync-sibling-docs.test.ts index c60f982..cfea073 100644 --- a/scripts/sync-sibling-docs.test.ts +++ b/scripts/sync-sibling-docs.test.ts @@ -12,6 +12,7 @@ const SIBLING_PROJECTS = [ "rationguard", "promptargs", "dibs", + "crux", "spektacular", ]; diff --git a/src/__tests__/check-internal-links-helpers.test.ts b/src/__tests__/check-internal-links-helpers.test.ts index f20e6ca..ab3bd36 100644 --- a/src/__tests__/check-internal-links-helpers.test.ts +++ b/src/__tests__/check-internal-links-helpers.test.ts @@ -288,6 +288,7 @@ describe("PROJECT_FOR_NAV", () => { RATIONGUARD: "docs/rationguard", PROMPTARGS: "docs/promptargs", DIBS: "docs/dibs", + CRUX: "docs/crux", SPEKTACULAR: "docs/spektacular", GENERAL: "docs", });