@cleaver/breakcheck 0.2.4 → 0.3.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 (50) hide show
  1. package/README.md +180 -13
  2. package/agent-guide.md +107 -0
  3. package/dist/cli/commands/baseline.d.ts +19 -0
  4. package/dist/cli/commands/baseline.js +133 -0
  5. package/dist/cli/commands/baseline.js.map +1 -0
  6. package/dist/cli/commands/check.d.ts +27 -0
  7. package/dist/cli/commands/check.js +204 -0
  8. package/dist/cli/commands/check.js.map +1 -0
  9. package/dist/cli/commands/clean.d.ts +25 -0
  10. package/dist/cli/commands/clean.js +123 -0
  11. package/dist/cli/commands/clean.js.map +1 -0
  12. package/dist/cli/commands/compare.js +28 -6
  13. package/dist/cli/commands/compare.js.map +1 -1
  14. package/dist/cli/commands/compile.d.ts +5 -0
  15. package/dist/cli/commands/compile.js +23 -0
  16. package/dist/cli/commands/compile.js.map +1 -0
  17. package/dist/cli/commands/help.js +173 -7
  18. package/dist/cli/commands/help.js.map +1 -1
  19. package/dist/cli/commands/init.d.ts +26 -0
  20. package/dist/cli/commands/init.js +224 -0
  21. package/dist/cli/commands/init.js.map +1 -0
  22. package/dist/cli/commands/list-snapshots.js +7 -3
  23. package/dist/cli/commands/list-snapshots.js.map +1 -1
  24. package/dist/cli/commands/new.d.ts +9 -0
  25. package/dist/cli/commands/new.js +27 -0
  26. package/dist/cli/commands/new.js.map +1 -0
  27. package/dist/cli/commands/snapshot.d.ts +20 -0
  28. package/dist/cli/commands/snapshot.js +128 -26
  29. package/dist/cli/commands/snapshot.js.map +1 -1
  30. package/dist/cli/commands/view.d.ts +1 -1
  31. package/dist/cli/commands/view.js +12 -6
  32. package/dist/cli/commands/view.js.map +1 -1
  33. package/dist/cli/config.d.ts +14 -0
  34. package/dist/cli/config.js +58 -0
  35. package/dist/cli/config.js.map +1 -0
  36. package/dist/cli/rules.d.ts +12 -0
  37. package/dist/cli/rules.js +110 -0
  38. package/dist/cli/rules.js.map +1 -0
  39. package/dist/cli/site-environment.d.ts +12 -0
  40. package/dist/cli/site-environment.js +231 -0
  41. package/dist/cli/site-environment.js.map +1 -0
  42. package/dist/cli/url-manifest.d.ts +18 -0
  43. package/dist/cli/url-manifest.js +63 -0
  44. package/dist/cli/url-manifest.js.map +1 -0
  45. package/dist/cli/utils.d.ts +1 -0
  46. package/dist/cli/utils.js +5 -2
  47. package/dist/cli/utils.js.map +1 -1
  48. package/dist/index.js +14 -0
  49. package/dist/index.js.map +1 -1
  50. package/package.json +8 -7
@@ -0,0 +1,231 @@
1
+ import { spawn } from "node:child_process";
2
+ function launchCommand(command, cwd, environment) {
3
+ const [executable, ...arguments_] = command;
4
+ if (executable === undefined || executable.trim().length === 0) {
5
+ throw new Error("A configured command must include an executable.");
6
+ }
7
+ const child = spawn(executable, arguments_, {
8
+ cwd,
9
+ env: environment,
10
+ detached: process.platform !== "win32",
11
+ shell: false,
12
+ stdio: ["ignore", "pipe", "pipe"],
13
+ });
14
+ child.stdout?.on("data", (chunk) => {
15
+ process.stderr.write(chunk);
16
+ });
17
+ child.stderr?.on("data", (chunk) => {
18
+ process.stderr.write(chunk);
19
+ });
20
+ let result;
21
+ const closed = new Promise((resolve) => {
22
+ child.once("close", (code, signal) => {
23
+ result = { code, signal };
24
+ resolve(result);
25
+ });
26
+ });
27
+ const started = new Promise((resolve, reject) => {
28
+ child.once("spawn", resolve);
29
+ child.once("error", reject);
30
+ });
31
+ return started.then(() => ({
32
+ child,
33
+ closed,
34
+ getResult: () => result,
35
+ }));
36
+ }
37
+ function formatCommand(command) {
38
+ return command.map((argument) => JSON.stringify(argument)).join(" ");
39
+ }
40
+ async function runCommand(command, cwd, environment, signal) {
41
+ signal?.throwIfAborted();
42
+ const processHandle = await launchCommand(command, cwd, environment);
43
+ let result;
44
+ let onAbort;
45
+ try {
46
+ if (signal === undefined) {
47
+ result = await processHandle.closed;
48
+ }
49
+ else {
50
+ const aborted = new Promise((resolve) => {
51
+ onAbort = () => resolve(undefined);
52
+ signal.addEventListener("abort", onAbort, { once: true });
53
+ if (signal.aborted)
54
+ onAbort();
55
+ });
56
+ const completed = await Promise.race([processHandle.closed, aborted]);
57
+ if (completed === undefined) {
58
+ await stopForegroundProcess(processHandle);
59
+ signal.throwIfAborted();
60
+ throw new Error("Command was interrupted.");
61
+ }
62
+ result = completed;
63
+ }
64
+ }
65
+ finally {
66
+ if (signal !== undefined && onAbort !== undefined) {
67
+ signal.removeEventListener("abort", onAbort);
68
+ }
69
+ }
70
+ if (result.code !== 0) {
71
+ throw new Error(`Command failed (${result.code ?? result.signal}): ${formatCommand(command)}`);
72
+ }
73
+ }
74
+ function sendSignal(handle, signal) {
75
+ const processId = handle.child.pid;
76
+ if (processId === undefined || handle.getResult() !== undefined)
77
+ return;
78
+ try {
79
+ if (process.platform !== "win32") {
80
+ process.kill(-processId, signal);
81
+ }
82
+ else {
83
+ handle.child.kill(signal);
84
+ }
85
+ }
86
+ catch (error) {
87
+ if (!(error instanceof Error &&
88
+ "code" in error &&
89
+ error.code === "ESRCH")) {
90
+ throw error;
91
+ }
92
+ }
93
+ }
94
+ async function stopForegroundProcess(handle, gracePeriodMs = 5_000) {
95
+ if (handle.getResult() !== undefined)
96
+ return;
97
+ sendSignal(handle, "SIGTERM");
98
+ const graceful = await Promise.race([
99
+ handle.closed.then(() => true),
100
+ new Promise((resolve) => setTimeout(() => resolve(false), gracePeriodMs)),
101
+ ]);
102
+ if (graceful)
103
+ return;
104
+ sendSignal(handle, "SIGKILL");
105
+ await handle.closed;
106
+ }
107
+ async function waitUntilReady(server, baseUrl, processHandle, signal) {
108
+ const target = new URL(server.readyPath ?? "/", baseUrl).href;
109
+ const deadline = Date.now() + (server.timeoutMs ?? 30_000);
110
+ let lastError = "no HTTP response";
111
+ while (Date.now() < deadline) {
112
+ signal.throwIfAborted();
113
+ const result = processHandle.getResult();
114
+ if (result && result.code !== 0) {
115
+ throw new Error(`Server start command exited (${result.code ?? result.signal}) before the site became ready.`);
116
+ }
117
+ try {
118
+ const response = await fetch(target, {
119
+ signal: AbortSignal.any([signal, AbortSignal.timeout(1_000)]),
120
+ });
121
+ if (response.status < 500) {
122
+ await response.body?.cancel();
123
+ return;
124
+ }
125
+ lastError = `HTTP ${response.status}`;
126
+ await response.body?.cancel();
127
+ }
128
+ catch (error) {
129
+ signal.throwIfAborted();
130
+ lastError = error instanceof Error ? error.message : String(error);
131
+ }
132
+ await new Promise((resolve) => setTimeout(resolve, 250));
133
+ }
134
+ throw new Error(`Site did not become ready at ${target} within ${server.timeoutMs ?? 30_000}ms (${lastError}).`);
135
+ }
136
+ /** Runs configured preparation and server commands around a site operation. */
137
+ export async function withCheckEnvironment(check, baseUrl, useExistingServer, operation, options = {}) {
138
+ const server = check.server;
139
+ const cwd = server?.cwd ?? check.configDirectory;
140
+ const environment = {
141
+ ...process.env,
142
+ ...(server?.env ?? {}),
143
+ };
144
+ const controller = new AbortController();
145
+ let processHandle;
146
+ let startAttempted = false;
147
+ let interruptError;
148
+ let childSignal = "SIGTERM";
149
+ let workFinished = false;
150
+ const interrupt = (label) => {
151
+ if (interruptError !== undefined || workFinished)
152
+ return;
153
+ childSignal = label === "SIGINT" || label === "SIGTERM" ? label : "SIGTERM";
154
+ interruptError = new Error(`Site check interrupted by ${label}.`);
155
+ controller.abort(interruptError);
156
+ if (processHandle !== undefined) {
157
+ sendSignal(processHandle, childSignal);
158
+ }
159
+ };
160
+ const onInterrupt = () => interrupt("SIGINT");
161
+ const onTerminate = () => interrupt("SIGTERM");
162
+ const onExternalAbort = () => interrupt("external cancellation");
163
+ const signals = options.signals ?? process;
164
+ signals.on("SIGINT", onInterrupt);
165
+ signals.on("SIGTERM", onTerminate);
166
+ options.signal?.addEventListener("abort", onExternalAbort, { once: true });
167
+ let outcome;
168
+ try {
169
+ if (options.signal?.aborted)
170
+ interrupt("external cancellation");
171
+ if (!useExistingServer) {
172
+ for (const command of check.prepare ?? []) {
173
+ await runCommand(command, cwd, environment, controller.signal);
174
+ }
175
+ }
176
+ if (!useExistingServer && server !== undefined) {
177
+ const launched = await launchCommand(server.start, cwd, environment);
178
+ processHandle = launched;
179
+ startAttempted = true;
180
+ if (interruptError !== undefined)
181
+ sendSignal(launched, childSignal);
182
+ await waitUntilReady(server, baseUrl, launched, controller.signal);
183
+ }
184
+ controller.signal.throwIfAborted();
185
+ const value = await operation(controller.signal);
186
+ controller.signal.throwIfAborted();
187
+ outcome = { ok: true, value };
188
+ }
189
+ catch (error) {
190
+ outcome = { ok: false, error: interruptError ?? error };
191
+ }
192
+ finally {
193
+ workFinished = true;
194
+ }
195
+ let cleanupError;
196
+ if (processHandle !== undefined) {
197
+ try {
198
+ await stopForegroundProcess(processHandle, options.stopGracePeriodMs);
199
+ }
200
+ catch (error) {
201
+ cleanupError = error;
202
+ }
203
+ }
204
+ if (startAttempted && server?.stop !== undefined) {
205
+ try {
206
+ await runCommand(server.stop, cwd, environment);
207
+ }
208
+ catch (error) {
209
+ cleanupError =
210
+ cleanupError === undefined
211
+ ? error
212
+ : new AggregateError([cleanupError, error], "Server cleanup failed.");
213
+ }
214
+ }
215
+ signals.removeListener("SIGINT", onInterrupt);
216
+ signals.removeListener("SIGTERM", onTerminate);
217
+ options.signal?.removeEventListener("abort", onExternalAbort);
218
+ if (cleanupError !== undefined) {
219
+ if (!outcome.ok) {
220
+ throw new AggregateError([outcome.error, cleanupError], "Site check failed and server cleanup also failed.");
221
+ }
222
+ throw cleanupError;
223
+ }
224
+ if (!outcome.ok) {
225
+ if (interruptError !== undefined)
226
+ throw interruptError;
227
+ throw outcome.error;
228
+ }
229
+ return outcome.value;
230
+ }
231
+ //# sourceMappingURL=site-environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-environment.js","sourceRoot":"","sources":["../../src/cli/site-environment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Readable } from "node:stream";
2
+ export type UrlManifestIssue = {
3
+ type: "manifest";
4
+ source: string;
5
+ message: string;
6
+ } | {
7
+ type: "entry";
8
+ source: string;
9
+ line: number;
10
+ value: string;
11
+ message: string;
12
+ };
13
+ export interface UrlManifestParseResult {
14
+ paths: string[];
15
+ issues: UrlManifestIssue[];
16
+ }
17
+ export declare function readUrlManifest(source: string, stdin?: Readable): Promise<string>;
18
+ export declare function parseUrlManifest(content: string, baseUrl: string, source: string): UrlManifestParseResult;
@@ -0,0 +1,63 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { resolveUrlPaths } from "@cleaver/breakcheck-core";
3
+ export async function readUrlManifest(source, stdin = process.stdin) {
4
+ try {
5
+ if (source !== "-") {
6
+ return await readFile(source, "utf8");
7
+ }
8
+ stdin.setEncoding("utf8");
9
+ const chunks = [];
10
+ const input = stdin;
11
+ for await (const chunk of input) {
12
+ if (typeof chunk === "string") {
13
+ chunks.push(chunk);
14
+ }
15
+ else if (chunk instanceof Uint8Array) {
16
+ chunks.push(Buffer.from(chunk).toString("utf8"));
17
+ }
18
+ else {
19
+ throw new Error("stdin produced a non-text chunk");
20
+ }
21
+ }
22
+ return chunks.join("");
23
+ }
24
+ catch (error) {
25
+ const sourceLabel = source === "-" ? "stdin" : source;
26
+ const message = error instanceof Error ? error.message : String(error);
27
+ throw new Error(`Unable to read URL manifest from ${sourceLabel}: ${message}`, {
28
+ cause: error,
29
+ });
30
+ }
31
+ }
32
+ export function parseUrlManifest(content, baseUrl, source) {
33
+ const entries = content
34
+ .split(/\r?\n/)
35
+ .map((line, index) => ({ line: index + 1, value: line.trim() }))
36
+ .filter(({ value }) => value !== "" && !value.startsWith("#"));
37
+ const resolution = resolveUrlPaths(baseUrl, entries.map(({ value }) => value));
38
+ const issues = resolution.issues.map((issue) => toManifestIssue(issue, entries, source));
39
+ return {
40
+ paths: resolution.paths,
41
+ issues,
42
+ };
43
+ }
44
+ function toManifestIssue(issue, entries, source) {
45
+ if (issue.type === "entry") {
46
+ const entry = entries[issue.index];
47
+ return {
48
+ type: "entry",
49
+ source,
50
+ line: entry?.line ?? issue.index + 1,
51
+ value: entry?.value ?? issue.value,
52
+ message: issue.message,
53
+ };
54
+ }
55
+ return {
56
+ type: "manifest",
57
+ source,
58
+ message: issue.type === "base"
59
+ ? `${issue.message}: ${issue.value}`
60
+ : issue.message,
61
+ };
62
+ }
63
+ //# sourceMappingURL=url-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-manifest.js","sourceRoot":"","sources":["../../src/cli/url-manifest.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@
4
4
  export declare function configureLogger(options: {
5
5
  jsonLogs?: boolean;
6
6
  noJsonLogs?: boolean;
7
+ silent?: boolean;
7
8
  }): import("pino").Logger<never, boolean>;
8
9
  /**
9
10
  * Get the current CLI logger instance
package/dist/cli/utils.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createLogger, logger } from "@cleaver/breakcheck-core";
1
+ import { configureLogger as configureCoreLogger, logger, } from "@cleaver/breakcheck-core";
2
2
  // Global logger instance that can be reconfigured
3
3
  let cliLogger = logger;
4
4
  /**
@@ -9,7 +9,10 @@ export function configureLogger(options) {
9
9
  // --json-logs takes precedence over --no-json-logs
10
10
  const useJsonLogs = options.jsonLogs || false;
11
11
  // Create a new logger instance with the specified configuration
12
- cliLogger = createLogger({ useJsonLogs });
12
+ cliLogger = configureCoreLogger({
13
+ useJsonLogs,
14
+ ...(options.silent ? { level: "silent" } : {}),
15
+ });
13
16
  return cliLogger;
14
17
  }
15
18
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/cli/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAEhE,kDAAkD;AAClD,IAAI,SAAS,GAAG,MAAM,CAAC;AAEvB;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAG/B;IACC,uCAAuC;IACvC,mDAAmD;IACnD,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;IAE9C,gEAAgE;IAChE,SAAS,GAAG,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAE1C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/cli/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,IAAI,mBAAmB,EACtC,MAAM,GACP,MAAM,0BAA0B,CAAC;AAElC,kDAAkD;AAClD,IAAI,SAAS,GAAG,MAAM,CAAC;AAEvB;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAI/B;IACC,uCAAuC;IACvC,mDAAmD;IACnD,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;IAE9C,gEAAgE;IAChE,SAAS,GAAG,mBAAmB,CAAC;QAC9B,WAAW;QACX,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/C,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,SAAS,CAAC;AACnB,CAAC"}
package/dist/index.js CHANGED
@@ -2,8 +2,14 @@
2
2
  import { createRequire } from "node:module";
3
3
  import { InteractiveCommand } from "interactive-commander";
4
4
  import { compareCommand } from "./cli/commands/compare.js";
5
+ import { baselineCommand } from "./cli/commands/baseline.js";
6
+ import { checkCommand } from "./cli/commands/check.js";
7
+ import { cleanCommand } from "./cli/commands/clean.js";
8
+ import { compileCommand } from "./cli/commands/compile.js";
5
9
  import { helpCommand } from "./cli/commands/help.js";
10
+ import { initCommand } from "./cli/commands/init.js";
6
11
  import { listSnapshotsCommand } from "./cli/commands/list-snapshots.js";
12
+ import { newCommand } from "./cli/commands/new.js";
7
13
  import { snapshotCommand } from "./cli/commands/snapshot.js";
8
14
  import { viewCommand } from "./cli/commands/view.js";
9
15
  const require = createRequire(import.meta.url);
@@ -14,10 +20,18 @@ const program = new InteractiveCommand();
14
20
  program
15
21
  .name("breakcheck")
16
22
  .description("A tool for comparing website states before and after changes")
23
+ .option("--config <file>", "Use this configuration file instead of discovering one")
24
+ .option("--no-config", "Disable project configuration discovery")
17
25
  .version(packageJson.version);
18
26
  // Add the commands to the program
19
27
  program.addCommand(snapshotCommand);
28
+ program.addCommand(checkCommand);
29
+ program.addCommand(baselineCommand);
20
30
  program.addCommand(compareCommand);
31
+ program.addCommand(cleanCommand);
32
+ program.addCommand(compileCommand);
33
+ program.addCommand(initCommand);
34
+ program.addCommand(newCommand);
21
35
  program.addCommand(listSnapshotsCommand);
22
36
  program.addCommand(viewCommand);
23
37
  program.addCommand(helpCommand);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,0BAA0B;AAC1B,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;AAEzC,wBAAwB;AACxB,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,kCAAkC;AAClC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAEhC,6EAA6E;AAC7E,0EAA0E;AAC1E,+DAA+D;AAC/D,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;KAAM,CAAC;IACN,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,0BAA0B;AAC1B,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;AAEzC,wBAAwB;AACxB,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CACL,iBAAiB,EACjB,wDAAwD,CACzD;KACA,MAAM,CAAC,aAAa,EAAE,yCAAyC,CAAC;KAChE,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,kCAAkC;AAClC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAEhC,6EAA6E;AAC7E,0EAA0E;AAC1E,+DAA+D;AAC/D,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;KAAM,CAAC;IACN,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;AAC7B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cleaver/breakcheck",
3
- "version": "0.2.4",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=22"
@@ -17,7 +17,8 @@
17
17
  "homepage": "https://github.com/cleaver/breakcheck",
18
18
  "bugs": "https://github.com/cleaver/breakcheck/issues",
19
19
  "files": [
20
- "dist"
20
+ "dist",
21
+ "agent-guide.md"
21
22
  ],
22
23
  "bin": {
23
24
  "breakcheck": "dist/index.js"
@@ -28,11 +29,11 @@
28
29
  "start:test-server:after": "node src/__test_server__/server-after.js"
29
30
  },
30
31
  "dependencies": {
31
- "@cleaver/breakcheck-core": "^0.2.4",
32
- "commander": "^12.1.0",
33
- "ejs": "^3.1.10",
34
- "express": "^4.22.2",
32
+ "@cleaver/breakcheck-core": "^0.3.0",
33
+ "commander": "^14.0.3",
34
+ "ejs": "^7.0.1",
35
+ "express": "^5.3.0",
35
36
  "interactive-commander": "^0.6.0",
36
- "pino-pretty": "^11.2.1"
37
+ "pino-pretty": "^13.2.0"
37
38
  }
38
39
  }