@opensip-cli/yagni 0.1.14 → 0.1.16
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/README.md +2 -2
- package/dist/__tests__/detector-progress.test.js +21 -0
- package/dist/__tests__/detector-progress.test.js.map +1 -1
- package/dist/cli/__tests__/yagni-command-spec.test.d.ts +2 -0
- package/dist/cli/__tests__/yagni-command-spec.test.d.ts.map +1 -0
- package/dist/cli/__tests__/yagni-command-spec.test.js +128 -0
- package/dist/cli/__tests__/yagni-command-spec.test.js.map +1 -0
- package/dist/cli/__tests__/yagni-gate-mode.test.d.ts +7 -0
- package/dist/cli/__tests__/yagni-gate-mode.test.d.ts.map +1 -0
- package/dist/cli/__tests__/yagni-gate-mode.test.js +155 -0
- package/dist/cli/__tests__/yagni-gate-mode.test.js.map +1 -0
- package/dist/cli/__tests__/yagni-runner.test.js +77 -4
- package/dist/cli/__tests__/yagni-runner.test.js.map +1 -1
- package/dist/cli/__tests__/yagni-worker.test.d.ts +2 -0
- package/dist/cli/__tests__/yagni-worker.test.d.ts.map +1 -0
- package/dist/cli/__tests__/yagni-worker.test.js +150 -0
- package/dist/cli/__tests__/yagni-worker.test.js.map +1 -0
- package/dist/cli/yagni-command-spec.d.ts.map +1 -1
- package/dist/cli/yagni-command-spec.js +23 -1
- package/dist/cli/yagni-command-spec.js.map +1 -1
- package/dist/cli/yagni-gate-mode.d.ts +23 -0
- package/dist/cli/yagni-gate-mode.d.ts.map +1 -0
- package/dist/cli/yagni-gate-mode.js +90 -0
- package/dist/cli/yagni-gate-mode.js.map +1 -0
- package/dist/cli/yagni-progress.d.ts +9 -0
- package/dist/cli/yagni-progress.d.ts.map +1 -0
- package/dist/cli/yagni-progress.js +23 -0
- package/dist/cli/yagni-progress.js.map +1 -0
- package/dist/cli/yagni-runner.d.ts.map +1 -1
- package/dist/cli/yagni-runner.js +46 -38
- package/dist/cli/yagni-runner.js.map +1 -1
- package/dist/cli/yagni-worker.d.ts +11 -0
- package/dist/cli/yagni-worker.d.ts.map +1 -0
- package/dist/cli/yagni-worker.js +67 -0
- package/dist/cli/yagni-worker.js.map +1 -0
- package/dist/tool.d.ts.map +1 -1
- package/dist/tool.js +2 -1
- package/dist/tool.js.map +1 -1
- package/package.json +24 -9
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import { executeYagniWorker, yagniRunWorkerCommandSpec } from '../yagni-worker.js';
|
|
6
|
+
const executeYagniMock = vi.hoisted(() => vi.fn());
|
|
7
|
+
const loadYagniConfigMock = vi.hoisted(() => vi.fn(() => ({
|
|
8
|
+
defaultMinConfidence: 'low',
|
|
9
|
+
disabledDetectors: [],
|
|
10
|
+
})));
|
|
11
|
+
const sendWorkerIpcMessageMock = vi.hoisted(() => vi.fn());
|
|
12
|
+
const stopHeartbeatMock = vi.hoisted(() => vi.fn());
|
|
13
|
+
const startWorkerHeartbeatMock = vi.hoisted(() => vi.fn(() => stopHeartbeatMock));
|
|
14
|
+
vi.mock('@opensip-cli/core', async (importOriginal) => {
|
|
15
|
+
const actual = await importOriginal();
|
|
16
|
+
return {
|
|
17
|
+
...actual,
|
|
18
|
+
sendWorkerIpcMessage: sendWorkerIpcMessageMock,
|
|
19
|
+
startWorkerHeartbeat: startWorkerHeartbeatMock,
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
vi.mock('../execute-yagni.js', () => ({
|
|
23
|
+
executeYagni: executeYagniMock,
|
|
24
|
+
}));
|
|
25
|
+
vi.mock('../yagni-config.js', () => ({
|
|
26
|
+
loadYagniConfig: loadYagniConfigMock,
|
|
27
|
+
}));
|
|
28
|
+
function stubCli() {
|
|
29
|
+
return {
|
|
30
|
+
deliverSignals: vi.fn(() => Promise.resolve({ delivered: false })),
|
|
31
|
+
reportFailure: vi.fn(() => Promise.resolve()),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function writeSpec(value) {
|
|
35
|
+
const dir = mkdtempSync(join(tmpdir(), 'yagni-worker-test-'));
|
|
36
|
+
const path = join(dir, 'spec.json');
|
|
37
|
+
writeFileSync(path, JSON.stringify(value), 'utf8');
|
|
38
|
+
return { dir, path };
|
|
39
|
+
}
|
|
40
|
+
beforeEach(() => {
|
|
41
|
+
vi.clearAllMocks();
|
|
42
|
+
});
|
|
43
|
+
describe('yagni worker command', () => {
|
|
44
|
+
it('streams detector progress and the final result from a JSON spec', async () => {
|
|
45
|
+
const { dir, path } = writeSpec({
|
|
46
|
+
cwd: '/repo',
|
|
47
|
+
minConfidence: 'high',
|
|
48
|
+
detectors: ['yagni:unused-config-surface'],
|
|
49
|
+
categories: ['configuration'],
|
|
50
|
+
includeTests: true,
|
|
51
|
+
pathRoots: ['src'],
|
|
52
|
+
});
|
|
53
|
+
const cli = stubCli();
|
|
54
|
+
const result = {
|
|
55
|
+
envelope: { tool: 'yagni', runId: 'run-1' },
|
|
56
|
+
session: { tool: 'yagni', cwd: '/repo' },
|
|
57
|
+
};
|
|
58
|
+
executeYagniMock.mockImplementation((options) => {
|
|
59
|
+
options.onDetectorStart?.('yagni:unused-config-surface');
|
|
60
|
+
options.onDetectorDone?.('yagni:unused-config-surface', 42);
|
|
61
|
+
options.onDetectorsSkipped?.(['yagni:disabled-stub']);
|
|
62
|
+
return result;
|
|
63
|
+
});
|
|
64
|
+
try {
|
|
65
|
+
await yagniRunWorkerCommandSpec.handler?.({ _args: [path] }, cli);
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
rmSync(dir, { recursive: true, force: true });
|
|
69
|
+
}
|
|
70
|
+
expect(startWorkerHeartbeatMock).toHaveBeenCalledTimes(1);
|
|
71
|
+
expect(stopHeartbeatMock).toHaveBeenCalledTimes(1);
|
|
72
|
+
expect(loadYagniConfigMock).toHaveBeenCalledWith('/repo');
|
|
73
|
+
expect(executeYagniMock).toHaveBeenCalledWith(expect.objectContaining({
|
|
74
|
+
cwd: '/repo',
|
|
75
|
+
config: { defaultMinConfidence: 'low', disabledDetectors: [] },
|
|
76
|
+
minConfidence: 'high',
|
|
77
|
+
detectors: ['yagni:unused-config-surface'],
|
|
78
|
+
categories: ['configuration'],
|
|
79
|
+
includeTests: true,
|
|
80
|
+
pathRoots: ['src'],
|
|
81
|
+
}), cli);
|
|
82
|
+
expect(sendWorkerIpcMessageMock).toHaveBeenNthCalledWith(1, {
|
|
83
|
+
kind: 'progress',
|
|
84
|
+
event: {
|
|
85
|
+
type: 'stage-start',
|
|
86
|
+
stage: 'yagni:unused-config-surface',
|
|
87
|
+
label: 'Unused Config Surface',
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
expect(sendWorkerIpcMessageMock).toHaveBeenNthCalledWith(2, {
|
|
91
|
+
kind: 'progress',
|
|
92
|
+
event: { type: 'stage-done', stage: 'yagni:unused-config-surface', durationMs: 42 },
|
|
93
|
+
});
|
|
94
|
+
expect(sendWorkerIpcMessageMock).toHaveBeenNthCalledWith(3, {
|
|
95
|
+
kind: 'progress',
|
|
96
|
+
event: {
|
|
97
|
+
type: 'stage-done',
|
|
98
|
+
stage: 'yagni:disabled-stub',
|
|
99
|
+
durationMs: 0,
|
|
100
|
+
detail: 'skipped',
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
expect(sendWorkerIpcMessageMock).toHaveBeenNthCalledWith(4, {
|
|
104
|
+
kind: 'result',
|
|
105
|
+
value: result,
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
it('sends structured worker errors and stops the heartbeat when execution fails', async () => {
|
|
109
|
+
const { dir, path } = writeSpec({ cwd: '/repo' });
|
|
110
|
+
const error = Object.assign(new Error('detector failed'), {
|
|
111
|
+
failureClass: 'configuration',
|
|
112
|
+
});
|
|
113
|
+
executeYagniMock.mockRejectedValue(error);
|
|
114
|
+
try {
|
|
115
|
+
await executeYagniWorker(path, stubCli());
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
rmSync(dir, { recursive: true, force: true });
|
|
119
|
+
}
|
|
120
|
+
expect(sendWorkerIpcMessageMock).toHaveBeenCalledWith({
|
|
121
|
+
kind: 'error',
|
|
122
|
+
message: 'detector failed',
|
|
123
|
+
stack: expect.stringContaining('detector failed'),
|
|
124
|
+
failureClass: 'configuration',
|
|
125
|
+
});
|
|
126
|
+
expect(stopHeartbeatMock).toHaveBeenCalledTimes(1);
|
|
127
|
+
});
|
|
128
|
+
it('normalizes non-Error worker failures', async () => {
|
|
129
|
+
const { dir, path } = writeSpec({ cwd: '/repo' });
|
|
130
|
+
executeYagniMock.mockRejectedValue('plain failure');
|
|
131
|
+
try {
|
|
132
|
+
await executeYagniWorker(path, stubCli());
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
rmSync(dir, { recursive: true, force: true });
|
|
136
|
+
}
|
|
137
|
+
expect(sendWorkerIpcMessageMock).toHaveBeenCalledWith({
|
|
138
|
+
kind: 'error',
|
|
139
|
+
message: 'plain failure',
|
|
140
|
+
});
|
|
141
|
+
expect(stopHeartbeatMock).toHaveBeenCalledTimes(1);
|
|
142
|
+
});
|
|
143
|
+
it('surfaces a worker error when the internal handler has no spec path', async () => {
|
|
144
|
+
await yagniRunWorkerCommandSpec.handler?.({}, stubCli());
|
|
145
|
+
expect(sendWorkerIpcMessageMock).toHaveBeenCalledWith(expect.objectContaining({ kind: 'error' }));
|
|
146
|
+
expect(executeYagniMock).not.toHaveBeenCalled();
|
|
147
|
+
expect(stopHeartbeatMock).toHaveBeenCalledTimes(1);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
//# sourceMappingURL=yagni-worker.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yagni-worker.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/yagni-worker.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yagni-command-spec.d.ts","sourceRoot":"","sources":["../../src/cli/yagni-command-spec.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"yagni-command-spec.d.ts","sourceRoot":"","sources":["../../src/cli/yagni-command-spec.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,mBAAmB,CAAC;AAyI3E,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,gFA6DjF"}
|
|
@@ -7,6 +7,7 @@ import { applyAdvisoryExitCode } from '../lib/apply-advisory-exit.js';
|
|
|
7
7
|
import { resolveYagniPositionalPaths } from '../lib/resolve-positional-paths.js';
|
|
8
8
|
import { executeYagni } from './execute-yagni.js';
|
|
9
9
|
import { loadYagniConfig } from './yagni-config.js';
|
|
10
|
+
import { runYagniGateMode } from './yagni-gate-mode.js';
|
|
10
11
|
import { buildYagniRunPresentation } from './yagni-presentation.js';
|
|
11
12
|
function parseMinConfidence(raw) {
|
|
12
13
|
if (raw === 'low' || raw === 'medium' || raw === 'high')
|
|
@@ -45,6 +46,9 @@ async function deliverYagniRun(opts, cli, config, outcome) {
|
|
|
45
46
|
}
|
|
46
47
|
async function runYagniCommand(rawOpts, cli, setUpLiveView) {
|
|
47
48
|
const opts = rawOpts;
|
|
49
|
+
if (opts.gateSave === true || opts.gateCompare === true) {
|
|
50
|
+
return (await runYagniGateMode(opts, cli)) ?? {};
|
|
51
|
+
}
|
|
48
52
|
const config = loadYagniConfig(opts.cwd);
|
|
49
53
|
const positionals = opts._args ?? [];
|
|
50
54
|
const paths = (positionals[0] ?? []);
|
|
@@ -87,13 +91,31 @@ async function runYagniCommand(rawOpts, cli, setUpLiveView) {
|
|
|
87
91
|
await cli.render(presentation);
|
|
88
92
|
}
|
|
89
93
|
await deliverYagniRun(opts, cli, config, outcome);
|
|
94
|
+
if (opts.sarif !== undefined && opts.sarif !== '') {
|
|
95
|
+
await cli.writeSarif(outcome.envelope, opts.sarif);
|
|
96
|
+
}
|
|
90
97
|
return { session: outcome.session };
|
|
91
98
|
}
|
|
92
99
|
export function buildYagniCommandSpec(setUpLiveView) {
|
|
93
100
|
return definePrimaryCommand({
|
|
94
|
-
description: 'Run YAGNI reduction audit detectors
|
|
101
|
+
description: 'Run YAGNI reduction audit detectors',
|
|
95
102
|
commonFlags: ['cwd', 'json', 'quiet', 'verbose', 'debug', 'reportTo', 'apiKey', 'open'],
|
|
96
103
|
options: [
|
|
104
|
+
{
|
|
105
|
+
flag: '--gate-save',
|
|
106
|
+
description: 'Architecture-gate: save current findings as baseline in the project SQLite store (mutually exclusive with --gate-compare)',
|
|
107
|
+
default: false,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
flag: '--gate-compare',
|
|
111
|
+
description: 'Architecture-gate: compare current findings against the saved baseline; exit 1 on regression',
|
|
112
|
+
default: false,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
flag: '--sarif',
|
|
116
|
+
value: '<path>',
|
|
117
|
+
description: 'Write this run findings as SARIF 2.1.0 (composes with --gate-save)',
|
|
118
|
+
},
|
|
97
119
|
{
|
|
98
120
|
flag: '--min-confidence',
|
|
99
121
|
value: '<level>',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yagni-command-spec.js","sourceRoot":"","sources":["../../src/cli/yagni-command-spec.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"yagni-command-spec.js","sourceRoot":"","sources":["../../src/cli/yagni-command-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gate mode for `opensip yagni` (`--gate-save` / `--gate-compare`).
|
|
3
|
+
*
|
|
4
|
+
* Host-owned baseline persistence and exit (ADR-0036 / ADR-0035): yagni hands
|
|
5
|
+
* the fingerprint-stamped envelope to the baseline seams and feeds the findings
|
|
6
|
+
* verdict to `deliverSignals` runFailed — no tool-side `setExitCode`.
|
|
7
|
+
*/
|
|
8
|
+
import { type ToolCliContext, type ToolRunCompletion } from '@opensip-cli/core';
|
|
9
|
+
export interface YagniGateCommandOptions {
|
|
10
|
+
readonly cwd: string;
|
|
11
|
+
readonly json?: boolean;
|
|
12
|
+
readonly reportTo?: string;
|
|
13
|
+
readonly apiKey?: string;
|
|
14
|
+
readonly gateSave?: boolean;
|
|
15
|
+
readonly gateCompare?: boolean;
|
|
16
|
+
readonly sarif?: string;
|
|
17
|
+
readonly minConfidence?: string;
|
|
18
|
+
readonly detector?: string | string[];
|
|
19
|
+
readonly category?: string | string[];
|
|
20
|
+
readonly includeTests?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function runYagniGateMode(opts: YagniGateCommandOptions, cli: ToolCliContext): Promise<ToolRunCompletion | undefined>;
|
|
23
|
+
//# sourceMappingURL=yagni-gate-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yagni-gate-mode.d.ts","sourceRoot":"","sources":["../../src/cli/yagni-gate-mode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AA6CD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,uBAAuB,EAC7B,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAqDxC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gate mode for `opensip yagni` (`--gate-save` / `--gate-compare`).
|
|
3
|
+
*
|
|
4
|
+
* Host-owned baseline persistence and exit (ADR-0036 / ADR-0035): yagni hands
|
|
5
|
+
* the fingerprint-stamped envelope to the baseline seams and feeds the findings
|
|
6
|
+
* verdict to `deliverSignals` runFailed — no tool-side `setExitCode`.
|
|
7
|
+
*/
|
|
8
|
+
import { EXIT_CODES } from '@opensip-cli/contracts';
|
|
9
|
+
import { resolveFailOnDegraded, } from '@opensip-cli/core';
|
|
10
|
+
import { executeYagni } from './execute-yagni.js';
|
|
11
|
+
import { loadYagniConfig } from './yagni-config.js';
|
|
12
|
+
function parseMinConfidence(raw) {
|
|
13
|
+
if (raw === 'low' || raw === 'medium' || raw === 'high')
|
|
14
|
+
return raw;
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
function normalizeRepeatable(raw) {
|
|
18
|
+
if (raw === undefined)
|
|
19
|
+
return [];
|
|
20
|
+
return Array.isArray(raw) ? raw : [raw];
|
|
21
|
+
}
|
|
22
|
+
function renderGateCompareLines(result) {
|
|
23
|
+
return result.degraded
|
|
24
|
+
? [`YAGNI gate FAILED: ${String(result.added.length)} new finding(s) since baseline.`]
|
|
25
|
+
: [
|
|
26
|
+
`YAGNI gate PASS: no regressions (${String(result.resolved.length)} resolved since baseline).`,
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Finalize a gate run: deliver the signal envelope and (when `--sarif` is set)
|
|
31
|
+
* write the SARIF report. The two are independent I/O — signal egress vs. a
|
|
32
|
+
* local file write, both read-only over the same envelope — so they run
|
|
33
|
+
* concurrently. Shared by the gate-save and gate-compare tails (identical
|
|
34
|
+
* finalize sequence; the only difference is how `runFailed` is derived).
|
|
35
|
+
*/
|
|
36
|
+
async function deliverAndExport(cli, envelope, runFailed, deliverOpts, sarifPath) {
|
|
37
|
+
const tasks = [cli.deliverSignals(envelope, { ...deliverOpts, runFailed })];
|
|
38
|
+
if (sarifPath !== undefined && sarifPath !== '') {
|
|
39
|
+
tasks.push(cli.writeSarif(envelope, sarifPath));
|
|
40
|
+
}
|
|
41
|
+
await Promise.all(tasks);
|
|
42
|
+
}
|
|
43
|
+
export async function runYagniGateMode(opts, cli) {
|
|
44
|
+
if (opts.gateSave === true && opts.gateCompare === true) {
|
|
45
|
+
await cli.reportFailure({
|
|
46
|
+
message: 'Error: --gate-save and --gate-compare are mutually exclusive.',
|
|
47
|
+
exitCode: EXIT_CODES.CONFIGURATION_ERROR,
|
|
48
|
+
jsonRequested: opts.json === true,
|
|
49
|
+
});
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
const config = loadYagniConfig(opts.cwd);
|
|
53
|
+
const outcome = await executeYagni({
|
|
54
|
+
cwd: opts.cwd,
|
|
55
|
+
config,
|
|
56
|
+
minConfidence: parseMinConfidence(opts.minConfidence),
|
|
57
|
+
detectors: normalizeRepeatable(opts.detector),
|
|
58
|
+
categories: normalizeRepeatable(opts.category),
|
|
59
|
+
includeTests: opts.includeTests ?? config.includeTests,
|
|
60
|
+
}, cli);
|
|
61
|
+
const deliverOpts = {
|
|
62
|
+
cwd: opts.cwd,
|
|
63
|
+
reportTo: opts.reportTo,
|
|
64
|
+
apiKey: opts.apiKey,
|
|
65
|
+
};
|
|
66
|
+
if (opts.gateSave === true) {
|
|
67
|
+
await cli.saveBaseline('yagni', outcome.envelope);
|
|
68
|
+
const runFailed = !outcome.envelope.verdict.passed;
|
|
69
|
+
await cli.render({
|
|
70
|
+
type: 'gate-done',
|
|
71
|
+
lines: runFailed
|
|
72
|
+
? [
|
|
73
|
+
`YAGNI baseline saved (${String(outcome.envelope.signals.length)} signal(s))`,
|
|
74
|
+
'YAGNI gate FAILED: findings policy not satisfied.',
|
|
75
|
+
]
|
|
76
|
+
: [`YAGNI baseline saved (${String(outcome.envelope.signals.length)} signal(s))`],
|
|
77
|
+
});
|
|
78
|
+
await deliverAndExport(cli, outcome.envelope, runFailed, deliverOpts, opts.sarif);
|
|
79
|
+
return { session: outcome.session };
|
|
80
|
+
}
|
|
81
|
+
const result = await cli.compareBaseline('yagni', outcome.envelope);
|
|
82
|
+
const runFailed = result.degraded && resolveFailOnDegraded('yagni');
|
|
83
|
+
await cli.render({
|
|
84
|
+
type: 'gate-done',
|
|
85
|
+
lines: renderGateCompareLines(result),
|
|
86
|
+
});
|
|
87
|
+
await deliverAndExport(cli, outcome.envelope, runFailed, deliverOpts, opts.sarif);
|
|
88
|
+
return { session: outcome.session };
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=yagni-gate-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yagni-gate-mode.js","sourceRoot":"","sources":["../../src/cli/yagni-gate-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ProgressEvent } from '@opensip-cli/cli-ui';
|
|
2
|
+
/**
|
|
3
|
+
* Friendly checklist row label from a detector slug: drops the `yagni:`
|
|
4
|
+
* namespace and title-cases the kebab tail.
|
|
5
|
+
*/
|
|
6
|
+
export declare function detectorLabel(slug: string): string;
|
|
7
|
+
export declare function detectorStartEvent(slug: string): ProgressEvent;
|
|
8
|
+
export declare function detectorDoneEvent(slug: string, durationMs: number, detail?: string): ProgressEvent;
|
|
9
|
+
//# sourceMappingURL=yagni-progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yagni-progress.d.ts","sourceRoot":"","sources":["../../src/cli/yagni-progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAE9D;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,aAAa,CAOf"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Friendly checklist row label from a detector slug: drops the `yagni:`
|
|
3
|
+
* namespace and title-cases the kebab tail.
|
|
4
|
+
*/
|
|
5
|
+
export function detectorLabel(slug) {
|
|
6
|
+
const name = slug.slice(slug.indexOf(':') + 1);
|
|
7
|
+
return name
|
|
8
|
+
.split('-')
|
|
9
|
+
.map((w) => (w.length === 0 ? w : w[0].toUpperCase() + w.slice(1)))
|
|
10
|
+
.join(' ');
|
|
11
|
+
}
|
|
12
|
+
export function detectorStartEvent(slug) {
|
|
13
|
+
return { type: 'stage-start', stage: slug, label: detectorLabel(slug) };
|
|
14
|
+
}
|
|
15
|
+
export function detectorDoneEvent(slug, durationMs, detail) {
|
|
16
|
+
return {
|
|
17
|
+
type: 'stage-done',
|
|
18
|
+
stage: slug,
|
|
19
|
+
durationMs,
|
|
20
|
+
...(detail === undefined ? {} : { detail }),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=yagni-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yagni-progress.js","sourceRoot":"","sources":["../../src/cli/yagni-progress.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SAClE,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,UAAkB,EAClB,MAAe;IAEf,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,IAAI;QACX,UAAU;QACV,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5C,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yagni-runner.d.ts","sourceRoot":"","sources":["../../src/cli/yagni-runner.tsx"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"yagni-runner.d.ts","sourceRoot":"","sources":["../../src/cli/yagni-runner.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,EAKL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAS3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAsBlE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,eAAe,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAoDD,wBAAsB,eAAe,CACnC,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,cAAc,EACnB,WAAW,CAAC,EAAE,eAAe,0DAuE9B"}
|
package/dist/cli/yagni-runner.js
CHANGED
|
@@ -1,27 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* yagni-runner — live-view entry for `opensip yagni` via @opensip-cli/cli-live.
|
|
3
3
|
*/
|
|
4
|
+
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { join } from 'node:path';
|
|
4
7
|
import { runToolLiveView } from '@opensip-cli/cli-live';
|
|
5
8
|
import { groupSignalsBySource } from '@opensip-cli/contracts';
|
|
6
|
-
import { isErrorSignal, currentScope, } from '@opensip-cli/core';
|
|
9
|
+
import { isErrorSignal, currentScope, liveEngineCorrelation, runOffThreadOrInProcess, } from '@opensip-cli/core';
|
|
7
10
|
import { YAGNI_DETECTORS } from '../detectors/registry.js';
|
|
8
11
|
import { executeYagni } from './execute-yagni.js';
|
|
9
12
|
import { loadYagniConfig } from './yagni-config.js';
|
|
10
13
|
import { buildYagniPresentationLines } from './yagni-presentation.js';
|
|
14
|
+
import { detectorDoneEvent, detectorLabel, detectorStartEvent } from './yagni-progress.js';
|
|
11
15
|
const YAGNI_TOOL_TITLE = 'YAGNI Audit';
|
|
12
16
|
const YAGNI_TOOL_DESCRIPTION = 'Scanning for speculative surface to remove.';
|
|
13
|
-
/**
|
|
14
|
-
* Friendly checklist row label from a detector slug — drops the `yagni:`
|
|
15
|
-
* namespace and title-cases the kebab tail (`yagni:unused-config-surface` →
|
|
16
|
-
* `Unused Config Surface`).
|
|
17
|
-
*/
|
|
18
|
-
function detectorLabel(slug) {
|
|
19
|
-
const name = slug.slice(slug.indexOf(':') + 1);
|
|
20
|
-
return name
|
|
21
|
-
.split('-')
|
|
22
|
-
.map((w) => (w.length === 0 ? w : w[0].toUpperCase() + w.slice(1)))
|
|
23
|
-
.join(' ');
|
|
24
|
-
}
|
|
25
17
|
/**
|
|
26
18
|
* Per-detector checklist (one phase per detector), mirroring graph's staged view.
|
|
27
19
|
* Detectors run serially, so each row spins, completes with its duration, then the
|
|
@@ -63,6 +55,27 @@ function envelopeToLiveRunTableRows(envelope) {
|
|
|
63
55
|
};
|
|
64
56
|
});
|
|
65
57
|
}
|
|
58
|
+
function buildExecuteOptions(args, config, emit) {
|
|
59
|
+
return {
|
|
60
|
+
cwd: args.cwd,
|
|
61
|
+
config,
|
|
62
|
+
minConfidence: args.minConfidence,
|
|
63
|
+
detectors: args.detectors,
|
|
64
|
+
categories: args.categories,
|
|
65
|
+
includeTests: args.includeTests,
|
|
66
|
+
pathRoots: args.pathRoots,
|
|
67
|
+
onDetectorStart: (slug) => {
|
|
68
|
+
emit(detectorStartEvent(slug));
|
|
69
|
+
},
|
|
70
|
+
onDetectorDone: (slug, durationMs) => {
|
|
71
|
+
emit(detectorDoneEvent(slug, durationMs));
|
|
72
|
+
},
|
|
73
|
+
onDetectorsSkipped: (slugs) => {
|
|
74
|
+
for (const slug of slugs)
|
|
75
|
+
emit(detectorDoneEvent(slug, 0, 'skipped'));
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
66
79
|
export async function renderYagniLive(args, cli, liveContext) {
|
|
67
80
|
const config = loadYagniConfig(args.cwd);
|
|
68
81
|
return runToolLiveView({
|
|
@@ -75,32 +88,27 @@ export async function renderYagniLive(args, cli, liveContext) {
|
|
|
75
88
|
projectPath: args.cwd,
|
|
76
89
|
walkedUp: currentScope()?.projectContext?.walkedUp,
|
|
77
90
|
produce: async (emit, helpers) => {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
pathRoots: args.pathRoots,
|
|
89
|
-
// Phases live view: one checklist row per detector (declared in
|
|
90
|
-
// YAGNI_RUNNING_SURFACE), driven by the detector lifecycle.
|
|
91
|
-
onDetectorStart: (slug) => {
|
|
92
|
-
emit({ type: 'stage-start', stage: slug, label: detectorLabel(slug) });
|
|
93
|
-
},
|
|
94
|
-
onDetectorDone: (slug, durationMs) => {
|
|
95
|
-
emit({ type: 'stage-done', stage: slug, durationMs });
|
|
91
|
+
const specDir = mkdtempSync(join(tmpdir(), 'yagni-worker-'));
|
|
92
|
+
const specPath = join(specDir, 'spec.json');
|
|
93
|
+
writeFileSync(specPath, JSON.stringify(args), 'utf8');
|
|
94
|
+
const correlation = liveEngineCorrelation(currentScope()?.correlation);
|
|
95
|
+
const run = runOffThreadOrInProcess({
|
|
96
|
+
preferWorker: true,
|
|
97
|
+
descriptor: {
|
|
98
|
+
command: process.argv[1] ?? '',
|
|
99
|
+
argv: ['yagni-run-worker', specPath],
|
|
100
|
+
...(correlation ? { correlation } : {}),
|
|
96
101
|
},
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
inProcess: (workerEmit) => executeYagni(buildExecuteOptions(args, config, workerEmit), cli),
|
|
103
|
+
});
|
|
104
|
+
helpers.setRunning(run.onProgress);
|
|
105
|
+
let outcome;
|
|
106
|
+
try {
|
|
107
|
+
outcome = await run.result;
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
rmSync(specDir, { recursive: true, force: true });
|
|
111
|
+
}
|
|
104
112
|
const skippedDetectors = outcome.session.payload.summary.skippedDetectors;
|
|
105
113
|
const verboseLines = buildYagniPresentationLines(outcome.envelope, args.cwd, skippedDetectors, args.verbose === true);
|
|
106
114
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yagni-runner.js","sourceRoot":"","sources":["../../src/cli/yagni-runner.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"yagni-runner.js","sourceRoot":"","sources":["../../src/cli/yagni-runner.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yagni-run-worker <specPath>` — headless YAGNI run forked by the live view.
|
|
3
|
+
*
|
|
4
|
+
* The worker re-enters the full CLI bootstrap, then runs the CPU-heavy detector
|
|
5
|
+
* pass away from the parent Ink renderer. Progress events stream over IPC; the
|
|
6
|
+
* final envelope/session returns as structured data.
|
|
7
|
+
*/
|
|
8
|
+
import { type CommandSpec, type ToolCliContext } from '@opensip-cli/core';
|
|
9
|
+
export declare function executeYagniWorker(specPath: string, cli: ToolCliContext): Promise<void>;
|
|
10
|
+
export declare const yagniRunWorkerCommandSpec: CommandSpec<unknown, ToolCliContext>;
|
|
11
|
+
//# sourceMappingURL=yagni-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yagni-worker.d.ts","sourceRoot":"","sources":["../../src/cli/yagni-worker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,cAAc,EAEpB,MAAM,mBAAmB,CAAC;AAsB3B,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC7F;AAED,eAAO,MAAM,yBAAyB,EAAE,WAAW,CAAC,OAAO,EAAE,cAAc,CAiBzE,CAAC"}
|