@urateam/core 0.1.33 → 0.1.35
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/dist/__tests__/audit-immutability.test.js +50 -0
- package/dist/__tests__/audit-immutability.test.js.map +1 -1
- package/dist/__tests__/pm-scheduler.test.js +59 -0
- package/dist/__tests__/pm-scheduler.test.js.map +1 -1
- package/dist/__tests__/review-convention-prompt.test.d.ts +2 -0
- package/dist/__tests__/review-convention-prompt.test.d.ts.map +1 -0
- package/dist/__tests__/review-convention-prompt.test.js +142 -0
- package/dist/__tests__/review-convention-prompt.test.js.map +1 -0
- package/dist/__tests__/runner-retry-strategies.test.d.ts +23 -0
- package/dist/__tests__/runner-retry-strategies.test.d.ts.map +1 -0
- package/dist/__tests__/runner-retry-strategies.test.js +274 -0
- package/dist/__tests__/runner-retry-strategies.test.js.map +1 -0
- package/dist/__tests__/scratch-file-guard.test.d.ts +2 -0
- package/dist/__tests__/scratch-file-guard.test.d.ts.map +1 -0
- package/dist/__tests__/scratch-file-guard.test.js +144 -0
- package/dist/__tests__/scratch-file-guard.test.js.map +1 -0
- package/dist/__tests__/spec-vs-impl-gate.test.d.ts +2 -0
- package/dist/__tests__/spec-vs-impl-gate.test.d.ts.map +1 -0
- package/dist/__tests__/spec-vs-impl-gate.test.js +222 -0
- package/dist/__tests__/spec-vs-impl-gate.test.js.map +1 -0
- package/dist/__tests__/typecheck-gate.test.d.ts +2 -0
- package/dist/__tests__/typecheck-gate.test.d.ts.map +1 -0
- package/dist/__tests__/typecheck-gate.test.js +196 -0
- package/dist/__tests__/typecheck-gate.test.js.map +1 -0
- package/dist/audit/events.d.ts +39 -0
- package/dist/audit/events.d.ts.map +1 -1
- package/dist/audit/events.js +60 -0
- package/dist/audit/events.js.map +1 -1
- package/dist/executor/prompt/templates.d.ts.map +1 -1
- package/dist/executor/prompt/templates.js +6 -3
- package/dist/executor/prompt/templates.js.map +1 -1
- package/dist/executor/review/review-prompt.d.ts.map +1 -1
- package/dist/executor/review/review-prompt.js +8 -2
- package/dist/executor/review/review-prompt.js.map +1 -1
- package/dist/pipeline/runner.d.ts.map +1 -1
- package/dist/pipeline/runner.js +145 -1
- package/dist/pipeline/runner.js.map +1 -1
- package/dist/pipeline/scratch-file-guard.d.ts +21 -0
- package/dist/pipeline/scratch-file-guard.d.ts.map +1 -0
- package/dist/pipeline/scratch-file-guard.js +155 -0
- package/dist/pipeline/scratch-file-guard.js.map +1 -0
- package/dist/pipeline/spec-vs-impl-gate.d.ts +49 -0
- package/dist/pipeline/spec-vs-impl-gate.d.ts.map +1 -0
- package/dist/pipeline/spec-vs-impl-gate.js +177 -0
- package/dist/pipeline/spec-vs-impl-gate.js.map +1 -0
- package/dist/pipeline/typecheck-gate.d.ts +34 -0
- package/dist/pipeline/typecheck-gate.d.ts.map +1 -0
- package/dist/pipeline/typecheck-gate.js +89 -0
- package/dist/pipeline/typecheck-gate.js.map +1 -0
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +1 -1
- package/dist/security/index.js.map +1 -1
- package/dist/security/review-checklist.d.ts +16 -1
- package/dist/security/review-checklist.d.ts.map +1 -1
- package/dist/security/review-checklist.js +85 -1
- package/dist/security/review-checklist.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner-retry-strategies.test.js","sourceRoot":"","sources":["../../src/__tests__/runner-retry-strategies.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-file-guard.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/scratch-file-guard.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier 1a — scratch-file denylist gate.
|
|
3
|
+
*
|
|
4
|
+
* `findScratchFiles` is wired into the pipeline runner just before push and
|
|
5
|
+
* forces draft + a `category: "scratch-files"` blocking finding when any of
|
|
6
|
+
* the agent's added files match the denylist (FINAL_CHECKLIST.md,
|
|
7
|
+
* commit-test-changes.sh, TESTING_COMPLETE.md, *.bak, untracked *.log, etc).
|
|
8
|
+
*
|
|
9
|
+
* The matcher is a pure function so it can be tested without git. The git
|
|
10
|
+
* layer (`enumerateAddedFiles`) is exercised by the runner integration.
|
|
11
|
+
*/
|
|
12
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
13
|
+
import { matchScratchPatterns } from "../pipeline/scratch-file-guard.js";
|
|
14
|
+
describe("matchScratchPatterns — fires on bad cases", () => {
|
|
15
|
+
it("matches FINAL_CHECKLIST.md at repo root", () => {
|
|
16
|
+
expect(matchScratchPatterns(["FINAL_CHECKLIST.md"])).toEqual([
|
|
17
|
+
"FINAL_CHECKLIST.md",
|
|
18
|
+
]);
|
|
19
|
+
});
|
|
20
|
+
it("matches TESTING_COMPLETE.md at repo root (TESTING_* pattern)", () => {
|
|
21
|
+
expect(matchScratchPatterns(["TESTING_COMPLETE.md"])).toEqual([
|
|
22
|
+
"TESTING_COMPLETE.md",
|
|
23
|
+
]);
|
|
24
|
+
});
|
|
25
|
+
it("matches *_REPORT.md (case-insensitive)", () => {
|
|
26
|
+
expect(matchScratchPatterns(["VERIFICATION_REPORT.md"])).toEqual([
|
|
27
|
+
"VERIFICATION_REPORT.md",
|
|
28
|
+
]);
|
|
29
|
+
expect(matchScratchPatterns(["test_report.md"])).toEqual(["test_report.md"]);
|
|
30
|
+
});
|
|
31
|
+
it("matches TEST_*.md at repo root", () => {
|
|
32
|
+
expect(matchScratchPatterns(["TEST_PLAN.md"])).toEqual(["TEST_PLAN.md"]);
|
|
33
|
+
});
|
|
34
|
+
it("matches FINAL_*.md at repo root", () => {
|
|
35
|
+
expect(matchScratchPatterns(["FINAL_NOTES.md"])).toEqual(["FINAL_NOTES.md"]);
|
|
36
|
+
});
|
|
37
|
+
it("matches *.bak and *.bak.* anywhere", () => {
|
|
38
|
+
expect(matchScratchPatterns(["foo.bak"])).toEqual(["foo.bak"]);
|
|
39
|
+
expect(matchScratchPatterns(["src/utils.ts.bak"])).toEqual(["src/utils.ts.bak"]);
|
|
40
|
+
expect(matchScratchPatterns(["config.bak.20260511"])).toEqual([
|
|
41
|
+
"config.bak.20260511",
|
|
42
|
+
]);
|
|
43
|
+
});
|
|
44
|
+
it("matches root-level commit-*.sh and run-*.sh", () => {
|
|
45
|
+
expect(matchScratchPatterns(["commit-test-changes.sh"])).toEqual([
|
|
46
|
+
"commit-test-changes.sh",
|
|
47
|
+
]);
|
|
48
|
+
expect(matchScratchPatterns(["run-verification.sh"])).toEqual([
|
|
49
|
+
"run-verification.sh",
|
|
50
|
+
]);
|
|
51
|
+
});
|
|
52
|
+
it("matches *.tmp anywhere", () => {
|
|
53
|
+
expect(matchScratchPatterns(["scratch.tmp"])).toEqual(["scratch.tmp"]);
|
|
54
|
+
expect(matchScratchPatterns(["src/foo.tmp"])).toEqual(["src/foo.tmp"]);
|
|
55
|
+
});
|
|
56
|
+
it("matches untracked *.log anywhere", () => {
|
|
57
|
+
expect(matchScratchPatterns(["debug.log"])).toEqual(["debug.log"]);
|
|
58
|
+
expect(matchScratchPatterns(["logs/run.log"])).toEqual(["logs/run.log"]);
|
|
59
|
+
});
|
|
60
|
+
it("matches any new repo-root *.md NOT in the exemption set", () => {
|
|
61
|
+
expect(matchScratchPatterns(["NOTES.md"])).toEqual(["NOTES.md"]);
|
|
62
|
+
expect(matchScratchPatterns(["scratch.md"])).toEqual(["scratch.md"]);
|
|
63
|
+
expect(matchScratchPatterns(["SUMMARY.md"])).toEqual(["SUMMARY.md"]);
|
|
64
|
+
});
|
|
65
|
+
it("returns all matches in input order, deduped", () => {
|
|
66
|
+
const matches = matchScratchPatterns([
|
|
67
|
+
"FINAL_CHECKLIST.md",
|
|
68
|
+
"src/foo.ts",
|
|
69
|
+
"commit-test.sh",
|
|
70
|
+
"debug.log",
|
|
71
|
+
]);
|
|
72
|
+
expect(matches).toEqual([
|
|
73
|
+
"FINAL_CHECKLIST.md",
|
|
74
|
+
"commit-test.sh",
|
|
75
|
+
"debug.log",
|
|
76
|
+
]);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe("matchScratchPatterns — does NOT fire on clean diffs", () => {
|
|
80
|
+
it("does not match repo-root README.md (tracked exemption)", () => {
|
|
81
|
+
expect(matchScratchPatterns(["README.md"])).toEqual([]);
|
|
82
|
+
});
|
|
83
|
+
it("does not match repo-root CLAUDE.md (tracked exemption)", () => {
|
|
84
|
+
expect(matchScratchPatterns(["CLAUDE.md"])).toEqual([]);
|
|
85
|
+
});
|
|
86
|
+
it("does not match repo-root CHANGELOG.md, CONTRIBUTING.md, SECURITY.md, CODE_OF_CONDUCT.md, LICENSE.md, AUTHORS.md", () => {
|
|
87
|
+
expect(matchScratchPatterns([
|
|
88
|
+
"CHANGELOG.md",
|
|
89
|
+
"CONTRIBUTING.md",
|
|
90
|
+
"SECURITY.md",
|
|
91
|
+
"CODE_OF_CONDUCT.md",
|
|
92
|
+
"LICENSE.md",
|
|
93
|
+
"AUTHORS.md",
|
|
94
|
+
])).toEqual([]);
|
|
95
|
+
});
|
|
96
|
+
it("does not match exemptions case-insensitively (Readme.md, Changelog.md)", () => {
|
|
97
|
+
expect(matchScratchPatterns(["Readme.md", "Changelog.md"])).toEqual([]);
|
|
98
|
+
});
|
|
99
|
+
it("does not match docs in subdirectories (docs/foo.md, .github/PULL_REQUEST_TEMPLATE.md)", () => {
|
|
100
|
+
expect(matchScratchPatterns([
|
|
101
|
+
"docs/feature.md",
|
|
102
|
+
".github/PULL_REQUEST_TEMPLATE.md",
|
|
103
|
+
"packages/core/README.md",
|
|
104
|
+
])).toEqual([]);
|
|
105
|
+
});
|
|
106
|
+
it("does not match real source files (src/foo.ts, packages/core/src/runner.ts, scripts/sync.ts)", () => {
|
|
107
|
+
expect(matchScratchPatterns([
|
|
108
|
+
"src/foo.ts",
|
|
109
|
+
"packages/core/src/pipeline/runner.ts",
|
|
110
|
+
"scripts/gh-linear-sync.ts",
|
|
111
|
+
"tests/foo.test.ts",
|
|
112
|
+
])).toEqual([]);
|
|
113
|
+
});
|
|
114
|
+
it("does not match nested .sh scripts (scripts/setup.sh) — only root commit-*.sh / run-*.sh", () => {
|
|
115
|
+
expect(matchScratchPatterns(["scripts/setup.sh", "deploy/restart.sh"])).toEqual([]);
|
|
116
|
+
});
|
|
117
|
+
it("returns empty array for an empty input", () => {
|
|
118
|
+
expect(matchScratchPatterns([])).toEqual([]);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe("findScratchFiles env-var escape hatch", () => {
|
|
122
|
+
const ENV_KEY = "URATEAM_DISABLE_SCRATCH_GUARD";
|
|
123
|
+
beforeEach(() => {
|
|
124
|
+
delete process.env[ENV_KEY];
|
|
125
|
+
});
|
|
126
|
+
afterEach(() => {
|
|
127
|
+
delete process.env[ENV_KEY];
|
|
128
|
+
});
|
|
129
|
+
it("when URATEAM_DISABLE_SCRATCH_GUARD=true, returns skipped=true and empty files (no git work)", async () => {
|
|
130
|
+
process.env[ENV_KEY] = "true";
|
|
131
|
+
const { findScratchFiles } = await import("../pipeline/scratch-file-guard.js");
|
|
132
|
+
const result = await findScratchFiles("/nonexistent/path", "main");
|
|
133
|
+
expect(result).toEqual({ files: [], skipped: true });
|
|
134
|
+
});
|
|
135
|
+
it("when URATEAM_DISABLE_SCRATCH_GUARD is unset, gate is active (returns skipped=false)", async () => {
|
|
136
|
+
// We don't have a real worktree here, so we just confirm skipped is false.
|
|
137
|
+
// The git layer is exercised by the runner integration tests.
|
|
138
|
+
const { findScratchFiles } = await import("../pipeline/scratch-file-guard.js");
|
|
139
|
+
// Use a path that exists but is not a git repo so git commands return [].
|
|
140
|
+
const result = await findScratchFiles("/tmp", "main");
|
|
141
|
+
expect(result.skipped).toBe(false);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
//# sourceMappingURL=scratch-file-guard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-file-guard.test.js","sourceRoot":"","sources":["../../src/__tests__/scratch-file-guard.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-vs-impl-gate.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/spec-vs-impl-gate.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier 1c — spec-vs-impl JSDoc gate.
|
|
3
|
+
*
|
|
4
|
+
* Scans newly-added JSDoc blocks for references to `config.X` / `opts.X` /
|
|
5
|
+
* `env.X` / `deps.X` / `options.X` and verifies the referenced symbol exists
|
|
6
|
+
* SOMEWHERE in the worktree's TS/TSX/JS files. If absent, the runner pushes a
|
|
7
|
+
* blocking `category: "spec-vs-impl"` finding. Catches PR #254-style failures
|
|
8
|
+
* where docs promised `implementProviderFallback` but it was never added to
|
|
9
|
+
* the Zod schema or referenced in any implementation.
|
|
10
|
+
*
|
|
11
|
+
* The matcher is a pure function (`extractPromisedSymbols`) so the unit tests
|
|
12
|
+
* don't need a git or worktree. The verification step (`isSymbolDefined`)
|
|
13
|
+
* uses a configurable lookup so tests inject a fake source corpus.
|
|
14
|
+
*/
|
|
15
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
16
|
+
import { extractPromisedSymbols, checkSpecVsImplFromContent, } from "../pipeline/spec-vs-impl-gate.js";
|
|
17
|
+
const ENV_KEY = "URATEAM_DISABLE_SPEC_VS_IMPL_GATE";
|
|
18
|
+
describe("extractPromisedSymbols — extracts config.X / opts.X / env.X / deps.X / options.X from JSDoc blocks", () => {
|
|
19
|
+
it("extracts a single config.foo reference from a JSDoc block", () => {
|
|
20
|
+
const content = `
|
|
21
|
+
/**
|
|
22
|
+
* Does a thing. Reads \`config.maxAttempts\` to determine the limit.
|
|
23
|
+
*/
|
|
24
|
+
export function doThing() {}
|
|
25
|
+
`;
|
|
26
|
+
expect(extractPromisedSymbols(content)).toEqual([
|
|
27
|
+
{ prefix: "config", symbol: "maxAttempts" },
|
|
28
|
+
]);
|
|
29
|
+
});
|
|
30
|
+
it("extracts multiple references across one block, deduplicated", () => {
|
|
31
|
+
const content = `
|
|
32
|
+
/**
|
|
33
|
+
* Uses config.maxAttempts and config.maxAttempts (twice) and opts.timeoutMs.
|
|
34
|
+
* Also references env.NODE_ENV.
|
|
35
|
+
*/
|
|
36
|
+
`;
|
|
37
|
+
const result = extractPromisedSymbols(content);
|
|
38
|
+
// Order preserved on first occurrence; duplicates removed.
|
|
39
|
+
expect(result).toEqual([
|
|
40
|
+
{ prefix: "config", symbol: "maxAttempts" },
|
|
41
|
+
{ prefix: "opts", symbol: "timeoutMs" },
|
|
42
|
+
{ prefix: "env", symbol: "NODE_ENV" },
|
|
43
|
+
]);
|
|
44
|
+
});
|
|
45
|
+
it("extracts the BEC-201-style case (docblock promises a non-existent provider-fallback field)", () => {
|
|
46
|
+
// Synthetic symbol so the runtime corpus check isn't laundered by this
|
|
47
|
+
// test file itself appearing in the worktree's tracked-source corpus.
|
|
48
|
+
const content = `
|
|
49
|
+
/**
|
|
50
|
+
* Configures the provider chain. When \`config.aBec201RegressionField\` is
|
|
51
|
+
* set, the secondary provider is used if the primary fails.
|
|
52
|
+
*/
|
|
53
|
+
export const Schema = z.object({ implementProvider: z.string() });
|
|
54
|
+
`;
|
|
55
|
+
expect(extractPromisedSymbols(content)).toEqual([
|
|
56
|
+
{ prefix: "config", symbol: "aBec201RegressionField" },
|
|
57
|
+
]);
|
|
58
|
+
});
|
|
59
|
+
it("handles multi-line JSDoc blocks", () => {
|
|
60
|
+
const content = `
|
|
61
|
+
/**
|
|
62
|
+
* Long block.
|
|
63
|
+
*
|
|
64
|
+
* @remarks
|
|
65
|
+
* Reads
|
|
66
|
+
* config.foo
|
|
67
|
+
* and
|
|
68
|
+
* opts.bar
|
|
69
|
+
* to compute the result.
|
|
70
|
+
*/
|
|
71
|
+
`;
|
|
72
|
+
expect(extractPromisedSymbols(content)).toEqual([
|
|
73
|
+
{ prefix: "config", symbol: "foo" },
|
|
74
|
+
{ prefix: "opts", symbol: "bar" },
|
|
75
|
+
]);
|
|
76
|
+
});
|
|
77
|
+
it("supports deps.X and options.X prefixes", () => {
|
|
78
|
+
const content = `
|
|
79
|
+
/**
|
|
80
|
+
* Uses deps.logger and options.timeout.
|
|
81
|
+
*/
|
|
82
|
+
`;
|
|
83
|
+
expect(extractPromisedSymbols(content)).toEqual([
|
|
84
|
+
{ prefix: "deps", symbol: "logger" },
|
|
85
|
+
{ prefix: "options", symbol: "timeout" },
|
|
86
|
+
]);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe("extractPromisedSymbols — ignores code outside JSDoc blocks", () => {
|
|
90
|
+
it("does NOT match references in regular code", () => {
|
|
91
|
+
const content = `
|
|
92
|
+
const x = config.foo;
|
|
93
|
+
const y = opts.bar;
|
|
94
|
+
return env.NODE_ENV;
|
|
95
|
+
`;
|
|
96
|
+
expect(extractPromisedSymbols(content)).toEqual([]);
|
|
97
|
+
});
|
|
98
|
+
it("does NOT match references in single-line // comments", () => {
|
|
99
|
+
const content = `
|
|
100
|
+
// References config.foo in a line comment
|
|
101
|
+
const x = 1;
|
|
102
|
+
`;
|
|
103
|
+
expect(extractPromisedSymbols(content)).toEqual([]);
|
|
104
|
+
});
|
|
105
|
+
it("does NOT match references in regular /* */ block comments (only JSDoc /** */)", () => {
|
|
106
|
+
const content = `
|
|
107
|
+
/* config.foo here is in a regular block comment, not JSDoc */
|
|
108
|
+
const x = 1;
|
|
109
|
+
`;
|
|
110
|
+
expect(extractPromisedSymbols(content)).toEqual([]);
|
|
111
|
+
});
|
|
112
|
+
it("returns empty for content without any JSDoc", () => {
|
|
113
|
+
expect(extractPromisedSymbols("")).toEqual([]);
|
|
114
|
+
expect(extractPromisedSymbols("const x = 1;\nfunction f() {}\n")).toEqual([]);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe("checkSpecVsImplFromContent — flags symbols not defined in any TS file", () => {
|
|
118
|
+
it("BEC-201-style regression: docblock promises a config field absent from code → finding", () => {
|
|
119
|
+
// Uses a synthetic symbol (rather than the real BEC-201 string) so that
|
|
120
|
+
// the runtime corpus check is not laundered by this test file itself.
|
|
121
|
+
const fileContent = `
|
|
122
|
+
/**
|
|
123
|
+
* Configures the provider chain. When \`config.aBec201RegressionField\` is
|
|
124
|
+
* set, the secondary provider is used if the primary fails.
|
|
125
|
+
*/
|
|
126
|
+
export const Schema = z.object({
|
|
127
|
+
implementProvider: z.string(),
|
|
128
|
+
});
|
|
129
|
+
`;
|
|
130
|
+
// Pretend the worktree's TS corpus contains only `implementProvider`, not
|
|
131
|
+
// the promised `aBec201RegressionField`.
|
|
132
|
+
const corpus = "implementProvider implementProvider implementProvider";
|
|
133
|
+
const findings = checkSpecVsImplFromContent({
|
|
134
|
+
files: [{ path: "src/pipeline/config.ts", content: fileContent }],
|
|
135
|
+
corpusContainsSymbol: (sym) => corpus.includes(sym),
|
|
136
|
+
});
|
|
137
|
+
expect(findings).toHaveLength(1);
|
|
138
|
+
expect(findings[0]).toMatchObject({
|
|
139
|
+
filePath: "src/pipeline/config.ts",
|
|
140
|
+
promisedSymbol: "aBec201RegressionField",
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
it("emits one finding per (file, symbol), deduped across multiple JSDoc blocks in the same file", () => {
|
|
144
|
+
const fileContent = `
|
|
145
|
+
/** First block: config.fooMissing */
|
|
146
|
+
export function a() {}
|
|
147
|
+
|
|
148
|
+
/** Second block: config.fooMissing again, and opts.barMissing */
|
|
149
|
+
export function b() {}
|
|
150
|
+
`;
|
|
151
|
+
const findings = checkSpecVsImplFromContent({
|
|
152
|
+
files: [{ path: "src/foo.ts", content: fileContent }],
|
|
153
|
+
corpusContainsSymbol: () => false, // nothing defined
|
|
154
|
+
});
|
|
155
|
+
expect(findings).toHaveLength(2);
|
|
156
|
+
expect(findings.map((f) => f.promisedSymbol).sort()).toEqual([
|
|
157
|
+
"barMissing",
|
|
158
|
+
"fooMissing",
|
|
159
|
+
]);
|
|
160
|
+
});
|
|
161
|
+
it("emits findings per file when same symbol is promised in two files but defined in neither", () => {
|
|
162
|
+
const findings = checkSpecVsImplFromContent({
|
|
163
|
+
files: [
|
|
164
|
+
{ path: "a.ts", content: "/** config.zzz */" },
|
|
165
|
+
{ path: "b.ts", content: "/** config.zzz */" },
|
|
166
|
+
],
|
|
167
|
+
corpusContainsSymbol: () => false,
|
|
168
|
+
});
|
|
169
|
+
expect(findings).toHaveLength(2);
|
|
170
|
+
expect(findings.map((f) => f.filePath).sort()).toEqual(["a.ts", "b.ts"]);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
describe("checkSpecVsImplFromContent — does NOT fire when the symbol IS defined somewhere", () => {
|
|
174
|
+
it("config.maxAttempts in docs + maxAttempts in schema → no finding", () => {
|
|
175
|
+
const fileContent = `
|
|
176
|
+
/**
|
|
177
|
+
* Reads \`config.maxAttempts\` to determine the limit.
|
|
178
|
+
*/
|
|
179
|
+
export const PipelineConfigSchema = z.object({
|
|
180
|
+
maxAttempts: z.number(),
|
|
181
|
+
});
|
|
182
|
+
`;
|
|
183
|
+
const findings = checkSpecVsImplFromContent({
|
|
184
|
+
files: [{ path: "src/config.ts", content: fileContent }],
|
|
185
|
+
corpusContainsSymbol: (sym) => sym === "maxAttempts",
|
|
186
|
+
});
|
|
187
|
+
expect(findings).toEqual([]);
|
|
188
|
+
});
|
|
189
|
+
it("multiple promised symbols, all defined elsewhere → no findings", () => {
|
|
190
|
+
const fileContent = `
|
|
191
|
+
/** Uses config.a, opts.b, env.c, deps.d. */
|
|
192
|
+
`;
|
|
193
|
+
const defined = new Set(["a", "b", "c", "d"]);
|
|
194
|
+
const findings = checkSpecVsImplFromContent({
|
|
195
|
+
files: [{ path: "src/x.ts", content: fileContent }],
|
|
196
|
+
corpusContainsSymbol: (sym) => defined.has(sym),
|
|
197
|
+
});
|
|
198
|
+
expect(findings).toEqual([]);
|
|
199
|
+
});
|
|
200
|
+
it("returns empty for an empty file list", () => {
|
|
201
|
+
const findings = checkSpecVsImplFromContent({
|
|
202
|
+
files: [],
|
|
203
|
+
corpusContainsSymbol: () => false,
|
|
204
|
+
});
|
|
205
|
+
expect(findings).toEqual([]);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
describe("checkSpecVsImpl env-var escape hatch", () => {
|
|
209
|
+
beforeEach(() => {
|
|
210
|
+
delete process.env[ENV_KEY];
|
|
211
|
+
});
|
|
212
|
+
afterEach(() => {
|
|
213
|
+
delete process.env[ENV_KEY];
|
|
214
|
+
});
|
|
215
|
+
it("when URATEAM_DISABLE_SPEC_VS_IMPL_GATE=true, returns skipped=true and empty findings", async () => {
|
|
216
|
+
process.env[ENV_KEY] = "true";
|
|
217
|
+
const { checkSpecVsImpl } = await import("../pipeline/spec-vs-impl-gate.js");
|
|
218
|
+
const result = await checkSpecVsImpl("/nonexistent", "main");
|
|
219
|
+
expect(result).toEqual({ findings: [], skipped: true });
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
//# sourceMappingURL=spec-vs-impl-gate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-vs-impl-gate.test.js","sourceRoot":"","sources":["../../src/__tests__/spec-vs-impl-gate.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typecheck-gate.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/typecheck-gate.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier 1b — typecheck gate.
|
|
3
|
+
*
|
|
4
|
+
* `runTypecheck` runs the project's idiomatic typecheck command inside the
|
|
5
|
+
* worktree and reports pass/fail with a structured payload (errorCount, first
|
|
6
|
+
* 5 messages, raw output). The runner consumes the result, surfaces a
|
|
7
|
+
* `category: "typecheck"` blocking review finding on failure, and emits a
|
|
8
|
+
* `pipeline.typecheck_failed` audit event.
|
|
9
|
+
*
|
|
10
|
+
* The function takes a `runner` DI hook so the unit tests don't require a
|
|
11
|
+
* real `pnpm` / `tsc` install; the real default uses `execFile` per repo
|
|
12
|
+
* convention (CLAUDE.md: "Use `execFile` (never `exec`) for shell commands").
|
|
13
|
+
*/
|
|
14
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
15
|
+
import { runTypecheck } from "../pipeline/typecheck-gate.js";
|
|
16
|
+
const ENV_KEY = "URATEAM_DISABLE_TYPECHECK_GATE";
|
|
17
|
+
describe("runTypecheck — fires on type errors", () => {
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
delete process.env[ENV_KEY];
|
|
20
|
+
});
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
delete process.env[ENV_KEY];
|
|
23
|
+
});
|
|
24
|
+
it("parses TS errors from stdout when the command exits non-zero", async () => {
|
|
25
|
+
const tscOutput = [
|
|
26
|
+
"src/foo.ts:42:5 - error TS2322: Type 'number' is not assignable to type 'string'.",
|
|
27
|
+
"",
|
|
28
|
+
"src/bar.ts:7:1 - error TS2304: Cannot find name 'undefinedVar'.",
|
|
29
|
+
"",
|
|
30
|
+
"Found 2 errors in 2 files.",
|
|
31
|
+
].join("\n");
|
|
32
|
+
const runner = async () => ({
|
|
33
|
+
stdout: tscOutput,
|
|
34
|
+
stderr: "",
|
|
35
|
+
code: 1,
|
|
36
|
+
});
|
|
37
|
+
const result = await runTypecheck("/fake/worktree", { runner });
|
|
38
|
+
expect(result.passed).toBe(false);
|
|
39
|
+
expect(result.skipped).toBe(false);
|
|
40
|
+
expect(result.errorCount).toBe(2);
|
|
41
|
+
expect(result.firstMessages).toHaveLength(2);
|
|
42
|
+
expect(result.firstMessages[0]).toContain("TS2322");
|
|
43
|
+
expect(result.firstMessages[1]).toContain("TS2304");
|
|
44
|
+
});
|
|
45
|
+
it("parses TS errors from stderr too (tsc emits to both)", async () => {
|
|
46
|
+
const runner = async () => ({
|
|
47
|
+
stdout: "",
|
|
48
|
+
stderr: "src/x.ts:1:1 - error TS2304: Cannot find name 'foo'.",
|
|
49
|
+
code: 1,
|
|
50
|
+
});
|
|
51
|
+
const result = await runTypecheck("/fake/worktree", { runner });
|
|
52
|
+
expect(result.passed).toBe(false);
|
|
53
|
+
expect(result.errorCount).toBe(1);
|
|
54
|
+
expect(result.firstMessages[0]).toContain("TS2304");
|
|
55
|
+
});
|
|
56
|
+
it("caps firstMessages at 5 even when there are more errors", async () => {
|
|
57
|
+
const tscOutput = Array.from({ length: 10 }, (_, i) => `src/f${i}.ts:1:1 - error TS2322: synthetic error ${i}.`).join("\n");
|
|
58
|
+
const runner = async () => ({
|
|
59
|
+
stdout: tscOutput,
|
|
60
|
+
stderr: "",
|
|
61
|
+
code: 1,
|
|
62
|
+
});
|
|
63
|
+
const result = await runTypecheck("/fake/worktree", { runner });
|
|
64
|
+
expect(result.errorCount).toBe(10);
|
|
65
|
+
expect(result.firstMessages).toHaveLength(5);
|
|
66
|
+
});
|
|
67
|
+
it("truncates individual messages over 500 chars", async () => {
|
|
68
|
+
const longMessage = "src/long.ts:1:1 - error TS2322: " + "x".repeat(1000);
|
|
69
|
+
const runner = async () => ({
|
|
70
|
+
stdout: longMessage,
|
|
71
|
+
stderr: "",
|
|
72
|
+
code: 1,
|
|
73
|
+
});
|
|
74
|
+
const result = await runTypecheck("/fake/worktree", { runner });
|
|
75
|
+
expect(result.firstMessages[0].length).toBeLessThanOrEqual(501);
|
|
76
|
+
expect(result.firstMessages[0]).toMatch(/…$/);
|
|
77
|
+
});
|
|
78
|
+
it("truncates the full output above 50KB and marks it (so audit payload is bounded)", async () => {
|
|
79
|
+
const oversized = "src/x.ts:1:1 - error TS2322: a\n".repeat(2500); // ~80KB
|
|
80
|
+
const runner = async () => ({
|
|
81
|
+
stdout: oversized,
|
|
82
|
+
stderr: "",
|
|
83
|
+
code: 1,
|
|
84
|
+
});
|
|
85
|
+
const result = await runTypecheck("/fake/worktree", { runner });
|
|
86
|
+
expect(result.passed).toBe(false);
|
|
87
|
+
expect(result.output.length).toBeLessThanOrEqual(50_100); // sentinel + small margin
|
|
88
|
+
expect(result.output).toContain("(truncated)");
|
|
89
|
+
});
|
|
90
|
+
it("treats non-zero exit with no parseable TS errors as failed with errorCount=0", async () => {
|
|
91
|
+
// Edge case: typecheck command itself crashed (e.g., tsc missing) — fail
|
|
92
|
+
// closed so the operator sees something, but with a clear "not typecheck"
|
|
93
|
+
// signal in errorCount=0.
|
|
94
|
+
const runner = async () => ({
|
|
95
|
+
stdout: "",
|
|
96
|
+
stderr: "Cannot find module 'typescript'",
|
|
97
|
+
code: 127,
|
|
98
|
+
});
|
|
99
|
+
const result = await runTypecheck("/fake/worktree", { runner });
|
|
100
|
+
expect(result.passed).toBe(false);
|
|
101
|
+
expect(result.errorCount).toBe(0);
|
|
102
|
+
expect(result.output).toContain("Cannot find module");
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe("runTypecheck — does NOT fire on a clean repo", () => {
|
|
106
|
+
beforeEach(() => {
|
|
107
|
+
delete process.env[ENV_KEY];
|
|
108
|
+
});
|
|
109
|
+
afterEach(() => {
|
|
110
|
+
delete process.env[ENV_KEY];
|
|
111
|
+
});
|
|
112
|
+
it("returns passed=true when the runner exits 0", async () => {
|
|
113
|
+
const runner = async () => ({
|
|
114
|
+
stdout: "",
|
|
115
|
+
stderr: "",
|
|
116
|
+
code: 0,
|
|
117
|
+
});
|
|
118
|
+
const result = await runTypecheck("/fake/worktree", { runner });
|
|
119
|
+
expect(result).toEqual({
|
|
120
|
+
passed: true,
|
|
121
|
+
errorCount: 0,
|
|
122
|
+
firstMessages: [],
|
|
123
|
+
output: "",
|
|
124
|
+
skipped: false,
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
it("passes the default command (`pnpm -w typecheck`) to the runner", async () => {
|
|
128
|
+
let observedCommand;
|
|
129
|
+
const runner = async (cmd) => {
|
|
130
|
+
observedCommand = cmd;
|
|
131
|
+
return { stdout: "", stderr: "", code: 0 };
|
|
132
|
+
};
|
|
133
|
+
await runTypecheck("/fake/worktree", { runner });
|
|
134
|
+
expect(observedCommand).toEqual(["pnpm", "-w", "typecheck"]);
|
|
135
|
+
});
|
|
136
|
+
it("respects a custom command via opts.command", async () => {
|
|
137
|
+
let observedCommand;
|
|
138
|
+
const runner = async (cmd) => {
|
|
139
|
+
observedCommand = cmd;
|
|
140
|
+
return { stdout: "", stderr: "", code: 0 };
|
|
141
|
+
};
|
|
142
|
+
await runTypecheck("/fake/worktree", {
|
|
143
|
+
runner,
|
|
144
|
+
command: ["yarn", "typecheck"],
|
|
145
|
+
});
|
|
146
|
+
expect(observedCommand).toEqual(["yarn", "typecheck"]);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
describe("runTypecheck — escape hatch", () => {
|
|
150
|
+
beforeEach(() => {
|
|
151
|
+
delete process.env[ENV_KEY];
|
|
152
|
+
});
|
|
153
|
+
afterEach(() => {
|
|
154
|
+
delete process.env[ENV_KEY];
|
|
155
|
+
});
|
|
156
|
+
it("when URATEAM_DISABLE_TYPECHECK_GATE=true, returns skipped=true and does NOT invoke the runner", async () => {
|
|
157
|
+
process.env[ENV_KEY] = "true";
|
|
158
|
+
let runnerInvoked = false;
|
|
159
|
+
const runner = async () => {
|
|
160
|
+
runnerInvoked = true;
|
|
161
|
+
return { stdout: "", stderr: "", code: 0 };
|
|
162
|
+
};
|
|
163
|
+
const result = await runTypecheck("/fake/worktree", { runner });
|
|
164
|
+
expect(runnerInvoked).toBe(false);
|
|
165
|
+
expect(result).toEqual({
|
|
166
|
+
passed: true,
|
|
167
|
+
errorCount: 0,
|
|
168
|
+
firstMessages: [],
|
|
169
|
+
output: "",
|
|
170
|
+
skipped: true,
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
it("when URATEAM_DISABLE_TYPECHECK_GATE is unset, runner IS invoked", async () => {
|
|
174
|
+
let runnerInvoked = false;
|
|
175
|
+
const runner = async () => {
|
|
176
|
+
runnerInvoked = true;
|
|
177
|
+
return { stdout: "", stderr: "", code: 0 };
|
|
178
|
+
};
|
|
179
|
+
await runTypecheck("/fake/worktree", { runner });
|
|
180
|
+
expect(runnerInvoked).toBe(true);
|
|
181
|
+
});
|
|
182
|
+
it("env-var values other than 'true' do NOT disable the gate (false, 0, '', undefined)", async () => {
|
|
183
|
+
for (const value of ["false", "0", "", "1", "yes"]) {
|
|
184
|
+
process.env[ENV_KEY] = value;
|
|
185
|
+
let runnerInvoked = false;
|
|
186
|
+
const runner = async () => {
|
|
187
|
+
runnerInvoked = true;
|
|
188
|
+
return { stdout: "", stderr: "", code: 0 };
|
|
189
|
+
};
|
|
190
|
+
const result = await runTypecheck("/fake/worktree", { runner });
|
|
191
|
+
expect(runnerInvoked, `env=${value}`).toBe(true);
|
|
192
|
+
expect(result.skipped, `env=${value}`).toBe(false);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
//# sourceMappingURL=typecheck-gate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typecheck-gate.test.js","sourceRoot":"","sources":["../../src/__tests__/typecheck-gate.test.ts"],"names":[],"mappings":"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"}
|