@vibecheckai/cli 3.0.10 → 3.1.1
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/bin/.generated +25 -0
- package/bin/dev/run-v2-torture.js +30 -30
- package/bin/registry.js +105 -0
- package/bin/runners/lib/__tests__/entitlements-v2.test.js +295 -295
- package/bin/runners/lib/analysis-core.js +271 -271
- package/bin/runners/lib/analyzers.js +579 -579
- package/bin/runners/lib/auth-truth.js +193 -193
- package/bin/runners/lib/backup.js +62 -62
- package/bin/runners/lib/billing.js +107 -107
- package/bin/runners/lib/claims.js +118 -118
- package/bin/runners/lib/cli-output.js +368 -0
- package/bin/runners/lib/cli-ui.js +540 -540
- package/bin/runners/lib/contracts/auth-contract.js +202 -202
- package/bin/runners/lib/contracts/env-contract.js +181 -181
- package/bin/runners/lib/contracts/external-contract.js +206 -206
- package/bin/runners/lib/contracts/guard.js +168 -168
- package/bin/runners/lib/contracts/index.js +89 -89
- package/bin/runners/lib/contracts/plan-validator.js +311 -311
- package/bin/runners/lib/contracts/route-contract.js +199 -199
- package/bin/runners/lib/contracts.js +804 -804
- package/bin/runners/lib/detect.js +89 -89
- package/bin/runners/lib/detectors-v2.js +703 -703
- package/bin/runners/lib/doctor/autofix.js +254 -254
- package/bin/runners/lib/doctor/index.js +37 -37
- package/bin/runners/lib/doctor/modules/dependencies.js +325 -325
- package/bin/runners/lib/doctor/modules/index.js +46 -46
- package/bin/runners/lib/doctor/modules/network.js +250 -250
- package/bin/runners/lib/doctor/modules/project.js +312 -312
- package/bin/runners/lib/doctor/modules/runtime.js +224 -224
- package/bin/runners/lib/doctor/modules/security.js +348 -348
- package/bin/runners/lib/doctor/modules/system.js +213 -213
- package/bin/runners/lib/doctor/modules/vibecheck.js +394 -394
- package/bin/runners/lib/doctor/reporter.js +262 -262
- package/bin/runners/lib/doctor/service.js +262 -262
- package/bin/runners/lib/doctor/types.js +113 -113
- package/bin/runners/lib/doctor/ui.js +263 -263
- package/bin/runners/lib/doctor-v2.js +608 -608
- package/bin/runners/lib/drift.js +425 -425
- package/bin/runners/lib/enforcement.js +72 -72
- package/bin/runners/lib/enterprise-detect.js +603 -603
- package/bin/runners/lib/enterprise-init.js +942 -942
- package/bin/runners/lib/entitlements-v2.js +490 -493
- package/bin/runners/lib/env-resolver.js +417 -417
- package/bin/runners/lib/env-template.js +66 -66
- package/bin/runners/lib/env.js +189 -189
- package/bin/runners/lib/extractors/client-calls.js +990 -990
- package/bin/runners/lib/extractors/fastify-route-dump.js +573 -573
- package/bin/runners/lib/extractors/fastify-routes.js +426 -426
- package/bin/runners/lib/extractors/index.js +363 -363
- package/bin/runners/lib/extractors/next-routes.js +524 -524
- package/bin/runners/lib/extractors/proof-graph.js +431 -431
- package/bin/runners/lib/extractors/route-matcher.js +451 -451
- package/bin/runners/lib/extractors/truthpack-v2.js +377 -377
- package/bin/runners/lib/extractors/ui-bindings.js +547 -547
- package/bin/runners/lib/findings-schema.js +281 -281
- package/bin/runners/lib/firewall-prompt.js +50 -50
- package/bin/runners/lib/graph/graph-builder.js +265 -265
- package/bin/runners/lib/graph/html-renderer.js +413 -413
- package/bin/runners/lib/graph/index.js +32 -32
- package/bin/runners/lib/graph/runtime-collector.js +215 -215
- package/bin/runners/lib/graph/static-extractor.js +518 -518
- package/bin/runners/lib/html-report.js +650 -650
- package/bin/runners/lib/init-wizard.js +308 -308
- package/bin/runners/lib/llm.js +75 -75
- package/bin/runners/lib/meter.js +61 -61
- package/bin/runners/lib/missions/evidence.js +126 -126
- package/bin/runners/lib/missions/plan.js +69 -69
- package/bin/runners/lib/missions/templates.js +192 -192
- package/bin/runners/lib/patch.js +40 -40
- package/bin/runners/lib/permissions/auth-model.js +213 -213
- package/bin/runners/lib/permissions/idor-prover.js +205 -205
- package/bin/runners/lib/permissions/index.js +45 -45
- package/bin/runners/lib/permissions/matrix-builder.js +198 -198
- package/bin/runners/lib/pkgjson.js +28 -28
- package/bin/runners/lib/policy.js +295 -295
- package/bin/runners/lib/preflight.js +142 -142
- package/bin/runners/lib/reality/correlation-detectors.js +359 -359
- package/bin/runners/lib/reality/index.js +318 -318
- package/bin/runners/lib/reality/request-hashing.js +416 -416
- package/bin/runners/lib/reality/request-mapper.js +453 -453
- package/bin/runners/lib/reality/safety-rails.js +463 -463
- package/bin/runners/lib/reality/semantic-snapshot.js +408 -408
- package/bin/runners/lib/reality/toast-detector.js +393 -393
- package/bin/runners/lib/reality-findings.js +84 -84
- package/bin/runners/lib/receipts.js +179 -0
- package/bin/runners/lib/redact.js +29 -29
- package/bin/runners/lib/replay/capsule-manager.js +154 -154
- package/bin/runners/lib/replay/index.js +263 -263
- package/bin/runners/lib/replay/player.js +348 -348
- package/bin/runners/lib/replay/recorder.js +331 -331
- package/bin/runners/lib/report-engine.js +447 -447
- package/bin/runners/lib/report-html.js +1499 -1499
- package/bin/runners/lib/report-templates.js +969 -969
- package/bin/runners/lib/report.js +135 -135
- package/bin/runners/lib/route-detection.js +1140 -1140
- package/bin/runners/lib/route-truth.js +477 -477
- package/bin/runners/lib/sandbox/index.js +59 -59
- package/bin/runners/lib/sandbox/proof-chain.js +399 -399
- package/bin/runners/lib/sandbox/sandbox-runner.js +205 -205
- package/bin/runners/lib/sandbox/worktree.js +174 -174
- package/bin/runners/lib/schema-validator.js +350 -350
- package/bin/runners/lib/schemas/contracts.schema.json +160 -160
- package/bin/runners/lib/schemas/finding.schema.json +100 -100
- package/bin/runners/lib/schemas/mission-pack.schema.json +206 -206
- package/bin/runners/lib/schemas/proof-graph.schema.json +176 -176
- package/bin/runners/lib/schemas/reality-report.schema.json +162 -162
- package/bin/runners/lib/schemas/share-pack.schema.json +180 -180
- package/bin/runners/lib/schemas/ship-report.schema.json +117 -117
- package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -303
- package/bin/runners/lib/schemas/validator.js +438 -438
- package/bin/runners/lib/score-history.js +282 -282
- package/bin/runners/lib/share-pack.js +239 -239
- package/bin/runners/lib/snippets.js +67 -67
- package/bin/runners/lib/truth.js +667 -667
- package/bin/runners/lib/upsell.js +510 -0
- package/bin/runners/lib/usage.js +153 -0
- package/bin/runners/lib/validate-patch.js +156 -156
- package/bin/runners/lib/verdict-engine.js +628 -628
- package/bin/runners/reality/engine.js +917 -917
- package/bin/runners/reality/flows.js +122 -122
- package/bin/runners/reality/report.js +378 -378
- package/bin/runners/reality/session.js +193 -193
- package/bin/runners/runAuth.js +51 -0
- package/bin/runners/runBadge.js +31 -4
- package/bin/runners/runClaimVerifier.js +483 -483
- package/bin/runners/runContext.js +56 -56
- package/bin/runners/runContextCompiler.js +385 -385
- package/bin/runners/runCtx.js +674 -674
- package/bin/runners/runCtxDiff.js +301 -301
- package/bin/runners/runCtxGuard.js +176 -176
- package/bin/runners/runCtxSync.js +116 -116
- package/bin/runners/runDoctor.js +72 -3
- package/bin/runners/runFix.js +13 -0
- package/bin/runners/runGate.js +17 -17
- package/bin/runners/runGraph.js +454 -440
- package/bin/runners/runGuard.js +168 -168
- package/bin/runners/runInitGha.js +164 -164
- package/bin/runners/runInstall.js +277 -277
- package/bin/runners/runInteractive.js +388 -388
- package/bin/runners/runLabs.js +340 -340
- package/bin/runners/runMcp.js +865 -42
- package/bin/runners/runMissionGenerator.js +282 -282
- package/bin/runners/runPR.js +255 -255
- package/bin/runners/runPermissions.js +304 -290
- package/bin/runners/runPreflight.js +580 -0
- package/bin/runners/runProve.js +1252 -1193
- package/bin/runners/runReality.js +1328 -1328
- package/bin/runners/runReplay.js +499 -499
- package/bin/runners/runReport.js +584 -584
- package/bin/runners/runShare.js +212 -212
- package/bin/runners/runShip.js +98 -19
- package/bin/runners/runStatus.js +138 -138
- package/bin/runners/runTruthpack.js +636 -636
- package/bin/runners/runVerify.js +272 -0
- package/bin/runners/runWatch.js +407 -407
- package/bin/vibecheck.js +110 -95
- package/mcp-server/consolidated-tools.js +804 -804
- package/mcp-server/tools/index.js +72 -72
- package/mcp-server/truth-context.js +581 -581
- package/mcp-server/truth-firewall-tools.js +1500 -1500
- package/package.json +1 -1
- package/bin/runners/runProof.zip +0 -0
|
@@ -1,493 +1,490 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Entitlements v2 - CANONICAL Tier Enforcement
|
|
3
|
-
*
|
|
4
|
-
* SINGLE SOURCE OF TRUTH for all tier gating in vibecheck CLI.
|
|
5
|
-
* Every command runner MUST use this module for access control.
|
|
6
|
-
*
|
|
7
|
-
* NO BYPASS ALLOWED:
|
|
8
|
-
* - No owner-mode env vars
|
|
9
|
-
* - No offline fallback that grants paid features
|
|
10
|
-
* - No silent feature access
|
|
11
|
-
*
|
|
12
|
-
* Exit Codes:
|
|
13
|
-
* - 0: Success
|
|
14
|
-
* - 2: BLOCK verdict (CI failure)
|
|
15
|
-
* - 3: Feature not allowed (upgrade required)
|
|
16
|
-
* - 4: Misconfiguration/env error
|
|
17
|
-
*
|
|
18
|
-
* Tiers:
|
|
19
|
-
* - FREE ($0): Basic scanning and validation
|
|
20
|
-
* -
|
|
21
|
-
* -
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
"
|
|
57
|
-
"ship": { minTier: "free"
|
|
58
|
-
"ship.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
"reality": { minTier: "free",
|
|
63
|
-
"reality.
|
|
64
|
-
"reality.
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
"fix": { minTier: "free"
|
|
72
|
-
"fix.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
"report": { minTier: "free"
|
|
77
|
-
"report.
|
|
78
|
-
"report.
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
|
|
88
|
-
// AI Truth
|
|
89
|
-
"ctx": { minTier: "free" },
|
|
90
|
-
"guard": { minTier: "free" },
|
|
91
|
-
"context": { minTier: "free" },
|
|
92
|
-
"mdc": { minTier: "free" },
|
|
93
|
-
|
|
94
|
-
//
|
|
95
|
-
"
|
|
96
|
-
"
|
|
97
|
-
"
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
"
|
|
103
|
-
"
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
"
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
//
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
*
|
|
267
|
-
*
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
const
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
};
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
${c.
|
|
359
|
-
|
|
360
|
-
${c.
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
capsStr = ` ${c.dim}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
${c.
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
"
|
|
449
|
-
"
|
|
450
|
-
"
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
//
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
EXIT_FEATURE_NOT_ALLOWED,
|
|
492
|
-
EXIT_MISCONFIG,
|
|
493
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Entitlements v2 - CANONICAL Tier Enforcement
|
|
3
|
+
*
|
|
4
|
+
* SINGLE SOURCE OF TRUTH for all tier gating in vibecheck CLI.
|
|
5
|
+
* Every command runner MUST use this module for access control.
|
|
6
|
+
*
|
|
7
|
+
* NO BYPASS ALLOWED:
|
|
8
|
+
* - No owner-mode env vars
|
|
9
|
+
* - No offline fallback that grants paid features
|
|
10
|
+
* - No silent feature access
|
|
11
|
+
*
|
|
12
|
+
* Exit Codes:
|
|
13
|
+
* - 0: Success
|
|
14
|
+
* - 2: BLOCK verdict (CI failure)
|
|
15
|
+
* - 3: Feature not allowed (upgrade required)
|
|
16
|
+
* - 4: Misconfiguration/env error
|
|
17
|
+
*
|
|
18
|
+
* Tiers:
|
|
19
|
+
* - FREE ($0): Basic scanning and validation
|
|
20
|
+
* - PRO ($99/repo/mo): Full fix, prove, ai-test, share, advanced reality
|
|
21
|
+
* - COMPLETE ($199/repo/mo): Everything including permissions, graph, advanced compliance
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
"use strict";
|
|
25
|
+
|
|
26
|
+
const fs = require("fs");
|
|
27
|
+
const path = require("path");
|
|
28
|
+
const os = require("os");
|
|
29
|
+
const crypto = require("crypto");
|
|
30
|
+
|
|
31
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
32
|
+
// EXIT CODES
|
|
33
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
34
|
+
const EXIT_SUCCESS = 0;
|
|
35
|
+
const EXIT_BLOCK_VERDICT = 2;
|
|
36
|
+
const EXIT_FEATURE_NOT_ALLOWED = 3;
|
|
37
|
+
const EXIT_MISCONFIG = 4;
|
|
38
|
+
|
|
39
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
40
|
+
// TIER DEFINITIONS - SOURCE OF TRUTH
|
|
41
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
42
|
+
const TIERS = {
|
|
43
|
+
free: { name: "FREE", price: 0, order: 0 },
|
|
44
|
+
starter: { name: "STARTER", price: 29, order: 1 },
|
|
45
|
+
pro: { name: "PRO", price: 99, order: 2 },
|
|
46
|
+
complete: { name: "COMPLETE", price: 199, order: 3 },
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
50
|
+
// ENTITLEMENTS MATRIX - SOURCE OF TRUTH
|
|
51
|
+
// Format: feature -> { minTier, caps?, downgrade? }
|
|
52
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
53
|
+
const ENTITLEMENTS = {
|
|
54
|
+
// Core commands
|
|
55
|
+
"scan": { minTier: "free" },
|
|
56
|
+
"ship": { minTier: "free", caps: { free: "static-only" } },
|
|
57
|
+
"ship.static": { minTier: "free" },
|
|
58
|
+
"ship.full": { minTier: "pro" },
|
|
59
|
+
|
|
60
|
+
// Reality testing
|
|
61
|
+
"reality": { minTier: "free", downgrade: "reality.preview" },
|
|
62
|
+
"reality.preview": { minTier: "free", caps: { free: { maxPages: 5, maxClicks: 20, noAuthBoundary: true } } },
|
|
63
|
+
"reality.full": { minTier: "pro" },
|
|
64
|
+
"reality.advanced_auth_boundary": { minTier: "complete" },
|
|
65
|
+
|
|
66
|
+
// Prove command
|
|
67
|
+
"prove": { minTier: "pro" },
|
|
68
|
+
|
|
69
|
+
// Fix command
|
|
70
|
+
"fix": { minTier: "free", downgrade: "fix.plan_only" },
|
|
71
|
+
"fix.plan_only": { minTier: "free" },
|
|
72
|
+
"fix.apply_patches": { minTier: "complete" },
|
|
73
|
+
|
|
74
|
+
// Report formats
|
|
75
|
+
"report": { minTier: "free", downgrade: "report.html_md" },
|
|
76
|
+
"report.html_md": { minTier: "free" },
|
|
77
|
+
"report.sarif_csv": { minTier: "pro" },
|
|
78
|
+
"report.compliance_packs": { minTier: "complete" },
|
|
79
|
+
|
|
80
|
+
// Setup & DX
|
|
81
|
+
"install": { minTier: "free" },
|
|
82
|
+
"init": { minTier: "free" },
|
|
83
|
+
"doctor": { minTier: "free" },
|
|
84
|
+
"status": { minTier: "free" },
|
|
85
|
+
"watch": { minTier: "free" },
|
|
86
|
+
"preflight": { minTier: "free" },
|
|
87
|
+
|
|
88
|
+
// AI Truth
|
|
89
|
+
"ctx": { minTier: "free" },
|
|
90
|
+
"guard": { minTier: "free" },
|
|
91
|
+
"context": { minTier: "free" },
|
|
92
|
+
"mdc": { minTier: "free" },
|
|
93
|
+
|
|
94
|
+
// PRO only
|
|
95
|
+
"replay": { minTier: "pro" },
|
|
96
|
+
"share": { minTier: "pro" },
|
|
97
|
+
"ai-test": { minTier: "pro" },
|
|
98
|
+
|
|
99
|
+
// STARTER and above
|
|
100
|
+
"gate": { minTier: "starter" },
|
|
101
|
+
"pr": { minTier: "starter" },
|
|
102
|
+
"badge": { minTier: "starter" },
|
|
103
|
+
"launch": { minTier: "starter" },
|
|
104
|
+
"mcp": { minTier: "starter", downgrade: "mcp.help_only" },
|
|
105
|
+
"mcp.help_only": { minTier: "free", caps: { free: "help and print-config only" } },
|
|
106
|
+
|
|
107
|
+
// COMPLETE only
|
|
108
|
+
"permissions": { minTier: "complete" },
|
|
109
|
+
"graph": { minTier: "complete" },
|
|
110
|
+
|
|
111
|
+
// Account (always free)
|
|
112
|
+
"login": { minTier: "free" },
|
|
113
|
+
"logout": { minTier: "free" },
|
|
114
|
+
"whoami": { minTier: "free" },
|
|
115
|
+
|
|
116
|
+
// Labs/experimental
|
|
117
|
+
"labs": { minTier: "free" },
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
121
|
+
// LIMITS BY TIER
|
|
122
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
123
|
+
const LIMITS = {
|
|
124
|
+
free: {
|
|
125
|
+
realityMaxPages: 5,
|
|
126
|
+
realityMaxClicks: 20,
|
|
127
|
+
realityAuthBoundary: false,
|
|
128
|
+
reportFormats: ["html", "md"],
|
|
129
|
+
fixApplyPatches: false,
|
|
130
|
+
scansPerMonth: 50,
|
|
131
|
+
shipChecksPerMonth: 20,
|
|
132
|
+
},
|
|
133
|
+
pro: {
|
|
134
|
+
realityMaxPages: -1, // unlimited
|
|
135
|
+
realityMaxClicks: -1,
|
|
136
|
+
realityAuthBoundary: true,
|
|
137
|
+
realityAdvancedAuth: false,
|
|
138
|
+
reportFormats: ["html", "md", "sarif", "csv"],
|
|
139
|
+
fixApplyPatches: false,
|
|
140
|
+
scansPerMonth: -1, // unlimited
|
|
141
|
+
shipChecksPerMonth: -1,
|
|
142
|
+
},
|
|
143
|
+
complete: {
|
|
144
|
+
realityMaxPages: -1,
|
|
145
|
+
realityMaxClicks: -1,
|
|
146
|
+
realityAuthBoundary: true,
|
|
147
|
+
realityAdvancedAuth: true,
|
|
148
|
+
reportFormats: ["html", "md", "sarif", "csv", "compliance"],
|
|
149
|
+
fixApplyPatches: true,
|
|
150
|
+
scansPerMonth: -1,
|
|
151
|
+
shipChecksPerMonth: -1,
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
const API_BASE_URL = process.env.VIBECHECK_API_URL || "https://api.vibecheckai.dev";
|
|
156
|
+
|
|
157
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
158
|
+
// CACHE PATHS
|
|
159
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
160
|
+
function getEntitlementsCachePath(projectPath) {
|
|
161
|
+
return path.join(projectPath || process.cwd(), ".vibecheck", ".entitlements.json");
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function getGlobalConfigPath() {
|
|
165
|
+
const home = os.homedir();
|
|
166
|
+
if (process.platform === "win32") {
|
|
167
|
+
return path.join(process.env.APPDATA || path.join(home, "AppData", "Roaming"), "vibecheck", "config.json");
|
|
168
|
+
}
|
|
169
|
+
return path.join(home, ".config", "vibecheck", "config.json");
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
173
|
+
// TIER COMPARISON
|
|
174
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
175
|
+
function tierMeetsMinimum(currentTier, requiredTier) {
|
|
176
|
+
const current = TIERS[currentTier]?.order ?? -1;
|
|
177
|
+
const required = TIERS[requiredTier]?.order ?? 999;
|
|
178
|
+
return current >= required;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function getTierLabel(tier) {
|
|
182
|
+
return TIERS[tier]?.name || tier.toUpperCase();
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
186
|
+
// CORE API: getTier()
|
|
187
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
188
|
+
let _cachedTier = null;
|
|
189
|
+
let _cachedTierExpiry = 0;
|
|
190
|
+
|
|
191
|
+
async function getTier(options = {}) {
|
|
192
|
+
const { apiKey, projectPath, forceRefresh = false } = options;
|
|
193
|
+
|
|
194
|
+
// Check cache (5 minute TTL)
|
|
195
|
+
if (!forceRefresh && _cachedTier && Date.now() < _cachedTierExpiry) {
|
|
196
|
+
return _cachedTier;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// No API key = free tier
|
|
200
|
+
if (!apiKey) {
|
|
201
|
+
_cachedTier = "free";
|
|
202
|
+
_cachedTierExpiry = Date.now() + 300000;
|
|
203
|
+
return "free";
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Fetch from API
|
|
207
|
+
try {
|
|
208
|
+
const res = await fetch(`${API_BASE_URL}/v1/entitlements`, {
|
|
209
|
+
method: "GET",
|
|
210
|
+
headers: { "Authorization": `Bearer ${apiKey}` },
|
|
211
|
+
signal: AbortSignal.timeout(5000),
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
if (res.ok) {
|
|
215
|
+
const data = await res.json();
|
|
216
|
+
_cachedTier = data.tier || "free";
|
|
217
|
+
_cachedTierExpiry = Date.now() + 300000;
|
|
218
|
+
|
|
219
|
+
// Cache locally
|
|
220
|
+
try {
|
|
221
|
+
const cachePath = getEntitlementsCachePath(projectPath);
|
|
222
|
+
const dir = path.dirname(cachePath);
|
|
223
|
+
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
224
|
+
fs.writeFileSync(cachePath, JSON.stringify({ tier: _cachedTier, fetchedAt: new Date().toISOString() }, null, 2));
|
|
225
|
+
} catch {}
|
|
226
|
+
|
|
227
|
+
return _cachedTier;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (res.status === 401) {
|
|
231
|
+
return "free"; // Invalid key = free tier
|
|
232
|
+
}
|
|
233
|
+
} catch {
|
|
234
|
+
// Network error - check local cache
|
|
235
|
+
try {
|
|
236
|
+
const cachePath = getEntitlementsCachePath(projectPath);
|
|
237
|
+
if (fs.existsSync(cachePath)) {
|
|
238
|
+
const cached = JSON.parse(fs.readFileSync(cachePath, "utf8"));
|
|
239
|
+
// Only use cache if less than 24 hours old
|
|
240
|
+
const fetchedAt = new Date(cached.fetchedAt).getTime();
|
|
241
|
+
if (Date.now() - fetchedAt < 24 * 3600 * 1000) {
|
|
242
|
+
return cached.tier || "free";
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
} catch {}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Default to free (no offline bypass to paid features)
|
|
249
|
+
return "free";
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
253
|
+
// CORE API: getLimits()
|
|
254
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
255
|
+
function getLimits(tier) {
|
|
256
|
+
return LIMITS[tier] || LIMITS.free;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
260
|
+
// CORE API: enforce() - THE GATEKEEPER
|
|
261
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
262
|
+
/**
|
|
263
|
+
* Enforce feature access. Returns enforcement result.
|
|
264
|
+
*
|
|
265
|
+
* @param {string} feature - Feature key (e.g., "prove", "fix.apply_patches")
|
|
266
|
+
* @param {object} options - { apiKey?, projectPath?, silent? }
|
|
267
|
+
* @returns {object} - { allowed, tier, downgrade?, exitCode, message }
|
|
268
|
+
*/
|
|
269
|
+
async function enforce(feature, options = {}) {
|
|
270
|
+
const { apiKey, projectPath, silent = false } = options;
|
|
271
|
+
|
|
272
|
+
const tier = await getTier({ apiKey, projectPath });
|
|
273
|
+
const entitlement = ENTITLEMENTS[feature];
|
|
274
|
+
|
|
275
|
+
if (!entitlement) {
|
|
276
|
+
// Unknown feature - block by default
|
|
277
|
+
return {
|
|
278
|
+
allowed: false,
|
|
279
|
+
tier,
|
|
280
|
+
exitCode: EXIT_MISCONFIG,
|
|
281
|
+
message: `Unknown feature: ${feature}`,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const hasAccess = tierMeetsMinimum(tier, entitlement.minTier);
|
|
286
|
+
|
|
287
|
+
if (hasAccess) {
|
|
288
|
+
// Full access
|
|
289
|
+
return {
|
|
290
|
+
allowed: true,
|
|
291
|
+
tier,
|
|
292
|
+
limits: getLimits(tier),
|
|
293
|
+
caps: entitlement.caps?.[tier] || null,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Check for downgrade option
|
|
298
|
+
if (entitlement.downgrade) {
|
|
299
|
+
const downgradeEntitlement = ENTITLEMENTS[entitlement.downgrade];
|
|
300
|
+
if (downgradeEntitlement && tierMeetsMinimum(tier, downgradeEntitlement.minTier)) {
|
|
301
|
+
// Downgrade allowed
|
|
302
|
+
const caps = downgradeEntitlement.caps?.[tier] || null;
|
|
303
|
+
const message = formatDowngradeMessage(feature, entitlement.downgrade, tier, entitlement.minTier, caps);
|
|
304
|
+
|
|
305
|
+
if (!silent) {
|
|
306
|
+
console.log(message);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
return {
|
|
310
|
+
allowed: true,
|
|
311
|
+
tier,
|
|
312
|
+
downgrade: entitlement.downgrade,
|
|
313
|
+
limits: getLimits(tier),
|
|
314
|
+
caps,
|
|
315
|
+
message,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Not allowed - generate upgrade message
|
|
321
|
+
const message = formatUpgradeMessage(feature, tier, entitlement.minTier);
|
|
322
|
+
|
|
323
|
+
if (!silent) {
|
|
324
|
+
console.error(message);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return {
|
|
328
|
+
allowed: false,
|
|
329
|
+
tier,
|
|
330
|
+
requiredTier: entitlement.minTier,
|
|
331
|
+
exitCode: EXIT_FEATURE_NOT_ALLOWED,
|
|
332
|
+
message,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
337
|
+
// MESSAGING
|
|
338
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
339
|
+
const c = {
|
|
340
|
+
reset: "\x1b[0m",
|
|
341
|
+
bold: "\x1b[1m",
|
|
342
|
+
dim: "\x1b[2m",
|
|
343
|
+
red: "\x1b[31m",
|
|
344
|
+
green: "\x1b[32m",
|
|
345
|
+
yellow: "\x1b[33m",
|
|
346
|
+
cyan: "\x1b[36m",
|
|
347
|
+
magenta: "\x1b[35m",
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
function formatUpgradeMessage(feature, currentTier, requiredTier) {
|
|
351
|
+
const tierColors = { starter: c.cyan, pro: c.magenta, enterprise: c.yellow };
|
|
352
|
+
const reqColor = tierColors[requiredTier] || c.yellow;
|
|
353
|
+
|
|
354
|
+
return `
|
|
355
|
+
${c.red}${c.bold}⛔ Feature Not Available${c.reset}
|
|
356
|
+
|
|
357
|
+
${c.yellow}${feature}${c.reset} requires ${reqColor}${getTierLabel(requiredTier)}${c.reset} plan.
|
|
358
|
+
Your current plan: ${c.dim}${getTierLabel(currentTier)}${c.reset}
|
|
359
|
+
|
|
360
|
+
${c.cyan}Upgrade at:${c.reset} https://vibecheckai.dev/pricing
|
|
361
|
+
|
|
362
|
+
${c.dim}Exit code: ${EXIT_FEATURE_NOT_ALLOWED}${c.reset}
|
|
363
|
+
`;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
function formatDowngradeMessage(feature, downgradeTo, currentTier, requiredTier, caps) {
|
|
367
|
+
const tierColors = { starter: c.cyan, pro: c.magenta, enterprise: c.yellow };
|
|
368
|
+
const reqColor = tierColors[requiredTier] || c.yellow;
|
|
369
|
+
|
|
370
|
+
let capsStr = "";
|
|
371
|
+
if (caps) {
|
|
372
|
+
if (typeof caps === "string") {
|
|
373
|
+
capsStr = ` ${c.dim}Mode: ${caps}${c.reset}\n`;
|
|
374
|
+
} else if (typeof caps === "object") {
|
|
375
|
+
const entries = Object.entries(caps).map(([k, v]) => `${k}: ${v}`).join(", ");
|
|
376
|
+
capsStr = ` ${c.dim}Limits: ${entries}${c.reset}\n`;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
return `
|
|
381
|
+
${c.yellow}${c.bold}⚠ Running in Preview Mode${c.reset}
|
|
382
|
+
|
|
383
|
+
Full ${c.yellow}${feature}${c.reset} requires ${reqColor}${getTierLabel(requiredTier)}${c.reset} plan.
|
|
384
|
+
Running ${c.green}${downgradeTo}${c.reset} instead.
|
|
385
|
+
${capsStr}
|
|
386
|
+
${c.cyan}Upgrade for full access:${c.reset} https://vibecheckai.dev/pricing
|
|
387
|
+
`;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
391
|
+
// CONVENIENCE HELPERS
|
|
392
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Check if a command is allowed (does not print messages)
|
|
396
|
+
*/
|
|
397
|
+
async function checkCommand(command, options = {}) {
|
|
398
|
+
return enforce(command, { ...options, silent: true });
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Enforce and exit if not allowed
|
|
403
|
+
*/
|
|
404
|
+
async function enforceOrExit(feature, options = {}) {
|
|
405
|
+
const result = await enforce(feature, options);
|
|
406
|
+
if (!result.allowed) {
|
|
407
|
+
process.exit(result.exitCode);
|
|
408
|
+
}
|
|
409
|
+
return result;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Get the minimum tier required for a feature
|
|
414
|
+
*/
|
|
415
|
+
function getMinTierForFeature(feature) {
|
|
416
|
+
return ENTITLEMENTS[feature]?.minTier || "enterprise";
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Check if tier has access to feature (sync, for help display)
|
|
421
|
+
*/
|
|
422
|
+
function tierHasFeature(tier, feature) {
|
|
423
|
+
const entitlement = ENTITLEMENTS[feature];
|
|
424
|
+
if (!entitlement) return false;
|
|
425
|
+
return tierMeetsMinimum(tier, entitlement.minTier);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Get all features for a tier
|
|
430
|
+
*/
|
|
431
|
+
function getFeaturesForTier(tier) {
|
|
432
|
+
const features = [];
|
|
433
|
+
for (const [feature, def] of Object.entries(ENTITLEMENTS)) {
|
|
434
|
+
if (tierMeetsMinimum(tier, def.minTier)) {
|
|
435
|
+
features.push(feature);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return features;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
442
|
+
// COMMAND GROUPING FOR HELP DISPLAY
|
|
443
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
444
|
+
const COMMAND_GROUPS = {
|
|
445
|
+
"Proof Loop": ["scan", "ship", "reality", "prove", "fix", "report"],
|
|
446
|
+
"Setup & DX": ["install", "init", "doctor", "status", "watch", "launch"],
|
|
447
|
+
"AI Truth": ["ctx", "guard", "context", "mdc"],
|
|
448
|
+
"CI & Collaboration": ["gate", "pr", "badge"],
|
|
449
|
+
"Reporting": ["report"],
|
|
450
|
+
"Automation": ["ai-test", "mcp", "share"],
|
|
451
|
+
};
|
|
452
|
+
|
|
453
|
+
function getCommandGroup(command) {
|
|
454
|
+
for (const [group, commands] of Object.entries(COMMAND_GROUPS)) {
|
|
455
|
+
if (commands.includes(command)) return group;
|
|
456
|
+
}
|
|
457
|
+
return "Other";
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
461
|
+
// EXPORTS
|
|
462
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
463
|
+
module.exports = {
|
|
464
|
+
// Core API
|
|
465
|
+
getTier,
|
|
466
|
+
getLimits,
|
|
467
|
+
enforce,
|
|
468
|
+
enforceOrExit,
|
|
469
|
+
checkCommand,
|
|
470
|
+
|
|
471
|
+
// Tier helpers
|
|
472
|
+
tierMeetsMinimum,
|
|
473
|
+
getTierLabel,
|
|
474
|
+
getMinTierForFeature,
|
|
475
|
+
tierHasFeature,
|
|
476
|
+
getFeaturesForTier,
|
|
477
|
+
|
|
478
|
+
// Command grouping
|
|
479
|
+
COMMAND_GROUPS,
|
|
480
|
+
getCommandGroup,
|
|
481
|
+
|
|
482
|
+
// Constants
|
|
483
|
+
TIERS,
|
|
484
|
+
ENTITLEMENTS,
|
|
485
|
+
LIMITS,
|
|
486
|
+
EXIT_SUCCESS,
|
|
487
|
+
EXIT_BLOCK_VERDICT,
|
|
488
|
+
EXIT_FEATURE_NOT_ALLOWED,
|
|
489
|
+
EXIT_MISCONFIG,
|
|
490
|
+
};
|