@shipsite.dev/cli 0.2.14 → 0.2.16

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.
@@ -0,0 +1,3 @@
1
+ import type { GeneratorContext } from '../types.js';
2
+ export declare function generateAiConfig(ctx: GeneratorContext): void;
3
+ //# sourceMappingURL=ai-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-config.d.ts","sourceRoot":"","sources":["../../../src/workspace/generators/ai-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAkNpD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAe5D"}
@@ -0,0 +1,198 @@
1
+ import { join, dirname } from 'path';
2
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
3
+ const BEGIN_MARKER = '<!-- BEGIN SHIPSITE AUTO-GENERATED - DO NOT EDIT THIS SECTION -->';
4
+ const END_MARKER = '<!-- END SHIPSITE AUTO-GENERATED -->';
5
+ function resolveComponentsJson(rootDir) {
6
+ let searchDir = rootDir;
7
+ for (let i = 0; i < 10; i++) {
8
+ const candidate = join(searchDir, 'node_modules', '@shipsite.dev', 'components', 'components.json');
9
+ if (existsSync(candidate)) {
10
+ return JSON.parse(readFileSync(candidate, 'utf-8'));
11
+ }
12
+ const parent = dirname(searchDir);
13
+ if (parent === searchDir)
14
+ break;
15
+ searchDir = parent;
16
+ }
17
+ return null;
18
+ }
19
+ function formatComponentCatalog(components) {
20
+ const grouped = {};
21
+ for (const c of components) {
22
+ const cat = c.category.charAt(0).toUpperCase() + c.category.slice(1);
23
+ (grouped[cat] ??= []).push(c);
24
+ }
25
+ const lines = [];
26
+ for (const [category, comps] of Object.entries(grouped)) {
27
+ lines.push(`### ${category}`);
28
+ for (const c of comps) {
29
+ lines.push(`- **${c.name}** — ${c.description}`);
30
+ }
31
+ lines.push('');
32
+ }
33
+ return lines.join('\n');
34
+ }
35
+ function buildSharedContent(ctx, components) {
36
+ const config = ctx.config;
37
+ const siteName = config.name || 'ShipSite Project';
38
+ const locales = config.i18n?.locales || ['en'];
39
+ const defaultLocale = config.i18n?.defaultLocale || 'en';
40
+ const componentCatalog = components ? formatComponentCatalog(components.components) : '_Components not found — run `npm install` first._';
41
+ return `# ${siteName} — ShipSite Project
42
+
43
+ ## Tech Stack
44
+
45
+ - **Framework:** Next.js (App Router)
46
+ - **Content:** MDX files in \`content/\` — processed by content-collections
47
+ - **Styling:** Tailwind CSS v4 + shadcn/ui design tokens
48
+ - **i18n:** next-intl (locales: ${locales.join(', ')} — default: ${defaultLocale})
49
+ - **Components:** \`@shipsite.dev/components\` — pre-built marketing, blog & legal components
50
+
51
+ ## Project Structure
52
+
53
+ \`\`\`
54
+ shipsite.json # Site configuration (pages, nav, footer, colors, i18n)
55
+ # Navigation & footer labels accept string | { locale: "text" } for i18n
56
+ content/ # MDX content files, one folder per page
57
+ {page-name}/
58
+ {locale}.mdx # Content file per locale
59
+ components/ # Custom components (auto-available in MDX)
60
+ public/ # Static assets (images, fonts, favicons)
61
+ .shipsite/ # Generated workspace (do NOT edit)
62
+ \`\`\`
63
+
64
+ ## Content Conventions
65
+
66
+ - Each page is an MDX file at \`content/{page-name}/{locale}.mdx\`
67
+ - Markdown is automatically styled — no need to import prose wrappers
68
+ - ShipSite components are globally available in MDX — no imports needed
69
+ - Images go in \`public/images/\` and are referenced as \`/images/filename.ext\`
70
+ - Custom components in \`components/\` are also auto-available in MDX
71
+
72
+ ## Frontmatter by Page Type
73
+
74
+ ### Landing / Page (\`type: "landing"\` or \`type: "page"\`)
75
+ \`\`\`yaml
76
+ ---
77
+ title: "Page Title — Site Name"
78
+ description: "Meta description for SEO."
79
+ ---
80
+ \`\`\`
81
+ Then use marketing components directly:
82
+ \`\`\`mdx
83
+ <Hero title="..." description="..." primaryCta={{ label: "...", href: "..." }} />
84
+ <Features title="...">
85
+ <Feature title="..." description="..." />
86
+ </Features>
87
+ \`\`\`
88
+
89
+ ### Blog Article (\`type: "blog-article"\`)
90
+ \`\`\`yaml
91
+ ---
92
+ title: "Article Title"
93
+ description: "Meta description."
94
+ excerpt: "Short preview text for blog index cards."
95
+ date: "YYYY-MM-DD"
96
+ readingTime: 3
97
+ author: default
98
+ ---
99
+ \`\`\`
100
+ Wrap content in \`<BlogArticle>\`:
101
+ \`\`\`mdx
102
+ <BlogArticle>
103
+
104
+ ## Section Heading
105
+
106
+ Paragraph content with **bold** and [links](/path).
107
+
108
+ </BlogArticle>
109
+ \`\`\`
110
+
111
+ ### Blog Index (\`type: "blog-index"\`)
112
+ \`\`\`yaml
113
+ ---
114
+ title: "Blog — Site Name"
115
+ description: "Meta description."
116
+ ---
117
+ \`\`\`
118
+ \`\`\`mdx
119
+ <BlogIndex title="Blog" description="Latest posts." />
120
+ \`\`\`
121
+
122
+ ### Legal / Content (\`type: "legal"\`)
123
+ \`\`\`yaml
124
+ ---
125
+ title: "Privacy Policy"
126
+ description: "How we handle your data."
127
+ ---
128
+ \`\`\`
129
+ \`\`\`mdx
130
+ <ContentPage title="Privacy Policy" lastUpdated="YYYY-MM-DD">
131
+ <ContentSection title="1. Section">Content here.</ContentSection>
132
+ </ContentPage>
133
+ \`\`\`
134
+
135
+ ## Available Components
136
+
137
+ ${componentCatalog}
138
+
139
+ ## Key Rules
140
+
141
+ 1. **Never edit files inside \`.shipsite/\`** — they are auto-generated and will be overwritten.
142
+ 2. **Don't import ShipSite components** — they are globally registered in MDX.
143
+ 3. **Page structure is defined in \`shipsite.json\`** — to add a page, add an entry to the \`pages\` array and create the content folder.
144
+ 4. **One MDX file per locale per page** — e.g. \`content/landing/en.mdx\`, \`content/landing/de.mdx\`.
145
+ 5. **Use the component catalog above** to pick the right component for each section.
146
+ `;
147
+ }
148
+ function writeWithPreservedContent(filePath, autoContent) {
149
+ let userContent = '';
150
+ if (existsSync(filePath)) {
151
+ const existing = readFileSync(filePath, 'utf-8');
152
+ const endIdx = existing.indexOf(END_MARKER);
153
+ if (endIdx !== -1) {
154
+ userContent = existing.slice(endIdx + END_MARKER.length);
155
+ }
156
+ }
157
+ const dir = dirname(filePath);
158
+ if (!existsSync(dir)) {
159
+ mkdirSync(dir, { recursive: true });
160
+ }
161
+ const output = `${BEGIN_MARKER}\n${autoContent}\n${END_MARKER}${userContent || '\n'}`;
162
+ writeFileSync(filePath, output);
163
+ }
164
+ function writeCursorRules(filePath, content) {
165
+ let userContent = '';
166
+ if (existsSync(filePath)) {
167
+ const existing = readFileSync(filePath, 'utf-8');
168
+ const endIdx = existing.indexOf(END_MARKER);
169
+ if (endIdx !== -1) {
170
+ userContent = existing.slice(endIdx + END_MARKER.length);
171
+ }
172
+ }
173
+ const dir = dirname(filePath);
174
+ if (!existsSync(dir)) {
175
+ mkdirSync(dir, { recursive: true });
176
+ }
177
+ const frontmatter = `---
178
+ description: ShipSite project conventions, components, and content structure
179
+ globs: "**/*.mdx,**/*.tsx,shipsite.json"
180
+ alwaysApply: true
181
+ ---
182
+ `;
183
+ const output = `${frontmatter}${BEGIN_MARKER}\n${content}\n${END_MARKER}${userContent || '\n'}`;
184
+ writeFileSync(filePath, output);
185
+ }
186
+ export function generateAiConfig(ctx) {
187
+ const components = resolveComponentsJson(ctx.rootDir);
188
+ const content = buildSharedContent(ctx, components);
189
+ // Claude Code
190
+ writeWithPreservedContent(join(ctx.rootDir, 'CLAUDE.md'), content);
191
+ // Cursor
192
+ writeCursorRules(join(ctx.rootDir, '.cursor', 'rules', 'shipsite.mdc'), content);
193
+ // GitHub Copilot
194
+ writeWithPreservedContent(join(ctx.rootDir, '.github', 'copilot-instructions.md'), content);
195
+ // Windsurf
196
+ writeWithPreservedContent(join(ctx.rootDir, '.windsurf', 'rules', 'shipsite.md'), content);
197
+ }
198
+ //# sourceMappingURL=ai-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-config.js","sourceRoot":"","sources":["../../../src/workspace/generators/ai-config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/workspace/generators/layout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CA0F1D"}
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/workspace/generators/layout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAoH1D"}
@@ -18,7 +18,7 @@ import { routing } from '../../i18n/routing';
18
18
  import { ShipSiteProvider } from '@shipsite.dev/components/context';
19
19
  import { ThemeProvider } from '@shipsite.dev/components/theme';
20
20
  import { Header, Footer } from '@shipsite.dev/components';
21
- import { generateNavLinks, generateAlternatePathMap, getConfig, getSiteUrl } from '@shipsite.dev/core';
21
+ import { generateNavLinks, generateAlternatePathMap, getConfig, getSiteUrl, getLocalizedField } from '@shipsite.dev/core';
22
22
  import '../../styles/globals.css';
23
23
  import type { Metadata, Viewport } from 'next';
24
24
 
@@ -50,6 +50,25 @@ export default async function LocaleLayout({ children, params }: LayoutProps) {
50
50
  const navLinks = generateNavLinks(locale);
51
51
  const alternatePathMap = generateAlternatePathMap();
52
52
 
53
+ const t = (v: string | Record<string, string>) =>
54
+ typeof v === 'string' ? v : (v[locale] || v.en || '');
55
+
56
+ const rawNav = config.navigation || { items: [] };
57
+ const navigation = {
58
+ items: rawNav.items.map((i: any) => ({ label: t(i.label), href: i.href })),
59
+ cta: rawNav.cta ? { label: t(rawNav.cta.label), href: rawNav.cta.href } : undefined,
60
+ };
61
+
62
+ const rawFooter = config.footer || {};
63
+ const footer = {
64
+ columns: rawFooter.columns?.map((c: any) => ({
65
+ title: t(c.title),
66
+ links: c.links.map((l: any) => ({ label: t(l.label), href: l.href })),
67
+ })),
68
+ social: rawFooter.social,
69
+ copyright: rawFooter.copyright ? t(rawFooter.copyright) : undefined,
70
+ };
71
+
53
72
  return (
54
73
  <html lang={locale} suppressHydrationWarning>
55
74
  <body>
@@ -65,8 +84,8 @@ export default async function LocaleLayout({ children, params }: LayoutProps) {
65
84
  background: config.colors?.background || '#ffffff',
66
85
  text: config.colors?.text || '#1f2a37',
67
86
  },
68
- navigation: config.navigation || { items: [] },
69
- footer: config.footer || {},
87
+ navigation,
88
+ footer,
70
89
  navLinks,
71
90
  alternatePathMap,
72
91
  locale,
@@ -83,7 +102,11 @@ export default async function LocaleLayout({ children, params }: LayoutProps) {
83
102
  );
84
103
  }
85
104
  `);
86
- // Remove any stale root layout not needed, [locale]/layout.tsx is the root
87
- // Next.js treats the deepest layout with <html> as the root layout
105
+ // Root layout prevents Next.js from auto-generating one without lang attribute.
106
+ // Passes children through so [locale]/layout.tsx owns <html lang={locale}>.
107
+ writeFileSync(join(ctx.srcDir, 'app', 'layout.tsx'), `export default function RootLayout({ children }: { children: React.ReactNode }) {
108
+ return children;
109
+ }
110
+ `);
88
111
  }
89
112
  //# sourceMappingURL=layout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/workspace/generators/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAGnC,MAAM,UAAU,cAAc,CAAC,GAAqB;IAClD,mCAAmC;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;IACnC,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,OAAO,EAAE,CAAC;QACZ,UAAU,GAAG;;aAEJ,OAAO;;KAEf,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,6DAA6D;IAC7D,aAAa,CACX,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,CAAC,EACjD;;;;;;;;;;;;;;;;;qEAiBiE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoD9E,CACE,CAAC;IAEF,6EAA6E;IAC7E,mEAAmE;AACrE,CAAC"}
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/workspace/generators/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAGnC,MAAM,UAAU,cAAc,CAAC,GAAqB;IAClD,mCAAmC;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;IACnC,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,OAAO,EAAE,CAAC;QACZ,UAAU,GAAG;;aAEJ,OAAO;;KAEf,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,6DAA6D;IAC7D,aAAa,CACX,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,CAAC,EACjD;;;;;;;;;;;;;;;;;qEAiBiE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuE9E,CACE,CAAC;IAEF,kFAAkF;IAClF,4EAA4E;IAC5E,aAAa,CACX,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,EACrC;;;CAGH,CACE,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAeA,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAA;CAAE,GAAG,IAAI,CAkCrG;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB9F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAgBA,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAA;CAAE,GAAG,IAAI,CAmCrG;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB9F"}
@@ -11,6 +11,7 @@ import { generateLayout } from './generators/layout.js';
11
11
  import { generatePage } from './generators/page.js';
12
12
  import { generateSitemapAndRobots } from './generators/sitemap-robots.js';
13
13
  import { generateProjectFiles } from './generators/project-files.js';
14
+ import { generateAiConfig } from './generators/ai-config.js';
14
15
  export function generateWorkspace({ rootDir, mode }) {
15
16
  const config = JSON.parse(readFileSync(join(rootDir, 'shipsite.json'), 'utf-8'));
16
17
  // Derive i18n config from pages if not explicitly set
@@ -36,6 +37,7 @@ export function generateWorkspace({ rootDir, mode }) {
36
37
  generatePage(ctx);
37
38
  generateSitemapAndRobots(ctx);
38
39
  generateProjectFiles(ctx);
40
+ generateAiConfig(ctx);
39
41
  console.log(' Generated .shipsite workspace');
40
42
  }
41
43
  export async function prepareWorkspace(rootDir, mode) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shipsite.dev/cli",
3
- "version": "0.2.14",
3
+ "version": "0.2.16",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/shipsite/shipsite",