@mozole/cli 1.4.2 → 2.0.0-b
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/LICENSE +16 -4
- package/README.md +85 -89
- package/dist/cli.d.ts +2 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +204 -157
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.d.ts +5 -8
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +49 -812
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/doctor.d.ts +1 -7
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +69 -377
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/new.d.ts +8 -10
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +32 -149
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/phase.d.ts +11 -0
- package/dist/commands/phase.d.ts.map +1 -0
- package/dist/commands/phase.js +106 -0
- package/dist/commands/phase.js.map +1 -0
- package/dist/commands/prototype.d.ts +6 -0
- package/dist/commands/prototype.d.ts.map +1 -0
- package/dist/commands/prototype.js +28 -0
- package/dist/commands/prototype.js.map +1 -0
- package/dist/commands/repomap.d.ts +6 -0
- package/dist/commands/repomap.d.ts.map +1 -0
- package/dist/commands/repomap.js +71 -0
- package/dist/commands/repomap.js.map +1 -0
- package/dist/commands/test.d.ts +6 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +115 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/ui.d.ts +1 -37
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +75 -317
- package/dist/commands/ui.js.map +1 -1
- package/dist/commands/verify.d.ts +12 -7
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +148 -65
- package/dist/commands/verify.js.map +1 -1
- package/dist/qa/a11y.d.ts +24 -0
- package/dist/qa/a11y.d.ts.map +1 -0
- package/dist/qa/a11y.js +124 -0
- package/dist/qa/a11y.js.map +1 -0
- package/dist/qa/breakpoints.d.ts +16 -0
- package/dist/qa/breakpoints.d.ts.map +1 -0
- package/dist/qa/breakpoints.js +45 -0
- package/dist/qa/breakpoints.js.map +1 -0
- package/dist/qa/contract.d.ts +21 -0
- package/dist/qa/contract.d.ts.map +1 -0
- package/dist/qa/contract.js +116 -0
- package/dist/qa/contract.js.map +1 -0
- package/dist/qa/index.d.ts +6 -0
- package/dist/qa/index.d.ts.map +1 -0
- package/dist/qa/index.js +6 -0
- package/dist/qa/index.js.map +1 -0
- package/dist/qa/probe.d.ts +48 -0
- package/dist/qa/probe.d.ts.map +1 -0
- package/dist/qa/probe.js +206 -0
- package/dist/qa/probe.js.map +1 -0
- package/dist/qa/runner.d.ts +27 -32
- package/dist/qa/runner.d.ts.map +1 -1
- package/dist/qa/runner.js +286 -336
- package/dist/qa/runner.js.map +1 -1
- package/dist/scaffold/agents.d.ts +5 -0
- package/dist/scaffold/agents.d.ts.map +1 -0
- package/dist/scaffold/agents.js +84 -0
- package/dist/scaffold/agents.js.map +1 -0
- package/dist/scaffold/backend.d.ts +6 -8
- package/dist/scaffold/backend.d.ts.map +1 -1
- package/dist/scaffold/backend.js +318 -199
- package/dist/scaffold/backend.js.map +1 -1
- package/dist/scaffold/design.d.ts +4 -3
- package/dist/scaffold/design.d.ts.map +1 -1
- package/dist/scaffold/design.js +38 -47
- package/dist/scaffold/design.js.map +1 -1
- package/dist/scaffold/flagship.d.ts +8 -0
- package/dist/scaffold/flagship.d.ts.map +1 -0
- package/dist/scaffold/flagship.js +337 -0
- package/dist/scaffold/flagship.js.map +1 -0
- package/dist/scaffold/index.d.ts +9 -0
- package/dist/scaffold/index.d.ts.map +1 -0
- package/dist/scaffold/index.js +48 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/phases.d.ts +10 -0
- package/dist/scaffold/phases.d.ts.map +1 -0
- package/dist/scaffold/phases.js +165 -0
- package/dist/scaffold/phases.js.map +1 -0
- package/dist/scaffold/repomap.d.ts +6 -0
- package/dist/scaffold/repomap.d.ts.map +1 -0
- package/dist/scaffold/repomap.js +89 -0
- package/dist/scaffold/repomap.js.map +1 -0
- package/dist/scaffold/standard.d.ts +13 -0
- package/dist/scaffold/standard.d.ts.map +1 -0
- package/dist/scaffold/standard.js +371 -0
- package/dist/scaffold/standard.js.map +1 -0
- package/dist/scaffold/tokens.d.ts +3 -0
- package/dist/scaffold/tokens.d.ts.map +1 -0
- package/dist/scaffold/tokens.js +126 -0
- package/dist/scaffold/tokens.js.map +1 -0
- package/dist/server/manager.d.ts +23 -0
- package/dist/server/manager.d.ts.map +1 -0
- package/dist/server/manager.js +96 -0
- package/dist/server/manager.js.map +1 -0
- package/dist/utils/ai-trace.d.ts +8 -0
- package/dist/utils/ai-trace.d.ts.map +1 -0
- package/dist/utils/ai-trace.js +69 -0
- package/dist/utils/ai-trace.js.map +1 -0
- package/dist/utils/browser.d.ts +10 -0
- package/dist/utils/browser.d.ts.map +1 -0
- package/dist/utils/browser.js +127 -0
- package/dist/utils/browser.js.map +1 -0
- package/dist/utils/fs.d.ts +11 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +166 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/git.d.ts +9 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +69 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/process.d.ts +21 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +120 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/version.d.ts +21 -36
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +21 -44
- package/dist/version.js.map +1 -1
- package/package.json +19 -38
- package/CHANGELOG.md +0 -30
- package/dist/commands/cce.d.ts +0 -7
- package/dist/commands/cce.d.ts.map +0 -1
- package/dist/commands/cce.js +0 -37
- package/dist/commands/cce.js.map +0 -1
- package/dist/commands/logs.d.ts +0 -3
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/logs.js +0 -39
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/qa.d.ts +0 -12
- package/dist/commands/qa.d.ts.map +0 -1
- package/dist/commands/qa.js +0 -143
- package/dist/commands/qa.js.map +0 -1
- package/dist/commands/stats.d.ts +0 -37
- package/dist/commands/stats.d.ts.map +0 -1
- package/dist/commands/stats.js +0 -169
- package/dist/commands/stats.js.map +0 -1
- package/dist/config/project.d.ts +0 -51
- package/dist/config/project.d.ts.map +0 -1
- package/dist/config/project.js +0 -81
- package/dist/config/project.js.map +0 -1
- package/dist/context/cce.d.ts +0 -39
- package/dist/context/cce.d.ts.map +0 -1
- package/dist/context/cce.js +0 -455
- package/dist/context/cce.js.map +0 -1
- package/dist/governor/fingerprint.d.ts +0 -7
- package/dist/governor/fingerprint.d.ts.map +0 -1
- package/dist/governor/fingerprint.js +0 -129
- package/dist/governor/fingerprint.js.map +0 -1
- package/dist/governor/hook.d.ts +0 -13
- package/dist/governor/hook.d.ts.map +0 -1
- package/dist/governor/hook.js +0 -389
- package/dist/governor/hook.js.map +0 -1
- package/dist/governor/state.d.ts +0 -45
- package/dist/governor/state.d.ts.map +0 -1
- package/dist/governor/state.js +0 -60
- package/dist/governor/state.js.map +0 -1
- package/dist/integrations/antigravity.d.ts +0 -20
- package/dist/integrations/antigravity.d.ts.map +0 -1
- package/dist/integrations/antigravity.js +0 -153
- package/dist/integrations/antigravity.js.map +0 -1
- package/dist/output.d.ts +0 -5
- package/dist/output.d.ts.map +0 -1
- package/dist/output.js +0 -2
- package/dist/output.js.map +0 -1
- package/dist/platform/executable.d.ts +0 -11
- package/dist/platform/executable.d.ts.map +0 -1
- package/dist/platform/executable.js +0 -69
- package/dist/platform/executable.js.map +0 -1
- package/dist/platform/process.d.ts +0 -25
- package/dist/platform/process.d.ts.map +0 -1
- package/dist/platform/process.js +0 -179
- package/dist/platform/process.js.map +0 -1
- package/dist/progress.d.ts +0 -44
- package/dist/progress.d.ts.map +0 -1
- package/dist/progress.js +0 -123
- package/dist/progress.js.map +0 -1
- package/dist/qa/diff.d.ts +0 -10
- package/dist/qa/diff.d.ts.map +0 -1
- package/dist/qa/diff.js +0 -91
- package/dist/qa/diff.js.map +0 -1
- package/dist/qa/server.d.ts +0 -10
- package/dist/qa/server.d.ts.map +0 -1
- package/dist/qa/server.js +0 -127
- package/dist/qa/server.js.map +0 -1
- package/dist/scaffold/adoption.d.ts +0 -17
- package/dist/scaffold/adoption.d.ts.map +0 -1
- package/dist/scaffold/adoption.js +0 -279
- package/dist/scaffold/adoption.js.map +0 -1
- package/dist/scaffold/legacy.d.ts +0 -4
- package/dist/scaffold/legacy.d.ts.map +0 -1
- package/dist/scaffold/legacy.js +0 -139
- package/dist/scaffold/legacy.js.map +0 -1
- package/dist/scaffold/routes.d.ts +0 -3
- package/dist/scaffold/routes.d.ts.map +0 -1
- package/dist/scaffold/routes.js +0 -37
- package/dist/scaffold/routes.js.map +0 -1
- package/dist/scaffold/standalone.d.ts +0 -7
- package/dist/scaffold/standalone.d.ts.map +0 -1
- package/dist/scaffold/standalone.js +0 -294
- package/dist/scaffold/standalone.js.map +0 -1
- package/dist/scaffold/templates.d.ts +0 -8
- package/dist/scaffold/templates.d.ts.map +0 -1
- package/dist/scaffold/templates.js +0 -312
- package/dist/scaffold/templates.js.map +0 -1
- package/dist/scaffold/write.d.ts +0 -2
- package/dist/scaffold/write.d.ts.map +0 -1
- package/dist/scaffold/write.js +0 -38
- package/dist/scaffold/write.js.map +0 -1
- package/dist/telemetry/store.d.ts +0 -33
- package/dist/telemetry/store.d.ts.map +0 -1
- package/dist/telemetry/store.js +0 -75
- package/dist/telemetry/store.js.map +0 -1
- package/dist/verify/runner.d.ts +0 -15
- package/dist/verify/runner.d.ts.map +0 -1
- package/dist/verify/runner.js +0 -112
- package/dist/verify/runner.js.map +0 -1
- package/docs/agent-audit.md +0 -24
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
import { lstat, readFile } from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { legacyBackendTemplates, legacyInstructions } from "./legacy.js";
|
|
4
|
-
export const json = (value) => `${JSON.stringify(value, null, 2)}\n`;
|
|
5
|
-
/** Refuse symlink traversal in files that adoption manages. Never follow it outside the project. */
|
|
6
|
-
export async function safeRead(root, relative) {
|
|
7
|
-
const segments = relative.split("/");
|
|
8
|
-
let file = root;
|
|
9
|
-
for (const segment of segments) {
|
|
10
|
-
if (!segment || segment === ".." || path.isAbsolute(segment))
|
|
11
|
-
throw new Error(`Unsafe managed path: ${relative}`);
|
|
12
|
-
file = path.join(file, segment);
|
|
13
|
-
try {
|
|
14
|
-
if ((await lstat(file)).isSymbolicLink())
|
|
15
|
-
throw new Error(`Cannot adopt symlinked managed path: ${relative}`);
|
|
16
|
-
}
|
|
17
|
-
catch (error) {
|
|
18
|
-
if (error.code === "ENOENT")
|
|
19
|
-
return undefined;
|
|
20
|
-
throw error;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return readFile(file, "utf8");
|
|
24
|
-
}
|
|
25
|
-
export function instructionBlock(contents) {
|
|
26
|
-
const body = contents.replace(/<!-- mozole:(begin|end) -->\n?/g, "").trim();
|
|
27
|
-
return `<!-- mozole:begin -->\n${body}\n<!-- mozole:end -->\n`;
|
|
28
|
-
}
|
|
29
|
-
/** Replace every owned block; exact historical sections are removed without deleting user additions. */
|
|
30
|
-
export function mergeInstructions(current, desired, known = []) {
|
|
31
|
-
if (!current)
|
|
32
|
-
return instructionBlock(desired);
|
|
33
|
-
let rest = current;
|
|
34
|
-
let open = false;
|
|
35
|
-
for (const marker of rest.matchAll(/<!-- mozole:(begin|end) -->/g)) {
|
|
36
|
-
if ((marker[1] === "begin") === open)
|
|
37
|
-
throw new Error("Malformed Mozole instruction markers; expected paired non-nested blocks.");
|
|
38
|
-
open = !open;
|
|
39
|
-
}
|
|
40
|
-
if (open)
|
|
41
|
-
throw new Error("Unclosed Mozole instruction block");
|
|
42
|
-
rest = rest.replace(/<!-- mozole:begin -->[\s\S]*?<!-- mozole:end -->\n?/g, "");
|
|
43
|
-
// Only recognize a complete known guide or its exact sections, never a generic word such as CCE.
|
|
44
|
-
for (const guide of known) {
|
|
45
|
-
const unwrapped = guide
|
|
46
|
-
.replace(/<!-- mozole:(begin|end) -->\n?/g, "")
|
|
47
|
-
.trim();
|
|
48
|
-
if (!unwrapped)
|
|
49
|
-
continue;
|
|
50
|
-
rest = rest.replace(unwrapped, "");
|
|
51
|
-
if (current.startsWith("# Project guide") ||
|
|
52
|
-
current.startsWith("@AGENTS.md")) {
|
|
53
|
-
for (const section of unwrapped.split(/(?=^## )/m)) {
|
|
54
|
-
if (section.trim())
|
|
55
|
-
rest = rest.replace(section.trim(), "");
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
rest = rest.trim();
|
|
60
|
-
return `${rest ? `${rest}\n\n` : ""}${instructionBlock(desired)}`;
|
|
61
|
-
}
|
|
62
|
-
function object(value, label) {
|
|
63
|
-
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
64
|
-
throw new Error(`${label} must contain a JSON object`);
|
|
65
|
-
return value;
|
|
66
|
-
}
|
|
67
|
-
function parse(raw, file) {
|
|
68
|
-
try {
|
|
69
|
-
return object(JSON.parse(raw), file);
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
throw new Error(`${file} contains invalid JSON: ${String(error)}`);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
/** Keep unrelated handlers and top-level settings, and remove stale handlers from every event. */
|
|
76
|
-
export function mergeHooks(raw, desired, file) {
|
|
77
|
-
const config = raw ? parse(raw, file) : {};
|
|
78
|
-
const hooks = config.hooks === undefined ? {} : object(config.hooks, `${file}.hooks`);
|
|
79
|
-
for (const [event, groups] of Object.entries(hooks)) {
|
|
80
|
-
if (!Array.isArray(groups))
|
|
81
|
-
throw new Error(`Invalid hook groups in ${file}: ${event}`);
|
|
82
|
-
hooks[event] = groups.flatMap((item) => {
|
|
83
|
-
const group = object(item, file);
|
|
84
|
-
if (!Array.isArray(group.hooks))
|
|
85
|
-
throw new Error(`Invalid hook handlers in ${file}: ${event}`);
|
|
86
|
-
const handlers = group.hooks.filter((handler) => {
|
|
87
|
-
const entry = object(handler, file);
|
|
88
|
-
return ![entry.command, entry.commandWindows].some((command) => typeof command === "string" &&
|
|
89
|
-
/^(?:npx(?:\s+--no-install)?\s+)?mozole\s+governor\s+hook\b/.test(command));
|
|
90
|
-
});
|
|
91
|
-
return handlers.length || group.hooks.length === 0
|
|
92
|
-
? [{ ...group, hooks: handlers }]
|
|
93
|
-
: [];
|
|
94
|
-
});
|
|
95
|
-
if (!hooks[event].length)
|
|
96
|
-
delete hooks[event];
|
|
97
|
-
}
|
|
98
|
-
if (desired) {
|
|
99
|
-
const desiredConfig = parse(desired, file);
|
|
100
|
-
const managedHooks = object(desiredConfig.hooks, file);
|
|
101
|
-
for (const [event, groups] of Object.entries(managedHooks))
|
|
102
|
-
hooks[event] = [
|
|
103
|
-
...(hooks[event] ?? []),
|
|
104
|
-
...groups,
|
|
105
|
-
];
|
|
106
|
-
if (desiredConfig.description)
|
|
107
|
-
config.description = desiredConfig.description;
|
|
108
|
-
}
|
|
109
|
-
else if (typeof config.description === "string" &&
|
|
110
|
-
/Mozole.*hooks/i.test(config.description))
|
|
111
|
-
delete config.description;
|
|
112
|
-
if (Object.keys(hooks).length)
|
|
113
|
-
config.hooks = hooks;
|
|
114
|
-
else
|
|
115
|
-
delete config.hooks;
|
|
116
|
-
return Object.keys(config).length ? json(config) : undefined;
|
|
117
|
-
}
|
|
118
|
-
const cceKeys = new Set([
|
|
119
|
-
"cce",
|
|
120
|
-
"code-context-engine",
|
|
121
|
-
"code_context_engine",
|
|
122
|
-
"mozole-cce",
|
|
123
|
-
]);
|
|
124
|
-
function cceServer(name, value, wasManaged) {
|
|
125
|
-
if (name === "mozole-cce")
|
|
126
|
-
return true;
|
|
127
|
-
if (!wasManaged || !cceKeys.has(name) || !value || typeof value !== "object")
|
|
128
|
-
return false;
|
|
129
|
-
const server = value;
|
|
130
|
-
return (typeof server.command === "string" &&
|
|
131
|
-
(/(?:^|[/\\])cce(?:\.exe|\.cmd)?$/.test(server.command) ||
|
|
132
|
-
JSON.stringify(server.args).includes("code-context-engine")));
|
|
133
|
-
}
|
|
134
|
-
export async function canonicalPlan(root, templates, optimized, wasManaged, name, knownGuides) {
|
|
135
|
-
const plan = {
|
|
136
|
-
writes: {},
|
|
137
|
-
removes: [],
|
|
138
|
-
directories: [],
|
|
139
|
-
notes: [],
|
|
140
|
-
};
|
|
141
|
-
async function set(file, value) {
|
|
142
|
-
const current = await safeRead(root, file);
|
|
143
|
-
if (current === value)
|
|
144
|
-
return;
|
|
145
|
-
if (value === undefined) {
|
|
146
|
-
if (current !== undefined)
|
|
147
|
-
plan.removes.push(file);
|
|
148
|
-
}
|
|
149
|
-
else
|
|
150
|
-
plan.writes[file] = value;
|
|
151
|
-
}
|
|
152
|
-
for (const file of ["AGENTS.md", "CLAUDE.md"]) {
|
|
153
|
-
await set(file, mergeInstructions(await safeRead(root, file), templates[file] ?? "", [
|
|
154
|
-
legacyInstructions[file] ?? "",
|
|
155
|
-
...(knownGuides[file] ?? []),
|
|
156
|
-
]));
|
|
157
|
-
}
|
|
158
|
-
for (const file of [
|
|
159
|
-
".mozole/toolchain.json",
|
|
160
|
-
"scripts/qa.mjs",
|
|
161
|
-
"scripts/verify-extra.mjs",
|
|
162
|
-
"scripts/check-php.mjs",
|
|
163
|
-
"scripts/deploy.mjs",
|
|
164
|
-
]) {
|
|
165
|
-
if (templates[file] !== undefined)
|
|
166
|
-
await set(file, templates[file]);
|
|
167
|
-
else if (wasManaged)
|
|
168
|
-
await set(file, undefined);
|
|
169
|
-
}
|
|
170
|
-
const legacyBackend = legacyBackendTemplates(name);
|
|
171
|
-
for (const file of [
|
|
172
|
-
"api/index.php",
|
|
173
|
-
"api/config.php",
|
|
174
|
-
".htaccess",
|
|
175
|
-
"docs/backend-php.md",
|
|
176
|
-
]) {
|
|
177
|
-
const desired = templates[file];
|
|
178
|
-
if (!desired)
|
|
179
|
-
continue;
|
|
180
|
-
const current = await safeRead(root, file);
|
|
181
|
-
if (current === undefined ||
|
|
182
|
-
(wasManaged && current === legacyBackend[file]))
|
|
183
|
-
await set(file, desired);
|
|
184
|
-
else if (current !== desired && wasManaged)
|
|
185
|
-
plan.notes.push(`Preserved customized ${file}; review backend compatibility.`);
|
|
186
|
-
}
|
|
187
|
-
// Exported docs are always user-owned. Existing arbitrary application configs are add-only.
|
|
188
|
-
for (const file of [
|
|
189
|
-
"docs/design/README.md",
|
|
190
|
-
"vitest.config.ts",
|
|
191
|
-
"tests/setup.ts",
|
|
192
|
-
]) {
|
|
193
|
-
if ((await safeRead(root, file)) === undefined && templates[file])
|
|
194
|
-
await set(file, templates[file]);
|
|
195
|
-
}
|
|
196
|
-
const oldDesign = await safeRead(root, "docs/design-tokens.md");
|
|
197
|
-
if (oldDesign?.trim() === legacyInstructions["docs/design-tokens.md"]?.trim())
|
|
198
|
-
await set("docs/design-tokens.md", undefined);
|
|
199
|
-
const architecture = await safeRead(root, "docs/architecture.md");
|
|
200
|
-
if (templates["docs/architecture.md"] && architecture === undefined)
|
|
201
|
-
await set("docs/architecture.md", templates["docs/architecture.md"]);
|
|
202
|
-
// Legacy architecture is recognized by its generator-specific wording; custom sections survive.
|
|
203
|
-
if (wasManaged &&
|
|
204
|
-
architecture &&
|
|
205
|
-
/Mozole fingerprints|This project is in scaffold mode/.test(architecture)) {
|
|
206
|
-
const sections = architecture.split(/(?=^## )/m);
|
|
207
|
-
await set("docs/architecture.md", `${templates["docs/architecture.md"] ?? "# Architecture\n"}${sections.slice(1).join("")}`);
|
|
208
|
-
}
|
|
209
|
-
for (const file of [".codex/hooks.json", ".claude/settings.json"]) {
|
|
210
|
-
const raw = await safeRead(root, file);
|
|
211
|
-
if (raw !== undefined || optimized)
|
|
212
|
-
await set(file, mergeHooks(raw, optimized ? templates[file] : undefined, file));
|
|
213
|
-
}
|
|
214
|
-
for (const file of optimized
|
|
215
|
-
? []
|
|
216
|
-
: [".mcp.json", ".agents/mcp_config.json"]) {
|
|
217
|
-
const raw = await safeRead(root, file);
|
|
218
|
-
if (raw === undefined)
|
|
219
|
-
continue;
|
|
220
|
-
const config = parse(raw, file);
|
|
221
|
-
if (config.mcpServers !== undefined) {
|
|
222
|
-
const servers = object(config.mcpServers, file);
|
|
223
|
-
for (const [key, value] of Object.entries(servers))
|
|
224
|
-
if (cceServer(key, value, wasManaged))
|
|
225
|
-
delete servers[key];
|
|
226
|
-
if (!Object.keys(servers).length)
|
|
227
|
-
delete config.mcpServers;
|
|
228
|
-
}
|
|
229
|
-
// Optimized Antigravity MCP is reattached after initialization.
|
|
230
|
-
await set(file, Object.keys(config).length ? json(config) : undefined);
|
|
231
|
-
}
|
|
232
|
-
const codexFile = ".codex/config.toml";
|
|
233
|
-
const codex = await safeRead(root, codexFile);
|
|
234
|
-
if (!optimized && codex && wasManaged) {
|
|
235
|
-
const sections = codex.split(/(?=^\[)/m);
|
|
236
|
-
const names = new Set();
|
|
237
|
-
for (const section of sections) {
|
|
238
|
-
const match = section.match(/^\[mcp_servers\.([\w"-]+)\]/);
|
|
239
|
-
const key = match?.[1]?.replaceAll('"', "");
|
|
240
|
-
if (key &&
|
|
241
|
-
cceKeys.has(key) &&
|
|
242
|
-
(key === "mozole-cce" ||
|
|
243
|
-
/code-context-engine|["'/\\]cce(?:\.exe)?["']/.test(section)))
|
|
244
|
-
names.add(key);
|
|
245
|
-
}
|
|
246
|
-
const result = sections
|
|
247
|
-
.filter((section) => {
|
|
248
|
-
const key = section
|
|
249
|
-
.match(/^\[mcp_servers\.([\w"-]+)(?:\.|\])/)?.[1]
|
|
250
|
-
?.replaceAll('"', "");
|
|
251
|
-
return !key || !names.has(key);
|
|
252
|
-
})
|
|
253
|
-
.join("");
|
|
254
|
-
if (result !== codex)
|
|
255
|
-
await set(codexFile, result.trim() ? result : undefined);
|
|
256
|
-
}
|
|
257
|
-
const integrationFiles = [
|
|
258
|
-
".context-engine.yaml",
|
|
259
|
-
".agents/rules/mozole.md",
|
|
260
|
-
".agents/workflows/mozole-verify.md",
|
|
261
|
-
".agents/workflows/mozole-qa.md",
|
|
262
|
-
".agents/workflows/mozole-qa-interactive.md",
|
|
263
|
-
".agents/workflows/mozole-qa-visual.md",
|
|
264
|
-
];
|
|
265
|
-
for (const file of integrationFiles) {
|
|
266
|
-
if (optimized && templates[file])
|
|
267
|
-
await set(file, templates[file]);
|
|
268
|
-
else if (wasManaged)
|
|
269
|
-
await set(file, undefined);
|
|
270
|
-
}
|
|
271
|
-
if (wasManaged)
|
|
272
|
-
plan.directories.push(".mozole/state");
|
|
273
|
-
if (!optimized && wasManaged) {
|
|
274
|
-
await set(".mozole/telemetry.json", undefined);
|
|
275
|
-
plan.directories.push(".cce");
|
|
276
|
-
}
|
|
277
|
-
return plan;
|
|
278
|
-
}
|
|
279
|
-
//# sourceMappingURL=adoption.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adoption.js","sourceRoot":"","sources":["../../src/scaffold/adoption.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
/** Exact pre-1.4 templates, used only to recognize and migrate generator-owned text. */
|
|
2
|
-
export declare const legacyInstructions: Record<string, string>;
|
|
3
|
-
export declare function legacyBackendTemplates(name: string): Record<string, string>;
|
|
4
|
-
//# sourceMappingURL=legacy.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../src/scaffold/legacy.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOrD,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsI3E"}
|
package/dist/scaffold/legacy.js
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
/** Exact pre-1.4 templates, used only to recognize and migrate generator-owned text. */
|
|
2
|
-
export const legacyInstructions = {
|
|
3
|
-
"AGENTS.md": "# Project guide\n\n## Commands\n\n- `npm run dev` \u2014 local app\n- `npm run verify` \u2014 lint, typecheck, tests, production build\n- `npm run qa` \u2014 deterministic browser QA (no screenshots)\n- `npm run qa:interactive` \u2014 adds safe interaction probes\n- `npm run qa:visual` \u2014 explicit screenshot review\n- `mozole cce install` \u2014 install persistent CCE and required uv runtime\n- `mozole ui` \u2014 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",
|
|
4
|
-
"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",
|
|
5
|
-
"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",
|
|
6
|
-
};
|
|
7
|
-
export function legacyBackendTemplates(name) {
|
|
8
|
-
return {
|
|
9
|
-
"api/index.php": `<?php
|
|
10
|
-
declare(strict_types=1);
|
|
11
|
-
|
|
12
|
-
require_once __DIR__ . '/config.php';
|
|
13
|
-
|
|
14
|
-
header('Content-Type: application/json; charset=utf-8');
|
|
15
|
-
header('X-Content-Type-Options: nosniff');
|
|
16
|
-
header('X-Frame-Options: DENY');
|
|
17
|
-
|
|
18
|
-
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
|
|
19
|
-
$uri = parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH) ?? '/';
|
|
20
|
-
|
|
21
|
-
// Normalize URI to match route path (handles both /api/path and direct /path on dev server)
|
|
22
|
-
$basePrefix = '/api';
|
|
23
|
-
if (str_starts_with($uri, $basePrefix)) {
|
|
24
|
-
$route = '/' . ltrim(substr($uri, strlen($basePrefix)), '/');
|
|
25
|
-
} else {
|
|
26
|
-
$route = '/' . ltrim($uri, '/');
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
switch ($route) {
|
|
30
|
-
case '/':
|
|
31
|
-
case '/health':
|
|
32
|
-
echo json_encode([
|
|
33
|
-
'status' => 'ok',
|
|
34
|
-
'app' => '${name}',
|
|
35
|
-
'runtime' => 'PHP ' . PHP_VERSION,
|
|
36
|
-
'timestamp' => time(),
|
|
37
|
-
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
|
38
|
-
break;
|
|
39
|
-
|
|
40
|
-
case '/info':
|
|
41
|
-
echo json_encode([
|
|
42
|
-
'name' => '${name}',
|
|
43
|
-
'backend' => 'PHP native API',
|
|
44
|
-
'endpoints' => [
|
|
45
|
-
'GET /api/health' => 'Service status check',
|
|
46
|
-
'GET /api/info' => 'Backend metadata',
|
|
47
|
-
],
|
|
48
|
-
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
|
49
|
-
break;
|
|
50
|
-
|
|
51
|
-
default:
|
|
52
|
-
http_response_code(404);
|
|
53
|
-
echo json_encode([
|
|
54
|
-
'error' => 'Endpoint not found',
|
|
55
|
-
'path' => $uri,
|
|
56
|
-
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
|
57
|
-
break;
|
|
58
|
-
}
|
|
59
|
-
`,
|
|
60
|
-
"api/config.php": `<?php
|
|
61
|
-
declare(strict_types=1);
|
|
62
|
-
|
|
63
|
-
function env(string $key, ?string $default = null): ?string {
|
|
64
|
-
$value = getenv($key);
|
|
65
|
-
return $value !== false ? $value : $default;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Environment configuration
|
|
69
|
-
define('APP_ENV', env('APP_ENV', 'development'));
|
|
70
|
-
define('APP_DEBUG', env('APP_DEBUG', 'true') === 'true');
|
|
71
|
-
|
|
72
|
-
// Optional database connection helper
|
|
73
|
-
function get_db_connection(): ?PDO {
|
|
74
|
-
static $pdo = null;
|
|
75
|
-
if ($pdo !== null) {
|
|
76
|
-
return $pdo;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
$dsn = env('DB_DSN');
|
|
80
|
-
if (!$dsn) {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
$user = env('DB_USER', '');
|
|
85
|
-
$pass = env('DB_PASS', '');
|
|
86
|
-
|
|
87
|
-
try {
|
|
88
|
-
$pdo = new PDO($dsn, $user, $pass, [
|
|
89
|
-
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
90
|
-
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
91
|
-
PDO::ATTR_EMULATE_PREPARES => false,
|
|
92
|
-
]);
|
|
93
|
-
return $pdo;
|
|
94
|
-
} catch (PDOException $e) {
|
|
95
|
-
if (APP_DEBUG) {
|
|
96
|
-
throw $e;
|
|
97
|
-
}
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
`,
|
|
102
|
-
".htaccess": `<IfModule mod_rewrite.c>
|
|
103
|
-
RewriteEngine On
|
|
104
|
-
RewriteBase /
|
|
105
|
-
|
|
106
|
-
# Route API requests to PHP front-controller
|
|
107
|
-
RewriteRule ^api(/.*)?$ api/index.php [QSA,L]
|
|
108
|
-
|
|
109
|
-
# Serve static assets directly if they exist
|
|
110
|
-
RewriteCond %{REQUEST_FILENAME} -f [OR]
|
|
111
|
-
RewriteCond %{REQUEST_FILENAME} -d
|
|
112
|
-
RewriteRule ^ - [L]
|
|
113
|
-
|
|
114
|
-
# Fallback to prerendered / client index for SPA routes
|
|
115
|
-
RewriteRule ^index\\.html$ - [L]
|
|
116
|
-
RewriteRule . /index.html [L]
|
|
117
|
-
</IfModule>
|
|
118
|
-
`,
|
|
119
|
-
"docs/backend-php.md": `# PHP Backend Architecture
|
|
120
|
-
|
|
121
|
-
This project combines a **static-first React + Vite frontend** with a lightweight, native **PHP backend API**.
|
|
122
|
-
|
|
123
|
-
## How It Works
|
|
124
|
-
|
|
125
|
-
### Local Development
|
|
126
|
-
- **Frontend (React + Vite)**: Runs via \`npm run dev\` (typically at \`http://127.0.0.1:5173\`).
|
|
127
|
-
- **Backend (PHP API)**: Runs via \`npm run dev:api\` (\`php -S 127.0.0.1:8000 -t api\`).
|
|
128
|
-
- **Proxy**: Vite's \`server.proxy\` automatically forwards all \`/api/*\` requests from the browser directly to the PHP dev server. Your React code calls \`fetch("/api/health")\` without dealing with CORS or port mismatches.
|
|
129
|
-
|
|
130
|
-
### Production Deployment (Apache / LiteSpeed / Nginx)
|
|
131
|
-
- **Zero Node.js runtime required**: Deploy the \`build/client/\` static files and the \`api/\` directory to any shared hosting or VPS.
|
|
132
|
-
- **Apache / LiteSpeed**: The provided \`.htaccess\` handles routing:
|
|
133
|
-
- All \`/api/*\` calls are routed directly to \`api/index.php\`.
|
|
134
|
-
- All static HTML, CSS, JS, and image assets are served directly by the web server at maximum speed.
|
|
135
|
-
- **Nginx**: Forward \`/api/\` to \`fastcgi_pass\` and serve \`try_files $uri $uri/ /index.html\`.
|
|
136
|
-
`,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
//# sourceMappingURL=legacy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../src/scaffold/legacy.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,WAAW,EACT,48CAA48C;IAC98C,WAAW,EACT,2VAA2V;IAC7V,uBAAuB,EACrB,w5BAAw5B;CAC35B,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO;QACL,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;wBAyBG,IAAI;;;;;;;;yBAQH,IAAI;;;;;;;;;;;;;;;;;CAiB5B;QAEG,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCrB;QAEG,WAAW,EAAE;;;;;;;;;;;;;;;;CAgBhB;QAEG,qBAAqB,EAAE;;;;;;;;;;;;;;;;;CAiB1B;KACE,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/scaffold/routes.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAqCrD"}
|
package/dist/scaffold/routes.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/** Discover literal React Router route/prefix calls without evaluating project code. */
|
|
2
|
-
export function detectRoutes(source) {
|
|
3
|
-
const tokens = (source.match(/\/\*[\s\S]*?\*\/|\/\/[^\n]*|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|[a-zA-Z_$][\w$]*|[^\s]/g) ?? []).filter((token) => !token.startsWith("//") && !token.startsWith("/*"));
|
|
4
|
-
const routes = new Set(["/"]);
|
|
5
|
-
function scan(start, end, base) {
|
|
6
|
-
for (let i = start; i < end; i++) {
|
|
7
|
-
const name = tokens[i];
|
|
8
|
-
if (!["route", "prefix", "layout", "index"].includes(name ?? "") ||
|
|
9
|
-
tokens[i + 1] !== "(")
|
|
10
|
-
continue;
|
|
11
|
-
let depth = 1;
|
|
12
|
-
let close = i + 2;
|
|
13
|
-
for (; close < end; close++) {
|
|
14
|
-
if (tokens[close] === "(")
|
|
15
|
-
depth++;
|
|
16
|
-
if (tokens[close] === ")" && --depth === 0)
|
|
17
|
-
break;
|
|
18
|
-
}
|
|
19
|
-
const literal = tokens[i + 2];
|
|
20
|
-
const value = literal && /^["']/.test(literal) ? literal.slice(1, -1) : undefined;
|
|
21
|
-
if (name === "layout")
|
|
22
|
-
scan(i + 2, close, base);
|
|
23
|
-
else if (name === "index")
|
|
24
|
-
routes.add(base || "/");
|
|
25
|
-
else if (value !== undefined && !/[:*?\\]/.test(value)) {
|
|
26
|
-
const joined = `${base}/${value}`.replace(/\/{2,}/g, "/").replace(/\/$/, "") || "/";
|
|
27
|
-
if (name === "route")
|
|
28
|
-
routes.add(joined);
|
|
29
|
-
scan(i + 3, close, joined);
|
|
30
|
-
}
|
|
31
|
-
i = close;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
scan(0, tokens.length, "");
|
|
35
|
-
return [...routes];
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=routes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/scaffold/routes.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,MAAM,GAAG,CACb,MAAM,CAAC,KAAK,CACV,yFAAyF,CAC1F,IAAI,EAAE,CACR,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,SAAS,IAAI,CAAC,KAAa,EAAE,GAAW,EAAE,IAAY;QACpD,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACvB,IACE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC5D,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG;gBAErB,SAAS;YACX,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC5B,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG;oBAAE,KAAK,EAAE,CAAC;gBACnC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,KAAK,CAAC;oBAAE,MAAM;YACpD,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,MAAM,KAAK,GACT,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACtE,IAAI,IAAI,KAAK,QAAQ;gBAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;iBAC3C,IAAI,IAAI,KAAK,OAAO;gBAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;iBAC9C,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvD,MAAM,MAAM,GACV,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;gBACvE,IAAI,IAAI,KAAK,OAAO;oBAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAC7B,CAAC;YACD,CAAC,GAAG,KAAK,CAAC;QACZ,CAAC;IACH,CAAC;IACD,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/** Standalone project tooling: no dependency on the generator at runtime. */
|
|
2
|
-
export declare const backendCheckScript = "import { spawnSync } from \"node:child_process\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nfunction php(args) {\n const result = spawnSync(\"php\", args, {\n encoding: \"utf8\",\n shell: false,\n timeout: 10000,\n });\n if (result.error || result.status !== 0)\n throw new Error(result.error?.message || result.stderr || result.stdout);\n return result.stdout.trim();\n}\nasync function lint(directory) {\n for (const entry of await readdir(directory, { withFileTypes: true })) {\n const file = path.join(directory, entry.name);\n if (entry.isDirectory()) await lint(file);\n else if (entry.isFile() && entry.name.endsWith(\".php\")) php([\"-l\", file]);\n }\n}\ntry {\n const version = Number(php([\"-r\", \"echo PHP_VERSION_ID;\"]));\n if (!Number.isInteger(version) || version < 80000)\n throw new Error(\"PHP 8.0 or newer is required.\");\n await lint(\"api\");\n console.log(\"PHP PASS\");\n} catch (error) {\n console.error(`PHP FAIL\\n${error.message}`);\n process.exitCode = 1;\n}\n";
|
|
3
|
-
export declare const deployScript = "import { cp, lstat, mkdir, rename, rm } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst target = path.resolve(\"deploy\");\nconst staging = `${target}.${process.pid}.tmp`;\nconst backup = `${target}.${process.pid}.backup`;\nlet backedUp = false;\ntry {\n await mkdir(staging);\n await cp(\"build/client\", staging, { recursive: true, errorOnExist: true });\n await cp(\"api\", path.join(staging, \"api\"), { recursive: true });\n await cp(\".htaccess\", path.join(staging, \".htaccess\"));\n try {\n await lstat(target);\n await rename(target, backup);\n backedUp = true;\n } catch (error) {\n if (error.code !== \"ENOENT\") throw error;\n }\n try {\n await rename(staging, target);\n } catch (error) {\n if (backedUp) await rename(backup, target);\n throw error;\n }\n if (backedUp) await rm(backup, { recursive: true });\n console.log(\"DEPLOY READY: deploy/\");\n} finally {\n await rm(staging, { recursive: true, force: true });\n}\n";
|
|
4
|
-
export declare const qaScript = "import { spawn, spawnSync } from \"node:child_process\";\nimport { mkdir, readFile } from \"node:fs/promises\";\nimport net from \"node:net\";\nimport { chromium } from \"playwright\";\n\nconst flags = process.argv.slice(2);\nif (\n flags.some((flag) => ![\"--visual\", \"--interactive\", \"--force\"].includes(flag))\n)\n throw new Error(\"Unknown QA option\");\nconst config = JSON.parse(await readFile(\".mozole/project.json\", \"utf8\"));\nconst socket = net.createServer();\nawait new Promise((resolve, reject) => {\n socket.once(\"error\", reject);\n socket.listen(0, \"127.0.0.1\", resolve);\n});\nconst port = socket.address().port;\nawait new Promise((resolve) => socket.close(resolve));\nconst configured = config.qa.server;\nconst npmCli = process.env.npm_execpath;\nif (configured.command === \"npm\" && !npmCli) {\n throw new Error(\n \"Run QA through npm run qa so npm can be resolved without a shell.\",\n );\n}\nconst command =\n configured.command === \"npm\" ? process.execPath : configured.command;\nconst args = [\n ...(configured.command === \"npm\" ? [npmCli] : []),\n ...configured.args,\n \"--port\",\n String(port),\n \"--strictPort\",\n];\nconst child = spawn(command, args, {\n shell: false,\n detached: process.platform !== \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n});\nlet serverLog = \"\";\nfor (const stream of [child.stdout, child.stderr])\n stream.on(\"data\", (data) => {\n serverLog = (serverLog + data).slice(-4000);\n });\nlet serverError;\nchild.on(\"error\", (error) => {\n serverError = error;\n});\nlet browser;\nlet stopping = false;\nasync function cleanup() {\n if (stopping) return;\n stopping = true;\n await browser?.close().catch(() => {});\n if (child.pid) {\n if (process.platform === \"win32\")\n spawnSync(\"taskkill\", [\"/pid\", String(child.pid), \"/T\", \"/F\"], {\n shell: false,\n stdio: \"ignore\",\n });\n else {\n try {\n process.kill(-child.pid, \"SIGTERM\");\n } catch {}\n }\n }\n}\nconst interrupted = () => {\n void cleanup().finally(() => process.exit(130));\n};\nprocess.once(\"SIGINT\", interrupted);\nprocess.once(\"SIGTERM\", interrupted);\nconst deadline = setTimeout(() => {\n console.error(\"QA timed out\");\n void cleanup().finally(() => process.exit(1));\n}, 120000);\nconst base = `http://127.0.0.1:${port}`;\ntry {\n let ready = false;\n for (let attempt = 0; attempt < 300; attempt++) {\n if (serverError || child.exitCode !== null)\n throw new Error(serverError?.message || serverLog);\n try {\n ready = (\n await fetch(base + config.qa.server.readinessPath, {\n signal: AbortSignal.timeout(1000),\n })\n ).ok;\n } catch {}\n if (ready) break;\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n if (!ready)\n throw new Error(`Development server did not become ready.\\n${serverLog}`);\n browser = await chromium.launch();\n const failures = [];\n for (const viewport of config.qa.viewports) {\n const page = await browser.newPage({ viewport });\n page.on(\"pageerror\", (error) => failures.push(error.message));\n page.on(\"console\", (message) => {\n if (message.type() === \"error\") failures.push(message.text());\n });\n page.on(\"requestfailed\", (request) => {\n if (request.failure()?.errorText !== \"net::ERR_ABORTED\")\n failures.push(request.url());\n });\n page.on(\"response\", (response) => {\n if (response.status() >= 400)\n failures.push(`${response.status()} ${response.url()}`);\n });\n for (const route of config.routes) {\n const response = await page.goto(base + route, {\n waitUntil: \"networkidle\",\n });\n if (!response?.ok()) failures.push(`${route}: HTTP failure`);\n const issues = await page.evaluate(() => {\n const found = [];\n if (!document.documentElement.lang) found.push(\"missing lang\");\n if (!document.title.trim()) found.push(\"missing title\");\n if (!document.querySelector(\"h1\")) found.push(\"missing h1\");\n if (document.documentElement.scrollWidth > innerWidth + 1)\n found.push(\"horizontal overflow\");\n for (const element of document.querySelectorAll(\n \"a, button, input:not([type=hidden]), select, textarea\",\n )) {\n if (!element.getClientRects().length) continue;\n const labelled = (element.getAttribute(\"aria-labelledby\") || \"\")\n .split(/\\s+/)\n .some((id) => document.getElementById(id)?.textContent?.trim());\n if (\n !element.textContent?.trim() &&\n !element.getAttribute(\"aria-label\") &&\n !labelled &&\n !element.labels?.length &&\n !element.getAttribute(\"title\") &&\n !element.getAttribute(\"alt\") &&\n !element.querySelector(\"img[alt]\")\n )\n found.push(\"unnamed control\");\n }\n return found;\n });\n failures.push(...issues.map((issue) => `${route}: ${issue}`));\n const links = await page\n .locator(\"a[href]\")\n .evaluateAll((anchors) => anchors.map((anchor) => anchor.href));\n for (const href of new Set(links)) {\n if (\n new URL(href).origin === base &&\n !(await page.request.get(href)).ok()\n )\n failures.push(`broken link: ${href}`);\n }\n if (flags.includes(\"--interactive\")) {\n await page.keyboard.press(\"Tab\");\n if (\n !(await page.evaluate(() => document.activeElement !== document.body))\n )\n failures.push(`${route}: keyboard focus missing`);\n }\n if (flags.includes(\"--visual\")) {\n await mkdir(\".mozole/qa\", { recursive: true });\n const name = route.replace(/[^a-z0-9_-]/gi, \"-\") || \"index\";\n await page.screenshot({\n path:\n \".mozole/qa/\" +\n viewport.width +\n \"x\" +\n viewport.height +\n \"-\" +\n name +\n \".png\",\n fullPage: true,\n });\n }\n }\n await page.close();\n }\n if (failures.length) throw new Error([...new Set(failures)].join(\"\\n\"));\n console.log(\n \"QA PASS: \" +\n config.routes.length +\n \" routes, \" +\n config.qa.viewports.length +\n \" viewports\",\n );\n} catch (error) {\n console.error(`QA FAIL\\n${error.message}`);\n process.exitCode = 1;\n} finally {\n clearTimeout(deadline);\n process.removeListener(\"SIGINT\", interrupted);\n process.removeListener(\"SIGTERM\", interrupted);\n await cleanup();\n}\n";
|
|
5
|
-
export declare function basicAgentGuide(backend: boolean): string;
|
|
6
|
-
export declare const extraVerifierScript = "import { spawnSync } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\n\nconst config = JSON.parse(await readFile(\".mozole/project.json\", \"utf8\"));\nfor (const check of config.verifiers ?? []) {\n if (\n typeof check.command !== \"string\" ||\n !Array.isArray(check.args) ||\n !check.args.every((arg) => typeof arg === \"string\")\n )\n throw new Error(\"Invalid extra verifier\");\n const npm = check.command === \"npm\";\n if (npm && !process.env.npm_execpath)\n throw new Error(\"Run verification through npm run verify\");\n const result = spawnSync(\n npm ? process.execPath : check.command,\n npm ? [process.env.npm_execpath, ...check.args] : check.args,\n { shell: false, stdio: \"inherit\", timeout: 600000 },\n );\n if (result.error || result.status !== 0) {\n console.error(\n \"Extra verifier failed:\",\n check.name,\n result.error?.message ?? result.status,\n );\n process.exit(result.status || 1);\n }\n}\n";
|
|
7
|
-
//# sourceMappingURL=standalone.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../../src/scaffold/standalone.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,ijCA+B9B,CAAC;AAEF,eAAO,MAAM,YAAY,q+BA8BxB,CAAC;AAEF,eAAO,MAAM,QAAQ,qlNAmMpB,CAAC;AAEF,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAExD;AAED,eAAO,MAAM,mBAAmB,q/BA4B/B,CAAC"}
|