@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.
- package/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +33 -0
- package/dist/__tests__/apply-advisory-exit.test.d.ts +2 -0
- package/dist/__tests__/apply-advisory-exit.test.d.ts.map +1 -0
- package/dist/__tests__/apply-advisory-exit.test.js +31 -0
- package/dist/__tests__/apply-advisory-exit.test.js.map +1 -0
- package/dist/__tests__/fixtures/unused-config-surface/pkg/src/app-config.d.ts +6 -0
- package/dist/__tests__/fixtures/unused-config-surface/pkg/src/app-config.d.ts.map +1 -0
- package/dist/__tests__/fixtures/unused-config-surface/pkg/src/app-config.js +5 -0
- package/dist/__tests__/fixtures/unused-config-surface/pkg/src/app-config.js.map +1 -0
- package/dist/__tests__/fixtures/unused-config-surface/pkg/src/consumer.d.ts +3 -0
- package/dist/__tests__/fixtures/unused-config-surface/pkg/src/consumer.d.ts.map +1 -0
- package/dist/__tests__/fixtures/unused-config-surface/pkg/src/consumer.js +4 -0
- package/dist/__tests__/fixtures/unused-config-surface/pkg/src/consumer.js.map +1 -0
- package/dist/__tests__/fixtures/unused-config-surface/pkg/src/index.d.ts +3 -0
- package/dist/__tests__/fixtures/unused-config-surface/pkg/src/index.d.ts.map +1 -0
- package/dist/__tests__/fixtures/unused-config-surface/pkg/src/index.js +2 -0
- package/dist/__tests__/fixtures/unused-config-surface/pkg/src/index.js.map +1 -0
- package/dist/__tests__/graph-evidence.test.d.ts +2 -0
- package/dist/__tests__/graph-evidence.test.d.ts.map +1 -0
- package/dist/__tests__/graph-evidence.test.js +159 -0
- package/dist/__tests__/graph-evidence.test.js.map +1 -0
- package/dist/__tests__/walk-typescript-files.test.d.ts +2 -0
- package/dist/__tests__/walk-typescript-files.test.d.ts.map +1 -0
- package/dist/__tests__/walk-typescript-files.test.js +47 -0
- package/dist/__tests__/walk-typescript-files.test.js.map +1 -0
- package/dist/__tests__/yagni-coverage.test.d.ts +2 -0
- package/dist/__tests__/yagni-coverage.test.d.ts.map +1 -0
- package/dist/__tests__/yagni-coverage.test.js +542 -0
- package/dist/__tests__/yagni-coverage.test.js.map +1 -0
- package/dist/__tests__/yagni-golden.test.d.ts +5 -0
- package/dist/__tests__/yagni-golden.test.d.ts.map +1 -0
- package/dist/__tests__/yagni-golden.test.js +135 -0
- package/dist/__tests__/yagni-golden.test.js.map +1 -0
- package/dist/__tests__/yagni-presentation.test.d.ts +2 -0
- package/dist/__tests__/yagni-presentation.test.d.ts.map +1 -0
- package/dist/__tests__/yagni-presentation.test.js +30 -0
- package/dist/__tests__/yagni-presentation.test.js.map +1 -0
- package/dist/baseline-strategy.d.ts +9 -0
- package/dist/baseline-strategy.d.ts.map +1 -0
- package/dist/baseline-strategy.js +30 -0
- package/dist/baseline-strategy.js.map +1 -0
- package/dist/cli/__tests__/yagni-runner.test.d.ts +5 -0
- package/dist/cli/__tests__/yagni-runner.test.d.ts.map +1 -0
- package/dist/cli/__tests__/yagni-runner.test.js +126 -0
- package/dist/cli/__tests__/yagni-runner.test.js.map +1 -0
- package/dist/cli/execute-yagni.d.ts +32 -0
- package/dist/cli/execute-yagni.d.ts.map +1 -0
- package/dist/cli/execute-yagni.js +127 -0
- package/dist/cli/execute-yagni.js.map +1 -0
- package/dist/cli/report-data.d.ts +23 -0
- package/dist/cli/report-data.d.ts.map +1 -0
- package/dist/cli/report-data.js +23 -0
- package/dist/cli/report-data.js.map +1 -0
- package/dist/cli/yagni-command-spec.d.ts +6 -0
- package/dist/cli/yagni-command-spec.d.ts.map +1 -0
- package/dist/cli/yagni-command-spec.js +152 -0
- package/dist/cli/yagni-command-spec.js.map +1 -0
- package/dist/cli/yagni-config-schema.d.ts +28 -0
- package/dist/cli/yagni-config-schema.d.ts.map +1 -0
- package/dist/cli/yagni-config-schema.js +39 -0
- package/dist/cli/yagni-config-schema.js.map +1 -0
- package/dist/cli/yagni-config.d.ts +27 -0
- package/dist/cli/yagni-config.d.ts.map +1 -0
- package/dist/cli/yagni-config.js +72 -0
- package/dist/cli/yagni-config.js.map +1 -0
- package/dist/cli/yagni-presentation.d.ts +15 -0
- package/dist/cli/yagni-presentation.d.ts.map +1 -0
- package/dist/cli/yagni-presentation.js +92 -0
- package/dist/cli/yagni-presentation.js.map +1 -0
- package/dist/cli/yagni-runner.d.ts +20 -0
- package/dist/cli/yagni-runner.d.ts.map +1 -0
- package/dist/cli/yagni-runner.js +95 -0
- package/dist/cli/yagni-runner.js.map +1 -0
- package/dist/detectors/create-yagni-signal.d.ts +8 -0
- package/dist/detectors/create-yagni-signal.d.ts.map +1 -0
- package/dist/detectors/create-yagni-signal.js +10 -0
- package/dist/detectors/create-yagni-signal.js.map +1 -0
- package/dist/detectors/duplicate-body-candidate.d.ts +7 -0
- package/dist/detectors/duplicate-body-candidate.d.ts.map +1 -0
- package/dist/detectors/duplicate-body-candidate.js +137 -0
- package/dist/detectors/duplicate-body-candidate.js.map +1 -0
- package/dist/detectors/registry.d.ts +4 -0
- package/dist/detectors/registry.d.ts.map +1 -0
- package/dist/detectors/registry.js +8 -0
- package/dist/detectors/registry.js.map +1 -0
- package/dist/detectors/types.d.ts +28 -0
- package/dist/detectors/types.d.ts.map +1 -0
- package/dist/detectors/types.js +2 -0
- package/dist/detectors/types.js.map +1 -0
- package/dist/detectors/unused-config-surface.d.ts +10 -0
- package/dist/detectors/unused-config-surface.d.ts.map +1 -0
- package/dist/detectors/unused-config-surface.js +199 -0
- package/dist/detectors/unused-config-surface.js.map +1 -0
- package/dist/evidence/graph-evidence.d.ts +15 -0
- package/dist/evidence/graph-evidence.d.ts.map +1 -0
- package/dist/evidence/graph-evidence.js +89 -0
- package/dist/evidence/graph-evidence.js.map +1 -0
- package/dist/evidence/load-graph-adapters.d.ts +13 -0
- package/dist/evidence/load-graph-adapters.d.ts.map +1 -0
- package/dist/evidence/load-graph-adapters.js +67 -0
- package/dist/evidence/load-graph-adapters.js.map +1 -0
- package/dist/identity.d.ts +7 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +7 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/apply-advisory-exit.d.ts +8 -0
- package/dist/lib/apply-advisory-exit.d.ts.map +1 -0
- package/dist/lib/apply-advisory-exit.js +16 -0
- package/dist/lib/apply-advisory-exit.js.map +1 -0
- package/dist/lib/isolate-exit-code.d.ts +8 -0
- package/dist/lib/isolate-exit-code.d.ts.map +1 -0
- package/dist/lib/isolate-exit-code.js +27 -0
- package/dist/lib/isolate-exit-code.js.map +1 -0
- package/dist/lib/resolve-positional-paths.d.ts +6 -0
- package/dist/lib/resolve-positional-paths.d.ts.map +1 -0
- package/dist/lib/resolve-positional-paths.js +33 -0
- package/dist/lib/resolve-positional-paths.js.map +1 -0
- package/dist/lib/walk-typescript-files.d.ts +2 -0
- package/dist/lib/walk-typescript-files.d.ts.map +1 -0
- package/dist/lib/walk-typescript-files.js +50 -0
- package/dist/lib/walk-typescript-files.js.map +1 -0
- package/dist/persistence/session-payload.d.ts +54 -0
- package/dist/persistence/session-payload.d.ts.map +1 -0
- package/dist/persistence/session-payload.js +48 -0
- package/dist/persistence/session-payload.js.map +1 -0
- package/dist/scoring/__tests__/confidence.test.d.ts +2 -0
- package/dist/scoring/__tests__/confidence.test.d.ts.map +1 -0
- package/dist/scoring/__tests__/confidence.test.js +123 -0
- package/dist/scoring/__tests__/confidence.test.js.map +1 -0
- package/dist/scoring/confidence.d.ts +12 -0
- package/dist/scoring/confidence.d.ts.map +1 -0
- package/dist/scoring/confidence.js +106 -0
- package/dist/scoring/confidence.js.map +1 -0
- package/dist/tool.d.ts +11 -0
- package/dist/tool.d.ts.map +1 -0
- package/dist/tool.js +38 -0
- package/dist/tool.js.map +1 -0
- package/dist/types/yagni-config.d.ts +18 -0
- package/dist/types/yagni-config.d.ts.map +1 -0
- package/dist/types/yagni-config.js +11 -0
- package/dist/types/yagni-config.js.map +1 -0
- package/dist/types/yagni-metadata.d.ts +51 -0
- package/dist/types/yagni-metadata.d.ts.map +1 -0
- package/dist/types/yagni-metadata.js +5 -0
- package/dist/types/yagni-metadata.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-graph-adapters.js","sourceRoot":"","sources":["../../src/evidence/load-graph-adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,oBAAoB,GAGrB,MAAM,mBAAmB,CAAC;AAE3B,0FAA0F;AAC1F,MAAM,sBAAsB,GAAG;IAC7B,+BAA+B;IAC/B,2BAA2B;IAC3B,yBAAyB;IACzB,uBAAuB;IACvB,yBAAyB;CACjB,CAAC;AAEX,SAAS,iBAAiB;IACxB,MAAM,KAAK,GAAG,YAAY,EAA8D,CAAC;IACzF,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAChE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,qCAAqC,CAC5C,UAAqD,EACrD,WAA2C;IAE3C,IAAI,WAAW,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAC3D,IAAI,UAAU,EAAE,SAAS,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC;IAChE,OAAO,EAAE,GAAG,WAAW,EAAE,QAAQ,EAAE,CAAC,GAAG,sBAAsB,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,UAAkB;IAChE,IAAI,iBAAiB,EAAE,GAAG,CAAC;QAAE,OAAO;IAEpC,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,KAAK,EAAE,YAAY,CAAC;IACrC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,eAAe,CAAC;QAAE,OAAO;IAClD,IAAI,QAAQ,CAAC,cAAc,CAAC,eAAe,EAAE,UAAU,CAAC;QAAE,OAAO;IAEjE,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,SAAS,CAAC;IAClE,MAAM,WAAW,GAAG,qCAAqC,CACvD,UAAU,EACV,UAAU,KAAK,SAAS;QACtB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,4BAA4B,CAAC,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,IAAI,EAAE,CAAC,CACnF,CAAC;IAEF,MAAM,oBAAoB,CAAC;QACzB,QAAQ;QACR,QAAQ,EAAE,eAAe;QACzB,UAAU;QACV,MAAM,EAAE,oBAAoB,EAAE;QAC9B,WAAW;KACZ,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc;;;CAGM,CAAC;AAElC,eAAO,MAAM,mBAAmB,SAAsB,CAAC;AACvD,eAAO,MAAM,gBAAgB,SAAsB,CAAC"}
|
package/dist/identity.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,CAAC,KAAK,CAAC;CACe,CAAC;AAElC,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @opensip-cli/yagni — YAGNI reduction audit tool.
|
|
3
|
+
*/
|
|
4
|
+
export { yagniTool, yagniTool as tool, YAGNI_CONTRACT_VERSION, YAGNI_STABLE_ID } from './tool.js';
|
|
5
|
+
export { executeYagni } from './cli/execute-yagni.js';
|
|
6
|
+
export type { YagniConfig, YagniGraphMode } from './types/yagni-config.js';
|
|
7
|
+
export type { YagniFindingMetadata } from './types/yagni-metadata.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,IAAI,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAClG,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC3E,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,IAAI,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAClG,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { YagniConfig } from '../types/yagni-config.js';
|
|
2
|
+
import type { ToolCliContext } from '@opensip-cli/core';
|
|
3
|
+
/**
|
|
4
|
+
* Re-affirm exit 0 for advisory yagni runs after delivery. Nested graph evidence
|
|
5
|
+
* may have called `setExitCode`; `deliverSignals` only overwrites on run failure.
|
|
6
|
+
*/
|
|
7
|
+
export declare function applyAdvisoryExitCode(cli: ToolCliContext, config: YagniConfig): void;
|
|
8
|
+
//# sourceMappingURL=apply-advisory-exit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-advisory-exit.d.ts","sourceRoot":"","sources":["../../src/lib/apply-advisory-exit.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CASpF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { EXIT_CODES } from '@opensip-cli/contracts';
|
|
2
|
+
/**
|
|
3
|
+
* Re-affirm exit 0 for advisory yagni runs after delivery. Nested graph evidence
|
|
4
|
+
* may have called `setExitCode`; `deliverSignals` only overwrites on run failure.
|
|
5
|
+
*/
|
|
6
|
+
export function applyAdvisoryExitCode(cli, config) {
|
|
7
|
+
const failOnErrors = config.failOnErrors ?? 0;
|
|
8
|
+
const failOnWarnings = config.failOnWarnings ?? 0;
|
|
9
|
+
if (failOnErrors > 0 || failOnWarnings > 0)
|
|
10
|
+
return;
|
|
11
|
+
const current = cli.getExitCode?.();
|
|
12
|
+
if (current === EXIT_CODES.REPORT_FAILED)
|
|
13
|
+
return;
|
|
14
|
+
cli.setExitCode(EXIT_CODES.SUCCESS);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=apply-advisory-exit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-advisory-exit.js","sourceRoot":"","sources":["../../src/lib/apply-advisory-exit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKpD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAmB,EAAE,MAAmB;IAC5E,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC;IAClD,IAAI,YAAY,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC;QAAE,OAAO;IAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;IACpC,IAAI,OAAO,KAAK,UAAU,CAAC,aAAa;QAAE,OAAO;IAEjD,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToolCliContext } from '@opensip-cli/core';
|
|
2
|
+
/**
|
|
3
|
+
* Run `fn` without letting a nested tool handler (e.g. `executeGraph`) leak its
|
|
4
|
+
* exit code into the yagni command. Graph builds evidence only — yagni owns the
|
|
5
|
+
* process exit (advisory `failOnErrors/Warnings: 0`).
|
|
6
|
+
*/
|
|
7
|
+
export declare function withPreservedExitCode<T>(cli: ToolCliContext, fn: () => Promise<T>): Promise<T>;
|
|
8
|
+
//# sourceMappingURL=isolate-exit-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolate-exit-code.d.ts","sourceRoot":"","sources":["../../src/lib/isolate-exit-code.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAC3C,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAgBZ"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { EXIT_CODES } from '@opensip-cli/contracts';
|
|
2
|
+
/**
|
|
3
|
+
* Run `fn` without letting a nested tool handler (e.g. `executeGraph`) leak its
|
|
4
|
+
* exit code into the yagni command. Graph builds evidence only — yagni owns the
|
|
5
|
+
* process exit (advisory `failOnErrors/Warnings: 0`).
|
|
6
|
+
*/
|
|
7
|
+
export async function withPreservedExitCode(cli, fn) {
|
|
8
|
+
const prior = cli.getExitCode?.();
|
|
9
|
+
try {
|
|
10
|
+
return await fn();
|
|
11
|
+
}
|
|
12
|
+
finally {
|
|
13
|
+
const after = cli.getExitCode?.();
|
|
14
|
+
if (after === prior) {
|
|
15
|
+
// no graph exit leak
|
|
16
|
+
}
|
|
17
|
+
else if (prior === undefined) {
|
|
18
|
+
if (after !== undefined) {
|
|
19
|
+
cli.setExitCode(EXIT_CODES.SUCCESS);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
cli.setExitCode(prior);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=isolate-exit-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolate-exit-code.js","sourceRoot":"","sources":["../../src/lib/isolate-exit-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIpD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAmB,EACnB,EAAoB;IAEpB,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QAClC,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACpB,qBAAqB;QACvB,CAAC;aAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve user-supplied positional paths for `opensip yagni`.
|
|
3
|
+
*/
|
|
4
|
+
/** Resolve positional directory paths against `cwd`. */
|
|
5
|
+
export declare function resolveYagniPositionalPaths(paths: readonly string[], cwd: string): readonly string[];
|
|
6
|
+
//# sourceMappingURL=resolve-positional-paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-positional-paths.d.ts","sourceRoot":"","sources":["../../src/lib/resolve-positional-paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wDAAwD;AACxD,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,GAAG,EAAE,MAAM,GACV,SAAS,MAAM,EAAE,CAyBnB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve user-supplied positional paths for `opensip yagni`.
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, statSync } from 'node:fs';
|
|
5
|
+
import { isAbsolute, resolve } from 'node:path';
|
|
6
|
+
import { ConfigurationError } from '@opensip-cli/core';
|
|
7
|
+
/** Resolve positional directory paths against `cwd`. */
|
|
8
|
+
export function resolveYagniPositionalPaths(paths, cwd) {
|
|
9
|
+
const out = [];
|
|
10
|
+
for (const p of paths) {
|
|
11
|
+
const trimmed = p.trim();
|
|
12
|
+
if (trimmed.length === 0) {
|
|
13
|
+
throw new ConfigurationError('Positional path is empty.');
|
|
14
|
+
}
|
|
15
|
+
const abs = isAbsolute(trimmed) ? trimmed : resolve(cwd, trimmed);
|
|
16
|
+
if (!existsSync(abs)) {
|
|
17
|
+
throw new ConfigurationError(`Path does not exist: '${p}' (resolved to ${abs}).`);
|
|
18
|
+
}
|
|
19
|
+
let isDir = false;
|
|
20
|
+
try {
|
|
21
|
+
isDir = statSync(abs).isDirectory();
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
throw new ConfigurationError(`Path is not readable: '${p}' (${abs}).`);
|
|
25
|
+
}
|
|
26
|
+
if (!isDir) {
|
|
27
|
+
throw new ConfigurationError(`Path is not a directory: '${p}'. yagni accepts directories only.`);
|
|
28
|
+
}
|
|
29
|
+
out.push(abs);
|
|
30
|
+
}
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=resolve-positional-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-positional-paths.js","sourceRoot":"","sources":["../../src/lib/resolve-positional-paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,wDAAwD;AACxD,MAAM,UAAU,2BAA2B,CACzC,KAAwB,EACxB,GAAW;IAEX,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,kBAAkB,CAAC,2BAA2B,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,kBAAkB,CAAC,yBAAyB,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC;YACH,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,kBAAkB,CAAC,0BAA0B,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,kBAAkB,CAC1B,6BAA6B,CAAC,oCAAoC,CACnE,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk-typescript-files.d.ts","sourceRoot":"","sources":["../../src/lib/walk-typescript-files.ts"],"names":[],"mappings":"AAgBA,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,OAAO,EACrB,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GACxB,MAAM,EAAE,CAyBV"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { readdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
const SKIP_DIRS = new Set([
|
|
4
|
+
'node_modules',
|
|
5
|
+
'dist',
|
|
6
|
+
'build',
|
|
7
|
+
'.git',
|
|
8
|
+
'coverage',
|
|
9
|
+
'.turbo',
|
|
10
|
+
'.opensip-cli',
|
|
11
|
+
]);
|
|
12
|
+
const TS_EXT = /\.(ts|tsx|mts|cts)$/;
|
|
13
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity -- iterative directory walk with test-path and skip-dir guards
|
|
14
|
+
export function walkTypeScriptFiles(root, includeTests, roots) {
|
|
15
|
+
const out = [];
|
|
16
|
+
const stack = roots !== undefined && roots.length > 0 ? [...roots] : [root];
|
|
17
|
+
while (stack.length > 0) {
|
|
18
|
+
const dir = stack.pop();
|
|
19
|
+
if (dir === undefined)
|
|
20
|
+
continue;
|
|
21
|
+
let entries;
|
|
22
|
+
try {
|
|
23
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
for (const entry of entries) {
|
|
29
|
+
const full = join(dir, entry.name);
|
|
30
|
+
if (entry.isDirectory()) {
|
|
31
|
+
if (SKIP_DIRS.has(entry.name))
|
|
32
|
+
continue;
|
|
33
|
+
stack.push(full);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (!entry.isFile() || !TS_EXT.test(entry.name))
|
|
37
|
+
continue;
|
|
38
|
+
if (!includeTests && isTestPath(full))
|
|
39
|
+
continue;
|
|
40
|
+
out.push(full);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return out.sort();
|
|
44
|
+
}
|
|
45
|
+
function isTestPath(filePath) {
|
|
46
|
+
return (/[/\\]__tests__[/\\]/.test(filePath) ||
|
|
47
|
+
/\.test\.(ts|tsx|mts|cts)$/.test(filePath) ||
|
|
48
|
+
/\.spec\.(ts|tsx|mts|cts)$/.test(filePath));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=walk-typescript-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk-typescript-files.js","sourceRoot":"","sources":["../../src/lib/walk-typescript-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,cAAc;IACd,MAAM;IACN,OAAO;IACP,MAAM;IACN,UAAU;IACV,QAAQ;IACR,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,qBAAqB,CAAC;AAErC,uHAAuH;AACvH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,YAAqB,EACrB,KAAyB;IAEzB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5E,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QACxB,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS;QAChC,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,SAAS;gBACxC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC1D,IAAI,CAAC,YAAY,IAAI,UAAU,CAAC,IAAI,CAAC;gBAAE,SAAS;YAChD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB;IAClC,OAAO,CACL,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACpC,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC1C,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { SkippedDetector } from '../detectors/types.js';
|
|
2
|
+
import type { YagniGraphMode } from '../types/yagni-config.js';
|
|
3
|
+
import type { YagniRunSummary } from '../types/yagni-metadata.js';
|
|
4
|
+
import type { SignalEnvelope } from '@opensip-cli/contracts';
|
|
5
|
+
export interface YagniSessionFinding {
|
|
6
|
+
readonly ruleId: string;
|
|
7
|
+
readonly message: string;
|
|
8
|
+
readonly severity: 'error' | 'warning';
|
|
9
|
+
readonly filePath?: string;
|
|
10
|
+
readonly line?: number;
|
|
11
|
+
readonly column?: number;
|
|
12
|
+
readonly suggestion?: string;
|
|
13
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* One persisted YAGNI detector result.
|
|
17
|
+
*
|
|
18
|
+
* Conforms to the host dashboard's shared cross-tool session-detail contract:
|
|
19
|
+
* per-item detail is rendered from `payload.checks[]` keyed by `checkSlug`
|
|
20
|
+
* (fitness "checks", graph "rules", and yagni "detectors" all persist under the
|
|
21
|
+
* same generic keys; the dashboard relabels the column per tool at display
|
|
22
|
+
* time). For YAGNI, one "check" IS one detector — `checkSlug` holds the
|
|
23
|
+
* detector slug.
|
|
24
|
+
*/
|
|
25
|
+
export interface YagniSessionCheck {
|
|
26
|
+
readonly checkSlug: string;
|
|
27
|
+
readonly passed: boolean;
|
|
28
|
+
readonly violationCount: number;
|
|
29
|
+
readonly findings: readonly YagniSessionFinding[];
|
|
30
|
+
readonly durationMs: number;
|
|
31
|
+
}
|
|
32
|
+
export interface YagniSessionPayload {
|
|
33
|
+
readonly __version: 1;
|
|
34
|
+
readonly summary: {
|
|
35
|
+
readonly total: number;
|
|
36
|
+
readonly passed: number;
|
|
37
|
+
readonly failed: number;
|
|
38
|
+
readonly errors: number;
|
|
39
|
+
readonly warnings: number;
|
|
40
|
+
readonly skippedDetectors: readonly SkippedDetector[];
|
|
41
|
+
readonly graphMode?: YagniGraphMode;
|
|
42
|
+
readonly graphBuilt?: boolean;
|
|
43
|
+
readonly graphDetail?: string;
|
|
44
|
+
readonly yagni: YagniRunSummary;
|
|
45
|
+
};
|
|
46
|
+
readonly checks: readonly YagniSessionCheck[];
|
|
47
|
+
}
|
|
48
|
+
export declare function buildYagniSessionPayload(envelope: SignalEnvelope, skippedDetectors: readonly SkippedDetector[], graph: {
|
|
49
|
+
readonly graphMode: YagniGraphMode;
|
|
50
|
+
readonly graphBuilt: boolean;
|
|
51
|
+
readonly graphDetail?: string;
|
|
52
|
+
readonly yagniSummary: YagniRunSummary;
|
|
53
|
+
}): YagniSessionPayload;
|
|
54
|
+
//# sourceMappingURL=session-payload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-payload.d.ts","sourceRoot":"","sources":["../../src/persistence/session-payload.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,gBAAgB,EAAE,SAAS,eAAe,EAAE,CAAC;QACtD,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;QACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;KACjC,CAAC;IAGF,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC/C;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,cAAc,EACxB,gBAAgB,EAAE,SAAS,eAAe,EAAE,EAC5C,KAAK,EAAE;IACL,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;CACxC,GACA,mBAAmB,CA6CrB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { isErrorSignal } from '@opensip-cli/core';
|
|
2
|
+
export function buildYagniSessionPayload(envelope, skippedDetectors, graph) {
|
|
3
|
+
const bySource = new Map();
|
|
4
|
+
for (const signal of envelope.signals) {
|
|
5
|
+
const bucket = bySource.get(signal.source);
|
|
6
|
+
if (bucket)
|
|
7
|
+
bucket.push(signal);
|
|
8
|
+
else
|
|
9
|
+
bySource.set(signal.source, [signal]);
|
|
10
|
+
}
|
|
11
|
+
const checks = envelope.units.map((unit) => {
|
|
12
|
+
const findings = (bySource.get(unit.slug) ?? []).map((signal) => ({
|
|
13
|
+
ruleId: signal.ruleId,
|
|
14
|
+
message: signal.message,
|
|
15
|
+
severity: isErrorSignal(signal) ? 'error' : 'warning',
|
|
16
|
+
...(signal.filePath === '' ? {} : { filePath: signal.filePath }),
|
|
17
|
+
...(signal.line === undefined ? {} : { line: signal.line }),
|
|
18
|
+
...(signal.column === undefined ? {} : { column: signal.column }),
|
|
19
|
+
...(signal.suggestion === undefined ? {} : { suggestion: signal.suggestion }),
|
|
20
|
+
metadata: signal.metadata,
|
|
21
|
+
}));
|
|
22
|
+
return {
|
|
23
|
+
checkSlug: unit.slug,
|
|
24
|
+
passed: unit.passed,
|
|
25
|
+
violationCount: unit.violationCount ?? findings.length,
|
|
26
|
+
findings,
|
|
27
|
+
durationMs: unit.durationMs,
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
const { summary } = envelope.verdict;
|
|
31
|
+
return {
|
|
32
|
+
__version: 1,
|
|
33
|
+
summary: {
|
|
34
|
+
total: summary.total,
|
|
35
|
+
passed: summary.passed,
|
|
36
|
+
failed: summary.failed,
|
|
37
|
+
errors: summary.errors,
|
|
38
|
+
warnings: summary.warnings,
|
|
39
|
+
skippedDetectors,
|
|
40
|
+
graphMode: graph.graphMode,
|
|
41
|
+
graphBuilt: graph.graphBuilt,
|
|
42
|
+
...(graph.graphDetail === undefined ? {} : { graphDetail: graph.graphDetail }),
|
|
43
|
+
yagni: graph.yagniSummary,
|
|
44
|
+
},
|
|
45
|
+
checks,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=session-payload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-payload.js","sourceRoot":"","sources":["../../src/persistence/session-payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAwDlD,MAAM,UAAU,wBAAwB,CACtC,QAAwB,EACxB,gBAA4C,EAC5C,KAKC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;YAC3B,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACzC,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAChE,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,OAAiB,CAAC,CAAC,CAAE,SAAmB;YAC3E,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChE,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;YAC3D,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;YACjE,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;YAC7E,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC,CAAC;QACJ,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,IAAI;YACpB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,QAAQ,CAAC,MAAM;YACtD,QAAQ;YACR,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC;IACrC,OAAO;QACL,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE;YACP,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,gBAAgB;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;YAC9E,KAAK,EAAE,KAAK,CAAC,YAAY;SAC1B;QACD,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence.test.d.ts","sourceRoot":"","sources":["../../../src/scoring/__tests__/confidence.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { createYagniSignal } from '../../detectors/create-yagni-signal.js';
|
|
3
|
+
import { buildYagniRunSummary, filterByMinConfidence, filterByReductionCategories, readYagniMetadata, severityForConfidence, sortYagniSignals, } from '../confidence.js';
|
|
4
|
+
function mk(opts = {}) {
|
|
5
|
+
const { id = 'd', confidence = 'medium', net = 0, kind = 'exact', detector = id, category = 'config', file = `/r/${id}.ts`, line = 1, column = 1, withLocDelta = true, } = opts;
|
|
6
|
+
return createYagniSignal({
|
|
7
|
+
source: `yagni:${id}`,
|
|
8
|
+
ruleId: `yagni:${id}`,
|
|
9
|
+
severity: severityForConfidence(confidence),
|
|
10
|
+
category: 'quality',
|
|
11
|
+
message: id,
|
|
12
|
+
suggestion: `fix ${id}`,
|
|
13
|
+
code: { file, line, column },
|
|
14
|
+
yagni: {
|
|
15
|
+
detector,
|
|
16
|
+
reductionCategory: category,
|
|
17
|
+
confidence,
|
|
18
|
+
...(withLocDelta
|
|
19
|
+
? { locDelta: { remove: net, add: 0, netEstimate: net, estimateKind: kind } }
|
|
20
|
+
: {}),
|
|
21
|
+
preservationArgument: 'x',
|
|
22
|
+
suggestedAction: 'x',
|
|
23
|
+
validationRequired: [],
|
|
24
|
+
riskTags: [],
|
|
25
|
+
evidence: [],
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/** A signal carrying no yagni metadata — `readYagniMetadata` returns undefined. */
|
|
30
|
+
function noMeta(file, line, column) {
|
|
31
|
+
return { ...mk({ file }), line, column, metadata: {} };
|
|
32
|
+
}
|
|
33
|
+
const detectors = (signals) => signals.map((s) => readYagniMetadata(s)?.detector ?? '∅');
|
|
34
|
+
describe('readYagniMetadata', () => {
|
|
35
|
+
it('returns undefined when metadata.yagni is absent or non-object', () => {
|
|
36
|
+
expect(readYagniMetadata(noMeta('/a.ts'))).toBeUndefined();
|
|
37
|
+
expect(readYagniMetadata({ ...mk(), metadata: { yagni: null } })).toBeUndefined();
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe('sortYagniSignals tie-breaker chain', () => {
|
|
41
|
+
it('orders by confidence DESC first', () => {
|
|
42
|
+
const out = sortYagniSignals([
|
|
43
|
+
mk({ id: 'lo', confidence: 'low' }),
|
|
44
|
+
mk({ id: 'hi', confidence: 'high' }),
|
|
45
|
+
mk({ id: 'me', confidence: 'medium' }),
|
|
46
|
+
]);
|
|
47
|
+
expect(detectors(out)).toEqual(['hi', 'me', 'lo']);
|
|
48
|
+
});
|
|
49
|
+
it('breaks a confidence tie by estimateKind DESC', () => {
|
|
50
|
+
const out = sortYagniSignals([
|
|
51
|
+
mk({ id: 'heur', kind: 'heuristic' }),
|
|
52
|
+
mk({ id: 'exact', kind: 'exact' }),
|
|
53
|
+
]);
|
|
54
|
+
expect(detectors(out)).toEqual(['exact', 'heur']);
|
|
55
|
+
});
|
|
56
|
+
it('breaks a confidence+kind tie by netEstimate DESC', () => {
|
|
57
|
+
const out = sortYagniSignals([mk({ id: 'small', net: 5 }), mk({ id: 'big', net: 20 })]);
|
|
58
|
+
expect(detectors(out)).toEqual(['big', 'small']);
|
|
59
|
+
});
|
|
60
|
+
it('breaks a confidence+kind+net tie by detector name ASC', () => {
|
|
61
|
+
const out = sortYagniSignals([
|
|
62
|
+
mk({ id: 'z', detector: 'zeta', net: 7 }),
|
|
63
|
+
mk({ id: 'a', detector: 'alpha', net: 7 }),
|
|
64
|
+
]);
|
|
65
|
+
expect(detectors(out)).toEqual(['alpha', 'zeta']);
|
|
66
|
+
});
|
|
67
|
+
it('breaks a full tie by location, tolerating absent line/column', () => {
|
|
68
|
+
// Two no-metadata signals tie on every keyed field, falling through to
|
|
69
|
+
// locationKey — which must coalesce undefined line/column to 0.
|
|
70
|
+
// noMeta() leaves line/column undefined, exercising locationKey's `?? 0`.
|
|
71
|
+
const out = sortYagniSignals([noMeta('/b.ts'), noMeta('/a.ts')]);
|
|
72
|
+
expect(out[0].filePath).toBe('/a.ts');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('filterByMinConfidence', () => {
|
|
76
|
+
it('keeps at/above floor, drops below, and passes through no-metadata signals', () => {
|
|
77
|
+
const kept = filterByMinConfidence([mk({ id: 'lo', confidence: 'low' }), mk({ id: 'hi', confidence: 'high' }), noMeta('/n.ts')], 'medium');
|
|
78
|
+
expect(detectors(kept).sort()).toEqual(['hi', '∅']);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('filterByReductionCategories', () => {
|
|
82
|
+
it('returns all when no categories are given', () => {
|
|
83
|
+
const all = [mk({ id: 'a' }), mk({ id: 'b' })];
|
|
84
|
+
expect(filterByReductionCategories(all, [])).toHaveLength(2);
|
|
85
|
+
});
|
|
86
|
+
it('filters by category and passes through no-metadata signals', () => {
|
|
87
|
+
const out = filterByReductionCategories([
|
|
88
|
+
mk({ id: 'cfg', category: 'config' }),
|
|
89
|
+
mk({ id: 'dead', category: 'dead-code' }),
|
|
90
|
+
noMeta('/n.ts'),
|
|
91
|
+
], ['config']);
|
|
92
|
+
expect(detectors(out).sort()).toEqual(['cfg', '∅']);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe('buildYagniRunSummary', () => {
|
|
96
|
+
it('tallies confidence buckets + LOC, skips no-metadata, and maps skipped detectors', () => {
|
|
97
|
+
const summary = buildYagniRunSummary([
|
|
98
|
+
mk({ id: 'h', confidence: 'high', net: 10 }),
|
|
99
|
+
mk({ id: 'm', confidence: 'medium', net: 5 }),
|
|
100
|
+
mk({ id: 'l', confidence: 'low', withLocDelta: false }),
|
|
101
|
+
noMeta('/n.ts'),
|
|
102
|
+
], 'build', [
|
|
103
|
+
{ id: 'wd', slug: 'with-detail', reason: 'graph-unavailable', detail: 'go' },
|
|
104
|
+
{ id: 'nd', slug: 'no-detail', reason: 'disabled' },
|
|
105
|
+
]);
|
|
106
|
+
expect(summary.byConfidence).toEqual({ high: 1, medium: 1, low: 1 });
|
|
107
|
+
expect(summary.estimatedTotalLocReduction).toBe(15);
|
|
108
|
+
expect(summary.totalCandidates).toBe(4);
|
|
109
|
+
expect(summary.graphMode).toBe('build');
|
|
110
|
+
expect(summary.skippedDetectors).toEqual([
|
|
111
|
+
{ slug: 'with-detail', reason: 'graph-unavailable', detail: 'go' },
|
|
112
|
+
{ slug: 'no-detail', reason: 'disabled' },
|
|
113
|
+
]);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe('severityForConfidence', () => {
|
|
117
|
+
it('maps high → medium and everything else → low', () => {
|
|
118
|
+
expect(severityForConfidence('high')).toBe('medium');
|
|
119
|
+
expect(severityForConfidence('medium')).toBe('low');
|
|
120
|
+
expect(severityForConfidence('low')).toBe('low');
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=confidence.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence.test.js","sourceRoot":"","sources":["../../../src/scoring/__tests__/confidence.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SkippedDetector } from '../detectors/types.js';
|
|
2
|
+
import type { YagniConfidence, YagniFindingMetadata, YagniRunSummary } from '../types/yagni-metadata.js';
|
|
3
|
+
import type { Signal } from '@opensip-cli/core';
|
|
4
|
+
export declare function readYagniMetadata(signal: Signal): YagniFindingMetadata | undefined;
|
|
5
|
+
/** Keep findings at or above the configured minimum confidence level. */
|
|
6
|
+
export declare function filterByMinConfidence(signals: readonly Signal[], minConfidence: YagniConfidence): Signal[];
|
|
7
|
+
export declare function filterByReductionCategories(signals: readonly Signal[], categories: readonly string[]): Signal[];
|
|
8
|
+
/** Stable sort: confidence DESC → estimateKind → netEstimate DESC → detector → location. */
|
|
9
|
+
export declare function sortYagniSignals(signals: readonly Signal[]): Signal[];
|
|
10
|
+
export declare function buildYagniRunSummary(signals: readonly Signal[], graphMode: string, skippedDetectors: readonly SkippedDetector[]): YagniRunSummary;
|
|
11
|
+
export declare function severityForConfidence(confidence: YagniConfidence): 'low' | 'medium';
|
|
12
|
+
//# sourceMappingURL=confidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence.d.ts","sourceRoot":"","sources":["../../src/scoring/confidence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,eAAe,EAEf,oBAAoB,EACpB,eAAe,EAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAoBhD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAIlF;AAED,yEAAyE;AACzE,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,aAAa,EAAE,eAAe,GAC7B,MAAM,EAAE,CAOV;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,MAAM,EAAE,CAQV;AAQD,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAsBrE;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,SAAS,eAAe,EAAE,GAC3C,eAAe,CA4BjB;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,eAAe,GAAG,KAAK,GAAG,QAAQ,CAEnF"}
|