@mozole/cli 2.0.0 → 2.1.1

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.
Files changed (96) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +109 -15
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/add.d.ts +7 -0
  5. package/dist/commands/add.d.ts.map +1 -0
  6. package/dist/commands/add.js +87 -0
  7. package/dist/commands/add.js.map +1 -0
  8. package/dist/commands/adopt.d.ts +2 -0
  9. package/dist/commands/adopt.d.ts.map +1 -1
  10. package/dist/commands/adopt.js +243 -45
  11. package/dist/commands/adopt.js.map +1 -1
  12. package/dist/commands/assets.d.ts +28 -0
  13. package/dist/commands/assets.d.ts.map +1 -0
  14. package/dist/commands/assets.js +176 -0
  15. package/dist/commands/assets.js.map +1 -0
  16. package/dist/commands/backend.d.ts +5 -0
  17. package/dist/commands/backend.d.ts.map +1 -0
  18. package/dist/commands/backend.js +68 -0
  19. package/dist/commands/backend.js.map +1 -0
  20. package/dist/commands/new.d.ts +1 -1
  21. package/dist/commands/new.d.ts.map +1 -1
  22. package/dist/commands/new.js +13 -5
  23. package/dist/commands/new.js.map +1 -1
  24. package/dist/commands/prototype.d.ts.map +1 -1
  25. package/dist/commands/prototype.js +68 -20
  26. package/dist/commands/prototype.js.map +1 -1
  27. package/dist/commands/release.d.ts +10 -0
  28. package/dist/commands/release.d.ts.map +1 -0
  29. package/dist/commands/release.js +181 -0
  30. package/dist/commands/release.js.map +1 -0
  31. package/dist/commands/ui.d.ts +5 -0
  32. package/dist/commands/ui.d.ts.map +1 -1
  33. package/dist/commands/ui.js +49 -0
  34. package/dist/commands/ui.js.map +1 -1
  35. package/dist/scaffold/agents.d.ts.map +1 -1
  36. package/dist/scaffold/agents.js +40 -6
  37. package/dist/scaffold/agents.js.map +1 -1
  38. package/dist/scaffold/backend.d.ts +1 -1
  39. package/dist/scaffold/backend.d.ts.map +1 -1
  40. package/dist/scaffold/backend.js +63 -31
  41. package/dist/scaffold/backend.js.map +1 -1
  42. package/dist/scaffold/components.d.ts +8 -0
  43. package/dist/scaffold/components.d.ts.map +1 -0
  44. package/dist/scaffold/components.js +305 -0
  45. package/dist/scaffold/components.js.map +1 -0
  46. package/dist/scaffold/design.d.ts.map +1 -1
  47. package/dist/scaffold/design.js +47 -25
  48. package/dist/scaffold/design.js.map +1 -1
  49. package/dist/scaffold/flagship.d.ts +5 -0
  50. package/dist/scaffold/flagship.d.ts.map +1 -1
  51. package/dist/scaffold/flagship.js +161 -102
  52. package/dist/scaffold/flagship.js.map +1 -1
  53. package/dist/scaffold/index.d.ts +1 -1
  54. package/dist/scaffold/index.d.ts.map +1 -1
  55. package/dist/scaffold/index.js +22 -7
  56. package/dist/scaffold/index.js.map +1 -1
  57. package/dist/scaffold/library.d.ts +3 -0
  58. package/dist/scaffold/library.d.ts.map +1 -0
  59. package/dist/scaffold/library.js +98 -0
  60. package/dist/scaffold/library.js.map +1 -0
  61. package/dist/scaffold/phases.d.ts.map +1 -1
  62. package/dist/scaffold/phases.js +19 -14
  63. package/dist/scaffold/phases.js.map +1 -1
  64. package/dist/scaffold/repomap.d.ts +3 -3
  65. package/dist/scaffold/repomap.d.ts.map +1 -1
  66. package/dist/scaffold/repomap.js +22 -10
  67. package/dist/scaffold/repomap.js.map +1 -1
  68. package/dist/scaffold/standard.d.ts.map +1 -1
  69. package/dist/scaffold/standard.js +3 -2
  70. package/dist/scaffold/standard.js.map +1 -1
  71. package/dist/scaffold/tools-guide.d.ts +3 -0
  72. package/dist/scaffold/tools-guide.d.ts.map +1 -0
  73. package/dist/scaffold/tools-guide.js +117 -0
  74. package/dist/scaffold/tools-guide.js.map +1 -0
  75. package/dist/scaffold/workflow.d.ts +5 -0
  76. package/dist/scaffold/workflow.d.ts.map +1 -0
  77. package/dist/scaffold/workflow.js +221 -0
  78. package/dist/scaffold/workflow.js.map +1 -0
  79. package/dist/ui/CockpitApp.d.ts +2 -2
  80. package/dist/ui/CockpitApp.d.ts.map +1 -1
  81. package/dist/ui/CockpitApp.js +361 -15
  82. package/dist/ui/CockpitApp.js.map +1 -1
  83. package/dist/ui/ToolsPanel.d.ts +9 -0
  84. package/dist/ui/ToolsPanel.d.ts.map +1 -0
  85. package/dist/ui/ToolsPanel.js +230 -0
  86. package/dist/ui/ToolsPanel.js.map +1 -0
  87. package/dist/utils/fs.d.ts.map +1 -1
  88. package/dist/utils/fs.js +42 -6
  89. package/dist/utils/fs.js.map +1 -1
  90. package/dist/utils/project-files.d.ts +4 -0
  91. package/dist/utils/project-files.d.ts.map +1 -0
  92. package/dist/utils/project-files.js +49 -0
  93. package/dist/utils/project-files.js.map +1 -0
  94. package/dist/version.d.ts +1 -1
  95. package/dist/version.js +1 -1
  96. package/package.json +29 -4
@@ -1,42 +1,64 @@
1
1
  import path from "node:path";
2
- import { atomicWrite } from "../utils/fs.js";
2
+ import { exists, writeFiles } from "../utils/fs.js";
3
3
  export function generateDesignReadme() {
4
- return `# Design References & Asset Evidence
4
+ return `# Design References
5
5
 
6
- This directory stores visual references, exported screenshots, vector assets, and design briefs.
6
+ The user determines the design direction in conversation. Root design.md (if supplied),
7
+ this directory's design.md and brief.md, and extracted Stitch/Superdesign prototypes
8
+ are supporting references only. None overrides current user instructions.
7
9
 
8
- ## Guardrails for Agents
9
- 1. **Design Evidence, Not Direct Code:** Treat exported screens and designs as reference evidence, not executable code. Do not copy-paste raw CSS directly from design tools if it bypasses \`src/styles/tokens.css\` or uses hardcoded coordinates.
10
- 2. **Preserve Originals:** Do not overwrite or modify original assets or screen exports in this directory.
11
- 3. **No Routine Screenshot Diffing:** Routine QA must not capture or diff screenshots. Visual quality is verified headlessly via DOM geometry and AST contract auditing.
10
+ Preserve original exports. Do not execute exported scripts, install their dependencies,
11
+ or copy their architecture/styles wholesale. Translate relevant textual/source details
12
+ into the project component structure within the user's requested scope.
13
+
14
+ Never independently render, capture, diff or visually inspect reference screens or the
15
+ application. The user supplies screenshots and specific feedback when needed; analyze
16
+ those supplied images only for that correction. Headless technical checks are separate
17
+ from visual approval and may run only when validation is authorized.
18
+
19
+ See ../workflow.md for production order, ../decisions.md for settled conversation choices,
20
+ and ../toolkit.md for commands. Do not generate an extra design.md when the user already
21
+ provides one elsewhere, or rewrite originals to match agent assumptions.
12
22
  `;
13
23
  }
14
24
  export function generateDesignMd(projectName) {
15
- return `# Design Specification - ${projectName}
25
+ return `# Design Reference - ${projectName}
26
+
27
+ Supporting reference only. Design direction is determined in conversation, not by this
28
+ file or the starter template. Leave unspecified choices open until the user directs them.
16
29
 
17
- ## Brand Identity & Atmosphere
18
- - **Tone:** Modern, crisp, editorial, minimalist.
19
- - **Surface Elevation:** Subtle border separators (\`--color-border\`) with deep background surfaces (\`--color-surface\`).
20
- - **Typography:** Expressive display font for headings, highly legible geometric sans-serif for body.
21
- - **Interactions:** Subtle, snappy transitions (0.15s - 0.25s) with explicit target properties. Never use \`transition: all\`.
30
+ ## Reference notes
31
+ - Brand/context: not specified.
32
+ - Relevant prototype files: not specified.
33
+ - Useful patterns or constraints mentioned by the user: not specified.
34
+
35
+ Settled conversation decisions belong in ../decisions.md. Do not invent an approved
36
+ palette, typography, atmosphere or animation style from scaffold defaults.
22
37
  `;
23
38
  }
24
39
  export function generateBriefMd(projectName) {
25
- return `# Project Brief - ${projectName}
40
+ return `# Brief Reference - ${projectName}
41
+
42
+ Supplemental context; current user instructions take precedence.
43
+
44
+ - Audience and business objective: not specified.
45
+ - Requested pages and sections: not specified.
46
+ - Requested current stage: determined in conversation.
47
+ - Backend/customer panel requirements: not specified.
26
48
 
27
- ## Objectives
28
- - Build a high-performance web experience for ${projectName}.
29
- - Ensure full WCAG 2.1 AA accessibility conformance.
30
- - Achieve 95+ Core Web Vitals on mobile and desktop.
49
+ Record agreed scope in ../decisions.md. Do not infer extra pages, panels or features.
31
50
  `;
32
51
  }
33
52
  export async function scaffoldDesign(projectRoot, projectName) {
34
- const designDir = path.join(projectRoot, "docs", "design");
35
- await atomicWrite(path.join(designDir, "README.md"), generateDesignReadme());
36
- await atomicWrite(path.join(designDir, "design.md"), generateDesignMd(projectName));
37
- await atomicWrite(path.join(designDir, "brief.md"), generateBriefMd(projectName));
38
- // Create assets and screens placeholders (.gitkeep)
39
- await atomicWrite(path.join(designDir, "assets", ".gitkeep"), "");
40
- await atomicWrite(path.join(designDir, "screens", ".gitkeep"), "");
53
+ const files = {
54
+ "docs/design/README.md": generateDesignReadme(),
55
+ "docs/design/brief.md": generateBriefMd(projectName),
56
+ "docs/design/assets/.gitkeep": "",
57
+ "docs/design/screens/.gitkeep": "",
58
+ };
59
+ if (!(await exists(path.join(projectRoot, "design.md")))) {
60
+ files["docs/design/design.md"] = generateDesignMd(projectName);
61
+ }
62
+ await writeFiles(projectRoot, files);
41
63
  }
42
64
  //# sourceMappingURL=design.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"design.js","sourceRoot":"","sources":["../../src/scaffold/design.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,UAAU,oBAAoB;IAClC,OAAO;;;;;;;;CAQR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO,4BAA4B,WAAW;;;;;;;CAO/C,CAAC;AACF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,OAAO,qBAAqB,WAAW;;;gDAGO,WAAW;;;CAG1D,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB,EAAE,WAAmB;IAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3D,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC7E,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;IACpF,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;IAClF,oDAAoD;IACpD,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;IAClE,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"design.js","sourceRoot":"","sources":["../../src/scaffold/design.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,UAAU,oBAAoB;IAClC,OAAO;;;;;;;;;;;;;;;;;;CAkBR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO,wBAAwB,WAAW;;;;;;;;;;;;CAY3C,CAAC;AACF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,OAAO,uBAAuB,WAAW;;;;;;;;;;CAU1C,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB,EAAE,WAAmB;IAC3E,MAAM,KAAK,GAA2B;QACpC,uBAAuB,EAAE,oBAAoB,EAAE;QAC/C,sBAAsB,EAAE,eAAe,CAAC,WAAW,CAAC;QACpD,6BAA6B,EAAE,EAAE;QACjC,8BAA8B,EAAE,EAAE;KACnC,CAAC;IACF,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,KAAK,CAAC,uBAAuB,CAAC,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC"}
@@ -5,4 +5,9 @@ export declare function generateFlagshipMain(): string;
5
5
  export declare function generateFlagshipCanvasLayer(): string;
6
6
  export declare function generateFlagshipApp(): string;
7
7
  export declare function scaffoldFlagshipProject(projectRoot: string, projectName: string): Promise<void>;
8
+ export declare function generateSmoothScroll(): string;
9
+ export declare function generateFlagshipHeader(): string;
10
+ export declare function generateFlagshipFooter(): string;
11
+ export declare function generateFlagshipHome(): string;
12
+ export declare function generateFlagshipShowcase(): string;
8
13
  //# sourceMappingURL=flagship.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flagship.d.ts","sourceRoot":"","sources":["../../src/scaffold/flagship.ts"],"names":[],"mappings":"AAIA,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAkCvE;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAYnD;AAED,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAcrE;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAe7C;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAuEpD;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CA8I5C;AAED,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
1
+ {"version":3,"file":"flagship.d.ts","sourceRoot":"","sources":["../../src/scaffold/flagship.ts"],"names":[],"mappings":"AAIA,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAkCvE;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAanD;AAED,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAcrE;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAe7C;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAuEpD;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAiD5C;AAED,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAuFf;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAuC7C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAgC/C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAW/C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CA4B7C;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAYjD"}
@@ -45,6 +45,7 @@ export default defineConfig({
45
45
  plugins: [react(), tailwindcss()],
46
46
  server: {
47
47
  port: 5173,
48
+ proxy: { "/api": "http://127.0.0.1:3001" },
48
49
  },
49
50
  });
50
51
  `;
@@ -153,44 +154,16 @@ export function CanvasLayer() {
153
154
  `;
154
155
  }
155
156
  export function generateFlagshipApp() {
156
- return `import Lenis from "lenis";
157
- import { useEffect } from "react";
158
- import { Link, Route, Switch } from "wouter";
157
+ return `import { Link, Route, Switch } from "wouter";
158
+ import { useSmoothScroll } from "./behaviors";
159
159
  import { CanvasLayer } from "./components/creative/CanvasLayer";
160
- import { Button } from "./components/ui/Button";
160
+ import { Footer, Header } from "./components/layout";
161
+ import { Button } from "./components/ui";
162
+ import HomeView from "./routes/home";
163
+ import ShowcaseView from "./routes/showcase";
161
164
 
162
165
  export default function App() {
163
- useEffect(() => {
164
- const preference = window.matchMedia("(prefers-reduced-motion: reduce)");
165
- let lenis: Lenis | undefined;
166
- let frameId = 0;
167
- const stop = () => {
168
- cancelAnimationFrame(frameId);
169
- lenis?.destroy();
170
- lenis = undefined;
171
- };
172
- const update = () => {
173
- stop();
174
- if (preference.matches) return;
175
- const instance = new Lenis({
176
- duration: 1.2,
177
- easing: (t) => Math.min(1, 1.001 - 2 ** (-10 * t)),
178
- smoothWheel: true,
179
- });
180
- lenis = instance;
181
- const raf = (time: number) => {
182
- instance.raf(time);
183
- frameId = requestAnimationFrame(raf);
184
- };
185
- frameId = requestAnimationFrame(raf);
186
- };
187
- update();
188
- preference.addEventListener("change", update);
189
- return () => {
190
- preference.removeEventListener("change", update);
191
- stop();
192
- };
193
- }, []);
166
+ useSmoothScroll();
194
167
 
195
168
  return (
196
169
  <div className="relative min-h-screen bg-[var(--color-background)] text-[var(--color-foreground)] flex flex-col">
@@ -205,33 +178,7 @@ export default function App() {
205
178
  <CanvasLayer />
206
179
 
207
180
  {/* Top Header */}
208
- <header className="border-b border-[var(--color-border)] bg-[var(--color-surface)]/80 backdrop-blur-md sticky top-0 z-40">
209
- <div className="max-w-[var(--spacing-container-max)] mx-auto px-[var(--spacing-container-gutter)] h-16 flex items-center justify-between">
210
- <Link
211
- href="/"
212
- className="text-[var(--text-lg)] font-bold tracking-tight text-[var(--color-foreground)]"
213
- >
214
- Flagship Studio
215
- </Link>
216
- <nav
217
- aria-label="Main Navigation"
218
- className="flex items-center gap-6 text-[var(--text-sm)]"
219
- >
220
- <Link
221
- href="/"
222
- className="text-[var(--color-muted-foreground)] hover:text-[var(--color-foreground)] transition-colors"
223
- >
224
- Home
225
- </Link>
226
- <Link
227
- href="/showcase"
228
- className="text-[var(--color-muted-foreground)] hover:text-[var(--color-foreground)] transition-colors"
229
- >
230
- Showcase
231
- </Link>
232
- </nav>
233
- </div>
234
- </header>
181
+ <Header />
235
182
 
236
183
  {/* Main Content Landmark */}
237
184
  <main id="main-content" tabIndex={-1} className="relative z-10 flex-1 flex flex-col">
@@ -250,49 +197,10 @@ export default function App() {
250
197
  </main>
251
198
 
252
199
  {/* Footer */}
253
- <footer className="relative z-10 border-t border-[var(--color-border)] bg-[var(--color-surface)] py-8 mt-auto">
254
- <div className="max-w-[var(--spacing-container-max)] mx-auto px-[var(--spacing-container-gutter)] flex flex-col sm:flex-row items-center justify-between gap-4 text-[var(--text-xs)] text-[var(--color-muted-foreground)]">
255
- <p>&copy; {new Date().getFullYear()} Flagship Studio. All rights reserved.</p>
256
- </div>
257
- </footer>
200
+ <Footer />
258
201
  </div>
259
202
  );
260
203
  }
261
-
262
- function HomeView() {
263
- return (
264
- <section className="py-24 px-[var(--spacing-container-gutter)] max-w-[var(--spacing-container-max)] mx-auto w-full">
265
- <div className="flex flex-col gap-6 max-w-2xl">
266
- <h1 className="text-[var(--text-5xl)] font-bold leading-tight tracking-tight">
267
- Creative Engineering & Visual Systems
268
- </h1>
269
- <p className="text-[var(--text-xl)] text-[var(--color-muted-foreground)] leading-relaxed">
270
- Interactive web experiences with headless routing, smooth scrolling, and dynamic graphics
271
- layers.
272
- </p>
273
- <div className="flex gap-4 pt-4">
274
- <Button variant="primary" size="lg">
275
- Explore Showcase
276
- </Button>
277
- <Button variant="outline" size="lg">
278
- Architecture
279
- </Button>
280
- </div>
281
- </div>
282
- </section>
283
- );
284
- }
285
-
286
- function ShowcaseView() {
287
- return (
288
- <section className="py-20 px-[var(--spacing-container-gutter)] max-w-[var(--spacing-container-max)] mx-auto w-full">
289
- <h1 className="text-[var(--text-4xl)] font-bold mb-6">Creative Showcase</h1>
290
- <p className="text-[var(--text-base)] text-[var(--color-muted-foreground)]">
291
- Interactive experiences delivered with precision performance.
292
- </p>
293
- </section>
294
- );
295
- }
296
204
  `;
297
205
  }
298
206
  export async function scaffoldFlagshipProject(projectRoot, projectName) {
@@ -326,12 +234,163 @@ export async function scaffoldFlagshipProject(projectRoot, projectName) {
326
234
  javascript: { formatter: { quoteStyle: "double", trailingCommas: "all" } },
327
235
  };
328
236
  await atomicWrite(path.join(projectRoot, "biome.json"), JSON.stringify(biomeConfig, null, 2));
237
+ await atomicWrite(path.join(projectRoot, "src/behaviors/useSmoothScroll.ts"), generateSmoothScroll());
238
+ await atomicWrite(path.join(projectRoot, "src/behaviors/index.ts"), 'export { useSmoothScroll } from "./useSmoothScroll";\n');
239
+ await atomicWrite(path.join(projectRoot, "src/components/motion/Reveal.tsx"), `import { type HTMLMotionProps, motion, useReducedMotion } from "motion/react";
240
+
241
+ export function Reveal({ children, ...props }: HTMLMotionProps<"div">) {
242
+ const reduced = useReducedMotion();
243
+ return (
244
+ <motion.div
245
+ initial={reduced ? false : { opacity: 0 }}
246
+ whileInView={{ opacity: 1 }}
247
+ viewport={{ once: true }}
248
+ {...props}
249
+ >
250
+ {children}
251
+ </motion.div>
252
+ );
253
+ }
254
+ `);
255
+ await atomicWrite(path.join(projectRoot, "src/components/motion/index.ts"), 'export { Reveal } from "./Reveal";\n');
256
+ await atomicWrite(path.join(projectRoot, "src/library/index.ts"), 'export * from "../components/ui";\nexport * from "../components/layout";\nexport * from "../components/features";\nexport * from "../components/sections";\nexport * from "../components/motion";\nexport * from "../behaviors";\n');
329
257
  // Source files
330
258
  const srcDir = path.join(projectRoot, "src");
331
259
  await atomicWrite(path.join(srcDir, "main.tsx"), generateFlagshipMain());
332
260
  await atomicWrite(path.join(srcDir, "App.tsx"), generateFlagshipApp());
261
+ await atomicWrite(path.join(srcDir, "components/layout/Header.tsx"), generateFlagshipHeader());
262
+ await atomicWrite(path.join(srcDir, "components/layout/Footer.tsx"), generateFlagshipFooter());
263
+ await atomicWrite(path.join(srcDir, "routes/home.tsx"), generateFlagshipHome());
264
+ await atomicWrite(path.join(srcDir, "routes/showcase.tsx"), generateFlagshipShowcase());
333
265
  await atomicWrite(path.join(srcDir, "components", "creative", "CanvasLayer.tsx"), generateFlagshipCanvasLayer());
334
266
  await atomicWrite(path.join(srcDir, "components", "ui", "Button.tsx"), generateBespokeButton());
335
267
  await atomicWrite(path.join(srcDir, "components", "ui", "Input.tsx"), generateBespokeInput());
336
268
  }
269
+ export function generateSmoothScroll() {
270
+ return `import Lenis from "lenis";
271
+ import "lenis/dist/lenis.css";
272
+ import { useEffect } from "react";
273
+
274
+ export function useSmoothScroll() {
275
+ useEffect(() => {
276
+ const preference = window.matchMedia("(prefers-reduced-motion: reduce)");
277
+ let lenis: Lenis | undefined;
278
+ let frameId = 0;
279
+ const stop = () => {
280
+ cancelAnimationFrame(frameId);
281
+ lenis?.destroy();
282
+ lenis = undefined;
283
+ };
284
+ const update = () => {
285
+ stop();
286
+ if (preference.matches) return;
287
+ const instance = new Lenis({
288
+ duration: 1.2,
289
+ easing: (t) => Math.min(1, 1.001 - 2 ** (-10 * t)),
290
+ smoothWheel: true,
291
+ });
292
+ lenis = instance;
293
+ const raf = (time: number) => {
294
+ instance.raf(time);
295
+ frameId = requestAnimationFrame(raf);
296
+ };
297
+ frameId = requestAnimationFrame(raf);
298
+ };
299
+ update();
300
+ preference.addEventListener("change", update);
301
+ return () => {
302
+ preference.removeEventListener("change", update);
303
+ stop();
304
+ };
305
+ }, []);
306
+ }
307
+ `;
308
+ }
309
+ export function generateFlagshipHeader() {
310
+ return `import { Link } from "wouter";
311
+
312
+ export function Header() {
313
+ return (
314
+ <header className="border-b border-[var(--color-border)] bg-[var(--color-surface)]/80 backdrop-blur-md sticky top-0 z-40">
315
+ <div className="max-w-[var(--spacing-container-max)] mx-auto px-[var(--spacing-container-gutter)] h-16 flex items-center justify-between">
316
+ <Link
317
+ href="/"
318
+ className="text-[var(--text-lg)] font-bold tracking-tight text-[var(--color-foreground)]"
319
+ >
320
+ Flagship Studio
321
+ </Link>
322
+ <nav aria-label="Main Navigation" className="flex items-center gap-6 text-[var(--text-sm)]">
323
+ <Link
324
+ href="/"
325
+ className="text-[var(--color-muted-foreground)] hover:text-[var(--color-foreground)] transition-colors"
326
+ >
327
+ Home
328
+ </Link>
329
+ <Link
330
+ href="/showcase"
331
+ className="text-[var(--color-muted-foreground)] hover:text-[var(--color-foreground)] transition-colors"
332
+ >
333
+ Showcase
334
+ </Link>
335
+ </nav>
336
+ </div>
337
+ </header>
338
+ );
339
+ }
340
+ `;
341
+ }
342
+ export function generateFlagshipFooter() {
343
+ return `export function Footer() {
344
+ return (
345
+ <footer className="relative z-10 border-t border-[var(--color-border)] bg-[var(--color-surface)] py-8 mt-auto">
346
+ <div className="max-w-[var(--spacing-container-max)] mx-auto px-[var(--spacing-container-gutter)] flex flex-col sm:flex-row items-center justify-between gap-4 text-[var(--text-xs)] text-[var(--color-muted-foreground)]">
347
+ <p>&copy; {new Date().getFullYear()} Flagship Studio. All rights reserved.</p>
348
+ </div>
349
+ </footer>
350
+ );
351
+ }
352
+ `;
353
+ }
354
+ export function generateFlagshipHome() {
355
+ return `import { Reveal } from "../components/motion";
356
+ import { Button } from "../components/ui";
357
+
358
+ export default function HomeView() {
359
+ return (
360
+ <section className="py-24 px-[var(--spacing-container-gutter)] max-w-[var(--spacing-container-max)] mx-auto w-full">
361
+ <Reveal className="flex flex-col gap-6 max-w-2xl">
362
+ <h1 className="text-[var(--text-5xl)] font-bold leading-tight tracking-tight">
363
+ Creative Engineering & Visual Systems
364
+ </h1>
365
+ <p className="text-[var(--text-xl)] text-[var(--color-muted-foreground)] leading-relaxed">
366
+ Interactive web experiences with headless routing, smooth scrolling, and dynamic graphics
367
+ layers.
368
+ </p>
369
+ <div className="flex gap-4 pt-4">
370
+ <Button variant="primary" size="lg">
371
+ Explore Showcase
372
+ </Button>
373
+ <Button variant="outline" size="lg">
374
+ Architecture
375
+ </Button>
376
+ </div>
377
+ </Reveal>
378
+ </section>
379
+ );
380
+ }
381
+ `;
382
+ }
383
+ export function generateFlagshipShowcase() {
384
+ return `export default function ShowcaseView() {
385
+ return (
386
+ <section className="py-20 px-[var(--spacing-container-gutter)] max-w-[var(--spacing-container-max)] mx-auto w-full">
387
+ <h1 className="text-[var(--text-4xl)] font-bold mb-6">Creative Showcase</h1>
388
+ <p className="text-[var(--text-base)] text-[var(--color-muted-foreground)]">
389
+ Interactive experiences delivered with precision performance.
390
+ </p>
391
+ </section>
392
+ );
393
+ }
394
+ `;
395
+ }
337
396
  //# sourceMappingURL=flagship.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"flagship.js","sourceRoot":"","sources":["../../src/scaffold/flagship.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flagship.js","sourceRoot":"","sources":["../../src/scaffold/flagship.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ export interface ScaffoldOptions {
2
2
  targetDir: string;
3
3
  name: string;
4
4
  flagship?: boolean;
5
- backend?: "php" | "node";
5
+ backend?: "php" | "node" | "none";
6
6
  initGit?: boolean;
7
7
  }
8
8
  export declare function scaffoldNewProject(options: ScaffoldOptions): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDhF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA0EhF"}
@@ -1,17 +1,20 @@
1
- import { isSafeProjectName } from "../utils/fs.js";
1
+ import path from "node:path";
2
+ import { atomicWrite, isSafeProjectName } from "../utils/fs.js";
2
3
  import { initGit } from "../utils/git.js";
3
4
  import { scaffoldAgentPolicies } from "./agents.js";
4
5
  import { scaffoldBackend } from "./backend.js";
5
6
  import { scaffoldDesign } from "./design.js";
6
7
  import { scaffoldFlagshipProject } from "./flagship.js";
8
+ import { scaffoldLibrary } from "./library.js";
7
9
  import { scaffoldPhases } from "./phases.js";
8
10
  import { scaffoldRepomap } from "./repomap.js";
9
11
  import { scaffoldStandardProject } from "./standard.js";
10
12
  import { scaffoldTokens } from "./tokens.js";
13
+ import { scaffoldWorkflow } from "./workflow.js";
11
14
  export async function scaffoldNewProject(options) {
12
- const { targetDir, name, flagship = false, backend = "php", initGit: shouldInitGit = true, } = options;
13
- if (backend !== "php" && backend !== "node") {
14
- throw new Error(`Invalid backend '${backend}'. Expected php or node.`);
15
+ const { targetDir, name, flagship = false, backend = "none", initGit: shouldInitGit = true, } = options;
16
+ if (backend !== "php" && backend !== "node" && backend !== "none") {
17
+ throw new Error(`Invalid backend '${backend}'. Expected none, php, or node.`);
15
18
  }
16
19
  if (!isSafeProjectName(name)) {
17
20
  throw new Error(`Invalid project name '${name}'. Use lowercase alphanumeric characters and hyphens.`);
@@ -23,9 +26,10 @@ export async function scaffoldNewProject(options) {
23
26
  // 3. 10-Step Atomic Phases
24
27
  await scaffoldPhases(targetDir);
25
28
  // 4. Repomap & Fihrist
26
- await scaffoldRepomap(targetDir, name, flagship);
29
+ await scaffoldRepomap(targetDir, name, flagship, backend);
27
30
  // 5. Design Evidence Directory
28
31
  await scaffoldDesign(targetDir, name);
32
+ await scaffoldWorkflow(targetDir);
29
33
  // 6. Frontend Framework Engine
30
34
  if (flagship) {
31
35
  await scaffoldFlagshipProject(targetDir, name);
@@ -33,8 +37,19 @@ export async function scaffoldNewProject(options) {
33
37
  else {
34
38
  await scaffoldStandardProject(targetDir, name);
35
39
  }
36
- // 7. Backend API & Security Layer
37
- await scaffoldBackend(targetDir, backend);
40
+ await scaffoldLibrary(targetDir);
41
+ await atomicWrite(path.join(targetDir, ".mozole", "project.json"), JSON.stringify({
42
+ version: 1,
43
+ name,
44
+ profile: flagship ? "flagship" : "standard",
45
+ backend,
46
+ library: "src/library/index.ts",
47
+ }, null, 2));
48
+ await atomicWrite(path.join(targetDir, ".gitignore"), "node_modules/\ndist/\nbuild/\n.react-router/\n.env\n.env.*\n!.env.example\n*.log\nrelease/\nrelease.zip\nreleases/\n");
49
+ // 7. Backend API & Security Layer (optional)
50
+ if (backend !== "none") {
51
+ await scaffoldBackend(targetDir, backend);
52
+ }
38
53
  // 8. Initialize Git Repository with Clean Initial Commit
39
54
  if (shouldInitGit) {
40
55
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAU7C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAwB;IAC/D,MAAM,EACJ,SAAS,EACT,IAAI,EACJ,QAAQ,GAAG,KAAK,EAChB,OAAO,GAAG,KAAK,EACf,OAAO,EAAE,aAAa,GAAG,IAAI,GAC9B,GAAG,OAAO,CAAC;IACZ,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,0BAA0B,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,uDAAuD,CACrF,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,MAAM,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE7C,sCAAsC;IACtC,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAEhC,2BAA2B;IAC3B,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAEhC,uBAAuB;IACvB,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEjD,+BAA+B;IAC/B,MAAM,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAEtC,+BAA+B;IAC/B,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,uBAAuB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,MAAM,uBAAuB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,kCAAkC;IAClC,MAAM,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE1C,yDAAyD;IACzD,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function generateDialog(): string;
2
+ export declare function scaffoldLibrary(root: string): Promise<void>;
3
+ //# sourceMappingURL=library.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../../src/scaffold/library.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,IAAI,MAAM,CA4BvC;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyEjE"}
@@ -0,0 +1,98 @@
1
+ import path from "node:path";
2
+ import { atomicWrite, exists, writeFiles } from "../utils/fs.js";
3
+ import { generateBespokeButton, generateBespokeInput } from "./standard.js";
4
+ export function generateDialog() {
5
+ return `import * as Primitive from "@radix-ui/react-dialog";
6
+ import type { ComponentProps } from "react";
7
+
8
+ export const Dialog = Primitive.Root;
9
+ export const DialogTrigger = Primitive.Trigger;
10
+ export const DialogClose = Primitive.Close;
11
+ export const DialogTitle = Primitive.Title;
12
+ export const DialogDescription = Primitive.Description;
13
+
14
+ export function DialogContent({
15
+ children,
16
+ className = "",
17
+ ...props
18
+ }: ComponentProps<typeof Primitive.Content>) {
19
+ return (
20
+ <Primitive.Portal>
21
+ <Primitive.Overlay className="fixed inset-0 z-50 bg-[var(--color-background)]/80" />
22
+ <Primitive.Content
23
+ className={\`fixed left-1/2 top-1/2 z-50 w-[calc(100%-2rem)] max-w-lg -translate-x-1/2 -translate-y-1/2 rounded-[var(--radius-sm)] border border-[var(--color-border)] bg-[var(--color-surface)] p-6 text-[var(--color-foreground)] focus:outline-none \${className}\`}
24
+ {...props}
25
+ >
26
+ {children}
27
+ </Primitive.Content>
28
+ </Primitive.Portal>
29
+ );
30
+ }
31
+ `;
32
+ }
33
+ export async function scaffoldLibrary(root) {
34
+ await writeFiles(root, {
35
+ "src/components/ui/Button.tsx": generateBespokeButton(),
36
+ "src/components/ui/Input.tsx": generateBespokeInput(),
37
+ "src/components/ui/Dialog.tsx": generateDialog(),
38
+ "src/components/layout/Container.tsx": `import type { ComponentProps } from "react";
39
+
40
+ export function Container({ className = "", ...props }: ComponentProps<"div">) {
41
+ return (
42
+ <div
43
+ className={\`mx-auto w-full max-w-[var(--spacing-container-max)] px-[var(--spacing-container-gutter)] \${className}\`}
44
+ {...props}
45
+ />
46
+ );
47
+ }
48
+ `,
49
+ "src/components/features/index.ts": "export {};\n",
50
+ "src/components/sections/index.ts": "export {};\n",
51
+ "src/components/motion/index.ts": "export {};\n",
52
+ "src/behaviors/index.ts": "export {};\n",
53
+ "src/components/motion/README.md": "# Project motion\n\nOwn animation components here. Standard has no required motion runtime; Flagship uses Motion.\n",
54
+ "src/behaviors/README.md": "# Project behaviors\n\nOwn hooks and interaction policies here. Never import implementations from sibling projects.\n",
55
+ "docs/library.md": "# Project library\n\nImport UI from src/components/ui, layouts from src/components/layout, and the project library from src/library. Every implementation and token belongs to this project. Prototype workspaces share npm dependencies only.\n\nCompose Dialog with DialogTrigger, DialogContent, DialogTitle, DialogDescription and DialogClose. Provide an accessible title and a visible close control; use aria-describedby={undefined} when intentionally omitting a description.\n\nEach independent primitive must have its own named file; related Dialog parts may share Dialog.tsx. Add reusable feature components in src/components/features and independent sections in src/components/sections. Pages compose sections. Adding a component requires an explicit export in its local index.ts. Keep backend access in project-owned services and pass data/actions into visual components. Keep primitives independent of routes and backend. Follow docs/workflow.md and docs/toolkit.md; design direction comes from the conversation. Do not create a /ui gallery unless requested.\n",
56
+ });
57
+ const indexes = {
58
+ "src/components/ui/index.ts": [
59
+ 'export * from "./Button";',
60
+ 'export * from "./Input";',
61
+ 'export * from "./Dialog";',
62
+ ],
63
+ "src/components/layout/index.ts": ['export { Container } from "./Container";'],
64
+ "src/library/index.ts": [
65
+ 'export * from "../components/ui";',
66
+ 'export * from "../components/layout";',
67
+ 'export * from "../components/features";',
68
+ 'export * from "../components/sections";',
69
+ 'export * from "../components/motion";',
70
+ 'export * from "../behaviors";',
71
+ ],
72
+ };
73
+ for (const component of ["Header", "Footer"]) {
74
+ if (await exists(path.join(root, `src/components/layout/${component}.tsx`))) {
75
+ indexes["src/components/layout/index.ts"].push(`export * from "./${component}";`);
76
+ }
77
+ }
78
+ for (const [file, exports] of Object.entries(indexes)) {
79
+ const target = path.join(root, file);
80
+ // Existing custom barrels may expose different symbols; adoption reports them for review.
81
+ if (!(await exists(target)))
82
+ await atomicWrite(target, `${exports.join("\n")}\n`);
83
+ }
84
+ const manifest = path.join(root, ".mozole", "library.json");
85
+ if (!(await exists(manifest))) {
86
+ await atomicWrite(manifest, JSON.stringify({
87
+ ownership: "project",
88
+ entry: "src/library/index.ts",
89
+ ui: "src/components/ui",
90
+ layout: "src/components/layout",
91
+ features: "src/components/features",
92
+ sections: "src/components/sections",
93
+ motion: "src/components/motion",
94
+ behavior: "src/behaviors",
95
+ }, null, 2));
96
+ }
97
+ }
98
+ //# sourceMappingURL=library.js.map