@ranger-testing/ranger-cli 2.0.5 → 2.0.6
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/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 +1 -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 _0x227e61=_0x2cd1;function _0x75ec(){const _0x5a5a50=['gsjlF','--task','iWgGD','DTekh','cELET','uwmmC','blocked','ranger\x20feature\x20resume','SsLpJ','TdJKB','KJiVJ','base-url','Name\x20of\x20the\x20environment\x20(e.g.,\x20local,\x20staging,\x20prod)','Ilpuh','aOGIM','lQcdX','obAqD','setup-ci\x20<token>','get-feedback\x20[id]','gHmdM','list\x20<profile>','show\x20[id]','kzdZr','zGndF','config\x20list','UBuAe','uNvKc','tLQWg','Scenario\x20description','ranger\x20feature\x20restore','vDoUQ','restore\x20<id>','Feature\x20review\x20ID\x20(uses\x20active\x20feature\x20review\x20if\x20not\x20provided)','update','KlKYd','zxJPa','JlCFr','debug-outcome','Show\x20reviewer\x20feedback\x20(comments)\x20for\x20all\x20scenarios','euYUy','SIUpQ','argv','ranger\x20env\x20update','Ranger\x20API\x20token\x20(omit\x20to\x20log\x20in\x20via\x20browser)','ranger\x20create','Restore\x20a\x20soft-deleted\x20feature\x20review','verified','ranger\x20feature\x20create','list','use\x20<env-name>','QoxNT','ydAyc','feature\x20get-feedback','qhdOb','nrvPc','usage','key','Name\x20of\x20the\x20profile\x20to\x20update','resume\x20[id]','UIQgE','ZucSW','log','error','ranger\x20feature\x20list','ranger\x20add-scenario','positional','skip-auth','NnOaH','Soft\x20delete\x20a\x20feature\x20review\x20(uses\x20active\x20feature\x20review\x20if\x20no\x20id)','ranger\x20feature\x20show','SxYdL','limit','profile\x20ls','You\x20must\x20specify\x20a\x20feature\x20review\x20subcommand','env\x20update','ranger\x20show','GwfeN','Set\x20up\x20Ranger\x20for\x20CI\x20(non-interactive)','enable','Feature\x20review\x20ID','Disable\x20Ranger\x20hooks\x20for\x20this\x20session','QPqhJ','ranger\x20config\x20unset','exitCode','WJewj','boolean','cRnKM','item','config\x20unset','add-scenario\x20<description>','yHkMr','JQMpJ','nyote','ranger\x20profile\x20ls','1615siqyqi','List\x20all\x20profiles','Run\x20\x22ranger\x20--help\x22\x20to\x20see\x20available\x20commands.\x0a','feature\x20add-checklist-item','pGaRR','ranger\x20config\x20get','ZbMHx','Manage\x20profile\x20configuration','create','jFiXG','config\x20set','NICdE','HdBvJ','QZYbD','message','scenario','xGIOi','exit','start','evaluation','Environment\x20name','edit-scenario\x20<description>','DGqTS','ncHkM','setup\x20[token]','Feature\x20review\x20ID\x20to\x20restore','oCLbQ','CMJsN','cONJb','ynDoY','Base\x20URL\x20for\x20the\x20app\x20(creates/updates\x20profile\x20settings)','cHNap','demandCommand','include-deleted','IONSM','KqJPJ','RyTYo','XmajP','string','qjTUK','--notes','unset\x20<env>\x20<key>','Task\x20description\x20(defaults\x20to\x20scenario\x20description)','skip-chromium','checklist','feature\x20show','kXCds','.\x20[','FwWao','dwBHa','config','Config\x20key\x20(e.g.,\x20userAgent,\x20header.X-Custom)','get\x20<env>\x20<key>','HbTpZ','vDLzp','scriptName','Feature\x20review\x20name','profile\x20update','clean','session-id','ranger\x20profile\x20config\x20list','create\x20<name>','token','ranger\x20profile\x20use','YobfB','OMPCI','pmEQI','YikDl','Path\x20to\x20start\x20on\x20(appended\x20to\x20base\x20URL,\x20e.g.,\x20/dashboard)','ChkYV','myuQO','ranger\x20add\x20env','task','Profile\x20to\x20use\x20(defaults\x20to\x20active\x20profile)','Include\x20soft-deleted\x20feature\x20reviews','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','ranger\x20use','ranger\x20profile\x20encrypt-auth','ranger\x20profile\x20config\x20set','--profile','Config\x20key','value','ranger\x20profile\x20config\x20unset','seUrN','oqFlx','command','rcRwo','get\x20<profile>\x20<key>','230pdKSGa','notes','issues','AHsaL','1196DgoDeH','yrbFx','resume','3967048EsAquQ','feature\x20create','fnwti','Skip\x20browser\x20authentication\x20(just\x20save\x20URL\x20and\x20settings)','ranger\x20auth\x20encrypt','Profile\x20name','11985faeLTM','skillup','kTQle','login','CzqMb','CPqUr','mWngI','Maximum\x20number\x20of\x20feature\x20reviews\x20to\x20return','DBJgg','New\x20scenario\x20description','gbWnw','Verify\x20a\x20scenario\x20in\x20the\x20browser\x20(requires\x20active\x20feature\x20review)','env','hook:disable','Skip\x20Chromium\x20browser\x20installation','You\x20must\x20specify\x20a\x20command','Number\x20of\x20feature\x20reviews\x20to\x20skip','Skip\x20Chromium\x20browser\x20check\x20and\x20installation','Name\x20of\x20the\x20environment\x20to\x20update','Gcheh','profile','ranger\x20restore','JKSwo','Get\x20a\x20config\x20value','qtAKS','status','set\x20<profile>\x20<key>\x20<value>','Log\x20in\x20to\x20Ranger\x20via\x20browser\x20(re-authenticate\x20without\x20full\x20setup)','option','Documentation:\x0a','MVOgR','ranger\x20env\x20ls','array','partial','description','NghPq','kQqQa','LHCWd','number','Initialize\x20Ranger\x20in\x20your\x20project','uFteT','WDVyf','ctBxm','\x20\x20https://docs.ranger.net\x0a','list\x20<env>','\x20INCOMPLETE','ranger\x20start','bfAQd','bhOoB','rzEpz','offset','12878334gCEVBy','414264EHnPGS','rqSJN','NTKZM','Scenario\x20index\x20(1-based)','EHMsc','strictCommands','verify-feature','Feature\x20review\x20ID\x20(optional\x20-\x20bypasses\x20search/prompt)','ranger\x20config\x20list','cwd','RKhti','983610pbnKuP','jJarm','eKexG','Scenarios\x20(use\x20multiple\x20-c\x20flags\x20for\x20multiple\x20scenarios)','MOLoP','Create\x20CI\x20environment\x20(encrypted\x20auth,\x20committed\x20to\x20git)','env\x20list','\x20BLOCKED','add\x20env\x20<env-name>','ranger\x20feature\x20get-feedback','McIMF','--checklist','CiPKR','Config\x20key\x20to\x20remove','profile-name','YOZtz','TUMVk','hook:enable','oNiAl','lADqg','ranger\x20feature\x20add-checklist-item','utVQi','uqPjl','Sloza','MMGaB','SZPNB','\x20PARTIAL','incomplete','qaVBC','profile\x20config\x20set','qjWqn','3255434KcSmWp','env-name','Reason:\x20','\x20FAILED','current-branch','bAElT','pJyDv','Episi','ranger\x20go','JsZZW','nqcZw','Pdwju','TDrXN','.ranger','Update\x20Ranger\x20CLI\x20to\x20the\x20latest\x20version','KVoJb','tkxvS','VeNxO'];_0x75ec=function(){return _0x5a5a50;};return _0x75ec();}(function(_0x5a37a1,_0x135cb9){const _0x557298=_0x2cd1,_0xa1d33c=_0x5a37a1();while(!![]){try{const _0x31b791=-parseInt(_0x557298(0x1fc))/0x1+parseInt(_0x557298(0x1bb))/0x2*(parseInt(_0x557298(0x1c8))/0x3)+-parseInt(_0x557298(0x1bf))/0x4*(parseInt(_0x557298(0x163))/0x5)+-parseInt(_0x557298(0xd4))/0x6+-parseInt(_0x557298(0xf3))/0x7+-parseInt(_0x557298(0x1c2))/0x8+parseInt(_0x557298(0x1fb))/0x9;if(_0x31b791===_0x135cb9)break;else _0xa1d33c['push'](_0xa1d33c['shift']());}catch(_0xbe82b9){_0xa1d33c['push'](_0xa1d33c['shift']());}}}(_0x75ec,0x3e2a8));function _0x2cd1(_0x385c0,_0x51b612){_0x385c0=_0x385c0-0xcb;const _0x75ec4e=_0x75ec();let _0x2cd17a=_0x75ec4e[_0x385c0];return _0x2cd17a;}import _0x42c2f9 from'dotenv';import{dirname,join,parse}from'path';import{existsSync}from'fs';function findProjectRoot(){const _0x49af10=_0x2cd1,_0x33236a={'nqcZw':function(_0x2a5690,_0x301d33){return _0x2a5690(_0x301d33);},'oSDEh':function(_0x3523a7,_0x2eab8e){return _0x3523a7!==_0x2eab8e;},'GyUnj':function(_0x4d9d40,_0x5ae3f7){return _0x4d9d40(_0x5ae3f7);},'lADqg':function(_0x3efcf2,_0x214463,_0x43bd3b){return _0x3efcf2(_0x214463,_0x43bd3b);},'CMJsN':function(_0x3e67dc,_0x2ceab2){return _0x3e67dc(_0x2ceab2);}};let _0x5337a0=process[_0x49af10(0xd2)]();const _0x5d4137=_0x33236a[_0x49af10(0xfd)](parse,_0x5337a0)['root'];while(_0x33236a['oSDEh'](_0x5337a0,_0x5d4137)){if(_0x33236a['GyUnj'](existsSync,_0x33236a[_0x49af10(0xe7)](join,_0x5337a0,_0x49af10(0x100)))||_0x33236a[_0x49af10(0x17e)](existsSync,join(_0x5337a0,'.env')))return _0x5337a0;_0x5337a0=_0x33236a[_0x49af10(0xfd)](dirname,_0x5337a0);}return process['cwd']();}_0x42c2f9['config']({'path':join(findProjectRoot(),'.env')});import _0x3069d7 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';import{getCurrentVersion}from'./commands/utils/version.js';import{withTelemetry,getCurrentCollector}from'./commands/utils/telemetry.js';process['on']('unhandledRejection',async _0x196719=>{const _0x52d6e1=_0x2cd1,_0xae9e0={'gHmdM':function(_0x1a0835){return _0x1a0835();}},_0x3157c6=_0xae9e0[_0x52d6e1(0x118)](getCurrentCollector);_0x3157c6&&await _0x3157c6['trackCommandError'](_0x196719),process[_0x52d6e1(0x158)]=0x1;});const rawArgs=process[_0x227e61(0x12e)]['slice'](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=_0x227e61(0x1ae),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(_0xd44ccf,_0x45681c){const _0x1c2e97=_0x227e61;console[_0x1c2e97(0x143)]('\x0a'+_0xd44ccf+'\x20is\x20now\x20'+_0x45681c+'\x0a');}function argUsed(_0x3a5aac){return rawArgs['some'](_0x4a6413=>_0x4a6413===_0x3a5aac||_0x4a6413['startsWith'](_0x3a5aac+'='));}function warnFlagRenamed(_0x5350ce,_0x25260d,_0x571145){const _0x4c5b34=_0x227e61,_0x1177f8={'ChkYV':function(_0x4d7323,_0x11e7e9){return _0x4d7323(_0x11e7e9);}};_0x1177f8[_0x4c5b34(0x1a8)](argUsed,_0x25260d)&&warnRenamed(_0x5350ce+'\x20'+_0x25260d,_0x5350ce+'\x20'+_0x571145);}async function runGoCommand(_0x401465,_0x43aa35=![]){const _0x37fea7=_0x227e61,_0x1a85b={'IlWGu':'ranger\x20verify-feature','rPMPr':'ranger\x20go','rcRwo':'--env','fnwti':_0x37fea7(0x1b2),'SOxFx':function(_0xf8944e,_0x2f954f,_0x34fab3,_0x5f2d07){return _0xf8944e(_0x2f954f,_0x34fab3,_0x5f2d07);},'gsjlF':_0x37fea7(0x18b),'SRRCw':'--item','uLuuX':function(_0x4aa540,_0x3098ef){return _0x4aa540(_0x3098ef);},'cELET':'debug-outcome','UBuAe':function(_0x1cad34,_0x4f9b8e){return _0x1cad34===_0x4f9b8e;},'CdtvP':_0x37fea7(0x133),'vFsay':'\x20VERIFIED','AGChL':function(_0x574d18,_0x5c7aa9){return _0x574d18===_0x5c7aa9;},'AnOZb':'partial','YobfB':_0x37fea7(0xee),'wVFgN':_0x37fea7(0xdb),'VeNxO':'\x0aIssues:','ZbMHx':function(_0x1a6780,_0xa80d4a){return _0x1a6780===_0xa80d4a;}};_0x43aa35&&warnRenamed(_0x1a85b['IlWGu'],_0x1a85b['rPMPr']);warnFlagRenamed('ranger\x20go',_0x1a85b[_0x37fea7(0x1b9)],_0x1a85b[_0x37fea7(0x1c4)]),_0x1a85b['SOxFx'](warnFlagRenamed,_0x37fea7(0xfb),_0x37fea7(0x106),_0x1a85b[_0x37fea7(0x105)]),warnFlagRenamed('ranger\x20go',_0x1a85b['SRRCw'],'--scenario');const _0x277a94=await _0x1a85b['uLuuX'](verifyFeature,{'profile':_0x401465['profile']??_0x401465['env'],'notes':_0x401465[_0x37fea7(0x1bc)]??_0x401465[_0x37fea7(0x1ab)],'scenario':_0x401465[_0x37fea7(0x172)]??_0x401465['item'],'startPath':_0x401465['start-path'],'debugOutcome':_0x401465[_0x1a85b[_0x37fea7(0x109)]],'debugAddressComments':_0x401465['debug-address-comments']});console['log']('\x0a'+'='['repeat'](0x3c)),console[_0x37fea7(0x142)](_0x1a85b[_0x37fea7(0x11e)](_0x277a94['evaluation'],_0x1a85b['CdtvP'])?_0x1a85b['vFsay']:_0x277a94[_0x37fea7(0x176)]===_0x37fea7(0xef)?_0x37fea7(0x1f5):_0x1a85b['AGChL'](_0x277a94['evaluation'],_0x1a85b['AnOZb'])?_0x1a85b[_0x37fea7(0x1a3)]:_0x1a85b['UBuAe'](_0x277a94['evaluation'],_0x37fea7(0x10b))?_0x1a85b['wVFgN']:_0x37fea7(0xf6)),console[_0x37fea7(0x142)]('='['repeat'](0x3c)),console[_0x37fea7(0x142)]('Summary:\x20'+_0x277a94['summary']),console[_0x37fea7(0x142)]('Evaluation:\x20'+_0x277a94['evaluation']),console[_0x37fea7(0x142)](_0x37fea7(0xf5)+_0x277a94['evaluationReason']),_0x277a94[_0x37fea7(0x1bd)]?.['length']&&(console[_0x37fea7(0x142)](_0x1a85b[_0x37fea7(0x104)]),_0x277a94[_0x37fea7(0x1bd)]['forEach']((_0x27d703,_0x98a5bd)=>{const _0x428208=_0x37fea7;console['log']('\x0a'+(_0x98a5bd+0x1)+_0x428208(0x192)+_0x27d703['severity']+']\x20'+_0x27d703[_0x428208(0x1ea)]);})),process['exit'](_0x1a85b[_0x37fea7(0x169)](_0x277a94[_0x37fea7(0x176)],'verified')?0x0:0x1);}_0x3069d7(process['argv']['slice'](0x2))[_0x227e61(0x19a)]('ranger')[_0x227e61(0x13c)](TOP_LEVEL_HELP)['version'](getCurrentVersion())['command']('create\x20<name>','Create\x20a\x20new\x20feature\x20review\x20with\x20scenarios',_0x4ee163=>{const _0x565a50=_0x227e61,_0x376b6c={'jJarm':'name','McIMF':'string','iWgGD':'Scenarios\x20(use\x20multiple\x20-c\x20flags\x20for\x20multiple\x20scenarios)','aRAQQ':'checklist'};return _0x4ee163['positional'](_0x376b6c[_0x565a50(0xd5)],{'type':_0x376b6c[_0x565a50(0xde)],'description':_0x565a50(0x19b),'demandOption':!![]})['option'](_0x565a50(0x1ea),{'type':_0x376b6c['McIMF'],'alias':'d','description':'Feature\x20review\x20description'})[_0x565a50(0x1e4)](_0x565a50(0x172),{'type':'array','alias':'c','description':_0x376b6c[_0x565a50(0x107)]})[_0x565a50(0x1e4)](_0x376b6c['aRAQQ'],{'type':_0x565a50(0x1e8),'hidden':!![]});},async _0x2d2765=>{const _0x212e72=_0x227e61,_0x3863fd={'uDUuU':_0x212e72(0xdf),'kdoAB':function(_0x3c4db9,_0x1b7875,_0x1579a4){return _0x3c4db9(_0x1b7875,_0x1579a4);},'DTekh':_0x212e72(0x16b)};warnFlagRenamed('ranger\x20create',_0x3863fd['uDUuU'],'--scenario');const _0x79887f=_0x2d2765['scenario']||_0x2d2765['checklist'];await _0x3863fd['kdoAB'](withTelemetry,_0x3863fd[_0x212e72(0x108)],()=>featureCreate(_0x2d2765['name'],{'description':_0x2d2765['description'],'scenarios':_0x79887f}));})['command']('list','List\x20all\x20feature\x20reviews',_0x2f1355=>{const _0x528e2c=_0x227e61,_0x5be8ba={'SxYdL':'boolean','TdJKB':_0x528e2c(0x1ee),'QvjPn':_0x528e2c(0x1fa)};return _0x2f1355[_0x528e2c(0x1e4)](_0x528e2c(0xf7),{'type':_0x5be8ba[_0x528e2c(0x14b)],'description':'Filter\x20to\x20feature\x20reviews\x20for\x20current\x20git\x20branch'})['option'](_0x528e2c(0x14c),{'type':_0x5be8ba[_0x528e2c(0x10e)],'alias':'l','description':_0x528e2c(0x1cf),'default':0xa})[_0x528e2c(0x1e4)](_0x5be8ba['QvjPn'],{'type':_0x528e2c(0x1ee),'alias':'o','description':_0x528e2c(0x1d8),'default':0x0})[_0x528e2c(0x1e4)](_0x528e2c(0x184),{'type':_0x528e2c(0x15a),'alias':'d','description':_0x528e2c(0x1ad),'default':![]});},async _0x5a3fd7=>{const _0x248129=_0x227e61,_0x18d9f7={'qUaKb':'list'};await withTelemetry(_0x18d9f7['qUaKb'],()=>featureList({'currentBranch':_0x5a3fd7[_0x248129(0xf7)],'limit':_0x5a3fd7['limit'],'offset':_0x5a3fd7[_0x248129(0x1fa)],'includeDeleted':_0x5a3fd7[_0x248129(0x184)]}));})['command']('show\x20[id]','Show\x20feature\x20review\x20details\x20(uses\x20active\x20feature\x20review\x20if\x20no\x20id)',_0x15d822=>{const _0x4f92e2=_0x227e61,_0x4df011={'LmPdM':_0x4f92e2(0x189)};return _0x15d822['positional']('id',{'type':_0x4df011['LmPdM'],'description':'Feature\x20review\x20ID'});},async _0x18fb12=>{await withTelemetry('show',()=>featureShow(_0x18fb12['id']));})[_0x227e61(0x1b8)]('resume\x20[id]','Find\x20and\x20use\x20feature\x20review\x20matching\x20current\x20git\x20context',_0x1dfd3e=>{const _0x11af1a=_0x227e61,_0x407372={'euYUy':'string','oNiAl':_0x11af1a(0xd0)};return _0x1dfd3e[_0x11af1a(0x146)]('id',{'type':_0x407372[_0x11af1a(0x12c)],'description':_0x407372[_0x11af1a(0xe6)]});},async _0x520dd4=>{const _0x4927b1=_0x227e61,_0x1e6757={'rzEpz':_0x4927b1(0x1c1)};await withTelemetry(_0x1e6757[_0x4927b1(0x1f9)],()=>featureResume(_0x520dd4['id']));})['command'](_0x227e61(0x15e),'Add\x20a\x20scenario\x20to\x20the\x20active\x20feature\x20review',_0x36a6d9=>{const _0x32cfec=_0x227e61,_0x1b7cd4={'MMGaB':_0x32cfec(0x1ea),'uFteT':'string','YikDl':_0x32cfec(0x121),'hWkVO':'Feature\x20review\x20ID\x20(uses\x20active\x20feature\x20review\x20if\x20not\x20provided)'};return _0x36a6d9['positional'](_0x1b7cd4[_0x32cfec(0xec)],{'type':_0x1b7cd4[_0x32cfec(0x1f0)],'description':_0x1b7cd4[_0x32cfec(0x1a6)],'demandOption':!![]})['option']('id',{'type':_0x1b7cd4[_0x32cfec(0x1f0)],'description':_0x1b7cd4['hWkVO']});},async _0x189082=>{await withTelemetry('add-scenario',()=>featureAddScenario(_0x189082['description'],_0x189082['id']));})['command'](_0x227e61(0x178),'Edit\x20a\x20scenario\x20description\x20on\x20the\x20active\x20feature\x20review',_0x40cfd4=>{const _0x1bcf49=_0x227e61,_0x21de0b={'tnKsz':'description','LHqAH':_0x1bcf49(0x189),'jEEVY':_0x1bcf49(0x1d1),'Ilpuh':'scenario','Gcheh':'number','TdXDG':'Scenario\x20number\x20to\x20edit\x20(1-based)','FwWao':_0x1bcf49(0x125)};return _0x40cfd4['positional'](_0x21de0b['tnKsz'],{'type':_0x21de0b['LHqAH'],'description':_0x21de0b['jEEVY'],'demandOption':!![]})['option'](_0x21de0b[_0x1bcf49(0x112)],{'type':_0x21de0b[_0x1bcf49(0x1db)],'description':_0x21de0b['TdXDG'],'demandOption':!![]})['option']('id',{'type':_0x21de0b['LHqAH'],'description':_0x21de0b[_0x1bcf49(0x193)]});},async _0x3f61ab=>{const _0x2a6b12=_0x227e61,_0x56467c={'KqJPJ':'edit-scenario'};await withTelemetry(_0x56467c[_0x2a6b12(0x186)],()=>featureEditScenario(_0x3f61ab[_0x2a6b12(0x1ea)],{'id':_0x3f61ab['id'],'scenario':_0x3f61ab[_0x2a6b12(0x172)]}));})[_0x227e61(0x1b8)]('get-review\x20[id]',_0x227e61(0x12b),_0x28848f=>{const _0x309148=_0x227e61,_0x5ece3a={'utVQi':'Feature\x20review\x20ID\x20(uses\x20active\x20feature\x20review\x20if\x20not\x20provided)'};return _0x28848f[_0x309148(0x146)]('id',{'type':_0x309148(0x189),'description':_0x5ece3a[_0x309148(0xe9)]});},async _0x2e131c=>{const _0x37c18f={'muwlE':function(_0x987ed4,_0x119d0e,_0x40675a){return _0x987ed4(_0x119d0e,_0x40675a);}};await _0x37c18f['muwlE'](withTelemetry,'get-review',()=>featureGetReview(_0x2e131c['id']));})[_0x227e61(0x1b8)]('delete\x20[id]',_0x227e61(0x149),_0x127991=>{const _0x6e5178=_0x227e61,_0x3593dd={'OMPCI':_0x6e5178(0x189),'tkxvS':'Feature\x20review\x20ID'};return _0x127991['positional']('id',{'type':_0x3593dd[_0x6e5178(0x1a4)],'description':_0x3593dd[_0x6e5178(0x103)]});},async _0x3c9b11=>{await withTelemetry('delete',()=>featureDelete(_0x3c9b11['id']));})['command'](_0x227e61(0x124),_0x227e61(0x132),_0x23eeae=>{const _0x2b7b59=_0x227e61,_0x45c78f={'kzdZr':_0x2b7b59(0x17c)};return _0x23eeae['positional']('id',{'type':'string','description':_0x45c78f[_0x2b7b59(0x11b)],'demandOption':!![]});},async _0xabbc3b=>{const _0x5478ba=_0x227e61,_0x3bfdfa={'pGaRR':function(_0x22a969,_0x83286b,_0x351d9f){return _0x22a969(_0x83286b,_0x351d9f);},'cPTRP':'restore'};await _0x3bfdfa[_0x5478ba(0x167)](withTelemetry,_0x3bfdfa['cPTRP'],()=>featureRestore(_0xabbc3b['id']));})[_0x227e61(0x1b8)](_0x227e61(0x17b),_0x227e61(0x1ef),_0xdd12e4=>{const _0x54810d=_0x227e61,_0x4a21b5={'hlerL':'Ranger\x20API\x20token\x20(omit\x20to\x20log\x20in\x20via\x20browser)','RcpOj':_0x54810d(0x18e),'WJewj':_0x54810d(0x15a)};return _0xdd12e4[_0x54810d(0x146)]('token',{'type':_0x54810d(0x189),'description':_0x4a21b5['hlerL']})[_0x54810d(0x1e4)](_0x4a21b5['RcpOj'],{'type':_0x4a21b5[_0x54810d(0x159)],'description':_0x54810d(0x1d9),'default':![]});},async _0x29656f=>{const _0x4d5499=_0x227e61,_0x50b5c4={'yzlZX':function(_0xaefdcc,_0x2ccd00,_0x248da9){return _0xaefdcc(_0x2ccd00,_0x248da9);}};await _0x50b5c4['yzlZX'](withTelemetry,'start',_0x55b3c6=>start(_0x29656f['token'],{'skipChromium':_0x29656f[_0x4d5499(0x18e)]},_0x55b3c6));})['command'](_0x227e61(0x116),_0x227e61(0x152),_0x41d649=>{const _0x53535a=_0x227e61,_0x26a4c1={'qRMwZ':_0x53535a(0x189),'qhdOb':'Ranger\x20API\x20token','TTSeV':'profile','oCLbQ':_0x53535a(0x181),'xCGwV':_0x53535a(0x18e),'goglI':_0x53535a(0x15a)};return _0x41d649[_0x53535a(0x146)]('token',{'type':_0x26a4c1['qRMwZ'],'description':_0x26a4c1[_0x53535a(0x13a)],'demandOption':!![]})['option'](_0x26a4c1['TTSeV'],{'type':_0x53535a(0x189),'description':'CI\x20profile\x20name\x20(auto-detected\x20if\x20only\x20one\x20exists)'})['option'](_0x53535a(0x110),{'type':_0x53535a(0x189),'description':_0x26a4c1[_0x53535a(0x17d)]})[_0x53535a(0x1e4)](_0x26a4c1['xCGwV'],{'type':_0x26a4c1['goglI'],'description':_0x53535a(0x1d6),'default':![]});},async _0x55d773=>{const _0x3902fc=_0x227e61,_0x59b642={'HbTpZ':function(_0x379074,_0xd253a5,_0x48143d){return _0x379074(_0xd253a5,_0x48143d);},'RKhti':'setup-ci'};await _0x59b642[_0x3902fc(0x198)](withTelemetry,_0x59b642[_0x3902fc(0xd3)],_0x5cc2b3=>setupCi(_0x55d773[_0x3902fc(0x1a1)],{'profile':_0x55d773['profile'],'baseUrl':_0x55d773[_0x3902fc(0x110)],'skipChromium':_0x55d773['skip-chromium']},_0x5cc2b3));})['command']('login',_0x227e61(0x1e3),()=>{},async()=>{const _0x194d8b=_0x227e61,_0x45c5e2={'pAnxd':function(_0x5bfad2,_0x4e1920,_0x5e4999){return _0x5bfad2(_0x4e1920,_0x5e4999);}};await _0x45c5e2['pAnxd'](withTelemetry,_0x194d8b(0x1cb),()=>login());})['command'](_0x227e61(0x1c9),'Install\x20Ranger\x20skills\x20for\x20Claude\x20Code',()=>{},async()=>{const _0x2fc1df=_0x227e61,_0x10240b={'JlCFr':_0x2fc1df(0x1c9)};await withTelemetry(_0x10240b[_0x2fc1df(0x129)],()=>skillup());})['command']('clean','Remove\x20all\x20Ranger\x20artifacts\x20from\x20the\x20project',()=>{},async()=>{const _0x21cce1=_0x227e61,_0x40897a={'uqPjl':_0x21cce1(0x19d)};await withTelemetry(_0x40897a[_0x21cce1(0xea)],()=>clean());})[_0x227e61(0x1b8)](_0x227e61(0x1dc),'Manage\x20profiles',_0x5d113f=>{const _0x446629=_0x227e61,_0x595d9c={'JROnS':'Create\x20CI\x20profile\x20(encrypted\x20auth,\x20committed\x20to\x20git)','DKVFF':function(_0x217e1c,_0x52a595,_0x1c008e){return _0x217e1c(_0x52a595,_0x1c008e);},'LsoKI':'profile-name','KVoJb':'profile\x20use','VHesA':'profile\x20encrypt-auth','aOGIM':'string','nrvPc':_0x446629(0x13e),'NghPq':'profile','kQqQa':_0x446629(0xf1),'IGIDm':'key','qtAKS':'Config\x20key\x20to\x20remove','CzqMb':function(_0x1a7e64,_0x19b560,_0x41f546){return _0x1a7e64(_0x19b560,_0x41f546);},'cONJb':_0x446629(0x1e2),'CdunL':'Set\x20a\x20config\x20value','PoexQ':_0x446629(0x1ba),'lQcdX':_0x446629(0x119),'HdBvJ':'List\x20all\x20config\x20for\x20a\x20profile','XQBKh':'add\x20<profile-name>','QoxNT':'Add\x20profile\x20configuration','Episi':'use\x20<profile-name>','MFywR':'Encrypt\x20auth.json\x20for\x20a\x20profile\x20(allows\x20committing\x20to\x20git)','gbWnw':'Update\x20authentication\x20for\x20an\x20existing\x20profile','SZPNB':_0x446629(0x195),'NTKZM':'You\x20must\x20specify\x20a\x20profile\x20subcommand'};return _0x5d113f['usage'](PROFILE_HELP)['command'](_0x595d9c['XQBKh'],_0x595d9c[_0x446629(0x137)],_0x56df8b=>{const _0x5126e8=_0x446629;return _0x56df8b['positional'](_0x5126e8(0xe2),{'type':'string','description':'Name\x20of\x20the\x20profile\x20(e.g.,\x20local,\x20staging,\x20prod)','demandOption':!![]})['option']('ci',{'type':_0x5126e8(0x15a),'description':_0x595d9c['JROnS'],'default':![]})['option'](_0x5126e8(0x147),{'type':'boolean','description':'Skip\x20browser\x20authentication\x20(just\x20save\x20URL\x20and\x20settings)','default':![]});},async _0x419f7e=>{const _0x21a016=_0x446629;await _0x595d9c['DKVFF'](withTelemetry,'profile\x20add',_0x388336=>addEnv(_0x419f7e['profile-name'],{'ci':_0x419f7e['ci'],'skipAuth':_0x419f7e[_0x21a016(0x147)]},_0x388336));})[_0x446629(0x1b8)](_0x595d9c[_0x446629(0xfa)],'Switch\x20to\x20using\x20a\x20specific\x20profile',_0xd89677=>{const _0x4efd11=_0x446629;return _0xd89677['positional'](_0x595d9c['LsoKI'],{'type':_0x4efd11(0x189),'description':'Name\x20of\x20the\x20profile','demandOption':!![]});},async _0x1efe73=>{const _0xa01e3b=_0x446629;await withTelemetry(_0x595d9c[_0xa01e3b(0x102)],()=>useEnv(_0x1efe73['profile-name']));})[_0x446629(0x1b8)]('encrypt-auth\x20<profile>',_0x595d9c['MFywR'],_0x46907b=>{const _0x16c281=_0x446629;return _0x46907b[_0x16c281(0x146)](_0x16c281(0x1dc),{'type':_0x16c281(0x189),'description':'Profile\x20name','demandOption':!![]});},async _0x4d771d=>{const _0x245e1c=_0x446629;await withTelemetry(_0x595d9c['VHesA'],()=>authEncrypt(_0x4d771d[_0x245e1c(0x1dc)]));})['command']('ls',_0x446629(0x164),()=>{},async()=>{const _0x13e126=_0x446629;await withTelemetry(_0x13e126(0x14d),()=>envList());})['command']('update\x20<profile-name>',_0x595d9c[_0x446629(0x1d2)],_0x432e75=>{const _0x44d76c=_0x446629;return _0x432e75[_0x44d76c(0x146)](_0x595d9c['LsoKI'],{'type':_0x595d9c[_0x44d76c(0x113)],'description':_0x595d9c[_0x44d76c(0x13b)],'demandOption':!![]});},async _0x34608d=>{const _0xfeea25=_0x446629;await _0x595d9c['DKVFF'](withTelemetry,_0xfeea25(0x19c),_0x381d50=>updateEnv(_0x34608d['profile-name'],_0x381d50));})[_0x446629(0x1b8)](_0x595d9c[_0x446629(0xed)],_0x446629(0x16a),_0x13f8e3=>{const _0x17a034=_0x446629,_0x28f4ea={'qjWqn':_0x17a034(0x189),'DGqTS':'profile\x20config\x20get'};return _0x13f8e3[_0x17a034(0x13c)](PROFILE_CONFIG_HELP)[_0x17a034(0x1b8)](_0x595d9c[_0x17a034(0x17f)],_0x595d9c['CdunL'],_0xa85181=>{const _0x3cf9ef=_0x17a034;return _0xa85181['positional'](_0x595d9c[_0x3cf9ef(0x1eb)],{'type':'string','description':'Profile\x20name','demandOption':!![]})['positional']('key',{'type':'string','description':'Config\x20key\x20(e.g.,\x20userAgent,\x20header.X-Custom)','demandOption':!![]})[_0x3cf9ef(0x146)]('value',{'type':_0x595d9c[_0x3cf9ef(0x113)],'description':'Config\x20value','demandOption':!![]});},async _0x10dab4=>{const _0x49fa8d=_0x17a034;await withTelemetry(_0x595d9c[_0x49fa8d(0x1ec)],()=>configSet(_0x10dab4[_0x49fa8d(0x1dc)],_0x10dab4[_0x49fa8d(0x13d)],_0x10dab4['value']));})[_0x17a034(0x1b8)](_0x595d9c['PoexQ'],_0x17a034(0x1df),_0x53b38b=>{const _0x541da2=_0x17a034;return _0x53b38b[_0x541da2(0x146)](_0x541da2(0x1dc),{'type':_0x28f4ea['qjWqn'],'description':_0x541da2(0x1c7),'demandOption':!![]})[_0x541da2(0x146)]('key',{'type':_0x28f4ea[_0x541da2(0xf2)],'description':'Config\x20key','demandOption':!![]});},async _0x16877b=>{const _0x522c36=_0x17a034;await withTelemetry(_0x28f4ea[_0x522c36(0x179)],()=>configGet(_0x16877b['profile'],_0x16877b['key']));})['command'](_0x595d9c[_0x17a034(0x114)],_0x595d9c[_0x17a034(0x16f)],_0x388736=>{const _0xea373d=_0x17a034;return _0x388736[_0xea373d(0x146)](_0xea373d(0x1dc),{'type':_0x28f4ea[_0xea373d(0xf2)],'description':_0xea373d(0x1c7),'demandOption':!![]});},async _0x1b89cf=>{await withTelemetry('profile\x20config\x20list',()=>configList(_0x1b89cf['profile']));})['command']('unset\x20<profile>\x20<key>','Remove\x20a\x20config\x20value',_0x1c99a0=>{const _0x24c457=_0x17a034;return _0x1c99a0['positional'](_0x595d9c['NghPq'],{'type':_0x24c457(0x189),'description':_0x24c457(0x1c7),'demandOption':!![]})['positional'](_0x595d9c['IGIDm'],{'type':_0x595d9c['aOGIM'],'description':_0x595d9c[_0x24c457(0x1e0)],'demandOption':!![]});},async _0x18b47e=>{const _0x5d13be=_0x17a034;await _0x595d9c[_0x5d13be(0x1cc)](withTelemetry,'profile\x20config\x20unset',()=>configUnset(_0x18b47e['profile'],_0x18b47e['key']));})['demandCommand'](0x1,'You\x20must\x20specify\x20a\x20profile\x20config\x20subcommand');})['demandCommand'](0x1,_0x595d9c[_0x446629(0xcb)]);})[_0x227e61(0x1b8)](_0x227e61(0x1e1),'Show\x20Ranger\x20status\x20(version,\x20skills,\x20profiles)',()=>{},async()=>{await withTelemetry('status',()=>status());})['command'](_0x227e61(0x126),_0x227e61(0x101),()=>{},async()=>{const _0x499ab7=_0x227e61,_0x555119={'YOZtz':_0x499ab7(0x126)};await withTelemetry(_0x555119[_0x499ab7(0xe3)],()=>update());})['command']('go',_0x227e61(0x1d3),_0xe2ed8=>{const _0x32605b=_0x227e61,_0x9c6f25={'ncHkM':'profile','pmEQI':_0x32605b(0x189),'QXydp':_0x32605b(0x1ac),'bfAQd':'notes','MOLoP':'scenario','kTQle':'Scenario\x20index\x20(1-based)','NICdE':'Path\x20to\x20start\x20on\x20(appended\x20to\x20base\x20URL,\x20e.g.,\x20/dashboard)','LgoVQ':_0x32605b(0x12a),'qaVBC':_0x32605b(0x133),'UNbDb':'partial','DTqpM':_0x32605b(0x10b),'BYvAV':'failed','ePAyQ':_0x32605b(0xef),'DBJgg':'debug-address-comments','JQMpJ':_0x32605b(0x15a),'MtvGR':_0x32605b(0x1d4),'oFqJd':'item'};return _0xe2ed8[_0x32605b(0x1e4)](_0x9c6f25[_0x32605b(0x17a)],{'type':_0x9c6f25['pmEQI'],'description':_0x9c6f25['QXydp']})['option'](_0x9c6f25[_0x32605b(0x1f7)],{'type':_0x9c6f25[_0x32605b(0x1a5)],'description':'Notes\x20for\x20verification\x20(defaults\x20to\x20scenario\x20description)'})[_0x32605b(0x1e4)](_0x9c6f25[_0x32605b(0xd8)],{'type':_0x32605b(0x1ee),'description':_0x9c6f25[_0x32605b(0x1ca)]})['option']('start-path',{'type':_0x32605b(0x189),'description':_0x9c6f25[_0x32605b(0x16e)]})[_0x32605b(0x1e4)](_0x9c6f25['LgoVQ'],{'type':'string','hidden':!![],'choices':[_0x9c6f25[_0x32605b(0xf0)],_0x9c6f25['UNbDb'],_0x9c6f25['DTqpM'],_0x9c6f25['BYvAV'],_0x9c6f25['ePAyQ']]})['option'](_0x9c6f25[_0x32605b(0x1d0)],{'type':_0x9c6f25[_0x32605b(0x160)],'hidden':!![]})['option'](_0x9c6f25['MtvGR'],{'type':_0x32605b(0x189),'hidden':!![]})[_0x32605b(0x1e4)](_0x32605b(0x1ab),{'type':'string','hidden':!![]})[_0x32605b(0x1e4)](_0x9c6f25['oFqJd'],{'type':_0x32605b(0x1ee),'hidden':!![]});},async _0x35277c=>{await runGoCommand(_0x35277c);})['command']('auth',![],_0x5a32dd=>{const _0x2e2864=_0x227e61,_0x26d8ae={'Sloza':'profile','YHSoq':'string','aLuJg':function(_0x24607c,_0x190a43,_0x4f582d){return _0x24607c(_0x190a43,_0x4f582d);},'qyTWy':_0x2e2864(0x1c6)};return _0x5a32dd[_0x2e2864(0x1b8)]('encrypt\x20<profile>',![],_0x303ce3=>{const _0x39f512=_0x2e2864;return _0x303ce3['positional'](_0x26d8ae[_0x39f512(0xeb)],{'type':_0x26d8ae['YHSoq'],'description':'Profile\x20name','demandOption':!![]});},async _0x57f9a0=>{const _0x2f522e=_0x2e2864;_0x26d8ae['aLuJg'](warnRenamed,_0x26d8ae['qyTWy'],_0x2f522e(0x1b0)),await authEncrypt(_0x57f9a0['profile']);})[_0x2e2864(0x183)](0x1,'You\x20must\x20specify\x20an\x20auth\x20subcommand');},()=>{})[_0x227e61(0x1b8)]('start\x20[token]',![],_0x21f763=>{const _0x8cd502=_0x227e61,_0x525edd={'SsLpJ':_0x8cd502(0x189),'PvQXc':_0x8cd502(0x18e),'kXbtq':'boolean'};return _0x21f763['positional']('token',{'type':_0x525edd[_0x8cd502(0x10d)],'description':_0x8cd502(0x130)})[_0x8cd502(0x1e4)](_0x525edd['PvQXc'],{'type':_0x525edd['kXbtq'],'description':'Skip\x20Chromium\x20browser\x20check\x20and\x20installation','default':![]});},async _0x1f9ba8=>{const _0x12cf38=_0x227e61,_0x41a20b={'XCzQO':'ranger\x20setup','ydAyc':function(_0x2b72e6,_0x1ce9f1,_0x15e70d){return _0x2b72e6(_0x1ce9f1,_0x15e70d);}};warnRenamed(_0x12cf38(0x1f6),_0x41a20b['XCzQO']),await _0x41a20b[_0x12cf38(0x138)](withTelemetry,_0x12cf38(0x175),_0x3c9044=>start(_0x1f9ba8[_0x12cf38(0x1a1)],{'skipChromium':_0x1f9ba8['skip-chromium']},_0x3c9044));})['command'](_0x227e61(0xcf),![],_0x3552f9=>{const _0x1e44bf=_0x227e61,_0x3dc6a7={'rqSJN':'string','pJyDv':_0x1e44bf(0x1ac),'zGndF':_0x1e44bf(0x18d),'xoadp':_0x1e44bf(0xcc),'zxJPa':'profile','bhOoB':_0x1e44bf(0x1bc),'OUvzP':'number','LHCWd':_0x1e44bf(0x12a),'eKexG':'verified','nQLRH':'incomplete'};return _0x3552f9['option'](_0x1e44bf(0x1d4),{'type':_0x3dc6a7[_0x1e44bf(0x1fd)],'description':_0x3dc6a7[_0x1e44bf(0xf9)]})[_0x1e44bf(0x1e4)]('task',{'type':'string','description':_0x3dc6a7[_0x1e44bf(0x11c)]})[_0x1e44bf(0x1e4)](_0x1e44bf(0x15c),{'type':'number','description':_0x3dc6a7['xoadp']})[_0x1e44bf(0x1e4)](_0x3dc6a7[_0x1e44bf(0x128)],{'type':_0x1e44bf(0x189),'hidden':!![]})['option'](_0x3dc6a7[_0x1e44bf(0x1f8)],{'type':_0x3dc6a7['rqSJN'],'hidden':!![]})[_0x1e44bf(0x1e4)](_0x1e44bf(0x172),{'type':_0x3dc6a7['OUvzP'],'hidden':!![]})['option']('start-path',{'type':_0x3dc6a7[_0x1e44bf(0x1fd)],'description':_0x1e44bf(0x1a7)})[_0x1e44bf(0x1e4)](_0x3dc6a7[_0x1e44bf(0x1ed)],{'type':_0x1e44bf(0x189),'hidden':!![],'choices':[_0x3dc6a7[_0x1e44bf(0xd6)],_0x1e44bf(0x1e9),'blocked','failed',_0x3dc6a7['nQLRH']]});},async _0x1d31b1=>{const _0x480eab={'xuogq':function(_0x533d68,_0x2b9605,_0x4c71d7){return _0x533d68(_0x2b9605,_0x4c71d7);}};await _0x480eab['xuogq'](runGoCommand,_0x1d31b1,!![]);})[_0x227e61(0x1b8)](_0x227e61(0xdc),![],_0x35e936=>{const _0x1899a8=_0x227e61,_0x200d74={'CiPKR':_0x1899a8(0x111),'bAElT':_0x1899a8(0x15a),'RyTYo':_0x1899a8(0xd9),'Jfwqg':_0x1899a8(0x1c5)};return _0x35e936[_0x1899a8(0x146)](_0x1899a8(0xf4),{'type':'string','description':_0x200d74[_0x1899a8(0xe0)],'demandOption':!![]})['option']('ci',{'type':_0x200d74[_0x1899a8(0xf8)],'description':_0x200d74[_0x1899a8(0x187)],'default':![]})['option']('skip-auth',{'type':_0x200d74['bAElT'],'description':_0x200d74['Jfwqg'],'default':![]});},async _0x43a237=>{const _0x5ef1f2=_0x227e61,_0x48e5c3={'YMoqN':function(_0x5d9971,_0x254737,_0x424ed4){return _0x5d9971(_0x254737,_0x424ed4);},'xGIOi':'add\x20env'};warnRenamed(_0x5ef1f2(0x1aa),'ranger\x20profile\x20add'),await _0x48e5c3['YMoqN'](withTelemetry,_0x48e5c3[_0x5ef1f2(0x173)],_0xec6f3f=>addEnv(_0x43a237['env-name'],{'ci':_0x43a237['ci'],'skipAuth':_0x43a237['skip-auth']},_0xec6f3f));})[_0x227e61(0x1b8)](_0x227e61(0x136),![],_0x4effa3=>{const _0x575dc5=_0x227e61,_0x4f06e7={'TDrXN':_0x575dc5(0x189)};return _0x4effa3[_0x575dc5(0x146)]('env-name',{'type':_0x4f06e7[_0x575dc5(0xff)],'description':'Name\x20of\x20the\x20environment','demandOption':!![]});},async _0xfd3e5f=>{const _0x16f54c=_0x227e61,_0xa014e4={'EHMsc':function(_0x79e66d,_0x467ab9,_0x166cf9){return _0x79e66d(_0x467ab9,_0x166cf9);},'nwIeC':'use'};_0xa014e4[_0x16f54c(0xcd)](warnRenamed,_0x16f54c(0x1af),_0x16f54c(0x1a2)),await withTelemetry(_0xa014e4['nwIeC'],()=>useEnv(_0xfd3e5f[_0x16f54c(0xf4)]));})[_0x227e61(0x1b8)]('config',![],_0x151a98=>{const _0x172372=_0x227e61,_0xd09556={'Pdwju':'env','vDLzp':_0x172372(0x196),'byxgM':'value','obAqD':_0x172372(0x189),'seUrN':function(_0x5e8a38,_0xab333c,_0xfc6397){return _0x5e8a38(_0xab333c,_0xfc6397);},'KOJzA':_0x172372(0x16d),'KJiVJ':_0x172372(0x177),'UIQgE':'key','IONSM':function(_0xb5ac1e,_0x35b39f,_0x4021af){return _0xb5ac1e(_0x35b39f,_0x4021af);},'oqFlx':function(_0x22f4e3,_0x3004a0,_0x20e063){return _0x22f4e3(_0x3004a0,_0x20e063);},'PygEX':_0x172372(0xd1),'MeJvY':_0x172372(0x1b5),'MVOgR':'set\x20<env>\x20<key>\x20<value>','irQhx':_0x172372(0x18c),'JXzmh':'You\x20must\x20specify\x20a\x20config\x20subcommand'};return _0x151a98[_0x172372(0x1b8)](_0xd09556[_0x172372(0x1e6)],![],_0x2fe0ff=>{const _0x36ed9f=_0x172372;return _0x2fe0ff[_0x36ed9f(0x146)](_0xd09556[_0x36ed9f(0xfe)],{'type':'string','description':_0x36ed9f(0x177),'demandOption':!![]})[_0x36ed9f(0x146)]('key',{'type':'string','description':_0xd09556[_0x36ed9f(0x199)],'demandOption':!![]})['positional'](_0xd09556['byxgM'],{'type':_0xd09556[_0x36ed9f(0x115)],'description':'Config\x20value','demandOption':!![]});},async _0x4a2ab4=>{const _0x482887=_0x172372;_0xd09556[_0x482887(0x1b6)](warnRenamed,'ranger\x20config\x20set',_0x482887(0x1b1)),await _0xd09556[_0x482887(0x1b6)](withTelemetry,_0xd09556['KOJzA'],()=>configSet(_0x4a2ab4['env'],_0x4a2ab4['key'],_0x4a2ab4[_0x482887(0x1b4)]));})['command'](_0x172372(0x197),![],_0x3b9c13=>{const _0x4029be=_0x172372;return _0x3b9c13[_0x4029be(0x146)](_0xd09556[_0x4029be(0xfe)],{'type':_0x4029be(0x189),'description':_0xd09556[_0x4029be(0x10f)],'demandOption':!![]})[_0x4029be(0x146)](_0xd09556[_0x4029be(0x140)],{'type':_0xd09556[_0x4029be(0x115)],'description':_0x4029be(0x1b3),'demandOption':!![]});},async _0xe0981a=>{const _0x5410c0=_0x172372;warnRenamed(_0x5410c0(0x168),'ranger\x20profile\x20config\x20get'),await _0xd09556['IONSM'](withTelemetry,'config\x20get',()=>configGet(_0xe0981a[_0x5410c0(0x1d4)],_0xe0981a['key']));})[_0x172372(0x1b8)](_0x172372(0x1f4),![],_0x5d46a5=>{const _0x25a8e8=_0x172372;return _0x5d46a5[_0x25a8e8(0x146)](_0xd09556['Pdwju'],{'type':_0xd09556['obAqD'],'description':_0xd09556[_0x25a8e8(0x10f)],'demandOption':!![]});},async _0x5171e1=>{const _0x7616c4=_0x172372;_0xd09556[_0x7616c4(0x1b7)](warnRenamed,_0xd09556['PygEX'],_0x7616c4(0x19f)),await withTelemetry(_0x7616c4(0x11d),()=>configList(_0x5171e1[_0x7616c4(0x1d4)]));})[_0x172372(0x1b8)](_0xd09556['irQhx'],![],_0x2a055f=>{const _0x3a37e8=_0x172372;return _0x2a055f[_0x3a37e8(0x146)](_0xd09556[_0x3a37e8(0xfe)],{'type':_0xd09556[_0x3a37e8(0x115)],'description':'Environment\x20name','demandOption':!![]})[_0x3a37e8(0x146)](_0x3a37e8(0x13d),{'type':'string','description':_0x3a37e8(0xe1),'demandOption':!![]});},async _0x18917d=>{const _0x2ad24c=_0x172372;_0xd09556[_0x2ad24c(0x185)](warnRenamed,_0x2ad24c(0x157),_0xd09556['MeJvY']),await withTelemetry(_0x2ad24c(0x15d),()=>configUnset(_0x18917d['env'],_0x18917d[_0x2ad24c(0x13d)]));})['demandCommand'](0x1,_0xd09556['JXzmh']);})['command']('env',![],_0x2e35ee=>{const _0x7aed06=_0x227e61,_0x458490={'vDoUQ':function(_0x1b4d27,_0x4b02e0,_0x3ede29){return _0x1b4d27(_0x4b02e0,_0x3ede29);},'uwmmC':_0x7aed06(0x162),'kXCds':_0x7aed06(0xda),'QZYbD':'env-name','KlKYd':_0x7aed06(0x12f),'ZucSW':'ranger\x20profile\x20update','XIhhH':_0x7aed06(0x14f),'NnOaH':'update\x20<env-name>','yHkMr':'You\x20must\x20specify\x20an\x20env\x20subcommand'};return _0x2e35ee[_0x7aed06(0x1b8)]('ls',![],()=>{},async()=>{const _0x37015c=_0x7aed06;_0x458490[_0x37015c(0x123)](warnRenamed,_0x37015c(0x1e7),_0x458490[_0x37015c(0x10a)]),await _0x458490['vDoUQ'](withTelemetry,_0x458490[_0x37015c(0x191)],()=>envList());})[_0x7aed06(0x1b8)](_0x458490[_0x7aed06(0x148)],![],_0x575c60=>{const _0x318f47=_0x7aed06;return _0x575c60['positional'](_0x458490[_0x318f47(0x170)],{'type':_0x318f47(0x189),'description':_0x318f47(0x1da),'demandOption':!![]});},async _0x3dd9eb=>{const _0x1f9dc7=_0x7aed06;_0x458490[_0x1f9dc7(0x123)](warnRenamed,_0x458490[_0x1f9dc7(0x127)],_0x458490[_0x1f9dc7(0x141)]),await _0x458490[_0x1f9dc7(0x123)](withTelemetry,_0x458490['XIhhH'],_0x25555b=>updateEnv(_0x3dd9eb[_0x1f9dc7(0xf4)],_0x25555b));})[_0x7aed06(0x183)](0x1,_0x458490[_0x7aed06(0x15f)]);})[_0x227e61(0x1b8)]('feature',![],_0x42e9d4=>{const _0x26cc7a=_0x227e61,_0x1585f3={'JKSwo':'name','ctBxm':_0x26cc7a(0x1ea),'ynDoY':'string','eKzYG':'checklist','jBjlB':_0x26cc7a(0x1e8),'qjTUK':_0x26cc7a(0xd7),'FkQGp':_0x26cc7a(0x131),'LTKBe':'--scenario','myuQO':_0x26cc7a(0x1c3),'VwWKv':_0x26cc7a(0xf7),'ukxQX':'Filter\x20to\x20feature\x20reviews\x20for\x20current\x20git\x20branch','GhBpK':'offset','GwfeN':_0x26cc7a(0x1ee),'AHsaL':_0x26cc7a(0x1d8),'UnKsL':_0x26cc7a(0x184),'MswmK':_0x26cc7a(0x15a),'WDVyf':_0x26cc7a(0x1ad),'yrbFx':function(_0x5add5d,_0x23c053,_0x390a4f){return _0x5add5d(_0x23c053,_0x390a4f);},'uNvKc':_0x26cc7a(0x144),'GgECd':'ranger\x20list','eVpIH':function(_0x59d7a8,_0x149f81,_0xb99f07){return _0x59d7a8(_0x149f81,_0xb99f07);},'OKIGM':_0x26cc7a(0x14a),'pDGwZ':_0x26cc7a(0x150),'ttogZ':_0x26cc7a(0x190),'CPqUr':_0x26cc7a(0x10c),'QPqhJ':'feature\x20resume','cHNap':_0x26cc7a(0x121),'XmajP':'Feature\x20review\x20ID\x20(uses\x20active\x20feature\x20review\x20if\x20not\x20provided)','oKjaa':_0x26cc7a(0xe8),'mWngI':_0x26cc7a(0x166),'kQLLb':_0x26cc7a(0xdd),'nyote':_0x26cc7a(0x139),'aDdYk':'feature\x20delete','biKPB':function(_0x2cef1b,_0x17e6d9,_0xef039c){return _0x2cef1b(_0x17e6d9,_0xef039c);},'mdrXD':'feature\x20restore','JsZZW':_0x26cc7a(0x11a),'fRqLW':'add-checklist-item\x20<description>','TUMVk':'delete\x20[id]'};return _0x42e9d4['command'](_0x26cc7a(0x1a0),![],_0x2baee8=>{const _0x247f10=_0x26cc7a;return _0x2baee8['positional'](_0x1585f3[_0x247f10(0x1de)],{'type':'string','description':_0x247f10(0x19b),'demandOption':!![]})['option'](_0x1585f3[_0x247f10(0x1f2)],{'type':_0x1585f3[_0x247f10(0x180)],'alias':'d','description':'Feature\x20review\x20description'})['option'](_0x1585f3['eKzYG'],{'type':_0x1585f3['jBjlB'],'alias':'c','description':_0x1585f3[_0x247f10(0x18a)]})['option']('scenario',{'type':_0x1585f3['jBjlB'],'hidden':!![]});},async _0x1565fa=>{const _0x48d3bf=_0x26cc7a;warnRenamed(_0x48d3bf(0x134),_0x1585f3['FkQGp']),warnFlagRenamed(_0x1585f3['FkQGp'],'--checklist',_0x1585f3['LTKBe']);const _0x42debc=_0x1565fa[_0x48d3bf(0x172)]||_0x1565fa[_0x48d3bf(0x18f)];await withTelemetry(_0x1585f3[_0x48d3bf(0x1a9)],()=>featureCreate(_0x1565fa['name'],{'description':_0x1565fa['description'],'scenarios':_0x42debc}));})[_0x26cc7a(0x1b8)](_0x26cc7a(0x135),![],_0x1f3654=>{const _0x1e9a37=_0x26cc7a;return _0x1f3654['option'](_0x1585f3['VwWKv'],{'type':'boolean','description':_0x1585f3['ukxQX']})[_0x1e9a37(0x1e4)]('limit',{'type':'number','alias':'l','description':_0x1e9a37(0x1cf),'default':0xa})['option'](_0x1585f3['GhBpK'],{'type':_0x1585f3[_0x1e9a37(0x151)],'alias':'o','description':_0x1585f3[_0x1e9a37(0x1be)],'default':0x0})[_0x1e9a37(0x1e4)](_0x1585f3['UnKsL'],{'type':_0x1585f3['MswmK'],'alias':'d','description':_0x1585f3[_0x1e9a37(0x1f1)],'default':![]});},async _0x14609d=>{const _0x14f992=_0x26cc7a;_0x1585f3['yrbFx'](warnRenamed,_0x1585f3[_0x14f992(0x11f)],_0x1585f3['GgECd']),await _0x1585f3['eVpIH'](withTelemetry,'feature\x20list',()=>featureList({'currentBranch':_0x14609d[_0x14f992(0xf7)],'limit':_0x14609d['limit'],'offset':_0x14609d['offset'],'includeDeleted':_0x14609d[_0x14f992(0x184)]}));})['command'](_0x1585f3[_0x26cc7a(0xfc)],![],_0x3bac68=>{const _0xcf083f=_0x26cc7a;return _0x3bac68[_0xcf083f(0x146)]('id',{'type':_0x1585f3[_0xcf083f(0x180)],'description':'Feature\x20review\x20ID'});},async _0x4e4250=>{const _0x2abe9f=_0x26cc7a;warnRenamed(_0x1585f3['OKIGM'],_0x1585f3['pDGwZ']),await _0x1585f3[_0x2abe9f(0x1c0)](withTelemetry,_0x1585f3['ttogZ'],()=>featureShow(_0x4e4250['id']));})['command'](_0x26cc7a(0x13f),![],_0x193cf0=>{const _0x98c5f6=_0x26cc7a;return _0x193cf0['positional']('id',{'type':_0x1585f3['ynDoY'],'description':_0x98c5f6(0xd0)});},async _0xdd2b43=>{const _0x204fed=_0x26cc7a;_0x1585f3['eVpIH'](warnRenamed,_0x1585f3[_0x204fed(0x1cd)],'ranger\x20resume'),await withTelemetry(_0x1585f3[_0x204fed(0x156)],()=>featureResume(_0xdd2b43['id']));})['command'](_0x1585f3['fRqLW'],![],_0x1061a5=>{const _0xbb9e97=_0x26cc7a;return _0x1061a5['positional']('description',{'type':'string','description':_0x1585f3[_0xbb9e97(0x182)],'demandOption':!![]})['option']('id',{'type':_0x1585f3['ynDoY'],'description':_0x1585f3[_0xbb9e97(0x188)]});},async _0x1600ec=>{const _0x41fcbb=_0x26cc7a;warnRenamed(_0x1585f3['oKjaa'],_0x41fcbb(0x145)),await withTelemetry(_0x1585f3[_0x41fcbb(0x1ce)],()=>featureAddScenario(_0x1600ec[_0x41fcbb(0x1ea)],_0x1600ec['id']));})[_0x26cc7a(0x1b8)](_0x26cc7a(0x117),![],_0x55ea8d=>{const _0x1230d7=_0x26cc7a;return _0x55ea8d[_0x1230d7(0x146)]('id',{'type':'string','description':_0x1230d7(0x125)});},async _0x56a8a8=>{const _0x2855f9=_0x26cc7a;warnRenamed(_0x1585f3['kQLLb'],'ranger\x20get-review'),await _0x1585f3['yrbFx'](withTelemetry,_0x1585f3[_0x2855f9(0x161)],()=>featureGetReview(_0x56a8a8['id']));})[_0x26cc7a(0x1b8)](_0x1585f3[_0x26cc7a(0xe4)],![],_0x3b8dae=>{const _0x3c8663=_0x26cc7a;return _0x3b8dae[_0x3c8663(0x146)]('id',{'type':_0x1585f3[_0x3c8663(0x180)],'description':_0x3c8663(0x154)});},async _0x22ff8d=>{_0x1585f3['eVpIH'](warnRenamed,'ranger\x20feature\x20delete','ranger\x20delete'),await withTelemetry(_0x1585f3['aDdYk'],()=>featureDelete(_0x22ff8d['id']));})[_0x26cc7a(0x1b8)](_0x26cc7a(0x124),![],_0x2e8d57=>{const _0x6b34a8=_0x26cc7a;return _0x2e8d57[_0x6b34a8(0x146)]('id',{'type':'string','description':_0x6b34a8(0x17c),'demandOption':!![]});},async _0x3a4705=>{const _0x5ac1c7=_0x26cc7a;_0x1585f3['biKPB'](warnRenamed,_0x5ac1c7(0x122),_0x5ac1c7(0x1dd)),await _0x1585f3[_0x5ac1c7(0x1c0)](withTelemetry,_0x1585f3['mdrXD'],()=>featureRestore(_0x3a4705['id']));})[_0x26cc7a(0x183)](0x1,_0x26cc7a(0x14e));})[_0x227e61(0x1b8)]('hook',![],_0x6fc311=>{const _0x589090=_0x227e61,_0x9f9f8b={'GnhLx':_0x589090(0x19e),'SIUpQ':function(_0x4ef526,_0x8cfd62,_0x1de79c){return _0x4ef526(_0x8cfd62,_0x1de79c);},'tLQWg':_0x589090(0x189),'cRnKM':_0x589090(0x1d5),'jFiXG':'Hook\x20name\x20(session-start,\x20pre-compact,\x20post-edit,\x20etc.)'};return _0x6fc311[_0x589090(0x1b8)](_0x589090(0x153),'Enable\x20Ranger\x20hooks\x20for\x20this\x20session',_0x23b2d2=>{const _0x4c91ac=_0x589090;return _0x23b2d2[_0x4c91ac(0x1e4)](_0x9f9f8b['GnhLx'],{'type':'string','description':'Session\x20ID\x20(for\x20non-Claude\x20integrations\x20like\x20OpenCode)'});},async _0x2c2839=>{const _0x547af8=_0x589090;await _0x9f9f8b[_0x547af8(0x12d)](withTelemetry,_0x547af8(0xe5),()=>hook(_0x547af8(0x153),_0x2c2839['session-id']));})[_0x589090(0x1b8)]('disable',_0x589090(0x155),_0x42433b=>{const _0x5056b4=_0x589090;return _0x42433b[_0x5056b4(0x1e4)]('session-id',{'type':_0x9f9f8b[_0x5056b4(0x120)],'description':'Session\x20ID\x20(for\x20non-Claude\x20integrations\x20like\x20OpenCode)'});},async _0x112a29=>{const _0x33ba72=_0x589090;await withTelemetry(_0x9f9f8b[_0x33ba72(0x15b)],()=>hook('disable',_0x112a29['session-id']));})['option']('name',{'type':_0x589090(0x189),'description':_0x9f9f8b[_0x589090(0x16c)]})['option'](_0x9f9f8b['GnhLx'],{'type':_0x9f9f8b[_0x589090(0x120)],'description':'Session\x20ID\x20(for\x20non-Claude\x20integrations\x20like\x20OpenCode)'});},async _0x3ed297=>{const _0x2db4b9=_0x227e61,_0x32a662={'ZIewS':function(_0x14cd52,_0x419536,_0x295573){return _0x14cd52(_0x419536,_0x295573);}};_0x3ed297['name']&&await _0x32a662['ZIewS'](hook,_0x3ed297['name'],_0x3ed297[_0x2db4b9(0x19e)]);})[_0x227e61(0x183)](0x1,_0x227e61(0x1d7))[_0x227e61(0xce)]()['fail'](async(_0x3db529,_0x2b86de,_0x376de3)=>{const _0x13d165=_0x227e61,_0x5d4b22={'dwBHa':_0x13d165(0x165),'xMMpu':function(_0x516332,_0x269a78){return _0x516332||_0x269a78;}},_0x9ffc50=sanitizeArgs(process[_0x13d165(0x12e)]['slice'](0x2)),_0x4e645a=getErrorType(_0x3db529,_0x2b86de);if(_0x3db529&&_0x3db529['includes']('Unknown\x20command')){const _0x103242=process['argv'][0x2];console[_0x13d165(0x143)]('\x0aUnknown\x20command:\x20'+_0x103242),console['error'](_0x5d4b22[_0x13d165(0x194)]);}else{if(_0x3db529)console[_0x13d165(0x143)]('\x0a'+_0x3db529+'\x0a');else _0x2b86de&&console['error']('\x0aError:\x20'+_0x2b86de[_0x13d165(0x171)]+'\x0a');}await logDesirePath({'rawCommand':_0x9ffc50,'errorMessage':_0x3db529||_0x2b86de?.[_0x13d165(0x171)],'errorType':_0x4e645a});const _0xd748b1=getCurrentCollector();_0xd748b1&&await _0xd748b1['trackCommandError'](_0x2b86de||new Error(_0x5d4b22['xMMpu'](_0x3db529,'Unknown\x20error'))),process[_0x13d165(0x174)](0x1);})['epilogue'](_0x227e61(0x1e5)+_0x227e61(0x1f3)+'\x20\x20https://docs.ranger.net/llms.txt\x20(for\x20LLMs)')['help']()['alias']('help','h')['parse']();
|