@ivorycanvas/qamap 0.3.4 → 0.4.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 (47) hide show
  1. package/CHANGELOG.md +43 -1
  2. package/README.md +19 -14
  3. package/dist/behavior-intent.d.ts +6 -0
  4. package/dist/behavior-intent.js +172 -0
  5. package/dist/behavior-intent.js.map +1 -0
  6. package/dist/behavior-manifest.d.ts +6 -0
  7. package/dist/behavior-manifest.js +221 -0
  8. package/dist/behavior-manifest.js.map +1 -0
  9. package/dist/behavior.d.ts +143 -0
  10. package/dist/behavior.js +458 -0
  11. package/dist/behavior.js.map +1 -0
  12. package/dist/change-intent.d.ts +71 -0
  13. package/dist/change-intent.js +744 -0
  14. package/dist/change-intent.js.map +1 -0
  15. package/dist/cli.js +6 -5
  16. package/dist/cli.js.map +1 -1
  17. package/dist/e2e.d.ts +16 -1
  18. package/dist/e2e.js +329 -24
  19. package/dist/e2e.js.map +1 -1
  20. package/dist/index.d.ts +9 -1
  21. package/dist/index.js +4 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/manifest.js +138 -4
  24. package/dist/manifest.js.map +1 -1
  25. package/dist/qa.d.ts +1 -0
  26. package/dist/qa.js +73 -1
  27. package/dist/qa.js.map +1 -1
  28. package/dist/terminal.js +1 -1
  29. package/dist/terminal.js.map +1 -1
  30. package/dist/version.d.ts +1 -1
  31. package/dist/version.js +1 -1
  32. package/docs/adoption.md +11 -10
  33. package/docs/agent-format.md +9 -7
  34. package/docs/agent-skill.md +5 -2
  35. package/docs/architecture.md +131 -0
  36. package/docs/benchmarking.md +26 -4
  37. package/docs/commands.md +13 -7
  38. package/docs/e2e-output-examples.md +23 -9
  39. package/docs/manifest.md +4 -0
  40. package/docs/quickstart-demo.md +9 -2
  41. package/docs/release-validation.md +50 -37
  42. package/docs/releasing.md +13 -0
  43. package/docs/roadmap.md +20 -10
  44. package/package.json +4 -2
  45. package/schema/qamap-agent.schema.json +42 -1
  46. package/schema/qamap-behavior.schema.json +307 -0
  47. package/skills/qamap-pr-qa/SKILL.md +16 -11
@@ -0,0 +1,143 @@
1
+ export declare const behaviorGraphSchemaVersion: 1;
2
+ export declare const behaviorGraphSchemaUrl = "https://raw.githubusercontent.com/IvoryCanvas/qamap/main/schema/qamap-behavior.schema.json";
3
+ export declare const behaviorSurfaceKinds: readonly ["web", "mobile", "api", "cli", "artifact", "unknown"];
4
+ export declare const behaviorNodeKinds: readonly ["domain", "flow", "surface", "action", "state", "effect", "contract", "assertion", "fixture", "locator", "source"];
5
+ export declare const behaviorEdgeKinds: readonly ["contains", "enters-at", "precedes", "expects", "uses-fixture", "located-by", "implemented-by", "impacts"];
6
+ export declare const behaviorEvidenceKinds: readonly ["commit", "diff", "source", "manifest", "selector", "fixture", "test", "inference"];
7
+ export type BehaviorConfidence = "low" | "medium" | "high";
8
+ export type BehaviorAdapterConfidence = "none" | BehaviorConfidence;
9
+ export type BehaviorSurfaceKind = (typeof behaviorSurfaceKinds)[number];
10
+ export type BehaviorNodeKind = (typeof behaviorNodeKinds)[number];
11
+ export type BehaviorEdgeKind = (typeof behaviorEdgeKinds)[number];
12
+ export type BehaviorEvidenceKind = (typeof behaviorEvidenceKinds)[number];
13
+ export type BehaviorImpactKind = "direct" | "propagated";
14
+ export type BehaviorDiagnosticSeverity = "info" | "warning";
15
+ export type BehaviorAttributeValue = string | number | boolean | string[];
16
+ export interface BehaviorEvidence {
17
+ kind: BehaviorEvidenceKind;
18
+ value: string;
19
+ file?: string;
20
+ }
21
+ export interface BehaviorImpact {
22
+ kind: BehaviorImpactKind;
23
+ changedFiles: string[];
24
+ }
25
+ export interface BehaviorNode {
26
+ id: string;
27
+ kind: BehaviorNodeKind;
28
+ label: string;
29
+ confidence: BehaviorConfidence;
30
+ evidence: BehaviorEvidence[];
31
+ attributes?: Record<string, BehaviorAttributeValue>;
32
+ impact?: BehaviorImpact;
33
+ }
34
+ export interface BehaviorEdge {
35
+ id: string;
36
+ kind: BehaviorEdgeKind;
37
+ from: string;
38
+ to: string;
39
+ confidence: BehaviorConfidence;
40
+ evidence: BehaviorEvidence[];
41
+ }
42
+ export interface BehaviorDiagnostic {
43
+ severity: BehaviorDiagnosticSeverity;
44
+ message: string;
45
+ adapterId?: string;
46
+ }
47
+ export interface BehaviorAdapterDetection {
48
+ confidence: BehaviorAdapterConfidence;
49
+ reason: string;
50
+ evidence: string[];
51
+ }
52
+ export interface BehaviorAdapterRun {
53
+ id: string;
54
+ version: string;
55
+ status: "used" | "skipped" | "failed";
56
+ detection: BehaviorAdapterDetection;
57
+ nodeCount: number;
58
+ edgeCount: number;
59
+ }
60
+ export interface BehaviorGraphSummary {
61
+ nodes: number;
62
+ edges: number;
63
+ impactedNodes: number;
64
+ byKind: Record<BehaviorNodeKind, number>;
65
+ }
66
+ export interface BehaviorGraph {
67
+ $schema?: string;
68
+ schemaVersion: typeof behaviorGraphSchemaVersion;
69
+ root: string;
70
+ workspaceRoot?: string;
71
+ base: string;
72
+ head: string;
73
+ surface: BehaviorSurfaceKind;
74
+ adapters: BehaviorAdapterRun[];
75
+ nodes: BehaviorNode[];
76
+ edges: BehaviorEdge[];
77
+ diagnostics: BehaviorDiagnostic[];
78
+ summary: BehaviorGraphSummary;
79
+ }
80
+ export interface BehaviorChangedFile {
81
+ path: string;
82
+ status: string;
83
+ previousPath?: string;
84
+ }
85
+ export interface BehaviorAnalysisContext {
86
+ root: string;
87
+ workspaceRoot?: string;
88
+ base: string;
89
+ head: string;
90
+ projectType: string;
91
+ surface: BehaviorSurfaceKind;
92
+ runner?: string;
93
+ changedFiles: BehaviorChangedFile[];
94
+ }
95
+ export interface BehaviorGraphFragment {
96
+ nodes: BehaviorNode[];
97
+ edges: BehaviorEdge[];
98
+ diagnostics?: BehaviorDiagnostic[];
99
+ }
100
+ export interface BehaviorAnalyzerAdapter {
101
+ id: string;
102
+ version: string;
103
+ detect(context: BehaviorAnalysisContext): BehaviorAdapterDetection | Promise<BehaviorAdapterDetection>;
104
+ analyze(context: BehaviorAnalysisContext): BehaviorGraphFragment | Promise<BehaviorGraphFragment>;
105
+ }
106
+ export interface InferredBehaviorEntrypoint {
107
+ kind: "route" | "screen" | "command";
108
+ value: string;
109
+ file: string;
110
+ confidence: BehaviorConfidence;
111
+ }
112
+ export interface InferredBehaviorSelector {
113
+ kind: string;
114
+ value: string;
115
+ file: string;
116
+ addedInDiff?: boolean;
117
+ }
118
+ export interface InferredBehaviorCoverage {
119
+ title: string;
120
+ priority: string;
121
+ reason: string;
122
+ checks: string[];
123
+ }
124
+ export interface InferredBehaviorFlow {
125
+ kind: string;
126
+ title: string;
127
+ reason: string;
128
+ files: string[];
129
+ steps: string[];
130
+ entrypoints: InferredBehaviorEntrypoint[];
131
+ selectors: InferredBehaviorSelector[];
132
+ coverage: InferredBehaviorCoverage[];
133
+ fixtureStatus: string;
134
+ fixtureFiles: string[];
135
+ }
136
+ export interface InferredFlowAdapterOptions {
137
+ flows: InferredBehaviorFlow[];
138
+ }
139
+ export declare function analyzeBehaviorGraph(context: BehaviorAnalysisContext, adapters: BehaviorAnalyzerAdapter[]): Promise<BehaviorGraph>;
140
+ export declare function mergeBehaviorGraphFragments(fragments: BehaviorGraphFragment[]): BehaviorGraphFragment;
141
+ export declare function createInferredFlowBehaviorAdapter(options: InferredFlowAdapterOptions): BehaviorAnalyzerAdapter;
142
+ export declare function createBehaviorNodeId(kind: BehaviorNodeKind, ...parts: string[]): string;
143
+ export declare function createBehaviorEdge(kind: BehaviorEdgeKind, from: string, to: string, confidence: BehaviorConfidence, evidence?: BehaviorEvidence[]): BehaviorEdge;
@@ -0,0 +1,458 @@
1
+ import { createHash } from "node:crypto";
2
+ export const behaviorGraphSchemaVersion = 1;
3
+ export const behaviorGraphSchemaUrl = "https://raw.githubusercontent.com/IvoryCanvas/qamap/main/schema/qamap-behavior.schema.json";
4
+ export const behaviorSurfaceKinds = ["web", "mobile", "api", "cli", "artifact", "unknown"];
5
+ export const behaviorNodeKinds = [
6
+ "domain",
7
+ "flow",
8
+ "surface",
9
+ "action",
10
+ "state",
11
+ "effect",
12
+ "contract",
13
+ "assertion",
14
+ "fixture",
15
+ "locator",
16
+ "source",
17
+ ];
18
+ export const behaviorEdgeKinds = [
19
+ "contains",
20
+ "enters-at",
21
+ "precedes",
22
+ "expects",
23
+ "uses-fixture",
24
+ "located-by",
25
+ "implemented-by",
26
+ "impacts",
27
+ ];
28
+ export const behaviorEvidenceKinds = ["commit", "diff", "source", "manifest", "selector", "fixture", "test", "inference"];
29
+ const confidenceWeight = {
30
+ low: 1,
31
+ medium: 2,
32
+ high: 3,
33
+ };
34
+ const assertionStepMatcher = /^\s*(?:assert|check|compare|confirm|ensure|expect|record|reject|verify)\b/i;
35
+ export async function analyzeBehaviorGraph(context, adapters) {
36
+ const adapterRuns = [];
37
+ const fragments = [];
38
+ const diagnostics = [];
39
+ for (const adapter of [...adapters].sort((left, right) => left.id.localeCompare(right.id))) {
40
+ let detection;
41
+ try {
42
+ detection = normalizeDetection(await adapter.detect(context));
43
+ }
44
+ catch (error) {
45
+ const message = errorMessage(error);
46
+ diagnostics.push({ severity: "warning", adapterId: adapter.id, message: `Adapter detection failed: ${message}` });
47
+ adapterRuns.push({
48
+ id: adapter.id,
49
+ version: adapter.version,
50
+ status: "failed",
51
+ detection: { confidence: "none", reason: message, evidence: [] },
52
+ nodeCount: 0,
53
+ edgeCount: 0,
54
+ });
55
+ continue;
56
+ }
57
+ if (detection.confidence === "none") {
58
+ adapterRuns.push({
59
+ id: adapter.id,
60
+ version: adapter.version,
61
+ status: "skipped",
62
+ detection,
63
+ nodeCount: 0,
64
+ edgeCount: 0,
65
+ });
66
+ continue;
67
+ }
68
+ try {
69
+ const fragment = await adapter.analyze(context);
70
+ fragments.push({
71
+ ...fragment,
72
+ diagnostics: (fragment.diagnostics ?? []).map((item) => ({ ...item, adapterId: item.adapterId ?? adapter.id })),
73
+ });
74
+ adapterRuns.push({
75
+ id: adapter.id,
76
+ version: adapter.version,
77
+ status: "used",
78
+ detection,
79
+ nodeCount: fragment.nodes.length,
80
+ edgeCount: fragment.edges.length,
81
+ });
82
+ }
83
+ catch (error) {
84
+ const message = errorMessage(error);
85
+ diagnostics.push({ severity: "warning", adapterId: adapter.id, message: `Adapter analysis failed: ${message}` });
86
+ adapterRuns.push({
87
+ id: adapter.id,
88
+ version: adapter.version,
89
+ status: "failed",
90
+ detection,
91
+ nodeCount: 0,
92
+ edgeCount: 0,
93
+ });
94
+ }
95
+ }
96
+ const merged = mergeBehaviorGraphFragments(fragments);
97
+ diagnostics.push(...(merged.diagnostics ?? []));
98
+ return {
99
+ $schema: behaviorGraphSchemaUrl,
100
+ schemaVersion: behaviorGraphSchemaVersion,
101
+ root: context.root,
102
+ workspaceRoot: context.workspaceRoot,
103
+ base: context.base,
104
+ head: context.head,
105
+ surface: context.surface,
106
+ adapters: adapterRuns,
107
+ nodes: merged.nodes,
108
+ edges: merged.edges,
109
+ diagnostics,
110
+ summary: summarizeBehaviorGraph(merged.nodes, merged.edges),
111
+ };
112
+ }
113
+ export function mergeBehaviorGraphFragments(fragments) {
114
+ const nodes = new Map();
115
+ const edges = new Map();
116
+ const diagnostics = [];
117
+ for (const fragment of fragments) {
118
+ diagnostics.push(...(fragment.diagnostics ?? []));
119
+ for (const node of fragment.nodes) {
120
+ const existing = nodes.get(node.id);
121
+ if (!existing) {
122
+ nodes.set(node.id, normalizeNode(node));
123
+ continue;
124
+ }
125
+ if (existing.kind !== node.kind) {
126
+ diagnostics.push({
127
+ severity: "warning",
128
+ message: `Behavior node ${node.id} was emitted with both ${existing.kind} and ${node.kind}; keeping ${existing.kind}.`,
129
+ });
130
+ continue;
131
+ }
132
+ nodes.set(node.id, mergeNodes(existing, node));
133
+ }
134
+ for (const edge of fragment.edges) {
135
+ const existing = edges.get(edge.id);
136
+ edges.set(edge.id, existing ? mergeEdges(existing, edge) : normalizeEdge(edge));
137
+ }
138
+ }
139
+ for (const [id, edge] of edges) {
140
+ if (nodes.has(edge.from) && nodes.has(edge.to)) {
141
+ continue;
142
+ }
143
+ edges.delete(id);
144
+ diagnostics.push({
145
+ severity: "warning",
146
+ message: `Dropped behavior edge ${id} because one or both endpoint nodes were missing.`,
147
+ });
148
+ }
149
+ return {
150
+ nodes: [...nodes.values()].sort(compareById),
151
+ edges: [...edges.values()].sort(compareById),
152
+ diagnostics,
153
+ };
154
+ }
155
+ export function createInferredFlowBehaviorAdapter(options) {
156
+ return {
157
+ id: "qamap.inferred-flow-compat",
158
+ version: "1",
159
+ detect: () => ({
160
+ confidence: options.flows.length > 0 ? "high" : "none",
161
+ reason: options.flows.length > 0
162
+ ? "QAMap produced deterministic flow observations that can be represented in the behavior graph."
163
+ : "No inferred flow observations were available.",
164
+ evidence: options.flows.slice(0, 8).map((flow) => flow.title),
165
+ }),
166
+ analyze: (context) => buildInferredFlowFragment(context, options.flows),
167
+ };
168
+ }
169
+ export function createBehaviorNodeId(kind, ...parts) {
170
+ const identity = parts.map((part) => part.trim()).join("\u0000");
171
+ const readable = slugify(parts.find((part) => part.trim().length > 0) ?? kind).slice(0, 40) || kind;
172
+ return `${kind}:${readable}:${shortHash(`${kind}\u0000${identity}`)}`;
173
+ }
174
+ export function createBehaviorEdge(kind, from, to, confidence, evidence = []) {
175
+ return {
176
+ id: `edge:${shortHash(`${kind}\u0000${from}\u0000${to}`)}`,
177
+ kind,
178
+ from,
179
+ to,
180
+ confidence,
181
+ evidence: uniqueEvidence(evidence),
182
+ };
183
+ }
184
+ function buildInferredFlowFragment(context, flows) {
185
+ const nodes = [];
186
+ const edges = [];
187
+ const changedFiles = new Set(context.changedFiles.map((file) => file.path));
188
+ for (const flow of flows) {
189
+ const files = uniqueStrings(flow.files);
190
+ const directlyChanged = files.filter((file) => changedFiles.has(file));
191
+ const impactFiles = directlyChanged.length > 0
192
+ ? directlyChanged
193
+ : context.changedFiles.map((file) => file.path).slice(0, 12);
194
+ const confidence = inferredFlowConfidence(flow);
195
+ const flowId = createBehaviorNodeId("flow", flow.kind, flow.title, ...files.slice().sort());
196
+ nodes.push({
197
+ id: flowId,
198
+ kind: "flow",
199
+ label: flow.title,
200
+ confidence,
201
+ evidence: uniqueEvidence([
202
+ { kind: "inference", value: flow.reason },
203
+ ...files.slice(0, 12).map((file) => ({ kind: "source", value: file, file })),
204
+ ]),
205
+ attributes: {
206
+ flowKind: flow.kind,
207
+ surface: surfaceForFlow(flow, context.surface),
208
+ fixtureStatus: flow.fixtureStatus,
209
+ },
210
+ impact: impactFiles.length > 0
211
+ ? { kind: directlyChanged.length > 0 ? "direct" : "propagated", changedFiles: uniqueStrings(impactFiles) }
212
+ : undefined,
213
+ });
214
+ for (const file of files) {
215
+ const sourceId = createBehaviorNodeId("source", file);
216
+ const direct = changedFiles.has(file);
217
+ nodes.push({
218
+ id: sourceId,
219
+ kind: "source",
220
+ label: file,
221
+ confidence: "high",
222
+ evidence: [{ kind: direct ? "diff" : "source", value: file, file }],
223
+ attributes: { path: file },
224
+ impact: direct ? { kind: "direct", changedFiles: [file] } : undefined,
225
+ });
226
+ edges.push(direct
227
+ ? createBehaviorEdge("impacts", sourceId, flowId, "high", [{ kind: "diff", value: file, file }])
228
+ : createBehaviorEdge("implemented-by", flowId, sourceId, "medium", [{ kind: "source", value: file, file }]));
229
+ }
230
+ for (const entrypoint of flow.entrypoints) {
231
+ const surfaceId = createBehaviorNodeId("surface", entrypoint.kind, entrypoint.value, entrypoint.file);
232
+ nodes.push({
233
+ id: surfaceId,
234
+ kind: "surface",
235
+ label: `${entrypoint.kind}: ${entrypoint.value}`,
236
+ confidence: entrypoint.confidence,
237
+ evidence: [{ kind: "source", value: entrypoint.value, file: entrypoint.file }],
238
+ attributes: {
239
+ entrypointKind: entrypoint.kind,
240
+ value: entrypoint.value,
241
+ surface: surfaceForEntrypoint(entrypoint.kind),
242
+ },
243
+ });
244
+ edges.push(createBehaviorEdge("enters-at", flowId, surfaceId, entrypoint.confidence, [
245
+ { kind: "source", value: entrypoint.value, file: entrypoint.file },
246
+ ]));
247
+ }
248
+ let previousStepId;
249
+ flow.steps.forEach((step, index) => {
250
+ const kind = assertionStepMatcher.test(step) ? "assertion" : "action";
251
+ const stepId = createBehaviorNodeId(kind, flowId, String(index), step);
252
+ nodes.push({
253
+ id: stepId,
254
+ kind,
255
+ label: step,
256
+ confidence,
257
+ evidence: [{ kind: "inference", value: `flow-step:${index + 1}` }],
258
+ attributes: { order: index + 1 },
259
+ });
260
+ edges.push(createBehaviorEdge(kind === "assertion" ? "expects" : "contains", flowId, stepId, confidence));
261
+ if (previousStepId) {
262
+ edges.push(createBehaviorEdge("precedes", previousStepId, stepId, confidence));
263
+ }
264
+ previousStepId = stepId;
265
+ });
266
+ flow.coverage.forEach((target, targetIndex) => {
267
+ const checks = target.checks.length > 0 ? target.checks : [target.title];
268
+ checks.forEach((check, checkIndex) => {
269
+ const assertionId = createBehaviorNodeId("assertion", flowId, "coverage", String(targetIndex), String(checkIndex), check);
270
+ nodes.push({
271
+ id: assertionId,
272
+ kind: "assertion",
273
+ label: check,
274
+ confidence: confidenceForPriority(target.priority),
275
+ evidence: [{ kind: "inference", value: target.reason }],
276
+ attributes: { coverageTarget: target.title, priority: target.priority },
277
+ });
278
+ edges.push(createBehaviorEdge("expects", flowId, assertionId, confidenceForPriority(target.priority)));
279
+ });
280
+ });
281
+ for (const selector of flow.selectors) {
282
+ const locatorId = createBehaviorNodeId("locator", selector.kind, selector.value, selector.file);
283
+ nodes.push({
284
+ id: locatorId,
285
+ kind: "locator",
286
+ label: `${selector.kind}: ${selector.value}`,
287
+ confidence: selector.addedInDiff ? "high" : "medium",
288
+ evidence: [{
289
+ kind: selector.addedInDiff ? "diff" : "selector",
290
+ value: selector.value,
291
+ file: selector.file,
292
+ }],
293
+ attributes: { selectorKind: selector.kind, value: selector.value, addedInDiff: selector.addedInDiff ?? false },
294
+ });
295
+ edges.push(createBehaviorEdge("located-by", flowId, locatorId, selector.addedInDiff ? "high" : "medium"));
296
+ }
297
+ for (const fixtureFile of uniqueStrings(flow.fixtureFiles)) {
298
+ const fixtureId = createBehaviorNodeId("fixture", fixtureFile);
299
+ nodes.push({
300
+ id: fixtureId,
301
+ kind: "fixture",
302
+ label: fixtureFile,
303
+ confidence: "high",
304
+ evidence: [{ kind: "fixture", value: fixtureFile, file: fixtureFile }],
305
+ attributes: { path: fixtureFile },
306
+ });
307
+ edges.push(createBehaviorEdge("uses-fixture", flowId, fixtureId, "high"));
308
+ }
309
+ }
310
+ return { nodes, edges };
311
+ }
312
+ function surfaceForFlow(flow, fallback) {
313
+ if (flow.kind === "api") {
314
+ return "api";
315
+ }
316
+ if (flow.kind === "command") {
317
+ return "cli";
318
+ }
319
+ if (flow.kind === "artifact" || flow.kind === "catalog" || flow.kind === "generated-artifact") {
320
+ return "artifact";
321
+ }
322
+ return fallback;
323
+ }
324
+ function surfaceForEntrypoint(kind) {
325
+ if (kind === "route") {
326
+ return "web";
327
+ }
328
+ if (kind === "screen") {
329
+ return "mobile";
330
+ }
331
+ return "cli";
332
+ }
333
+ function inferredFlowConfidence(flow) {
334
+ if (flow.entrypoints.some((entrypoint) => entrypoint.confidence === "high") || flow.selectors.some((selector) => selector.addedInDiff)) {
335
+ return "high";
336
+ }
337
+ if (flow.entrypoints.length > 0 || flow.selectors.length > 0 || flow.files.length > 0) {
338
+ return "medium";
339
+ }
340
+ return "low";
341
+ }
342
+ function confidenceForPriority(priority) {
343
+ if (priority === "critical") {
344
+ return "high";
345
+ }
346
+ if (priority === "recommended") {
347
+ return "medium";
348
+ }
349
+ return "low";
350
+ }
351
+ function normalizeDetection(detection) {
352
+ return {
353
+ confidence: detection.confidence,
354
+ reason: detection.reason.trim() || "No detection reason was provided.",
355
+ evidence: uniqueStrings(detection.evidence),
356
+ };
357
+ }
358
+ function mergeNodes(left, right) {
359
+ return {
360
+ ...left,
361
+ confidence: strongerConfidence(left.confidence, right.confidence),
362
+ evidence: uniqueEvidence([...left.evidence, ...right.evidence]),
363
+ attributes: left.attributes || right.attributes ? { ...(left.attributes ?? {}), ...(right.attributes ?? {}) } : undefined,
364
+ impact: mergeImpact(left.impact, right.impact),
365
+ };
366
+ }
367
+ function mergeEdges(left, right) {
368
+ return {
369
+ ...left,
370
+ confidence: strongerConfidence(left.confidence, right.confidence),
371
+ evidence: uniqueEvidence([...left.evidence, ...right.evidence]),
372
+ };
373
+ }
374
+ function normalizeNode(node) {
375
+ return {
376
+ ...node,
377
+ evidence: uniqueEvidence(node.evidence),
378
+ impact: node.impact ? { ...node.impact, changedFiles: uniqueStrings(node.impact.changedFiles) } : undefined,
379
+ };
380
+ }
381
+ function normalizeEdge(edge) {
382
+ return { ...edge, evidence: uniqueEvidence(edge.evidence) };
383
+ }
384
+ function mergeImpact(left, right) {
385
+ if (!left) {
386
+ return right ? { ...right, changedFiles: uniqueStrings(right.changedFiles) } : undefined;
387
+ }
388
+ if (!right) {
389
+ return { ...left, changedFiles: uniqueStrings(left.changedFiles) };
390
+ }
391
+ return {
392
+ kind: left.kind === "direct" || right.kind === "direct" ? "direct" : "propagated",
393
+ changedFiles: uniqueStrings([...left.changedFiles, ...right.changedFiles]),
394
+ };
395
+ }
396
+ function summarizeBehaviorGraph(nodes, edges) {
397
+ const byKind = emptyNodeCounts();
398
+ for (const node of nodes) {
399
+ byKind[node.kind] += 1;
400
+ }
401
+ return {
402
+ nodes: nodes.length,
403
+ edges: edges.length,
404
+ impactedNodes: nodes.filter((node) => node.impact && node.impact.changedFiles.length > 0).length,
405
+ byKind,
406
+ };
407
+ }
408
+ function emptyNodeCounts() {
409
+ return {
410
+ domain: 0,
411
+ flow: 0,
412
+ surface: 0,
413
+ action: 0,
414
+ state: 0,
415
+ effect: 0,
416
+ contract: 0,
417
+ assertion: 0,
418
+ fixture: 0,
419
+ locator: 0,
420
+ source: 0,
421
+ };
422
+ }
423
+ function strongerConfidence(left, right) {
424
+ return confidenceWeight[left] >= confidenceWeight[right] ? left : right;
425
+ }
426
+ function uniqueEvidence(items) {
427
+ const seen = new Set();
428
+ return items.filter((item) => {
429
+ const key = `${item.kind}\u0000${item.value}\u0000${item.file ?? ""}`;
430
+ if (seen.has(key)) {
431
+ return false;
432
+ }
433
+ seen.add(key);
434
+ return true;
435
+ });
436
+ }
437
+ function uniqueStrings(items) {
438
+ return [...new Set(items.map((item) => item.trim()).filter(Boolean))];
439
+ }
440
+ function compareById(left, right) {
441
+ return left.id.localeCompare(right.id);
442
+ }
443
+ function shortHash(value) {
444
+ return createHash("sha256").update(value).digest("hex").slice(0, 12);
445
+ }
446
+ function slugify(value) {
447
+ return value
448
+ .normalize("NFKD")
449
+ .replace(/[\u0300-\u036f]/g, "")
450
+ .replace(/([a-z0-9])([A-Z])/g, "$1-$2")
451
+ .toLowerCase()
452
+ .replace(/[^a-z0-9]+/g, "-")
453
+ .replace(/^-+|-+$/g, "");
454
+ }
455
+ function errorMessage(error) {
456
+ return error instanceof Error ? error.message : String(error);
457
+ }
458
+ //# sourceMappingURL=behavior.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavior.js","sourceRoot":"","sources":["../src/behavior.ts"],"names":[],"mappings":"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"}