@mozole/cli 1.3.1 → 1.4.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.
- package/CHANGELOG.md +13 -0
- package/README.md +52 -168
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +31 -45
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.d.ts +1 -0
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +192 -23
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +312 -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 -4
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +39 -26
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/qa.d.ts.map +1 -1
- package/dist/commands/qa.js +18 -12
- package/dist/commands/qa.js.map +1 -1
- package/dist/commands/stats.d.ts.map +1 -1
- package/dist/commands/stats.js +6 -1
- package/dist/commands/stats.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +12 -8
- package/dist/commands/verify.js.map +1 -1
- package/dist/config/project.d.ts +8 -7
- package/dist/config/project.d.ts.map +1 -1
- package/dist/config/project.js +39 -26
- 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 +38 -20
- package/dist/governor/fingerprint.js.map +1 -1
- package/dist/governor/hook.d.ts +2 -1
- package/dist/governor/hook.d.ts.map +1 -1
- package/dist/governor/hook.js +20 -11
- 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 +46 -66
- 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 +46 -23
- 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 +224 -0
- package/dist/scaffold/backend.js.map +1 -0
- package/dist/scaffold/standalone.d.ts +6 -0
- package/dist/scaffold/standalone.d.ts.map +1 -0
- package/dist/scaffold/standalone.js +270 -0
- package/dist/scaffold/standalone.js.map +1 -0
- package/dist/scaffold/templates.d.ts +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +122 -81
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/scaffold/write.d.ts.map +1 -1
- package/dist/scaffold/write.js +19 -5
- package/dist/scaffold/write.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 +15 -17
- package/dist/verify/runner.js.map +1 -1
- package/dist/version.d.ts +2 -2
- package/dist/version.js +1 -1
- package/docs/agent-audit.md +24 -0
- package/package.json +7 -2
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone.js","sourceRoot":"","sources":["../../src/scaffold/standalone.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BjC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8B3B,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyMvB,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO,0TAA0T,OAAO,CAAC,CAAC,CAAC,+LAA+L,CAAC,CAAC,CAAC,EAAE,mKAAmK,OAAO,CAAC,CAAC,CAAC,wHAAwH,CAAC,CAAC,CAAC,EAAE,+QAA+Q,CAAC;AAC3kC,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { MozoleConfig } from "../config/project.js";
|
|
2
2
|
export interface ProjectTemplateOptions {
|
|
3
|
-
withAdmin?: boolean | undefined;
|
|
4
3
|
scaffold?: boolean | undefined;
|
|
4
|
+
backend?: boolean | undefined;
|
|
5
5
|
}
|
|
6
6
|
export declare function projectConfig(name: string, options?: ProjectTemplateOptions): MozoleConfig;
|
|
7
7
|
export declare function projectTemplates(name: string, options?: ProjectTemplateOptions): Record<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAWzD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,sBAA2B,GACnC,YAAY,CAiDd;AAID,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,sBAA2B,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyRxB"}
|
|
@@ -1,28 +1,22 @@
|
|
|
1
1
|
import { cceMcpServer } from "../integrations/antigravity.js";
|
|
2
2
|
import { TOOLCHAIN } from "../version.js";
|
|
3
|
+
import { backendTemplates } from "./backend.js";
|
|
4
|
+
import { backendCheckScript, basicAgentGuide, deployScript, qaScript, } from "./standalone.js";
|
|
3
5
|
export function projectConfig(name, options = {}) {
|
|
4
|
-
|
|
6
|
+
const isScaffold = options.scaffold !== false;
|
|
7
|
+
const config = {
|
|
5
8
|
schemaVersion: 1,
|
|
6
9
|
name,
|
|
7
|
-
mode:
|
|
10
|
+
mode: isScaffold ? "scaffold" : "optimized",
|
|
8
11
|
framework: "react-router",
|
|
9
12
|
routes: ["/", "/about", "/contact"],
|
|
10
|
-
...(options.withAdmin
|
|
11
|
-
? {
|
|
12
|
-
admin: {
|
|
13
|
-
enabled: true,
|
|
14
|
-
routePrefix: "/admin",
|
|
15
|
-
runtime: "node",
|
|
16
|
-
},
|
|
17
|
-
}
|
|
18
|
-
: {}),
|
|
19
13
|
qa: {
|
|
20
|
-
visualDiffThreshold: 0.001,
|
|
21
14
|
viewports: [
|
|
22
15
|
{ width: 375, height: 812 },
|
|
23
16
|
{ width: 768, height: 1024 },
|
|
24
17
|
{ width: 1440, height: 900 },
|
|
25
18
|
],
|
|
19
|
+
visualDiffThreshold: 0.01,
|
|
26
20
|
server: {
|
|
27
21
|
command: "npm",
|
|
28
22
|
args: ["run", "dev", "--", "--host", "127.0.0.1"],
|
|
@@ -30,53 +24,63 @@ export function projectConfig(name, options = {}) {
|
|
|
30
24
|
preferredPort: 4173,
|
|
31
25
|
},
|
|
32
26
|
},
|
|
33
|
-
cce: {
|
|
34
|
-
enabled: !options.scaffold,
|
|
35
|
-
initialized: false,
|
|
36
|
-
command: options.scaffold ? "" : "cce init --agent all",
|
|
37
|
-
},
|
|
38
|
-
governor: {
|
|
39
|
-
enabled: !options.scaffold,
|
|
40
|
-
mode: options.scaffold ? "warn" : "enforce",
|
|
41
|
-
hooks: { codex: !options.scaffold, claude: !options.scaffold },
|
|
42
|
-
},
|
|
43
|
-
telemetry: { enabled: !options.scaffold },
|
|
44
27
|
verifiers: [],
|
|
45
28
|
};
|
|
29
|
+
if (!isScaffold) {
|
|
30
|
+
config.cce = {
|
|
31
|
+
enabled: true,
|
|
32
|
+
initialized: false,
|
|
33
|
+
command: "cce init --agent all",
|
|
34
|
+
};
|
|
35
|
+
config.governor = {
|
|
36
|
+
enabled: true,
|
|
37
|
+
mode: "enforce",
|
|
38
|
+
hooks: { codex: true, claude: true },
|
|
39
|
+
};
|
|
40
|
+
config.telemetry = { enabled: true };
|
|
41
|
+
}
|
|
42
|
+
if (options.backend) {
|
|
43
|
+
config.backend = {
|
|
44
|
+
enabled: true,
|
|
45
|
+
runtime: "php",
|
|
46
|
+
apiPrefix: "/api",
|
|
47
|
+
port: 8000,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return config;
|
|
46
51
|
}
|
|
47
52
|
const json = (value) => `${JSON.stringify(value, null, 2)}\n`;
|
|
48
53
|
export function projectTemplates(name, options = {}) {
|
|
54
|
+
const isScaffold = options.scaffold !== false;
|
|
49
55
|
const cliSpec = process.env.MOZOLE_CLI_SPEC ?? TOOLCHAIN.mozoleCli;
|
|
56
|
+
const scripts = {
|
|
57
|
+
build: "react-router build",
|
|
58
|
+
dev: "react-router dev",
|
|
59
|
+
lint: "biome check .",
|
|
60
|
+
format: "biome format --write .",
|
|
61
|
+
typecheck: "react-router typegen && tsc --noEmit",
|
|
62
|
+
test: "vitest",
|
|
63
|
+
"test:run": "vitest run",
|
|
64
|
+
verify: "mozole verify",
|
|
65
|
+
"verify:force": "mozole verify --force",
|
|
66
|
+
qa: "mozole qa",
|
|
67
|
+
"qa:force": "mozole qa --force",
|
|
68
|
+
"qa:interactive": "mozole qa --interactive",
|
|
69
|
+
"qa:visual": "mozole qa --visual",
|
|
70
|
+
};
|
|
71
|
+
if (options.backend) {
|
|
72
|
+
scripts["dev:api"] = "php -S 127.0.0.1:8000 -t api api/index.php";
|
|
73
|
+
scripts["check:php"] = "node scripts/check-php.mjs";
|
|
74
|
+
scripts["build:deploy"] =
|
|
75
|
+
"npm run check:php && npm run build && node scripts/deploy.mjs";
|
|
76
|
+
}
|
|
50
77
|
const packageJson = {
|
|
78
|
+
engines: { node: TOOLCHAIN.node },
|
|
51
79
|
name,
|
|
52
80
|
private: true,
|
|
53
|
-
version: "0.1.0",
|
|
54
81
|
type: "module",
|
|
55
|
-
|
|
56
|
-
scripts: {
|
|
57
|
-
dev: "react-router dev",
|
|
58
|
-
build: "react-router build",
|
|
59
|
-
...(options.withAdmin
|
|
60
|
-
? { start: "react-router-serve build/server/index.js" }
|
|
61
|
-
: {}),
|
|
62
|
-
preview: "vite preview --host 127.0.0.1",
|
|
63
|
-
lint: "biome check .",
|
|
64
|
-
format: "biome format --write .",
|
|
65
|
-
typecheck: "react-router typegen && tsc --noEmit",
|
|
66
|
-
test: "vitest",
|
|
67
|
-
"test:run": "vitest run",
|
|
68
|
-
verify: "mozole verify",
|
|
69
|
-
"verify:force": "mozole verify --force",
|
|
70
|
-
qa: "mozole qa",
|
|
71
|
-
"qa:force": "mozole qa --force",
|
|
72
|
-
"qa:interactive": "mozole qa --interactive",
|
|
73
|
-
"qa:visual": "mozole qa --visual",
|
|
74
|
-
},
|
|
82
|
+
scripts,
|
|
75
83
|
dependencies: {
|
|
76
|
-
...(options.withAdmin
|
|
77
|
-
? { "@react-router/serve": TOOLCHAIN.reactRouter }
|
|
78
|
-
: {}),
|
|
79
|
-
"@react-router/node": TOOLCHAIN.reactRouter,
|
|
80
84
|
isbot: TOOLCHAIN.isbot,
|
|
81
85
|
react: TOOLCHAIN.react,
|
|
82
86
|
"react-dom": TOOLCHAIN.reactDom,
|
|
@@ -85,7 +89,6 @@ export function projectTemplates(name, options = {}) {
|
|
|
85
89
|
devDependencies: {
|
|
86
90
|
"@biomejs/biome": TOOLCHAIN.biome,
|
|
87
91
|
"@mozole/cli": cliSpec,
|
|
88
|
-
"@playwright/test": TOOLCHAIN.playwright,
|
|
89
92
|
"@react-router/dev": TOOLCHAIN.reactRouter,
|
|
90
93
|
"@testing-library/jest-dom": TOOLCHAIN.testingLibraryJestDom,
|
|
91
94
|
"@testing-library/react": TOOLCHAIN.testingLibraryReact,
|
|
@@ -100,20 +103,33 @@ export function projectTemplates(name, options = {}) {
|
|
|
100
103
|
vitest: TOOLCHAIN.vitest,
|
|
101
104
|
},
|
|
102
105
|
};
|
|
106
|
+
if (isScaffold) {
|
|
107
|
+
delete packageJson.devDependencies["@mozole/cli"];
|
|
108
|
+
packageJson.devDependencies.playwright = TOOLCHAIN.playwright;
|
|
109
|
+
scripts.verify = `${options.backend ? "npm run check:php && " : ""}npm run lint && npm run typecheck && npm run test:run && npm run build`;
|
|
110
|
+
scripts["verify:force"] = scripts.verify;
|
|
111
|
+
scripts.qa = "node scripts/qa.mjs";
|
|
112
|
+
scripts["qa:force"] = "node scripts/qa.mjs --force";
|
|
113
|
+
scripts["qa:interactive"] = "node scripts/qa.mjs --interactive";
|
|
114
|
+
scripts["qa:visual"] = "node scripts/qa.mjs --visual";
|
|
115
|
+
}
|
|
116
|
+
const viteConfig = options.backend
|
|
117
|
+
? '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'
|
|
118
|
+
: 'import { reactRouter } from "@react-router/dev/vite";\nimport { defineConfig } from "vite";\n\nexport default defineConfig({ plugins: [reactRouter()] });\n';
|
|
103
119
|
const files = {
|
|
104
120
|
"package.json": json(packageJson),
|
|
105
121
|
".mozole/project.json": json(projectConfig(name, options)),
|
|
106
122
|
".mozole/toolchain.json": json(TOOLCHAIN),
|
|
107
|
-
".gitignore": "node_modules/\nbuild/\ndist/\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",
|
|
123
|
+
".gitignore": "node_modules/\nbuild/\ndist/\ndeploy/\ndeploy.*.tmp/\ndeploy.*.backup/\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",
|
|
108
124
|
".context-engine.yaml": "retrieval:\n top_k: 20\n confidence_threshold: 0.5\ncompression:\n level: standard\n output: standard\n",
|
|
109
125
|
".agents/mcp_config.json": json({
|
|
110
126
|
mcpServers: { "mozole-cce": cceMcpServer() },
|
|
111
127
|
}),
|
|
112
|
-
".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.
|
|
128
|
+
".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",
|
|
113
129
|
".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",
|
|
114
130
|
".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",
|
|
115
131
|
".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",
|
|
116
|
-
".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",
|
|
132
|
+
".agents/workflows/mozole-qa-visual.md": "Run `mozole qa --visual --reason=explicit-workflow`. 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",
|
|
117
133
|
".codex/hooks.json": json({
|
|
118
134
|
description: "Enforced Mozole CCE-first and token-governor hooks.",
|
|
119
135
|
hooks: {
|
|
@@ -149,10 +165,8 @@ export function projectTemplates(name, options = {}) {
|
|
|
149
165
|
],
|
|
150
166
|
},
|
|
151
167
|
}),
|
|
152
|
-
"react-router.config.ts":
|
|
153
|
-
|
|
154
|
-
: 'import type { Config } from "@react-router/dev/config";\n\nexport default {\n ssr: false,\n prerender: true,\n} satisfies Config;\n',
|
|
155
|
-
"vite.config.ts": 'import { reactRouter } from "@react-router/dev/vite";\nimport { defineConfig } from "vite";\n\nexport default defineConfig({ plugins: [reactRouter()] });\n',
|
|
168
|
+
"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',
|
|
169
|
+
"vite.config.ts": viteConfig,
|
|
156
170
|
"tsconfig.json": json({
|
|
157
171
|
include: ["**/*", ".react-router/types/**/*"],
|
|
158
172
|
compilerOptions: {
|
|
@@ -180,6 +194,7 @@ export function projectTemplates(name, options = {}) {
|
|
|
180
194
|
includes: [
|
|
181
195
|
"**",
|
|
182
196
|
"!build",
|
|
197
|
+
"!deploy",
|
|
183
198
|
"!dist",
|
|
184
199
|
"!.react-router",
|
|
185
200
|
"!node_modules",
|
|
@@ -197,32 +212,51 @@ export function projectTemplates(name, options = {}) {
|
|
|
197
212
|
json: { formatter: { expand: "always" } },
|
|
198
213
|
}),
|
|
199
214
|
"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',
|
|
200
|
-
"app/routes.ts":
|
|
201
|
-
? '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'
|
|
202
|
-
: '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',
|
|
215
|
+
"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',
|
|
203
216
|
"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',
|
|
204
|
-
"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',
|
|
217
|
+
"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',
|
|
205
218
|
"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',
|
|
206
219
|
"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',
|
|
207
|
-
"app/styles/global.css": ":root {\n
|
|
220
|
+
"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",
|
|
208
221
|
"tests/setup.ts": 'import "@testing-library/jest-dom/vitest";\n',
|
|
209
222
|
"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',
|
|
210
|
-
"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",
|
|
211
|
-
"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",
|
|
212
223
|
"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",
|
|
213
|
-
"
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
"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
|
|
224
|
+
"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",
|
|
225
|
+
"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",
|
|
226
|
+
"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",
|
|
227
|
+
"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`,
|
|
217
228
|
};
|
|
218
|
-
if (
|
|
219
|
-
|
|
220
|
-
"
|
|
221
|
-
"
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
229
|
+
if (!isScaffold) {
|
|
230
|
+
for (const [file, agent] of [
|
|
231
|
+
[".codex/hooks.json", "codex"],
|
|
232
|
+
[".claude/settings.json", "claude"],
|
|
233
|
+
]) {
|
|
234
|
+
const hooks = JSON.parse(files[file] ?? "{}");
|
|
235
|
+
hooks.hooks.PreToolUse[0].matcher = "Bash|exec_command|.*[Rr]ead.*";
|
|
236
|
+
hooks.hooks.PostToolUse = [
|
|
237
|
+
{
|
|
238
|
+
matcher: "Bash|exec_command|.*cce.*|.*context_search.*|.*expand_chunk.*|.*related_context.*",
|
|
239
|
+
hooks: [
|
|
240
|
+
{
|
|
241
|
+
type: "command",
|
|
242
|
+
command: `npx --no-install mozole governor hook ${agent}`,
|
|
243
|
+
timeout: 10,
|
|
244
|
+
},
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
];
|
|
248
|
+
files[file] = json(hooks);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (options.backend) {
|
|
252
|
+
Object.assign(files, backendTemplates(name));
|
|
253
|
+
files["scripts/check-php.mjs"] = backendCheckScript;
|
|
254
|
+
files["scripts/deploy.mjs"] = deployScript;
|
|
255
|
+
if (!isScaffold)
|
|
256
|
+
files["AGENTS.md"] +=
|
|
257
|
+
"\n## Backend\n\nPHP 8.0+ is required. Run `npm run dev:api` in a separate terminal, `npm run check:php` for syntax, and `npm run build:deploy` to assemble `deploy/`. See `docs/backend-php.md`.\n";
|
|
258
|
+
}
|
|
259
|
+
if (isScaffold) {
|
|
226
260
|
for (const file of [
|
|
227
261
|
".context-engine.yaml",
|
|
228
262
|
".agents/mcp_config.json",
|
|
@@ -233,17 +267,24 @@ export function projectTemplates(name, options = {}) {
|
|
|
233
267
|
".agents/workflows/mozole-qa-visual.md",
|
|
234
268
|
".codex/hooks.json",
|
|
235
269
|
".claude/settings.json",
|
|
236
|
-
"AGENTS.md",
|
|
237
|
-
"CLAUDE.md",
|
|
238
270
|
"docs/design-tokens.md",
|
|
239
271
|
]) {
|
|
240
272
|
delete files[file];
|
|
241
273
|
}
|
|
242
|
-
files["
|
|
243
|
-
|
|
244
|
-
|
|
274
|
+
files["AGENTS.md"] = basicAgentGuide(Boolean(options.backend));
|
|
275
|
+
files["CLAUDE.md"] = "@AGENTS.md\n";
|
|
276
|
+
files["scripts/qa.mjs"] = qaScript;
|
|
277
|
+
const { cce: _cce, antigravity: _antigravity, ...plainToolchain } = TOOLCHAIN;
|
|
278
|
+
files[".mozole/toolchain.json"] = json(plainToolchain);
|
|
279
|
+
files[".gitignore"] =
|
|
280
|
+
"node_modules/\nbuild/\ndist/\ndeploy/\ndeploy.*.tmp/\ndeploy.*.backup/\n.react-router/\ncoverage/\n.mozole/qa/\n.DS_Store\n*.log\n";
|
|
281
|
+
const biome = JSON.parse(files["biome.json"] ?? "{}");
|
|
282
|
+
biome.files.includes = biome.files.includes.filter((entry) => entry !== "!.cce");
|
|
283
|
+
files["biome.json"] = json(biome);
|
|
284
|
+
files["docs/architecture.md"] =
|
|
285
|
+
"# Architecture\n\nReact Router Framework Mode with Vite emits static HTML into `build/client/`. Source routes are in `app/routes.ts`.\n";
|
|
245
286
|
files["README.md"] =
|
|
246
|
-
`# ${name}\n\
|
|
287
|
+
`# ${name}\n\nReact + Vite project with static prerendering. Requires Node.js 22+.\n\n## Development\n\nRun \`npm run dev\`, \`npm run verify\`, and \`npm run qa\`. Browser QA uses Playwright Chromium, installed during creation; reinstall with \`npx playwright install chromium\` if needed.\n${options.backend ? "\nRequires PHP 8.0+. Start `npm run dev:api` in a separate terminal. Use `npm run build:deploy` and upload the contents of `deploy/`, including `.htaccess`. See [backend setup](docs/backend-php.md).\n" : "\nDeploy the contents of `build/client/` to your static host.\n"}`;
|
|
247
288
|
}
|
|
248
289
|
return files;
|
|
249
290
|
}
|
|
@@ -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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"}
|
|
@@ -1 +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,
|
|
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,CA8BnB"}
|
package/dist/scaffold/write.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdir, writeFile } from "node:fs/promises";
|
|
1
|
+
import { lstat, mkdir, rename, rm, writeFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
export async function writeFiles(root, files, overwrite = false) {
|
|
4
4
|
const written = [];
|
|
@@ -8,10 +8,24 @@ export async function writeFiles(root, files, overwrite = false) {
|
|
|
8
8
|
const target = path.join(root, ...relative.split("/"));
|
|
9
9
|
await mkdir(path.dirname(target), { recursive: true });
|
|
10
10
|
try {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
if (!overwrite) {
|
|
12
|
+
try {
|
|
13
|
+
await lstat(target);
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (error.code !== "ENOENT")
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const temporary = `${target}.${process.pid}.tmp`;
|
|
22
|
+
try {
|
|
23
|
+
await writeFile(temporary, contents, { encoding: "utf8", flag: "wx" });
|
|
24
|
+
await rename(temporary, target);
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
await rm(temporary, { force: true });
|
|
28
|
+
}
|
|
15
29
|
written.push(relative);
|
|
16
30
|
}
|
|
17
31
|
catch (error) {
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/scaffold/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,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,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;oBACpB,SAAS;gBACX,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;wBAAE,MAAM,KAAK,CAAC;gBACtE,CAAC;YACH,CAAC;YACD,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvE,MAAM,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAClC,CAAC;oBAAS,CAAC;gBACT,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,CAAC;YACD,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"}
|
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,CA4FtE"}
|
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, {
|
|
@@ -99,10 +99,8 @@ export async function runVerification(root, config, signal, onStep) {
|
|
|
99
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 =
|
|
103
|
-
|
|
104
|
-
: resultBody;
|
|
105
|
-
if (config.telemetry.enabled)
|
|
102
|
+
const body = resultBody;
|
|
103
|
+
if (config.telemetry?.enabled)
|
|
106
104
|
await updateTelemetry(root, (telemetry) => {
|
|
107
105
|
telemetry.verification.runs++;
|
|
108
106
|
telemetry.verification.rawChars += results.reduce((sum, result) => sum + result.rawChars, 0);
|
|
@@ -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