@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,106 @@
1
+ const CONFIDENCE_RANK = {
2
+ high: 3,
3
+ medium: 2,
4
+ low: 1,
5
+ };
6
+ const ESTIMATE_KIND_RANK = {
7
+ exact: 3,
8
+ 'lower-bound': 2,
9
+ heuristic: 1,
10
+ };
11
+ const MIN_CONFIDENCE_RANK = {
12
+ low: 1,
13
+ medium: 2,
14
+ high: 3,
15
+ };
16
+ export function readYagniMetadata(signal) {
17
+ const raw = signal.metadata.yagni;
18
+ if (typeof raw !== 'object' || raw === null)
19
+ return undefined;
20
+ return raw;
21
+ }
22
+ /** Keep findings at or above the configured minimum confidence level. */
23
+ export function filterByMinConfidence(signals, minConfidence) {
24
+ const floor = MIN_CONFIDENCE_RANK[minConfidence];
25
+ return signals.filter((signal) => {
26
+ const meta = readYagniMetadata(signal);
27
+ if (meta === undefined)
28
+ return true;
29
+ return CONFIDENCE_RANK[meta.confidence] >= floor;
30
+ });
31
+ }
32
+ export function filterByReductionCategories(signals, categories) {
33
+ if (categories.length === 0)
34
+ return [...signals];
35
+ const allowed = new Set(categories);
36
+ return signals.filter((signal) => {
37
+ const meta = readYagniMetadata(signal);
38
+ if (meta === undefined)
39
+ return true;
40
+ return allowed.has(meta.reductionCategory);
41
+ });
42
+ }
43
+ function locationKey(signal) {
44
+ const line = signal.line ?? 0;
45
+ const col = signal.column ?? 0;
46
+ return `${signal.filePath}:${String(line)}:${String(col)}`;
47
+ }
48
+ /** Stable sort: confidence DESC → estimateKind → netEstimate DESC → detector → location. */
49
+ export function sortYagniSignals(signals) {
50
+ return [...signals].sort((a, b) => {
51
+ const ma = readYagniMetadata(a);
52
+ const mb = readYagniMetadata(b);
53
+ const confA = ma ? CONFIDENCE_RANK[ma.confidence] : 0;
54
+ const confB = mb ? CONFIDENCE_RANK[mb.confidence] : 0;
55
+ if (confA !== confB)
56
+ return confB - confA;
57
+ const kindA = ma?.locDelta ? ESTIMATE_KIND_RANK[ma.locDelta.estimateKind] : 0;
58
+ const kindB = mb?.locDelta ? ESTIMATE_KIND_RANK[mb.locDelta.estimateKind] : 0;
59
+ if (kindA !== kindB)
60
+ return kindB - kindA;
61
+ const netA = ma?.locDelta?.netEstimate ?? 0;
62
+ const netB = mb?.locDelta?.netEstimate ?? 0;
63
+ if (netA !== netB)
64
+ return netB - netA;
65
+ const detA = ma?.detector ?? '';
66
+ const detB = mb?.detector ?? '';
67
+ if (detA !== detB)
68
+ return detA.localeCompare(detB);
69
+ return locationKey(a).localeCompare(locationKey(b));
70
+ });
71
+ }
72
+ export function buildYagniRunSummary(signals, graphMode, skippedDetectors) {
73
+ let high = 0;
74
+ let medium = 0;
75
+ let low = 0;
76
+ let estimatedTotalLocReduction = 0;
77
+ for (const signal of signals) {
78
+ const meta = readYagniMetadata(signal);
79
+ if (meta === undefined)
80
+ continue;
81
+ if (meta.confidence === 'high')
82
+ high += 1;
83
+ else if (meta.confidence === 'medium')
84
+ medium += 1;
85
+ else
86
+ low += 1;
87
+ if (meta.locDelta !== undefined) {
88
+ estimatedTotalLocReduction += meta.locDelta.netEstimate;
89
+ }
90
+ }
91
+ return {
92
+ totalCandidates: signals.length,
93
+ byConfidence: { high, medium, low },
94
+ estimatedTotalLocReduction,
95
+ graphMode,
96
+ skippedDetectors: skippedDetectors.map((s) => ({
97
+ slug: s.slug,
98
+ reason: s.reason,
99
+ ...(s.detail === undefined ? {} : { detail: s.detail }),
100
+ })),
101
+ };
102
+ }
103
+ export function severityForConfidence(confidence) {
104
+ return confidence === 'high' ? 'medium' : 'low';
105
+ }
106
+ //# sourceMappingURL=confidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confidence.js","sourceRoot":"","sources":["../../src/scoring/confidence.ts"],"names":[],"mappings":"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"}
package/dist/tool.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * yagniTool — YAGNI reduction audit as a Tool plugin.
3
+ */
4
+ import { type Tool } from '@opensip-cli/core';
5
+ /**
6
+ * Per-tool contract version (ADR-0047).
7
+ */
8
+ export declare const YAGNI_CONTRACT_VERSION = "1.0.0";
9
+ export declare const YAGNI_STABLE_ID = "3aba9195-2297-4f20-99d5-906945092dfc";
10
+ export declare const yagniTool: Tool;
11
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAuD,KAAK,IAAI,EAAE,MAAM,mBAAmB,CAAC;AASnG;;GAEG;AACH,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAE9C,eAAO,MAAM,eAAe,yCAAyC,CAAC;AAQtE,eAAO,MAAM,SAAS,EAAE,IAkBtB,CAAC"}
package/dist/tool.js ADDED
@@ -0,0 +1,38 @@
1
+ /**
2
+ * yagniTool — YAGNI reduction audit as a Tool plugin.
3
+ */
4
+ import { defineTool, readPackageVersion } from '@opensip-cli/core';
5
+ import { yagniFingerprintStrategy } from './baseline-strategy.js';
6
+ import { collectYagniReportData } from './cli/report-data.js';
7
+ import { buildYagniCommandSpec } from './cli/yagni-command-spec.js';
8
+ import { yagniConfigDeclaration } from './cli/yagni-config-schema.js';
9
+ import { renderYagniLive } from './cli/yagni-runner.js';
10
+ import { YAGNI_IDENTITY, YAGNI_LIVE_VIEW_KEY } from './identity.js';
11
+ /**
12
+ * Per-tool contract version (ADR-0047).
13
+ */
14
+ export const YAGNI_CONTRACT_VERSION = '1.0.0';
15
+ export const YAGNI_STABLE_ID = '3aba9195-2297-4f20-99d5-906945092dfc';
16
+ function setUpYagniLiveView(cli) {
17
+ cli.registerLiveView(YAGNI_LIVE_VIEW_KEY, async (args, liveContext) => renderYagniLive(args, cli, liveContext));
18
+ }
19
+ export const yagniTool = defineTool({
20
+ identity: YAGNI_IDENTITY,
21
+ metadata: {
22
+ id: YAGNI_STABLE_ID,
23
+ version: readPackageVersion(import.meta.url),
24
+ description: 'YAGNI reduction audit — find speculative surface to remove',
25
+ },
26
+ commandSpecs: [buildYagniCommandSpec(setUpYagniLiveView)],
27
+ extensionPoints: {
28
+ yagniContractVersion: YAGNI_CONTRACT_VERSION,
29
+ config: {
30
+ schema: yagniConfigDeclaration.schema,
31
+ defaults: yagniConfigDeclaration.defaults,
32
+ env: yagniConfigDeclaration.env,
33
+ },
34
+ collectReportData: collectYagniReportData,
35
+ fingerprintStrategy: yagniFingerprintStrategy,
36
+ },
37
+ });
38
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAkC,MAAM,mBAAmB,CAAC;AAEnG,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAsB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpE;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAE9C,MAAM,CAAC,MAAM,eAAe,GAAG,sCAAsC,CAAC;AAEtE,SAAS,kBAAkB,CAAC,GAAmB;IAC7C,GAAG,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CACpE,eAAe,CAAC,IAAqB,EAAE,GAAG,EAAE,WAAW,CAAC,CACzD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAS,UAAU,CAAC;IACxC,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE;QACR,EAAE,EAAE,eAAe;QACnB,OAAO,EAAE,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5C,WAAW,EAAE,4DAA4D;KAC1E;IACD,YAAY,EAAE,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;IACzD,eAAe,EAAE;QACf,oBAAoB,EAAE,sBAAsB;QAC5C,MAAM,EAAE;YACN,MAAM,EAAE,sBAAsB,CAAC,MAAM;YACrC,QAAQ,EAAE,sBAAsB,CAAC,QAAQ;YACzC,GAAG,EAAE,sBAAsB,CAAC,GAAG;SAChC;QACD,iBAAiB,EAAE,sBAAsB;QACzC,mBAAmB,EAAE,wBAAwB;KAC9C;CACF,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Resolved YAGNI tool configuration — mirrors the `yagni:` namespace block.
3
+ */
4
+ import type { YagniConfidence } from './yagni-metadata.js';
5
+ /** Graph evidence strategy used by YAGNI graph-backed detectors. */
6
+ export type YagniGraphMode = 'auto' | 'reuse' | 'build' | 'off';
7
+ /** Validated values from the `yagni:` config namespace. */
8
+ export interface YagniConfig {
9
+ readonly failOnErrors?: number;
10
+ readonly failOnWarnings?: number;
11
+ readonly defaultMinConfidence?: YagniConfidence;
12
+ readonly graphMode?: YagniGraphMode;
13
+ readonly includeTests?: boolean;
14
+ readonly disabledDetectors?: readonly string[];
15
+ readonly detectorSettings?: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
16
+ }
17
+ export declare const DEFAULT_YAGNI_CONFIG: Required<Pick<YagniConfig, 'failOnErrors' | 'failOnWarnings' | 'defaultMinConfidence' | 'graphMode' | 'includeTests'>>;
18
+ //# sourceMappingURL=yagni-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yagni-config.d.ts","sourceRoot":"","sources":["../../src/types/yagni-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,oEAAoE;AACpE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;AAEhE,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,eAAe,CAAC;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CACzF;AAED,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CACzC,IAAI,CACF,WAAW,EACX,cAAc,GAAG,gBAAgB,GAAG,sBAAsB,GAAG,WAAW,GAAG,cAAc,CAC1F,CAOF,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Resolved YAGNI tool configuration — mirrors the `yagni:` namespace block.
3
+ */
4
+ export const DEFAULT_YAGNI_CONFIG = {
5
+ failOnErrors: 0,
6
+ failOnWarnings: 0,
7
+ defaultMinConfidence: 'medium',
8
+ graphMode: 'auto',
9
+ includeTests: false,
10
+ };
11
+ //# sourceMappingURL=yagni-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yagni-config.js","sourceRoot":"","sources":["../../src/types/yagni-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkBH,MAAM,CAAC,MAAM,oBAAoB,GAK7B;IACF,YAAY,EAAE,CAAC;IACf,cAAc,EAAE,CAAC;IACjB,oBAAoB,EAAE,QAAQ;IAC9B,SAAS,EAAE,MAAM;IACjB,YAAY,EAAE,KAAK;CACpB,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Canonical `metadata.yagni` shape stamped on every YAGNI finding signal (spec §7).
3
+ */
4
+ export type YagniConfidence = 'low' | 'medium' | 'high';
5
+ /** Reduction class used to group YAGNI findings by intended simplification. */
6
+ export type YagniReductionCategory = 'delete' | 'collapse' | 'inline' | 'dedupe' | 'stdlib' | 'native' | 'dependency' | 'config' | 'shrink';
7
+ /** Confidence level for the LOC estimate attached to a finding. */
8
+ export type YagniEstimateKind = 'exact' | 'lower-bound' | 'heuristic';
9
+ /** Estimated line-count impact for applying a reduction candidate. */
10
+ export interface YagniLocDelta {
11
+ readonly remove: number;
12
+ readonly add: number;
13
+ readonly netEstimate: number;
14
+ readonly estimateKind: YagniEstimateKind;
15
+ }
16
+ /** Evidence item supporting a YAGNI reduction candidate. */
17
+ export interface YagniEvidence {
18
+ readonly id: string;
19
+ readonly kind: string;
20
+ readonly summary: string;
21
+ readonly data?: Readonly<Record<string, unknown>>;
22
+ }
23
+ /** Metadata payload carried on each YAGNI signal. */
24
+ export interface YagniFindingMetadata {
25
+ readonly detector: string;
26
+ readonly reductionCategory: YagniReductionCategory;
27
+ readonly confidence: YagniConfidence;
28
+ readonly locDelta?: YagniLocDelta;
29
+ readonly preservationArgument: string;
30
+ readonly suggestedAction: string;
31
+ readonly validationRequired: readonly string[];
32
+ readonly riskTags: readonly string[];
33
+ readonly evidence: readonly YagniEvidence[];
34
+ }
35
+ /** Aggregate summary persisted with a YAGNI run session. */
36
+ export interface YagniRunSummary {
37
+ readonly totalCandidates: number;
38
+ readonly byConfidence: {
39
+ readonly high: number;
40
+ readonly medium: number;
41
+ readonly low: number;
42
+ };
43
+ readonly estimatedTotalLocReduction: number;
44
+ readonly graphMode: string;
45
+ readonly skippedDetectors: readonly {
46
+ readonly slug: string;
47
+ readonly reason: string;
48
+ readonly detail?: string;
49
+ }[];
50
+ }
51
+ //# sourceMappingURL=yagni-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yagni-metadata.d.ts","sourceRoot":"","sources":["../../src/types/yagni-metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAExD,+EAA+E;AAC/E,MAAM,MAAM,sBAAsB,GAC9B,QAAQ,GACR,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,QAAQ,GACR,QAAQ,CAAC;AAEb,mEAAmE;AACnE,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,aAAa,GAAG,WAAW,CAAC;AAEtE,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;CAC1C;AAED,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACnD;AAED,qDAAqD;AACrD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AAED,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE;QACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,SAAS;QAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;KAC1B,EAAE,CAAC;CACL"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Canonical `metadata.yagni` shape stamped on every YAGNI finding signal (spec §7).
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=yagni-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yagni-metadata.js","sourceRoot":"","sources":["../../src/types/yagni-metadata.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@opensip-cli/yagni",
3
+ "version": "0.1.11",
4
+ "license": "Apache-2.0",
5
+ "description": "YAGNI reduction audit for OpenSIP CLI",
6
+ "keywords": [
7
+ "opensip-cli",
8
+ "static-analysis",
9
+ "code-quality"
10
+ ],
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/opensip-ai/opensip-cli.git",
14
+ "directory": "packages/yagni/engine"
15
+ },
16
+ "homepage": "https://github.com/opensip-ai/opensip-cli",
17
+ "bugs": {
18
+ "url": "https://github.com/opensip-ai/opensip-cli/issues"
19
+ },
20
+ "type": "module",
21
+ "main": "./dist/index.js",
22
+ "types": "./dist/index.d.ts",
23
+ "exports": {
24
+ ".": "./dist/index.js"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "LICENSE",
29
+ "NOTICE"
30
+ ],
31
+ "opensipTools": {
32
+ "kind": "tool",
33
+ "id": "yagni",
34
+ "identity": {
35
+ "name": "yagni",
36
+ "aliases": [
37
+ "yag"
38
+ ]
39
+ },
40
+ "stableId": "3aba9195-2297-4f20-99d5-906945092dfc",
41
+ "apiVersion": 1,
42
+ "commands": [
43
+ {
44
+ "name": "yagni",
45
+ "aliases": [
46
+ "yag"
47
+ ],
48
+ "description": "Run YAGNI reduction audit detectors"
49
+ }
50
+ ]
51
+ },
52
+ "dependencies": {
53
+ "commander": "^15.0.0",
54
+ "react": "^19.2.7",
55
+ "typescript": "~6.0.3",
56
+ "zod": "^4.4.3",
57
+ "@opensip-cli/cli-live": "0.1.11",
58
+ "@opensip-cli/cli-ui": "0.1.11",
59
+ "@opensip-cli/config": "0.1.11",
60
+ "@opensip-cli/contracts": "0.1.11",
61
+ "@opensip-cli/core": "0.1.11",
62
+ "@opensip-cli/datastore": "0.1.11",
63
+ "@opensip-cli/graph": "0.1.11",
64
+ "@opensip-cli/lang-typescript": "0.1.11"
65
+ },
66
+ "devDependencies": {
67
+ "@types/node": "^24.13.2",
68
+ "@types/react": "^19.2.17",
69
+ "vitest": "^4.1.8"
70
+ },
71
+ "scripts": {
72
+ "build": "tsc",
73
+ "test": "vitest run",
74
+ "typecheck": "tsc --noEmit",
75
+ "clean": "rm -rf dist"
76
+ }
77
+ }