@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,67 @@
|
|
|
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 { readFileSync } from 'node:fs';
|
|
9
|
+
import { defineCommand, getWorkerErrorFailureClass, sendWorkerIpcMessage, startWorkerHeartbeat, } from '@opensip-cli/core';
|
|
10
|
+
import { executeYagni } from './execute-yagni.js';
|
|
11
|
+
import { loadYagniConfig } from './yagni-config.js';
|
|
12
|
+
import { detectorDoneEvent, detectorStartEvent } from './yagni-progress.js';
|
|
13
|
+
function send(msg) {
|
|
14
|
+
sendWorkerIpcMessage(msg);
|
|
15
|
+
}
|
|
16
|
+
export async function executeYagniWorker(specPath, cli) {
|
|
17
|
+
const stopHeartbeat = startWorkerHeartbeat();
|
|
18
|
+
try {
|
|
19
|
+
const args = JSON.parse(readFileSync(specPath, 'utf8'));
|
|
20
|
+
const config = loadYagniConfig(args.cwd);
|
|
21
|
+
const result = await executeYagni({
|
|
22
|
+
cwd: args.cwd,
|
|
23
|
+
config,
|
|
24
|
+
minConfidence: args.minConfidence,
|
|
25
|
+
detectors: args.detectors,
|
|
26
|
+
categories: args.categories,
|
|
27
|
+
includeTests: args.includeTests,
|
|
28
|
+
pathRoots: args.pathRoots,
|
|
29
|
+
onDetectorStart: (slug) => send({ kind: 'progress', event: detectorStartEvent(slug) }),
|
|
30
|
+
onDetectorDone: (slug, durationMs) => send({ kind: 'progress', event: detectorDoneEvent(slug, durationMs) }),
|
|
31
|
+
onDetectorsSkipped: (slugs) => {
|
|
32
|
+
for (const slug of slugs) {
|
|
33
|
+
send({ kind: 'progress', event: detectorDoneEvent(slug, 0, 'skipped') });
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
}, cli);
|
|
37
|
+
send({ kind: 'result', value: result });
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
send({
|
|
41
|
+
kind: 'error',
|
|
42
|
+
message: error instanceof Error ? error.message : String(error),
|
|
43
|
+
...(error instanceof Error && error.stack !== undefined ? { stack: error.stack } : {}),
|
|
44
|
+
...(getWorkerErrorFailureClass(error) === undefined
|
|
45
|
+
? {}
|
|
46
|
+
: { failureClass: getWorkerErrorFailureClass(error) }),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
stopHeartbeat();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export const yagniRunWorkerCommandSpec = defineCommand({
|
|
54
|
+
name: 'yagni-run-worker',
|
|
55
|
+
visibility: 'internal',
|
|
56
|
+
description: '[internal] Run YAGNI headless and stream progress + result over IPC (forked by the live view)',
|
|
57
|
+
commonFlags: [],
|
|
58
|
+
args: [{ name: 'specPath', description: 'Path to a JSON YAGNI run spec file' }],
|
|
59
|
+
scope: 'project',
|
|
60
|
+
output: 'raw-stream',
|
|
61
|
+
rawStreamReason: 'worker-ipc',
|
|
62
|
+
handler: async (rawOpts, cli) => {
|
|
63
|
+
const specPath = rawOpts._args?.[0] ?? '';
|
|
64
|
+
await executeYagniWorker(specPath, cli);
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=yagni-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yagni-worker.js","sourceRoot":"","sources":["../../src/cli/yagni-worker.ts"],"names":[],"mappings":"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"}
|
package/dist/tool.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AAUnG;;GAEG;AACH,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAE9C,eAAO,MAAM,eAAe,yCAAyC,CAAC;AAQtE,eAAO,MAAM,SAAS,EAAE,IAoBtB,CAAC"}
|
package/dist/tool.js
CHANGED
|
@@ -7,6 +7,7 @@ import { collectYagniReportData } from './cli/report-data.js';
|
|
|
7
7
|
import { buildYagniCommandSpec } from './cli/yagni-command-spec.js';
|
|
8
8
|
import { yagniConfigDeclaration } from './cli/yagni-config-schema.js';
|
|
9
9
|
import { renderYagniLive } from './cli/yagni-runner.js';
|
|
10
|
+
import { yagniRunWorkerCommandSpec } from './cli/yagni-worker.js';
|
|
10
11
|
import { YAGNI_IDENTITY, YAGNI_LIVE_VIEW_KEY } from './identity.js';
|
|
11
12
|
/**
|
|
12
13
|
* Per-tool contract version (ADR-0047).
|
|
@@ -23,7 +24,7 @@ export const yagniTool = defineTool({
|
|
|
23
24
|
version: readPackageVersion(import.meta.url),
|
|
24
25
|
description: 'YAGNI reduction audit — find speculative surface to remove',
|
|
25
26
|
},
|
|
26
|
-
commandSpecs: [buildYagniCommandSpec(setUpYagniLiveView)],
|
|
27
|
+
commandSpecs: [buildYagniCommandSpec(setUpYagniLiveView), yagniRunWorkerCommandSpec],
|
|
27
28
|
extensionPoints: {
|
|
28
29
|
contractVersions: {
|
|
29
30
|
yagni: YAGNI_CONTRACT_VERSION,
|
package/dist/tool.js.map
CHANGED
|
@@ -1 +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;
|
|
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,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,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,EAAE,yBAAyB,CAAC;IACpF,eAAe,EAAE;QACf,gBAAgB,EAAE;YAChB,KAAK,EAAE,sBAAsB;SAC9B;QACD,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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opensip-cli/yagni",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.16",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "YAGNI reduction audit for OpenSIP CLI",
|
|
6
6
|
"keywords": [
|
|
@@ -46,6 +46,21 @@
|
|
|
46
46
|
"yag"
|
|
47
47
|
],
|
|
48
48
|
"description": "Run YAGNI reduction audit detectors"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"name": "yagni-run-worker",
|
|
52
|
+
"description": "[internal] Run YAGNI headless and stream progress + result over IPC (forked by the live view)",
|
|
53
|
+
"visibility": "internal",
|
|
54
|
+
"commonFlags": [],
|
|
55
|
+
"args": [
|
|
56
|
+
{
|
|
57
|
+
"name": "specPath",
|
|
58
|
+
"description": "Path to a JSON YAGNI run spec file"
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"scope": "project",
|
|
62
|
+
"output": "raw-stream",
|
|
63
|
+
"rawStreamReason": "worker-ipc"
|
|
49
64
|
}
|
|
50
65
|
]
|
|
51
66
|
},
|
|
@@ -54,19 +69,19 @@
|
|
|
54
69
|
"react": "^19.2.7",
|
|
55
70
|
"typescript": "~6.0.3",
|
|
56
71
|
"zod": "^4.4.3",
|
|
57
|
-
"@opensip-cli/cli-
|
|
58
|
-
"@opensip-cli/cli-
|
|
59
|
-
"@opensip-cli/
|
|
60
|
-
"@opensip-cli/contracts": "0.1.
|
|
61
|
-
"@opensip-cli/
|
|
62
|
-
"@opensip-cli/
|
|
63
|
-
"@opensip-cli/
|
|
72
|
+
"@opensip-cli/cli-ui": "0.1.16",
|
|
73
|
+
"@opensip-cli/cli-live": "0.1.16",
|
|
74
|
+
"@opensip-cli/config": "0.1.16",
|
|
75
|
+
"@opensip-cli/contracts": "0.1.16",
|
|
76
|
+
"@opensip-cli/clone-detection": "0.1.16",
|
|
77
|
+
"@opensip-cli/core": "0.1.16",
|
|
78
|
+
"@opensip-cli/lang-typescript": "0.1.16"
|
|
64
79
|
},
|
|
65
80
|
"devDependencies": {
|
|
66
81
|
"@types/node": "^24.13.2",
|
|
67
82
|
"@types/react": "^19.2.17",
|
|
68
83
|
"vitest": "^4.1.8",
|
|
69
|
-
"@opensip-cli/graph-typescript": "0.1.
|
|
84
|
+
"@opensip-cli/graph-typescript": "0.1.16"
|
|
70
85
|
},
|
|
71
86
|
"scripts": {
|
|
72
87
|
"build": "tsc",
|