@ivorycanvas/qamap 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 (98) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/LICENSE +21 -0
  3. package/README.md +636 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +879 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config.d.ts +5 -0
  8. package/dist/config.js +114 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/context.d.ts +1 -0
  11. package/dist/context.js +126 -0
  12. package/dist/context.js.map +1 -0
  13. package/dist/doctor.d.ts +32 -0
  14. package/dist/doctor.js +200 -0
  15. package/dist/doctor.js.map +1 -0
  16. package/dist/domain-language.d.ts +25 -0
  17. package/dist/domain-language.js +655 -0
  18. package/dist/domain-language.js.map +1 -0
  19. package/dist/domains.d.ts +33 -0
  20. package/dist/domains.js +258 -0
  21. package/dist/domains.js.map +1 -0
  22. package/dist/e2e.d.ts +326 -0
  23. package/dist/e2e.js +6869 -0
  24. package/dist/e2e.js.map +1 -0
  25. package/dist/eval.d.ts +40 -0
  26. package/dist/eval.js +374 -0
  27. package/dist/eval.js.map +1 -0
  28. package/dist/flows.d.ts +32 -0
  29. package/dist/flows.js +246 -0
  30. package/dist/flows.js.map +1 -0
  31. package/dist/fs.d.ts +7 -0
  32. package/dist/fs.js +132 -0
  33. package/dist/fs.js.map +1 -0
  34. package/dist/github.d.ts +34 -0
  35. package/dist/github.js +183 -0
  36. package/dist/github.js.map +1 -0
  37. package/dist/history.d.ts +173 -0
  38. package/dist/history.js +247 -0
  39. package/dist/history.js.map +1 -0
  40. package/dist/index.d.ts +35 -0
  41. package/dist/index.js +20 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/manifest-suggestions.d.ts +67 -0
  44. package/dist/manifest-suggestions.js +673 -0
  45. package/dist/manifest-suggestions.js.map +1 -0
  46. package/dist/manifest.d.ts +212 -0
  47. package/dist/manifest.js +1607 -0
  48. package/dist/manifest.js.map +1 -0
  49. package/dist/qa.d.ts +53 -0
  50. package/dist/qa.js +361 -0
  51. package/dist/qa.js.map +1 -0
  52. package/dist/report.d.ts +5 -0
  53. package/dist/report.js +164 -0
  54. package/dist/report.js.map +1 -0
  55. package/dist/review.d.ts +31 -0
  56. package/dist/review.js +383 -0
  57. package/dist/review.js.map +1 -0
  58. package/dist/scanner.d.ts +3 -0
  59. package/dist/scanner.js +797 -0
  60. package/dist/scanner.js.map +1 -0
  61. package/dist/severity.d.ts +3 -0
  62. package/dist/severity.js +9 -0
  63. package/dist/severity.js.map +1 -0
  64. package/dist/test-evidence.d.ts +39 -0
  65. package/dist/test-evidence.js +303 -0
  66. package/dist/test-evidence.js.map +1 -0
  67. package/dist/test-plan.d.ts +35 -0
  68. package/dist/test-plan.js +573 -0
  69. package/dist/test-plan.js.map +1 -0
  70. package/dist/types.d.ts +60 -0
  71. package/dist/types.js +2 -0
  72. package/dist/types.js.map +1 -0
  73. package/dist/verify.d.ts +27 -0
  74. package/dist/verify.js +244 -0
  75. package/dist/verify.js.map +1 -0
  76. package/dist/version.d.ts +2 -0
  77. package/dist/version.js +3 -0
  78. package/dist/version.js.map +1 -0
  79. package/docs/adoption.md +166 -0
  80. package/docs/agent-skill.md +94 -0
  81. package/docs/api-contracts.md +30 -0
  82. package/docs/assets/qamap-30s-demo.gif +0 -0
  83. package/docs/configuration.md +277 -0
  84. package/docs/e2e-output-examples.md +464 -0
  85. package/docs/ecosystem.md +41 -0
  86. package/docs/eval.md +52 -0
  87. package/docs/github-action.md +89 -0
  88. package/docs/manifest.md +350 -0
  89. package/docs/quickstart-demo.md +268 -0
  90. package/docs/release-validation.md +247 -0
  91. package/docs/releasing.md +112 -0
  92. package/docs/roadmap.md +67 -0
  93. package/docs/rules.md +28 -0
  94. package/docs/verify.md +44 -0
  95. package/package.json +80 -0
  96. package/schema/qamap-manifest.schema.json +323 -0
  97. package/schema/qamap.schema.json +58 -0
  98. package/skills/qamap-pr-qa/SKILL.md +81 -0
package/dist/eval.d.ts ADDED
@@ -0,0 +1,40 @@
1
+ import type { TestPlanChangedFile, TestPlanItem, TestPlanOptions } from "./test-plan.js";
2
+ export type EvalCheckStatus = "pass" | "warn" | "fail";
3
+ export type EvalRating = "strong" | "ready" | "needs-work" | "high-risk";
4
+ export interface EvalOptions extends TestPlanOptions {
5
+ prBody?: string;
6
+ prBodyFile?: string;
7
+ }
8
+ export interface EvalCheck {
9
+ id: string;
10
+ title: string;
11
+ status: EvalCheckStatus;
12
+ score: number;
13
+ maxScore: number;
14
+ reason: string;
15
+ evidence: string[];
16
+ recommendation: string;
17
+ }
18
+ export interface EvalResult {
19
+ tool: {
20
+ name: string;
21
+ version: string;
22
+ };
23
+ root: string;
24
+ workspaceRoot?: string;
25
+ generatedAt: string;
26
+ base: string;
27
+ head: string;
28
+ includeWorkingTree: boolean;
29
+ score: number;
30
+ maxScore: number;
31
+ rating: EvalRating;
32
+ changedFiles: TestPlanChangedFile[];
33
+ suggestedCommands: string[];
34
+ testPlanItems: TestPlanItem[];
35
+ checks: EvalCheck[];
36
+ recommendations: string[];
37
+ }
38
+ export declare function evaluateChangeReadiness(rootInput: string, options?: EvalOptions): Promise<EvalResult>;
39
+ export declare function formatEvalReport(result: EvalResult): string;
40
+ export declare function formatMarkdownEvalReport(result: EvalResult): string;
package/dist/eval.js ADDED
@@ -0,0 +1,374 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { generateTestPlan } from "./test-plan.js";
4
+ import { TOOL_NAME, VERSION } from "./version.js";
5
+ export async function evaluateChangeReadiness(rootInput, options = {}) {
6
+ const testPlan = await generateTestPlan(rootInput, options);
7
+ const prBody = normalizeText(options.prBody ?? (await readPrBodyFile(options.prBodyFile)));
8
+ const checks = [
9
+ scoreValidationCommands(testPlan.suggestedCommands),
10
+ scoreChangedTestCoverage(testPlan.changedFiles, testPlan.suggestedCommands),
11
+ await scoreIntentCapture(testPlan.root, testPlan.workspaceRoot, testPlan.changedFiles, prBody),
12
+ scoreRiskExplanation(testPlan.changedFiles, prBody),
13
+ scoreDomainTestPlan(testPlan.changedFiles, testPlan.items),
14
+ scoreReviewSize(testPlan.changedFiles),
15
+ ];
16
+ const score = checks.reduce((total, check) => total + check.score, 0);
17
+ const maxScore = checks.reduce((total, check) => total + check.maxScore, 0);
18
+ return {
19
+ tool: {
20
+ name: TOOL_NAME,
21
+ version: VERSION,
22
+ },
23
+ root: testPlan.root,
24
+ workspaceRoot: testPlan.workspaceRoot,
25
+ generatedAt: new Date().toISOString(),
26
+ base: testPlan.base,
27
+ head: testPlan.head,
28
+ includeWorkingTree: testPlan.includeWorkingTree,
29
+ score,
30
+ maxScore,
31
+ rating: ratingForScore(score, maxScore),
32
+ changedFiles: testPlan.changedFiles,
33
+ suggestedCommands: testPlan.suggestedCommands,
34
+ testPlanItems: testPlan.items,
35
+ checks,
36
+ recommendations: buildRecommendations(checks),
37
+ };
38
+ }
39
+ export function formatEvalReport(result) {
40
+ const lines = [];
41
+ lines.push(`${result.tool.name} Eval`);
42
+ lines.push(`Root: ${result.root}`);
43
+ if (result.workspaceRoot) {
44
+ lines.push(`Workspace root: ${result.workspaceRoot}`);
45
+ }
46
+ lines.push(`Base: ${result.base}`);
47
+ lines.push(`Head: ${result.head}`);
48
+ if (result.includeWorkingTree) {
49
+ lines.push("Includes working tree changes: yes");
50
+ }
51
+ lines.push(`Score: ${result.score}/${result.maxScore} (${result.rating})`);
52
+ lines.push(`Changed files: ${result.changedFiles.length}`);
53
+ lines.push("");
54
+ for (const check of result.checks) {
55
+ lines.push(`${check.status.toUpperCase()} ${check.title}: ${check.score}/${check.maxScore}`);
56
+ lines.push(` ${check.reason}`);
57
+ for (const evidence of check.evidence) {
58
+ lines.push(` Evidence: ${evidence}`);
59
+ }
60
+ if (check.status !== "pass") {
61
+ lines.push(` Fix: ${check.recommendation}`);
62
+ }
63
+ }
64
+ if (result.recommendations.length > 0) {
65
+ lines.push("");
66
+ lines.push("Recommendations:");
67
+ for (const recommendation of result.recommendations) {
68
+ lines.push(`- ${recommendation}`);
69
+ }
70
+ }
71
+ return lines.join("\n");
72
+ }
73
+ export function formatMarkdownEvalReport(result) {
74
+ const lines = [];
75
+ lines.push("# QAMap Eval");
76
+ lines.push("");
77
+ lines.push(`- Root: \`${escapeMarkdownInline(result.root)}\``);
78
+ if (result.workspaceRoot) {
79
+ lines.push(`- Workspace root: \`${escapeMarkdownInline(result.workspaceRoot)}\``);
80
+ }
81
+ lines.push(`- Base: \`${escapeMarkdownInline(result.base)}\``);
82
+ lines.push(`- Head: \`${escapeMarkdownInline(result.head)}\``);
83
+ if (result.includeWorkingTree) {
84
+ lines.push("- Includes working tree changes: yes");
85
+ }
86
+ lines.push(`- Score: **${result.score}/${result.maxScore}** (${result.rating})`);
87
+ lines.push(`- Changed files: ${result.changedFiles.length}`);
88
+ lines.push("");
89
+ lines.push("## Verification Gates");
90
+ lines.push("");
91
+ lines.push("| Gate | Status | Score | Reason |");
92
+ lines.push("| --- | --- | ---: | --- |");
93
+ for (const check of result.checks) {
94
+ lines.push(`| ${escapeMarkdownCell(check.title)} | ${check.status} | ${check.score}/${check.maxScore} | ${escapeMarkdownCell(check.reason)} |`);
95
+ }
96
+ lines.push("");
97
+ lines.push("## Evidence");
98
+ lines.push("");
99
+ for (const check of result.checks) {
100
+ lines.push(`### ${escapeMarkdownInline(check.title)}`);
101
+ lines.push("");
102
+ if (check.evidence.length === 0) {
103
+ lines.push("- No direct evidence found.");
104
+ }
105
+ else {
106
+ for (const evidence of check.evidence) {
107
+ lines.push(`- ${escapeMarkdownInline(evidence)}`);
108
+ }
109
+ }
110
+ if (check.status !== "pass") {
111
+ lines.push(`- Recommendation: ${escapeMarkdownInline(check.recommendation)}`);
112
+ }
113
+ lines.push("");
114
+ }
115
+ if (result.recommendations.length > 0) {
116
+ lines.push("## Recommendations");
117
+ lines.push("");
118
+ for (const recommendation of result.recommendations) {
119
+ lines.push(`- ${escapeMarkdownInline(recommendation)}`);
120
+ }
121
+ lines.push("");
122
+ }
123
+ if (result.suggestedCommands.length > 0) {
124
+ lines.push("## Suggested Commands");
125
+ lines.push("");
126
+ for (const command of result.suggestedCommands) {
127
+ lines.push(`- \`${escapeMarkdownInline(command)}\``);
128
+ }
129
+ lines.push("");
130
+ }
131
+ return lines.join("\n");
132
+ }
133
+ async function readPrBodyFile(prBodyFile) {
134
+ if (!prBodyFile) {
135
+ return undefined;
136
+ }
137
+ return fs.readFile(path.resolve(prBodyFile), "utf8");
138
+ }
139
+ function scoreValidationCommands(commands) {
140
+ const hasTest = commands.some(isTestCommand);
141
+ const hasSupport = commands.some(isSupportingValidationCommand);
142
+ if (hasTest && hasSupport) {
143
+ return check("validation-commands", "Validation commands", "pass", 2, "Test and supporting validation commands are available.", commands);
144
+ }
145
+ if (commands.length > 0) {
146
+ return check("validation-commands", "Validation commands", "warn", 1, "Some validation commands are available, but the branch lacks a balanced test plus support command set.", commands, "Add or document a default test command plus a typecheck, lint, build, or e2e command.");
147
+ }
148
+ return check("validation-commands", "Validation commands", "fail", 0, "No usable validation command was detected.", [], "Add a real package test script or document the validation command agents should run.");
149
+ }
150
+ function isTestCommand(command) {
151
+ return /\b(?:test|vitest|jest|playwright|node --test|pytest|tox|go test|cargo test|gradle test|mvn test)\b/i.test(command);
152
+ }
153
+ function isSupportingValidationCommand(command) {
154
+ return /\b(?:typecheck|lint|build|check|e2e|go vet|ruff|mypy|clippy|mvn verify)\b/i.test(command);
155
+ }
156
+ function scoreChangedTestCoverage(files, commands) {
157
+ const sourceFiles = files.filter((file) => isSourceFile(file.path));
158
+ const testFiles = files.filter((file) => isTestFile(file.path));
159
+ if (sourceFiles.length === 0) {
160
+ return check("changed-test-coverage", "Changed test coverage", "pass", 2, "No source files changed, so changed-test coverage is not required.", files.slice(0, 6).map((file) => file.path));
161
+ }
162
+ if (testFiles.length > 0) {
163
+ return check("changed-test-coverage", "Changed test coverage", "pass", 2, "Source changes are paired with changed test files.", testFiles.map((file) => file.path));
164
+ }
165
+ if (commands.some((command) => /\btest\b/i.test(command))) {
166
+ return check("changed-test-coverage", "Changed test coverage", "warn", 1, "Source files changed without changed test files, but a test command is available.", sourceFiles.slice(0, 6).map((file) => file.path), "Add focused tests for the changed behavior or explain why existing coverage is sufficient.");
167
+ }
168
+ return check("changed-test-coverage", "Changed test coverage", "fail", 0, "Source files changed without changed test files or a detected test command.", sourceFiles.slice(0, 6).map((file) => file.path), "Add focused tests and a runnable test command before relying on the branch.");
169
+ }
170
+ async function scoreIntentCapture(root, workspaceRoot, files, prBody) {
171
+ const intentEvidence = intentEvidenceFromText(prBody);
172
+ if (intentEvidence.length >= 2) {
173
+ return check("intent-capture", "Intent capture", "pass", 2, "The PR body captures intent, context, or tradeoffs.", intentEvidence.slice(0, 4));
174
+ }
175
+ const documentationFiles = files.filter((file) => isIntentDocumentationFile(file.path)).map((file) => file.path);
176
+ if (documentationFiles.length > 0) {
177
+ return check("intent-capture", "Intent capture", "warn", 1, "Documentation changed, but the PR body does not clearly capture intent.", documentationFiles.slice(0, 6), "Summarize the problem, chosen approach, rejected alternatives, and tradeoffs in the PR body.");
178
+ }
179
+ const template = await findPullRequestTemplate(root, workspaceRoot);
180
+ if (template) {
181
+ return check("intent-capture", "Intent capture", "warn", 1, "A pull request template exists, but no intent-rich PR body was detected.", [template], "Fill the PR template with context, rationale, tradeoffs, and validation evidence.");
182
+ }
183
+ if (files.length === 0) {
184
+ return check("intent-capture", "Intent capture", "pass", 2, "No changed files were detected.", []);
185
+ }
186
+ return check("intent-capture", "Intent capture", "fail", 0, "No PR body, decision document, or pull request template captured the reason for the change.", [], "Add an intent note that explains the problem, why this approach was chosen, and what tradeoffs reviewers should know.");
187
+ }
188
+ function scoreRiskExplanation(files, prBody) {
189
+ const riskyFiles = files.filter((file) => isRiskyChangeFile(file.path)).map((file) => file.path);
190
+ if (riskyFiles.length === 0) {
191
+ return check("risk-explanation", "Risk explanation", "pass", 2, "No high-risk change surfaces were detected.", files.slice(0, 6).map((file) => file.path));
192
+ }
193
+ const riskEvidence = riskEvidenceFromText(prBody);
194
+ if (riskEvidence.length > 0) {
195
+ return check("risk-explanation", "Risk explanation", "pass", 2, "Risky surfaces changed and the PR body includes risk or rollback context.", [...riskyFiles.slice(0, 4), ...riskEvidence.slice(0, 2)]);
196
+ }
197
+ if (prBody.trim().length > 0) {
198
+ return check("risk-explanation", "Risk explanation", "warn", 1, "Risky surfaces changed, but the PR body does not clearly discuss risk, rollback, compatibility, or migration impact.", riskyFiles.slice(0, 6), "Add risk, rollback, migration, compatibility, or security notes for the changed risky surfaces.");
199
+ }
200
+ return check("risk-explanation", "Risk explanation", "fail", 0, "Risky surfaces changed without a detected risk explanation.", riskyFiles.slice(0, 6), "Add a PR risk section before merging changes to config, workflow, API, auth, billing, migration, or environment surfaces.");
201
+ }
202
+ function scoreDomainTestPlan(files, items) {
203
+ if (files.length === 0) {
204
+ return check("domain-test-plan", "Domain test plan", "pass", 2, "No changed files were detected.", []);
205
+ }
206
+ if (items.some((item) => item.title !== "Changed-file smoke path")) {
207
+ return check("domain-test-plan", "Domain test plan", "pass", 2, "Changed files map to specialized domain test scenarios.", items.map((item) => item.title));
208
+ }
209
+ if (items.length > 0) {
210
+ return check("domain-test-plan", "Domain test plan", "warn", 1, "Only a generic smoke path could be inferred for this change.", items.map((item) => item.title), "Add a domain-owned path, API contract, state, UI, or configuration hint so reviewers can verify the right behavior.");
211
+ }
212
+ return check("domain-test-plan", "Domain test plan", "fail", 0, "No test plan could be inferred.", [], "Add enough change context for QAMap to suggest a domain verification path.");
213
+ }
214
+ function scoreReviewSize(files) {
215
+ if (files.length <= 10) {
216
+ return check("review-size", "Review size", "pass", 2, "The changed-file set is small enough for focused review.", [`${files.length} changed files`]);
217
+ }
218
+ if (files.length <= 30) {
219
+ return check("review-size", "Review size", "warn", 1, "The changed-file set is moderately large and may increase verification tax.", [`${files.length} changed files`], "Split unrelated changes or add stronger intent, risk, and validation notes.");
220
+ }
221
+ return check("review-size", "Review size", "fail", 0, "The changed-file set is large enough to create substantial cognitive load.", [`${files.length} changed files`], "Split the branch or add a reviewer guide that separates independent verification paths.");
222
+ }
223
+ function check(id, title, status, score, reason, evidence, recommendation = "No action needed.") {
224
+ return {
225
+ id,
226
+ title,
227
+ status,
228
+ score,
229
+ maxScore: 2,
230
+ reason,
231
+ evidence,
232
+ recommendation,
233
+ };
234
+ }
235
+ function buildRecommendations(checks) {
236
+ return checks
237
+ .filter((check) => check.status !== "pass")
238
+ .map((check) => check.recommendation)
239
+ .filter((recommendation, index, recommendations) => recommendations.indexOf(recommendation) === index);
240
+ }
241
+ function ratingForScore(score, maxScore) {
242
+ const ratio = maxScore === 0 ? 1 : score / maxScore;
243
+ if (ratio >= 0.85) {
244
+ return "strong";
245
+ }
246
+ if (ratio >= 0.7) {
247
+ return "ready";
248
+ }
249
+ if (ratio >= 0.45) {
250
+ return "needs-work";
251
+ }
252
+ return "high-risk";
253
+ }
254
+ function intentEvidenceFromText(text) {
255
+ return evidenceFromText(text, [
256
+ "why",
257
+ "because",
258
+ "rationale",
259
+ "intent",
260
+ "context",
261
+ "tradeoff",
262
+ "decision",
263
+ "alternative",
264
+ "문제",
265
+ "이유",
266
+ "의도",
267
+ "맥락",
268
+ "결정",
269
+ "대안",
270
+ "트레이드오프",
271
+ ]);
272
+ }
273
+ function riskEvidenceFromText(text) {
274
+ return evidenceFromText(text, [
275
+ "risk",
276
+ "rollback",
277
+ "migration",
278
+ "compatibility",
279
+ "breaking",
280
+ "security",
281
+ "impact",
282
+ "위험",
283
+ "리스크",
284
+ "롤백",
285
+ "마이그레이션",
286
+ "호환",
287
+ "보안",
288
+ "영향",
289
+ ]);
290
+ }
291
+ function evidenceFromText(text, keywords) {
292
+ if (!text.trim()) {
293
+ return [];
294
+ }
295
+ const lines = text
296
+ .split(/\r?\n/)
297
+ .map((line) => line.trim())
298
+ .filter(Boolean);
299
+ return lines
300
+ .filter((line) => keywords.some((keyword) => line.toLowerCase().includes(keyword.toLowerCase())))
301
+ .slice(0, 6);
302
+ }
303
+ function isSourceFile(filePath) {
304
+ return (/\.(?:[cm]?[jt]sx?|vue|svelte|py|rb|go|rs|java|kt|swift|cs)$/i.test(filePath) &&
305
+ !isTestFile(filePath) &&
306
+ !/(?:^|\/)(dist|build|coverage|vendor)\//i.test(filePath));
307
+ }
308
+ function isTestFile(filePath) {
309
+ return (/(?:^|\/)(__tests__|tests?|specs?|e2e)\//i.test(filePath) ||
310
+ /(\.|-)(test|spec)\.[cm]?[jt]sx?$/i.test(filePath) ||
311
+ /(?:^|\/)test_[^/]+\.py$/i.test(filePath) ||
312
+ /(?:^|\/)[^/]+_test\.(?:py|go)$/i.test(filePath) ||
313
+ /(?:^|\/)[^/]+(?:Test|Tests|Spec)\.(?:java|kt|cs|swift)$/i.test(filePath) ||
314
+ /(?:^|\/)[^/]+_(?:test|spec)\.rs$/i.test(filePath));
315
+ }
316
+ function isIntentDocumentationFile(filePath) {
317
+ return /(?:^|\/)(docs|adr|adrs|decisions?|rfcs?|proposals?)\/|(?:adr|decision|rfc|proposal|design|intent).*\.md$/i.test(filePath);
318
+ }
319
+ function isRiskyChangeFile(filePath) {
320
+ const riskyDirectory = /(?:^|\/)(\.github\/workflows|migrations?|schema|prisma|db|database|auth|billing|payment|permissions?|security|config|configs)\//i;
321
+ const riskyFile = /(?:action\.ya?ml|package\.json|pnpm-lock\.yaml|yarn\.lock|package-lock\.json|pyproject\.toml|requirements\.txt|go\.mod|go\.sum|Cargo\.toml|Cargo\.lock|pom\.xml|build\.gradle|gradle\.properties|\.env|config|workflow|openapi|swagger|graphql|proto)/i;
322
+ return riskyDirectory.test(filePath) || riskyFile.test(filePath);
323
+ }
324
+ async function findPullRequestTemplate(root, workspaceRoot) {
325
+ for (const baseRoot of [root, workspaceRoot].filter((value) => Boolean(value))) {
326
+ const directCandidates = [
327
+ ".github/pull_request_template.md",
328
+ ".github/PULL_REQUEST_TEMPLATE.md",
329
+ "docs/pull_request_template.md",
330
+ ];
331
+ for (const candidate of directCandidates) {
332
+ const resolved = path.join(baseRoot, candidate);
333
+ if (await exists(resolved)) {
334
+ return displayPath(root, workspaceRoot, baseRoot, resolved, candidate);
335
+ }
336
+ }
337
+ const templateDirectory = path.join(baseRoot, ".github/PULL_REQUEST_TEMPLATE");
338
+ try {
339
+ const entries = await fs.readdir(templateDirectory);
340
+ const template = entries.find((entry) => entry.endsWith(".md"));
341
+ if (template) {
342
+ const resolved = path.join(templateDirectory, template);
343
+ return displayPath(root, workspaceRoot, baseRoot, resolved, `.github/PULL_REQUEST_TEMPLATE/${template}`);
344
+ }
345
+ }
346
+ catch {
347
+ // No template directory in this root.
348
+ }
349
+ }
350
+ return undefined;
351
+ }
352
+ function displayPath(root, workspaceRoot, baseRoot, filePath, fallback) {
353
+ const displayRoot = workspaceRoot && baseRoot === workspaceRoot ? workspaceRoot : root;
354
+ return path.relative(displayRoot, filePath) || fallback;
355
+ }
356
+ async function exists(filePath) {
357
+ try {
358
+ await fs.access(filePath);
359
+ return true;
360
+ }
361
+ catch {
362
+ return false;
363
+ }
364
+ }
365
+ function normalizeText(value) {
366
+ return value?.replaceAll("\0", "").trim() ?? "";
367
+ }
368
+ function escapeMarkdownInline(value) {
369
+ return value.replaceAll("`", "'");
370
+ }
371
+ function escapeMarkdownCell(value) {
372
+ return escapeMarkdownInline(value).replaceAll("|", "\\|").replace(/\s+/g, " ").trim();
373
+ }
374
+ //# sourceMappingURL=eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.js","sourceRoot":"","sources":["../src/eval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { TestPlanChangedFile } from "./test-plan.js";
2
+ export declare const defaultFlowManifestPath = ".qamap/flows.yml";
3
+ export type CoreFlowPriority = "critical" | "recommended" | "optional";
4
+ export interface CoreFlowDefinition {
5
+ id: string;
6
+ name: string;
7
+ description?: string;
8
+ owner?: string;
9
+ priority: CoreFlowPriority;
10
+ domains: string[];
11
+ files: string[];
12
+ routes: string[];
13
+ tags: string[];
14
+ checks: string[];
15
+ }
16
+ export interface CoreFlowManifest {
17
+ path?: string;
18
+ flows: CoreFlowDefinition[];
19
+ }
20
+ export interface MatchedCoreFlow {
21
+ id: string;
22
+ name: string;
23
+ priority: CoreFlowPriority;
24
+ reason: string;
25
+ matchedFiles: string[];
26
+ matchedSignals: string[];
27
+ routes: string[];
28
+ checks: string[];
29
+ }
30
+ export declare function loadCoreFlowManifest(rootInput: string): Promise<CoreFlowManifest>;
31
+ export declare function matchCoreFlows(manifest: CoreFlowManifest, changedFiles: TestPlanChangedFile[]): MatchedCoreFlow[];
32
+ export declare function writeDefaultCoreFlowManifest(rootInput: string, fileName?: string, force?: boolean): Promise<string>;