create-sailor 1.10.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -135
- package/dist/index.js +119 -2002
- package/package.json +16 -17
- package/templates/infra/ops/README.md +2 -1
- package/templates/infra/ops/platform-expected.example.json +10 -1
- package/templates/backends/python/README.md +0 -16
- package/templates/backends/python/_shared/__init__.py +0 -5
- package/templates/backends/python/pyproject.toml +0 -13
- package/templates/deploy/railway.toml +0 -13
- package/templates/deploy/vercel.json +0 -37
- package/templates/deploy/wrangler.gateway.toml +0 -11
- package/templates/deploy/wrangler.toml +0 -8
- package/templates/docs/docusaurus/README.md +0 -24
- package/templates/docs/docusaurus/docs/getting-started/develop.md +0 -20
- package/templates/docs/docusaurus/docs/getting-started/install.md +0 -11
- package/templates/docs/docusaurus/docs/intro.md +0 -15
- package/templates/docs/docusaurus/docusaurus.config.ts +0 -66
- package/templates/docs/docusaurus/package.json +0 -44
- package/templates/docs/docusaurus/sidebars.ts +0 -14
- package/templates/docs/docusaurus/src/css/custom.css +0 -22
- package/templates/docs/docusaurus/tsconfig.json +0 -7
- package/templates/docs/fumadocs/README.md +0 -46
- package/templates/docs/fumadocs/app/(home)/page.tsx +0 -22
- package/templates/docs/fumadocs/app/api/search/route.ts +0 -4
- package/templates/docs/fumadocs/app/docs/[[...slug]]/page.tsx +0 -39
- package/templates/docs/fumadocs/app/docs/layout.tsx +0 -11
- package/templates/docs/fumadocs/app/global.css +0 -10
- package/templates/docs/fumadocs/app/layout.tsx +0 -18
- package/templates/docs/fumadocs/content/docs/api.mdx +0 -31
- package/templates/docs/fumadocs/content/docs/concepts.mdx +0 -19
- package/templates/docs/fumadocs/content/docs/getting-started.mdx +0 -56
- package/templates/docs/fumadocs/content/docs/index.mdx +0 -17
- package/templates/docs/fumadocs/content/docs/meta.json +0 -4
- package/templates/docs/fumadocs/lib/source.ts +0 -7
- package/templates/docs/fumadocs/next.config.mjs +0 -20
- package/templates/docs/fumadocs/package.json +0 -33
- package/templates/docs/fumadocs/source.config.ts +0 -17
- package/templates/docs/fumadocs/tsconfig.json +0 -25
- package/templates/docs/mintlify/README.md +0 -25
- package/templates/docs/mintlify/api-reference/introduction.mdx +0 -25
- package/templates/docs/mintlify/introduction.mdx +0 -21
- package/templates/docs/mintlify/mint.json +0 -37
- package/templates/docs/mintlify/package.json +0 -14
- package/templates/docs/mintlify/quickstart.mdx +0 -26
- package/templates/docs/nextra/README.md +0 -35
- package/templates/docs/nextra/app/[[...mdxPath]]/page.tsx +0 -23
- package/templates/docs/nextra/app/layout.tsx +0 -36
- package/templates/docs/nextra/content/_meta.ts +0 -4
- package/templates/docs/nextra/content/getting-started.mdx +0 -35
- package/templates/docs/nextra/content/index.mdx +0 -18
- package/templates/docs/nextra/mdx-components.tsx +0 -10
- package/templates/docs/nextra/next.config.mjs +0 -9
- package/templates/docs/nextra/package.json +0 -25
- package/templates/docs/nextra/tsconfig.json +0 -21
- package/templates/docs/vitepress/.vitepress/config.ts +0 -35
- package/templates/docs/vitepress/README.md +0 -23
- package/templates/docs/vitepress/guide/getting-started.md +0 -26
- package/templates/docs/vitepress/guide/introduction.md +0 -12
- package/templates/docs/vitepress/index.md +0 -23
- package/templates/docs/vitepress/package.json +0 -18
- package/templates/docs/vitepress/tsconfig.json +0 -15
- package/templates/orm/drizzle/README.md +0 -58
- package/templates/orm/drizzle/drizzle.config.ts +0 -16
- package/templates/orm/drizzle/migrations/.gitkeep +0 -0
- package/templates/orm/drizzle/package.json +0 -30
- package/templates/orm/drizzle/src/index.ts +0 -31
- package/templates/orm/drizzle/src/schema/auth.ts +0 -73
- package/templates/orm/drizzle/src/schema/billing.ts +0 -37
- package/templates/orm/drizzle/src/schema/index.ts +0 -3
- package/templates/orm/drizzle/src/schema/tenant.ts +0 -57
- package/templates/orm/drizzle/tsconfig.json +0 -16
- package/templates/workflows/README.md +0 -9
- package/templates/workflows/inngest/README.md +0 -3
- package/templates/workflows/inngest/welcome-email.ts +0 -30
- package/templates/workflows/n8n/README.md +0 -3
- package/templates/workflows/n8n/example-flow.json +0 -6
- package/templates/workflows/pusher/README.md +0 -3
- package/templates/workflows/pusher/events.ts +0 -6
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-sailor",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"nebutra": {
|
|
5
5
|
"status": "foundation",
|
|
6
6
|
"graph": "core",
|
|
7
7
|
"productionReady": false
|
|
8
8
|
},
|
|
9
|
-
"description": "Governed AI-native SaaS scaffolder for Nebutra Sailor.
|
|
9
|
+
"description": "Governed AI-native SaaS scaffolder for Nebutra Sailor. One converged Next.js + Hono + Prisma stack, zero questions — providers go live from env keys.",
|
|
10
10
|
"type": "module",
|
|
11
11
|
"main": "dist/index.js",
|
|
12
12
|
"bin": {
|
|
@@ -19,14 +19,6 @@
|
|
|
19
19
|
"README.md",
|
|
20
20
|
"LICENSE"
|
|
21
21
|
],
|
|
22
|
-
"scripts": {
|
|
23
|
-
"dev": "tsup --watch",
|
|
24
|
-
"build": "tsup",
|
|
25
|
-
"prepublishOnly": "pnpm run build",
|
|
26
|
-
"start": "node dist/index.js",
|
|
27
|
-
"test": "vitest run",
|
|
28
|
-
"test:watch": "vitest"
|
|
29
|
-
},
|
|
30
22
|
"dependencies": {
|
|
31
23
|
"@clack/prompts": "^1.5.0",
|
|
32
24
|
"@mrleebo/prisma-ast": "^0.16.0",
|
|
@@ -38,13 +30,13 @@
|
|
|
38
30
|
"update-notifier": "^7.3.1"
|
|
39
31
|
},
|
|
40
32
|
"devDependencies": {
|
|
41
|
-
"@
|
|
42
|
-
"@nebutra/preset": "workspace:*",
|
|
43
|
-
"@types/node": "catalog:",
|
|
33
|
+
"@types/node": "^25.9.1",
|
|
44
34
|
"@types/update-notifier": "^6.0.8",
|
|
45
|
-
"tsup": "
|
|
46
|
-
"typescript": "
|
|
47
|
-
"vitest": "
|
|
35
|
+
"tsup": "^8.5.1",
|
|
36
|
+
"typescript": "^5.9.3",
|
|
37
|
+
"vitest": "^4.1.4",
|
|
38
|
+
"@nebutra/brand": "2.0.0",
|
|
39
|
+
"@nebutra/preset": "0.1.3"
|
|
48
40
|
},
|
|
49
41
|
"engines": {
|
|
50
42
|
"node": ">=22.0.0"
|
|
@@ -88,5 +80,12 @@
|
|
|
88
80
|
"publishConfig": {
|
|
89
81
|
"access": "public",
|
|
90
82
|
"registry": "https://registry.npmjs.org/"
|
|
83
|
+
},
|
|
84
|
+
"scripts": {
|
|
85
|
+
"dev": "tsup --watch",
|
|
86
|
+
"build": "tsup",
|
|
87
|
+
"start": "node dist/index.js",
|
|
88
|
+
"test": "vitest run",
|
|
89
|
+
"test:watch": "vitest"
|
|
91
90
|
}
|
|
92
|
-
}
|
|
91
|
+
}
|
|
@@ -7,7 +7,8 @@ Operational scripts and runbooks — backup, restore, on-call playbooks, inciden
|
|
|
7
7
|
`platform-expected.example.json` declares the settings that live only in a
|
|
8
8
|
provider dashboard — Vercel build machine and ignore step, Git links, env vars
|
|
9
9
|
that must not be flagged Sensitive, Fly secret names that must exist or must
|
|
10
|
-
not, GitHub repository variables,
|
|
10
|
+
not, GitHub repository variables, the status checks a protected branch requires
|
|
11
|
+
before a merge, Cloudflare Worker bindings. Copy it to
|
|
11
12
|
`platform-expected.json`, replace the names, delete the sections you do not
|
|
12
13
|
use, and run the read-only engine from Nebutra-Sailor against it on a schedule:
|
|
13
14
|
|
|
@@ -32,7 +32,16 @@
|
|
|
32
32
|
"repo": "your-org/{PRODUCT_NAME}",
|
|
33
33
|
"variables": {
|
|
34
34
|
"DEPLOY_TARGET_GATEWAY": "cloudflare-workers"
|
|
35
|
-
}
|
|
35
|
+
},
|
|
36
|
+
"branchProtection": [
|
|
37
|
+
{
|
|
38
|
+
"branch": "main",
|
|
39
|
+
"requiredStatusChecks": ["Lint & Typecheck", "Test"],
|
|
40
|
+
"strict": false,
|
|
41
|
+
"enforceAdmins": false,
|
|
42
|
+
"requiredApprovingReviewCount": null
|
|
43
|
+
}
|
|
44
|
+
]
|
|
36
45
|
},
|
|
37
46
|
"cloudflare": {
|
|
38
47
|
"workers": [
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# backends/python
|
|
2
|
-
|
|
3
|
-
FastAPI-based Python backends. **Use only when justified.**
|
|
4
|
-
|
|
5
|
-
Per the TS-by-Default ADR (`docs/architecture/2026-05-10-ts-by-default-python-only-when-justified.md`), a new Python service is acceptable only when it cites at least one of:
|
|
6
|
-
|
|
7
|
-
1. **Batch / queued work** too long for edge runtimes (>5s typical)
|
|
8
|
-
2. **ML / scientific compute** that depends on the Python ecosystem (transformers, vLLM, etc.)
|
|
9
|
-
3. **Specialized libraries** with no comparable TS port
|
|
10
|
-
|
|
11
|
-
For CRUD, webhooks, billing, content management — use `backends/gateway/` (TS) instead.
|
|
12
|
-
|
|
13
|
-
## Layout
|
|
14
|
-
|
|
15
|
-
- `_shared/` — shared primitives (queue client, db, logger) consumed by services
|
|
16
|
-
- `<service>/` — one folder per active service (must have a real caller)
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
[project]
|
|
2
|
-
name = "{PRODUCT_NAME}-python-backends"
|
|
3
|
-
version = "0.1.0"
|
|
4
|
-
description = "Python backends for {PRODUCT_NAME} — batch / ML / specialized only."
|
|
5
|
-
requires-python = ">=3.11"
|
|
6
|
-
dependencies = [
|
|
7
|
-
"fastapi>=0.115.0",
|
|
8
|
-
"uvicorn[standard]>=0.32.0",
|
|
9
|
-
"pydantic>=2.9.0",
|
|
10
|
-
]
|
|
11
|
-
|
|
12
|
-
[tool.uv.workspace]
|
|
13
|
-
members = ["_shared", "*"]
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
[build]
|
|
2
|
-
builder = "NIXPACKS"
|
|
3
|
-
buildCommand = "pnpm build"
|
|
4
|
-
|
|
5
|
-
[build.nixpacksPlan.phases.setup]
|
|
6
|
-
nixPkgs = ["...", "pnpm-8_x"]
|
|
7
|
-
|
|
8
|
-
[deploy]
|
|
9
|
-
startCommand = "pnpm start"
|
|
10
|
-
healthcheckPath = "/api/health"
|
|
11
|
-
healthcheckTimeout = 100
|
|
12
|
-
restartPolicyType = "ON_FAILURE"
|
|
13
|
-
restartPolicyMaxRetries = 5
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 2,
|
|
3
|
-
"buildCommand": "pnpm build",
|
|
4
|
-
"ignoreCommand": "bash ./scripts/ignore-build-step.sh",
|
|
5
|
-
"framework": "nextjs",
|
|
6
|
-
"crons": [
|
|
7
|
-
{
|
|
8
|
-
"path": "/api/webhooks/cron/daily",
|
|
9
|
-
"schedule": "0 0 * * *"
|
|
10
|
-
}
|
|
11
|
-
],
|
|
12
|
-
"headers": [
|
|
13
|
-
{
|
|
14
|
-
"source": "/(.*)",
|
|
15
|
-
"headers": [
|
|
16
|
-
{
|
|
17
|
-
"key": "X-Content-Type-Options",
|
|
18
|
-
"value": "nosniff"
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"key": "X-Frame-Options",
|
|
22
|
-
"value": "DENY"
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"key": "X-XSS-Protection",
|
|
26
|
-
"value": "1; mode=block"
|
|
27
|
-
}
|
|
28
|
-
]
|
|
29
|
-
}
|
|
30
|
-
],
|
|
31
|
-
"rewrites": [
|
|
32
|
-
{
|
|
33
|
-
"source": "/api/auth/:path*",
|
|
34
|
-
"destination": "/api/auth/:path*"
|
|
35
|
-
}
|
|
36
|
-
]
|
|
37
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# {PRODUCT_NAME} Docs
|
|
2
|
-
|
|
3
|
-
Documentation site for {PRODUCT_NAME}, built with [Docusaurus 3](https://docusaurus.io/).
|
|
4
|
-
|
|
5
|
-
## Develop
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
pnpm install
|
|
9
|
-
pnpm dev # http://localhost:3001
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
## Add a page
|
|
13
|
-
|
|
14
|
-
1. Drop a `.md` or `.mdx` file under `docs/`
|
|
15
|
-
2. Add the path to `sidebars.ts` (or use auto-generated sidebars)
|
|
16
|
-
|
|
17
|
-
## Deploy
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
pnpm build # static output -> build/
|
|
21
|
-
pnpm serve # preview locally
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
The `build/` directory can be hosted on any static host (Vercel, Cloudflare Pages, S3, GitHub Pages).
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
sidebar_position: 2
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Develop
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
pnpm dev # http://localhost:3001
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
The site rebuilds on file change. New pages: drop a `.md` or `.mdx` under `docs/` and add it to `sidebars.ts`.
|
|
12
|
-
|
|
13
|
-
## Build for production
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
pnpm build
|
|
17
|
-
pnpm serve
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
The static output is written to `build/` — host it on any CDN.
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
sidebar_position: 1
|
|
3
|
-
slug: /
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Welcome to {PRODUCT_NAME}
|
|
7
|
-
|
|
8
|
-
This is the documentation site for **{PRODUCT_NAME}**, scaffolded by [create-sailor](https://github.com/Nebutra/Nebutra-Sailor) with [Docusaurus 3](https://docusaurus.io/).
|
|
9
|
-
|
|
10
|
-
## What's next
|
|
11
|
-
|
|
12
|
-
- [Install dependencies](./getting-started/install.md)
|
|
13
|
-
- [Run the dev server](./getting-started/develop.md)
|
|
14
|
-
|
|
15
|
-
Edit `docs/intro.md` to change this page.
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import type * as Preset from "@docusaurus/preset-classic";
|
|
2
|
-
import type { Config } from "@docusaurus/types";
|
|
3
|
-
import { themes as prismThemes } from "prism-react-renderer";
|
|
4
|
-
|
|
5
|
-
const config: Config = {
|
|
6
|
-
title: "{PRODUCT_NAME}",
|
|
7
|
-
tagline: "Documentation for {PRODUCT_NAME}",
|
|
8
|
-
favicon: "img/favicon.ico",
|
|
9
|
-
|
|
10
|
-
url: "https://docs.example.com",
|
|
11
|
-
baseUrl: "/",
|
|
12
|
-
|
|
13
|
-
organizationName: "your-org",
|
|
14
|
-
projectName: "your-repo",
|
|
15
|
-
|
|
16
|
-
onBrokenLinks: "throw",
|
|
17
|
-
onBrokenMarkdownLinks: "warn",
|
|
18
|
-
|
|
19
|
-
i18n: {
|
|
20
|
-
defaultLocale: "en",
|
|
21
|
-
locales: ["en"],
|
|
22
|
-
},
|
|
23
|
-
|
|
24
|
-
presets: [
|
|
25
|
-
[
|
|
26
|
-
"classic",
|
|
27
|
-
{
|
|
28
|
-
docs: {
|
|
29
|
-
sidebarPath: "./sidebars.ts",
|
|
30
|
-
editUrl: "https://github.com/your-org/your-repo/tree/main/docs/",
|
|
31
|
-
routeBasePath: "/",
|
|
32
|
-
},
|
|
33
|
-
blog: false,
|
|
34
|
-
theme: {
|
|
35
|
-
customCss: "./src/css/custom.css",
|
|
36
|
-
},
|
|
37
|
-
} satisfies Preset.Options,
|
|
38
|
-
],
|
|
39
|
-
],
|
|
40
|
-
|
|
41
|
-
themeConfig: {
|
|
42
|
-
image: "img/social-card.png",
|
|
43
|
-
navbar: {
|
|
44
|
-
title: "{PRODUCT_NAME}",
|
|
45
|
-
logo: { alt: "{PRODUCT_NAME}", src: "img/logo.svg" },
|
|
46
|
-
items: [
|
|
47
|
-
{ type: "docSidebar", sidebarId: "tutorialSidebar", position: "left", label: "Docs" },
|
|
48
|
-
{
|
|
49
|
-
href: "https://github.com/your-org/your-repo",
|
|
50
|
-
label: "GitHub",
|
|
51
|
-
position: "right",
|
|
52
|
-
},
|
|
53
|
-
],
|
|
54
|
-
},
|
|
55
|
-
footer: {
|
|
56
|
-
style: "dark",
|
|
57
|
-
copyright: "Copyright © " + new Date().getFullYear() + " {PRODUCT_NAME}.",
|
|
58
|
-
},
|
|
59
|
-
prism: {
|
|
60
|
-
theme: prismThemes.github,
|
|
61
|
-
darkTheme: prismThemes.dracula,
|
|
62
|
-
},
|
|
63
|
-
} satisfies Preset.ThemeConfig,
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
export default config;
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@nebutra/docs",
|
|
3
|
-
"private": true,
|
|
4
|
-
"version": "0.0.1",
|
|
5
|
-
"scripts": {
|
|
6
|
-
"dev": "docusaurus start --port 3001",
|
|
7
|
-
"start": "docusaurus start --port 3001",
|
|
8
|
-
"build": "docusaurus build",
|
|
9
|
-
"serve": "docusaurus serve --port 3001",
|
|
10
|
-
"typecheck": "tsc --noEmit",
|
|
11
|
-
"clear": "docusaurus clear"
|
|
12
|
-
},
|
|
13
|
-
"dependencies": {
|
|
14
|
-
"@docusaurus/core": "^3.7.0",
|
|
15
|
-
"@docusaurus/preset-classic": "^3.7.0",
|
|
16
|
-
"@mdx-js/react": "^3.0.1",
|
|
17
|
-
"clsx": "^2.1.1",
|
|
18
|
-
"prism-react-renderer": "^2.4.1",
|
|
19
|
-
"react": "^19.0.0",
|
|
20
|
-
"react-dom": "^19.0.0"
|
|
21
|
-
},
|
|
22
|
-
"devDependencies": {
|
|
23
|
-
"@docusaurus/module-type-aliases": "^3.7.0",
|
|
24
|
-
"@docusaurus/tsconfig": "^3.7.0",
|
|
25
|
-
"@docusaurus/types": "^3.7.0",
|
|
26
|
-
"typescript": "^5.9.3"
|
|
27
|
-
},
|
|
28
|
-
"browserslist": {
|
|
29
|
-
"production": [
|
|
30
|
-
">0.5%",
|
|
31
|
-
"not dead",
|
|
32
|
-
"not op_mini all"
|
|
33
|
-
],
|
|
34
|
-
"development": [
|
|
35
|
-
"last 3 chrome version",
|
|
36
|
-
"last 3 firefox version",
|
|
37
|
-
"last 5 safari version"
|
|
38
|
-
]
|
|
39
|
-
},
|
|
40
|
-
"engines": {
|
|
41
|
-
"node": ">=20.0.0"
|
|
42
|
-
},
|
|
43
|
-
"license": "MIT"
|
|
44
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { SidebarsConfig } from "@docusaurus/plugin-content-docs";
|
|
2
|
-
|
|
3
|
-
const sidebars: SidebarsConfig = {
|
|
4
|
-
tutorialSidebar: [
|
|
5
|
-
"intro",
|
|
6
|
-
{
|
|
7
|
-
type: "category",
|
|
8
|
-
label: "Getting started",
|
|
9
|
-
items: ["getting-started/install", "getting-started/develop"],
|
|
10
|
-
},
|
|
11
|
-
],
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export default sidebars;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
:root {
|
|
2
|
-
--ifm-color-primary: #0033fe;
|
|
3
|
-
--ifm-color-primary-dark: #002de5;
|
|
4
|
-
--ifm-color-primary-darker: #002bd9;
|
|
5
|
-
--ifm-color-primary-darkest: #0023b3;
|
|
6
|
-
--ifm-color-primary-light: #1f4cff;
|
|
7
|
-
--ifm-color-primary-lighter: #2d57ff;
|
|
8
|
-
--ifm-color-primary-lightest: #5a78ff;
|
|
9
|
-
--ifm-code-font-size: 95%;
|
|
10
|
-
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
[data-theme="dark"] {
|
|
14
|
-
--ifm-color-primary: #4d72ff;
|
|
15
|
-
--ifm-color-primary-dark: #2d57ff;
|
|
16
|
-
--ifm-color-primary-darker: #1f4cff;
|
|
17
|
-
--ifm-color-primary-darkest: #0033fe;
|
|
18
|
-
--ifm-color-primary-light: #6d8aff;
|
|
19
|
-
--ifm-color-primary-lighter: #7d97ff;
|
|
20
|
-
--ifm-color-primary-lightest: #adbfff;
|
|
21
|
-
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
|
|
22
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
# {PRODUCT_NAME} Docs
|
|
2
|
-
|
|
3
|
-
Documentation site for {PRODUCT_NAME}, built with [Fumadocs](https://fumadocs.vercel.app/) + Next.js 16 + Tailwind v4.
|
|
4
|
-
|
|
5
|
-
## Run locally
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
pnpm --filter @nebutra/docs dev
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
Opens on http://localhost:3001.
|
|
12
|
-
|
|
13
|
-
## Edit content
|
|
14
|
-
|
|
15
|
-
MDX source lives in `content/docs/`. Each file becomes a page under `/docs/<slug>`.
|
|
16
|
-
|
|
17
|
-
- Add a new page → create `content/docs/my-page.mdx`
|
|
18
|
-
- Control sidebar order → edit `content/docs/meta.json`
|
|
19
|
-
- Use built-in components (`<Cards>`, `<Card>`, `<Tabs>`, `<Tab>`, `<Callout>`, etc.) directly in MDX — they come from `fumadocs-ui/mdx`.
|
|
20
|
-
|
|
21
|
-
## Customize
|
|
22
|
-
|
|
23
|
-
- **Branding / colors**: wired to `@nebutra/tokens` via `app/global.css`. Edit tokens centrally, not here.
|
|
24
|
-
- **Sidebar / nav**: `app/docs/layout.tsx` — `DocsLayout` props.
|
|
25
|
-
- **Search**: `app/api/search/route.ts` auto-indexes all MDX via `createFromSource`.
|
|
26
|
-
- **MDX plugins**: `source.config.ts` → `mdxOptions`.
|
|
27
|
-
|
|
28
|
-
Full Fumadocs reference: https://fumadocs.vercel.app/docs.
|
|
29
|
-
|
|
30
|
-
## 2026 docs best practices
|
|
31
|
-
|
|
32
|
-
This template follows Nebutra docs best-practices, encoded as MDX comments inline in each starter page:
|
|
33
|
-
|
|
34
|
-
- **Home** — hero + 3-6 cards, no marketing fluff
|
|
35
|
-
- **Getting Started** — single goal: 5-minute first example (Install → Initialize → Hello World → Next steps)
|
|
36
|
-
- **Concepts** — explains the "why" / mental model, not steps, not APIs
|
|
37
|
-
- **API Reference** — auto-generated from OpenAPI; every endpoint has method badge + params + schema + multi-language examples
|
|
38
|
-
|
|
39
|
-
When refreshing the API reference inputs:
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
pnpm --filter @nebutra/gateway generate:spec
|
|
43
|
-
pnpm generate:api-types
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
Then replace `content/docs/api.mdx` with generated reference content sourced from `backends/gateway/openapi.json`.
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import Link from "next/link";
|
|
2
|
-
|
|
3
|
-
export const dynamic = "force-static";
|
|
4
|
-
|
|
5
|
-
export default function HomePage() {
|
|
6
|
-
return (
|
|
7
|
-
<main className="flex flex-1 flex-col items-center justify-center gap-6 px-4 py-24 text-center">
|
|
8
|
-
<h1 className="text-4xl font-bold tracking-tight sm:text-5xl">
|
|
9
|
-
{"{PRODUCT_NAME}"} Documentation
|
|
10
|
-
</h1>
|
|
11
|
-
<p className="max-w-xl text-lg text-fd-muted-foreground">
|
|
12
|
-
Build AI-native SaaS products faster. Everything you need to ship is documented here.
|
|
13
|
-
</p>
|
|
14
|
-
<Link
|
|
15
|
-
href="/docs"
|
|
16
|
-
className="rounded-md bg-fd-primary px-6 py-3 font-semibold text-fd-primary-foreground transition-opacity hover:opacity-90"
|
|
17
|
-
>
|
|
18
|
-
Read the docs
|
|
19
|
-
</Link>
|
|
20
|
-
</main>
|
|
21
|
-
);
|
|
22
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import defaultMdxComponents from "fumadocs-ui/mdx";
|
|
2
|
-
import { DocsBody, DocsDescription, DocsPage, DocsTitle } from "fumadocs-ui/page";
|
|
3
|
-
import { notFound } from "next/navigation";
|
|
4
|
-
import { source } from "@/lib/source";
|
|
5
|
-
|
|
6
|
-
export const dynamic = "force-static";
|
|
7
|
-
|
|
8
|
-
export default async function Page(props: { params: Promise<{ slug?: string[] }> }) {
|
|
9
|
-
const params = await props.params;
|
|
10
|
-
const page = source.getPage(params.slug);
|
|
11
|
-
if (!page) notFound();
|
|
12
|
-
|
|
13
|
-
const MDX = page.data.body;
|
|
14
|
-
|
|
15
|
-
return (
|
|
16
|
-
<DocsPage toc={page.data.toc} full={page.data.full}>
|
|
17
|
-
<DocsTitle>{page.data.title}</DocsTitle>
|
|
18
|
-
<DocsDescription>{page.data.description}</DocsDescription>
|
|
19
|
-
<DocsBody>
|
|
20
|
-
<MDX components={{ ...defaultMdxComponents }} />
|
|
21
|
-
</DocsBody>
|
|
22
|
-
</DocsPage>
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function generateStaticParams() {
|
|
27
|
-
return source.generateParams();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export async function generateMetadata(props: { params: Promise<{ slug?: string[] }> }) {
|
|
31
|
-
const params = await props.params;
|
|
32
|
-
const page = source.getPage(params.slug);
|
|
33
|
-
if (!page) notFound();
|
|
34
|
-
|
|
35
|
-
return {
|
|
36
|
-
title: page.data.title,
|
|
37
|
-
description: page.data.description,
|
|
38
|
-
};
|
|
39
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
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 tree={source.pageTree} nav={{ title: "{PRODUCT_NAME}" }}>
|
|
8
|
-
{children}
|
|
9
|
-
</DocsLayout>
|
|
10
|
-
);
|
|
11
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
@import "tailwindcss";
|
|
2
|
-
@import "fumadocs-ui/css/neutral.css";
|
|
3
|
-
@import "fumadocs-ui/css/preset.css";
|
|
4
|
-
|
|
5
|
-
/* Pull in Nebutra design tokens (brand colors, semantic scales, gradients). */
|
|
6
|
-
@import "@nebutra/tokens/styles.css";
|
|
7
|
-
|
|
8
|
-
/* Package-owned Tailwind source scan for @nebutra/ui CVA classes. */
|
|
9
|
-
@import "@nebutra/ui/styles/sources.css";
|
|
10
|
-
@source "../node_modules/fumadocs-ui/dist/**/*.js";
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { RootProvider } from "fumadocs-ui/provider";
|
|
2
|
-
import type { ReactNode } from "react";
|
|
3
|
-
import "./global.css";
|
|
4
|
-
|
|
5
|
-
export const metadata = {
|
|
6
|
-
title: "{PRODUCT_NAME} Docs",
|
|
7
|
-
description: "Documentation for {PRODUCT_NAME}",
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export default function RootLayout({ children }: { children: ReactNode }) {
|
|
11
|
-
return (
|
|
12
|
-
<html lang="en" suppressHydrationWarning>
|
|
13
|
-
<body className="flex min-h-screen flex-col">
|
|
14
|
-
<RootProvider>{children}</RootProvider>
|
|
15
|
-
</body>
|
|
16
|
-
</html>
|
|
17
|
-
);
|
|
18
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: API Reference
|
|
3
|
-
description: Complete API documentation
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
{/* 2026 BEST PRACTICE: API Reference should be auto-generated from OpenAPI spec */}
|
|
7
|
-
{/* 2026 BEST PRACTICE: Every endpoint needs: Method badge, params table, response schema, multi-language examples */}
|
|
8
|
-
{/* TODO: Export backends/gateway/openapi.json and replace this starter page with generated reference content. */}
|
|
9
|
-
|
|
10
|
-
# API Reference
|
|
11
|
-
|
|
12
|
-
API documentation is easiest to maintain when it is generated from your OpenAPI spec.
|
|
13
|
-
|
|
14
|
-
To refresh the source spec and the shared TypeScript types in `apps/web`:
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
pnpm --filter @nebutra/gateway generate:spec
|
|
18
|
-
pnpm generate:api-types
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Endpoints
|
|
22
|
-
|
|
23
|
-
### GET /hello
|
|
24
|
-
|
|
25
|
-
Returns a hello message.
|
|
26
|
-
|
|
27
|
-
**Response**:
|
|
28
|
-
|
|
29
|
-
```json
|
|
30
|
-
{ "message": "Hello, world!" }
|
|
31
|
-
```
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Concepts
|
|
3
|
-
description: Core mental models and design decisions
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
{/* 2026 BEST PRACTICE: Concepts explains the "why" and mental model */}
|
|
7
|
-
{/* 2026 BEST PRACTICE: Don't explain steps — that's Guides. Don't list APIs — that's API Reference */}
|
|
8
|
-
|
|
9
|
-
# Concepts
|
|
10
|
-
|
|
11
|
-
Understand the core models and design decisions.
|
|
12
|
-
|
|
13
|
-
## Workspaces
|
|
14
|
-
|
|
15
|
-
A workspace is...
|
|
16
|
-
|
|
17
|
-
## Authentication
|
|
18
|
-
|
|
19
|
-
...
|