@opensip-cli/yagni 0.1.11

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 (152) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +33 -0
  4. package/dist/__tests__/apply-advisory-exit.test.d.ts +2 -0
  5. package/dist/__tests__/apply-advisory-exit.test.d.ts.map +1 -0
  6. package/dist/__tests__/apply-advisory-exit.test.js +31 -0
  7. package/dist/__tests__/apply-advisory-exit.test.js.map +1 -0
  8. package/dist/__tests__/fixtures/unused-config-surface/pkg/src/app-config.d.ts +6 -0
  9. package/dist/__tests__/fixtures/unused-config-surface/pkg/src/app-config.d.ts.map +1 -0
  10. package/dist/__tests__/fixtures/unused-config-surface/pkg/src/app-config.js +5 -0
  11. package/dist/__tests__/fixtures/unused-config-surface/pkg/src/app-config.js.map +1 -0
  12. package/dist/__tests__/fixtures/unused-config-surface/pkg/src/consumer.d.ts +3 -0
  13. package/dist/__tests__/fixtures/unused-config-surface/pkg/src/consumer.d.ts.map +1 -0
  14. package/dist/__tests__/fixtures/unused-config-surface/pkg/src/consumer.js +4 -0
  15. package/dist/__tests__/fixtures/unused-config-surface/pkg/src/consumer.js.map +1 -0
  16. package/dist/__tests__/fixtures/unused-config-surface/pkg/src/index.d.ts +3 -0
  17. package/dist/__tests__/fixtures/unused-config-surface/pkg/src/index.d.ts.map +1 -0
  18. package/dist/__tests__/fixtures/unused-config-surface/pkg/src/index.js +2 -0
  19. package/dist/__tests__/fixtures/unused-config-surface/pkg/src/index.js.map +1 -0
  20. package/dist/__tests__/graph-evidence.test.d.ts +2 -0
  21. package/dist/__tests__/graph-evidence.test.d.ts.map +1 -0
  22. package/dist/__tests__/graph-evidence.test.js +159 -0
  23. package/dist/__tests__/graph-evidence.test.js.map +1 -0
  24. package/dist/__tests__/walk-typescript-files.test.d.ts +2 -0
  25. package/dist/__tests__/walk-typescript-files.test.d.ts.map +1 -0
  26. package/dist/__tests__/walk-typescript-files.test.js +47 -0
  27. package/dist/__tests__/walk-typescript-files.test.js.map +1 -0
  28. package/dist/__tests__/yagni-coverage.test.d.ts +2 -0
  29. package/dist/__tests__/yagni-coverage.test.d.ts.map +1 -0
  30. package/dist/__tests__/yagni-coverage.test.js +542 -0
  31. package/dist/__tests__/yagni-coverage.test.js.map +1 -0
  32. package/dist/__tests__/yagni-golden.test.d.ts +5 -0
  33. package/dist/__tests__/yagni-golden.test.d.ts.map +1 -0
  34. package/dist/__tests__/yagni-golden.test.js +135 -0
  35. package/dist/__tests__/yagni-golden.test.js.map +1 -0
  36. package/dist/__tests__/yagni-presentation.test.d.ts +2 -0
  37. package/dist/__tests__/yagni-presentation.test.d.ts.map +1 -0
  38. package/dist/__tests__/yagni-presentation.test.js +30 -0
  39. package/dist/__tests__/yagni-presentation.test.js.map +1 -0
  40. package/dist/baseline-strategy.d.ts +9 -0
  41. package/dist/baseline-strategy.d.ts.map +1 -0
  42. package/dist/baseline-strategy.js +30 -0
  43. package/dist/baseline-strategy.js.map +1 -0
  44. package/dist/cli/__tests__/yagni-runner.test.d.ts +5 -0
  45. package/dist/cli/__tests__/yagni-runner.test.d.ts.map +1 -0
  46. package/dist/cli/__tests__/yagni-runner.test.js +126 -0
  47. package/dist/cli/__tests__/yagni-runner.test.js.map +1 -0
  48. package/dist/cli/execute-yagni.d.ts +32 -0
  49. package/dist/cli/execute-yagni.d.ts.map +1 -0
  50. package/dist/cli/execute-yagni.js +127 -0
  51. package/dist/cli/execute-yagni.js.map +1 -0
  52. package/dist/cli/report-data.d.ts +23 -0
  53. package/dist/cli/report-data.d.ts.map +1 -0
  54. package/dist/cli/report-data.js +23 -0
  55. package/dist/cli/report-data.js.map +1 -0
  56. package/dist/cli/yagni-command-spec.d.ts +6 -0
  57. package/dist/cli/yagni-command-spec.d.ts.map +1 -0
  58. package/dist/cli/yagni-command-spec.js +152 -0
  59. package/dist/cli/yagni-command-spec.js.map +1 -0
  60. package/dist/cli/yagni-config-schema.d.ts +28 -0
  61. package/dist/cli/yagni-config-schema.d.ts.map +1 -0
  62. package/dist/cli/yagni-config-schema.js +39 -0
  63. package/dist/cli/yagni-config-schema.js.map +1 -0
  64. package/dist/cli/yagni-config.d.ts +27 -0
  65. package/dist/cli/yagni-config.d.ts.map +1 -0
  66. package/dist/cli/yagni-config.js +72 -0
  67. package/dist/cli/yagni-config.js.map +1 -0
  68. package/dist/cli/yagni-presentation.d.ts +15 -0
  69. package/dist/cli/yagni-presentation.d.ts.map +1 -0
  70. package/dist/cli/yagni-presentation.js +92 -0
  71. package/dist/cli/yagni-presentation.js.map +1 -0
  72. package/dist/cli/yagni-runner.d.ts +20 -0
  73. package/dist/cli/yagni-runner.d.ts.map +1 -0
  74. package/dist/cli/yagni-runner.js +95 -0
  75. package/dist/cli/yagni-runner.js.map +1 -0
  76. package/dist/detectors/create-yagni-signal.d.ts +8 -0
  77. package/dist/detectors/create-yagni-signal.d.ts.map +1 -0
  78. package/dist/detectors/create-yagni-signal.js +10 -0
  79. package/dist/detectors/create-yagni-signal.js.map +1 -0
  80. package/dist/detectors/duplicate-body-candidate.d.ts +7 -0
  81. package/dist/detectors/duplicate-body-candidate.d.ts.map +1 -0
  82. package/dist/detectors/duplicate-body-candidate.js +137 -0
  83. package/dist/detectors/duplicate-body-candidate.js.map +1 -0
  84. package/dist/detectors/registry.d.ts +4 -0
  85. package/dist/detectors/registry.d.ts.map +1 -0
  86. package/dist/detectors/registry.js +8 -0
  87. package/dist/detectors/registry.js.map +1 -0
  88. package/dist/detectors/types.d.ts +28 -0
  89. package/dist/detectors/types.d.ts.map +1 -0
  90. package/dist/detectors/types.js +2 -0
  91. package/dist/detectors/types.js.map +1 -0
  92. package/dist/detectors/unused-config-surface.d.ts +10 -0
  93. package/dist/detectors/unused-config-surface.d.ts.map +1 -0
  94. package/dist/detectors/unused-config-surface.js +199 -0
  95. package/dist/detectors/unused-config-surface.js.map +1 -0
  96. package/dist/evidence/graph-evidence.d.ts +15 -0
  97. package/dist/evidence/graph-evidence.d.ts.map +1 -0
  98. package/dist/evidence/graph-evidence.js +89 -0
  99. package/dist/evidence/graph-evidence.js.map +1 -0
  100. package/dist/evidence/load-graph-adapters.d.ts +13 -0
  101. package/dist/evidence/load-graph-adapters.d.ts.map +1 -0
  102. package/dist/evidence/load-graph-adapters.js +67 -0
  103. package/dist/evidence/load-graph-adapters.js.map +1 -0
  104. package/dist/identity.d.ts +7 -0
  105. package/dist/identity.d.ts.map +1 -0
  106. package/dist/identity.js +7 -0
  107. package/dist/identity.js.map +1 -0
  108. package/dist/index.d.ts +8 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +6 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/lib/apply-advisory-exit.d.ts +8 -0
  113. package/dist/lib/apply-advisory-exit.d.ts.map +1 -0
  114. package/dist/lib/apply-advisory-exit.js +16 -0
  115. package/dist/lib/apply-advisory-exit.js.map +1 -0
  116. package/dist/lib/isolate-exit-code.d.ts +8 -0
  117. package/dist/lib/isolate-exit-code.d.ts.map +1 -0
  118. package/dist/lib/isolate-exit-code.js +27 -0
  119. package/dist/lib/isolate-exit-code.js.map +1 -0
  120. package/dist/lib/resolve-positional-paths.d.ts +6 -0
  121. package/dist/lib/resolve-positional-paths.d.ts.map +1 -0
  122. package/dist/lib/resolve-positional-paths.js +33 -0
  123. package/dist/lib/resolve-positional-paths.js.map +1 -0
  124. package/dist/lib/walk-typescript-files.d.ts +2 -0
  125. package/dist/lib/walk-typescript-files.d.ts.map +1 -0
  126. package/dist/lib/walk-typescript-files.js +50 -0
  127. package/dist/lib/walk-typescript-files.js.map +1 -0
  128. package/dist/persistence/session-payload.d.ts +54 -0
  129. package/dist/persistence/session-payload.d.ts.map +1 -0
  130. package/dist/persistence/session-payload.js +48 -0
  131. package/dist/persistence/session-payload.js.map +1 -0
  132. package/dist/scoring/__tests__/confidence.test.d.ts +2 -0
  133. package/dist/scoring/__tests__/confidence.test.d.ts.map +1 -0
  134. package/dist/scoring/__tests__/confidence.test.js +123 -0
  135. package/dist/scoring/__tests__/confidence.test.js.map +1 -0
  136. package/dist/scoring/confidence.d.ts +12 -0
  137. package/dist/scoring/confidence.d.ts.map +1 -0
  138. package/dist/scoring/confidence.js +106 -0
  139. package/dist/scoring/confidence.js.map +1 -0
  140. package/dist/tool.d.ts +11 -0
  141. package/dist/tool.d.ts.map +1 -0
  142. package/dist/tool.js +38 -0
  143. package/dist/tool.js.map +1 -0
  144. package/dist/types/yagni-config.d.ts +18 -0
  145. package/dist/types/yagni-config.d.ts.map +1 -0
  146. package/dist/types/yagni-config.js +11 -0
  147. package/dist/types/yagni-config.js.map +1 -0
  148. package/dist/types/yagni-metadata.d.ts +51 -0
  149. package/dist/types/yagni-metadata.d.ts.map +1 -0
  150. package/dist/types/yagni-metadata.js +5 -0
  151. package/dist/types/yagni-metadata.js.map +1 -0
  152. package/package.json +77 -0
@@ -0,0 +1,542 @@
1
+ import { mkdirSync, mkdtempSync, writeFileSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { EXIT_CODES } from '@opensip-cli/contracts';
6
+ import { RunScope, runWithScope, runWithScopeSync } from '@opensip-cli/core';
7
+ import { describe, expect, it, vi } from 'vitest';
8
+ import { collectYagniReportData } from '../cli/report-data.js';
9
+ import { buildYagniCommandSpec } from '../cli/yagni-command-spec.js';
10
+ import { YagniConfigSchema, yagniConfigDeclaration } from '../cli/yagni-config-schema.js';
11
+ import { loadYagniConfig } from '../cli/yagni-config.js';
12
+ import { buildYagniRunPresentation, buildYagniPresentationLines, } from '../cli/yagni-presentation.js';
13
+ import { createYagniSignal } from '../detectors/create-yagni-signal.js';
14
+ import { duplicateBodyCandidateDetector } from '../detectors/duplicate-body-candidate.js';
15
+ import { unusedConfigSurfaceDetector } from '../detectors/unused-config-surface.js';
16
+ import { resolveYagniPositionalPaths } from '../lib/resolve-positional-paths.js';
17
+ import { buildYagniSessionPayload } from '../persistence/session-payload.js';
18
+ import { buildYagniRunSummary, filterByMinConfidence, filterByReductionCategories, readYagniMetadata, severityForConfidence, sortYagniSignals, } from '../scoring/confidence.js';
19
+ import { YAGNI_CONTRACT_VERSION, YAGNI_STABLE_ID, yagniTool } from '../tool.js';
20
+ const yagniCommandSpec = buildYagniCommandSpec(() => {
21
+ // coverage tests use the static handler path
22
+ });
23
+ const HERE = dirname(fileURLToPath(import.meta.url));
24
+ const FIXTURE_ROOT = join(HERE, 'fixtures', 'unused-config-surface', 'pkg');
25
+ function tempDir() {
26
+ return mkdtempSync(join(tmpdir(), 'opensip-yagni-test-'));
27
+ }
28
+ function makeCli() {
29
+ const state = {};
30
+ return {
31
+ scope: { datastore: () => undefined },
32
+ emitEnvelope: vi.fn(),
33
+ emitJson: vi.fn(),
34
+ emitError: vi.fn(),
35
+ render: vi.fn(() => Promise.resolve()),
36
+ renderLive: vi.fn(() => Promise.resolve()),
37
+ registerLiveView: vi.fn(),
38
+ setExitCode: vi.fn((code) => {
39
+ state.code = code;
40
+ }),
41
+ getExitCode: vi.fn(() => state.code),
42
+ deliverSignals: vi.fn(() => Promise.resolve({ delivered: false })),
43
+ writeSarif: vi.fn(() => Promise.resolve()),
44
+ maybeOpenReport: vi.fn(() => Promise.resolve()),
45
+ _state: state,
46
+ };
47
+ }
48
+ function signal(id, confidence, netEstimate, estimateKind, category = 'config') {
49
+ return createYagniSignal({
50
+ source: `yagni:${id}`,
51
+ ruleId: `yagni:${id}`,
52
+ severity: severityForConfidence(confidence),
53
+ category: 'quality',
54
+ message: id,
55
+ suggestion: `fix ${id}`,
56
+ code: { file: `/repo/${id}.ts`, line: netEstimate, column: 1 },
57
+ yagni: {
58
+ detector: id,
59
+ reductionCategory: category,
60
+ confidence,
61
+ locDelta: {
62
+ remove: netEstimate,
63
+ add: 0,
64
+ netEstimate,
65
+ estimateKind,
66
+ },
67
+ preservationArgument: 'covered by test',
68
+ suggestedAction: `fix ${id}`,
69
+ validationRequired: ['run tests'],
70
+ riskTags: [],
71
+ evidence: [{ id, kind: 'test', summary: id }],
72
+ },
73
+ });
74
+ }
75
+ function graphOccurrence(overrides) {
76
+ return {
77
+ kind: 'function-declaration',
78
+ params: [],
79
+ returnType: null,
80
+ enclosingClass: null,
81
+ decorators: [],
82
+ visibility: 'exported',
83
+ inTestFile: false,
84
+ definedInGenerated: false,
85
+ calls: [],
86
+ ...overrides,
87
+ };
88
+ }
89
+ function envelope(input) {
90
+ const summary = input.summary ?? {
91
+ total: input.units?.length ?? 0,
92
+ passed: input.units?.filter((unit) => unit.passed).length ?? 0,
93
+ failed: input.units?.filter((unit) => !unit.passed).length ?? 0,
94
+ errors: 0,
95
+ warnings: input.signals.length,
96
+ };
97
+ return {
98
+ schemaVersion: 2,
99
+ tool: 'yagni',
100
+ runId: 'test-run',
101
+ createdAt: '2026-06-22T00:00:00.000Z',
102
+ verdict: { score: 1, passed: summary.errors === 0, summary },
103
+ units: input.units ?? [],
104
+ signals: input.signals,
105
+ };
106
+ }
107
+ async function runCommandInScope(scope, rawOpts, cli) {
108
+ await runWithScope(scope, async () => {
109
+ await yagniCommandSpec.handler(rawOpts, cli);
110
+ });
111
+ }
112
+ describe('yagni config, tool metadata, and command handler', () => {
113
+ it('loads config from scope first, then YAML fallback, then defaults', () => {
114
+ const scoped = new RunScope();
115
+ Object.assign(scoped, {
116
+ toolConfig: {
117
+ yagni: {
118
+ graphMode: 'off',
119
+ defaultMinConfidence: 'high',
120
+ includeTests: true,
121
+ disabledDetectors: ['x'],
122
+ },
123
+ },
124
+ });
125
+ const scopedConfig = runWithScopeSync(scoped, () => loadYagniConfig('/unused'));
126
+ expect(scopedConfig).toMatchObject({
127
+ graphMode: 'off',
128
+ defaultMinConfidence: 'high',
129
+ includeTests: true,
130
+ disabledDetectors: ['x'],
131
+ });
132
+ const emptyScope = new RunScope();
133
+ expect(runWithScopeSync(emptyScope, () => loadYagniConfig('/unused'))).toMatchObject({
134
+ graphMode: 'auto',
135
+ defaultMinConfidence: 'medium',
136
+ includeTests: false,
137
+ });
138
+ const dir = tempDir();
139
+ writeFileSync(join(dir, 'opensip-cli.config.yml'), [
140
+ 'schemaVersion: 1',
141
+ 'yagni:',
142
+ ' graphMode: reuse',
143
+ ' defaultMinConfidence: low',
144
+ ' failOnWarnings: 2',
145
+ ' detectorSettings:',
146
+ ' duplicate-body-candidate:',
147
+ ' minOccurrences: 3',
148
+ ].join('\n'));
149
+ expect(loadYagniConfig(dir)).toMatchObject({
150
+ graphMode: 'reuse',
151
+ defaultMinConfidence: 'low',
152
+ failOnWarnings: 2,
153
+ detectorSettings: { 'duplicate-body-candidate': { minOccurrences: 3 } },
154
+ });
155
+ const invalidDir = tempDir();
156
+ writeFileSync(join(invalidDir, 'opensip-cli.config.yml'), 'schemaVersion: 1\nyagni: nope\n');
157
+ expect(loadYagniConfig(invalidDir)).toMatchObject({ graphMode: 'auto' });
158
+ });
159
+ it('exports config schema, report data, and tool metadata', () => {
160
+ expect(YagniConfigSchema.parse({
161
+ failOnErrors: 1,
162
+ failOnWarnings: 0,
163
+ defaultMinConfidence: 'medium',
164
+ graphMode: 'build',
165
+ includeTests: false,
166
+ disabledDetectors: ['duplicate-body-candidate'],
167
+ detectorSettings: { 'duplicate-body-candidate': { minBodyLines: 8 } },
168
+ })).toMatchObject({ graphMode: 'build' });
169
+ expect(YagniConfigSchema.safeParse({ graphMode: 'sometimes' }).success).toBe(false);
170
+ expect(yagniConfigDeclaration.env?.map((entry) => entry.envVar)).toContain('OPENSIP_YAGNI_GRAPH_MODE');
171
+ const reportData = collectYagniReportData({});
172
+ expect(reportData.yagniSummary).toMatchObject({
173
+ detectorCount: 2,
174
+ graphBackedCount: 1,
175
+ contractVersion: YAGNI_CONTRACT_VERSION,
176
+ });
177
+ expect(reportData.yagniCatalog).toEqual(expect.arrayContaining([expect.objectContaining({ slug: 'yagni:unused-config-surface' })]));
178
+ expect(yagniTool.metadata).toMatchObject({
179
+ id: YAGNI_STABLE_ID,
180
+ name: 'yagni',
181
+ });
182
+ expect(yagniTool.commandSpecs?.[0]?.name).toBe('yagni');
183
+ expect(yagniTool.commandSpecs?.[0]?.aliases).toEqual(['yag']);
184
+ expect(yagniTool.extensionPoints?.collectReportData).toBe(collectYagniReportData);
185
+ });
186
+ it('runs the command handler in JSON and human modes', async () => {
187
+ const jsonCli = makeCli();
188
+ const scope = new RunScope();
189
+ Object.assign(scope, {
190
+ toolConfig: { yagni: { graphMode: 'off', defaultMinConfidence: 'low' } },
191
+ });
192
+ await runCommandInScope(scope, {
193
+ cwd: FIXTURE_ROOT,
194
+ json: true,
195
+ graph: 'off',
196
+ minConfidence: 'low',
197
+ includeTests: true,
198
+ detector: ['unused-config-surface'],
199
+ _args: [[join(FIXTURE_ROOT, 'src')]],
200
+ }, jsonCli);
201
+ expect(jsonCli.emitEnvelope).toHaveBeenCalledOnce();
202
+ expect(jsonCli.render).not.toHaveBeenCalled();
203
+ expect(jsonCli.deliverSignals).toHaveBeenCalledOnce();
204
+ expect(jsonCli.maybeOpenReport).toHaveBeenCalledWith({
205
+ openRequested: false,
206
+ jsonOutput: true,
207
+ });
208
+ expect(jsonCli._state.code).toBe(EXIT_CODES.SUCCESS);
209
+ const humanCli = makeCli();
210
+ await runCommandInScope(scope, {
211
+ cwd: FIXTURE_ROOT,
212
+ verbose: true,
213
+ graph: 'invalid',
214
+ minConfidence: 'invalid',
215
+ category: 'config',
216
+ includeTests: true,
217
+ }, humanCli);
218
+ expect(humanCli.emitEnvelope).not.toHaveBeenCalled();
219
+ expect(humanCli.render).toHaveBeenCalledOnce();
220
+ expect(humanCli.maybeOpenReport).toHaveBeenCalledWith({
221
+ openRequested: false,
222
+ jsonOutput: false,
223
+ });
224
+ });
225
+ });
226
+ describe('yagni detectors and scoring helpers', () => {
227
+ it('emits duplicate-body candidates from graph body hashes', async () => {
228
+ const catalog = {
229
+ version: '1',
230
+ tool: 'graph',
231
+ language: 'typescript',
232
+ builtAt: '2026-06-22T00:00:00.000Z',
233
+ functions: {
234
+ a: [
235
+ graphOccurrence({
236
+ qualifiedName: 'pkgA.alpha',
237
+ simpleName: 'alpha',
238
+ filePath: join(FIXTURE_ROOT, 'src', 'a.ts'),
239
+ line: 10,
240
+ column: 2,
241
+ endLine: 18,
242
+ bodyHash: 'same-body-hash',
243
+ package: '@opensip-cli/a',
244
+ }),
245
+ ],
246
+ b: [
247
+ graphOccurrence({
248
+ qualifiedName: 'pkgB.strip.test.<arrow:packages/languages/lang-python/src/__tests__/strip.test.ts:69:29>',
249
+ simpleName: '<arrow:packages/languages/lang-python/src/__tests__/strip.test.ts:69:29>',
250
+ filePath: join(FIXTURE_ROOT, 'src', 'b.ts'),
251
+ line: 20,
252
+ column: 4,
253
+ endLine: 28,
254
+ bodyHash: 'same-body-hash',
255
+ package: '@opensip-cli/b',
256
+ }),
257
+ graphOccurrence({
258
+ qualifiedName: 'pkgB.short',
259
+ simpleName: 'short',
260
+ filePath: join(FIXTURE_ROOT, 'src', 'short.ts'),
261
+ line: 1,
262
+ column: 1,
263
+ endLine: 2,
264
+ bodyHash: 'short-body-hash',
265
+ }),
266
+ ],
267
+ },
268
+ };
269
+ const result = await duplicateBodyCandidateDetector.run({
270
+ cwd: FIXTURE_ROOT,
271
+ config: { detectorSettings: { 'duplicate-body-candidate': { minBodyLines: 3 } } },
272
+ graphCatalog: catalog,
273
+ includeTests: false,
274
+ });
275
+ expect(result.signals).toHaveLength(1);
276
+ const metadata = result.signals[0] === undefined ? undefined : readYagniMetadata(result.signals[0]);
277
+ const suggestedAction = metadata?.suggestedAction ?? '';
278
+ expect(suggestedAction).toBe('Consolidate with src/b.ts:20 (arrow function).');
279
+ expect(suggestedAction).not.toContain('<arrow:');
280
+ expect(metadata).toMatchObject({
281
+ detector: 'duplicate-body-candidate',
282
+ reductionCategory: 'dedupe',
283
+ confidence: 'medium',
284
+ evidence: [
285
+ expect.objectContaining({
286
+ data: expect.objectContaining({
287
+ occurrenceCount: 2,
288
+ packages: ['@opensip-cli/a', '@opensip-cli/b'],
289
+ peer: expect.objectContaining({
290
+ qualifiedName: 'pkgB.strip.test.<arrow:packages/languages/lang-python/src/__tests__/strip.test.ts:69:29>',
291
+ }),
292
+ }),
293
+ }),
294
+ ],
295
+ });
296
+ const noGraph = await duplicateBodyCandidateDetector.run({
297
+ cwd: FIXTURE_ROOT,
298
+ config: {},
299
+ graphCatalog: null,
300
+ includeTests: false,
301
+ });
302
+ expect(noGraph.signals).toEqual([]);
303
+ });
304
+ it('formats duplicate-body peer names for human CLI output', async () => {
305
+ function pair(bodyHash, peer) {
306
+ return [
307
+ graphOccurrence({
308
+ qualifiedName: `${bodyHash}.anchor`,
309
+ simpleName: 'anchor',
310
+ filePath: join(FIXTURE_ROOT, 'src', `${bodyHash}-anchor.ts`),
311
+ line: 10,
312
+ column: 1,
313
+ endLine: 16,
314
+ bodyHash,
315
+ }),
316
+ graphOccurrence({
317
+ qualifiedName: `zz.${bodyHash}`,
318
+ simpleName: 'peer',
319
+ filePath: join(FIXTURE_ROOT, 'src', `${bodyHash}-peer.ts`),
320
+ line: 30,
321
+ column: 1,
322
+ endLine: 36,
323
+ bodyHash,
324
+ ...peer,
325
+ }),
326
+ ];
327
+ }
328
+ const catalog = {
329
+ version: '1',
330
+ tool: 'graph',
331
+ language: 'typescript',
332
+ builtAt: '2026-06-22T00:00:00.000Z',
333
+ functions: {
334
+ normal: pair('normal', { simpleName: 'namedHelper' }),
335
+ qualifiedArrow: pair('qualified-arrow', {
336
+ simpleName: 'packages/example/src/file.ts',
337
+ qualifiedName: 'zz.qualified.<arrow:packages/example/src/file.ts:5:9>',
338
+ }),
339
+ qualifiedTail: pair('qualified-tail', {
340
+ simpleName: 'packages/example/src/file.ts',
341
+ qualifiedName: 'zz.qualified.namedTail',
342
+ }),
343
+ fallback: pair('fallback', {
344
+ simpleName: 'packages/example/src/file.ts',
345
+ qualifiedName: 'zz.qualified.packages/example/src/file.ts',
346
+ }),
347
+ },
348
+ };
349
+ const result = await duplicateBodyCandidateDetector.run({
350
+ cwd: FIXTURE_ROOT,
351
+ config: { detectorSettings: { 'duplicate-body-candidate': { minBodyLines: 3 } } },
352
+ graphCatalog: catalog,
353
+ includeTests: false,
354
+ });
355
+ const actions = result.signals
356
+ .map((signal) => readYagniMetadata(signal)?.suggestedAction)
357
+ .filter((action) => action !== undefined);
358
+ expect(actions).toEqual(expect.arrayContaining([
359
+ 'Consolidate with src/normal-peer.ts:30 (namedHelper).',
360
+ 'Consolidate with src/qualified-arrow-peer.ts:30 (arrow function).',
361
+ 'Consolidate with src/qualified-tail-peer.ts:30 (namedTail).',
362
+ 'Consolidate with src/fallback-peer.ts:30 (function).',
363
+ ]));
364
+ expect(actions.join('\n')).not.toContain('<arrow:');
365
+ });
366
+ it('sorts, filters, summarizes, and persists YAGNI signal metadata', () => {
367
+ const high = signal('high', 'high', 5, 'exact', 'config');
368
+ const medium = signal('medium', 'medium', 8, 'heuristic', 'dedupe');
369
+ const low = signal('low', 'low', 20, 'lower-bound', 'config');
370
+ const plain = {
371
+ ...high,
372
+ id: 'plain',
373
+ source: 'plain',
374
+ ruleId: 'plain',
375
+ metadata: {},
376
+ filePath: '',
377
+ line: undefined,
378
+ column: undefined,
379
+ suggestion: undefined,
380
+ };
381
+ expect(readYagniMetadata(plain)).toBeUndefined();
382
+ expect(filterByMinConfidence([low, medium, high, plain], 'medium')).toEqual([
383
+ medium,
384
+ high,
385
+ plain,
386
+ ]);
387
+ expect(filterByReductionCategories([low, medium, high, plain], ['config'])).toEqual([
388
+ low,
389
+ high,
390
+ plain,
391
+ ]);
392
+ expect(filterByReductionCategories([low, medium], [])).toEqual([low, medium]);
393
+ expect(sortYagniSignals([plain, low, medium, high]).map((s) => s.ruleId)).toEqual([
394
+ 'yagni:high',
395
+ 'yagni:medium',
396
+ 'yagni:low',
397
+ 'plain',
398
+ ]);
399
+ const detectorTieA = signal('alpha', 'medium', 10, 'exact', 'config');
400
+ const detectorTieB = signal('beta', 'medium', 10, 'exact', 'config');
401
+ expect(sortYagniSignals([detectorTieB, detectorTieA]).map((s) => s.ruleId)).toEqual([
402
+ 'yagni:alpha',
403
+ 'yagni:beta',
404
+ ]);
405
+ const summary = buildYagniRunSummary([low, medium, high, plain], 'reuse', [
406
+ { id: 'skipped', slug: 'yagni:skipped', reason: 'disabled' },
407
+ { id: 'graph', slug: 'yagni:graph', reason: 'graph-required', detail: 'missing' },
408
+ ]);
409
+ expect(summary).toMatchObject({
410
+ totalCandidates: 4,
411
+ byConfidence: { high: 1, medium: 1, low: 1 },
412
+ estimatedTotalLocReduction: 33,
413
+ graphMode: 'reuse',
414
+ });
415
+ expect(summary.skippedDetectors).toEqual([
416
+ { slug: 'yagni:skipped', reason: 'disabled' },
417
+ { slug: 'yagni:graph', reason: 'graph-required', detail: 'missing' },
418
+ ]);
419
+ const payload = buildYagniSessionPayload(envelope({
420
+ signals: [high],
421
+ units: [{ slug: high.source, passed: false, violationCount: 1, durationMs: 7 }],
422
+ summary: { total: 1, passed: 0, failed: 1, errors: 0, warnings: 1 },
423
+ }), [], {
424
+ graphMode: 'reuse',
425
+ graphBuilt: false,
426
+ yagniSummary: summary,
427
+ });
428
+ expect(payload.checks[0]).toMatchObject({
429
+ checkSlug: high.source,
430
+ violationCount: 1,
431
+ findings: [expect.objectContaining({ severity: 'warning', metadata: high.metadata })],
432
+ });
433
+ expect(payload.summary.graphDetail).toBeUndefined();
434
+ const errorFinding = {
435
+ ...high,
436
+ severity: 'high',
437
+ line: undefined,
438
+ column: undefined,
439
+ suggestion: undefined,
440
+ };
441
+ const duplicateSource = { ...medium, source: high.source };
442
+ const detailedPayload = buildYagniSessionPayload(envelope({
443
+ signals: [errorFinding, duplicateSource],
444
+ units: [{ slug: high.source, passed: false, durationMs: 9 }],
445
+ summary: { total: 1, passed: 0, failed: 1, errors: 1, warnings: 1 },
446
+ }), [], {
447
+ graphMode: 'build',
448
+ graphBuilt: true,
449
+ graphDetail: 'built fresh catalog',
450
+ yagniSummary: summary,
451
+ });
452
+ expect(detailedPayload.checks[0]).toMatchObject({
453
+ violationCount: 2,
454
+ findings: [
455
+ expect.objectContaining({ severity: 'error' }),
456
+ expect.objectContaining({ severity: 'warning' }),
457
+ ],
458
+ });
459
+ expect(detailedPayload.checks[0]?.findings[0]).not.toHaveProperty('line');
460
+ expect(detailedPayload.checks[0]?.findings[0]).not.toHaveProperty('suggestion');
461
+ expect(detailedPayload.summary.graphDetail).toBe('built fresh catalog');
462
+ });
463
+ it('covers presentation variants and unreadable/oversized source skips', async () => {
464
+ const outcome = await unusedConfigSurfaceDetector.run({
465
+ cwd: FIXTURE_ROOT,
466
+ config: {},
467
+ graphCatalog: null,
468
+ includeTests: true,
469
+ pathRoots: [join(FIXTURE_ROOT, 'src')],
470
+ });
471
+ expect(outcome.signals).toHaveLength(1);
472
+ const dir = tempDir();
473
+ mkdirSync(join(dir, 'src'));
474
+ writeFileSync(join(dir, 'src', 'huge-config.ts'), `export interface HugeConfig {\n${'x'.repeat(1_000_020)}\n}`);
475
+ const skipped = await unusedConfigSurfaceDetector.run({
476
+ cwd: dir,
477
+ config: {},
478
+ graphCatalog: null,
479
+ includeTests: false,
480
+ pathRoots: [join(dir, 'src')],
481
+ });
482
+ expect(skipped.signals).toEqual([]);
483
+ const verboseLines = buildYagniPresentationLines(envelope({
484
+ units: [{ slug: 'yagni:unused-config-surface', passed: true, durationMs: 1 }],
485
+ signals: outcome.signals,
486
+ summary: { total: 1, passed: 0, failed: 1, errors: 0, warnings: 1 },
487
+ }), FIXTURE_ROOT, 'off', [{ id: 'x', slug: 'yagni:x', reason: 'disabled', detail: 'configured' }], true);
488
+ expect(verboseLines.join('\n')).toContain('Skipped detectors');
489
+ const presentation = buildYagniRunPresentation({
490
+ envelope: envelope({
491
+ signals: [],
492
+ summary: { total: 0, passed: 1, failed: 0, errors: 0, warnings: 0 },
493
+ }),
494
+ cwd: FIXTURE_ROOT,
495
+ graphMode: 'off',
496
+ skippedDetectors: [],
497
+ verbose: false,
498
+ durationMs: 12,
499
+ });
500
+ expect(presentation.envelope.verdict.summary).toMatchObject({ total: 0, warnings: 0 });
501
+ const highNoDetails = signal('no-details', 'high', 0, 'exact');
502
+ const metadata = readYagniMetadata(highNoDetails);
503
+ const sparse = {
504
+ ...highNoDetails,
505
+ filePath: '',
506
+ line: undefined,
507
+ metadata: {
508
+ yagni: metadata === undefined
509
+ ? undefined
510
+ : {
511
+ ...metadata,
512
+ locDelta: undefined,
513
+ validationRequired: [],
514
+ riskTags: [],
515
+ evidence: [],
516
+ },
517
+ },
518
+ };
519
+ const noMetadata = { ...sparse, metadata: {} };
520
+ const sparseLines = buildYagniPresentationLines(envelope({
521
+ signals: [noMetadata, sparse],
522
+ units: [{ slug: 'yagni:sparse', passed: false, durationMs: 1 }],
523
+ }), FIXTURE_ROOT, 'reuse', [{ id: 'plain', slug: 'yagni:plain', reason: 'disabled' }], true);
524
+ const sparseText = sparseLines.join('\n');
525
+ expect(sparseText).toContain('<unknown>');
526
+ expect(sparseText).toContain('yagni:plain: disabled');
527
+ expect(sparseText).not.toContain('validation:');
528
+ });
529
+ });
530
+ describe('yagni positional path resolution', () => {
531
+ it('resolves directories and rejects invalid positionals', () => {
532
+ const dir = tempDir();
533
+ const nested = join(dir, 'nested');
534
+ mkdirSync(nested);
535
+ writeFileSync(join(dir, 'file.ts'), 'export const x = 1;\n');
536
+ expect(resolveYagniPositionalPaths(['nested', nested], dir)).toEqual([nested, nested]);
537
+ expect(() => resolveYagniPositionalPaths([' '], dir)).toThrow(/empty/);
538
+ expect(() => resolveYagniPositionalPaths(['missing'], dir)).toThrow(/does not exist/);
539
+ expect(() => resolveYagniPositionalPaths(['file.ts'], dir)).toThrow(/not a directory/);
540
+ });
541
+ });
542
+ //# sourceMappingURL=yagni-coverage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yagni-coverage.test.js","sourceRoot":"","sources":["../../src/__tests__/yagni-coverage.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * JSON golden snapshots for the YAGNI tool envelope + session payload.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=yagni-golden.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yagni-golden.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/yagni-golden.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}