@post-print/agent-test 0.3.4 → 0.3.5

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 (102) hide show
  1. package/README.md +122 -43
  2. package/dist/check.d.ts +38 -0
  3. package/dist/check.d.ts.map +1 -0
  4. package/dist/check.js +169 -0
  5. package/dist/check.js.map +1 -0
  6. package/dist/cli.d.ts +11 -7
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +327 -318
  9. package/dist/cli.js.map +1 -1
  10. package/dist/compare-scenario.d.ts +33 -0
  11. package/dist/compare-scenario.d.ts.map +1 -0
  12. package/dist/compare-scenario.js +128 -0
  13. package/dist/compare-scenario.js.map +1 -0
  14. package/dist/debug-bundle.d.ts +2 -1
  15. package/dist/debug-bundle.d.ts.map +1 -1
  16. package/dist/debug-bundle.js +12 -5
  17. package/dist/debug-bundle.js.map +1 -1
  18. package/dist/doctor.d.ts +6 -1
  19. package/dist/doctor.d.ts.map +1 -1
  20. package/dist/doctor.js +133 -11
  21. package/dist/doctor.js.map +1 -1
  22. package/dist/expect.d.ts +6 -5
  23. package/dist/expect.d.ts.map +1 -1
  24. package/dist/expect.js +67 -57
  25. package/dist/expect.js.map +1 -1
  26. package/dist/host-log.d.ts +17 -0
  27. package/dist/host-log.d.ts.map +1 -0
  28. package/dist/host-log.js +154 -0
  29. package/dist/host-log.js.map +1 -0
  30. package/dist/hosts.d.ts +22 -0
  31. package/dist/hosts.d.ts.map +1 -0
  32. package/dist/hosts.js +84 -0
  33. package/dist/hosts.js.map +1 -0
  34. package/dist/html-report.d.ts +0 -13
  35. package/dist/html-report.d.ts.map +1 -1
  36. package/dist/html-report.js +381 -318
  37. package/dist/html-report.js.map +1 -1
  38. package/dist/index.d.ts +14 -7
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +12 -6
  41. package/dist/index.js.map +1 -1
  42. package/dist/live-isolation.d.ts +11 -4
  43. package/dist/live-isolation.d.ts.map +1 -1
  44. package/dist/live-isolation.js +31 -10
  45. package/dist/live-isolation.js.map +1 -1
  46. package/dist/load-adapters.d.ts +13 -0
  47. package/dist/load-adapters.d.ts.map +1 -0
  48. package/dist/load-adapters.js +76 -0
  49. package/dist/load-adapters.js.map +1 -0
  50. package/dist/load-suite.d.ts.map +1 -1
  51. package/dist/load-suite.js +6 -2
  52. package/dist/load-suite.js.map +1 -1
  53. package/dist/mcp-config.d.ts +8 -0
  54. package/dist/mcp-config.d.ts.map +1 -1
  55. package/dist/mcp-config.js +46 -0
  56. package/dist/mcp-config.js.map +1 -1
  57. package/dist/progress.d.ts +7 -0
  58. package/dist/progress.d.ts.map +1 -1
  59. package/dist/progress.js +39 -9
  60. package/dist/progress.js.map +1 -1
  61. package/dist/record-trace.d.ts +9 -7
  62. package/dist/record-trace.d.ts.map +1 -1
  63. package/dist/record-trace.js +5 -16
  64. package/dist/record-trace.js.map +1 -1
  65. package/dist/report-preview-server.d.ts +2 -0
  66. package/dist/report-preview-server.d.ts.map +1 -0
  67. package/dist/report-preview-server.js +24 -0
  68. package/dist/report-preview-server.js.map +1 -0
  69. package/dist/report-preview.d.ts +11 -0
  70. package/dist/report-preview.d.ts.map +1 -0
  71. package/dist/report-preview.js +161 -0
  72. package/dist/report-preview.js.map +1 -0
  73. package/dist/run-suite.d.ts +34 -1
  74. package/dist/run-suite.d.ts.map +1 -1
  75. package/dist/run-suite.js +551 -82
  76. package/dist/run-suite.js.map +1 -1
  77. package/dist/scenario-story.d.ts +41 -0
  78. package/dist/scenario-story.d.ts.map +1 -0
  79. package/dist/scenario-story.js +198 -0
  80. package/dist/scenario-story.js.map +1 -0
  81. package/dist/suite-summary.d.ts +2 -0
  82. package/dist/suite-summary.d.ts.map +1 -1
  83. package/dist/suite-summary.js +70 -22
  84. package/dist/suite-summary.js.map +1 -1
  85. package/dist/theme.d.ts +29 -5
  86. package/dist/theme.d.ts.map +1 -1
  87. package/dist/theme.js +204 -45
  88. package/dist/theme.js.map +1 -1
  89. package/dist/types.d.ts +97 -11
  90. package/dist/types.d.ts.map +1 -1
  91. package/dist/validate-seeds.d.ts.map +1 -1
  92. package/dist/validate-seeds.js +21 -6
  93. package/dist/validate-seeds.js.map +1 -1
  94. package/dist/validate-suite.d.ts +3 -1
  95. package/dist/validate-suite.d.ts.map +1 -1
  96. package/dist/validate-suite.js +258 -23
  97. package/dist/validate-suite.js.map +1 -1
  98. package/package.json +4 -4
  99. package/dist/compare.d.ts +0 -79
  100. package/dist/compare.d.ts.map +0 -1
  101. package/dist/compare.js +0 -232
  102. package/dist/compare.js.map +0 -1
@@ -0,0 +1,154 @@
1
+ import { theme } from "./theme.js";
2
+ const HOST_LOG_RE = /^(?:(\d{2}:\d{2}:\d{2}(?:\.\d{3})?)\s+)?(DEBUG|INFO|WARN(?:ING)?|ERROR)\s+(\S+)\s+(.*)$/;
3
+ const HOST_NOISE_RE = /CursorRulesService|load completed meta=\{/;
4
+ const SERVICE_SHORT = {
5
+ AgentSkillsCursorRulesService: "skills",
6
+ LocalCursorRulesService: "project-rules",
7
+ };
8
+ let installed = false;
9
+ function normalizeLevel(raw) {
10
+ if (raw === "DEBUG") {
11
+ return "debug";
12
+ }
13
+ if (raw === "WARN" || raw === "WARNING") {
14
+ return "warn";
15
+ }
16
+ if (raw === "ERROR") {
17
+ return "error";
18
+ }
19
+ return "info";
20
+ }
21
+ function parseMeta(rest) {
22
+ const match = rest.match(/^(.*?)(?:\s+meta=\{(.*)\})?\s*$/);
23
+ const message = (match?.[1] ?? rest).trim();
24
+ const raw = match?.[2];
25
+ const meta = {};
26
+ if (!raw) {
27
+ return { message, meta };
28
+ }
29
+ for (const part of raw.split(",")) {
30
+ const sep = part.indexOf(":");
31
+ if (sep === -1) {
32
+ continue;
33
+ }
34
+ const key = part.slice(0, sep).trim();
35
+ const value = part.slice(sep + 1).trim();
36
+ if (key && value) {
37
+ meta[key] = value;
38
+ }
39
+ }
40
+ return { message, meta };
41
+ }
42
+ /** Parse a Cursor/host SDK log line. Returns undefined for agent-test output. */
43
+ export function parseHostLogLine(line) {
44
+ const trimmed = line.replace(/\r$/, "").trimEnd();
45
+ const match = trimmed.match(HOST_LOG_RE);
46
+ if (match) {
47
+ const { message, meta } = parseMeta(match[4] ?? "");
48
+ return {
49
+ time: match[1],
50
+ level: normalizeLevel(match[2] ?? "INFO"),
51
+ service: SERVICE_SHORT[match[3] ?? ""] ?? match[3] ?? "host",
52
+ message,
53
+ meta,
54
+ };
55
+ }
56
+ if (HOST_NOISE_RE.test(trimmed)) {
57
+ return { level: "info", service: "host", message: trimmed, meta: {} };
58
+ }
59
+ return undefined;
60
+ }
61
+ function countPhrase(raw, singular, plural) {
62
+ if (raw === undefined) {
63
+ return undefined;
64
+ }
65
+ const count = Number(raw);
66
+ if (!Number.isFinite(count)) {
67
+ return `${raw} ${plural}`;
68
+ }
69
+ return count === 1 ? `1 ${singular}` : `${count} ${plural}`;
70
+ }
71
+ function compactHostDetail(parsed) {
72
+ const bits = [];
73
+ if (parsed.message) {
74
+ bits.push(parsed.message);
75
+ }
76
+ const duration = parsed.meta.durationMs;
77
+ if (duration) {
78
+ bits.push(`${duration}ms`);
79
+ }
80
+ const rules = countPhrase(parsed.meta.ruleCount, "rule", "rules");
81
+ if (rules) {
82
+ bits.push(rules);
83
+ }
84
+ const skills = countPhrase(parsed.meta.skillCount, "skill", "skills");
85
+ if (skills) {
86
+ bits.push(skills);
87
+ }
88
+ return bits.join(" · ");
89
+ }
90
+ export function hostLogsVerbose() {
91
+ return (process.env.AGENT_TEST_DEBUG === "1" ||
92
+ process.env.AGENT_TEST_DEBUG === "true" ||
93
+ process.env.AGENT_TEST_VERBOSE === "1" ||
94
+ process.env.AGENT_TEST_HOST_LOGS === "1");
95
+ }
96
+ /** INFO/DEBUG stay hidden unless debug/verbose. WARN/ERROR always print. */
97
+ export function shouldPrintHostLog(level) {
98
+ if (level === "warn" || level === "error") {
99
+ return true;
100
+ }
101
+ return hostLogsVerbose();
102
+ }
103
+ export function formatHostLogLine(parsed) {
104
+ return theme.hostLog(parsed.level, parsed.service, compactHostDetail(parsed));
105
+ }
106
+ function rewriteChunk(text, pending) {
107
+ pending.value += text;
108
+ const lines = pending.value.split("\n");
109
+ pending.value = lines.pop() ?? "";
110
+ const kept = [];
111
+ for (const line of lines) {
112
+ const parsed = parseHostLogLine(line);
113
+ if (!parsed) {
114
+ kept.push(line);
115
+ continue;
116
+ }
117
+ if (!shouldPrintHostLog(parsed.level)) {
118
+ continue;
119
+ }
120
+ kept.push(formatHostLogLine(parsed));
121
+ }
122
+ if (kept.length === 0) {
123
+ return "";
124
+ }
125
+ return `${kept.join("\n")}\n`;
126
+ }
127
+ function patchWriteStream(stream) {
128
+ const original = stream.write.bind(stream);
129
+ const pending = { value: "" };
130
+ stream.write = ((chunk, encoding, cb) => {
131
+ const callback = typeof encoding === "function" ? encoding : cb;
132
+ const enc = typeof encoding === "string" ? encoding : undefined;
133
+ const text = typeof chunk === "string" ? chunk : Buffer.from(chunk).toString("utf8");
134
+ if (text.includes("\r") && !text.includes("\n")) {
135
+ return original(chunk, enc, callback);
136
+ }
137
+ const rewritten = rewriteChunk(text, pending);
138
+ if (!rewritten) {
139
+ callback?.(null);
140
+ return true;
141
+ }
142
+ return original(rewritten, enc, callback);
143
+ });
144
+ }
145
+ /** Rewrite or drop host SDK logs on stdout/stderr. Safe to call more than once. */
146
+ export function installHostLogFilter() {
147
+ if (installed) {
148
+ return;
149
+ }
150
+ installed = true;
151
+ patchWriteStream(process.stdout);
152
+ patchWriteStream(process.stderr);
153
+ }
154
+ //# sourceMappingURL=host-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-log.js","sourceRoot":"","sources":["../src/host-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type AgentHost } from "@post-print/agent-harness";
2
+ /** Deduplicate hosts and keep first-seen order. */
3
+ export declare function uniqueHosts(hosts: readonly AgentHost[] | undefined): AgentHost[] | undefined;
4
+ /**
5
+ * Parse `--host` values.
6
+ * Accepts `all`, comma-separated names, and repeatable flags (caller concatenates).
7
+ */
8
+ export declare function parseHostList(raw: string): AgentHost[];
9
+ /** Hosts one suite run will launch after CLI, suite `hosts`, and `defaults.host`. */
10
+ export declare function resolveSuiteHosts(options: {
11
+ cliHosts?: readonly AgentHost[];
12
+ suiteHosts?: readonly AgentHost[];
13
+ defaultHost?: AgentHost;
14
+ }): AgentHost[];
15
+ /**
16
+ * When a matrix locks the host, skip scenarios pinned to a different host.
17
+ * A single-host run still lets `scenario.host` override the default.
18
+ */
19
+ export declare function scenarioRunsOnHost(scenario: {
20
+ host?: AgentHost;
21
+ }, host: AgentHost, hostLocked: boolean): boolean;
22
+ //# sourceMappingURL=hosts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosts.d.ts","sourceRoot":"","sources":["../src/hosts.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,SAAS,EAId,MAAM,2BAA2B,CAAC;AAInC,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,GAAG,SAAS,CAc5F;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CA+BtD;AAED,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IAC1C,QAAQ,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAChC,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,SAAS,CAAC;CACxB,GAAG,SAAS,EAAE,CAmBd;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE;IAAE,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,EAC9B,IAAI,EAAE,SAAS,EACf,UAAU,EAAE,OAAO,GACjB,OAAO,CAKT"}
package/dist/hosts.js ADDED
@@ -0,0 +1,84 @@
1
+ import { isBuiltinAgentHost, isHostSlug, knownAgentHosts, } from "@post-print/agent-harness";
2
+ const HOST_FLAG_HELP = "cursor|claude|openai|all|<slug>";
3
+ /** Deduplicate hosts and keep first-seen order. */
4
+ export function uniqueHosts(hosts) {
5
+ if (!hosts || hosts.length === 0) {
6
+ return undefined;
7
+ }
8
+ const seen = new Set();
9
+ const unique = [];
10
+ for (const host of hosts) {
11
+ if (seen.has(host)) {
12
+ continue;
13
+ }
14
+ seen.add(host);
15
+ unique.push(host);
16
+ }
17
+ return unique;
18
+ }
19
+ /**
20
+ * Parse `--host` values.
21
+ * Accepts `all`, comma-separated names, and repeatable flags (caller concatenates).
22
+ */
23
+ export function parseHostList(raw) {
24
+ const tokens = raw
25
+ .split(",")
26
+ .map((token) => token.trim().toLowerCase())
27
+ .filter((token) => token.length > 0);
28
+ if (tokens.length === 0) {
29
+ throw new Error(`--host must be ${HOST_FLAG_HELP}`);
30
+ }
31
+ const hosts = [];
32
+ for (const token of tokens) {
33
+ if (token === "replay") {
34
+ throw new Error("Replay-based testing is deprecated and no longer supported; use --host cursor, --host claude, or --host openai.");
35
+ }
36
+ if (token === "all") {
37
+ for (const host of knownAgentHosts()) {
38
+ if (!hosts.includes(host)) {
39
+ hosts.push(host);
40
+ }
41
+ }
42
+ continue;
43
+ }
44
+ if (!isBuiltinAgentHost(token) && !isHostSlug(token)) {
45
+ throw new Error(`--host must be ${HOST_FLAG_HELP}`);
46
+ }
47
+ if (!hosts.includes(token)) {
48
+ hosts.push(token);
49
+ }
50
+ }
51
+ return hosts;
52
+ }
53
+ /** Hosts one suite run will launch after CLI, suite `hosts`, and `defaults.host`. */
54
+ export function resolveSuiteHosts(options) {
55
+ const fallback = options.defaultHost ?? "cursor";
56
+ const cli = uniqueHosts(options.cliHosts);
57
+ const suite = uniqueHosts(options.suiteHosts);
58
+ if (cli && suite) {
59
+ const allowed = new Set(suite);
60
+ const filtered = cli.filter((host) => allowed.has(host));
61
+ if (filtered.length === 0) {
62
+ throw new Error(`--host ${cli.join(",")} does not match suite hosts ${suite.join(",")}`);
63
+ }
64
+ return filtered;
65
+ }
66
+ if (cli) {
67
+ return cli;
68
+ }
69
+ if (suite) {
70
+ return suite;
71
+ }
72
+ return [fallback];
73
+ }
74
+ /**
75
+ * When a matrix locks the host, skip scenarios pinned to a different host.
76
+ * A single-host run still lets `scenario.host` override the default.
77
+ */
78
+ export function scenarioRunsOnHost(scenario, host, hostLocked) {
79
+ if (!hostLocked || scenario.host === undefined) {
80
+ return true;
81
+ }
82
+ return scenario.host === host;
83
+ }
84
+ //# sourceMappingURL=hosts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosts.js","sourceRoot":"","sources":["../src/hosts.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,9 @@
1
- import { type SuiteCompareReport } from "./compare.js";
2
1
  import type { SuiteRunReport } from "./types.js";
3
2
  export interface HtmlReportMeta {
4
3
  generatedAt?: Date;
5
4
  host?: string;
6
5
  suitesDir?: string;
7
- /**
8
- * When two suite reports are present, embed an A/B compare table (default true).
9
- * Set false to skip (e.g. unrelated multi-suite runs).
10
- */
11
- includeCompare?: boolean;
12
- /** Labels for the embedded compare section (defaults to suite names). */
13
- compareALabel?: string;
14
- compareBLabel?: string;
15
6
  }
16
- /** Render an A/B compare table (fragment — no document chrome). */
17
- export declare function renderCompareHtmlSection(report: SuiteCompareReport): string;
18
- /** Standalone compare HTML document (written next to compare-report.json / .md). */
19
- export declare function renderCompareHtmlReport(report: SuiteCompareReport, meta?: HtmlReportMeta): string;
20
7
  /** Build a self-contained HTML report for a completed suite run. */
21
8
  export declare function renderHtmlReport(reports: SuiteRunReport[], meta?: HtmlReportMeta): string;
22
9
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"html-report.d.ts","sourceRoot":"","sources":["../src/html-report.ts"],"names":[],"mappings":"AAWA,OAAO,EAGN,KAAK,kBAAkB,EACvB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAkB,cAAc,EAAc,MAAM,YAAY,CAAC;AAE7E,MAAM,WAAW,cAAc;IAC9B,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAsZD,mEAAmE;AACnE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAoE3E;AAED,oFAAoF;AACpF,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,kBAAkB,EAC1B,IAAI,GAAE,cAAmB,GACvB,MAAM,CAiCR;AAySD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,IAAI,GAAE,cAAmB,GAAG,MAAM,CA4E7F;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACpC,OAAO,EAAE,cAAc,EAAE,EACzB,IAAI,GAAE,cAAmB,EACzB,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAQjB"}
1
+ {"version":3,"file":"html-report.d.ts","sourceRoot":"","sources":["../src/html-report.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAoC,cAAc,EAAc,MAAM,YAAY,CAAC;AAE/F,MAAM,WAAW,cAAc;IAC9B,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAq5BD,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,IAAI,GAAE,cAAmB,GAAG,MAAM,CAkD7F;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACpC,OAAO,EAAE,cAAc,EAAE,EACzB,IAAI,GAAE,cAAmB,EACzB,OAAO,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAQjB"}