Skip to content

Commit 09fdbb0

Browse files
siracusa5claude
andauthored
docs: migrate website from Docusaurus to Fumadocs (#10)
Replace Docusaurus 3.7.0 with Fumadocs (fumadocs-core 15.x / fumadocs-mdx 11.x / Next.js 15). All 27 docs migrated. Custom landing page, neutral dark theme with purple accent, architecture SVGs, CI updated for pnpm + static export to Cloudflare Pages. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 7f1e43d commit 09fdbb0

63 files changed

Lines changed: 4846 additions & 19757 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/deploy-docs.yml

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,32 +24,36 @@ jobs:
2424
steps:
2525
- uses: actions/checkout@v4
2626

27+
- uses: pnpm/action-setup@v4
28+
with:
29+
package_json_file: website/package.json
30+
2731
- uses: actions/setup-node@v4
2832
with:
2933
node-version: 20
30-
cache: npm
31-
cache-dependency-path: website/package-lock.json
34+
cache: pnpm
35+
cache-dependency-path: website/pnpm-lock.yaml
3236

3337
- name: Install dependencies
3438
working-directory: website
35-
run: npm ci
39+
run: pnpm install --frozen-lockfile
3640

3741
- name: Build
3842
working-directory: website
39-
run: npm run build
43+
run: pnpm run build
4044

4145
- name: Deploy preview
4246
if: github.event_name == 'push'
4347
uses: cloudflare/wrangler-action@v3
4448
with:
4549
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
4650
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
47-
command: pages deploy website/build --project-name=harness-kit-docs --branch=preview
51+
command: pages deploy website/out --project-name=harness-kit-docs --branch=preview
4852

4953
- name: Deploy production
5054
if: github.event_name == 'release'
5155
uses: cloudflare/wrangler-action@v3
5256
with:
5357
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
5458
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
55-
command: pages deploy website/build --project-name=harness-kit-docs --branch=main
59+
command: pages deploy website/out --project-name=harness-kit-docs --branch=main

.github/workflows/validate.yml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,16 +118,20 @@ jobs:
118118
steps:
119119
- uses: actions/checkout@v4
120120

121+
- uses: pnpm/action-setup@v4
122+
with:
123+
package_json_file: website/package.json
124+
121125
- uses: actions/setup-node@v4
122126
with:
123127
node-version: 20
124-
cache: npm
125-
cache-dependency-path: website/package-lock.json
128+
cache: pnpm
129+
cache-dependency-path: website/pnpm-lock.yaml
126130

127131
- name: Install dependencies
128132
working-directory: website
129-
run: npm ci
133+
run: pnpm install --frozen-lockfile
130134

131135
- name: Build docs
132136
working-directory: website
133-
run: npm run build
137+
run: pnpm run build

FAQ.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,6 @@ See [Where harness-kit fits](https://harnesskit.ai/docs/concepts/comparison) for
7979

8080
## What is the Harness Protocol?
8181

82-
The [Harness Protocol](https://harnessprotocol.ai) is an open specification for portable AI coding harness configuration. It defines a vendor-neutral `harness.yaml` format validated by JSON Schema. harness-kit is the reference implementation, the same way Claude Desktop implements MCP. Any tool that correctly validates and applies `harness.yaml` per the spec is a conformant implementation; harness-kit is not required.
82+
The [Harness Protocol](https://harnessprotocol.io) is an open specification for portable AI coding harness configuration. It defines a vendor-neutral `harness.yaml` format validated by JSON Schema. harness-kit is the reference implementation, the same way Claude Desktop implements MCP. Any tool that correctly validates and applies `harness.yaml` per the spec is a conformant implementation; harness-kit is not required.
8383

8484
The spec is Apache 2.0. See [Harness Protocol](https://harnesskit.ai/docs/concepts/harness-protocol) for how it relates to harness-kit.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ Capture your installed plugins into a `harness.yaml` file, commit it to your dot
9292

9393
The import wizard shows each plugin with its description and lets you pick a subset — your config is a starting point, not a mandate.
9494

95-
`harness.yaml` follows the [Harness Protocol v1](https://harnessprotocol.ai) open spec — a vendor-neutral format for portable AI coding harnesses that can declare plugins, MCP servers, environment variables, and instructions in one shareable file.
95+
`harness.yaml` follows the [Harness Protocol v1](https://harnessprotocol.io) open spec — a vendor-neutral format for portable AI coding harnesses that can declare plugins, MCP servers, environment variables, and instructions in one shareable file.
9696

9797
**Shell fallback (no Claude Code required):**
9898

plugins/harness-share/skills/harness-export/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ disable-model-invocation: true
88

99
You are helping the user capture their current harness-kit setup into a `harness.yaml` file they can share with teammates or commit to their dotfiles repo.
1010

11-
This file follows the **Harness Protocol v1 format** — the open spec at harnessprotocol.ai. It is backward-compatible with harness-import (which handles both old and new formats).
11+
This file follows the **Harness Protocol v1 format** — the open spec at harnessprotocol.io. It is backward-compatible with harness-import (which handles both old and new formats).
1212

1313
## Workflow Order (MANDATORY)
1414

@@ -72,7 +72,7 @@ For any installed skill **not in this table**, ask the user:
7272
Write `harness.yaml` to the current directory (or a path the user specifies). Use the **Harness Protocol v1 format**:
7373

7474
```yaml
75-
$schema: https://harnessprotocol.ai/schema/v1/harness.schema.json
75+
$schema: https://harnessprotocol.io/schema/v1/harness.schema.json
7676
version: "1"
7777

7878
# Profile identity (optional but recommended)

website/.gitignore

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
node_modules/
2-
build/
3-
.docusaurus/
4-
.cache-loader/
2+
.next/
3+
.source/
4+
out/
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { source } from '@/lib/source';
2+
import {
3+
DocsPage,
4+
DocsBody,
5+
DocsDescription,
6+
DocsTitle,
7+
} from 'fumadocs-ui/page';
8+
import { notFound } from 'next/navigation';
9+
import defaultMdxComponents from 'fumadocs-ui/mdx';
10+
11+
export default async function Page(props: {
12+
params: Promise<{ slug?: string[] }>;
13+
}) {
14+
const params = await props.params;
15+
const page = source.getPage(params.slug);
16+
if (!page) notFound();
17+
18+
const MDX = page.data.body;
19+
20+
return (
21+
<DocsPage toc={page.data.toc}>
22+
<DocsTitle>{page.data.title}</DocsTitle>
23+
<DocsDescription>{page.data.description}</DocsDescription>
24+
<DocsBody>
25+
<MDX components={{ ...defaultMdxComponents }} />
26+
</DocsBody>
27+
</DocsPage>
28+
);
29+
}
30+
31+
export function generateStaticParams() {
32+
return source.generateParams();
33+
}
34+
35+
export async function generateMetadata(props: {
36+
params: Promise<{ slug?: string[] }>;
37+
}) {
38+
const params = await props.params;
39+
const page = source.getPage(params.slug);
40+
if (!page) notFound();
41+
42+
return {
43+
title: page.data.title,
44+
description: page.data.description,
45+
};
46+
}

website/app/docs/layout.tsx

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { DocsLayout } from 'fumadocs-ui/layouts/docs';
2+
import type { ReactNode } from 'react';
3+
import { source } from '@/lib/source';
4+
5+
export default function Layout({ children }: { children: ReactNode }) {
6+
return (
7+
<DocsLayout
8+
tree={source.pageTree}
9+
nav={{
10+
title: (
11+
<span className="flex items-center gap-2 font-bold">
12+
<svg
13+
xmlns="http://www.w3.org/2000/svg"
14+
viewBox="0 0 32 32"
15+
className="size-6"
16+
>
17+
<rect width="32" height="32" rx="6" fill="#0d0d12" />
18+
<text
19+
x="16"
20+
y="22"
21+
textAnchor="middle"
22+
fontFamily="system-ui, sans-serif"
23+
fontWeight="700"
24+
fontSize="16"
25+
fill="#8b7aff"
26+
>
27+
hk
28+
</text>
29+
</svg>
30+
Harness Kit
31+
</span>
32+
),
33+
}}
34+
links={[
35+
{
36+
type: 'icon',
37+
text: 'GitHub',
38+
label: 'GitHub',
39+
icon: (
40+
<svg
41+
xmlns="http://www.w3.org/2000/svg"
42+
viewBox="0 0 24 24"
43+
fill="currentColor"
44+
className="size-5"
45+
>
46+
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" />
47+
</svg>
48+
),
49+
url: 'https://github.com/harnessprotocol/harness-kit',
50+
external: true,
51+
},
52+
]}
53+
>
54+
{children}
55+
</DocsLayout>
56+
);
57+
}

website/app/global.css

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
@import 'tailwindcss';
2+
@import 'fumadocs-ui/style.css';
3+
4+
:root {
5+
--color-fd-primary: 256 80% 58%;
6+
--color-fd-primary-foreground: 0 0% 100%;
7+
--color-fd-background: 0 0% 100%;
8+
--color-fd-foreground: 240 10% 10%;
9+
--color-fd-card: 240 5% 96%;
10+
--color-fd-card-foreground: 240 10% 10%;
11+
--color-fd-muted: 240 5% 92%;
12+
--color-fd-muted-foreground: 240 4% 46%;
13+
--color-fd-border: 240 6% 90%;
14+
--color-fd-accent: 256 60% 95%;
15+
--color-fd-accent-foreground: 256 80% 44%;
16+
--color-fd-popover: 0 0% 100%;
17+
--color-fd-popover-foreground: 240 10% 10%;
18+
--color-fd-secondary: 240 5% 94%;
19+
--color-fd-secondary-foreground: 240 10% 10%;
20+
--color-fd-ring: 256 80% 58%;
21+
}
22+
23+
.dark {
24+
--color-fd-primary: 256 80% 72%;
25+
--color-fd-primary-foreground: 0 0% 100%;
26+
--color-fd-background: 240 10% 4%;
27+
--color-fd-foreground: 0 0% 93%;
28+
--color-fd-card: 240 6% 8%;
29+
--color-fd-card-foreground: 0 0% 93%;
30+
--color-fd-muted: 240 4% 14%;
31+
--color-fd-muted-foreground: 240 4% 58%;
32+
--color-fd-border: 240 4% 16%;
33+
--color-fd-accent: 256 30% 14%;
34+
--color-fd-accent-foreground: 256 60% 80%;
35+
--color-fd-popover: 240 6% 6%;
36+
--color-fd-popover-foreground: 0 0% 93%;
37+
--color-fd-secondary: 240 4% 12%;
38+
--color-fd-secondary-foreground: 0 0% 93%;
39+
--color-fd-ring: 256 80% 72%;
40+
}

website/app/icon.svg

Lines changed: 4 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)