@mozole/cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +196 -0
  3. package/dist/cli.d.ts +4 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +85 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/adopt.d.ts +4 -0
  8. package/dist/commands/adopt.d.ts.map +1 -0
  9. package/dist/commands/adopt.js +258 -0
  10. package/dist/commands/adopt.js.map +1 -0
  11. package/dist/commands/doctor.d.ts +4 -0
  12. package/dist/commands/doctor.d.ts.map +1 -0
  13. package/dist/commands/doctor.js +241 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/logs.d.ts +3 -0
  16. package/dist/commands/logs.d.ts.map +1 -0
  17. package/dist/commands/logs.js +32 -0
  18. package/dist/commands/logs.js.map +1 -0
  19. package/dist/commands/new.d.ts +3 -0
  20. package/dist/commands/new.d.ts.map +1 -0
  21. package/dist/commands/new.js +84 -0
  22. package/dist/commands/new.js.map +1 -0
  23. package/dist/commands/qa.d.ts +7 -0
  24. package/dist/commands/qa.d.ts.map +1 -0
  25. package/dist/commands/qa.js +95 -0
  26. package/dist/commands/qa.js.map +1 -0
  27. package/dist/commands/stats.d.ts +19 -0
  28. package/dist/commands/stats.d.ts.map +1 -0
  29. package/dist/commands/stats.js +100 -0
  30. package/dist/commands/stats.js.map +1 -0
  31. package/dist/commands/verify.d.ts +5 -0
  32. package/dist/commands/verify.d.ts.map +1 -0
  33. package/dist/commands/verify.js +53 -0
  34. package/dist/commands/verify.js.map +1 -0
  35. package/dist/config/project.d.ts +43 -0
  36. package/dist/config/project.d.ts.map +1 -0
  37. package/dist/config/project.js +57 -0
  38. package/dist/config/project.js.map +1 -0
  39. package/dist/context/cce.d.ts +8 -0
  40. package/dist/context/cce.d.ts.map +1 -0
  41. package/dist/context/cce.js +72 -0
  42. package/dist/context/cce.js.map +1 -0
  43. package/dist/governor/fingerprint.d.ts +7 -0
  44. package/dist/governor/fingerprint.d.ts.map +1 -0
  45. package/dist/governor/fingerprint.js +109 -0
  46. package/dist/governor/fingerprint.js.map +1 -0
  47. package/dist/governor/hook.d.ts +10 -0
  48. package/dist/governor/hook.d.ts.map +1 -0
  49. package/dist/governor/hook.js +127 -0
  50. package/dist/governor/hook.js.map +1 -0
  51. package/dist/governor/state.d.ts +35 -0
  52. package/dist/governor/state.d.ts.map +1 -0
  53. package/dist/governor/state.js +55 -0
  54. package/dist/governor/state.js.map +1 -0
  55. package/dist/integrations/antigravity.d.ts +20 -0
  56. package/dist/integrations/antigravity.d.ts.map +1 -0
  57. package/dist/integrations/antigravity.js +145 -0
  58. package/dist/integrations/antigravity.js.map +1 -0
  59. package/dist/output.d.ts +5 -0
  60. package/dist/output.d.ts.map +1 -0
  61. package/dist/output.js +2 -0
  62. package/dist/output.js.map +1 -0
  63. package/dist/platform/executable.d.ts +7 -0
  64. package/dist/platform/executable.d.ts.map +1 -0
  65. package/dist/platform/executable.js +35 -0
  66. package/dist/platform/executable.js.map +1 -0
  67. package/dist/platform/process.d.ts +24 -0
  68. package/dist/platform/process.d.ts.map +1 -0
  69. package/dist/platform/process.js +107 -0
  70. package/dist/platform/process.js.map +1 -0
  71. package/dist/qa/runner.d.ts +26 -0
  72. package/dist/qa/runner.d.ts.map +1 -0
  73. package/dist/qa/runner.js +322 -0
  74. package/dist/qa/runner.js.map +1 -0
  75. package/dist/qa/server.d.ts +10 -0
  76. package/dist/qa/server.d.ts.map +1 -0
  77. package/dist/qa/server.js +131 -0
  78. package/dist/qa/server.js.map +1 -0
  79. package/dist/scaffold/templates.d.ts +4 -0
  80. package/dist/scaffold/templates.d.ts.map +1 -0
  81. package/dist/scaffold/templates.js +186 -0
  82. package/dist/scaffold/templates.js.map +1 -0
  83. package/dist/scaffold/write.d.ts +2 -0
  84. package/dist/scaffold/write.d.ts.map +1 -0
  85. package/dist/scaffold/write.js +24 -0
  86. package/dist/scaffold/write.js.map +1 -0
  87. package/dist/telemetry/store.d.ts +27 -0
  88. package/dist/telemetry/store.d.ts.map +1 -0
  89. package/dist/telemetry/store.js +59 -0
  90. package/dist/telemetry/store.js.map +1 -0
  91. package/dist/verify/runner.d.ts +15 -0
  92. package/dist/verify/runner.d.ts.map +1 -0
  93. package/dist/verify/runner.js +91 -0
  94. package/dist/verify/runner.js.map +1 -0
  95. package/dist/version.d.ts +35 -0
  96. package/dist/version.d.ts.map +1 -0
  97. package/dist/version.js +35 -0
  98. package/dist/version.js.map +1 -0
  99. package/package.json +53 -0
@@ -0,0 +1,186 @@
1
+ import { cceMcpServer } from "../integrations/antigravity.js";
2
+ import { TOOLCHAIN } from "../version.js";
3
+ export function projectConfig(name) {
4
+ return {
5
+ schemaVersion: 1,
6
+ name,
7
+ framework: "react-router",
8
+ routes: ["/", "/about", "/contact"],
9
+ qa: {
10
+ viewports: [
11
+ { width: 375, height: 812 },
12
+ { width: 768, height: 1024 },
13
+ { width: 1440, height: 900 },
14
+ ],
15
+ server: {
16
+ command: "npm",
17
+ args: ["run", "dev", "--", "--host", "127.0.0.1"],
18
+ readinessPath: "/",
19
+ preferredPort: 4173,
20
+ },
21
+ },
22
+ cce: { enabled: true, initialized: false, command: "cce init --agent all" },
23
+ governor: {
24
+ enabled: true,
25
+ mode: "warn",
26
+ hooks: { codex: true, claude: true },
27
+ },
28
+ telemetry: { enabled: true },
29
+ verifiers: [],
30
+ };
31
+ }
32
+ const json = (value) => `${JSON.stringify(value, null, 2)}\n`;
33
+ export function projectTemplates(name) {
34
+ const cliSpec = process.env.MOZOLE_CLI_SPEC ?? TOOLCHAIN.mozoleCli;
35
+ const packageJson = {
36
+ name,
37
+ private: true,
38
+ version: "0.1.0",
39
+ type: "module",
40
+ engines: { node: TOOLCHAIN.node },
41
+ scripts: {
42
+ dev: "react-router dev",
43
+ build: "react-router build",
44
+ preview: "vite preview --host 127.0.0.1",
45
+ lint: "biome check .",
46
+ format: "biome format --write .",
47
+ typecheck: "react-router typegen && tsc --noEmit",
48
+ test: "vitest",
49
+ "test:run": "vitest run",
50
+ verify: "mozole verify",
51
+ "verify:force": "mozole verify --force",
52
+ qa: "mozole qa",
53
+ "qa:force": "mozole qa --force",
54
+ "qa:interactive": "mozole qa --interactive",
55
+ "qa:visual": "mozole qa --visual",
56
+ },
57
+ dependencies: {
58
+ "@react-router/node": TOOLCHAIN.reactRouter,
59
+ isbot: TOOLCHAIN.isbot,
60
+ react: TOOLCHAIN.react,
61
+ "react-dom": TOOLCHAIN.reactDom,
62
+ "react-router": TOOLCHAIN.reactRouter,
63
+ },
64
+ devDependencies: {
65
+ "@biomejs/biome": TOOLCHAIN.biome,
66
+ "@mozole/cli": cliSpec,
67
+ "@playwright/test": TOOLCHAIN.playwright,
68
+ "@react-router/dev": TOOLCHAIN.reactRouter,
69
+ "@testing-library/jest-dom": TOOLCHAIN.testingLibraryJestDom,
70
+ "@testing-library/react": TOOLCHAIN.testingLibraryReact,
71
+ "@testing-library/user-event": TOOLCHAIN.testingLibraryUserEvent,
72
+ "@types/node": TOOLCHAIN.typesNode,
73
+ "@types/react": TOOLCHAIN.typesReact,
74
+ "@types/react-dom": TOOLCHAIN.typesReactDom,
75
+ "@vitejs/plugin-react": TOOLCHAIN.viteReact,
76
+ jsdom: TOOLCHAIN.jsdom,
77
+ typescript: TOOLCHAIN.typescript,
78
+ vite: TOOLCHAIN.vite,
79
+ vitest: TOOLCHAIN.vitest,
80
+ },
81
+ };
82
+ return {
83
+ "package.json": json(packageJson),
84
+ ".mozole/project.json": json(projectConfig(name)),
85
+ ".mozole/toolchain.json": json(TOOLCHAIN),
86
+ ".gitignore": "node_modules/\nbuild/\n.react-router/\ncoverage/\n.mozole/logs/\n.mozole/qa/\n.mozole/state/\n.mozole/telemetry.json\n.cce/\n.DS_Store\n*.log\n",
87
+ ".context-engine.yaml": "retrieval:\n top_k: 20\n confidence_threshold: 0.5\ncompression:\n level: standard\n output: standard\n",
88
+ ".agents/mcp_config.json": json({
89
+ mcpServers: { "mozole-cce": cceMcpServer() },
90
+ }),
91
+ ".agents/rules/mozole.md": "Follow the shared project contract in `AGENTS.md`. Use CCE for targeted repository retrieval; prefer diffs or changed regions over repeated broad reads. Use `mozole verify` and screenshot-free `mozole qa`; avoid unchanged successful reruns. Screenshots and Antigravity browser inspection are for explicit visual review or a confirmed issue requiring visual judgment. Keep routine narration concise and stop when requested work is complete, verified, and has no unresolved issue.\n",
92
+ ".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",
93
+ ".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",
94
+ ".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",
95
+ ".agents/workflows/mozole-qa-visual.md": "Run `mozole qa --visual`. This workflow explicitly permits the generated visual artifacts under `.mozole/qa/`. Reuse current artifacts unless the user intentionally requests fresh capture with `--force`; inspect only the routes and viewports relevant to the task.\n",
96
+ ".codex/hooks.json": json({
97
+ description: "Optional advisory Mozole token-governor hooks.",
98
+ hooks: {
99
+ PreToolUse: [
100
+ {
101
+ matcher: "Bash|.*[Rr]ead.*",
102
+ hooks: [
103
+ {
104
+ type: "command",
105
+ command: "npx --no-install mozole governor hook codex",
106
+ commandWindows: "npx --no-install mozole governor hook codex",
107
+ timeout: 10,
108
+ additionalContextLimit: 300,
109
+ },
110
+ ],
111
+ },
112
+ ],
113
+ },
114
+ }),
115
+ ".claude/settings.json": json({
116
+ hooks: {
117
+ PreToolUse: [
118
+ {
119
+ matcher: "Read|Bash",
120
+ hooks: [
121
+ {
122
+ type: "command",
123
+ command: "npx --no-install mozole governor hook claude",
124
+ timeout: 10,
125
+ },
126
+ ],
127
+ },
128
+ ],
129
+ },
130
+ }),
131
+ "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',
132
+ "vite.config.ts": 'import { reactRouter } from "@react-router/dev/vite";\nimport { defineConfig } from "vite";\n\nexport default defineConfig({ plugins: [reactRouter()] });\n',
133
+ "tsconfig.json": json({
134
+ include: ["**/*", ".react-router/types/**/*"],
135
+ compilerOptions: {
136
+ lib: ["DOM", "DOM.Iterable", "ES2023"],
137
+ types: ["node", "vite/client", "vitest/globals"],
138
+ target: "ES2023",
139
+ module: "ESNext",
140
+ moduleResolution: "Bundler",
141
+ jsx: "react-jsx",
142
+ strict: true,
143
+ noUncheckedIndexedAccess: true,
144
+ exactOptionalPropertyTypes: true,
145
+ isolatedModules: true,
146
+ resolveJsonModule: true,
147
+ esModuleInterop: true,
148
+ skipLibCheck: true,
149
+ noEmit: true,
150
+ rootDirs: [".", "./.react-router/types"],
151
+ paths: { "~/*": ["./app/*"] },
152
+ },
153
+ }),
154
+ "biome.json": json({
155
+ $schema: "https://biomejs.dev/schemas/2.5.11/schema.json",
156
+ files: {
157
+ includes: [
158
+ "**",
159
+ "!build",
160
+ "!.react-router",
161
+ "!node_modules",
162
+ "!coverage",
163
+ "!.mozole/qa",
164
+ ],
165
+ },
166
+ formatter: { enabled: true, indentStyle: "space", indentWidth: 2 },
167
+ linter: { enabled: true, rules: { preset: "recommended" } },
168
+ javascript: { formatter: { quoteStyle: "double", semicolons: "always" } },
169
+ json: { formatter: { expand: "always" } },
170
+ }),
171
+ "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',
172
+ "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',
173
+ "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',
174
+ "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',
175
+ "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',
176
+ "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',
177
+ "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",
178
+ "tests/setup.ts": 'import "@testing-library/jest-dom/vitest";\n',
179
+ "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',
180
+ "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\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## Efficient agent workflow\n\nRetrieve exact CCE symbols/chunks before broad reads; request more context when needed. Prefer a localized patch, inspect `git diff`, then verify. Do not reread unchanged files or repeat current verification/QA without a concrete reason (`--force` requests fresh evidence). Prefer action over routine narration: do not restate the request, obvious tool calls, existing code, or successful logs. Once requested changes are complete, verification and relevant QA pass, and no known issue remains, stop exploring. Keep completion concise: changed, verified, unresolved. Normal QA never takes screenshots; visual QA is explicit only.\n",
181
+ "CLAUDE.md": "@AGENTS.md\n",
182
+ "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",
183
+ "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 install\nnpm run dev\n\`\`\`\n\nRun \`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`,
184
+ };
185
+ }
186
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function writeFiles(root: string, files: Record<string, string>, overwrite?: boolean): Promise<string[]>;
2
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/scaffold/write.ts"],"names":[],"mappings":"AAGA,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,SAAS,UAAQ,GAChB,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBnB"}
@@ -0,0 +1,24 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ export async function writeFiles(root, files, overwrite = false) {
4
+ const written = [];
5
+ for (const [relative, contents] of Object.entries(files)) {
6
+ if (path.isAbsolute(relative) || relative.split(/[\\/]/).includes(".."))
7
+ throw new Error(`Unsafe template path: ${relative}`);
8
+ const target = path.join(root, ...relative.split("/"));
9
+ await mkdir(path.dirname(target), { recursive: true });
10
+ try {
11
+ await writeFile(target, contents, {
12
+ encoding: "utf8",
13
+ flag: overwrite ? "w" : "wx",
14
+ });
15
+ written.push(relative);
16
+ }
17
+ catch (error) {
18
+ if (error.code !== "EEXIST" || overwrite)
19
+ throw error;
20
+ }
21
+ }
22
+ return written;
23
+ }
24
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/scaffold/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,KAA6B,EAC7B,SAAS,GAAG,KAAK;IAEjB,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE;gBAChC,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;aAC7B,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS;gBACjE,MAAM,KAAK,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,27 @@
1
+ export interface Telemetry {
2
+ schemaVersion: 1;
3
+ verification: {
4
+ runs: number;
5
+ rawChars: number;
6
+ deliveredChars: number;
7
+ avoidedRuns: number;
8
+ };
9
+ qa: {
10
+ runs: number;
11
+ probes: number;
12
+ screenshots: number;
13
+ visualRuns: number;
14
+ avoidedRuns: number;
15
+ browserLaunchesAvoided: number;
16
+ reusedVisualArtifacts: number;
17
+ };
18
+ governor: {
19
+ repeatedReadWarnings: number;
20
+ repeatedWorkWarnings: number;
21
+ modelFacingDiagnosticChars: number;
22
+ };
23
+ }
24
+ export declare const emptyTelemetry: () => Telemetry;
25
+ export declare function readTelemetry(root: string): Promise<Telemetry>;
26
+ export declare function updateTelemetry(root: string, update: (value: Telemetry) => void): Promise<void>;
27
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/telemetry/store.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,CAAC,CAAC;IACjB,YAAY,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,EAAE,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,qBAAqB,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF,QAAQ,EAAE;QACR,oBAAoB,EAAE,MAAM,CAAC;QAC7B,oBAAoB,EAAE,MAAM,CAAC;QAC7B,0BAA0B,EAAE,MAAM,CAAC;KACpC,CAAC;CACH;AACD,eAAO,MAAM,cAAc,QAAO,SAiBhC,CAAC;AAKH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAiCpE;AACD,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GACjC,OAAO,CAAC,IAAI,CAAC,CASf"}
@@ -0,0 +1,59 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ export const emptyTelemetry = () => ({
4
+ schemaVersion: 1,
5
+ verification: { runs: 0, rawChars: 0, deliveredChars: 0, avoidedRuns: 0 },
6
+ qa: {
7
+ runs: 0,
8
+ probes: 0,
9
+ screenshots: 0,
10
+ visualRuns: 0,
11
+ avoidedRuns: 0,
12
+ browserLaunchesAvoided: 0,
13
+ reusedVisualArtifacts: 0,
14
+ },
15
+ governor: {
16
+ repeatedReadWarnings: 0,
17
+ repeatedWorkWarnings: 0,
18
+ modelFacingDiagnosticChars: 0,
19
+ },
20
+ });
21
+ const count = (value) => typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
22
+ export async function readTelemetry(root) {
23
+ try {
24
+ const value = JSON.parse(await readFile(path.join(root, ".mozole", "telemetry.json"), "utf8"));
25
+ return {
26
+ schemaVersion: 1,
27
+ verification: {
28
+ runs: count(value.verification?.runs),
29
+ rawChars: count(value.verification?.rawChars),
30
+ deliveredChars: count(value.verification?.deliveredChars),
31
+ avoidedRuns: count(value.verification?.avoidedRuns),
32
+ },
33
+ qa: {
34
+ runs: count(value.qa?.runs),
35
+ probes: count(value.qa?.probes),
36
+ screenshots: count(value.qa?.screenshots),
37
+ visualRuns: count(value.qa?.visualRuns),
38
+ avoidedRuns: count(value.qa?.avoidedRuns),
39
+ browserLaunchesAvoided: count(value.qa?.browserLaunchesAvoided),
40
+ reusedVisualArtifacts: count(value.qa?.reusedVisualArtifacts),
41
+ },
42
+ governor: {
43
+ repeatedReadWarnings: count(value.governor?.repeatedReadWarnings),
44
+ repeatedWorkWarnings: count(value.governor?.repeatedWorkWarnings),
45
+ modelFacingDiagnosticChars: count(value.governor?.modelFacingDiagnosticChars),
46
+ },
47
+ };
48
+ }
49
+ catch {
50
+ return emptyTelemetry();
51
+ }
52
+ }
53
+ export async function updateTelemetry(root, update) {
54
+ const value = await readTelemetry(root);
55
+ update(value);
56
+ await mkdir(path.join(root, ".mozole"), { recursive: true });
57
+ await writeFile(path.join(root, ".mozole", "telemetry.json"), `${JSON.stringify(value, null, 2)}\n`, "utf8");
58
+ }
59
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/telemetry/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { MozoleConfig } from "../config/project.js";
2
+ export interface CheckResult {
3
+ name: string;
4
+ passed: boolean;
5
+ detail?: string | undefined;
6
+ rawChars: number;
7
+ }
8
+ export declare const stripAnsi: (value: string) => string;
9
+ export declare function actionableFailure(output: string, limit?: number): string;
10
+ export declare function runVerification(root: string, config: MozoleConfig, signal?: AbortSignal): Promise<{
11
+ results: CheckResult[];
12
+ output: string;
13
+ passed: boolean;
14
+ }>;
15
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +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;AAKzD,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,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAuEtE"}
@@ -0,0 +1,91 @@
1
+ import { access } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { npmExecutable, resolveExecutable } from "../platform/executable.js";
4
+ import { run } from "../platform/process.js";
5
+ import { updateTelemetry } from "../telemetry/store.js";
6
+ const ansi = new RegExp(`${String.fromCharCode(27)}\\[[0-?]*[ -/]*[@-~]`, "g");
7
+ export const stripAnsi = (value) => value.replace(ansi, "");
8
+ export function actionableFailure(output, limit = 18) {
9
+ const clean = stripAnsi(output)
10
+ .split(/\r?\n/)
11
+ .map((line) => line.trimEnd());
12
+ const meaningful = clean.filter((line) => line.trim() &&
13
+ !/^\s*(npm (warn|notice)|at async |at process\.)/i.test(line));
14
+ const failureIndex = meaningful.findIndex((line) => /error|failed|expected|received|×|✗/i.test(line));
15
+ const start = failureIndex < 0
16
+ ? Math.max(0, meaningful.length - limit)
17
+ : Math.max(0, failureIndex - 3);
18
+ return meaningful
19
+ .slice(start, start + limit)
20
+ .join("\n")
21
+ .slice(0, 4000);
22
+ }
23
+ export async function runVerification(root, config, signal) {
24
+ const optionalChecks = [];
25
+ try {
26
+ await access(path.join(root, "composer.json"));
27
+ const composer = await resolveExecutable("composer");
28
+ optionalChecks.push({
29
+ name: "composer",
30
+ command: composer ?? "composer",
31
+ args: ["validate", "--no-check-publish"],
32
+ });
33
+ }
34
+ catch { }
35
+ const checks = [
36
+ { name: "lint", command: npmExecutable(), args: ["run", "lint"] },
37
+ { name: "typecheck", command: npmExecutable(), args: ["run", "typecheck"] },
38
+ { name: "tests", command: npmExecutable(), args: ["run", "test:run"] },
39
+ { name: "build", command: npmExecutable(), args: ["run", "build"] },
40
+ ...optionalChecks,
41
+ ...config.verifiers,
42
+ ];
43
+ const results = [];
44
+ for (const check of checks) {
45
+ let result;
46
+ try {
47
+ result = await run(check.command, check.args, {
48
+ cwd: root,
49
+ timeoutMs: 600_000,
50
+ signal,
51
+ logFile: path.join(root, ".mozole", "logs", `verify-${check.name}.log`),
52
+ });
53
+ }
54
+ catch (error) {
55
+ if (signal?.aborted)
56
+ throw error;
57
+ const detail = `Unable to execute ${check.command}: ${error instanceof Error ? error.message : String(error)}`;
58
+ results.push({
59
+ name: check.name,
60
+ passed: false,
61
+ detail,
62
+ rawChars: detail.length,
63
+ });
64
+ break;
65
+ }
66
+ signal?.throwIfAborted();
67
+ const combined = `${result.stdout}\n${result.stderr}`;
68
+ results.push({
69
+ name: check.name,
70
+ passed: result.exitCode === 0,
71
+ detail: result.exitCode === 0 ? undefined : actionableFailure(combined),
72
+ rawChars: combined.length,
73
+ });
74
+ if (result.exitCode !== 0)
75
+ break;
76
+ }
77
+ const passed = results.length === checks.length &&
78
+ results.every((result) => result.passed);
79
+ const body = passed
80
+ ? `VERIFY PASS\n\n${results.map((result) => `${result.name.padEnd(10)} ✓`).join("\n")}`
81
+ : `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"}`;
82
+ if (config.telemetry.enabled)
83
+ await updateTelemetry(root, (telemetry) => {
84
+ telemetry.verification.runs++;
85
+ telemetry.verification.rawChars += results.reduce((sum, result) => sum + result.rawChars, 0);
86
+ telemetry.verification.deliveredChars += body.length;
87
+ telemetry.governor.modelFacingDiagnosticChars += body.length;
88
+ });
89
+ return { results, output: body, passed };
90
+ }
91
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/verify/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export declare const CLI_VERSION = "1.0.0";
2
+ export declare const TOOLCHAIN: Readonly<{
3
+ schemaVersion: 1;
4
+ mozoleCli: "1.0.0";
5
+ node: ">=22";
6
+ react: "19.2.8";
7
+ reactDom: "19.2.8";
8
+ reactRouter: "8.3.1";
9
+ isbot: "5.2.2";
10
+ vite: "8.2.2";
11
+ viteReact: "6.1.1";
12
+ typescript: "7.0.2";
13
+ biome: "2.5.11";
14
+ vitest: "4.1.11";
15
+ playwright: "1.62.1";
16
+ testingLibraryReact: "16.3.3";
17
+ testingLibraryJestDom: "7.0.1";
18
+ testingLibraryUserEvent: "14.6.6";
19
+ jsdom: "30.0.1";
20
+ typesNode: "26.4.0";
21
+ typesReact: "19.2.18";
22
+ typesReactDom: "19.2.5";
23
+ cce: {
24
+ package: string;
25
+ version: string;
26
+ command: string;
27
+ integration: string;
28
+ };
29
+ antigravity: {
30
+ runtime: string;
31
+ workspace: string;
32
+ mcpServer: string;
33
+ };
34
+ }>;
35
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;QAsBlB,OAAO;QACP,OAAO;QACP,OAAO;QACP,WAAW;;;QAIX,OAAO;QACP,SAAS;QACT,SAAS;;EAEX,CAAC"}
@@ -0,0 +1,35 @@
1
+ export const CLI_VERSION = "1.0.0";
2
+ export const TOOLCHAIN = Object.freeze({
3
+ schemaVersion: 1,
4
+ mozoleCli: CLI_VERSION,
5
+ node: ">=22",
6
+ react: "19.2.8",
7
+ reactDom: "19.2.8",
8
+ reactRouter: "8.3.1",
9
+ isbot: "5.2.2",
10
+ vite: "8.2.2",
11
+ viteReact: "6.1.1",
12
+ typescript: "7.0.2",
13
+ biome: "2.5.11",
14
+ vitest: "4.1.11",
15
+ playwright: "1.62.1",
16
+ testingLibraryReact: "16.3.3",
17
+ testingLibraryJestDom: "7.0.1",
18
+ testingLibraryUserEvent: "14.6.6",
19
+ jsdom: "30.0.1",
20
+ typesNode: "26.4.0",
21
+ typesReact: "19.2.18",
22
+ typesReactDom: "19.2.5",
23
+ cce: {
24
+ package: "code-context-engine[local]",
25
+ version: "0.4.25",
26
+ command: "cce init --agent all",
27
+ integration: "MCP for Codex, Claude Code, and Google Antigravity; one local incremental index",
28
+ },
29
+ antigravity: {
30
+ runtime: "agy",
31
+ workspace: ".agents",
32
+ mcpServer: "mozole-cce",
33
+ },
34
+ });
35
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;IACrC,aAAa,EAAE,CAAC;IAChB,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,QAAQ;IACf,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,OAAO;IACpB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,OAAO;IAClB,UAAU,EAAE,OAAO;IACnB,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,QAAQ;IACpB,mBAAmB,EAAE,QAAQ;IAC7B,qBAAqB,EAAE,OAAO;IAC9B,uBAAuB,EAAE,QAAQ;IACjC,KAAK,EAAE,QAAQ;IACf,SAAS,EAAE,QAAQ;IACnB,UAAU,EAAE,SAAS;IACrB,aAAa,EAAE,QAAQ;IACvB,GAAG,EAAE;QACH,OAAO,EAAE,4BAA4B;QACrC,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,sBAAsB;QAC/B,WAAW,EACT,iFAAiF;KACpF;IACD,WAAW,EAAE;QACX,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,YAAY;KACxB;CACF,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@mozole/cli",
3
+ "version": "1.0.0",
4
+ "description": "Static-first React Router bootstrap and agent harness",
5
+ "type": "module",
6
+ "bin": {
7
+ "mozole": "dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "engines": {
15
+ "node": ">=22"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc -p tsconfig.build.json",
19
+ "prepack": "npm run build",
20
+ "dev": "tsx src/cli.ts",
21
+ "lint": "biome check .",
22
+ "format": "biome format --write .",
23
+ "typecheck": "tsc --noEmit",
24
+ "test": "vitest",
25
+ "test:run": "vitest run",
26
+ "test:smoke": "npm run build && cross-env MOZOLE_RUN_SMOKE=1 vitest run tests/integration/generated-smoke.test.ts",
27
+ "verify": "npm run lint && npm run typecheck && npm run test:run && npm run build"
28
+ },
29
+ "dependencies": {
30
+ "playwright": "1.62.1"
31
+ },
32
+ "devDependencies": {
33
+ "@biomejs/biome": "2.5.11",
34
+ "@types/node": "26.4.0",
35
+ "cross-env": "10.1.0",
36
+ "tsx": "4.20.6",
37
+ "typescript": "7.0.2",
38
+ "vitest": "4.1.11"
39
+ },
40
+ "license": "MIT",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "git+https://github.com/mozole/mozole-cli.git"
44
+ },
45
+ "keywords": [
46
+ "react-router",
47
+ "vite",
48
+ "codex",
49
+ "claude",
50
+ "playwright",
51
+ "cli"
52
+ ]
53
+ }