rtexit-method 0.1.13 → 0.1.14
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/package.json
CHANGED
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
|
|
2
|
-
"name": "rtexit-method",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "RTExit - AI-assisted Red Team methodology installer",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"author": "Exit Code",
|
|
7
|
-
"bin": {
|
|
8
|
-
"rt": "tools/installer/rt-cli.js",
|
|
9
|
-
"rtexit": "tools/installer/rt-cli.js"
|
|
10
|
-
},
|
|
11
|
-
"main": "tools/installer/rt-cli.js",
|
|
12
|
-
"files": [
|
|
13
|
-
"packaged-assets",
|
|
14
|
-
"tools/installer",
|
|
15
|
-
"RTEXIT.md"
|
|
16
|
-
],
|
|
17
|
-
"scripts": {
|
|
18
|
-
"test": "node --test test/*.test.js",
|
|
19
|
-
"test:cli": "node --test test/cli-help.test.js",
|
|
20
|
-
"test:install": "node --test test/install-command.test.js test/copy-assets.test.js test/write-config.test.js"
|
|
21
|
-
},
|
|
22
|
-
"dependencies": {
|
|
23
|
-
"@clack/prompts": "^1.4.0",
|
|
24
|
-
"commander": "^14.0.0"
|
|
25
|
-
},
|
|
26
|
-
"engines": {
|
|
27
|
-
"node": ">=20.12.0"
|
|
28
|
-
},
|
|
29
|
-
"repository": {
|
|
30
|
-
"type": "git",
|
|
31
|
-
"url": "git+https://github.com/exit-code-eg/RTExit.git"
|
|
32
|
-
},
|
|
33
|
-
"homepage": "https://www.exitcode.me/",
|
|
34
|
-
"bugs": {
|
|
35
|
-
"url": "https://github.com/exit-code-eg/RTExit/issues"
|
|
36
|
-
},
|
|
37
|
-
"keywords": [
|
|
38
|
-
"red-team",
|
|
39
|
-
"red-teaming",
|
|
40
|
-
"security",
|
|
41
|
-
"pentest",
|
|
42
|
-
"cli",
|
|
43
|
-
"ai",
|
|
44
|
-
"methodology",
|
|
45
|
-
"rtexit"
|
|
46
|
-
],
|
|
47
|
-
"publishConfig": {
|
|
48
|
-
"access": "public"
|
|
49
|
-
},
|
|
50
|
-
"directories": {
|
|
51
|
-
"doc": "docs",
|
|
52
|
-
"test": "test"
|
|
53
|
-
},
|
|
54
|
-
"type": "commonjs"
|
|
55
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "rtexit-method",
|
|
3
|
+
"version": "0.1.14",
|
|
4
|
+
"description": "RTExit - AI-assisted Red Team methodology installer",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Exit Code",
|
|
7
|
+
"bin": {
|
|
8
|
+
"rt": "tools/installer/rt-cli.js",
|
|
9
|
+
"rtexit": "tools/installer/rt-cli.js"
|
|
10
|
+
},
|
|
11
|
+
"main": "tools/installer/rt-cli.js",
|
|
12
|
+
"files": [
|
|
13
|
+
"packaged-assets",
|
|
14
|
+
"tools/installer",
|
|
15
|
+
"RTEXIT.md"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"test": "node --test test/*.test.js",
|
|
19
|
+
"test:cli": "node --test test/cli-help.test.js",
|
|
20
|
+
"test:install": "node --test test/install-command.test.js test/copy-assets.test.js test/write-config.test.js"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@clack/prompts": "^1.4.0",
|
|
24
|
+
"commander": "^14.0.0"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=20.12.0"
|
|
28
|
+
},
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "git+https://github.com/exit-code-eg/RTExit.git"
|
|
32
|
+
},
|
|
33
|
+
"homepage": "https://www.exitcode.me/",
|
|
34
|
+
"bugs": {
|
|
35
|
+
"url": "https://github.com/exit-code-eg/RTExit/issues"
|
|
36
|
+
},
|
|
37
|
+
"keywords": [
|
|
38
|
+
"red-team",
|
|
39
|
+
"red-teaming",
|
|
40
|
+
"security",
|
|
41
|
+
"pentest",
|
|
42
|
+
"cli",
|
|
43
|
+
"ai",
|
|
44
|
+
"methodology",
|
|
45
|
+
"rtexit"
|
|
46
|
+
],
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public"
|
|
49
|
+
},
|
|
50
|
+
"directories": {
|
|
51
|
+
"doc": "docs",
|
|
52
|
+
"test": "test"
|
|
53
|
+
},
|
|
54
|
+
"type": "commonjs"
|
|
55
|
+
}
|
|
@@ -3,6 +3,7 @@ const { resolveRepoRoot, resolveTargetRoot } = require('../lib/paths');
|
|
|
3
3
|
const { copyPackagedAssets } = require('../lib/copy-assets');
|
|
4
4
|
const { writeUserConfig } = require('../lib/write-config');
|
|
5
5
|
const { askInstallQuestions } = require('../lib/prompts');
|
|
6
|
+
const { resolveSkillSet } = require('../lib/profiles');
|
|
6
7
|
|
|
7
8
|
async function installCommand(options = {}) {
|
|
8
9
|
const repoRoot = options.repoRoot || resolveRepoRoot();
|
|
@@ -21,7 +22,8 @@ async function installCommand(options = {}) {
|
|
|
21
22
|
const targetRoot = resolveTargetRoot(answers.targetDirectory);
|
|
22
23
|
|
|
23
24
|
const ides = answers.ides && answers.ides.length ? answers.ides : ['agents'];
|
|
24
|
-
|
|
25
|
+
const allowedSkills = resolveSkillSet(answers.profiles || ['all']);
|
|
26
|
+
await copyPackagedAssets({ repoRoot, targetRoot, ides, allowedSkills });
|
|
25
27
|
await writeUserConfig({
|
|
26
28
|
targetRoot,
|
|
27
29
|
answers: {
|
|
@@ -36,7 +38,7 @@ async function installCommand(options = {}) {
|
|
|
36
38
|
});
|
|
37
39
|
|
|
38
40
|
io.log('RTExit installed successfully.');
|
|
39
|
-
io.log(`Skills installed into
|
|
41
|
+
io.log(`Skills installed: ${allowedSkills.size} skills into ${ideFolders.join(', ')}`);
|
|
40
42
|
io.log('Next steps:');
|
|
41
43
|
io.log('1. Open _rtexit/config.user.toml and complete client/project details');
|
|
42
44
|
io.log('2. Open your AI IDE in this project');
|
|
@@ -5,12 +5,17 @@ const IDE_SKILL_FOLDERS = {
|
|
|
5
5
|
codex: '.codex/skills',
|
|
6
6
|
};
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* @param {string[]} ides
|
|
10
|
+
* @param {Set<string>|null} allowedSkills — if null, install everything
|
|
11
|
+
*/
|
|
12
|
+
function getInstallEntries(ides = ['agents'], allowedSkills = null) {
|
|
9
13
|
const skillEntries = ides.map((ide) => ({
|
|
10
14
|
type: 'glob-dir-prefix',
|
|
11
15
|
base: 'packaged-assets/.agents/skills',
|
|
12
16
|
targetBase: IDE_SKILL_FOLDERS[ide] || `.${ide}/skills`,
|
|
13
17
|
prefix: 'rt-',
|
|
18
|
+
allowedSkills,
|
|
14
19
|
}));
|
|
15
20
|
|
|
16
21
|
return [
|
|
@@ -17,8 +17,8 @@ function copyRecursive(source, target) {
|
|
|
17
17
|
fs.copyFileSync(source, target);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
async function copyPackagedAssets({ repoRoot, targetRoot, ides }) {
|
|
21
|
-
for (const entry of getInstallEntries(ides)) {
|
|
20
|
+
async function copyPackagedAssets({ repoRoot, targetRoot, ides, allowedSkills = null }) {
|
|
21
|
+
for (const entry of getInstallEntries(ides, allowedSkills)) {
|
|
22
22
|
if (entry.type === 'path') {
|
|
23
23
|
const sourcePath = path.join(repoRoot, entry.value);
|
|
24
24
|
const targetPath = path.join(targetRoot, entry.target || entry.value);
|
|
@@ -29,12 +29,12 @@ async function copyPackagedAssets({ repoRoot, targetRoot, ides }) {
|
|
|
29
29
|
const skillsRoot = path.join(repoRoot, entry.base);
|
|
30
30
|
const targetBase = entry.targetBase || entry.base;
|
|
31
31
|
for (const name of fs.readdirSync(skillsRoot)) {
|
|
32
|
-
if (name.startsWith(entry.prefix))
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
)
|
|
37
|
-
|
|
32
|
+
if (!name.startsWith(entry.prefix)) continue;
|
|
33
|
+
if (entry.allowedSkills && !entry.allowedSkills.has(name)) continue;
|
|
34
|
+
copyRecursive(
|
|
35
|
+
path.join(skillsRoot, name),
|
|
36
|
+
path.join(targetRoot, targetBase, name)
|
|
37
|
+
);
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install profiles — each profile maps to a set of skill folder names.
|
|
3
|
+
* Skills in CORE are always installed regardless of profile selection.
|
|
4
|
+
* Users pick one or more profiles; they get CORE + selected profiles.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const CORE = [
|
|
8
|
+
// Agents
|
|
9
|
+
'rt-agent-breaker',
|
|
10
|
+
'rt-agent-commander',
|
|
11
|
+
'rt-agent-ghost',
|
|
12
|
+
'rt-agent-navigator',
|
|
13
|
+
'rt-agent-phantom',
|
|
14
|
+
'rt-agent-scout',
|
|
15
|
+
'rt-agent-scribe',
|
|
16
|
+
// Base methodology
|
|
17
|
+
'rt-help',
|
|
18
|
+
'rt-status',
|
|
19
|
+
'rt-party-mode',
|
|
20
|
+
'rt-scope-definition',
|
|
21
|
+
'rt-rules-of-engagement',
|
|
22
|
+
'rt-methodology-selector',
|
|
23
|
+
// Recon & mapping
|
|
24
|
+
'rt-active-recon',
|
|
25
|
+
'rt-osint',
|
|
26
|
+
'rt-shodan-recon',
|
|
27
|
+
'rt-attack-surface-map',
|
|
28
|
+
'rt-subdomain-enum',
|
|
29
|
+
'rt-subdomain-takeover',
|
|
30
|
+
'rt-wordlist-generation',
|
|
31
|
+
'rt-password-spray',
|
|
32
|
+
// Infrastructure
|
|
33
|
+
'rt-c2-operations',
|
|
34
|
+
'rt-redteam-infra',
|
|
35
|
+
// Core execution
|
|
36
|
+
'rt-defense-evasion',
|
|
37
|
+
'rt-lateral-movement',
|
|
38
|
+
'rt-persistence',
|
|
39
|
+
'rt-post-exploitation',
|
|
40
|
+
'rt-privilege-escalation',
|
|
41
|
+
'rt-credential-access',
|
|
42
|
+
'rt-credential-hunt',
|
|
43
|
+
'rt-lsass-dumping',
|
|
44
|
+
'rt-data-exfiltration',
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
const PROFILES = {
|
|
48
|
+
web: {
|
|
49
|
+
label: 'Web & API',
|
|
50
|
+
description: 'Web apps, APIs, injection, auth, OWASP Top 10',
|
|
51
|
+
skills: [
|
|
52
|
+
'rt-exploit-web',
|
|
53
|
+
'rt-exploit-injection',
|
|
54
|
+
'rt-exploit-xss',
|
|
55
|
+
'rt-exploit-ssrf',
|
|
56
|
+
'rt-exploit-auth',
|
|
57
|
+
'rt-exploit-idor',
|
|
58
|
+
'rt-exploit-api',
|
|
59
|
+
'rt-exploit-jwt',
|
|
60
|
+
'rt-exploit-file-upload',
|
|
61
|
+
'rt-cors-csrf',
|
|
62
|
+
'rt-clickjacking',
|
|
63
|
+
'rt-dom-attacks',
|
|
64
|
+
'rt-cache-attacks',
|
|
65
|
+
'rt-business-logic',
|
|
66
|
+
'rt-race-conditions',
|
|
67
|
+
'rt-request-smuggling',
|
|
68
|
+
'rt-path-traversal',
|
|
69
|
+
'rt-deserialization',
|
|
70
|
+
'rt-prototype-pollution',
|
|
71
|
+
'rt-http-parameter-pollution',
|
|
72
|
+
'rt-ldap-xpath-injection',
|
|
73
|
+
'rt-xxe',
|
|
74
|
+
'rt-oauth-oidc',
|
|
75
|
+
'rt-websockets-grpc',
|
|
76
|
+
'rt-js-analysis',
|
|
77
|
+
'rt-browser-exploitation',
|
|
78
|
+
'rt-exploit-wordpress',
|
|
79
|
+
'rt-exploit-nodejs',
|
|
80
|
+
'rt-exploit-php',
|
|
81
|
+
'rt-exploit-python',
|
|
82
|
+
'rt-exploit-java',
|
|
83
|
+
'rt-exploit-dotnet',
|
|
84
|
+
'rt-exploit-ruby',
|
|
85
|
+
'rt-exploit-frameworks',
|
|
86
|
+
'rt-exploit-electron',
|
|
87
|
+
'rt-exploit-firebase',
|
|
88
|
+
'rt-supabase',
|
|
89
|
+
'rt-exploit-osticket',
|
|
90
|
+
'rt-exploit-bec',
|
|
91
|
+
'rt-serverless',
|
|
92
|
+
'rt-exploit-elasticsearch',
|
|
93
|
+
'rt-exploit-databases',
|
|
94
|
+
'rt-exploit-mongodb',
|
|
95
|
+
'rt-exploit-mssql',
|
|
96
|
+
'rt-exploit-mysql',
|
|
97
|
+
'rt-exploit-postgresql',
|
|
98
|
+
'rt-exploit-redis',
|
|
99
|
+
'rt-ai-llm-security',
|
|
100
|
+
'rt-crypto-attacks',
|
|
101
|
+
'rt-exploit-fuzzing',
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
|
|
105
|
+
mobile: {
|
|
106
|
+
label: 'Mobile',
|
|
107
|
+
description: 'Android, iOS, Bluetooth/BLE',
|
|
108
|
+
skills: [
|
|
109
|
+
'rt-exploit-android',
|
|
110
|
+
'rt-exploit-ios',
|
|
111
|
+
'rt-bluetooth-ble',
|
|
112
|
+
],
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
cloud: {
|
|
116
|
+
label: 'Cloud',
|
|
117
|
+
description: 'AWS, Azure, GCP, Kubernetes, containers',
|
|
118
|
+
skills: [
|
|
119
|
+
'rt-exploit-cloud-aws',
|
|
120
|
+
'rt-exploit-cloud-azure',
|
|
121
|
+
'rt-exploit-cloud-gcp',
|
|
122
|
+
'rt-kubernetes',
|
|
123
|
+
'rt-exploit-containers',
|
|
124
|
+
'rt-serverless',
|
|
125
|
+
'rt-supply-chain',
|
|
126
|
+
'rt-exploit-firebase',
|
|
127
|
+
'rt-supabase',
|
|
128
|
+
'rt-exploit-elasticsearch',
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
ad: {
|
|
133
|
+
label: 'Active Directory & Windows',
|
|
134
|
+
description: 'AD, ADCS, Kerberos, lateral movement, EDR bypass, APT techniques',
|
|
135
|
+
skills: [
|
|
136
|
+
'rt-exploit-active-directory',
|
|
137
|
+
'rt-exploit-adcs',
|
|
138
|
+
'rt-adcs-esc9-13',
|
|
139
|
+
'rt-adfs',
|
|
140
|
+
'rt-azure-ad',
|
|
141
|
+
'rt-exchange-sharepoint',
|
|
142
|
+
'rt-exploit-desktop-win',
|
|
143
|
+
'rt-exploit-desktop-mac',
|
|
144
|
+
'rt-printer-attacks',
|
|
145
|
+
'rt-network-segmentation',
|
|
146
|
+
'rt-exploit-network',
|
|
147
|
+
'rt-ssl-mitm',
|
|
148
|
+
'rt-citrix-vdi',
|
|
149
|
+
// Nation-state / APT
|
|
150
|
+
'rt-kerberos-relay',
|
|
151
|
+
'rt-diamond-sapphire-tickets',
|
|
152
|
+
'rt-zerologon',
|
|
153
|
+
'rt-printnightmare-rce',
|
|
154
|
+
'rt-golden-saml',
|
|
155
|
+
'rt-skeleton-key',
|
|
156
|
+
'rt-syscall-bypass',
|
|
157
|
+
'rt-etw-bypass',
|
|
158
|
+
'rt-process-injection-advanced',
|
|
159
|
+
'rt-ppid-spoofing',
|
|
160
|
+
'rt-beacon-sleep-masking',
|
|
161
|
+
'rt-clm-jea-escape',
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
|
|
165
|
+
reporting: {
|
|
166
|
+
label: 'Reporting & Documentation',
|
|
167
|
+
description: 'Reports, findings, CVSS, MITRE, scenarios, compliance',
|
|
168
|
+
skills: [
|
|
169
|
+
'rt-technical-report',
|
|
170
|
+
'rt-executive-report',
|
|
171
|
+
'rt-finding-document',
|
|
172
|
+
'rt-finding-tracker',
|
|
173
|
+
'rt-autodoc',
|
|
174
|
+
'rt-create-sead',
|
|
175
|
+
'rt-evidence-chain',
|
|
176
|
+
'rt-compliance-mapper',
|
|
177
|
+
'rt-cvss-calculator',
|
|
178
|
+
'rt-poc-writer',
|
|
179
|
+
'rt-risk-matrix',
|
|
180
|
+
'rt-mitre-map',
|
|
181
|
+
'rt-kill-chain-map',
|
|
182
|
+
'rt-remediation-roadmap',
|
|
183
|
+
'rt-attack-chain-builder',
|
|
184
|
+
'rt-timeline',
|
|
185
|
+
'rt-threat-model',
|
|
186
|
+
'rt-scenario-library',
|
|
187
|
+
'rt-scenario-c001', 'rt-scenario-c002', 'rt-scenario-c003', 'rt-scenario-c004', 'rt-scenario-c005',
|
|
188
|
+
'rt-scenario-d001', 'rt-scenario-d002', 'rt-scenario-d003', 'rt-scenario-d004', 'rt-scenario-d005',
|
|
189
|
+
'rt-scenario-m001', 'rt-scenario-m002', 'rt-scenario-m003', 'rt-scenario-m004', 'rt-scenario-m005',
|
|
190
|
+
'rt-scenario-n001', 'rt-scenario-n002', 'rt-scenario-n003', 'rt-scenario-n004', 'rt-scenario-n005',
|
|
191
|
+
'rt-scenario-w001', 'rt-scenario-w002', 'rt-scenario-w003', 'rt-scenario-w004', 'rt-scenario-w005',
|
|
192
|
+
'rt-scenario-w006', 'rt-scenario-w007', 'rt-scenario-w008', 'rt-scenario-w009', 'rt-scenario-w010',
|
|
193
|
+
],
|
|
194
|
+
},
|
|
195
|
+
|
|
196
|
+
specialist: {
|
|
197
|
+
label: 'Specialist',
|
|
198
|
+
description: 'SCADA/ICS, IoT, hardware, physical, social engineering, wireless',
|
|
199
|
+
skills: [
|
|
200
|
+
'rt-exploit-scada',
|
|
201
|
+
'rt-exploit-iot',
|
|
202
|
+
'rt-hardware-hacking',
|
|
203
|
+
'rt-exploit-wireless',
|
|
204
|
+
'rt-wireless-rogue-ap',
|
|
205
|
+
'rt-exploit-physical',
|
|
206
|
+
'rt-exploit-phishing',
|
|
207
|
+
'rt-exploit-vishing',
|
|
208
|
+
'rt-social-engineering',
|
|
209
|
+
'rt-voip-sip',
|
|
210
|
+
'rt-traffic-analysis',
|
|
211
|
+
'rt-binary-reverse-engineering',
|
|
212
|
+
'rt-sap-exploitation',
|
|
213
|
+
'rt-steganography',
|
|
214
|
+
],
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Resolve the full set of skill folder names to install.
|
|
220
|
+
* @param {string[]|'all'} selectedProfiles — array of profile keys or 'all'
|
|
221
|
+
* @returns {Set<string>} — set of skill folder names
|
|
222
|
+
*/
|
|
223
|
+
function resolveSkillSet(selectedProfiles) {
|
|
224
|
+
if (selectedProfiles === 'all' || (Array.isArray(selectedProfiles) && selectedProfiles.includes('all'))) {
|
|
225
|
+
const all = new Set(CORE);
|
|
226
|
+
for (const profile of Object.values(PROFILES)) {
|
|
227
|
+
for (const s of profile.skills) all.add(s);
|
|
228
|
+
}
|
|
229
|
+
return all;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const result = new Set(CORE);
|
|
233
|
+
for (const key of selectedProfiles) {
|
|
234
|
+
if (PROFILES[key]) {
|
|
235
|
+
for (const s of PROFILES[key].skills) result.add(s);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return result;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
module.exports = { PROFILES, CORE, resolveSkillSet };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const prompts = require('@clack/prompts');
|
|
2
|
+
const { PROFILES } = require('./profiles');
|
|
2
3
|
|
|
3
4
|
async function askInstallQuestions({ cwd }) {
|
|
4
5
|
const targetDirectory = await prompts.text({
|
|
@@ -34,12 +35,28 @@ async function askInstallQuestions({ cwd }) {
|
|
|
34
35
|
required: true,
|
|
35
36
|
});
|
|
36
37
|
|
|
38
|
+
const profileOptions = [
|
|
39
|
+
{ value: 'all', label: 'All Skills (Full install — everything)', hint: 'recommended for full red team ops' },
|
|
40
|
+
...Object.entries(PROFILES).map(([key, p]) => ({
|
|
41
|
+
value: key,
|
|
42
|
+
label: `${p.label}`,
|
|
43
|
+
hint: p.description,
|
|
44
|
+
})),
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
const profiles = await prompts.multiselect({
|
|
48
|
+
message: 'Which skill profiles do you need? (space to select, enter to confirm)',
|
|
49
|
+
options: profileOptions,
|
|
50
|
+
initialValues: ['all'],
|
|
51
|
+
required: true,
|
|
52
|
+
});
|
|
53
|
+
|
|
37
54
|
const confirmed = await prompts.confirm({
|
|
38
55
|
message: `Install RTExit into ${targetDirectory}?`,
|
|
39
56
|
initialValue: true,
|
|
40
57
|
});
|
|
41
58
|
|
|
42
|
-
return { targetDirectory, language, document_output_language, ides, confirmed };
|
|
59
|
+
return { targetDirectory, language, document_output_language, ides, profiles, confirmed };
|
|
43
60
|
}
|
|
44
61
|
|
|
45
62
|
module.exports = { askInstallQuestions };
|