@ranger-testing/ranger-cli 2.0.5 → 2.0.7
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/build/cli.js +1 -914
- package/build/commands/addEnv.js +1 -1
- package/build/commands/authEncrypt.js +1 -36
- package/build/commands/clean.js +1 -1
- package/build/commands/config.js +1 -93
- package/build/commands/env.js +1 -98
- package/build/commands/feature.js +1 -653
- package/build/commands/hook.js +1 -33
- package/build/commands/hooks/autoPrompt.js +1 -32
- package/build/commands/hooks/disable.js +1 -33
- package/build/commands/hooks/enable.js +1 -58
- package/build/commands/hooks/exitPlanMode.js +1 -35
- package/build/commands/hooks/index.js +1 -12
- package/build/commands/hooks/output.js +1 -71
- package/build/commands/hooks/planReminder.js +1 -46
- package/build/commands/hooks/planStart.js +1 -30
- package/build/commands/hooks/postEdit.js +1 -43
- package/build/commands/hooks/preCompact.js +1 -30
- package/build/commands/hooks/sessionEnd.js +1 -25
- package/build/commands/hooks/sessionStart.js +1 -93
- package/build/commands/hooks/stopHook.js +1 -155
- package/build/commands/index.js +1 -12
- package/build/commands/login.js +1 -26
- package/build/commands/setupCi.js +1 -189
- package/build/commands/skillup.js +1 -80
- package/build/commands/start.js +1 -1
- package/build/commands/status.js +1 -198
- package/build/commands/update.js +1 -182
- package/build/commands/updateEnv.js +1 -1
- package/build/commands/useEnv.js +1 -1
- package/build/commands/utils/activeProfile.js +1 -76
- package/build/commands/utils/browserSessionsApi.js +1 -1
- package/build/commands/utils/claudeConfig.js +1 -73
- package/build/commands/utils/claudePlugin.js +1 -85
- package/build/commands/utils/crypto.js +1 -42
- package/build/commands/utils/desirePathLog.js +1 -139
- package/build/commands/utils/deviceAuth.js +1 -232
- package/build/commands/utils/environment.js +1 -65
- package/build/commands/utils/featureApi.js +1 -371
- package/build/commands/utils/featureReportGenerator.js +1 -204
- package/build/commands/utils/fixWebmDuration.js +1 -0
- package/build/commands/utils/git.js +1 -44
- package/build/commands/utils/keychain.js +1 -1
- package/build/commands/utils/localAgentInstallationsApi.js +1 -1
- package/build/commands/utils/profileMessages.js +1 -8
- package/build/commands/utils/profileSetupBanner.js +1 -167
- package/build/commands/utils/rangerRoot.js +1 -60
- package/build/commands/utils/reportGenerator.js +1 -130
- package/build/commands/utils/retry.js +1 -25
- package/build/commands/utils/sessionCache.js +1 -299
- package/build/commands/utils/settings.js +1 -313
- package/build/commands/utils/skillContent.js +1 -28
- package/build/commands/utils/skills.js +1 -1
- package/build/commands/utils/telemetry.js +1 -254
- package/build/commands/utils/userApi.js +1 -32
- package/build/commands/utils/version.js +1 -62
- package/build/commands/verifyFeature.js +1 -1343
- package/build/commands/verifyInBrowser.js +1 -1
- package/package.json +4 -1
- package/build/cli.js.map +0 -1
- package/build/commands/addEnv.js.map +0 -1
- package/build/commands/authEncrypt.js.map +0 -1
- package/build/commands/clean.js.map +0 -1
- package/build/commands/config.js.map +0 -1
- package/build/commands/env.js.map +0 -1
- package/build/commands/feature.js.map +0 -1
- package/build/commands/hook.js.map +0 -1
- package/build/commands/hooks/autoPrompt.js.map +0 -1
- package/build/commands/hooks/disable.js.map +0 -1
- package/build/commands/hooks/enable.js.map +0 -1
- package/build/commands/hooks/exitPlanMode.js.map +0 -1
- package/build/commands/hooks/index.js.map +0 -1
- package/build/commands/hooks/output.js.map +0 -1
- package/build/commands/hooks/planReminder.js.map +0 -1
- package/build/commands/hooks/planStart.js.map +0 -1
- package/build/commands/hooks/postEdit.js.map +0 -1
- package/build/commands/hooks/preCompact.js.map +0 -1
- package/build/commands/hooks/sessionEnd.js.map +0 -1
- package/build/commands/hooks/sessionStart.js.map +0 -1
- package/build/commands/hooks/stopHook.js.map +0 -1
- package/build/commands/index.js.map +0 -1
- package/build/commands/login.js.map +0 -1
- package/build/commands/setupCi.js.map +0 -1
- package/build/commands/skillup.js.map +0 -1
- package/build/commands/start.js.map +0 -1
- package/build/commands/status.js.map +0 -1
- package/build/commands/update.js.map +0 -1
- package/build/commands/updateEnv.js.map +0 -1
- package/build/commands/useEnv.js.map +0 -1
- package/build/commands/utils/activeProfile.js.map +0 -1
- package/build/commands/utils/browserSessionsApi.js.map +0 -1
- package/build/commands/utils/claudeConfig.js.map +0 -1
- package/build/commands/utils/claudePlugin.js.map +0 -1
- package/build/commands/utils/crypto.js.map +0 -1
- package/build/commands/utils/desirePathLog.js.map +0 -1
- package/build/commands/utils/deviceAuth.js.map +0 -1
- package/build/commands/utils/environment.js.map +0 -1
- package/build/commands/utils/featureApi.js.map +0 -1
- package/build/commands/utils/featureReportGenerator.js.map +0 -1
- package/build/commands/utils/git.js.map +0 -1
- package/build/commands/utils/keychain.js.map +0 -1
- package/build/commands/utils/localAgentInstallationsApi.js.map +0 -1
- package/build/commands/utils/profileMessages.js.map +0 -1
- package/build/commands/utils/profileSetupBanner.js.map +0 -1
- package/build/commands/utils/rangerRoot.js.map +0 -1
- package/build/commands/utils/reportGenerator.js.map +0 -1
- package/build/commands/utils/retry.js.map +0 -1
- package/build/commands/utils/sessionCache.js.map +0 -1
- package/build/commands/utils/settings.js.map +0 -1
- package/build/commands/utils/skillContent.js.map +0 -1
- package/build/commands/utils/skills.js.map +0 -1
- package/build/commands/utils/telemetry.js.map +0 -1
- package/build/commands/utils/userApi.js.map +0 -1
- package/build/commands/utils/version.js.map +0 -1
- package/build/commands/verifyFeature.js.map +0 -1
- package/build/commands/verifyInBrowser.js.map +0 -1
package/build/cli.js
CHANGED
|
@@ -1,915 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import dotenv from 'dotenv';
|
|
3
|
-
import { dirname, join, parse } from 'path';
|
|
4
|
-
import { existsSync } from 'fs';
|
|
5
|
-
// Find project root by walking up from cwd looking for .ranger or .env
|
|
6
|
-
function findProjectRoot() {
|
|
7
|
-
let current = process.cwd();
|
|
8
|
-
const root = parse(current).root;
|
|
9
|
-
while (current !== root) {
|
|
10
|
-
if (existsSync(join(current, '.ranger')) ||
|
|
11
|
-
existsSync(join(current, '.env'))) {
|
|
12
|
-
return current;
|
|
13
|
-
}
|
|
14
|
-
current = dirname(current);
|
|
15
|
-
}
|
|
16
|
-
return process.cwd();
|
|
17
|
-
}
|
|
18
|
-
// Load .env from project root (not just cwd)
|
|
19
|
-
dotenv.config({ path: join(findProjectRoot(), '.env') });
|
|
20
|
-
import yargs from 'yargs/yargs';
|
|
21
|
-
import { addEnv, clean, login, start, setupCi, useEnv, updateEnv, update, skillup, envList, hook, } from './commands/index.js';
|
|
22
|
-
import { authEncrypt } from './commands/authEncrypt.js';
|
|
23
|
-
import { status } from './commands/status.js';
|
|
24
|
-
import { configSet, configGet, configList, configUnset, } from './commands/config.js';
|
|
25
|
-
import { verifyFeature } from './commands/verifyFeature.js';
|
|
26
|
-
import { featureCreate, featureList, featureShow, featureResume, featureAddScenario, featureEditScenario, featureGetReview, featureDelete, featureRestore, } from './commands/feature.js';
|
|
27
|
-
import { logDesirePath, getErrorType, sanitizeArgs, } from './commands/utils/desirePathLog.js';
|
|
28
|
-
import { getCurrentVersion } from './commands/utils/version.js';
|
|
29
|
-
import { withTelemetry, getCurrentCollector, } from './commands/utils/telemetry.js';
|
|
30
|
-
// Capture unhandled rejections for telemetry
|
|
31
|
-
process.on('unhandledRejection', async (reason) => {
|
|
32
|
-
const collector = getCurrentCollector();
|
|
33
|
-
if (collector) {
|
|
34
|
-
await collector.trackCommandError(reason);
|
|
35
|
-
}
|
|
36
|
-
process.exitCode = 1;
|
|
37
|
-
});
|
|
38
|
-
const rawArgs = process.argv.slice(2);
|
|
39
|
-
const TOP_LEVEL_HELP = `Usage: ranger <command> [options]
|
|
40
|
-
|
|
41
|
-
Commands:
|
|
42
|
-
setup [token] Initialize Ranger in your project
|
|
43
|
-
login Re-authenticate without full setup
|
|
44
|
-
skillup Install Ranger skills for Claude Code
|
|
45
|
-
clean Remove Ranger artifacts from the project
|
|
46
|
-
status Show version, org, skills, and profile status
|
|
47
|
-
update Update Ranger CLI to the latest version
|
|
48
|
-
|
|
49
|
-
profile <command> Manage profiles (add/use/ls/update/config/encrypt-auth)
|
|
50
|
-
add <profile-name> Add profile (options: --ci, --skip-auth)
|
|
51
|
-
use <profile-name> Switch active profile
|
|
52
|
-
ls List profiles
|
|
53
|
-
update <profile-name> Re-capture auth for a profile
|
|
54
|
-
encrypt-auth <profile> Encrypt auth.json for safe git storage
|
|
55
|
-
config <command> Set/get/list/unset profile config
|
|
56
|
-
|
|
57
|
-
create <name> Create a feature review with scenarios
|
|
58
|
-
list List feature reviews
|
|
59
|
-
show [id] Show feature review details
|
|
60
|
-
resume [id] Resume a feature review
|
|
61
|
-
add-scenario <description> Add a scenario to the active feature review
|
|
62
|
-
edit-scenario <description> Edit a scenario description
|
|
63
|
-
get-review [id] Show reviewer feedback
|
|
64
|
-
delete [id] Soft delete a feature review
|
|
65
|
-
restore <id> Restore a soft-deleted feature review
|
|
66
|
-
|
|
67
|
-
go Verify a scenario in the browser
|
|
68
|
-
|
|
69
|
-
Run \`ranger <command> --help\` for details.`;
|
|
70
|
-
const PROFILE_HELP = `Usage: ranger profile <command> [options]
|
|
71
|
-
|
|
72
|
-
Commands:
|
|
73
|
-
add <profile-name> Add profile (options: --ci, --skip-auth)
|
|
74
|
-
use <profile-name> Switch active profile
|
|
75
|
-
ls List profiles
|
|
76
|
-
update <profile-name> Re-capture auth for a profile
|
|
77
|
-
encrypt-auth <profile> Encrypt auth.json for safe git storage
|
|
78
|
-
config <command> Profile config (set/get/list/unset)
|
|
79
|
-
|
|
80
|
-
Examples:
|
|
81
|
-
ranger profile add local
|
|
82
|
-
ranger profile encrypt-auth ci
|
|
83
|
-
ranger profile config set local headless true`;
|
|
84
|
-
const PROFILE_CONFIG_HELP = `Usage: ranger profile config <command>
|
|
85
|
-
|
|
86
|
-
Commands:
|
|
87
|
-
set <profile> <key> <value> Set a config value
|
|
88
|
-
get <profile> <key> Get a config value
|
|
89
|
-
list <profile> List all config for a profile
|
|
90
|
-
unset <profile> <key> Remove a config value
|
|
91
|
-
|
|
92
|
-
Keys:
|
|
93
|
-
userAgent Browser user agent string
|
|
94
|
-
headless Run browser in headless mode (true/false)
|
|
95
|
-
storageState Path to auth state file (e.g., ./auth.json)
|
|
96
|
-
header.<name> Custom HTTP header (e.g., header.X-Test-Mode)
|
|
97
|
-
|
|
98
|
-
Examples:
|
|
99
|
-
ranger profile config set ci userAgent "Mozilla/5.0 (CI Bot)"
|
|
100
|
-
ranger profile config set ci headless true
|
|
101
|
-
ranger profile config set ci header.Authorization '\${AUTH_TOKEN}'`;
|
|
102
|
-
function warnRenamed(oldUsage, newUsage) {
|
|
103
|
-
console.error(`\n${oldUsage} is now ${newUsage}\n`);
|
|
104
|
-
}
|
|
105
|
-
function argUsed(flag) {
|
|
106
|
-
return rawArgs.some((arg) => arg === flag || arg.startsWith(`${flag}=`));
|
|
107
|
-
}
|
|
108
|
-
function warnFlagRenamed(commandPrefix, oldFlag, newFlag) {
|
|
109
|
-
if (argUsed(oldFlag)) {
|
|
110
|
-
warnRenamed(`${commandPrefix} ${oldFlag}`, `${commandPrefix} ${newFlag}`);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
async function runGoCommand(argv, isLegacy = false) {
|
|
114
|
-
if (isLegacy) {
|
|
115
|
-
warnRenamed('ranger verify-feature', 'ranger go');
|
|
116
|
-
}
|
|
117
|
-
warnFlagRenamed('ranger go', '--env', '--profile');
|
|
118
|
-
warnFlagRenamed('ranger go', '--task', '--notes');
|
|
119
|
-
warnFlagRenamed('ranger go', '--item', '--scenario');
|
|
120
|
-
const result = await verifyFeature({
|
|
121
|
-
profile: argv.profile ??
|
|
122
|
-
argv.env,
|
|
123
|
-
notes: argv.notes ??
|
|
124
|
-
argv.task,
|
|
125
|
-
scenario: argv.scenario ??
|
|
126
|
-
argv.item,
|
|
127
|
-
startPath: argv['start-path'],
|
|
128
|
-
debugOutcome: argv['debug-outcome'],
|
|
129
|
-
debugAddressComments: argv['debug-address-comments'],
|
|
130
|
-
});
|
|
131
|
-
console.log('\n' + '='.repeat(60));
|
|
132
|
-
console.log(result.evaluation === 'verified'
|
|
133
|
-
? ' VERIFIED'
|
|
134
|
-
: result.evaluation === 'incomplete'
|
|
135
|
-
? ' INCOMPLETE'
|
|
136
|
-
: result.evaluation === 'partial'
|
|
137
|
-
? ' PARTIAL'
|
|
138
|
-
: result.evaluation === 'blocked'
|
|
139
|
-
? ' BLOCKED'
|
|
140
|
-
: ' FAILED');
|
|
141
|
-
console.log('='.repeat(60));
|
|
142
|
-
console.log(`Summary: ${result.summary}`);
|
|
143
|
-
console.log(`Evaluation: ${result.evaluation}`);
|
|
144
|
-
console.log(`Reason: ${result.evaluationReason}`);
|
|
145
|
-
if (result.issues?.length) {
|
|
146
|
-
console.log('\nIssues:');
|
|
147
|
-
result.issues.forEach((issue, i) => {
|
|
148
|
-
console.log(`\n${i + 1}. [${issue.severity}] ${issue.description}`);
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
process.exit(result.evaluation === 'verified' ? 0 : 1);
|
|
152
|
-
}
|
|
153
|
-
// Setup yargs CLI
|
|
154
|
-
yargs(process.argv.slice(2))
|
|
155
|
-
.scriptName('ranger')
|
|
156
|
-
.usage(TOP_LEVEL_HELP)
|
|
157
|
-
.version(getCurrentVersion())
|
|
158
|
-
.command('create <name>', 'Create a new feature review with scenarios', (yargs) => {
|
|
159
|
-
return yargs
|
|
160
|
-
.positional('name', {
|
|
161
|
-
type: 'string',
|
|
162
|
-
description: 'Feature review name',
|
|
163
|
-
demandOption: true,
|
|
164
|
-
})
|
|
165
|
-
.option('description', {
|
|
166
|
-
type: 'string',
|
|
167
|
-
alias: 'd',
|
|
168
|
-
description: 'Feature review description',
|
|
169
|
-
})
|
|
170
|
-
.option('scenario', {
|
|
171
|
-
type: 'array',
|
|
172
|
-
alias: 'c',
|
|
173
|
-
description: 'Scenarios (use multiple -c flags for multiple scenarios)',
|
|
174
|
-
})
|
|
175
|
-
.option('checklist', {
|
|
176
|
-
type: 'array',
|
|
177
|
-
hidden: true,
|
|
178
|
-
});
|
|
179
|
-
}, async (argv) => {
|
|
180
|
-
warnFlagRenamed('ranger create', '--checklist', '--scenario');
|
|
181
|
-
const scenarios = argv.scenario ||
|
|
182
|
-
argv.checklist;
|
|
183
|
-
await withTelemetry('create', () => featureCreate(argv.name, {
|
|
184
|
-
description: argv.description,
|
|
185
|
-
scenarios,
|
|
186
|
-
}));
|
|
187
|
-
})
|
|
188
|
-
.command('list', 'List all feature reviews', (yargs) => {
|
|
189
|
-
return yargs
|
|
190
|
-
.option('current-branch', {
|
|
191
|
-
type: 'boolean',
|
|
192
|
-
description: 'Filter to feature reviews for current git branch',
|
|
193
|
-
})
|
|
194
|
-
.option('limit', {
|
|
195
|
-
type: 'number',
|
|
196
|
-
alias: 'l',
|
|
197
|
-
description: 'Maximum number of feature reviews to return',
|
|
198
|
-
default: 10,
|
|
199
|
-
})
|
|
200
|
-
.option('offset', {
|
|
201
|
-
type: 'number',
|
|
202
|
-
alias: 'o',
|
|
203
|
-
description: 'Number of feature reviews to skip',
|
|
204
|
-
default: 0,
|
|
205
|
-
})
|
|
206
|
-
.option('include-deleted', {
|
|
207
|
-
type: 'boolean',
|
|
208
|
-
alias: 'd',
|
|
209
|
-
description: 'Include soft-deleted feature reviews',
|
|
210
|
-
default: false,
|
|
211
|
-
});
|
|
212
|
-
}, async (argv) => {
|
|
213
|
-
await withTelemetry('list', () => featureList({
|
|
214
|
-
currentBranch: argv['current-branch'],
|
|
215
|
-
limit: argv.limit,
|
|
216
|
-
offset: argv.offset,
|
|
217
|
-
includeDeleted: argv['include-deleted'],
|
|
218
|
-
}));
|
|
219
|
-
})
|
|
220
|
-
.command('show [id]', 'Show feature review details (uses active feature review if no id)', (yargs) => {
|
|
221
|
-
return yargs.positional('id', {
|
|
222
|
-
type: 'string',
|
|
223
|
-
description: 'Feature review ID',
|
|
224
|
-
});
|
|
225
|
-
}, async (argv) => {
|
|
226
|
-
await withTelemetry('show', () => featureShow(argv.id));
|
|
227
|
-
})
|
|
228
|
-
.command('resume [id]', 'Find and use feature review matching current git context', (yargs) => {
|
|
229
|
-
return yargs.positional('id', {
|
|
230
|
-
type: 'string',
|
|
231
|
-
description: 'Feature review ID (optional - bypasses search/prompt)',
|
|
232
|
-
});
|
|
233
|
-
}, async (argv) => {
|
|
234
|
-
await withTelemetry('resume', () => featureResume(argv.id));
|
|
235
|
-
})
|
|
236
|
-
.command('add-scenario <description>', 'Add a scenario to the active feature review', (yargs) => {
|
|
237
|
-
return yargs
|
|
238
|
-
.positional('description', {
|
|
239
|
-
type: 'string',
|
|
240
|
-
description: 'Scenario description',
|
|
241
|
-
demandOption: true,
|
|
242
|
-
})
|
|
243
|
-
.option('id', {
|
|
244
|
-
type: 'string',
|
|
245
|
-
description: 'Feature review ID (uses active feature review if not provided)',
|
|
246
|
-
});
|
|
247
|
-
}, async (argv) => {
|
|
248
|
-
await withTelemetry('add-scenario', () => featureAddScenario(argv.description, argv.id));
|
|
249
|
-
})
|
|
250
|
-
.command('edit-scenario <description>', 'Edit a scenario description on the active feature review', (yargs) => {
|
|
251
|
-
return yargs
|
|
252
|
-
.positional('description', {
|
|
253
|
-
type: 'string',
|
|
254
|
-
description: 'New scenario description',
|
|
255
|
-
demandOption: true,
|
|
256
|
-
})
|
|
257
|
-
.option('scenario', {
|
|
258
|
-
type: 'number',
|
|
259
|
-
description: 'Scenario number to edit (1-based)',
|
|
260
|
-
demandOption: true,
|
|
261
|
-
})
|
|
262
|
-
.option('id', {
|
|
263
|
-
type: 'string',
|
|
264
|
-
description: 'Feature review ID (uses active feature review if not provided)',
|
|
265
|
-
});
|
|
266
|
-
}, async (argv) => {
|
|
267
|
-
await withTelemetry('edit-scenario', () => featureEditScenario(argv.description, {
|
|
268
|
-
id: argv.id,
|
|
269
|
-
scenario: argv.scenario,
|
|
270
|
-
}));
|
|
271
|
-
})
|
|
272
|
-
.command('get-review [id]', 'Show reviewer feedback (comments) for all scenarios', (yargs) => {
|
|
273
|
-
return yargs.positional('id', {
|
|
274
|
-
type: 'string',
|
|
275
|
-
description: 'Feature review ID (uses active feature review if not provided)',
|
|
276
|
-
});
|
|
277
|
-
}, async (argv) => {
|
|
278
|
-
await withTelemetry('get-review', () => featureGetReview(argv.id));
|
|
279
|
-
})
|
|
280
|
-
.command('delete [id]', 'Soft delete a feature review (uses active feature review if no id)', (yargs) => {
|
|
281
|
-
return yargs.positional('id', {
|
|
282
|
-
type: 'string',
|
|
283
|
-
description: 'Feature review ID',
|
|
284
|
-
});
|
|
285
|
-
}, async (argv) => {
|
|
286
|
-
await withTelemetry('delete', () => featureDelete(argv.id));
|
|
287
|
-
})
|
|
288
|
-
.command('restore <id>', 'Restore a soft-deleted feature review', (yargs) => {
|
|
289
|
-
return yargs.positional('id', {
|
|
290
|
-
type: 'string',
|
|
291
|
-
description: 'Feature review ID to restore',
|
|
292
|
-
demandOption: true,
|
|
293
|
-
});
|
|
294
|
-
}, async (argv) => {
|
|
295
|
-
await withTelemetry('restore', () => featureRestore(argv.id));
|
|
296
|
-
})
|
|
297
|
-
.command('setup [token]', 'Initialize Ranger in your project', (yargs) => {
|
|
298
|
-
return yargs
|
|
299
|
-
.positional('token', {
|
|
300
|
-
type: 'string',
|
|
301
|
-
description: 'Ranger API token (omit to log in via browser)',
|
|
302
|
-
})
|
|
303
|
-
.option('skip-chromium', {
|
|
304
|
-
type: 'boolean',
|
|
305
|
-
description: 'Skip Chromium browser check and installation',
|
|
306
|
-
default: false,
|
|
307
|
-
});
|
|
308
|
-
}, async (argv) => {
|
|
309
|
-
await withTelemetry('start', (telemetry) => start(argv.token, {
|
|
310
|
-
skipChromium: argv['skip-chromium'],
|
|
311
|
-
}, telemetry));
|
|
312
|
-
})
|
|
313
|
-
.command('setup-ci <token>', 'Set up Ranger for CI (non-interactive)', (yargs) => {
|
|
314
|
-
return yargs
|
|
315
|
-
.positional('token', {
|
|
316
|
-
type: 'string',
|
|
317
|
-
description: 'Ranger API token',
|
|
318
|
-
demandOption: true,
|
|
319
|
-
})
|
|
320
|
-
.option('profile', {
|
|
321
|
-
type: 'string',
|
|
322
|
-
description: 'CI profile name (auto-detected if only one exists)',
|
|
323
|
-
})
|
|
324
|
-
.option('base-url', {
|
|
325
|
-
type: 'string',
|
|
326
|
-
description: 'Base URL for the app (creates/updates profile settings)',
|
|
327
|
-
})
|
|
328
|
-
.option('skip-chromium', {
|
|
329
|
-
type: 'boolean',
|
|
330
|
-
description: 'Skip Chromium browser installation',
|
|
331
|
-
default: false,
|
|
332
|
-
});
|
|
333
|
-
}, async (argv) => {
|
|
334
|
-
await withTelemetry('setup-ci', (telemetry) => setupCi(argv.token, {
|
|
335
|
-
profile: argv.profile,
|
|
336
|
-
baseUrl: argv['base-url'],
|
|
337
|
-
skipChromium: argv['skip-chromium'],
|
|
338
|
-
}, telemetry));
|
|
339
|
-
})
|
|
340
|
-
.command('login', 'Log in to Ranger via browser (re-authenticate without full setup)', () => { }, async () => {
|
|
341
|
-
await withTelemetry('login', () => login());
|
|
342
|
-
})
|
|
343
|
-
.command('skillup', 'Install Ranger skills for Claude Code', () => { }, async () => {
|
|
344
|
-
await withTelemetry('skillup', () => skillup());
|
|
345
|
-
})
|
|
346
|
-
.command('clean', 'Remove all Ranger artifacts from the project', () => { }, async () => {
|
|
347
|
-
await withTelemetry('clean', () => clean());
|
|
348
|
-
})
|
|
349
|
-
.command('profile', 'Manage profiles', (yargs) => {
|
|
350
|
-
return yargs
|
|
351
|
-
.usage(PROFILE_HELP)
|
|
352
|
-
.command('add <profile-name>', 'Add profile configuration', (yargs) => {
|
|
353
|
-
return yargs
|
|
354
|
-
.positional('profile-name', {
|
|
355
|
-
type: 'string',
|
|
356
|
-
description: 'Name of the profile (e.g., local, staging, prod)',
|
|
357
|
-
demandOption: true,
|
|
358
|
-
})
|
|
359
|
-
.option('ci', {
|
|
360
|
-
type: 'boolean',
|
|
361
|
-
description: 'Create CI profile (encrypted auth, committed to git)',
|
|
362
|
-
default: false,
|
|
363
|
-
})
|
|
364
|
-
.option('skip-auth', {
|
|
365
|
-
type: 'boolean',
|
|
366
|
-
description: 'Skip browser authentication (just save URL and settings)',
|
|
367
|
-
default: false,
|
|
368
|
-
});
|
|
369
|
-
}, async (argv) => {
|
|
370
|
-
await withTelemetry('profile add', (telemetry) => addEnv(argv['profile-name'], {
|
|
371
|
-
ci: argv.ci,
|
|
372
|
-
skipAuth: argv['skip-auth'],
|
|
373
|
-
}, telemetry));
|
|
374
|
-
})
|
|
375
|
-
.command('use <profile-name>', 'Switch to using a specific profile', (yargs) => {
|
|
376
|
-
return yargs.positional('profile-name', {
|
|
377
|
-
type: 'string',
|
|
378
|
-
description: 'Name of the profile',
|
|
379
|
-
demandOption: true,
|
|
380
|
-
});
|
|
381
|
-
}, async (argv) => {
|
|
382
|
-
await withTelemetry('profile use', () => useEnv(argv['profile-name']));
|
|
383
|
-
})
|
|
384
|
-
.command('encrypt-auth <profile>', 'Encrypt auth.json for a profile (allows committing to git)', (yargs) => {
|
|
385
|
-
return yargs.positional('profile', {
|
|
386
|
-
type: 'string',
|
|
387
|
-
description: 'Profile name',
|
|
388
|
-
demandOption: true,
|
|
389
|
-
});
|
|
390
|
-
}, async (argv) => {
|
|
391
|
-
await withTelemetry('profile encrypt-auth', () => authEncrypt(argv.profile));
|
|
392
|
-
})
|
|
393
|
-
.command('ls', 'List all profiles', () => { }, async () => {
|
|
394
|
-
await withTelemetry('profile ls', () => envList());
|
|
395
|
-
})
|
|
396
|
-
.command('update <profile-name>', 'Update authentication for an existing profile', (yargs) => {
|
|
397
|
-
return yargs.positional('profile-name', {
|
|
398
|
-
type: 'string',
|
|
399
|
-
description: 'Name of the profile to update',
|
|
400
|
-
demandOption: true,
|
|
401
|
-
});
|
|
402
|
-
}, async (argv) => {
|
|
403
|
-
await withTelemetry('profile update', (telemetry) => updateEnv(argv['profile-name'], telemetry));
|
|
404
|
-
})
|
|
405
|
-
.command('config', 'Manage profile configuration', (yargs) => {
|
|
406
|
-
return yargs
|
|
407
|
-
.usage(PROFILE_CONFIG_HELP)
|
|
408
|
-
.command('set <profile> <key> <value>', 'Set a config value', (yargs) => {
|
|
409
|
-
return yargs
|
|
410
|
-
.positional('profile', {
|
|
411
|
-
type: 'string',
|
|
412
|
-
description: 'Profile name',
|
|
413
|
-
demandOption: true,
|
|
414
|
-
})
|
|
415
|
-
.positional('key', {
|
|
416
|
-
type: 'string',
|
|
417
|
-
description: 'Config key (e.g., userAgent, header.X-Custom)',
|
|
418
|
-
demandOption: true,
|
|
419
|
-
})
|
|
420
|
-
.positional('value', {
|
|
421
|
-
type: 'string',
|
|
422
|
-
description: 'Config value',
|
|
423
|
-
demandOption: true,
|
|
424
|
-
});
|
|
425
|
-
}, async (argv) => {
|
|
426
|
-
await withTelemetry('profile config set', () => configSet(argv.profile, argv.key, argv.value));
|
|
427
|
-
})
|
|
428
|
-
.command('get <profile> <key>', 'Get a config value', (yargs) => {
|
|
429
|
-
return yargs
|
|
430
|
-
.positional('profile', {
|
|
431
|
-
type: 'string',
|
|
432
|
-
description: 'Profile name',
|
|
433
|
-
demandOption: true,
|
|
434
|
-
})
|
|
435
|
-
.positional('key', {
|
|
436
|
-
type: 'string',
|
|
437
|
-
description: 'Config key',
|
|
438
|
-
demandOption: true,
|
|
439
|
-
});
|
|
440
|
-
}, async (argv) => {
|
|
441
|
-
await withTelemetry('profile config get', () => configGet(argv.profile, argv.key));
|
|
442
|
-
})
|
|
443
|
-
.command('list <profile>', 'List all config for a profile', (yargs) => {
|
|
444
|
-
return yargs.positional('profile', {
|
|
445
|
-
type: 'string',
|
|
446
|
-
description: 'Profile name',
|
|
447
|
-
demandOption: true,
|
|
448
|
-
});
|
|
449
|
-
}, async (argv) => {
|
|
450
|
-
await withTelemetry('profile config list', () => configList(argv.profile));
|
|
451
|
-
})
|
|
452
|
-
.command('unset <profile> <key>', 'Remove a config value', (yargs) => {
|
|
453
|
-
return yargs
|
|
454
|
-
.positional('profile', {
|
|
455
|
-
type: 'string',
|
|
456
|
-
description: 'Profile name',
|
|
457
|
-
demandOption: true,
|
|
458
|
-
})
|
|
459
|
-
.positional('key', {
|
|
460
|
-
type: 'string',
|
|
461
|
-
description: 'Config key to remove',
|
|
462
|
-
demandOption: true,
|
|
463
|
-
});
|
|
464
|
-
}, async (argv) => {
|
|
465
|
-
await withTelemetry('profile config unset', () => configUnset(argv.profile, argv.key));
|
|
466
|
-
})
|
|
467
|
-
.demandCommand(1, 'You must specify a profile config subcommand');
|
|
468
|
-
})
|
|
469
|
-
.demandCommand(1, 'You must specify a profile subcommand');
|
|
470
|
-
})
|
|
471
|
-
.command('status', 'Show Ranger status (version, skills, profiles)', () => { }, async () => {
|
|
472
|
-
await withTelemetry('status', () => status());
|
|
473
|
-
})
|
|
474
|
-
.command('update', 'Update Ranger CLI to the latest version', () => { }, async () => {
|
|
475
|
-
await withTelemetry('update', () => update());
|
|
476
|
-
})
|
|
477
|
-
.command('go', 'Verify a scenario in the browser (requires active feature review)', (yargs) => {
|
|
478
|
-
return yargs
|
|
479
|
-
.option('profile', {
|
|
480
|
-
type: 'string',
|
|
481
|
-
description: 'Profile to use (defaults to active profile)',
|
|
482
|
-
})
|
|
483
|
-
.option('notes', {
|
|
484
|
-
type: 'string',
|
|
485
|
-
description: 'Notes for verification (defaults to scenario description)',
|
|
486
|
-
})
|
|
487
|
-
.option('scenario', {
|
|
488
|
-
type: 'number',
|
|
489
|
-
description: 'Scenario index (1-based)',
|
|
490
|
-
})
|
|
491
|
-
.option('start-path', {
|
|
492
|
-
type: 'string',
|
|
493
|
-
description: 'Path to start on (appended to base URL, e.g., /dashboard)',
|
|
494
|
-
})
|
|
495
|
-
.option('debug-outcome', {
|
|
496
|
-
type: 'string',
|
|
497
|
-
hidden: true,
|
|
498
|
-
choices: [
|
|
499
|
-
'verified',
|
|
500
|
-
'partial',
|
|
501
|
-
'blocked',
|
|
502
|
-
'failed',
|
|
503
|
-
'incomplete',
|
|
504
|
-
],
|
|
505
|
-
})
|
|
506
|
-
.option('debug-address-comments', {
|
|
507
|
-
type: 'boolean',
|
|
508
|
-
hidden: true,
|
|
509
|
-
})
|
|
510
|
-
.option('env', {
|
|
511
|
-
type: 'string',
|
|
512
|
-
hidden: true,
|
|
513
|
-
})
|
|
514
|
-
.option('task', {
|
|
515
|
-
type: 'string',
|
|
516
|
-
hidden: true,
|
|
517
|
-
})
|
|
518
|
-
.option('item', {
|
|
519
|
-
type: 'number',
|
|
520
|
-
hidden: true,
|
|
521
|
-
});
|
|
522
|
-
}, async (argv) => {
|
|
523
|
-
await runGoCommand(argv);
|
|
524
|
-
})
|
|
525
|
-
// Legacy command shims (hidden from help)
|
|
526
|
-
.command('auth', false, (yargs) => {
|
|
527
|
-
return yargs
|
|
528
|
-
.command('encrypt <profile>', false, (yargs) => {
|
|
529
|
-
return yargs.positional('profile', {
|
|
530
|
-
type: 'string',
|
|
531
|
-
description: 'Profile name',
|
|
532
|
-
demandOption: true,
|
|
533
|
-
});
|
|
534
|
-
}, async (argv) => {
|
|
535
|
-
warnRenamed('ranger auth encrypt', 'ranger profile encrypt-auth');
|
|
536
|
-
await authEncrypt(argv.profile);
|
|
537
|
-
})
|
|
538
|
-
.demandCommand(1, 'You must specify an auth subcommand');
|
|
539
|
-
}, () => { })
|
|
540
|
-
.command('start [token]', false, (yargs) => {
|
|
541
|
-
return yargs
|
|
542
|
-
.positional('token', {
|
|
543
|
-
type: 'string',
|
|
544
|
-
description: 'Ranger API token (omit to log in via browser)',
|
|
545
|
-
})
|
|
546
|
-
.option('skip-chromium', {
|
|
547
|
-
type: 'boolean',
|
|
548
|
-
description: 'Skip Chromium browser check and installation',
|
|
549
|
-
default: false,
|
|
550
|
-
});
|
|
551
|
-
}, async (argv) => {
|
|
552
|
-
warnRenamed('ranger start', 'ranger setup');
|
|
553
|
-
await withTelemetry('start', (telemetry) => start(argv.token, {
|
|
554
|
-
skipChromium: argv['skip-chromium'],
|
|
555
|
-
}, telemetry));
|
|
556
|
-
})
|
|
557
|
-
.command('verify-feature', false, (yargs) => {
|
|
558
|
-
return yargs
|
|
559
|
-
.option('env', {
|
|
560
|
-
type: 'string',
|
|
561
|
-
description: 'Profile to use (defaults to active profile)',
|
|
562
|
-
})
|
|
563
|
-
.option('task', {
|
|
564
|
-
type: 'string',
|
|
565
|
-
description: 'Task description (defaults to scenario description)',
|
|
566
|
-
})
|
|
567
|
-
.option('item', {
|
|
568
|
-
type: 'number',
|
|
569
|
-
description: 'Scenario index (1-based)',
|
|
570
|
-
})
|
|
571
|
-
.option('profile', {
|
|
572
|
-
type: 'string',
|
|
573
|
-
hidden: true,
|
|
574
|
-
})
|
|
575
|
-
.option('notes', {
|
|
576
|
-
type: 'string',
|
|
577
|
-
hidden: true,
|
|
578
|
-
})
|
|
579
|
-
.option('scenario', {
|
|
580
|
-
type: 'number',
|
|
581
|
-
hidden: true,
|
|
582
|
-
})
|
|
583
|
-
.option('start-path', {
|
|
584
|
-
type: 'string',
|
|
585
|
-
description: 'Path to start on (appended to base URL, e.g., /dashboard)',
|
|
586
|
-
})
|
|
587
|
-
.option('debug-outcome', {
|
|
588
|
-
type: 'string',
|
|
589
|
-
hidden: true,
|
|
590
|
-
choices: [
|
|
591
|
-
'verified',
|
|
592
|
-
'partial',
|
|
593
|
-
'blocked',
|
|
594
|
-
'failed',
|
|
595
|
-
'incomplete',
|
|
596
|
-
],
|
|
597
|
-
});
|
|
598
|
-
}, async (argv) => {
|
|
599
|
-
await runGoCommand(argv, true);
|
|
600
|
-
})
|
|
601
|
-
.command('add env <env-name>', false, (yargs) => {
|
|
602
|
-
return yargs
|
|
603
|
-
.positional('env-name', {
|
|
604
|
-
type: 'string',
|
|
605
|
-
description: 'Name of the environment (e.g., local, staging, prod)',
|
|
606
|
-
demandOption: true,
|
|
607
|
-
})
|
|
608
|
-
.option('ci', {
|
|
609
|
-
type: 'boolean',
|
|
610
|
-
description: 'Create CI environment (encrypted auth, committed to git)',
|
|
611
|
-
default: false,
|
|
612
|
-
})
|
|
613
|
-
.option('skip-auth', {
|
|
614
|
-
type: 'boolean',
|
|
615
|
-
description: 'Skip browser authentication (just save URL and settings)',
|
|
616
|
-
default: false,
|
|
617
|
-
});
|
|
618
|
-
}, async (argv) => {
|
|
619
|
-
warnRenamed('ranger add env', 'ranger profile add');
|
|
620
|
-
await withTelemetry('add env', (telemetry) => addEnv(argv['env-name'], {
|
|
621
|
-
ci: argv.ci,
|
|
622
|
-
skipAuth: argv['skip-auth'],
|
|
623
|
-
}, telemetry));
|
|
624
|
-
})
|
|
625
|
-
.command('use <env-name>', false, (yargs) => {
|
|
626
|
-
return yargs.positional('env-name', {
|
|
627
|
-
type: 'string',
|
|
628
|
-
description: 'Name of the environment',
|
|
629
|
-
demandOption: true,
|
|
630
|
-
});
|
|
631
|
-
}, async (argv) => {
|
|
632
|
-
warnRenamed('ranger use', 'ranger profile use');
|
|
633
|
-
await withTelemetry('use', () => useEnv(argv['env-name']));
|
|
634
|
-
})
|
|
635
|
-
.command('config', false, (yargs) => {
|
|
636
|
-
return yargs
|
|
637
|
-
.command('set <env> <key> <value>', false, (yargs) => {
|
|
638
|
-
return yargs
|
|
639
|
-
.positional('env', {
|
|
640
|
-
type: 'string',
|
|
641
|
-
description: 'Environment name',
|
|
642
|
-
demandOption: true,
|
|
643
|
-
})
|
|
644
|
-
.positional('key', {
|
|
645
|
-
type: 'string',
|
|
646
|
-
description: 'Config key (e.g., userAgent, header.X-Custom)',
|
|
647
|
-
demandOption: true,
|
|
648
|
-
})
|
|
649
|
-
.positional('value', {
|
|
650
|
-
type: 'string',
|
|
651
|
-
description: 'Config value',
|
|
652
|
-
demandOption: true,
|
|
653
|
-
});
|
|
654
|
-
}, async (argv) => {
|
|
655
|
-
warnRenamed('ranger config set', 'ranger profile config set');
|
|
656
|
-
await withTelemetry('config set', () => configSet(argv.env, argv.key, argv.value));
|
|
657
|
-
})
|
|
658
|
-
.command('get <env> <key>', false, (yargs) => {
|
|
659
|
-
return yargs
|
|
660
|
-
.positional('env', {
|
|
661
|
-
type: 'string',
|
|
662
|
-
description: 'Environment name',
|
|
663
|
-
demandOption: true,
|
|
664
|
-
})
|
|
665
|
-
.positional('key', {
|
|
666
|
-
type: 'string',
|
|
667
|
-
description: 'Config key',
|
|
668
|
-
demandOption: true,
|
|
669
|
-
});
|
|
670
|
-
}, async (argv) => {
|
|
671
|
-
warnRenamed('ranger config get', 'ranger profile config get');
|
|
672
|
-
await withTelemetry('config get', () => configGet(argv.env, argv.key));
|
|
673
|
-
})
|
|
674
|
-
.command('list <env>', false, (yargs) => {
|
|
675
|
-
return yargs.positional('env', {
|
|
676
|
-
type: 'string',
|
|
677
|
-
description: 'Environment name',
|
|
678
|
-
demandOption: true,
|
|
679
|
-
});
|
|
680
|
-
}, async (argv) => {
|
|
681
|
-
warnRenamed('ranger config list', 'ranger profile config list');
|
|
682
|
-
await withTelemetry('config list', () => configList(argv.env));
|
|
683
|
-
})
|
|
684
|
-
.command('unset <env> <key>', false, (yargs) => {
|
|
685
|
-
return yargs
|
|
686
|
-
.positional('env', {
|
|
687
|
-
type: 'string',
|
|
688
|
-
description: 'Environment name',
|
|
689
|
-
demandOption: true,
|
|
690
|
-
})
|
|
691
|
-
.positional('key', {
|
|
692
|
-
type: 'string',
|
|
693
|
-
description: 'Config key to remove',
|
|
694
|
-
demandOption: true,
|
|
695
|
-
});
|
|
696
|
-
}, async (argv) => {
|
|
697
|
-
warnRenamed('ranger config unset', 'ranger profile config unset');
|
|
698
|
-
await withTelemetry('config unset', () => configUnset(argv.env, argv.key));
|
|
699
|
-
})
|
|
700
|
-
.demandCommand(1, 'You must specify a config subcommand');
|
|
701
|
-
})
|
|
702
|
-
.command('env', false, (yargs) => {
|
|
703
|
-
return yargs
|
|
704
|
-
.command('ls', false, () => { }, async () => {
|
|
705
|
-
warnRenamed('ranger env ls', 'ranger profile ls');
|
|
706
|
-
await withTelemetry('env list', () => envList());
|
|
707
|
-
})
|
|
708
|
-
.command('update <env-name>', false, (yargs) => {
|
|
709
|
-
return yargs.positional('env-name', {
|
|
710
|
-
type: 'string',
|
|
711
|
-
description: 'Name of the environment to update',
|
|
712
|
-
demandOption: true,
|
|
713
|
-
});
|
|
714
|
-
}, async (argv) => {
|
|
715
|
-
warnRenamed('ranger env update', 'ranger profile update');
|
|
716
|
-
await withTelemetry('env update', (telemetry) => updateEnv(argv['env-name'], telemetry));
|
|
717
|
-
})
|
|
718
|
-
.demandCommand(1, 'You must specify an env subcommand');
|
|
719
|
-
})
|
|
720
|
-
.command('feature', false, (yargs) => {
|
|
721
|
-
return yargs
|
|
722
|
-
.command('create <name>', false, (yargs) => {
|
|
723
|
-
return yargs
|
|
724
|
-
.positional('name', {
|
|
725
|
-
type: 'string',
|
|
726
|
-
description: 'Feature review name',
|
|
727
|
-
demandOption: true,
|
|
728
|
-
})
|
|
729
|
-
.option('description', {
|
|
730
|
-
type: 'string',
|
|
731
|
-
alias: 'd',
|
|
732
|
-
description: 'Feature review description',
|
|
733
|
-
})
|
|
734
|
-
.option('checklist', {
|
|
735
|
-
type: 'array',
|
|
736
|
-
alias: 'c',
|
|
737
|
-
description: 'Scenarios (use multiple -c flags for multiple scenarios)',
|
|
738
|
-
})
|
|
739
|
-
.option('scenario', {
|
|
740
|
-
type: 'array',
|
|
741
|
-
hidden: true,
|
|
742
|
-
});
|
|
743
|
-
}, async (argv) => {
|
|
744
|
-
warnRenamed('ranger feature create', 'ranger create');
|
|
745
|
-
warnFlagRenamed('ranger create', '--checklist', '--scenario');
|
|
746
|
-
const scenarios = argv.scenario ||
|
|
747
|
-
argv.checklist;
|
|
748
|
-
await withTelemetry('feature create', () => featureCreate(argv.name, {
|
|
749
|
-
description: argv.description,
|
|
750
|
-
scenarios,
|
|
751
|
-
}));
|
|
752
|
-
})
|
|
753
|
-
.command('list', false, (yargs) => {
|
|
754
|
-
return yargs
|
|
755
|
-
.option('current-branch', {
|
|
756
|
-
type: 'boolean',
|
|
757
|
-
description: 'Filter to feature reviews for current git branch',
|
|
758
|
-
})
|
|
759
|
-
.option('limit', {
|
|
760
|
-
type: 'number',
|
|
761
|
-
alias: 'l',
|
|
762
|
-
description: 'Maximum number of feature reviews to return',
|
|
763
|
-
default: 10,
|
|
764
|
-
})
|
|
765
|
-
.option('offset', {
|
|
766
|
-
type: 'number',
|
|
767
|
-
alias: 'o',
|
|
768
|
-
description: 'Number of feature reviews to skip',
|
|
769
|
-
default: 0,
|
|
770
|
-
})
|
|
771
|
-
.option('include-deleted', {
|
|
772
|
-
type: 'boolean',
|
|
773
|
-
alias: 'd',
|
|
774
|
-
description: 'Include soft-deleted feature reviews',
|
|
775
|
-
default: false,
|
|
776
|
-
});
|
|
777
|
-
}, async (argv) => {
|
|
778
|
-
warnRenamed('ranger feature list', 'ranger list');
|
|
779
|
-
await withTelemetry('feature list', () => featureList({
|
|
780
|
-
currentBranch: argv['current-branch'],
|
|
781
|
-
limit: argv.limit,
|
|
782
|
-
offset: argv.offset,
|
|
783
|
-
includeDeleted: argv['include-deleted'],
|
|
784
|
-
}));
|
|
785
|
-
})
|
|
786
|
-
.command('show [id]', false, (yargs) => {
|
|
787
|
-
return yargs.positional('id', {
|
|
788
|
-
type: 'string',
|
|
789
|
-
description: 'Feature review ID',
|
|
790
|
-
});
|
|
791
|
-
}, async (argv) => {
|
|
792
|
-
warnRenamed('ranger feature show', 'ranger show');
|
|
793
|
-
await withTelemetry('feature show', () => featureShow(argv.id));
|
|
794
|
-
})
|
|
795
|
-
.command('resume [id]', false, (yargs) => {
|
|
796
|
-
return yargs.positional('id', {
|
|
797
|
-
type: 'string',
|
|
798
|
-
description: 'Feature review ID (optional - bypasses search/prompt)',
|
|
799
|
-
});
|
|
800
|
-
}, async (argv) => {
|
|
801
|
-
warnRenamed('ranger feature resume', 'ranger resume');
|
|
802
|
-
await withTelemetry('feature resume', () => featureResume(argv.id));
|
|
803
|
-
})
|
|
804
|
-
.command('add-checklist-item <description>', false, (yargs) => {
|
|
805
|
-
return yargs
|
|
806
|
-
.positional('description', {
|
|
807
|
-
type: 'string',
|
|
808
|
-
description: 'Scenario description',
|
|
809
|
-
demandOption: true,
|
|
810
|
-
})
|
|
811
|
-
.option('id', {
|
|
812
|
-
type: 'string',
|
|
813
|
-
description: 'Feature review ID (uses active feature review if not provided)',
|
|
814
|
-
});
|
|
815
|
-
}, async (argv) => {
|
|
816
|
-
warnRenamed('ranger feature add-checklist-item', 'ranger add-scenario');
|
|
817
|
-
await withTelemetry('feature add-checklist-item', () => featureAddScenario(argv.description, argv.id));
|
|
818
|
-
})
|
|
819
|
-
.command('get-feedback [id]', false, (yargs) => {
|
|
820
|
-
return yargs.positional('id', {
|
|
821
|
-
type: 'string',
|
|
822
|
-
description: 'Feature review ID (uses active feature review if not provided)',
|
|
823
|
-
});
|
|
824
|
-
}, async (argv) => {
|
|
825
|
-
warnRenamed('ranger feature get-feedback', 'ranger get-review');
|
|
826
|
-
await withTelemetry('feature get-feedback', () => featureGetReview(argv.id));
|
|
827
|
-
})
|
|
828
|
-
.command('delete [id]', false, (yargs) => {
|
|
829
|
-
return yargs.positional('id', {
|
|
830
|
-
type: 'string',
|
|
831
|
-
description: 'Feature review ID',
|
|
832
|
-
});
|
|
833
|
-
}, async (argv) => {
|
|
834
|
-
warnRenamed('ranger feature delete', 'ranger delete');
|
|
835
|
-
await withTelemetry('feature delete', () => featureDelete(argv.id));
|
|
836
|
-
})
|
|
837
|
-
.command('restore <id>', false, (yargs) => {
|
|
838
|
-
return yargs.positional('id', {
|
|
839
|
-
type: 'string',
|
|
840
|
-
description: 'Feature review ID to restore',
|
|
841
|
-
demandOption: true,
|
|
842
|
-
});
|
|
843
|
-
}, async (argv) => {
|
|
844
|
-
warnRenamed('ranger feature restore', 'ranger restore');
|
|
845
|
-
await withTelemetry('feature restore', () => featureRestore(argv.id));
|
|
846
|
-
})
|
|
847
|
-
.demandCommand(1, 'You must specify a feature review subcommand');
|
|
848
|
-
})
|
|
849
|
-
// Unified hook command (hidden from help - invoked automatically by Claude Code / OpenCode plugins)
|
|
850
|
-
.command('hook', false, (yargs) => {
|
|
851
|
-
return yargs
|
|
852
|
-
.command('enable', 'Enable Ranger hooks for this session', (yargs) => {
|
|
853
|
-
return yargs.option('session-id', {
|
|
854
|
-
type: 'string',
|
|
855
|
-
description: 'Session ID (for non-Claude integrations like OpenCode)',
|
|
856
|
-
});
|
|
857
|
-
}, async (argv) => {
|
|
858
|
-
await hook('enable', argv['session-id']);
|
|
859
|
-
})
|
|
860
|
-
.command('disable', 'Disable Ranger hooks for this session', (yargs) => {
|
|
861
|
-
return yargs.option('session-id', {
|
|
862
|
-
type: 'string',
|
|
863
|
-
description: 'Session ID (for non-Claude integrations like OpenCode)',
|
|
864
|
-
});
|
|
865
|
-
}, async (argv) => {
|
|
866
|
-
await hook('disable', argv['session-id']);
|
|
867
|
-
})
|
|
868
|
-
.option('name', {
|
|
869
|
-
type: 'string',
|
|
870
|
-
description: 'Hook name (session-start, pre-compact, post-edit, etc.)',
|
|
871
|
-
})
|
|
872
|
-
.option('session-id', {
|
|
873
|
-
type: 'string',
|
|
874
|
-
description: 'Session ID (for non-Claude integrations like OpenCode)',
|
|
875
|
-
});
|
|
876
|
-
}, async (argv) => {
|
|
877
|
-
if (argv.name) {
|
|
878
|
-
await hook(argv.name, argv['session-id']);
|
|
879
|
-
}
|
|
880
|
-
})
|
|
881
|
-
.demandCommand(1, 'You must specify a command')
|
|
882
|
-
.strictCommands()
|
|
883
|
-
.fail(async (msg, err, yargs) => {
|
|
884
|
-
const rawCommand = sanitizeArgs(process.argv.slice(2));
|
|
885
|
-
const errorType = getErrorType(msg, err);
|
|
886
|
-
if (msg && msg.includes('Unknown command')) {
|
|
887
|
-
const command = process.argv[2];
|
|
888
|
-
console.error(`\nUnknown command: ${command}`);
|
|
889
|
-
console.error('Run "ranger --help" to see available commands.\n');
|
|
890
|
-
}
|
|
891
|
-
else if (msg) {
|
|
892
|
-
console.error(`\n${msg}\n`);
|
|
893
|
-
}
|
|
894
|
-
else if (err) {
|
|
895
|
-
console.error(`\nError: ${err.message}\n`);
|
|
896
|
-
}
|
|
897
|
-
await logDesirePath({
|
|
898
|
-
rawCommand,
|
|
899
|
-
errorMessage: msg || err?.message,
|
|
900
|
-
errorType,
|
|
901
|
-
});
|
|
902
|
-
// Report to telemetry if there's an active collector
|
|
903
|
-
const collector = getCurrentCollector();
|
|
904
|
-
if (collector) {
|
|
905
|
-
await collector.trackCommandError(err || new Error(msg || 'Unknown error'));
|
|
906
|
-
}
|
|
907
|
-
process.exit(1);
|
|
908
|
-
})
|
|
909
|
-
.epilogue('Documentation:\n' +
|
|
910
|
-
' https://docs.ranger.net\n' +
|
|
911
|
-
' https://docs.ranger.net/llms.txt (for LLMs)')
|
|
912
|
-
.help()
|
|
913
|
-
.alias('help', 'h')
|
|
914
|
-
.parse();
|
|
915
|
-
//# sourceMappingURL=cli.js.map
|
|
2
|
+
const _0xb0024=_0x5975;(function(_0x306fba,_0x48645d){const _0x5e9b13=_0x5975,_0x3aab0e=_0x306fba();while(!![]){try{const _0x2fc627=parseInt(_0x5e9b13(0xe5))/0x1*(-parseInt(_0x5e9b13(0x14e))/0x2)+-parseInt(_0x5e9b13(0x1c4))/0x3+parseInt(_0x5e9b13(0x13f))/0x4+parseInt(_0x5e9b13(0x16c))/0x5*(parseInt(_0x5e9b13(0x164))/0x6)+-parseInt(_0x5e9b13(0x1da))/0x7*(parseInt(_0x5e9b13(0xd0))/0x8)+parseInt(_0x5e9b13(0x1ef))/0x9*(-parseInt(_0x5e9b13(0x19e))/0xa)+-parseInt(_0x5e9b13(0x1b4))/0xb*(-parseInt(_0x5e9b13(0x15e))/0xc);if(_0x2fc627===_0x48645d)break;else _0x3aab0e['push'](_0x3aab0e['shift']());}catch(_0x19a946){_0x3aab0e['push'](_0x3aab0e['shift']());}}}(_0x19e0,0xae324));import _0x2f5f93 from'dotenv';import{dirname,join,parse}from'path';import{existsSync}from'fs';function findProjectRoot(){const _0x2d739d=_0x5975,_0xf9ff46={'tcpra':function(_0x372663,_0xd63fac){return _0x372663(_0xd63fac);},'rBEEe':function(_0x117580,_0x1d9b0e,_0x1bd68e){return _0x117580(_0x1d9b0e,_0x1bd68e);},'ckwZS':'.ranger'};let _0x585481=process[_0x2d739d(0xbc)]();const _0x3bdbb0=_0xf9ff46[_0x2d739d(0x108)](parse,_0x585481)['root'];while(_0x585481!==_0x3bdbb0){if(existsSync(_0xf9ff46['rBEEe'](join,_0x585481,_0xf9ff46['ckwZS']))||_0xf9ff46['tcpra'](existsSync,join(_0x585481,_0x2d739d(0x113))))return _0x585481;_0x585481=dirname(_0x585481);}return process['cwd']();}_0x2f5f93[_0xb0024(0xd7)]({'path':join(findProjectRoot(),'.env')});import _0x5b0947 from'yargs/yargs';import{addEnv,clean,login,start,setupCi,useEnv,updateEnv,update,skillup,envList,hook}from'./commands/index.js';import{authEncrypt}from'./commands/authEncrypt.js';import{status}from'./commands/status.js';import{configSet,configGet,configList,configUnset}from'./commands/config.js';import{verifyFeature}from'./commands/verifyFeature.js';import{featureCreate,featureList,featureShow,featureResume,featureAddScenario,featureEditScenario,featureGetReview,featureDelete,featureRestore}from'./commands/feature.js';import{logDesirePath,getErrorType,sanitizeArgs}from'./commands/utils/desirePathLog.js';function _0x19e0(){const _0x5d5a45=['\x20VERIFIED','DXsWX','skillup','incomplete','Config\x20key\x20(e.g.,\x20userAgent,\x20header.X-Custom)','Maximum\x20number\x20of\x20feature\x20reviews\x20to\x20return','status','strictCommands','limit','List\x20all\x20profiles','bhLhk','UrBpd','Documentation:\x0a','cwd','message','ytPDT','ranger\x20profile\x20encrypt-auth','argv','Skip\x20URL\x20reachability\x20check\x20when\x20using\x20--url','config\x20unset','ZarTS','AAZIC','array','ranger\x20start','vbDSo','string','add-checklist-item\x20<description>','user','asJVj','Skip\x20Chromium\x20browser\x20installation','SdIrV','Mwvrb','List\x20all\x20feature\x20reviews','285840gyXfjE','update\x20<env-name>','Profile\x20name','efyOh','aAmpB','Environment\x20name','tRkJQ','config','edit-scenario','ranger\x20profile\x20update','Ranger\x20API\x20token','DMVbT','UhygT','setup\x20[token]','ranger\x20create','Notes\x20for\x20verification\x20(defaults\x20to\x20scenario\x20description)','login','--scenario','Find\x20and\x20use\x20feature\x20review\x20matching\x20current\x20git\x20context','Create\x20CI\x20environment\x20(encrypted\x20auth,\x20committed\x20to\x20git)','Path\x20to\x20start\x20on\x20(appended\x20to\x20base\x20URL,\x20e.g.,\x20/dashboard)','43nSBLXF','Config\x20key','scenario','skip-chromium','nrDXr','BvAhp','hIpJM','TYZon','\x0aIssues:','demandCommand','task','CQuDX','qNDNr','kKXpY','positional','pNgHg','Daeyd','FFYDx','url','dihIz','--notes','ymSGI','ydBva','BcHvW','HyMUp','nbILE','ZadAF','\x20is\x20now\x20','OUPOe','Add\x20profile\x20configuration','hPfUU','ranger\x20use','XuUtI','token','disable','tcpra','AXAvS','ranger\x20feature\x20add-checklist-item','Show\x20Ranger\x20status\x20(version,\x20skills,\x20profiles)','start\x20[token]','Unknown\x20command','RjmRo','rwNky','JerfR','checklist','WKXML','.env','List\x20all\x20config\x20for\x20a\x20profile','sijSq','ajued','command','BytQo','Feature\x20review\x20ID\x20(uses\x20active\x20feature\x20review\x20if\x20not\x20provided)','You\x20must\x20specify\x20an\x20auth\x20subcommand','Config\x20key\x20to\x20remove','Scenarios\x20(use\x20multiple\x20-c\x20flags\x20for\x20multiple\x20scenarios)','HezKD','option','AuybX','key','Manage\x20profiles','Get\x20a\x20config\x20value','ranger\x20feature\x20show','fscnL','bGEGh','error','CI\x20profile\x20name\x20(auto-detected\x20if\x20only\x20one\x20exists)','yKgfY','\x20PARTIAL','ranger\x20resume','uDKMq','includes','klKav','Xaysh','Update\x20authentication\x20for\x20an\x20existing\x20profile','auth','repeat','jFpuo','Number\x20of\x20feature\x20reviews\x20to\x20skip','get-review','Disable\x20Ranger\x20hooks\x20for\x20this\x20session','log','ranger\x20feature\x20list','ranger\x20feature\x20resume','include-deleted','exit','failed','evaluation','Hmlna','ppTAD','3140096oLHYRd','profile\x20config\x20list','KvhQL','Show\x20feature\x20review\x20details\x20(uses\x20active\x20feature\x20review\x20if\x20no\x20id)','project','Hook\x20name\x20(session-start,\x20pre-compact,\x20post-edit,\x20etc.)','PboWo','notes','update','parse','add-scenario','Ranger\x20API\x20token\x20(omit\x20to\x20log\x20in\x20via\x20browser)','offset','Stnom','izQFd','22132ekydps','iwIAS','OPfpB','Create\x20a\x20new\x20feature\x20review\x20with\x20scenarios','aqDaa','ZvxtW','resume','JqhkL','cdp-endpoint','AYjVs','eugaJ','ranger\x20feature\x20create','cMmtM','nSDaf','list','show\x20[id]','3529464KRPynF','JSVmB','oCMFH','env','forEach','config\x20get','4936038rVPmkJ','You\x20must\x20specify\x20a\x20profile\x20config\x20subcommand','FPzVb','Name\x20of\x20the\x20profile','update\x20<profile-name>','--item','ranger\x20config\x20list','Irpmc','5sygYfi','SceGr','Scenario\x20description','skip-auth','Install\x20Ranger\x20skills\x20for\x20Claude\x20Code','elyQU','NKiAj','Filter\x20to\x20feature\x20reviews\x20for\x20current\x20git\x20branch','zGWIB','ranger\x20feature\x20restore','usage','MwMVk','HixPF','zSCUx','value','exitCode','xCnOz','MdFqe','use\x20<profile-name>','restore\x20<id>','HRrWi','kxlEO','boolean','name','qHBOK','resume\x20[id]','Scenario\x20index\x20(1-based)','QLNpF','WRavL','diAel','issues','ranger\x20delete','feature\x20restore','create','env\x20update','unset\x20<env>\x20<key>','FYqOu','base-url','\x20BLOCKED','GIUei','pOmtz','ranger\x20profile\x20use','veZTP','You\x20must\x20specify\x20a\x20feature\x20review\x20subcommand','JcHQU','partial','CHIxd','dLuCM','scope','Merwy','10pAVhcR','show','Switch\x20to\x20using\x20a\x20specific\x20profile','get\x20<profile>\x20<key>','LEWYJ','JSTfF','QvDNx','force','OdjKg','profile-name','--task','obdKZ','You\x20must\x20specify\x20a\x20command','Name\x20of\x20the\x20environment','PvFjC','blocked','zSmUP','feature\x20create','create\x20<name>','gMKYv','setup-ci','feature\x20delete','44MzgFZA','enable','evaluationReason','XFNQd','session-id','FPUYb','GxWMD','Feature\x20review\x20ID','ihoyS','Skip\x20browser\x20authentication\x20(just\x20save\x20URL\x20and\x20settings)','mOihF','set\x20<profile>\x20<key>\x20<value>','profile','ranger','Set\x20a\x20config\x20value','ranger\x20go','1470369YkiJKb','start-path','profile\x20config\x20get','env-name','zMkIw','DHCYn','DJEzG','eMgBJ','description','Config\x20value','MWdIh','Task\x20description\x20(defaults\x20to\x20scenario\x20description)','LSZvZ','eDmrS','fail','number','\x20\x20https://docs.ranger.net/llms.txt\x20(for\x20LLMs)','sPMVQ','TXRcT','debug-outcome','profile\x20update','Feature\x20review\x20name','189dEJkqt','help','qOQAL','NmwLD','Initialize\x20Ranger\x20in\x20your\x20project','Skip\x20Chromium\x20browser\x20check\x20and\x20installation','ranger\x20profile\x20ls','pUnoU','profile\x20add','SAwmC','Restore\x20a\x20soft-deleted\x20feature\x20review','sDiuu','add\x20<profile-name>','ranger\x20show','Manage\x20profile\x20configuration','hook','Base\x20URL\x20for\x20the\x20app\x20(creates/updates\x20profile\x20settings)','FETfl','lTgyj','\x20FAILED','slice','1260054ewrJyn','Name\x20of\x20the\x20environment\x20(e.g.,\x20local,\x20staging,\x20prod)','olGxQ','You\x20must\x20specify\x20a\x20profile\x20subcommand','Feature\x20review\x20description','Base\x20URL\x20of\x20the\x20running\x20app\x20for\x20profile\x20setup\x20(required\x20in\x20non-interactive\x20mode)','CWNlS','lPmGN','list\x20<env>','nlGlx','Feature\x20review\x20ID\x20to\x20restore','restore','KsJvn','EOUYI','delete\x20[id]','trackCommandError','env\x20list','severity','uhnTL'];_0x19e0=function(){return _0x5d5a45;};return _0x19e0();}function _0x5975(_0x46496a,_0x2a7335){_0x46496a=_0x46496a-0xb5;const _0x19e0f7=_0x19e0();let _0x597500=_0x19e0f7[_0x46496a];return _0x597500;}import{getCurrentVersion}from'./commands/utils/version.js';import{withTelemetry,getCurrentCollector}from'./commands/utils/telemetry.js';process['on']('unhandledRejection',async _0x16ff60=>{const _0x5494c9=_0xb0024,_0x3ca9cf=getCurrentCollector();_0x3ca9cf&&await _0x3ca9cf[_0x5494c9(0x1fe)](_0x16ff60),process[_0x5494c9(0x17b)]=0x1;});const rawArgs=process[_0xb0024(0xc0)][_0xb0024(0x1ee)](0x2),TOP_LEVEL_HELP='Usage:\x20ranger\x20<command>\x20[options]\x0a\x0aCommands:\x0a\x20\x20setup\x20[token]\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Initialize\x20Ranger\x20in\x20your\x20project\x0a\x20\x20login\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Re-authenticate\x20without\x20full\x20setup\x0a\x20\x20skillup\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Install\x20Ranger\x20skills\x20for\x20Claude\x20Code\x0a\x20\x20clean\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Remove\x20Ranger\x20artifacts\x20from\x20the\x20project\x0a\x20\x20status\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Show\x20version,\x20org,\x20skills,\x20and\x20profile\x20status\x0a\x20\x20update\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Update\x20Ranger\x20CLI\x20to\x20the\x20latest\x20version\x0a\x0a\x20\x20profile\x20<command>\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Manage\x20profiles\x20(add/use/ls/update/config/encrypt-auth)\x0a\x20\x20\x20\x20add\x20<profile-name>\x20\x20\x20\x20\x20\x20\x20\x20Add\x20profile\x20(options:\x20--ci,\x20--skip-auth)\x0a\x20\x20\x20\x20use\x20<profile-name>\x20\x20\x20\x20\x20\x20\x20\x20Switch\x20active\x20profile\x0a\x20\x20\x20\x20ls\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20List\x20profiles\x0a\x20\x20\x20\x20update\x20<profile-name>\x20\x20\x20\x20\x20Re-capture\x20auth\x20for\x20a\x20profile\x0a\x20\x20\x20\x20encrypt-auth\x20<profile>\x20\x20\x20\x20Encrypt\x20auth.json\x20for\x20safe\x20git\x20storage\x0a\x20\x20\x20\x20config\x20<command>\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Set/get/list/unset\x20profile\x20config\x0a\x0a\x20\x20create\x20<name>\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Create\x20a\x20feature\x20review\x20with\x20scenarios\x0a\x20\x20list\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20List\x20feature\x20reviews\x0a\x20\x20show\x20[id]\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Show\x20feature\x20review\x20details\x0a\x20\x20resume\x20[id]\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Resume\x20a\x20feature\x20review\x0a\x20\x20add-scenario\x20<description>\x20\x20Add\x20a\x20scenario\x20to\x20the\x20active\x20feature\x20review\x0a\x20\x20edit-scenario\x20<description>\x20Edit\x20a\x20scenario\x20description\x0a\x20\x20get-review\x20[id]\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Show\x20reviewer\x20feedback\x0a\x20\x20delete\x20[id]\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Soft\x20delete\x20a\x20feature\x20review\x0a\x20\x20restore\x20<id>\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Restore\x20a\x20soft-deleted\x20feature\x20review\x0a\x0a\x20\x20go\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Verify\x20a\x20scenario\x20in\x20the\x20browser\x0a\x0aRun\x20`ranger\x20<command>\x20--help`\x20for\x20details.',PROFILE_HELP='Usage:\x20ranger\x20profile\x20<command>\x20[options]\x0a\x0aCommands:\x0a\x20\x20add\x20<profile-name>\x20\x20\x20\x20\x20\x20\x20\x20Add\x20profile\x20(options:\x20--ci,\x20--skip-auth)\x0a\x20\x20use\x20<profile-name>\x20\x20\x20\x20\x20\x20\x20\x20Switch\x20active\x20profile\x0a\x20\x20ls\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20List\x20profiles\x0a\x20\x20update\x20<profile-name>\x20\x20\x20\x20\x20Re-capture\x20auth\x20for\x20a\x20profile\x0a\x20\x20encrypt-auth\x20<profile>\x20\x20\x20\x20Encrypt\x20auth.json\x20for\x20safe\x20git\x20storage\x0a\x20\x20config\x20<command>\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Profile\x20config\x20(set/get/list/unset)\x0a\x0aExamples:\x0a\x20\x20ranger\x20profile\x20add\x20local\x0a\x20\x20ranger\x20profile\x20encrypt-auth\x20ci\x0a\x20\x20ranger\x20profile\x20config\x20set\x20local\x20headless\x20true',PROFILE_CONFIG_HELP='Usage:\x20ranger\x20profile\x20config\x20<command>\x0a\x0aCommands:\x0a\x20\x20set\x20<profile>\x20<key>\x20<value>\x20\x20\x20\x20Set\x20a\x20config\x20value\x0a\x20\x20get\x20<profile>\x20<key>\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Get\x20a\x20config\x20value\x0a\x20\x20list\x20<profile>\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20List\x20all\x20config\x20for\x20a\x20profile\x0a\x20\x20unset\x20<profile>\x20<key>\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Remove\x20a\x20config\x20value\x0a\x0aKeys:\x0a\x20\x20userAgent\x20\x20\x20\x20\x20\x20\x20\x20Browser\x20user\x20agent\x20string\x0a\x20\x20headless\x20\x20\x20\x20\x20\x20\x20\x20\x20Run\x20browser\x20in\x20headless\x20mode\x20(true/false)\x0a\x20\x20storageState\x20\x20\x20\x20\x20Path\x20to\x20auth\x20state\x20file\x20(e.g.,\x20./auth.json)\x0a\x20\x20header.<name>\x20\x20\x20\x20Custom\x20HTTP\x20header\x20(e.g.,\x20header.X-Test-Mode)\x0a\x0aExamples:\x0a\x20\x20ranger\x20profile\x20config\x20set\x20ci\x20userAgent\x20\x22Mozilla/5.0\x20(CI\x20Bot)\x22\x0a\x20\x20ranger\x20profile\x20config\x20set\x20ci\x20headless\x20true\x0a\x20\x20ranger\x20profile\x20config\x20set\x20ci\x20header.Authorization\x20\x27${AUTH_TOKEN}\x27';function warnRenamed(_0x40f47a,_0x4633b6){const _0x3c37a1=_0xb0024;console['error']('\x0a'+_0x40f47a+_0x3c37a1(0x100)+_0x4633b6+'\x0a');}function argUsed(_0x4702aa){return rawArgs['some'](_0x5d76c0=>_0x5d76c0===_0x4702aa||_0x5d76c0['startsWith'](_0x4702aa+'='));}function warnFlagRenamed(_0x2fe650,_0x152258,_0xb0c450){const _0x19982b={'AMLUI':function(_0x167ab2,_0x141319){return _0x167ab2(_0x141319);}};_0x19982b['AMLUI'](argUsed,_0x152258)&&warnRenamed(_0x2fe650+'\x20'+_0x152258,_0x2fe650+'\x20'+_0xb0c450);}async function runGoCommand(_0x212edf,_0x4e08c8=![]){const _0x1fdaa8=_0xb0024,_0x5a32ee={'HezKD':'ranger\x20go','EZpWB':'--env','vRkkR':'--profile','zCTzx':_0x1fdaa8(0x1a8),'sijSq':_0x1fdaa8(0x169),'uTUFB':function(_0x2770ca,_0x4ce3f4){return _0x2770ca(_0x4ce3f4);},'pUnoU':function(_0x3874c5,_0x1b3665){return _0x3874c5===_0x1b3665;},'yKgfY':_0x1fdaa8(0x205),'vbDSo':_0x1fdaa8(0xed),'XFNQd':'verified'};_0x4e08c8&&warnRenamed('ranger\x20verify-feature',_0x1fdaa8(0x1c3));warnFlagRenamed(_0x5a32ee['HezKD'],_0x5a32ee['EZpWB'],_0x5a32ee['vRkkR']),warnFlagRenamed(_0x5a32ee[_0x1fdaa8(0x11d)],_0x5a32ee['zCTzx'],_0x1fdaa8(0xf9)),warnFlagRenamed(_0x1fdaa8(0x1c3),_0x5a32ee[_0x1fdaa8(0x115)],_0x1fdaa8(0xe1));const _0x4dcaf3=await _0x5a32ee['uTUFB'](verifyFeature,{'profile':_0x212edf[_0x1fdaa8(0x1c0)]??_0x212edf[_0x1fdaa8(0x161)],'notes':_0x212edf[_0x1fdaa8(0x146)]??_0x212edf[_0x1fdaa8(0xef)],'scenario':_0x212edf[_0x1fdaa8(0xe7)]??_0x212edf['item'],'startPath':_0x212edf[_0x1fdaa8(0x1c5)],'debugOutcome':_0x212edf['debug-outcome'],'debugAddressComments':_0x212edf['debug-address-comments']});console[_0x1fdaa8(0x136)]('\x0a'+'='[_0x1fdaa8(0x131)](0x3c)),console[_0x1fdaa8(0x136)](_0x4dcaf3[_0x1fdaa8(0x13c)]==='verified'?_0x1fdaa8(0x202):_0x5a32ee[_0x1fdaa8(0x1e1)](_0x4dcaf3[_0x1fdaa8(0x13c)],_0x5a32ee[_0x1fdaa8(0x128)])?'\x20INCOMPLETE':_0x4dcaf3[_0x1fdaa8(0x13c)]==='partial'?_0x1fdaa8(0x129):_0x4dcaf3['evaluation']===_0x1fdaa8(0x1ad)?_0x1fdaa8(0x192):_0x1fdaa8(0x1ed)),console[_0x1fdaa8(0x136)]('='[_0x1fdaa8(0x131)](0x3c)),console[_0x1fdaa8(0x136)]('Summary:\x20'+_0x4dcaf3['summary']),console[_0x1fdaa8(0x136)]('Evaluation:\x20'+_0x4dcaf3['evaluation']),console['log']('Reason:\x20'+_0x4dcaf3[_0x1fdaa8(0x1b6)]),_0x4dcaf3['issues']?.['length']&&(console['log'](_0x5a32ee[_0x1fdaa8(0xc7)]),_0x4dcaf3[_0x1fdaa8(0x18a)][_0x1fdaa8(0x162)]((_0x1a9eb4,_0x4bcffe)=>{const _0x4c78a6=_0x1fdaa8;console[_0x4c78a6(0x136)]('\x0a'+(_0x4bcffe+0x1)+'.\x20['+_0x1a9eb4[_0x4c78a6(0x200)]+']\x20'+_0x1a9eb4[_0x4c78a6(0x1cc)]);})),process[_0x1fdaa8(0x13a)](_0x4dcaf3['evaluation']===_0x5a32ee[_0x1fdaa8(0x1b7)]?0x0:0x1);}_0x5b0947(process['argv']['slice'](0x2))['scriptName'](_0xb0024(0x1c1))['usage'](TOP_LEVEL_HELP)['version'](getCurrentVersion())[_0xb0024(0x117)](_0xb0024(0x1b0),_0xb0024(0x151),_0x4dd9c8=>{const _0x26ddcc=_0xb0024,_0x43acbf={'OPfpB':_0x26ddcc(0x183),'MdFqe':_0x26ddcc(0x1cc),'BHmsa':_0x26ddcc(0x1f3),'DXsWX':_0x26ddcc(0xc5),'JFpsa':_0x26ddcc(0x11c),'ihoyS':'checklist'};return _0x4dd9c8['positional'](_0x43acbf[_0x26ddcc(0x150)],{'type':_0x26ddcc(0xc8),'description':_0x26ddcc(0x1d9),'demandOption':!![]})[_0x26ddcc(0x11e)](_0x43acbf[_0x26ddcc(0x17d)],{'type':'string','alias':'d','description':_0x43acbf['BHmsa']})[_0x26ddcc(0x11e)]('scenario',{'type':_0x43acbf['DXsWX'],'alias':'c','description':_0x43acbf['JFpsa']})['option'](_0x43acbf[_0x26ddcc(0x1bc)],{'type':_0x43acbf[_0x26ddcc(0x203)],'hidden':!![]});},async _0x2602d7=>{const _0x106bd8=_0xb0024,_0x3e3e9c={'KsJvn':function(_0xb50380,_0x2f69ff,_0x4b4c07,_0x1c068b){return _0xb50380(_0x2f69ff,_0x4b4c07,_0x1c068b);},'WiWAj':'ranger\x20create','HyMUp':'--checklist'};_0x3e3e9c[_0x106bd8(0x1fb)](warnFlagRenamed,_0x3e3e9c['WiWAj'],_0x3e3e9c[_0x106bd8(0xfd)],'--scenario');const _0x307776=_0x2602d7[_0x106bd8(0xe7)]||_0x2602d7['checklist'];await withTelemetry(_0x106bd8(0x18d),()=>featureCreate(_0x2602d7[_0x106bd8(0x183)],{'description':_0x2602d7[_0x106bd8(0x1cc)],'scenarios':_0x307776}));})['command']('list',_0xb0024(0xcf),_0x134af5=>{const _0xcfe29=_0xb0024,_0x363d31={'FDBhQ':'current-branch','izQFd':_0xcfe29(0xb7),'cMmtM':_0xcfe29(0x207),'NmwLD':'offset','EspwK':_0xcfe29(0x1d3),'fERgi':'Number\x20of\x20feature\x20reviews\x20to\x20skip','bhLhk':_0xcfe29(0x139)};return _0x134af5[_0xcfe29(0x11e)](_0x363d31['FDBhQ'],{'type':_0xcfe29(0x182),'description':_0xcfe29(0x173)})[_0xcfe29(0x11e)](_0x363d31[_0xcfe29(0x14d)],{'type':_0xcfe29(0x1d3),'alias':'l','description':_0x363d31[_0xcfe29(0x15a)],'default':0xa})['option'](_0x363d31[_0xcfe29(0x1dd)],{'type':_0x363d31['EspwK'],'alias':'o','description':_0x363d31['fERgi'],'default':0x0})[_0xcfe29(0x11e)](_0x363d31[_0xcfe29(0xb9)],{'type':_0xcfe29(0x182),'alias':'d','description':'Include\x20soft-deleted\x20feature\x20reviews','default':![]});},async _0x2171b0=>{const _0xf31b2d=_0xb0024,_0x3edddc={'JqhkL':function(_0xba44b4,_0x21bf81,_0x48417f){return _0xba44b4(_0x21bf81,_0x48417f);}};await _0x3edddc[_0xf31b2d(0x155)](withTelemetry,'list',()=>featureList({'currentBranch':_0x2171b0['current-branch'],'limit':_0x2171b0['limit'],'offset':_0x2171b0[_0xf31b2d(0x14b)],'includeDeleted':_0x2171b0[_0xf31b2d(0x139)]}));})[_0xb0024(0x117)](_0xb0024(0x15d),_0xb0024(0x142),_0x4b44a3=>{const _0x2f009e=_0xb0024;return _0x4b44a3[_0x2f009e(0xf3)]('id',{'type':'string','description':_0x2f009e(0x1bb)});},async _0xf0eea0=>{const _0x8f433e=_0xb0024;await withTelemetry(_0x8f433e(0x19f),()=>featureShow(_0xf0eea0['id']));})['command'](_0xb0024(0x185),_0xb0024(0xe2),_0x2c3f58=>{const _0x3e5fee=_0xb0024,_0x24057a={'JcHQU':'Feature\x20review\x20ID\x20(optional\x20-\x20bypasses\x20search/prompt)'};return _0x2c3f58[_0x3e5fee(0xf3)]('id',{'type':_0x3e5fee(0xc8),'description':_0x24057a[_0x3e5fee(0x198)]});},async _0xb548a=>{const _0x4dc161=_0xb0024,_0x285177={'GHNjv':function(_0x436c73,_0x535552,_0x51f3b3){return _0x436c73(_0x535552,_0x51f3b3);},'AuybX':_0x4dc161(0x154)};await _0x285177['GHNjv'](withTelemetry,_0x285177[_0x4dc161(0x11f)],()=>featureResume(_0xb548a['id']));})[_0xb0024(0x117)]('add-scenario\x20<description>','Add\x20a\x20scenario\x20to\x20the\x20active\x20feature\x20review',_0x3e4ccc=>{const _0x141872=_0xb0024,_0x41e465={'RdkwI':_0x141872(0x1cc),'efyOh':'string','Xamny':_0x141872(0x16e)};return _0x3e4ccc['positional'](_0x41e465['RdkwI'],{'type':_0x41e465[_0x141872(0xd3)],'description':_0x41e465['Xamny'],'demandOption':!![]})[_0x141872(0x11e)]('id',{'type':_0x41e465['efyOh'],'description':_0x141872(0x119)});},async _0x1adec1=>{const _0x57781c=_0xb0024,_0x470bce={'NINrQ':function(_0x156fb9,_0x1d9733,_0x181375){return _0x156fb9(_0x1d9733,_0x181375);}};await _0x470bce['NINrQ'](withTelemetry,_0x57781c(0x149),()=>featureAddScenario(_0x1adec1[_0x57781c(0x1cc)],_0x1adec1['id']));})['command']('edit-scenario\x20<description>','Edit\x20a\x20scenario\x20description\x20on\x20the\x20active\x20feature\x20review',_0xaf02d7=>{const _0x1c6d76=_0xb0024,_0x599931={'HiIGK':'string','MWdIh':_0x1c6d76(0xe7),'acurv':_0x1c6d76(0x119)};return _0xaf02d7['positional'](_0x1c6d76(0x1cc),{'type':_0x599931['HiIGK'],'description':'New\x20scenario\x20description','demandOption':!![]})[_0x1c6d76(0x11e)](_0x599931[_0x1c6d76(0x1ce)],{'type':_0x1c6d76(0x1d3),'description':'Scenario\x20number\x20to\x20edit\x20(1-based)','demandOption':!![]})[_0x1c6d76(0x11e)]('id',{'type':_0x1c6d76(0xc8),'description':_0x599931['acurv']});},async _0x3a3383=>{const _0x23226f=_0xb0024,_0x3cb304={'ltlEo':function(_0x281f8f,_0xfcc7ea,_0x55c08e){return _0x281f8f(_0xfcc7ea,_0x55c08e);}};await _0x3cb304['ltlEo'](withTelemetry,_0x23226f(0xd8),()=>featureEditScenario(_0x3a3383['description'],{'id':_0x3a3383['id'],'scenario':_0x3a3383['scenario']}));})[_0xb0024(0x117)]('get-review\x20[id]','Show\x20reviewer\x20feedback\x20(comments)\x20for\x20all\x20scenarios',_0x3d68c0=>{const _0x293da2=_0xb0024;return _0x3d68c0[_0x293da2(0xf3)]('id',{'type':_0x293da2(0xc8),'description':'Feature\x20review\x20ID\x20(uses\x20active\x20feature\x20review\x20if\x20not\x20provided)'});},async _0x8fe725=>{const _0x2cb6a9=_0xb0024;await withTelemetry(_0x2cb6a9(0x134),()=>featureGetReview(_0x8fe725['id']));})[_0xb0024(0x117)](_0xb0024(0x1fd),'Soft\x20delete\x20a\x20feature\x20review\x20(uses\x20active\x20feature\x20review\x20if\x20no\x20id)',_0x9b8a8f=>{const _0x4d5fd2=_0xb0024,_0x3e86b5={'BMaDd':'string','LEWYJ':_0x4d5fd2(0x1bb)};return _0x9b8a8f[_0x4d5fd2(0xf3)]('id',{'type':_0x3e86b5['BMaDd'],'description':_0x3e86b5[_0x4d5fd2(0x1a2)]});},async _0x2109d0=>{const _0x58cf5a=_0xb0024,_0x4e32c2={'KromO':function(_0x46f422,_0x303c70,_0x1d7fda){return _0x46f422(_0x303c70,_0x1d7fda);},'nbILE':'delete'};await _0x4e32c2['KromO'](withTelemetry,_0x4e32c2[_0x58cf5a(0xfe)],()=>featureDelete(_0x2109d0['id']));})['command'](_0xb0024(0x17f),_0xb0024(0x1e4),_0x519826=>{const _0x4e2010=_0xb0024,_0x5a188a={'JSFpg':_0x4e2010(0xc8)};return _0x519826[_0x4e2010(0xf3)]('id',{'type':_0x5a188a['JSFpg'],'description':_0x4e2010(0x1f9),'demandOption':!![]});},async _0x517907=>{const _0x28313a=_0xb0024,_0x2feed8={'pOmtz':function(_0x14f3a4,_0x4cc975,_0x2550c2){return _0x14f3a4(_0x4cc975,_0x2550c2);}};await _0x2feed8[_0x28313a(0x194)](withTelemetry,_0x28313a(0x1fa),()=>featureRestore(_0x517907['id']));})['command'](_0xb0024(0xdd),_0xb0024(0x1de),_0x19a978=>{const _0x34ab74=_0xb0024,_0x37a6e5={'HXQWE':'token','DJEzG':'Ranger\x20API\x20token\x20(omit\x20to\x20log\x20in\x20via\x20browser)','tRkJQ':_0x34ab74(0x182),'veZTP':'Skip\x20Chromium\x20browser\x20check\x20and\x20installation','hIpJM':'scope','nSDaf':'string','zLhqs':_0x34ab74(0x143),'WKXML':'Install\x20scope\x20for\x20plugin\x20and\x20skills\x20(defaults\x20to\x20user\x20in\x20non-interactive\x20mode)','Hmlna':'url','lPmGN':_0x34ab74(0xc1)};return _0x19a978['positional'](_0x37a6e5['HXQWE'],{'type':_0x34ab74(0xc8),'description':_0x37a6e5[_0x34ab74(0x1ca)]})['option']('skip-chromium',{'type':_0x37a6e5[_0x34ab74(0xd6)],'description':_0x37a6e5[_0x34ab74(0x196)],'default':![]})['option'](_0x37a6e5[_0x34ab74(0xeb)],{'type':_0x37a6e5[_0x34ab74(0x15b)],'choices':[_0x34ab74(0xca),_0x37a6e5['zLhqs']],'description':_0x37a6e5[_0x34ab74(0x112)]})['option'](_0x37a6e5[_0x34ab74(0x13d)],{'type':_0x37a6e5['nSDaf'],'description':'Base\x20URL\x20of\x20the\x20running\x20app\x20for\x20profile\x20setup\x20(required\x20in\x20non-interactive\x20mode)'})['option'](_0x34ab74(0x1a5),{'type':_0x37a6e5[_0x34ab74(0xd6)],'description':_0x37a6e5[_0x34ab74(0x1f6)],'default':![]});},async _0x574551=>{const _0x18bff0=_0xb0024,_0x4fd416={'olGxQ':function(_0x1ac43b,_0x1ef110,_0x44ff8c){return _0x1ac43b(_0x1ef110,_0x44ff8c);},'Stnom':'start'};await _0x4fd416[_0x18bff0(0x1f1)](withTelemetry,_0x4fd416[_0x18bff0(0x14c)],_0x3a1bea=>start(_0x574551[_0x18bff0(0x106)],{'skipChromium':_0x574551[_0x18bff0(0xe8)],'scope':_0x574551['scope'],'url':_0x574551[_0x18bff0(0xf7)],'force':_0x574551['force']},_0x3a1bea));})['command']('setup-ci\x20<token>','Set\x20up\x20Ranger\x20for\x20CI\x20(non-interactive)',_0x1c3c86=>{const _0x3e85b7=_0xb0024,_0x320a90={'oiYTA':_0x3e85b7(0xda),'iqpLR':_0x3e85b7(0xc8)};return _0x1c3c86[_0x3e85b7(0xf3)]('token',{'type':_0x3e85b7(0xc8),'description':_0x320a90['oiYTA'],'demandOption':!![]})[_0x3e85b7(0x11e)](_0x3e85b7(0x1c0),{'type':_0x320a90['iqpLR'],'description':_0x3e85b7(0x127)})['option']('base-url',{'type':_0x320a90['iqpLR'],'description':_0x3e85b7(0x1ea)})[_0x3e85b7(0x11e)]('skip-chromium',{'type':_0x3e85b7(0x182),'description':_0x3e85b7(0xcc),'default':![]});},async _0x50cd4c=>{const _0x6808f1=_0xb0024,_0x5de65b={'MKAXo':_0x6808f1(0x1b2)};await withTelemetry(_0x5de65b['MKAXo'],_0x153c2c=>setupCi(_0x50cd4c['token'],{'profile':_0x50cd4c[_0x6808f1(0x1c0)],'baseUrl':_0x50cd4c[_0x6808f1(0x191)],'skipChromium':_0x50cd4c[_0x6808f1(0xe8)]},_0x153c2c));})[_0xb0024(0x117)]('login','Log\x20in\x20to\x20Ranger\x20via\x20browser\x20(re-authenticate\x20without\x20full\x20setup)',()=>{},async()=>{const _0x2afc98=_0xb0024,_0x15cc91={'BcHvW':function(_0x417c2a,_0x5e28ec,_0x1378b6){return _0x417c2a(_0x5e28ec,_0x1378b6);},'zmnTJ':_0x2afc98(0xe0)};await _0x15cc91[_0x2afc98(0xfc)](withTelemetry,_0x15cc91['zmnTJ'],()=>login());})[_0xb0024(0x117)](_0xb0024(0x204),_0xb0024(0x170),()=>{},async()=>{const _0x24b615={'MYTRO':'skillup'};await withTelemetry(_0x24b615['MYTRO'],()=>skillup());})[_0xb0024(0x117)]('clean','Remove\x20all\x20Ranger\x20artifacts\x20from\x20the\x20project',()=>{},async()=>{const _0x5d3780=_0xb0024,_0x392de5={'iwIAS':'clean'};await withTelemetry(_0x392de5[_0x5d3780(0x14f)],()=>clean());})['command']('profile',_0xb0024(0x121),_0x19ada=>{const _0x452f14=_0xb0024,_0x170a9f={'aRjFA':'skip-auth','FPzVb':'string','qOQAL':_0x452f14(0x1a5),'KtJxL':function(_0x36e32a,_0x281e0,_0x35a255,_0x45ac87){return _0x36e32a(_0x281e0,_0x35a255,_0x45ac87);},'GvRBB':function(_0x51c701,_0x2e2489){return _0x51c701(_0x2e2489);},'oCMFH':_0x452f14(0x1a7),'SceGr':function(_0x5be2ad,_0x2248e3,_0x427d3d){return _0x5be2ad(_0x2248e3,_0x427d3d);},'eugaJ':'profile\x20encrypt-auth','ydBva':'Name\x20of\x20the\x20profile\x20to\x20update','subrh':_0x452f14(0x1c0),'BvAhp':_0x452f14(0xd2),'aqDaa':'key','ZbkoI':'value','GxWMD':_0x452f14(0x1cd),'oexyf':_0x452f14(0xe6),'uDKMq':_0x452f14(0x140),'uaGzz':_0x452f14(0x1bf),'GOgbD':_0x452f14(0x1c2),'ppTAD':_0x452f14(0x1a1),'vbfxN':'list\x20<profile>','ZarTS':_0x452f14(0x114),'weVBV':'unset\x20<profile>\x20<key>','FFYDx':_0x452f14(0x102),'bNFoV':_0x452f14(0x17e),'qCEvx':_0x452f14(0x1a0),'nlGlx':'encrypt-auth\x20<profile>','EOUYI':'Encrypt\x20auth.json\x20for\x20a\x20profile\x20(allows\x20committing\x20to\x20git)','qNDNr':_0x452f14(0x1e8),'uhnTL':_0x452f14(0x1f2)};return _0x19ada[_0x452f14(0x176)](PROFILE_HELP)[_0x452f14(0x117)](_0x452f14(0x1e6),_0x170a9f[_0x452f14(0xf6)],_0x55ce9b=>{const _0x39fe65=_0x452f14;return _0x55ce9b['positional']('profile-name',{'type':_0x39fe65(0xc8),'description':'Name\x20of\x20the\x20profile\x20(e.g.,\x20local,\x20staging,\x20prod)','demandOption':!![]})['option']('ci',{'type':'boolean','description':'Create\x20CI\x20profile\x20(encrypted\x20auth,\x20committed\x20to\x20git)','default':![]})[_0x39fe65(0x11e)](_0x170a9f['aRjFA'],{'type':_0x39fe65(0x182),'description':'Skip\x20browser\x20authentication\x20(just\x20save\x20URL\x20and\x20settings)','default':![]})[_0x39fe65(0x11e)](_0x39fe65(0xf7),{'type':_0x170a9f[_0x39fe65(0x166)],'description':'Base\x20URL\x20of\x20the\x20running\x20app\x20(required\x20in\x20non-interactive\x20mode)'})[_0x39fe65(0x11e)](_0x170a9f[_0x39fe65(0x1dc)],{'type':_0x39fe65(0x182),'description':_0x39fe65(0xc1),'default':![]})[_0x39fe65(0x11e)]('cdp-endpoint',{'type':_0x170a9f[_0x39fe65(0x166)],'description':'CDP\x20endpoint\x20for\x20an\x20Electron\x20app\x20or\x20existing\x20browser\x20(e.g.\x20http://localhost:9222).\x20Skips\x20URL\x20and\x20browser\x20auth\x20setup.'});},async _0x491032=>{const _0x2fa475=_0x452f14;await _0x170a9f['KtJxL'](withTelemetry,_0x2fa475(0x1e2),_0x3cccb7=>addEnv(_0x491032['profile-name'],{'ci':_0x491032['ci'],'skipAuth':_0x491032['skip-auth'],'url':_0x491032['url'],'force':_0x491032['force'],'cdpEndpoint':_0x491032['cdp-endpoint']},_0x3cccb7),{'isElectron':_0x170a9f['GvRBB'](Boolean,_0x491032[_0x2fa475(0x156)])});})[_0x452f14(0x117)](_0x170a9f['bNFoV'],_0x170a9f['qCEvx'],_0x589125=>{const _0x2fea1e=_0x452f14;return _0x589125['positional'](_0x170a9f[_0x2fea1e(0x160)],{'type':'string','description':_0x2fea1e(0x167),'demandOption':!![]});},async _0xef3e15=>{await withTelemetry('profile\x20use',()=>useEnv(_0xef3e15['profile-name']));})[_0x452f14(0x117)](_0x170a9f[_0x452f14(0x1f8)],_0x170a9f[_0x452f14(0x1fc)],_0x388941=>{const _0x2718e3=_0x452f14;return _0x388941['positional'](_0x2718e3(0x1c0),{'type':'string','description':'Profile\x20name','demandOption':!![]});},async _0x3ec1ec=>{const _0xfa6ee0=_0x452f14;await _0x170a9f['SceGr'](withTelemetry,_0x170a9f[_0xfa6ee0(0x158)],()=>authEncrypt(_0x3ec1ec['profile']));})['command']('ls',_0x452f14(0xb8),()=>{},async()=>{const _0x1df937=_0x452f14;await _0x170a9f[_0x1df937(0x16d)](withTelemetry,'profile\x20ls',()=>envList());})['command'](_0x452f14(0x168),_0x452f14(0x12f),_0x159637=>{const _0x1cebb6=_0x452f14;return _0x159637[_0x1cebb6(0xf3)]('profile-name',{'type':'string','description':_0x170a9f[_0x1cebb6(0xfb)],'demandOption':!![]});},async _0x100849=>{const _0x56cc4d=_0x452f14;await withTelemetry(_0x56cc4d(0x1d8),_0x236ecb=>updateEnv(_0x100849['profile-name'],_0x236ecb));})['command'](_0x452f14(0xd7),_0x170a9f[_0x452f14(0xf1)],_0x1502f0=>{const _0x4e68a2=_0x452f14,_0x3364ba={'ZXaMX':function(_0x443e28,_0x22648e,_0xb6b845){return _0x170a9f['SceGr'](_0x443e28,_0x22648e,_0xb6b845);}};return _0x1502f0[_0x4e68a2(0x176)](PROFILE_CONFIG_HELP)[_0x4e68a2(0x117)](_0x170a9f['uaGzz'],_0x170a9f['GOgbD'],_0x131f05=>{const _0x53cc4f=_0x4e68a2;return _0x131f05['positional'](_0x170a9f['subrh'],{'type':_0x170a9f[_0x53cc4f(0x166)],'description':_0x170a9f[_0x53cc4f(0xea)],'demandOption':!![]})['positional'](_0x170a9f['aqDaa'],{'type':_0x170a9f[_0x53cc4f(0x166)],'description':_0x53cc4f(0x206),'demandOption':!![]})['positional'](_0x170a9f['ZbkoI'],{'type':'string','description':_0x170a9f[_0x53cc4f(0x1ba)],'demandOption':!![]});},async _0x4e17ed=>{const _0x3d2c05=_0x4e68a2;await withTelemetry('profile\x20config\x20set',()=>configSet(_0x4e17ed['profile'],_0x4e17ed['key'],_0x4e17ed[_0x3d2c05(0x17a)]));})['command'](_0x170a9f[_0x4e68a2(0x13e)],_0x4e68a2(0x122),_0x1b0433=>{const _0x588469=_0x4e68a2;return _0x1b0433['positional'](_0x588469(0x1c0),{'type':_0x588469(0xc8),'description':_0x588469(0xd2),'demandOption':!![]})[_0x588469(0xf3)](_0x170a9f[_0x588469(0x152)],{'type':'string','description':_0x170a9f['oexyf'],'demandOption':!![]});},async _0x13f49d=>{const _0x219bcb=_0x4e68a2;await withTelemetry(_0x219bcb(0x1c6),()=>configGet(_0x13f49d[_0x219bcb(0x1c0)],_0x13f49d[_0x219bcb(0x120)]));})['command'](_0x170a9f['vbfxN'],_0x170a9f[_0x4e68a2(0xc3)],_0x33fc3e=>{const _0xe4a346=_0x4e68a2;return _0x33fc3e[_0xe4a346(0xf3)](_0xe4a346(0x1c0),{'type':'string','description':_0x170a9f[_0xe4a346(0xea)],'demandOption':!![]});},async _0x154ca8=>{const _0x40e8b0=_0x4e68a2;await withTelemetry(_0x170a9f[_0x40e8b0(0x12b)],()=>configList(_0x154ca8[_0x40e8b0(0x1c0)]));})[_0x4e68a2(0x117)](_0x170a9f['weVBV'],'Remove\x20a\x20config\x20value',_0x322f1b=>{const _0x22052a=_0x4e68a2;return _0x322f1b[_0x22052a(0xf3)](_0x22052a(0x1c0),{'type':_0x170a9f[_0x22052a(0x166)],'description':_0x22052a(0xd2),'demandOption':!![]})[_0x22052a(0xf3)]('key',{'type':_0x170a9f[_0x22052a(0x166)],'description':_0x22052a(0x11b),'demandOption':!![]});},async _0x3f4c02=>{const _0xb81d56=_0x4e68a2;await _0x3364ba['ZXaMX'](withTelemetry,'profile\x20config\x20unset',()=>configUnset(_0x3f4c02['profile'],_0x3f4c02[_0xb81d56(0x120)]));})['demandCommand'](0x1,_0x4e68a2(0x165));})['demandCommand'](0x1,_0x170a9f[_0x452f14(0x201)]);})[_0xb0024(0x117)](_0xb0024(0xb5),_0xb0024(0x10b),()=>{},async()=>{const _0x58026b={'CNSWf':'status'};await withTelemetry(_0x58026b['CNSWf'],()=>status());})['command'](_0xb0024(0x147),'Update\x20Ranger\x20CLI\x20to\x20the\x20latest\x20version',()=>{},async()=>{const _0x5066ae=_0xb0024,_0x349b62={'AYjVs':_0x5066ae(0x147)};await withTelemetry(_0x349b62[_0x5066ae(0x157)],()=>update());})[_0xb0024(0x117)]('go','Verify\x20a\x20scenario\x20in\x20the\x20browser\x20(requires\x20active\x20feature\x20review)',_0x9d8893=>{const _0x54080d=_0xb0024,_0x322a9a={'VUCtP':'notes','rwNky':'number','PboWo':_0x54080d(0xc8),'DmFNp':_0x54080d(0xe4),'uPslP':_0x54080d(0x1d7),'MwMVk':'partial','hgDBk':_0x54080d(0x13b),'Ufusq':'incomplete','AbeqX':'debug-address-comments','okuWJ':_0x54080d(0x161),'FPUYb':'item'};return _0x9d8893['option'](_0x54080d(0x1c0),{'type':'string','description':'Profile\x20to\x20use\x20(defaults\x20to\x20active\x20profile)'})['option'](_0x322a9a['VUCtP'],{'type':'string','description':_0x54080d(0xdf)})['option'](_0x54080d(0xe7),{'type':_0x322a9a[_0x54080d(0x10f)],'description':_0x54080d(0x186)})['option'](_0x54080d(0x1c5),{'type':_0x322a9a[_0x54080d(0x145)],'description':_0x322a9a['DmFNp']})[_0x54080d(0x11e)](_0x322a9a['uPslP'],{'type':_0x322a9a[_0x54080d(0x145)],'hidden':!![],'choices':['verified',_0x322a9a[_0x54080d(0x177)],'blocked',_0x322a9a['hgDBk'],_0x322a9a['Ufusq']]})['option'](_0x322a9a['AbeqX'],{'type':_0x54080d(0x182),'hidden':!![]})['option'](_0x322a9a['okuWJ'],{'type':_0x322a9a['PboWo'],'hidden':!![]})[_0x54080d(0x11e)](_0x54080d(0xef),{'type':'string','hidden':!![]})['option'](_0x322a9a[_0x54080d(0x1b9)],{'type':_0x54080d(0x1d3),'hidden':!![]});},async _0x4a9c7f=>{await runGoCommand(_0x4a9c7f);})[_0xb0024(0x117)](_0xb0024(0x130),![],_0x2db9ed=>{const _0x17601a=_0xb0024,_0x26fdff={'EGakz':_0x17601a(0x1c0),'SAwmC':'string','HRrWi':function(_0x13c0c3,_0x2d9776,_0x30ddcd){return _0x13c0c3(_0x2d9776,_0x30ddcd);},'JSTfF':'ranger\x20auth\x20encrypt','KdgSs':_0x17601a(0xbf),'YZoda':function(_0x1e0ac7,_0x1b6b83){return _0x1e0ac7(_0x1b6b83);},'HvVgR':'encrypt\x20<profile>','CHIxd':_0x17601a(0x11a)};return _0x2db9ed['command'](_0x26fdff['HvVgR'],![],_0x41a695=>{const _0x523369=_0x17601a;return _0x41a695['positional'](_0x26fdff['EGakz'],{'type':_0x26fdff[_0x523369(0x1e3)],'description':_0x523369(0xd2),'demandOption':!![]});},async _0x3a72e0=>{const _0x1a4251=_0x17601a;_0x26fdff[_0x1a4251(0x180)](warnRenamed,_0x26fdff[_0x1a4251(0x1a3)],_0x26fdff['KdgSs']),await _0x26fdff['YZoda'](authEncrypt,_0x3a72e0['profile']);})['demandCommand'](0x1,_0x26fdff[_0x17601a(0x19a)]);},()=>{})[_0xb0024(0x117)](_0xb0024(0x10c),![],_0x1110a7=>{const _0x1eb1d1=_0xb0024,_0x4423af={'mghdy':'token','Irpmc':_0x1eb1d1(0xc8),'nRLvf':'user','ymSGI':'url','UrBpd':_0x1eb1d1(0x1a5),'SdIrV':_0x1eb1d1(0xc1)};return _0x1110a7['positional'](_0x4423af['mghdy'],{'type':_0x4423af['Irpmc'],'description':_0x1eb1d1(0x14a)})['option'](_0x1eb1d1(0xe8),{'type':_0x1eb1d1(0x182),'description':_0x1eb1d1(0x1df),'default':![]})[_0x1eb1d1(0x11e)]('scope',{'type':_0x4423af[_0x1eb1d1(0x16b)],'choices':[_0x4423af['nRLvf'],_0x1eb1d1(0x143)],'description':'Install\x20scope\x20for\x20plugin\x20and\x20skills\x20(defaults\x20to\x20user\x20in\x20non-interactive\x20mode)'})['option'](_0x4423af[_0x1eb1d1(0xfa)],{'type':'string','description':_0x1eb1d1(0x1f4)})['option'](_0x4423af[_0x1eb1d1(0xba)],{'type':'boolean','description':_0x4423af[_0x1eb1d1(0xcd)],'default':![]});},async _0x563211=>{const _0x54d0a5=_0xb0024,_0x2cfe70={'dihIz':function(_0x2c5382,_0x5839ac,_0x141731){return _0x2c5382(_0x5839ac,_0x141731);},'vCQsL':'ranger\x20setup'};_0x2cfe70[_0x54d0a5(0xf8)](warnRenamed,_0x54d0a5(0xc6),_0x2cfe70['vCQsL']),await _0x2cfe70['dihIz'](withTelemetry,'start',_0x2e08b2=>start(_0x563211[_0x54d0a5(0x106)],{'skipChromium':_0x563211['skip-chromium'],'scope':_0x563211[_0x54d0a5(0x19c)],'url':_0x563211['url'],'force':_0x563211['force']},_0x2e08b2));})['command']('verify-feature',![],_0xf964f9=>{const _0x53b570=_0xb0024,_0x3289e4={'XuUtI':'string','TYZon':_0x53b570(0x1cf),'BDXJb':'item','AAZIC':'number','KvhQL':'Scenario\x20index\x20(1-based)','mvAqA':_0x53b570(0xe7),'nrDXr':_0x53b570(0x199),'obdKZ':'blocked','JerfR':_0x53b570(0x13b),'kKXpY':'incomplete'};return _0xf964f9['option'](_0x53b570(0x161),{'type':_0x3289e4[_0x53b570(0x105)],'description':'Profile\x20to\x20use\x20(defaults\x20to\x20active\x20profile)'})['option'](_0x53b570(0xef),{'type':'string','description':_0x3289e4[_0x53b570(0xec)]})['option'](_0x3289e4['BDXJb'],{'type':_0x3289e4[_0x53b570(0xc4)],'description':_0x3289e4[_0x53b570(0x141)]})[_0x53b570(0x11e)](_0x53b570(0x1c0),{'type':_0x3289e4['XuUtI'],'hidden':!![]})['option']('notes',{'type':_0x3289e4[_0x53b570(0x105)],'hidden':!![]})[_0x53b570(0x11e)](_0x3289e4['mvAqA'],{'type':_0x3289e4['AAZIC'],'hidden':!![]})['option'](_0x53b570(0x1c5),{'type':'string','description':'Path\x20to\x20start\x20on\x20(appended\x20to\x20base\x20URL,\x20e.g.,\x20/dashboard)'})[_0x53b570(0x11e)](_0x53b570(0x1d7),{'type':_0x53b570(0xc8),'hidden':!![],'choices':['verified',_0x3289e4[_0x53b570(0xe9)],_0x3289e4[_0x53b570(0x1a9)],_0x3289e4[_0x53b570(0x110)],_0x3289e4[_0x53b570(0xf2)]]});},async _0x36c448=>{const _0x3eb67={'dgNAb':function(_0x543825,_0x5c1e62,_0x357f4b){return _0x543825(_0x5c1e62,_0x357f4b);}};await _0x3eb67['dgNAb'](runGoCommand,_0x36c448,!![]);})[_0xb0024(0x117)]('add\x20env\x20<env-name>',![],_0x5c4376=>{const _0x204c6e=_0xb0024,_0x4a183c={'HjxJY':_0x204c6e(0xc8),'zGWIB':'boolean','uWtFb':'skip-auth'};return _0x5c4376['positional'](_0x204c6e(0x1c7),{'type':_0x4a183c['HjxJY'],'description':_0x204c6e(0x1f0),'demandOption':!![]})['option']('ci',{'type':_0x4a183c[_0x204c6e(0x174)],'description':_0x204c6e(0xe3),'default':![]})['option'](_0x4a183c['uWtFb'],{'type':'boolean','description':_0x204c6e(0x1bd),'default':![]});},async _0x44985f=>{const _0x396c65=_0xb0024,_0x229d9b={'zHSQG':function(_0x14f89f,_0x789d86,_0x604932){return _0x14f89f(_0x789d86,_0x604932);},'dCYCf':'ranger\x20add\x20env','OSDNu':function(_0x3a928b,_0x576184,_0xe04f){return _0x3a928b(_0x576184,_0xe04f);},'artZQ':'add\x20env'};_0x229d9b['zHSQG'](warnRenamed,_0x229d9b['dCYCf'],'ranger\x20profile\x20add'),await _0x229d9b['OSDNu'](withTelemetry,_0x229d9b['artZQ'],_0x49a723=>addEnv(_0x44985f['env-name'],{'ci':_0x44985f['ci'],'skipAuth':_0x44985f[_0x396c65(0x16f)]},_0x49a723));})[_0xb0024(0x117)]('use\x20<env-name>',![],_0x4ac6d7=>{const _0x43247f=_0xb0024,_0x1f2833={'sPMVQ':_0x43247f(0x1c7),'dcZHV':_0x43247f(0xc8)};return _0x4ac6d7['positional'](_0x1f2833[_0x43247f(0x1d5)],{'type':_0x1f2833['dcZHV'],'description':_0x43247f(0x1ab),'demandOption':!![]});},async _0x5aa041=>{const _0x4f7c51=_0xb0024,_0x4ee5b9={'ZadAF':function(_0x4ff23d,_0x50f11d,_0x12a369){return _0x4ff23d(_0x50f11d,_0x12a369);},'OdjKg':_0x4f7c51(0x104),'GIUei':function(_0x3ca357,_0x355f6b,_0x161dee){return _0x3ca357(_0x355f6b,_0x161dee);}};_0x4ee5b9[_0x4f7c51(0xff)](warnRenamed,_0x4ee5b9[_0x4f7c51(0x1a6)],_0x4f7c51(0x195)),await _0x4ee5b9[_0x4f7c51(0x193)](withTelemetry,'use',()=>useEnv(_0x5aa041['env-name']));})[_0xb0024(0x117)]('config',![],_0x26937d=>{const _0x4760b8=_0xb0024,_0x24ad92={'eMgBJ':_0x4760b8(0xc8),'CQuDX':'value','klKav':function(_0x28468a,_0x167645,_0x4084ac){return _0x28468a(_0x167645,_0x4084ac);},'JSVmB':'config\x20set','PvFjC':_0x4760b8(0x161),'LSZvZ':'Environment\x20name','Mwvrb':_0x4760b8(0x120),'qHBOK':_0x4760b8(0xe6),'dJyVJ':function(_0x99baef,_0x175145,_0x32c84e){return _0x99baef(_0x175145,_0x32c84e);},'FETfl':_0x4760b8(0x163),'GArFR':'ranger\x20profile\x20config\x20list','kxlEO':'ranger\x20config\x20unset','jFpuo':function(_0x1a27c7,_0x4b6076,_0x475f66){return _0x1a27c7(_0x4b6076,_0x475f66);},'zMkIw':_0x4760b8(0xc2),'gMKYv':'set\x20<env>\x20<key>\x20<value>','zSCUx':_0x4760b8(0x1f7),'UhygT':_0x4760b8(0x18f)};return _0x26937d[_0x4760b8(0x117)](_0x24ad92[_0x4760b8(0x1b1)],![],_0x350c38=>{const _0x48dc4e=_0x4760b8;return _0x350c38[_0x48dc4e(0xf3)](_0x48dc4e(0x161),{'type':_0x24ad92[_0x48dc4e(0x1cb)],'description':'Environment\x20name','demandOption':!![]})[_0x48dc4e(0xf3)](_0x48dc4e(0x120),{'type':_0x24ad92['eMgBJ'],'description':_0x48dc4e(0x206),'demandOption':!![]})['positional'](_0x24ad92[_0x48dc4e(0xf0)],{'type':_0x48dc4e(0xc8),'description':'Config\x20value','demandOption':!![]});},async _0x20ff4d=>{const _0x1a4803=_0x4760b8;_0x24ad92[_0x1a4803(0x12d)](warnRenamed,'ranger\x20config\x20set','ranger\x20profile\x20config\x20set'),await _0x24ad92[_0x1a4803(0x12d)](withTelemetry,_0x24ad92[_0x1a4803(0x15f)],()=>configSet(_0x20ff4d['env'],_0x20ff4d[_0x1a4803(0x120)],_0x20ff4d[_0x1a4803(0x17a)]));})[_0x4760b8(0x117)]('get\x20<env>\x20<key>',![],_0x41096a=>{const _0x5088cb=_0x4760b8;return _0x41096a['positional'](_0x24ad92[_0x5088cb(0x1ac)],{'type':'string','description':_0x24ad92[_0x5088cb(0x1d0)],'demandOption':!![]})[_0x5088cb(0xf3)](_0x24ad92['Mwvrb'],{'type':_0x24ad92['eMgBJ'],'description':_0x24ad92[_0x5088cb(0x184)],'demandOption':!![]});},async _0x41e461=>{const _0x3a11d6=_0x4760b8;warnRenamed('ranger\x20config\x20get','ranger\x20profile\x20config\x20get'),await _0x24ad92['dJyVJ'](withTelemetry,_0x24ad92[_0x3a11d6(0x1eb)],()=>configGet(_0x41e461['env'],_0x41e461[_0x3a11d6(0x120)]));})[_0x4760b8(0x117)](_0x24ad92[_0x4760b8(0x179)],![],_0x589f09=>{const _0x11ffe7=_0x4760b8;return _0x589f09[_0x11ffe7(0xf3)]('env',{'type':'string','description':_0x11ffe7(0xd5),'demandOption':!![]});},async _0x224956=>{const _0x4ab522=_0x4760b8;_0x24ad92[_0x4ab522(0x12d)](warnRenamed,_0x4ab522(0x16a),_0x24ad92['GArFR']),await withTelemetry('config\x20list',()=>configList(_0x224956['env']));})[_0x4760b8(0x117)](_0x24ad92[_0x4760b8(0xdc)],![],_0x772741=>{const _0x450139=_0x4760b8;return _0x772741['positional'](_0x24ad92['PvFjC'],{'type':_0x24ad92[_0x450139(0x1cb)],'description':_0x24ad92['LSZvZ'],'demandOption':!![]})[_0x450139(0xf3)](_0x24ad92[_0x450139(0xce)],{'type':_0x24ad92['eMgBJ'],'description':'Config\x20key\x20to\x20remove','demandOption':!![]});},async _0x3b2a19=>{const _0x9747bb=_0x4760b8;warnRenamed(_0x24ad92[_0x9747bb(0x181)],'ranger\x20profile\x20config\x20unset'),await _0x24ad92[_0x9747bb(0x132)](withTelemetry,_0x24ad92[_0x9747bb(0x1c8)],()=>configUnset(_0x3b2a19['env'],_0x3b2a19['key']));})['demandCommand'](0x1,'You\x20must\x20specify\x20a\x20config\x20subcommand');})['command']('env',![],_0x27e756=>{const _0x887e02=_0xb0024,_0x2e40b6={'AXAvS':function(_0x32fcf0,_0x1df0ba,_0x43b458){return _0x32fcf0(_0x1df0ba,_0x43b458);},'dLuCM':'ranger\x20env\x20ls','rYLkg':_0x887e02(0x1e0),'tTjnW':'env-name','FYqOu':_0x887e02(0xc8),'oUrgy':'ranger\x20env\x20update','Plwys':_0x887e02(0xd9),'rppyC':_0x887e02(0x18e),'DMVbT':'You\x20must\x20specify\x20an\x20env\x20subcommand'};return _0x27e756[_0x887e02(0x117)]('ls',![],()=>{},async()=>{const _0x30a556=_0x887e02;_0x2e40b6[_0x30a556(0x109)](warnRenamed,_0x2e40b6[_0x30a556(0x19b)],_0x2e40b6['rYLkg']),await withTelemetry(_0x30a556(0x1ff),()=>envList());})['command'](_0x887e02(0xd1),![],_0x2f513d=>{const _0x2a2ec3=_0x887e02;return _0x2f513d[_0x2a2ec3(0xf3)](_0x2e40b6['tTjnW'],{'type':_0x2e40b6[_0x2a2ec3(0x190)],'description':'Name\x20of\x20the\x20environment\x20to\x20update','demandOption':!![]});},async _0x3de87e=>{const _0x16e495=_0x887e02;warnRenamed(_0x2e40b6['oUrgy'],_0x2e40b6['Plwys']),await withTelemetry(_0x2e40b6['rppyC'],_0x389147=>updateEnv(_0x3de87e[_0x16e495(0x1c7)],_0x389147));})[_0x887e02(0xee)](0x1,_0x2e40b6[_0x887e02(0xdb)]);})[_0xb0024(0x117)]('feature',![],_0x196d73=>{const _0x4dae38=_0xb0024,_0x122024={'sDiuu':'string','QvDNx':_0x4dae38(0x1d9),'diAel':_0x4dae38(0x1cc),'zSmUP':'Feature\x20review\x20description','ZvxtW':_0x4dae38(0xc5),'RhKVM':_0x4dae38(0x11c),'Xaysh':function(_0x2c9e6b,_0x11adbc,_0x16ade6){return _0x2c9e6b(_0x11adbc,_0x16ade6);},'QBFHi':function(_0x385e24,_0xfbb92b,_0x50632c,_0x24a03b){return _0x385e24(_0xfbb92b,_0x50632c,_0x24a03b);},'mOihF':'--checklist','ytPDT':_0x4dae38(0x1af),'elyQU':'current-branch','aAmpB':_0x4dae38(0x173),'CWNlS':_0x4dae38(0xb7),'Merwy':'number','DHCYn':'Maximum\x20number\x20of\x20feature\x20reviews\x20to\x20return','QLNpF':'offset','lTgyj':_0x4dae38(0x133),'jRXWT':_0x4dae38(0x182),'NKiAj':'feature\x20list','Daeyd':function(_0x36c52e,_0x9f45bb,_0x3a3bcf){return _0x36c52e(_0x9f45bb,_0x3a3bcf);},'xCnOz':_0x4dae38(0x123),'HixPF':_0x4dae38(0x138),'tapSU':_0x4dae38(0x12a),'hPfUU':'Scenario\x20description','pNgHg':_0x4dae38(0x10a),'OUPOe':'feature\x20add-checklist-item','eDmrS':_0x4dae38(0x119),'EwewP':'ranger\x20feature\x20get-feedback','fqtyp':'Feature\x20review\x20ID','tZyGY':'ranger\x20feature\x20delete','SnYSn':_0x4dae38(0x1b3),'asJVj':_0x4dae38(0x1f9),'YjvOg':function(_0x423eda,_0x4f3de3,_0x563934){return _0x423eda(_0x4f3de3,_0x563934);},'fscnL':_0x4dae38(0x15c),'BytQo':_0x4dae38(0x185),'bGEGh':_0x4dae38(0x1fd),'YOApO':_0x4dae38(0x17f),'ajued':_0x4dae38(0x197)};return _0x196d73[_0x4dae38(0x117)](_0x4dae38(0x1b0),![],_0xb695df=>{const _0x371c99=_0x4dae38;return _0xb695df[_0x371c99(0xf3)]('name',{'type':_0x122024[_0x371c99(0x1e5)],'description':_0x122024[_0x371c99(0x1a4)],'demandOption':!![]})['option'](_0x122024[_0x371c99(0x189)],{'type':_0x371c99(0xc8),'alias':'d','description':_0x122024[_0x371c99(0x1ae)]})['option']('checklist',{'type':_0x122024[_0x371c99(0x153)],'alias':'c','description':_0x122024['RhKVM']})['option']('scenario',{'type':_0x371c99(0xc5),'hidden':!![]});},async _0x3002d9=>{const _0x29a6f2=_0x4dae38;_0x122024[_0x29a6f2(0x12e)](warnRenamed,_0x29a6f2(0x159),_0x29a6f2(0xde)),_0x122024['QBFHi'](warnFlagRenamed,_0x29a6f2(0xde),_0x122024[_0x29a6f2(0x1be)],_0x29a6f2(0xe1));const _0xc40d79=_0x3002d9[_0x29a6f2(0xe7)]||_0x3002d9[_0x29a6f2(0x111)];await withTelemetry(_0x122024[_0x29a6f2(0xbe)],()=>featureCreate(_0x3002d9[_0x29a6f2(0x183)],{'description':_0x3002d9['description'],'scenarios':_0xc40d79}));})[_0x4dae38(0x117)](_0x122024[_0x4dae38(0x124)],![],_0x17f840=>{const _0x3381fb=_0x4dae38;return _0x17f840['option'](_0x122024[_0x3381fb(0x171)],{'type':_0x3381fb(0x182),'description':_0x122024[_0x3381fb(0xd4)]})[_0x3381fb(0x11e)](_0x122024[_0x3381fb(0x1f5)],{'type':_0x122024[_0x3381fb(0x19d)],'alias':'l','description':_0x122024[_0x3381fb(0x1c9)],'default':0xa})[_0x3381fb(0x11e)](_0x122024[_0x3381fb(0x187)],{'type':'number','alias':'o','description':_0x122024[_0x3381fb(0x1ec)],'default':0x0})[_0x3381fb(0x11e)](_0x3381fb(0x139),{'type':_0x122024['jRXWT'],'alias':'d','description':'Include\x20soft-deleted\x20feature\x20reviews','default':![]});},async _0x68f49f=>{const _0xef65db=_0x4dae38;warnRenamed(_0xef65db(0x137),'ranger\x20list'),await _0x122024[_0xef65db(0x12e)](withTelemetry,_0x122024[_0xef65db(0x172)],()=>featureList({'currentBranch':_0x68f49f['current-branch'],'limit':_0x68f49f[_0xef65db(0xb7)],'offset':_0x68f49f['offset'],'includeDeleted':_0x68f49f['include-deleted']}));})[_0x4dae38(0x117)]('show\x20[id]',![],_0x38b4d2=>{const _0x5a37e5=_0x4dae38;return _0x38b4d2[_0x5a37e5(0xf3)]('id',{'type':_0x122024[_0x5a37e5(0x1e5)],'description':_0x5a37e5(0x1bb)});},async _0x53981a=>{const _0x453d72=_0x4dae38;_0x122024['Daeyd'](warnRenamed,_0x122024[_0x453d72(0x17c)],_0x453d72(0x1e7)),await withTelemetry('feature\x20show',()=>featureShow(_0x53981a['id']));})[_0x4dae38(0x117)](_0x122024[_0x4dae38(0x118)],![],_0x357c3d=>{return _0x357c3d['positional']('id',{'type':'string','description':'Feature\x20review\x20ID\x20(optional\x20-\x20bypasses\x20search/prompt)'});},async _0x3dc884=>{const _0x38a906=_0x4dae38;_0x122024[_0x38a906(0xf5)](warnRenamed,_0x122024[_0x38a906(0x178)],_0x122024['tapSU']),await _0x122024[_0x38a906(0x12e)](withTelemetry,'feature\x20resume',()=>featureResume(_0x3dc884['id']));})[_0x4dae38(0x117)](_0x4dae38(0xc9),![],_0x2df7eb=>{const _0x3e1150=_0x4dae38;return _0x2df7eb['positional'](_0x3e1150(0x1cc),{'type':'string','description':_0x122024[_0x3e1150(0x103)],'demandOption':!![]})[_0x3e1150(0x11e)]('id',{'type':_0x3e1150(0xc8),'description':_0x3e1150(0x119)});},async _0x19affe=>{const _0x1703f5=_0x4dae38;warnRenamed(_0x122024[_0x1703f5(0xf4)],'ranger\x20add-scenario'),await withTelemetry(_0x122024[_0x1703f5(0x101)],()=>featureAddScenario(_0x19affe[_0x1703f5(0x1cc)],_0x19affe['id']));})['command']('get-feedback\x20[id]',![],_0x178e6a=>{const _0x46970c=_0x4dae38;return _0x178e6a['positional']('id',{'type':'string','description':_0x122024[_0x46970c(0x1d1)]});},async _0x12afbd=>{warnRenamed(_0x122024['EwewP'],'ranger\x20get-review'),await withTelemetry('feature\x20get-feedback',()=>featureGetReview(_0x12afbd['id']));})['command'](_0x122024[_0x4dae38(0x125)],![],_0x64b59b=>{const _0x1deccf=_0x4dae38;return _0x64b59b[_0x1deccf(0xf3)]('id',{'type':_0x122024['sDiuu'],'description':_0x122024['fqtyp']});},async _0x1b75ee=>{const _0x3e73bc=_0x4dae38;warnRenamed(_0x122024['tZyGY'],_0x3e73bc(0x18b)),await _0x122024[_0x3e73bc(0xf5)](withTelemetry,_0x122024['SnYSn'],()=>featureDelete(_0x1b75ee['id']));})[_0x4dae38(0x117)](_0x122024['YOApO'],![],_0x4f902d=>{const _0x206e03=_0x4dae38;return _0x4f902d[_0x206e03(0xf3)]('id',{'type':_0x122024[_0x206e03(0x1e5)],'description':_0x122024[_0x206e03(0xcb)],'demandOption':!![]});},async _0x361f27=>{const _0x58fb54=_0x4dae38;_0x122024['Daeyd'](warnRenamed,_0x58fb54(0x175),'ranger\x20restore'),await _0x122024['YjvOg'](withTelemetry,_0x58fb54(0x18c),()=>featureRestore(_0x361f27['id']));})['demandCommand'](0x1,_0x122024[_0x4dae38(0x116)]);})[_0xb0024(0x117)](_0xb0024(0x1e9),![],_0x4f44dd=>{const _0x50985d=_0xb0024,_0x5c08fe={'kcdBx':_0x50985d(0x1b8),'RjmRo':_0x50985d(0xc8),'WRavL':'Session\x20ID\x20(for\x20non-Claude\x20integrations\x20like\x20OpenCode)','wdtMk':function(_0x166d71,_0x1083e6,_0x5cc0c7){return _0x166d71(_0x1083e6,_0x5cc0c7);},'AnrFh':'Enable\x20Ranger\x20hooks\x20for\x20this\x20session','kdmAo':_0x50985d(0x107),'rycMJ':_0x50985d(0x183)};return _0x4f44dd[_0x50985d(0x117)](_0x50985d(0x1b5),_0x5c08fe['AnrFh'],_0x1b77a5=>{const _0x4d5476=_0x50985d;return _0x1b77a5[_0x4d5476(0x11e)](_0x5c08fe['kcdBx'],{'type':_0x5c08fe[_0x4d5476(0x10e)],'description':_0x5c08fe[_0x4d5476(0x188)]});},async _0x58d2bb=>{const _0x3dbff6=_0x50985d;await _0x5c08fe['wdtMk'](withTelemetry,'hook:enable',()=>hook(_0x3dbff6(0x1b5),_0x58d2bb[_0x3dbff6(0x1b8)]));})[_0x50985d(0x117)](_0x5c08fe['kdmAo'],_0x50985d(0x135),_0x1dcea6=>{const _0x2134b5=_0x50985d;return _0x1dcea6[_0x2134b5(0x11e)](_0x5c08fe['kcdBx'],{'type':_0x5c08fe[_0x2134b5(0x10e)],'description':_0x5c08fe['WRavL']});},async _0x1c4254=>{const _0x567644=_0x50985d;await withTelemetry('hook:disable',()=>hook(_0x567644(0x107),_0x1c4254[_0x567644(0x1b8)]));})['option'](_0x5c08fe['rycMJ'],{'type':_0x5c08fe[_0x50985d(0x10e)],'description':_0x50985d(0x144)})['option']('session-id',{'type':_0x50985d(0xc8),'description':_0x5c08fe[_0x50985d(0x188)]});},async _0x5e3bfc=>{const _0x1b0a95=_0xb0024,_0x43bb75={'TXRcT':function(_0x355d94,_0x334472,_0x2fbd44){return _0x355d94(_0x334472,_0x2fbd44);},'xaXji':_0x1b0a95(0x1b8)};_0x5e3bfc['name']&&await _0x43bb75[_0x1b0a95(0x1d6)](hook,_0x5e3bfc['name'],_0x5e3bfc[_0x43bb75['xaXji']]);})['demandCommand'](0x1,_0xb0024(0x1aa))[_0xb0024(0xb6)]()[_0xb0024(0x1d2)](async(_0x252ef2,_0x479a61,_0xf233f4)=>{const _0x14e2c8=_0xb0024,_0x1612f8={'ykkTJ':function(_0x3b4faa,_0x436cd2){return _0x3b4faa(_0x436cd2);},'qCUPj':function(_0x25099e,_0xefdb5d){return _0x25099e||_0xefdb5d;}},_0x1de71d=_0x1612f8['ykkTJ'](sanitizeArgs,process[_0x14e2c8(0xc0)]['slice'](0x2)),_0x3a7697=getErrorType(_0x252ef2,_0x479a61);if(_0x252ef2&&_0x252ef2[_0x14e2c8(0x12c)](_0x14e2c8(0x10d))){const _0x49dd29=process['argv'][0x2];console[_0x14e2c8(0x126)]('\x0aUnknown\x20command:\x20'+_0x49dd29),console[_0x14e2c8(0x126)]('Run\x20\x22ranger\x20--help\x22\x20to\x20see\x20available\x20commands.\x0a');}else{if(_0x252ef2)console['error']('\x0a'+_0x252ef2+'\x0a');else _0x479a61&&console['error']('\x0aError:\x20'+_0x479a61['message']+'\x0a');}await logDesirePath({'rawCommand':_0x1de71d,'errorMessage':_0x252ef2||_0x479a61?.[_0x14e2c8(0xbd)],'errorType':_0x3a7697});const _0x5cfe23=getCurrentCollector();_0x5cfe23&&await _0x5cfe23[_0x14e2c8(0x1fe)](_0x479a61||new Error(_0x1612f8['qCUPj'](_0x252ef2,'Unknown\x20error'))),process[_0x14e2c8(0x13a)](0x1);})['epilogue'](_0xb0024(0xbb)+'\x20\x20https://docs.ranger.net\x0a'+_0xb0024(0x1d4))[_0xb0024(0x1db)]()['alias']('help','h')[_0xb0024(0x148)]();
|