@mozole/cli 1.3.0 → 1.3.2
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 +7 -15
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +26 -41
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.js +1 -1
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +289 -271
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +10 -3
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/new.d.ts +7 -3
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +58 -29
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +4 -1
- package/dist/commands/verify.js.map +1 -1
- package/dist/config/project.d.ts +6 -4
- package/dist/config/project.d.ts.map +1 -1
- package/dist/config/project.js +28 -12
- package/dist/config/project.js.map +1 -1
- package/dist/context/cce.d.ts +0 -7
- package/dist/context/cce.d.ts.map +1 -1
- package/dist/context/cce.js +12 -43
- package/dist/context/cce.js.map +1 -1
- package/dist/governor/fingerprint.d.ts.map +1 -1
- package/dist/governor/fingerprint.js +36 -20
- package/dist/governor/fingerprint.js.map +1 -1
- package/dist/governor/hook.d.ts +1 -1
- package/dist/governor/hook.d.ts.map +1 -1
- package/dist/governor/hook.js +2 -2
- package/dist/governor/hook.js.map +1 -1
- package/dist/platform/executable.d.ts.map +1 -1
- package/dist/platform/executable.js +12 -4
- package/dist/platform/executable.js.map +1 -1
- package/dist/platform/process.d.ts.map +1 -1
- package/dist/platform/process.js +14 -16
- package/dist/platform/process.js.map +1 -1
- package/dist/qa/diff.d.ts +3 -3
- package/dist/qa/diff.d.ts.map +1 -1
- package/dist/qa/diff.js +13 -1
- package/dist/qa/diff.js.map +1 -1
- package/dist/qa/runner.d.ts +9 -9
- package/dist/qa/runner.d.ts.map +1 -1
- package/dist/qa/runner.js +45 -22
- package/dist/qa/runner.js.map +1 -1
- package/dist/qa/server.d.ts.map +1 -1
- package/dist/qa/server.js +6 -1
- package/dist/qa/server.js.map +1 -1
- package/dist/scaffold/backend.d.ts +9 -0
- package/dist/scaffold/backend.d.ts.map +1 -0
- package/dist/scaffold/backend.js +178 -0
- package/dist/scaffold/backend.js.map +1 -0
- package/dist/scaffold/templates.d.ts +2 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +83 -65
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/telemetry/store.js +7 -3
- package/dist/telemetry/store.js.map +1 -1
- package/dist/verify/runner.d.ts.map +1 -1
- package/dist/verify/runner.js +17 -14
- package/dist/verify/runner.js.map +1 -1
- package/dist/version.d.ts +2 -2
- package/dist/version.js +1 -1
- package/package.json +4 -1
- package/dist/scaffold/admin.d.ts +0 -8
- package/dist/scaffold/admin.d.ts.map +0 -1
- package/dist/scaffold/admin.js +0 -45
- package/dist/scaffold/admin.js.map +0 -1
|
@@ -1,27 +1,21 @@
|
|
|
1
1
|
import { cceMcpServer } from "../integrations/antigravity.js";
|
|
2
2
|
import { TOOLCHAIN } from "../version.js";
|
|
3
|
+
import { backendTemplates } from "./backend.js";
|
|
3
4
|
export function projectConfig(name, options = {}) {
|
|
4
|
-
|
|
5
|
+
const isScaffold = Boolean(options.scaffold);
|
|
6
|
+
const config = {
|
|
5
7
|
schemaVersion: 1,
|
|
6
8
|
name,
|
|
9
|
+
mode: isScaffold ? "scaffold" : "optimized",
|
|
7
10
|
framework: "react-router",
|
|
8
11
|
routes: ["/", "/about", "/contact"],
|
|
9
|
-
...(options.withAdmin
|
|
10
|
-
? {
|
|
11
|
-
admin: {
|
|
12
|
-
enabled: true,
|
|
13
|
-
routePrefix: "/admin",
|
|
14
|
-
runtime: "node",
|
|
15
|
-
},
|
|
16
|
-
}
|
|
17
|
-
: {}),
|
|
18
12
|
qa: {
|
|
19
|
-
visualDiffThreshold: 0.001,
|
|
20
13
|
viewports: [
|
|
21
14
|
{ width: 375, height: 812 },
|
|
22
15
|
{ width: 768, height: 1024 },
|
|
23
16
|
{ width: 1440, height: 900 },
|
|
24
17
|
],
|
|
18
|
+
visualDiffThreshold: 0.01,
|
|
25
19
|
server: {
|
|
26
20
|
command: "npm",
|
|
27
21
|
args: ["run", "dev", "--", "--host", "127.0.0.1"],
|
|
@@ -29,49 +23,57 @@ export function projectConfig(name, options = {}) {
|
|
|
29
23
|
preferredPort: 4173,
|
|
30
24
|
},
|
|
31
25
|
},
|
|
32
|
-
cce: {
|
|
26
|
+
cce: {
|
|
27
|
+
enabled: !isScaffold,
|
|
28
|
+
initialized: false,
|
|
29
|
+
command: isScaffold ? "" : "cce init --agent all",
|
|
30
|
+
},
|
|
33
31
|
governor: {
|
|
34
|
-
enabled:
|
|
35
|
-
mode: "enforce",
|
|
36
|
-
hooks: { codex:
|
|
32
|
+
enabled: !isScaffold,
|
|
33
|
+
mode: isScaffold ? "warn" : "enforce",
|
|
34
|
+
hooks: { codex: !isScaffold, claude: !isScaffold },
|
|
37
35
|
},
|
|
38
|
-
telemetry: { enabled:
|
|
36
|
+
telemetry: { enabled: !isScaffold },
|
|
39
37
|
verifiers: [],
|
|
40
38
|
};
|
|
39
|
+
if (options.backend) {
|
|
40
|
+
config.backend = {
|
|
41
|
+
enabled: true,
|
|
42
|
+
runtime: "php",
|
|
43
|
+
apiPrefix: "/api",
|
|
44
|
+
port: 8000,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return config;
|
|
41
48
|
}
|
|
42
49
|
const json = (value) => `${JSON.stringify(value, null, 2)}\n`;
|
|
43
50
|
export function projectTemplates(name, options = {}) {
|
|
51
|
+
const isScaffold = Boolean(options.scaffold);
|
|
44
52
|
const cliSpec = process.env.MOZOLE_CLI_SPEC ?? TOOLCHAIN.mozoleCli;
|
|
53
|
+
const scripts = {
|
|
54
|
+
build: "react-router build",
|
|
55
|
+
dev: "react-router dev",
|
|
56
|
+
lint: "biome check .",
|
|
57
|
+
format: "biome format --write .",
|
|
58
|
+
typecheck: "react-router typegen && tsc --noEmit",
|
|
59
|
+
test: "vitest",
|
|
60
|
+
"test:run": "vitest run",
|
|
61
|
+
verify: "mozole verify",
|
|
62
|
+
"verify:force": "mozole verify --force",
|
|
63
|
+
qa: "mozole qa",
|
|
64
|
+
"qa:force": "mozole qa --force",
|
|
65
|
+
"qa:interactive": "mozole qa --interactive",
|
|
66
|
+
"qa:visual": "mozole qa --visual",
|
|
67
|
+
};
|
|
68
|
+
if (options.backend) {
|
|
69
|
+
scripts["dev:api"] = "php -S 127.0.0.1:8000 -t api";
|
|
70
|
+
}
|
|
45
71
|
const packageJson = {
|
|
46
72
|
name,
|
|
47
73
|
private: true,
|
|
48
|
-
version: "0.1.0",
|
|
49
74
|
type: "module",
|
|
50
|
-
|
|
51
|
-
scripts: {
|
|
52
|
-
dev: "react-router dev",
|
|
53
|
-
build: "react-router build",
|
|
54
|
-
...(options.withAdmin
|
|
55
|
-
? { start: "react-router-serve build/server/index.js" }
|
|
56
|
-
: {}),
|
|
57
|
-
preview: "vite preview --host 127.0.0.1",
|
|
58
|
-
lint: "biome check .",
|
|
59
|
-
format: "biome format --write .",
|
|
60
|
-
typecheck: "react-router typegen && tsc --noEmit",
|
|
61
|
-
test: "vitest",
|
|
62
|
-
"test:run": "vitest run",
|
|
63
|
-
verify: "mozole verify",
|
|
64
|
-
"verify:force": "mozole verify --force",
|
|
65
|
-
qa: "mozole qa",
|
|
66
|
-
"qa:force": "mozole qa --force",
|
|
67
|
-
"qa:interactive": "mozole qa --interactive",
|
|
68
|
-
"qa:visual": "mozole qa --visual",
|
|
69
|
-
},
|
|
75
|
+
scripts,
|
|
70
76
|
dependencies: {
|
|
71
|
-
...(options.withAdmin
|
|
72
|
-
? { "@react-router/serve": TOOLCHAIN.reactRouter }
|
|
73
|
-
: {}),
|
|
74
|
-
"@react-router/node": TOOLCHAIN.reactRouter,
|
|
75
77
|
isbot: TOOLCHAIN.isbot,
|
|
76
78
|
react: TOOLCHAIN.react,
|
|
77
79
|
"react-dom": TOOLCHAIN.reactDom,
|
|
@@ -80,7 +82,6 @@ export function projectTemplates(name, options = {}) {
|
|
|
80
82
|
devDependencies: {
|
|
81
83
|
"@biomejs/biome": TOOLCHAIN.biome,
|
|
82
84
|
"@mozole/cli": cliSpec,
|
|
83
|
-
"@playwright/test": TOOLCHAIN.playwright,
|
|
84
85
|
"@react-router/dev": TOOLCHAIN.reactRouter,
|
|
85
86
|
"@testing-library/jest-dom": TOOLCHAIN.testingLibraryJestDom,
|
|
86
87
|
"@testing-library/react": TOOLCHAIN.testingLibraryReact,
|
|
@@ -95,6 +96,9 @@ export function projectTemplates(name, options = {}) {
|
|
|
95
96
|
vitest: TOOLCHAIN.vitest,
|
|
96
97
|
},
|
|
97
98
|
};
|
|
99
|
+
const viteConfig = options.backend
|
|
100
|
+
? 'import { reactRouter } from "@react-router/dev/vite";\nimport { defineConfig } from "vite";\n\nexport default defineConfig({\n plugins: [reactRouter()],\n server: {\n proxy: {\n "/api": {\n target: "http://127.0.0.1:8000",\n changeOrigin: true,\n },\n },\n },\n});\n'
|
|
101
|
+
: 'import { reactRouter } from "@react-router/dev/vite";\nimport { defineConfig } from "vite";\n\nexport default defineConfig({ plugins: [reactRouter()] });\n';
|
|
98
102
|
const files = {
|
|
99
103
|
"package.json": json(packageJson),
|
|
100
104
|
".mozole/project.json": json(projectConfig(name, options)),
|
|
@@ -104,7 +108,7 @@ export function projectTemplates(name, options = {}) {
|
|
|
104
108
|
".agents/mcp_config.json": json({
|
|
105
109
|
mcpServers: { "mozole-cce": cceMcpServer() },
|
|
106
110
|
}),
|
|
107
|
-
".agents/rules/mozole.md": "Follow the shared project contract in `AGENTS.md`. Repository reads are forbidden by default. Required order: CCE search → additional CCE search → bounded line-range read only when CCE output is insufficient → full-file read only after explicit escalation. Editing a file is NOT sufficient justification for reading it in full. If CCE is unavailable, report the blocker; do not fall back to repository reads.
|
|
111
|
+
".agents/rules/mozole.md": "Follow the shared project contract in `AGENTS.md`. Repository reads are forbidden by default. Required order: CCE search → additional CCE search → bounded line-range read only when CCE output is insufficient → full-file read only after explicit escalation. Editing a file is NOT sufficient justification for reading it in full. If CCE is unavailable, report the blocker; do not fall back to repository reads. Routine browser validation uses screenshot-free `mozole qa`; visual QA requires an explicit request or confirmed deterministic failure. Stop after requested work, `mozole verify`, and relevant routine QA pass.\n",
|
|
108
112
|
".agents/workflows/mozole-verify.md": "Run `mozole verify`. If it passes or is current, report the concise result and stop. If it fails, use the actionable summary; retrieve a raw log with `mozole logs <name>` only when the summary is insufficient. Rerun only after a relevant change, unless fresh evidence was explicitly requested with `--force`.\n",
|
|
109
113
|
".agents/workflows/mozole-qa.md": "Run `mozole qa`. Use its deterministic evidence and do not capture or request screenshots. If QA passes or is current, report concisely and stop. If it fails and fixing is in scope, address confirmed evidence and rerun only after a relevant change.\n",
|
|
110
114
|
".agents/workflows/mozole-qa-interactive.md": "Run `mozole qa --interactive`. Use deterministic interaction evidence without screenshots. Fix confirmed in-scope failures, then rerun only after a relevant change. Stop when QA passes or is current.\n",
|
|
@@ -144,10 +148,8 @@ export function projectTemplates(name, options = {}) {
|
|
|
144
148
|
],
|
|
145
149
|
},
|
|
146
150
|
}),
|
|
147
|
-
"react-router.config.ts":
|
|
148
|
-
|
|
149
|
-
: 'import type { Config } from "@react-router/dev/config";\n\nexport default {\n ssr: false,\n prerender: true,\n} satisfies Config;\n',
|
|
150
|
-
"vite.config.ts": 'import { reactRouter } from "@react-router/dev/vite";\nimport { defineConfig } from "vite";\n\nexport default defineConfig({ plugins: [reactRouter()] });\n',
|
|
151
|
+
"react-router.config.ts": 'import type { Config } from "@react-router/dev/config";\n\nexport default {\n ssr: false,\n prerender: true,\n} satisfies Config;\n',
|
|
152
|
+
"vite.config.ts": viteConfig,
|
|
151
153
|
"tsconfig.json": json({
|
|
152
154
|
include: ["**/*", ".react-router/types/**/*"],
|
|
153
155
|
compilerOptions: {
|
|
@@ -192,31 +194,47 @@ export function projectTemplates(name, options = {}) {
|
|
|
192
194
|
json: { formatter: { expand: "always" } },
|
|
193
195
|
}),
|
|
194
196
|
"vitest.config.ts": 'import react from "@vitejs/plugin-react";\nimport { defineConfig } from "vitest/config";\n\nexport default defineConfig({\n plugins: [react()],\n test: {\n environment: "jsdom",\n setupFiles: ["./tests/setup.ts"],\n exclude: ["node_modules/**", "build/**", ".react-router/**"],\n },\n});\n',
|
|
195
|
-
"app/routes.ts":
|
|
196
|
-
? 'import { index, type RouteConfig, route } from "@react-router/dev/routes";\n\nexport default [\n index("routes/home.tsx"),\n route("about", "routes/about.tsx"),\n route("contact", "routes/contact.tsx"),\n route("admin/login", "admin/login.tsx"),\n route("admin", "admin/layout.tsx", [index("admin/dashboard.tsx")]),\n] satisfies RouteConfig;\n'
|
|
197
|
-
: 'import { index, type RouteConfig, route } from "@react-router/dev/routes";\n\nexport default [\n index("routes/home.tsx"),\n route("about", "routes/about.tsx"),\n route("contact", "routes/contact.tsx"),\n] satisfies RouteConfig;\n',
|
|
197
|
+
"app/routes.ts": 'import { index, type RouteConfig, route } from "@react-router/dev/routes";\n\nexport default [\n index("routes/home.tsx"),\n route("about", "routes/about.tsx"),\n route("contact", "routes/contact.tsx"),\n] satisfies RouteConfig;\n',
|
|
198
198
|
"app/root.tsx": 'import {\n Links,\n Meta,\n NavLink,\n Outlet,\n Scripts,\n ScrollRestoration,\n} from "react-router";\nimport type { Route } from "./+types/root";\nimport "./styles/global.css";\n\nexport const links: Route.LinksFunction = () => [];\n\nexport function Layout({ children }: { children: React.ReactNode }) {\n return (\n <html lang="en">\n <head>\n <meta charSet="utf-8" />\n <meta name="viewport" content="width=device-width, initial-scale=1" />\n <Meta />\n <Links />\n </head>\n <body>\n <header>\n <nav aria-label="Main navigation">\n <NavLink to="/">Home</NavLink>\n <NavLink to="/about">About</NavLink>\n <NavLink to="/contact">Contact</NavLink>\n </nav>\n </header>\n {children}\n <ScrollRestoration />\n <Scripts />\n </body>\n </html>\n );\n}\n\nexport default function App() {\n return <Outlet />;\n}\n\nexport function ErrorBoundary({ error }: Route.ErrorBoundaryProps) {\n const message = error instanceof Error ? error.message : "Unexpected error";\n return (\n <main>\n <h1>Something went wrong</h1>\n <p>{message}</p>\n </main>\n );\n}\n',
|
|
199
|
-
"app/routes/home.tsx": 'export function meta() {\n return [\n { title: "Home" },\n { name: "description", content: "A static-first web project." },\n ];\n}\n\nexport default function Home() {\n return (\n <main>\n <p>Static-first</p>\n <h1>Build the site this project needs.</h1>\n <p>\n React Router Framework Mode, deterministic verification, and browser QA\n are ready.\n </p>\n </main>\n );\n}\n',
|
|
199
|
+
"app/routes/home.tsx": 'export function meta() {\n return [\n { title: "Home" },\n { name: "description", content: "A static-first web project." },\n ];\n}\n\nexport default function Home() {\n return (\n <main>\n <p className="eyebrow">Static-first</p>\n <h1>Build the site this project needs.</h1>\n <p>\n React Router Framework Mode, deterministic verification, and browser QA\n are ready.\n </p>\n </main>\n );\n}\n',
|
|
200
200
|
"app/routes/about.tsx": 'export function meta() {\n return [\n { title: "About" },\n { name: "description", content: "About this project." },\n ];\n}\n\nexport default function About() {\n return (\n <main>\n <h1>About</h1>\n <p>Replace this neutral starting point with project-specific content.</p>\n </main>\n );\n}\n',
|
|
201
201
|
"app/routes/contact.tsx": 'export function meta() {\n return [\n { title: "Contact" },\n { name: "description", content: "Contact information." },\n ];\n}\n\nexport default function Contact() {\n return (\n <main>\n <h1>Contact</h1>\n <p>Add the project contact workflow here.</p>\n </main>\n );\n}\n',
|
|
202
|
-
"app/styles/global.css": ":root {\n
|
|
202
|
+
"app/styles/global.css": ":root {\n color-scheme: light;\n font-family: Inter, ui-sans-serif, system-ui, sans-serif;\n color: #171717;\n background: #fafafa;\n}\n* {\n box-sizing: border-box;\n}\nbody {\n margin: 0;\n min-width: 320px;\n}\na {\n color: inherit;\n text-underline-offset: 0.2em;\n}\nheader {\n border-bottom: 1px solid #ddd;\n}\nnav {\n max-width: 70rem;\n margin: auto;\n padding: 1rem 1.5rem;\n display: flex;\n gap: 1.25rem;\n}\nnav a.active {\n font-weight: 700;\n}\nmain {\n width: min(70rem, 100%);\n margin: 0 auto;\n padding: clamp(3rem, 8vw, 8rem) 1.5rem;\n}\nh1 {\n max-width: 18ch;\n font-size: clamp(2.25rem, 7vw, 5rem);\n line-height: 1.02;\n letter-spacing: -0.04em;\n margin: 0.15em 0 0.4em;\n}\np {\n max-width: 65ch;\n line-height: 1.65;\n}\n.eyebrow {\n text-transform: uppercase;\n letter-spacing: 0.12em;\n font-size: 0.75rem;\n font-weight: 700;\n}\n",
|
|
203
203
|
"tests/setup.ts": 'import "@testing-library/jest-dom/vitest";\n',
|
|
204
204
|
"tests/smoke.test.tsx": 'import { render, screen } from "@testing-library/react";\nimport { describe, expect, it } from "vitest";\nimport Home from "../app/routes/home";\n\ndescribe("Home", () => {\n it("renders the starting point", () => {\n render(<Home />);\n expect(\n screen.getByRole("heading", { name: /build the site/i }),\n ).toBeVisible();\n });\n});\n',
|
|
205
|
-
"AGENTS.md": "# Project guide\n\n## Commands\n\n- `npm run dev` — local app\n- `npm run verify` — lint, typecheck, tests, production build\n- `npm run qa` — deterministic browser QA (no screenshots)\n- `npm run qa:interactive` — adds safe interaction probes\n- `npm run qa:visual` — explicit screenshot review\n- `mozole cce install` — install persistent CCE and required uv runtime\n- `mozole ui` — full-screen terminal dashboard\n\n## Architecture\n\nReact Router Framework Mode lives in `app/`; routes are in `app/routes.ts`; static output is `build/client/`. Mozole settings are in `.mozole/`; Antigravity integration is in `.agents/`; deeper decisions belong in `docs/`.\n\n## Design contract\n\nBefore writing UI code, complete `docs/design-tokens.md` and set its CSS custom properties. Avoid every banned default pattern listed there. Before generating markup for a new page, write a one-paragraph design rationale covering visual direction, typography, palette, and layout.\n\n## Mandatory CCE contract\n\nRepository reads are forbidden by default. Allowed retrieval order:\n\n1. CCE `context_search`\n2. additional CCE search, `expand_chunk`, or `related_context`\n3. bounded line-range read only when CCE output is insufficient\n4. full-file read only after explicit escalation\n\nEditing a file is NOT sufficient justification for reading it in full. If CCE is unavailable, stop and report the blocker instead of falling back to repository reads. Prefer localized patches and inspect `git diff`. Keep narration and successful logs concise. Routine browser validation uses screenshot-free `mozole qa`; visual QA requires an explicit user request or confirmed deterministic failure. Stop after requested work, `mozole verify`, and relevant routine QA pass.\n",
|
|
206
|
-
"CLAUDE.md": "@AGENTS.md\n\n## Design contract\n\nComplete `docs/design-tokens.md`, avoid its banned defaults, and write a one-paragraph design rationale before generating markup for a new page.\n\n## Claude Code CCE contract\n\nRepository reads are forbidden by default. Use `context_search`, then additional CCE retrieval. Read may use a bounded line range only when CCE is insufficient; a full-file Read requires explicit escalation. Editing is not justification. If CCE is unavailable, report the blocker; do not fall back.\n",
|
|
207
205
|
"docs/design-tokens.md": "# Design tokens\n\nComplete this contract before writing UI code. Replace every TODO custom-property value in `app/styles/global.css` with a deliberate project-specific choice.\n\n## Required decisions\n\n- `--color-bg`: primary page background.\n- `--color-fg`: primary text and foreground.\n- `--color-accent`: interactive and emphasis color.\n- `--font-display`: heading/display family and fallbacks.\n- `--font-body`: body/interface family and fallbacks.\n- Record one paragraph explaining visual direction, typography, palette, spacing, and layout before generating markup for each new page.\n\n## Banned default patterns\n\nDo not use these as automatic defaults:\n\n- Warm cream background with terracotta accent palette.\n- Identical border-radius and soft grey box-shadow on every card.\n- Uppercase, tracked-out eyebrow labels.\n- En- or em-dash-joined meta labels.\n- Arrow glyphs appended to button text.\n",
|
|
208
|
-
"
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
"README.md": `# ${name}\n\nStatic-first React Router Framework Mode project generated by Mozole for Codex, Claude Code, and Google Antigravity.\n\n## Start\n\n\`\`\`sh\nnpm
|
|
206
|
+
"AGENTS.md": "# Project guide\n\n## Commands\n\n- `npm run dev` — local app\n- `npm run verify` — lint, typecheck, tests, production build\n- `npm run qa` — deterministic browser QA (no screenshots)\n- `npm run qa:interactive` — adds safe interaction probes\n- `npm run qa:visual` — explicit screenshot review\n- `mozole cce install` — install persistent CCE and required uv runtime\n- `mozole ui` — full-screen terminal dashboard\n\n## Architecture\n\nReact Router Framework Mode lives in `app/`; routes are in `app/routes.ts`; static output is `build/client/`. Mozole settings are in `.mozole/`; Antigravity integration is in `.agents/`; deeper decisions belong in `docs/`.\n\n## Mandatory CCE contract\n\nRepository reads are forbidden by default. Allowed retrieval order:\n\n1. CCE `context_search`\n2. additional CCE search, `expand_chunk`, or `related_context`\n3. bounded line-range read only when CCE output is insufficient\n4. full-file read only after explicit escalation\n\nEditing a file is NOT sufficient justification for reading it in full. If CCE is unavailable, stop and report the blocker instead of falling back to repository reads. Prefer localized patches and inspect `git diff`. Keep narration and successful logs concise. Routine browser validation uses screenshot-free `mozole qa`; visual QA requires an explicit user request or confirmed deterministic failure. Stop after requested work, `mozole verify`, and relevant routine QA pass.\n",
|
|
207
|
+
"CLAUDE.md": "@AGENTS.md\n\n## Claude Code CCE contract\n\nRepository reads are forbidden by default. Use `context_search`, then additional CCE retrieval. Read may use a bounded line range only when CCE is insufficient; a full-file Read requires explicit escalation. Editing is not justification. If CCE is unavailable, report the blocker; do not fall back.\n",
|
|
208
|
+
"docs/architecture.md": "# Architecture\n\nThe app uses React Router Framework Mode with Vite. `ssr: false` and `prerender: true` emit real HTML for every statically declared route. Static files in `build/client/` can be served beside a future PHP backend without a production Node process. Mozole fingerprints relevant inputs under `.mozole/state/`; unchanged successful verification and QA are reused, while `--force` requests fresh evidence. Codex and Claude Code use the shared root instructions; Antigravity workspace MCP, rules, and workflows live under `.agents/` and share the same CCE index.\n",
|
|
209
|
+
"README.md": `# ${name}\n\nStatic-first React Router Framework Mode project generated by Mozole for Codex, Claude Code, and Google Antigravity.\n\n## Start\n\n\`\`\`sh\nnpm run dev\n\`\`\`\n\nDependencies and test tools are pre-installed by \`mozole new\`. Run \`npm run verify\` before handoff and \`npm run qa\` for screenshot-free browser checks. Unchanged successful checks are reused; use \`--force\` for intentionally fresh evidence. Visual QA is explicit only. Antigravity workspace integration is under \`.agents/\`. Production files are emitted to \`build/client/\`.\n`,
|
|
212
210
|
};
|
|
213
|
-
if (options.
|
|
214
|
-
Object.assign(files,
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
"
|
|
219
|
-
|
|
211
|
+
if (options.backend) {
|
|
212
|
+
Object.assign(files, backendTemplates(name));
|
|
213
|
+
}
|
|
214
|
+
if (isScaffold) {
|
|
215
|
+
for (const file of [
|
|
216
|
+
".context-engine.yaml",
|
|
217
|
+
".agents/mcp_config.json",
|
|
218
|
+
".agents/rules/mozole.md",
|
|
219
|
+
".agents/workflows/mozole-verify.md",
|
|
220
|
+
".agents/workflows/mozole-qa.md",
|
|
221
|
+
".agents/workflows/mozole-qa-interactive.md",
|
|
222
|
+
".agents/workflows/mozole-qa-visual.md",
|
|
223
|
+
".codex/hooks.json",
|
|
224
|
+
".claude/settings.json",
|
|
225
|
+
"AGENTS.md",
|
|
226
|
+
"CLAUDE.md",
|
|
227
|
+
"docs/design-tokens.md",
|
|
228
|
+
]) {
|
|
229
|
+
delete files[file];
|
|
230
|
+
}
|
|
231
|
+
files["docs/architecture.md"] = options.backend
|
|
232
|
+
? "# Architecture\n\nThis project is in scaffold mode: it omits Mozole CCE, governor, telemetry, and agent-integration tooling. React Router Framework Mode with `ssr: false` and `prerender: true` emits static HTML into `build/client/`. The PHP backend in `api/` serves dynamic endpoints through Vite's local dev proxy and Apache/LiteSpeed `.htaccess` rewrite rules in production.\n"
|
|
233
|
+
: "# Architecture\n\nThis project is in scaffold mode: it omits Mozole CCE, governor, telemetry, and agent-integration tooling. React Router Framework Mode with `ssr: false` and `prerender: true` emits HTML for every declared route. Serve static files from `build/client/` on any static host.\n";
|
|
234
|
+
files["README.md"] = options.backend
|
|
235
|
+
? `# ${name}\n\nStatic-first React Router Framework Mode project with native PHP backend generated by Mozole in scaffold mode.\n\n## Start\n\n\`\`\`sh\nnpm run dev\n\`\`\`\n\nIn a separate terminal, start the PHP API server:\n\n\`\`\`sh\nnpm run dev:api\n\`\`\`\n\nRun \`npm run verify\` before handoff. Production client files are emitted to \`build/client/\` and backend endpoints live in \`api/\`.\n`
|
|
236
|
+
: `# ${name}\n\nStatic-first React Router Framework Mode project generated by Mozole in scaffold mode. CCE, governor, telemetry, and agent-integration tooling are intentionally not installed.\n\n## Start\n\n\`\`\`sh\nnpm run dev\n\`\`\`\n\nRun \`npm run verify\` before handoff. Production files are emitted to \`build/client/\`.\n`;
|
|
237
|
+
}
|
|
220
238
|
return files;
|
|
221
239
|
}
|
|
222
240
|
//# sourceMappingURL=templates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"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"}
|
package/dist/telemetry/store.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
1
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
export const emptyTelemetry = () => ({
|
|
4
4
|
schemaVersion: 1,
|
|
@@ -65,7 +65,11 @@ export async function readTelemetry(root) {
|
|
|
65
65
|
export async function updateTelemetry(root, update) {
|
|
66
66
|
const value = await readTelemetry(root);
|
|
67
67
|
update(value);
|
|
68
|
-
|
|
69
|
-
await
|
|
68
|
+
const targetDir = path.join(root, ".mozole");
|
|
69
|
+
await mkdir(targetDir, { recursive: true });
|
|
70
|
+
const targetFile = path.join(targetDir, "telemetry.json");
|
|
71
|
+
const temporary = `${targetFile}.${process.pid}.tmp`;
|
|
72
|
+
await writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
73
|
+
await rename(temporary, targetFile);
|
|
70
74
|
}
|
|
71
75
|
//# sourceMappingURL=store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/telemetry/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/telemetry/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/verify/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAMzD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,SAAS,UAAW,MAAM,KAAG,MAAiC,CAAC;AAE5E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAoBpE;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACjE,OAAO,CAAC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/verify/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAMzD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,SAAS,UAAW,MAAM,KAAG,MAAiC,CAAC;AAE5E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAoBpE;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACjE,OAAO,CAAC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CA+FtE"}
|
package/dist/verify/runner.js
CHANGED
|
@@ -2,7 +2,7 @@ import { access } from "node:fs/promises";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { npmExecutable, resolveExecutable } from "../platform/executable.js";
|
|
4
4
|
import { run } from "../platform/process.js";
|
|
5
|
-
import {
|
|
5
|
+
import { inspectBackendScaffold } from "../scaffold/backend.js";
|
|
6
6
|
import { updateTelemetry } from "../telemetry/store.js";
|
|
7
7
|
const ansi = new RegExp(`${String.fromCharCode(27)}\\[[0-?]*[ -/]*[@-~]`, "g");
|
|
8
8
|
export const stripAnsi = (value) => value.replace(ansi, "");
|
|
@@ -42,19 +42,19 @@ export async function runVerification(root, config, signal, onStep) {
|
|
|
42
42
|
...config.verifiers,
|
|
43
43
|
];
|
|
44
44
|
const results = [];
|
|
45
|
-
const
|
|
46
|
-
const total = checks.length +
|
|
47
|
-
if (config.
|
|
48
|
-
onStep?.("
|
|
49
|
-
const
|
|
45
|
+
const backendOffset = config.backend?.enabled ? 1 : 0;
|
|
46
|
+
const total = checks.length + backendOffset;
|
|
47
|
+
if (config.backend?.enabled) {
|
|
48
|
+
onStep?.("backend", 1, total);
|
|
49
|
+
const backend = await inspectBackendScaffold(root, config);
|
|
50
50
|
results.push({
|
|
51
|
-
name: "
|
|
52
|
-
passed:
|
|
53
|
-
detail:
|
|
54
|
-
rawChars:
|
|
51
|
+
name: "backend",
|
|
52
|
+
passed: backend.healthy,
|
|
53
|
+
detail: backend.healthy ? undefined : backend.detail,
|
|
54
|
+
rawChars: backend.detail.length,
|
|
55
55
|
});
|
|
56
|
-
if (!
|
|
57
|
-
const body = `VERIFY FAIL\n\
|
|
56
|
+
if (!backend.healthy) {
|
|
57
|
+
const body = `VERIFY FAIL\n\nbackend ✗\n\n${backend.detail}`;
|
|
58
58
|
return { results, output: body, passed: false };
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -62,7 +62,7 @@ export async function runVerification(root, config, signal, onStep) {
|
|
|
62
62
|
const check = checks[i];
|
|
63
63
|
if (!check)
|
|
64
64
|
continue;
|
|
65
|
-
onStep?.(check.name, i + 1 +
|
|
65
|
+
onStep?.(check.name, i + 1 + backendOffset, total);
|
|
66
66
|
let result;
|
|
67
67
|
try {
|
|
68
68
|
result = await run(check.command, check.args, {
|
|
@@ -96,9 +96,12 @@ export async function runVerification(root, config, signal, onStep) {
|
|
|
96
96
|
break;
|
|
97
97
|
}
|
|
98
98
|
const passed = results.length === total && results.every((result) => result.passed);
|
|
99
|
-
const
|
|
99
|
+
const resultBody = passed
|
|
100
100
|
? `VERIFY PASS\n\n${results.map((result) => `${result.name.padEnd(10)} ✓`).join("\n")}`
|
|
101
101
|
: `VERIFY FAIL\n\n${results.map((result) => `${result.name.padEnd(10)} ${result.passed ? "✓" : "✗"}`).join("\n")}\n\n${results.find((result) => !result.passed)?.detail ?? "Unknown failure"}`;
|
|
102
|
+
const body = config.mode === "scaffold"
|
|
103
|
+
? `${resultBody}\n\nSCAFFOLD MODE\nCCE, governor, telemetry, and agent instructions are intentionally absent.`
|
|
104
|
+
: resultBody;
|
|
102
105
|
if (config.telemetry.enabled)
|
|
103
106
|
await updateTelemetry(root, (telemetry) => {
|
|
104
107
|
telemetry.verification.runs++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/verify/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAkB,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/verify/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mozole/cli",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.2",
|
|
4
4
|
"description": "Static-first React Router bootstrap and agent harness",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
"README.md",
|
|
12
12
|
"LICENSE"
|
|
13
13
|
],
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
14
17
|
"engines": {
|
|
15
18
|
"node": ">=22"
|
|
16
19
|
},
|
package/dist/scaffold/admin.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { MozoleConfig } from "../config/project.js";
|
|
2
|
-
export interface AdminScaffoldInspection {
|
|
3
|
-
enabled: boolean;
|
|
4
|
-
healthy: boolean;
|
|
5
|
-
detail: string;
|
|
6
|
-
}
|
|
7
|
-
export declare function inspectAdminScaffold(root: string, config: MozoleConfig): Promise<AdminScaffoldInspection>;
|
|
8
|
-
//# sourceMappingURL=admin.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/scaffold/admin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,uBAAuB,CAAC,CAkDlC"}
|
package/dist/scaffold/admin.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
export async function inspectAdminScaffold(root, config) {
|
|
4
|
-
if (!config.admin?.enabled)
|
|
5
|
-
return { enabled: false, healthy: true, detail: "static-only project" };
|
|
6
|
-
const requiredFiles = [
|
|
7
|
-
"app/admin/session.server.ts",
|
|
8
|
-
"app/admin/layout.tsx",
|
|
9
|
-
"app/admin/login.tsx",
|
|
10
|
-
"app/admin/dashboard.tsx",
|
|
11
|
-
];
|
|
12
|
-
try {
|
|
13
|
-
const [routerConfig, routes, packageText, ...adminFiles] = await Promise.all([
|
|
14
|
-
readFile(path.join(root, "react-router.config.ts"), "utf8"),
|
|
15
|
-
readFile(path.join(root, "app", "routes.ts"), "utf8"),
|
|
16
|
-
readFile(path.join(root, "package.json"), "utf8"),
|
|
17
|
-
...requiredFiles.map((relative) => readFile(path.join(root, ...relative.split("/")), "utf8")),
|
|
18
|
-
]);
|
|
19
|
-
const pkg = JSON.parse(packageText);
|
|
20
|
-
const prerendered = ["/", "/about", "/contact"].every((route) => routerConfig.includes(`"${route}"`));
|
|
21
|
-
const healthy = /ssr:\s*true/.test(routerConfig) &&
|
|
22
|
-
prerendered &&
|
|
23
|
-
!routerConfig.includes('"/admin"') &&
|
|
24
|
-
routes.includes('route("admin"') &&
|
|
25
|
-
routes.includes('route("admin/login"') &&
|
|
26
|
-
adminFiles.every((contents) => contents.length > 0) &&
|
|
27
|
-
Boolean(pkg.dependencies?.["@react-router/serve"]) &&
|
|
28
|
-
pkg.scripts?.start === "react-router-serve build/server/index.js";
|
|
29
|
-
return {
|
|
30
|
-
enabled: true,
|
|
31
|
-
healthy,
|
|
32
|
-
detail: healthy
|
|
33
|
-
? "Node runtime required; /admin excluded from prerender"
|
|
34
|
-
: "admin runtime files or hybrid rendering config are incomplete",
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
catch (error) {
|
|
38
|
-
return {
|
|
39
|
-
enabled: true,
|
|
40
|
-
healthy: false,
|
|
41
|
-
detail: `admin runtime files missing: ${error instanceof Error ? error.message : String(error)}`,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=admin.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/scaffold/admin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAY,EACZ,MAAoB;IAEpB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO;QACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAE1E,MAAM,aAAa,GAAG;QACpB,6BAA6B;QAC7B,sBAAsB;QACtB,qBAAqB;QACrB,yBAAyB;KAC1B,CAAC;IACF,IAAI,CAAC;QACH,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,GACtD,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,EAAE,MAAM,CAAC;YAC3D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC;YACrD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC;YACjD,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAChC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAC1D;SACF,CAAC,CAAC;QACL,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAGjC,CAAC;QACF,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAC9D,YAAY,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC,CACpC,CAAC;QACF,MAAM,OAAO,GACX,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC;YAChC,WAAW;YACX,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC;YAClC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;YAChC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YACtC,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,qBAAqB,CAAC,CAAC;YAClD,GAAG,CAAC,OAAO,EAAE,KAAK,KAAK,0CAA0C,CAAC;QACpE,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO;YACP,MAAM,EAAE,OAAO;gBACb,CAAC,CAAC,uDAAuD;gBACzD,CAAC,CAAC,+DAA+D;SACpE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SACjG,CAAC;IACJ,CAAC;AACH,CAAC"}
|