@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.
Files changed (39) hide show
  1. package/README.md +2 -2
  2. package/dist/__tests__/detector-progress.test.js +21 -0
  3. package/dist/__tests__/detector-progress.test.js.map +1 -1
  4. package/dist/cli/__tests__/yagni-command-spec.test.d.ts +2 -0
  5. package/dist/cli/__tests__/yagni-command-spec.test.d.ts.map +1 -0
  6. package/dist/cli/__tests__/yagni-command-spec.test.js +128 -0
  7. package/dist/cli/__tests__/yagni-command-spec.test.js.map +1 -0
  8. package/dist/cli/__tests__/yagni-gate-mode.test.d.ts +7 -0
  9. package/dist/cli/__tests__/yagni-gate-mode.test.d.ts.map +1 -0
  10. package/dist/cli/__tests__/yagni-gate-mode.test.js +155 -0
  11. package/dist/cli/__tests__/yagni-gate-mode.test.js.map +1 -0
  12. package/dist/cli/__tests__/yagni-runner.test.js +77 -4
  13. package/dist/cli/__tests__/yagni-runner.test.js.map +1 -1
  14. package/dist/cli/__tests__/yagni-worker.test.d.ts +2 -0
  15. package/dist/cli/__tests__/yagni-worker.test.d.ts.map +1 -0
  16. package/dist/cli/__tests__/yagni-worker.test.js +150 -0
  17. package/dist/cli/__tests__/yagni-worker.test.js.map +1 -0
  18. package/dist/cli/yagni-command-spec.d.ts.map +1 -1
  19. package/dist/cli/yagni-command-spec.js +23 -1
  20. package/dist/cli/yagni-command-spec.js.map +1 -1
  21. package/dist/cli/yagni-gate-mode.d.ts +23 -0
  22. package/dist/cli/yagni-gate-mode.d.ts.map +1 -0
  23. package/dist/cli/yagni-gate-mode.js +90 -0
  24. package/dist/cli/yagni-gate-mode.js.map +1 -0
  25. package/dist/cli/yagni-progress.d.ts +9 -0
  26. package/dist/cli/yagni-progress.d.ts.map +1 -0
  27. package/dist/cli/yagni-progress.js +23 -0
  28. package/dist/cli/yagni-progress.js.map +1 -0
  29. package/dist/cli/yagni-runner.d.ts.map +1 -1
  30. package/dist/cli/yagni-runner.js +46 -38
  31. package/dist/cli/yagni-runner.js.map +1 -1
  32. package/dist/cli/yagni-worker.d.ts +11 -0
  33. package/dist/cli/yagni-worker.d.ts.map +1 -0
  34. package/dist/cli/yagni-worker.js +67 -0
  35. package/dist/cli/yagni-worker.js.map +1 -0
  36. package/dist/tool.d.ts.map +1 -1
  37. package/dist/tool.js +2 -1
  38. package/dist/tool.js.map +1 -1
  39. 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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"}
@@ -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;AASnG;;GAEG;AACH,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAE9C,eAAO,MAAM,eAAe,yCAAyC,CAAC;AAQtE,eAAO,MAAM,SAAS,EAAE,IAoBtB,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;IACzD,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"}
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.14",
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-live": "0.1.14",
58
- "@opensip-cli/cli-ui": "0.1.14",
59
- "@opensip-cli/clone-detection": "0.1.14",
60
- "@opensip-cli/contracts": "0.1.14",
61
- "@opensip-cli/core": "0.1.14",
62
- "@opensip-cli/lang-typescript": "0.1.14",
63
- "@opensip-cli/config": "0.1.14"
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.14"
84
+ "@opensip-cli/graph-typescript": "0.1.16"
70
85
  },
71
86
  "scripts": {
72
87
  "build": "tsc",