Skip to content

Commit 9cc11de

Browse files
committed
feat(website): add static project site
Create a dependency-free static website package with responsive landing page, validation and build scripts, GitHub Pages workflow, and professional project documentation.
0 parents  commit 9cc11de

11 files changed

Lines changed: 838 additions & 0 deletions

File tree

.github/workflows/pages.yml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
name: Publish Website
2+
3+
on:
4+
push:
5+
branches: [main]
6+
workflow_dispatch:
7+
8+
permissions:
9+
contents: read
10+
pages: write
11+
id-token: write
12+
13+
concurrency:
14+
group: pages
15+
cancel-in-progress: true
16+
17+
jobs:
18+
build:
19+
runs-on: ubuntu-latest
20+
steps:
21+
- uses: actions/checkout@v4
22+
- uses: actions/setup-node@v4
23+
with:
24+
node-version: 22
25+
- run: npm test
26+
- run: npm run build
27+
- uses: actions/upload-pages-artifact@v3
28+
with:
29+
path: dist
30+
31+
deploy:
32+
needs: build
33+
runs-on: ubuntu-latest
34+
environment:
35+
name: github-pages
36+
url: ${{ steps.deployment.outputs.page_url }}
37+
steps:
38+
- id: deployment
39+
uses: actions/deploy-pages@v4

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
dist/
2+
node_modules/
3+
.DS_Store

LICENSE

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
Apache License
2+
Version 2.0, January 2004
3+
http://www.apache.org/licenses/
4+
5+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6+
7+
Copyright 2026 AgentDispatch contributors.
8+
9+
Licensed under the Apache License, Version 2.0 (the "License");
10+
you may not use this file except in compliance with the License.
11+
You may obtain a copy of the License at
12+
13+
http://www.apache.org/licenses/LICENSE-2.0
14+
15+
Unless required by applicable law or agreed to in writing, software
16+
distributed under the License is distributed on an "AS IS" BASIS,
17+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
See the License for the specific language governing permissions and
19+
limitations under the License.

README.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# AgentDispatch Website
2+
3+
Static website package for AgentDispatch.
4+
5+
AgentDispatch lets local lead agents spawn cloud subagents through a provider-neutral MCP control plane. This package contains the public landing page that explains the product, architecture, packages, and first AWS AgentCore runtime path.
6+
7+
## Commands
8+
9+
```bash
10+
npm run dev
11+
npm test
12+
npm run build
13+
```
14+
15+
## Structure
16+
17+
- `src/index.html` — single-page marketing site.
18+
- `src/styles.css` — responsive visual system, no external assets.
19+
- `src/main.js` — progressive enhancements only.
20+
- `scripts/validate.mjs` — static checks for local links, copy placeholders, and required sections.
21+
- `scripts/build.mjs` — copies `src` into `dist` for GitHub Pages or any static host.
22+
23+
## Deploy
24+
25+
The included GitHub Pages workflow builds `dist` and publishes it as a static artifact. No framework runtime or server is required.
26+
27+
## Design constraints
28+
29+
- No checked-in brand asset folder.
30+
- No generated images.
31+
- No runtime dependencies.
32+
- Fast, readable, and easy to fork into a richer docs site later.

package-lock.json

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"name": "@agent-dispatch/website",
3+
"version": "0.1.0",
4+
"description": "Static marketing website for AgentDispatch.",
5+
"private": true,
6+
"type": "module",
7+
"license": "Apache-2.0",
8+
"scripts": {
9+
"build": "node scripts/build.mjs",
10+
"test": "node scripts/validate.mjs",
11+
"dev": "python3 -m http.server 4173 --directory src"
12+
},
13+
"repository": {
14+
"type": "git",
15+
"url": "git+https://github.com/agent-dispatch/website.git"
16+
},
17+
"bugs": {
18+
"url": "https://github.com/agent-dispatch/website/issues"
19+
},
20+
"homepage": "https://agent-dispatch.github.io/website"
21+
}

scripts/build.mjs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { cp, mkdir, rm } from "node:fs/promises";
2+
import { dirname, resolve } from "node:path";
3+
import { fileURLToPath } from "node:url";
4+
5+
const root = dirname(fileURLToPath(import.meta.url));
6+
const repoRoot = resolve(root, "..");
7+
const srcDir = resolve(repoRoot, "src");
8+
const distDir = resolve(repoRoot, "dist");
9+
10+
await rm(distDir, { recursive: true, force: true });
11+
await mkdir(distDir, { recursive: true });
12+
await cp(srcDir, distDir, { recursive: true });
13+
14+
console.log(`Built AgentDispatch website into ${distDir}`);

scripts/validate.mjs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { readFile, readdir, stat } from "node:fs/promises";
2+
import { existsSync } from "node:fs";
3+
import { dirname, resolve } from "node:path";
4+
import { fileURLToPath } from "node:url";
5+
6+
const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
7+
const srcDir = resolve(repoRoot, "src");
8+
const indexPath = resolve(srcDir, "index.html");
9+
const requiredSections = [
10+
"hero",
11+
"how-it-works",
12+
"packages",
13+
"agentcore",
14+
"quickstart",
15+
"roadmap"
16+
];
17+
18+
const index = await readFile(indexPath, "utf8");
19+
for (const section of requiredSections) {
20+
if (!index.includes(`id="${section}"`)) {
21+
throw new Error(`Missing required section #${section}`);
22+
}
23+
}
24+
25+
for (const placeholder of ["TODO", "lorem", "ipsum", "undefined"]) {
26+
if (index.toLowerCase().includes(placeholder.toLowerCase())) {
27+
throw new Error(`Found placeholder text: ${placeholder}`);
28+
}
29+
}
30+
31+
for (const match of index.matchAll(/(?:href|src)="([^"]+)"/g)) {
32+
const target = match[1];
33+
if (target.startsWith("http") || target.startsWith("#") || target.startsWith("mailto:")) continue;
34+
const localPath = resolve(dirname(indexPath), target);
35+
if (!existsSync(localPath)) {
36+
throw new Error(`Broken local asset reference: ${target}`);
37+
}
38+
}
39+
40+
const css = await readFile(resolve(srcDir, "styles.css"), "utf8");
41+
if (!css.includes("@media") || !css.includes(":root")) {
42+
throw new Error("CSS must include responsive rules and root design tokens.");
43+
}
44+
45+
const files = [];
46+
async function walk(dir) {
47+
for (const entry of await readdir(dir)) {
48+
const path = resolve(dir, entry);
49+
const metadata = await stat(path);
50+
if (metadata.isDirectory()) await walk(path);
51+
else files.push(path);
52+
}
53+
}
54+
await walk(srcDir);
55+
56+
console.log(`Validated AgentDispatch website (${files.length} source files).`);

0 commit comments

Comments
 (0)