@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.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +109 -15
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.d.ts +7 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +87 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/adopt.d.ts +2 -0
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +243 -45
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/assets.d.ts +28 -0
- package/dist/commands/assets.d.ts.map +1 -0
- package/dist/commands/assets.js +176 -0
- package/dist/commands/assets.js.map +1 -0
- package/dist/commands/backend.d.ts +5 -0
- package/dist/commands/backend.d.ts.map +1 -0
- package/dist/commands/backend.js +68 -0
- package/dist/commands/backend.js.map +1 -0
- package/dist/commands/new.d.ts +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +13 -5
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/prototype.d.ts.map +1 -1
- package/dist/commands/prototype.js +68 -20
- package/dist/commands/prototype.js.map +1 -1
- package/dist/commands/release.d.ts +10 -0
- package/dist/commands/release.d.ts.map +1 -0
- package/dist/commands/release.js +181 -0
- package/dist/commands/release.js.map +1 -0
- package/dist/commands/ui.d.ts +5 -0
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +49 -0
- package/dist/commands/ui.js.map +1 -1
- package/dist/scaffold/agents.d.ts.map +1 -1
- package/dist/scaffold/agents.js +40 -6
- package/dist/scaffold/agents.js.map +1 -1
- package/dist/scaffold/backend.d.ts +1 -1
- package/dist/scaffold/backend.d.ts.map +1 -1
- package/dist/scaffold/backend.js +63 -31
- package/dist/scaffold/backend.js.map +1 -1
- package/dist/scaffold/components.d.ts +8 -0
- package/dist/scaffold/components.d.ts.map +1 -0
- package/dist/scaffold/components.js +305 -0
- package/dist/scaffold/components.js.map +1 -0
- package/dist/scaffold/design.d.ts.map +1 -1
- package/dist/scaffold/design.js +47 -25
- package/dist/scaffold/design.js.map +1 -1
- package/dist/scaffold/flagship.d.ts +5 -0
- package/dist/scaffold/flagship.d.ts.map +1 -1
- package/dist/scaffold/flagship.js +161 -102
- package/dist/scaffold/flagship.js.map +1 -1
- package/dist/scaffold/index.d.ts +1 -1
- package/dist/scaffold/index.d.ts.map +1 -1
- package/dist/scaffold/index.js +22 -7
- package/dist/scaffold/index.js.map +1 -1
- package/dist/scaffold/library.d.ts +3 -0
- package/dist/scaffold/library.d.ts.map +1 -0
- package/dist/scaffold/library.js +98 -0
- package/dist/scaffold/library.js.map +1 -0
- package/dist/scaffold/phases.d.ts.map +1 -1
- package/dist/scaffold/phases.js +19 -14
- package/dist/scaffold/phases.js.map +1 -1
- package/dist/scaffold/repomap.d.ts +3 -3
- package/dist/scaffold/repomap.d.ts.map +1 -1
- package/dist/scaffold/repomap.js +22 -10
- package/dist/scaffold/repomap.js.map +1 -1
- package/dist/scaffold/standard.d.ts.map +1 -1
- package/dist/scaffold/standard.js +3 -2
- package/dist/scaffold/standard.js.map +1 -1
- package/dist/scaffold/tools-guide.d.ts +3 -0
- package/dist/scaffold/tools-guide.d.ts.map +1 -0
- package/dist/scaffold/tools-guide.js +117 -0
- package/dist/scaffold/tools-guide.js.map +1 -0
- package/dist/scaffold/workflow.d.ts +5 -0
- package/dist/scaffold/workflow.d.ts.map +1 -0
- package/dist/scaffold/workflow.js +221 -0
- package/dist/scaffold/workflow.js.map +1 -0
- package/dist/ui/CockpitApp.d.ts +2 -2
- package/dist/ui/CockpitApp.d.ts.map +1 -1
- package/dist/ui/CockpitApp.js +361 -15
- package/dist/ui/CockpitApp.js.map +1 -1
- package/dist/ui/ToolsPanel.d.ts +9 -0
- package/dist/ui/ToolsPanel.d.ts.map +1 -0
- package/dist/ui/ToolsPanel.js +230 -0
- package/dist/ui/ToolsPanel.js.map +1 -0
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +42 -6
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/project-files.d.ts +4 -0
- package/dist/utils/project-files.d.ts.map +1 -0
- package/dist/utils/project-files.js +49 -0
- package/dist/utils/project-files.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +29 -4
package/dist/scaffold/design.js
CHANGED
|
@@ -1,42 +1,64 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import {
|
|
2
|
+
import { exists, writeFiles } from "../utils/fs.js";
|
|
3
3
|
export function generateDesignReadme() {
|
|
4
|
-
return `# Design References
|
|
4
|
+
return `# Design References
|
|
5
5
|
|
|
6
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
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
|
-
##
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
|
|
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 `#
|
|
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
|
-
|
|
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
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
await
|
|
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,
|
|
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,
|
|
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
|
|
157
|
-
import {
|
|
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 {
|
|
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
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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>© {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>© {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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,UAAU,2BAA2B,CAAC,WAAmB;IAC7D,MAAM,GAAG,GAAG;QACV,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,GAAG,EAAE,MAAM;YACX,KAAK,EAAE,4BAA4B;YACnC,OAAO,EAAE,cAAc;YACvB,SAAS,EAAE,cAAc;YACzB,MAAM,EAAE,eAAe;SACxB;QACD,YAAY,EAAE;YACZ,wBAAwB,EAAE,QAAQ;YAClC,sBAAsB,EAAE,QAAQ;YAChC,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,SAAS;YACtB,MAAM,EAAE,QAAQ;SACjB;QACD,eAAe,EAAE;YACf,gBAAgB,EAAE,QAAQ;YAC1B,mBAAmB,EAAE,QAAQ;YAC7B,aAAa,EAAE,UAAU;YACzB,cAAc,EAAE,UAAU;YAC1B,kBAAkB,EAAE,SAAS;YAC7B,sBAAsB,EAAE,QAAQ;YAChC,WAAW,EAAE,QAAQ;YACrB,UAAU,EAAE,QAAQ;YACpB,IAAI,EAAE,QAAQ;SACf;KACF,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO
|
|
1
|
+
{"version":3,"file":"flagship.js","sourceRoot":"","sources":["../../src/scaffold/flagship.ts"],"names":[],"mappings":"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"}
|
package/dist/scaffold/index.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/scaffold/index.js
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
import
|
|
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 = "
|
|
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
|
-
|
|
37
|
-
await
|
|
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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scaffold/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|