@sun-asterisk/sungen 3.1.2-beta.105 → 3.1.2-beta.107
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/dist/capabilities/discover.d.ts.map +1 -1
- package/dist/capabilities/discover.js +60 -9
- package/dist/capabilities/discover.js.map +1 -1
- package/dist/cli/commands/capability.d.ts.map +1 -1
- package/dist/cli/commands/capability.js +45 -5
- package/dist/cli/commands/capability.js.map +1 -1
- package/package.json +2 -2
- package/src/capabilities/discover.ts +16 -7
- package/src/cli/commands/capability.ts +40 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/capabilities/discover.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/capabilities/discover.ts"],"names":[],"mappings":"AA6CA,wBAAgB,+BAA+B,IAAI,IAAI,CAKtD"}
|
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.discoverAndRegisterCapabilities = discoverAndRegisterCapabilities;
|
|
4
37
|
/**
|
|
@@ -16,6 +49,8 @@ exports.discoverAndRegisterCapabilities = discoverAndRegisterCapabilities;
|
|
|
16
49
|
* A driver that isn't installed is simply skipped (capabilities are opt-in). Errors thrown *inside* a
|
|
17
50
|
* present driver propagate — only a genuinely absent package is swallowed (resolve-then-require).
|
|
18
51
|
*/
|
|
52
|
+
const module_1 = require("module");
|
|
53
|
+
const path = __importStar(require("path"));
|
|
19
54
|
const registry_1 = require("./registry");
|
|
20
55
|
const builtins_1 = require("./builtins");
|
|
21
56
|
/**
|
|
@@ -25,16 +60,32 @@ const builtins_1 = require("./builtins");
|
|
|
25
60
|
*/
|
|
26
61
|
const EXTERNAL_DRIVERS = ['@sungen/driver-ui', '@sungen/driver-db', '@sungen/driver-api'];
|
|
27
62
|
function loadExternalDriver(name) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
63
|
+
// Resolve from the user's PROJECT first, then from core's own location. Opt-in drivers
|
|
64
|
+
// (`sungen capability add db|api`) install into the PROJECT's node_modules — a globally-installed
|
|
65
|
+
// core (`npm i -g`) wouldn't see them via a core-anchored `require`. The bundled @sungen/driver-ui
|
|
66
|
+
// is a core dependency (co-located with core), so the second anchor finds it.
|
|
67
|
+
for (const anchor of [path.join(process.cwd(), 'package.json'), __filename]) {
|
|
68
|
+
let req;
|
|
69
|
+
try {
|
|
70
|
+
req = (0, module_1.createRequire)(anchor);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
let resolved;
|
|
76
|
+
try {
|
|
77
|
+
resolved = req.resolve(name);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
continue;
|
|
81
|
+
} // not installed at this anchor → try next
|
|
82
|
+
const mod = req(resolved); // present: let any error thrown INSIDE the driver propagate (don't mask)
|
|
83
|
+
const register = mod?.sungenDriver?.register ?? mod?.register;
|
|
84
|
+
if (typeof register === 'function')
|
|
85
|
+
register(registry_1.capabilityRegistry);
|
|
86
|
+
return;
|
|
33
87
|
}
|
|
34
|
-
|
|
35
|
-
const register = mod?.sungenDriver?.register ?? mod?.register;
|
|
36
|
-
if (typeof register === 'function')
|
|
37
|
-
register(registry_1.capabilityRegistry);
|
|
88
|
+
// not installed at any anchor — capabilities are opt-in, so skip silently
|
|
38
89
|
}
|
|
39
90
|
function discoverAndRegisterCapabilities() {
|
|
40
91
|
if (registry_1.capabilityRegistry.isPopulated())
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/capabilities/discover.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/capabilities/discover.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,0EAKC;AAlDD;;;;;;;;;;;;;;GAcG;AACH,mCAAuC;AACvC,2CAA6B;AAC7B,yCAAgD;AAChD,yCAAmE;AAEnE;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,CAAC;AAE1F,SAAS,kBAAkB,CAAC,IAAY;IACtC,uFAAuF;IACvF,kGAAkG;IAClG,mGAAmG;IACnG,8EAA8E;IAC9E,KAAK,MAAM,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC;QAC5E,IAAI,GAAgB,CAAC;QACrB,IAAI,CAAC;YAAC,GAAG,GAAG,IAAA,sBAAa,EAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC;QACxD,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YAAC,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC,CAAC,0CAA0C;QACpG,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,yEAAyE;QACpG,MAAM,QAAQ,GAAyD,GAAG,EAAE,YAAY,EAAE,QAAQ,IAAI,GAAG,EAAE,QAAQ,CAAC;QACpH,IAAI,OAAO,QAAQ,KAAK,UAAU;YAAE,QAAQ,CAAC,6BAAkB,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IACD,0EAA0E;AAC5E,CAAC;AAED,SAAgB,+BAA+B;IAC7C,IAAI,6BAAkB,CAAC,WAAW,EAAE;QAAE,OAAO;IAC7C,KAAK,MAAM,IAAI,IAAI,gBAAgB;QAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,4CAA4C;IAC3G,KAAK,MAAM,MAAM,IAAI,wBAAa;QAAE,MAAM,CAAC,QAAQ,CAAC,6BAAkB,CAAC,CAAC,CAAC,4BAA4B;IACrG,IAAA,iCAAsB,EAAC,6BAAkB,CAAC,CAAC,CAAC,iDAAiD;AAC/F,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/capability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/capability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0CpC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwJhE"}
|
|
@@ -35,11 +35,39 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.registerCapabilityCommand = registerCapabilityCommand;
|
|
37
37
|
const child_process_1 = require("child_process");
|
|
38
|
+
const module_1 = require("module");
|
|
38
39
|
const fs = __importStar(require("fs"));
|
|
39
40
|
const path = __importStar(require("path"));
|
|
40
41
|
const capability_1 = require("../../harness/capability");
|
|
41
42
|
const capability_plan_1 = require("../../harness/capability-plan");
|
|
42
43
|
const adapters_1 = require("../../generators/test-generator/adapters");
|
|
44
|
+
/** The running CLI's (core) version — opt-in drivers install in lockstep with it (not `@latest`). */
|
|
45
|
+
function coreVersion() {
|
|
46
|
+
try {
|
|
47
|
+
return require('../../../package.json').version || 'latest';
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return 'latest';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Verify a capability driver (db/api/…) installed into the PROJECT exposes the capability SPI entry
|
|
55
|
+
* (`sungenDriver.register`). Resolved from the project's node_modules so it works with a globally
|
|
56
|
+
* installed core. Capability drivers are NOT codegen adapters — don't route them through loadDriver.
|
|
57
|
+
*/
|
|
58
|
+
function verifyCapabilityDriver(pkg, cwd) {
|
|
59
|
+
let mod;
|
|
60
|
+
try {
|
|
61
|
+
mod = (0, module_1.createRequire)(path.join(cwd, 'package.json'))(pkg);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
throw new Error(`${pkg} is not resolvable from this project — did "npm install -D ${pkg}" succeed, and is there a package.json here?`);
|
|
65
|
+
}
|
|
66
|
+
const register = mod?.sungenDriver?.register ?? mod?.register;
|
|
67
|
+
if (typeof register !== 'function') {
|
|
68
|
+
throw new Error(`${pkg} is installed but is not a sungen capability driver (missing sungenDriver.register).`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
43
71
|
function findScreenDir(name) {
|
|
44
72
|
const s = path.join(process.cwd(), 'qa', 'screens', name);
|
|
45
73
|
if (fs.existsSync(s))
|
|
@@ -145,17 +173,29 @@ function registerCapabilityCommand(program) {
|
|
|
145
173
|
const adapterName = meta.adapter || meta.id;
|
|
146
174
|
const bundled = adapters_1.adapterRegistry.hasAdapter(adapterName); // e.g. `web` is bundled in Phase 2a
|
|
147
175
|
if (!bundled && !o.skipInstall) {
|
|
148
|
-
|
|
149
|
-
|
|
176
|
+
// Pin the driver to the RUNNING core's exact version (lockstep). Without this, plain
|
|
177
|
+
// `npm install @sungen/driver-x` resolves the package's `latest` dist-tag — which on a
|
|
178
|
+
// beta channel can lag (e.g. a prerelease first-published-as-latest), pulling a driver
|
|
179
|
+
// whose core dep resolves to the wrong @sun-asterisk/sungen and fails to load.
|
|
180
|
+
const spec = `${meta.package}@${coreVersion()}`;
|
|
181
|
+
console.log(`📦 Installing ${spec} (dev dependency)...`);
|
|
182
|
+
const r = (0, child_process_1.spawnSync)('npm', ['install', '-D', spec], { stdio: 'inherit', shell: true });
|
|
150
183
|
if (r.status !== 0)
|
|
151
|
-
throw new Error(`npm install -D ${
|
|
184
|
+
throw new Error(`npm install -D ${spec} failed.`);
|
|
152
185
|
}
|
|
153
186
|
else if (bundled) {
|
|
154
187
|
console.log(`✓ ${driver} is built-in (no install needed).`);
|
|
155
188
|
}
|
|
156
|
-
// Verify it
|
|
189
|
+
// Verify it loaded (skip for bundled — already registered). Two driver shapes:
|
|
190
|
+
// - platform driver (web/mobile): a codegen adapter, loaded via the adapter registry (mod.activate)
|
|
191
|
+
// - capability driver (db/api/…): a capability-SPI package (mod.sungenDriver.register) — NOT an adapter
|
|
157
192
|
if (!bundled) {
|
|
158
|
-
|
|
193
|
+
if (meta.kind === 'platform') {
|
|
194
|
+
adapters_1.adapterRegistry.loadDriver(adapterName, meta.package, cwd); // throws if not loadable
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
verifyCapabilityDriver(meta.package, cwd); // capability SPI entry, resolved from the project
|
|
198
|
+
}
|
|
159
199
|
}
|
|
160
200
|
const profile = (0, capability_1.readCapabilities)(cwd);
|
|
161
201
|
const enabled = Array.from(new Set([...profile.enabled, driver]));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../../../src/cli/commands/capability.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../../../src/cli/commands/capability.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sun-asterisk/sungen",
|
|
3
|
-
"version": "3.1.2-beta.
|
|
3
|
+
"version": "3.1.2-beta.107",
|
|
4
4
|
"description": "Deterministic E2E Test Compiler - Gherkin + Selectors → Playwright tests",
|
|
5
5
|
"main": "src/index.ts",
|
|
6
6
|
"types": "src/index.ts",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"node": ">=18.0.0"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@sungen/driver-ui": "3.1.2-beta.
|
|
36
|
+
"@sungen/driver-ui": "3.1.2-beta.107",
|
|
37
37
|
"@anthropic-ai/sdk": "^0.71.0",
|
|
38
38
|
"@babel/parser": "^7.28.5",
|
|
39
39
|
"@babel/traverse": "^7.28.5",
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
* A driver that isn't installed is simply skipped (capabilities are opt-in). Errors thrown *inside* a
|
|
14
14
|
* present driver propagate — only a genuinely absent package is swallowed (resolve-then-require).
|
|
15
15
|
*/
|
|
16
|
+
import { createRequire } from 'module';
|
|
17
|
+
import * as path from 'path';
|
|
16
18
|
import { capabilityRegistry } from './registry';
|
|
17
19
|
import { LOCAL_DRIVERS, registerCoreCapability } from './builtins';
|
|
18
20
|
|
|
@@ -24,14 +26,21 @@ import { LOCAL_DRIVERS, registerCoreCapability } from './builtins';
|
|
|
24
26
|
const EXTERNAL_DRIVERS = ['@sungen/driver-ui', '@sungen/driver-db', '@sungen/driver-api'];
|
|
25
27
|
|
|
26
28
|
function loadExternalDriver(name: string): void {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
// Resolve from the user's PROJECT first, then from core's own location. Opt-in drivers
|
|
30
|
+
// (`sungen capability add db|api`) install into the PROJECT's node_modules — a globally-installed
|
|
31
|
+
// core (`npm i -g`) wouldn't see them via a core-anchored `require`. The bundled @sungen/driver-ui
|
|
32
|
+
// is a core dependency (co-located with core), so the second anchor finds it.
|
|
33
|
+
for (const anchor of [path.join(process.cwd(), 'package.json'), __filename]) {
|
|
34
|
+
let req: NodeRequire;
|
|
35
|
+
try { req = createRequire(anchor); } catch { continue; }
|
|
36
|
+
let resolved: string;
|
|
37
|
+
try { resolved = req.resolve(name); } catch { continue; } // not installed at this anchor → try next
|
|
38
|
+
const mod = req(resolved); // present: let any error thrown INSIDE the driver propagate (don't mask)
|
|
39
|
+
const register: ((r: typeof capabilityRegistry) => void) | undefined = mod?.sungenDriver?.register ?? mod?.register;
|
|
40
|
+
if (typeof register === 'function') register(capabilityRegistry);
|
|
41
|
+
return;
|
|
31
42
|
}
|
|
32
|
-
|
|
33
|
-
const register: ((r: typeof capabilityRegistry) => void) | undefined = mod?.sungenDriver?.register ?? mod?.register;
|
|
34
|
-
if (typeof register === 'function') register(capabilityRegistry);
|
|
43
|
+
// not installed at any anchor — capabilities are opt-in, so skip silently
|
|
35
44
|
}
|
|
36
45
|
|
|
37
46
|
export function discoverAndRegisterCapabilities(): void {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { spawnSync } from 'child_process';
|
|
3
|
+
import { createRequire } from 'module';
|
|
3
4
|
import * as fs from 'fs';
|
|
4
5
|
import * as path from 'path';
|
|
5
6
|
import {
|
|
@@ -8,6 +9,29 @@ import {
|
|
|
8
9
|
import { buildPlan, MANUAL_REASONS } from '../../harness/capability-plan';
|
|
9
10
|
import { adapterRegistry } from '../../generators/test-generator/adapters';
|
|
10
11
|
|
|
12
|
+
/** The running CLI's (core) version — opt-in drivers install in lockstep with it (not `@latest`). */
|
|
13
|
+
function coreVersion(): string {
|
|
14
|
+
try { return require('../../../package.json').version || 'latest'; } catch { return 'latest'; }
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Verify a capability driver (db/api/…) installed into the PROJECT exposes the capability SPI entry
|
|
19
|
+
* (`sungenDriver.register`). Resolved from the project's node_modules so it works with a globally
|
|
20
|
+
* installed core. Capability drivers are NOT codegen adapters — don't route them through loadDriver.
|
|
21
|
+
*/
|
|
22
|
+
function verifyCapabilityDriver(pkg: string, cwd: string): void {
|
|
23
|
+
let mod: any;
|
|
24
|
+
try {
|
|
25
|
+
mod = createRequire(path.join(cwd, 'package.json'))(pkg);
|
|
26
|
+
} catch {
|
|
27
|
+
throw new Error(`${pkg} is not resolvable from this project — did "npm install -D ${pkg}" succeed, and is there a package.json here?`);
|
|
28
|
+
}
|
|
29
|
+
const register = mod?.sungenDriver?.register ?? mod?.register;
|
|
30
|
+
if (typeof register !== 'function') {
|
|
31
|
+
throw new Error(`${pkg} is installed but is not a sungen capability driver (missing sungenDriver.register).`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
11
35
|
function findScreenDir(name: string): string | null {
|
|
12
36
|
const s = path.join(process.cwd(), 'qa', 'screens', name);
|
|
13
37
|
if (fs.existsSync(s)) return s;
|
|
@@ -111,16 +135,27 @@ export function registerCapabilityCommand(program: Command): void {
|
|
|
111
135
|
const bundled = adapterRegistry.hasAdapter(adapterName); // e.g. `web` is bundled in Phase 2a
|
|
112
136
|
|
|
113
137
|
if (!bundled && !o.skipInstall) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
138
|
+
// Pin the driver to the RUNNING core's exact version (lockstep). Without this, plain
|
|
139
|
+
// `npm install @sungen/driver-x` resolves the package's `latest` dist-tag — which on a
|
|
140
|
+
// beta channel can lag (e.g. a prerelease first-published-as-latest), pulling a driver
|
|
141
|
+
// whose core dep resolves to the wrong @sun-asterisk/sungen and fails to load.
|
|
142
|
+
const spec = `${meta.package}@${coreVersion()}`;
|
|
143
|
+
console.log(`📦 Installing ${spec} (dev dependency)...`);
|
|
144
|
+
const r = spawnSync('npm', ['install', '-D', spec], { stdio: 'inherit', shell: true });
|
|
145
|
+
if (r.status !== 0) throw new Error(`npm install -D ${spec} failed.`);
|
|
117
146
|
} else if (bundled) {
|
|
118
147
|
console.log(`✓ ${driver} is built-in (no install needed).`);
|
|
119
148
|
}
|
|
120
149
|
|
|
121
|
-
// Verify it
|
|
150
|
+
// Verify it loaded (skip for bundled — already registered). Two driver shapes:
|
|
151
|
+
// - platform driver (web/mobile): a codegen adapter, loaded via the adapter registry (mod.activate)
|
|
152
|
+
// - capability driver (db/api/…): a capability-SPI package (mod.sungenDriver.register) — NOT an adapter
|
|
122
153
|
if (!bundled) {
|
|
123
|
-
|
|
154
|
+
if (meta.kind === 'platform') {
|
|
155
|
+
adapterRegistry.loadDriver(adapterName, meta.package, cwd); // throws if not loadable
|
|
156
|
+
} else {
|
|
157
|
+
verifyCapabilityDriver(meta.package, cwd); // capability SPI entry, resolved from the project
|
|
158
|
+
}
|
|
124
159
|
}
|
|
125
160
|
|
|
126
161
|
const profile = readCapabilities(cwd);
|