@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 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Output } from "../output.js";
2
+ export declare function verifyCommand(cwd: string, output?: Output, options?: {
3
+ force?: boolean;
4
+ }): Promise<number>;
5
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,MAAgB,EACxB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,OAAO,CAAC,MAAM,CAAC,CAgDjB"}
@@ -0,0 +1,53 @@
1
+ import { findProjectRoot, readConfig } from "../config/project.js";
2
+ import { projectFingerprint } from "../governor/fingerprint.js";
3
+ import { readGovernorState, writeGovernorState } from "../governor/state.js";
4
+ import { updateTelemetry } from "../telemetry/store.js";
5
+ import { runVerification } from "../verify/runner.js";
6
+ export async function verifyCommand(cwd, output = console, options = {}) {
7
+ const controller = new AbortController();
8
+ const abort = () => controller.abort();
9
+ process.once("SIGINT", abort);
10
+ process.once("SIGTERM", abort);
11
+ try {
12
+ const root = await findProjectRoot(cwd);
13
+ const config = await readConfig(root);
14
+ const fingerprint = await projectFingerprint(root, config, "verification");
15
+ const state = await readGovernorState(root);
16
+ if (config.governor.enabled &&
17
+ !options.force &&
18
+ state.verification?.fingerprint === fingerprint) {
19
+ const message = "VERIFY CURRENT\n\nNo relevant changes since the last successful verification.";
20
+ output.log(message);
21
+ if (config.telemetry.enabled)
22
+ await updateTelemetry(root, (telemetry) => {
23
+ telemetry.verification.avoidedRuns++;
24
+ telemetry.governor.modelFacingDiagnosticChars += message.length;
25
+ });
26
+ return 0;
27
+ }
28
+ const result = await runVerification(root, config, controller.signal);
29
+ (result.passed ? output.log : output.error)(result.output);
30
+ if (result.passed) {
31
+ state.verification = {
32
+ fingerprint: await projectFingerprint(root, config, "verification"),
33
+ passedAt: new Date().toISOString(),
34
+ checks: result.results.map((check) => check.name),
35
+ };
36
+ await writeGovernorState(root, state);
37
+ }
38
+ else if (state.verification?.fingerprint === fingerprint) {
39
+ delete state.verification;
40
+ await writeGovernorState(root, state);
41
+ }
42
+ return result.passed ? 0 : 1;
43
+ }
44
+ catch (error) {
45
+ output.error(`VERIFY FAIL\n\n${error instanceof Error ? error.message : String(error)}`);
46
+ return controller.signal.aborted ? 130 : 2;
47
+ }
48
+ finally {
49
+ process.removeListener("SIGINT", abort);
50
+ process.removeListener("SIGTERM", abort);
51
+ }
52
+ }
53
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ export interface Viewport {
2
+ width: number;
3
+ height: number;
4
+ }
5
+ export interface MozoleConfig {
6
+ schemaVersion: number;
7
+ name: string;
8
+ framework: "react-router";
9
+ routes: string[];
10
+ qa: {
11
+ viewports: Viewport[];
12
+ server: {
13
+ command: string;
14
+ args: string[];
15
+ readinessPath: string;
16
+ preferredPort: number;
17
+ };
18
+ };
19
+ cce: {
20
+ enabled: boolean;
21
+ initialized: boolean;
22
+ command: string;
23
+ };
24
+ governor: {
25
+ enabled: boolean;
26
+ mode: "warn";
27
+ hooks: {
28
+ codex: boolean;
29
+ claude: boolean;
30
+ };
31
+ };
32
+ telemetry: {
33
+ enabled: boolean;
34
+ };
35
+ verifiers: Array<{
36
+ name: string;
37
+ command: string;
38
+ args: string[];
39
+ }>;
40
+ }
41
+ export declare function readConfig(projectRoot: string): Promise<MozoleConfig>;
42
+ export declare function findProjectRoot(start?: string): Promise<string>;
43
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/config/project.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,cAAc,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,EAAE,EAAE;QACF,SAAS,EAAE,QAAQ,EAAE,CAAC;QACtB,MAAM,EAAE;YACN,OAAO,EAAE,MAAM,CAAC;YAChB,IAAI,EAAE,MAAM,EAAE,CAAC;YACf,aAAa,EAAE,MAAM,CAAC;YACtB,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;KACH,CAAC;IACF,GAAG,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,QAAQ,EAAE;QACR,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE;YAAE,KAAK,EAAE,OAAO,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,CAAC;KAC5C,CAAC;IACF,SAAS,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAChC,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CACrE;AAED,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAoD3E;AAED,wBAAsB,eAAe,CAAC,KAAK,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAc5E"}
@@ -0,0 +1,57 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ export async function readConfig(projectRoot) {
4
+ const contents = await readFile(path.join(projectRoot, ".mozole", "project.json"), "utf8");
5
+ const value = JSON.parse(contents);
6
+ value.governor ??= {
7
+ enabled: true,
8
+ mode: "warn",
9
+ hooks: { codex: true, claude: true },
10
+ };
11
+ if (value.schemaVersion !== 1 ||
12
+ typeof value.name !== "string" ||
13
+ value.framework !== "react-router" ||
14
+ !Array.isArray(value.routes) ||
15
+ !value.routes.every((route) => typeof route === "string" && route.startsWith("/")) ||
16
+ !Array.isArray(value.qa?.viewports) ||
17
+ !value.qa.viewports.every((viewport) => Number.isInteger(viewport.width) &&
18
+ viewport.width > 0 &&
19
+ Number.isInteger(viewport.height) &&
20
+ viewport.height > 0) ||
21
+ typeof value.qa.server?.command !== "string" ||
22
+ !Array.isArray(value.qa.server.args) ||
23
+ !value.qa.server.args.every((argument) => typeof argument === "string") ||
24
+ typeof value.qa.server.readinessPath !== "string" ||
25
+ !value.qa.server.readinessPath.startsWith("/") ||
26
+ !Number.isInteger(value.qa.server.preferredPort) ||
27
+ !Array.isArray(value.verifiers) ||
28
+ !value.verifiers.every((verifier) => typeof verifier.name === "string" &&
29
+ typeof verifier.command === "string" &&
30
+ Array.isArray(verifier.args) &&
31
+ verifier.args.every((argument) => typeof argument === "string")) ||
32
+ typeof value.cce?.enabled !== "boolean" ||
33
+ typeof value.cce.initialized !== "boolean" ||
34
+ typeof value.governor.enabled !== "boolean" ||
35
+ value.governor.mode !== "warn" ||
36
+ typeof value.governor.hooks?.codex !== "boolean" ||
37
+ typeof value.governor.hooks.claude !== "boolean" ||
38
+ typeof value.telemetry?.enabled !== "boolean") {
39
+ throw new Error("Unsupported or invalid .mozole/project.json");
40
+ }
41
+ return value;
42
+ }
43
+ export async function findProjectRoot(start = process.cwd()) {
44
+ let current = path.resolve(start);
45
+ while (true) {
46
+ try {
47
+ await readFile(path.join(current, ".mozole", "project.json"));
48
+ return current;
49
+ }
50
+ catch { }
51
+ const parent = path.dirname(current);
52
+ if (parent === current)
53
+ throw new Error("No Mozole project found. Run `mozole new` or `mozole adopt`.");
54
+ current = parent;
55
+ }
56
+ }
57
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/config/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type RunResult } from "../platform/process.js";
2
+ export declare function cceCommand(resolve?: (command: string) => Promise<string | undefined>): Promise<{
3
+ command: string;
4
+ prefix: string[];
5
+ } | undefined>;
6
+ export declare function initializeCce(root: string, signal?: AbortSignal): Promise<RunResult | undefined>;
7
+ export declare function queryCce(root: string, args: string[]): Promise<RunResult | undefined>;
8
+ //# sourceMappingURL=cce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cce.d.ts","sourceRoot":"","sources":["../../src/context/cce.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAO,MAAM,wBAAwB,CAAC;AAG7D,wBAAsB,UAAU,CAC9B,OAAO,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAqB,GAC5E,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAAC,CAc5D;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CA+ChC;AAED,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAQhC"}
@@ -0,0 +1,72 @@
1
+ import { readFile, rm, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { resolveExecutable } from "../platform/executable.js";
4
+ import { run } from "../platform/process.js";
5
+ import { TOOLCHAIN } from "../version.js";
6
+ export async function cceCommand(resolve = resolveExecutable) {
7
+ const cce = await resolve("cce");
8
+ if (cce)
9
+ return { command: cce, prefix: [] };
10
+ const uvx = await resolve("uvx");
11
+ if (uvx)
12
+ return {
13
+ command: uvx,
14
+ prefix: [
15
+ "--from",
16
+ `${TOOLCHAIN.cce.package}==${TOOLCHAIN.cce.version}`,
17
+ "cce",
18
+ ],
19
+ };
20
+ return undefined;
21
+ }
22
+ export async function initializeCce(root, signal) {
23
+ const executable = await cceCommand();
24
+ if (!executable)
25
+ return undefined;
26
+ const instructionPaths = [
27
+ path.join(root, "AGENTS.md"),
28
+ path.join(root, "CLAUDE.md"),
29
+ ];
30
+ const instructions = await Promise.all(instructionPaths.map(async (file) => {
31
+ try {
32
+ return await readFile(file, "utf8");
33
+ }
34
+ catch {
35
+ return undefined;
36
+ }
37
+ }));
38
+ let result;
39
+ try {
40
+ result = await run(executable.command, [...executable.prefix, "init", "--agent", "all"], {
41
+ cwd: root,
42
+ timeoutMs: 300_000,
43
+ signal,
44
+ logFile: path.join(root, ".mozole", "logs", "cce-init.log"),
45
+ });
46
+ }
47
+ finally {
48
+ await Promise.all(instructionPaths.map((file, index) => {
49
+ const contents = instructions[index];
50
+ return contents === undefined
51
+ ? rm(file, { force: true })
52
+ : writeFile(file, contents, "utf8");
53
+ }));
54
+ }
55
+ if (result.exitCode === 0) {
56
+ const configPath = path.join(root, ".mozole", "project.json");
57
+ const config = JSON.parse(await readFile(configPath, "utf8"));
58
+ config.cce.initialized = true;
59
+ await writeFile(configPath, `${JSON.stringify(config, null, 2)}\n`, "utf8");
60
+ }
61
+ return result;
62
+ }
63
+ export async function queryCce(root, args) {
64
+ const executable = await cceCommand();
65
+ return executable
66
+ ? run(executable.command, [...executable.prefix, ...args], {
67
+ cwd: root,
68
+ timeoutMs: 30_000,
69
+ })
70
+ : undefined;
71
+ }
72
+ //# sourceMappingURL=cce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cce.js","sourceRoot":"","sources":["../../src/context/cce.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import path from "node:path";
2
+ import type { MozoleConfig } from "../config/project.js";
3
+ export type FingerprintProfile = "verification" | "qa" | "visual";
4
+ export declare function normalizeFingerprintPath(root: string, file: string, paths?: typeof path.win32): string;
5
+ export declare function projectFingerprint(root: string, config: MozoleConfig, profile: FingerprintProfile): Promise<string>;
6
+ export declare function fileFingerprint(file: string): Promise<string>;
7
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/governor/fingerprint.ts"],"names":[],"mappings":"AAGA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,IAAI,GAAG,QAAQ,CAAC;AAkBlE,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,OAAO,IAAI,CAAC,KAAY,GAC9B,MAAM,CAIR;AAmED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAInE"}
@@ -0,0 +1,109 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createReadStream } from "node:fs";
3
+ import { readdir } from "node:fs/promises";
4
+ import path from "node:path";
5
+ const ignoredDirectories = new Set([
6
+ ".cce",
7
+ ".git",
8
+ ".react-router",
9
+ "build",
10
+ "coverage",
11
+ "dist",
12
+ "node_modules",
13
+ ]);
14
+ const ignoredMozoleDirectories = new Set(["backups", "logs", "qa", "state"]);
15
+ const documentation = /(^|\/)(AGENTS|CLAUDE|README)\.(?:md|mdx)$|(^|\/)docs\//i;
16
+ const qaIrrelevant = /(^|\/)(tests?|__tests__)\/|\.(test|spec)\.[cm]?[jt]sx?$|(^|\/)(biome|vitest)(\.config)?\./i;
17
+ const relevantExtension = /\.(?:[cm]?[jt]sx?|mdx|css|scss|sass|less|html|json|ya?ml|toml|txt|xml|webmanifest|svg|png|jpe?g|gif|webp|avif|ico|woff2?|php)$/i;
18
+ export function normalizeFingerprintPath(root, file, paths = path) {
19
+ return paths
20
+ .relative(paths.resolve(root), paths.resolve(file))
21
+ .replaceAll("\\", "/");
22
+ }
23
+ function includeFile(relative, profile) {
24
+ if (!relative || relative.startsWith("../") || documentation.test(relative))
25
+ return false;
26
+ if (relative.startsWith(".mozole/"))
27
+ return false;
28
+ if (relative === ".mozole/telemetry.json")
29
+ return false;
30
+ if (profile !== "verification" && qaIrrelevant.test(relative))
31
+ return false;
32
+ if ([
33
+ "package.json",
34
+ "package-lock.json",
35
+ "npm-shrinkwrap.json",
36
+ "react-router.config.ts",
37
+ "vite.config.ts",
38
+ "tsconfig.json",
39
+ ].includes(relative))
40
+ return true;
41
+ if (relative.startsWith("public/") || /(^|\/)\.env(?:\.|$)/.test(relative))
42
+ return true;
43
+ return relevantExtension.test(relative);
44
+ }
45
+ async function filesBelow(root, directory = root) {
46
+ const found = [];
47
+ const entries = await readdir(directory, { withFileTypes: true });
48
+ entries.sort((left, right) => left.name.localeCompare(right.name));
49
+ for (const entry of entries) {
50
+ const absolute = path.join(directory, entry.name);
51
+ const relative = normalizeFingerprintPath(root, absolute);
52
+ if (entry.isSymbolicLink())
53
+ continue;
54
+ if (entry.isDirectory()) {
55
+ if (ignoredDirectories.has(entry.name))
56
+ continue;
57
+ if (relative.startsWith(".mozole/") &&
58
+ ignoredMozoleDirectories.has(entry.name))
59
+ continue;
60
+ found.push(...(await filesBelow(root, absolute)));
61
+ }
62
+ else if (entry.isFile()) {
63
+ found.push(absolute);
64
+ }
65
+ }
66
+ return found;
67
+ }
68
+ function stable(value) {
69
+ if (Array.isArray(value))
70
+ return `[${value.map(stable).join(",")}]`;
71
+ if (value && typeof value === "object")
72
+ return `{${Object.entries(value)
73
+ .sort(([left], [right]) => left.localeCompare(right))
74
+ .map(([key, item]) => `${JSON.stringify(key)}:${stable(item)}`)
75
+ .join(",")}}`;
76
+ return JSON.stringify(value);
77
+ }
78
+ function configInputs(config, profile) {
79
+ if (profile === "verification")
80
+ return { verifiers: config.verifiers };
81
+ return {
82
+ routes: config.routes,
83
+ viewports: config.qa.viewports,
84
+ server: config.qa.server,
85
+ mode: profile,
86
+ };
87
+ }
88
+ export async function projectFingerprint(root, config, profile) {
89
+ const hash = createHash("sha256");
90
+ hash.update(`mozole:${profile}:v1\0${process.platform}\0${process.arch}\0${process.version}\0${stable(configInputs(config, profile))}\0`);
91
+ for (const absolute of await filesBelow(root)) {
92
+ const relative = normalizeFingerprintPath(root, absolute);
93
+ if (!includeFile(relative, profile))
94
+ continue;
95
+ hash.update(relative);
96
+ hash.update("\0");
97
+ for await (const chunk of createReadStream(absolute))
98
+ hash.update(chunk);
99
+ hash.update("\0");
100
+ }
101
+ return hash.digest("hex");
102
+ }
103
+ export async function fileFingerprint(file) {
104
+ const hash = createHash("sha256");
105
+ for await (const chunk of createReadStream(file))
106
+ hash.update(chunk);
107
+ return hash.digest("hex");
108
+ }
109
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/governor/fingerprint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ interface HookInput {
2
+ cwd?: unknown;
3
+ hook_event_name?: unknown;
4
+ tool_name?: unknown;
5
+ tool_input?: unknown;
6
+ }
7
+ export declare function evaluateGovernorHook(input: HookInput): Promise<Record<string, unknown> | undefined>;
8
+ export declare function governorHookCommand(): Promise<number>;
9
+ export {};
10
+ //# sourceMappingURL=hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/governor/hook.ts"],"names":[],"mappings":"AAYA,UAAU,SAAS;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AA+BD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAyF9C;AASD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAW3D"}
@@ -0,0 +1,127 @@
1
+ import { createHash } from "node:crypto";
2
+ import { access } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { findProjectRoot, readConfig } from "../config/project.js";
5
+ import { updateTelemetry } from "../telemetry/store.js";
6
+ import { fileFingerprint, normalizeFingerprintPath, projectFingerprint, } from "./fingerprint.js";
7
+ import { readGovernorState, writeGovernorState } from "./state.js";
8
+ function object(value) {
9
+ return value && typeof value === "object"
10
+ ? value
11
+ : {};
12
+ }
13
+ function hookMessage(message) {
14
+ return {
15
+ hookSpecificOutput: {
16
+ hookEventName: "PreToolUse",
17
+ additionalContext: message,
18
+ },
19
+ };
20
+ }
21
+ async function telemetryWarning(root, enabled, kind, chars) {
22
+ if (!enabled)
23
+ return;
24
+ await updateTelemetry(root, (telemetry) => {
25
+ if (kind === "read")
26
+ telemetry.governor.repeatedReadWarnings++;
27
+ else
28
+ telemetry.governor.repeatedWorkWarnings++;
29
+ telemetry.governor.modelFacingDiagnosticChars += chars;
30
+ });
31
+ }
32
+ export async function evaluateGovernorHook(input) {
33
+ const cwd = typeof input.cwd === "string" ? input.cwd : process.cwd();
34
+ const root = await findProjectRoot(cwd);
35
+ const config = await readConfig(root);
36
+ if (!config.governor.enabled || config.governor.mode !== "warn")
37
+ return;
38
+ const toolName = typeof input.tool_name === "string" ? input.tool_name : "";
39
+ const toolInput = object(input.tool_input);
40
+ const candidate = [
41
+ toolInput.file_path,
42
+ toolInput.path,
43
+ toolInput.filename,
44
+ ].find((item) => typeof item === "string");
45
+ if (candidate && /read|file/i.test(toolName)) {
46
+ const absolute = path.resolve(cwd, candidate);
47
+ if (absolute !== root &&
48
+ !absolute.startsWith(`${path.resolve(root)}${path.sep}`))
49
+ return;
50
+ await access(absolute);
51
+ const content = await fileFingerprint(absolute);
52
+ const region = `${String(toolInput.offset ?? "")}\0${String(toolInput.limit ?? "")}`;
53
+ const key = `${normalizeFingerprintPath(root, absolute)}\0${region}`;
54
+ const state = await readGovernorState(root);
55
+ const previous = state.reads[key];
56
+ const current = {
57
+ content,
58
+ seenAt: new Date().toISOString(),
59
+ warned: previous?.content === content ? Boolean(previous.warned) : false,
60
+ };
61
+ state.reads[key] = current;
62
+ const keys = Object.keys(state.reads);
63
+ for (const stale of keys.slice(0, Math.max(0, keys.length - 100)))
64
+ delete state.reads[stale];
65
+ if (previous?.content === content && !previous.warned) {
66
+ current.warned = true;
67
+ await writeGovernorState(root, state);
68
+ const message = `CONTEXT GUARD\n\n${normalizeFingerprintPath(root, absolute)} was already inspected and has not changed. Prefer CCE, git diff, or a changed-region read.`;
69
+ await telemetryWarning(root, config.telemetry.enabled, "read", message.length);
70
+ return hookMessage(message);
71
+ }
72
+ await writeGovernorState(root, state);
73
+ return;
74
+ }
75
+ const command = typeof toolInput.command === "string" ? toolInput.command : undefined;
76
+ if (!command || !/bash|exec|shell/i.test(toolName))
77
+ return;
78
+ const commandHash = createHash("sha256").update(command).digest("hex");
79
+ const fingerprint = await projectFingerprint(root, config, "verification");
80
+ const state = await readGovernorState(root);
81
+ const previous = state.commands.find((item) => item.command === commandHash && item.fingerprint === fingerprint);
82
+ if (!previous) {
83
+ state.commands.push({
84
+ command: commandHash,
85
+ fingerprint,
86
+ seenAt: new Date().toISOString(),
87
+ });
88
+ state.commands = state.commands.slice(-50);
89
+ await writeGovernorState(root, state);
90
+ return;
91
+ }
92
+ if (previous.warned)
93
+ return;
94
+ previous.warned = true;
95
+ previous.seenAt = new Date().toISOString();
96
+ await writeGovernorState(root, state);
97
+ const qaFingerprint = await projectFingerprint(root, config, "qa");
98
+ const complete = state.verification?.fingerprint === fingerprint &&
99
+ Object.values(state.qa).some((evidence) => evidence.fingerprint === qaFingerprint);
100
+ const message = complete
101
+ ? "RUNAWAY GUARD\n\nThis command repeats existing evidence after verification and QA passed. Address a specific unresolved issue or stop."
102
+ : "EXECUTION GUARD\n\nThis identical command already ran without a relevant project mutation.";
103
+ await telemetryWarning(root, config.telemetry.enabled, "work", message.length);
104
+ return hookMessage(message);
105
+ }
106
+ async function stdin() {
107
+ const chunks = [];
108
+ for await (const chunk of process.stdin)
109
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
110
+ return Buffer.concat(chunks).toString("utf8");
111
+ }
112
+ export async function governorHookCommand() {
113
+ try {
114
+ const raw = await stdin();
115
+ if (!raw.trim())
116
+ return 0;
117
+ const result = await evaluateGovernorHook(JSON.parse(raw));
118
+ if (result)
119
+ process.stdout.write(JSON.stringify(result));
120
+ return 0;
121
+ }
122
+ catch {
123
+ // Hooks are advisory and must never break legitimate agent work.
124
+ return 0;
125
+ }
126
+ }
127
+ //# sourceMappingURL=hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/governor/hook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export interface EvidenceState {
2
+ fingerprint: string;
3
+ passedAt: string;
4
+ checks?: string[];
5
+ routes?: string[];
6
+ viewports?: string[];
7
+ artifacts?: Array<{
8
+ path: string;
9
+ sha256: string;
10
+ }>;
11
+ }
12
+ export interface GovernorState {
13
+ schemaVersion: 1;
14
+ verification?: EvidenceState;
15
+ qa: Record<string, EvidenceState>;
16
+ reads: Record<string, {
17
+ content: string;
18
+ seenAt: string;
19
+ warned?: boolean;
20
+ }>;
21
+ commands: Array<{
22
+ command: string;
23
+ fingerprint: string;
24
+ seenAt: string;
25
+ warned?: boolean;
26
+ }>;
27
+ }
28
+ export declare const emptyGovernorState: () => GovernorState;
29
+ export declare function readGovernorState(root: string): Promise<GovernorState>;
30
+ export declare function writeGovernorState(root: string, value: GovernorState): Promise<void>;
31
+ export declare function qaStateKey(mode: {
32
+ interactive: boolean;
33
+ visual: boolean;
34
+ }): string;
35
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/governor/state.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AACD,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,CAAC;IACjB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7E,QAAQ,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,eAAO,MAAM,kBAAkB,QAAO,aAKpC,CAAC;AASH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA8B5E;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG,MAAM,CAIT"}