@vibecheckai/cli 3.5.1 → 3.5.3
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/registry.js +406 -154
- package/bin/runners/context/analyzer.js +52 -1
- package/bin/runners/context/generators/mcp.js +15 -13
- package/bin/runners/context/git-context.js +3 -1
- package/bin/runners/context/proof-context.js +248 -1
- package/bin/runners/context/team-conventions.js +33 -7
- package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +474 -0
- package/bin/runners/lib/agent-firewall/change-packet/builder.js +488 -0
- package/bin/runners/lib/agent-firewall/change-packet/schema.json +228 -0
- package/bin/runners/lib/agent-firewall/change-packet/store.js +200 -0
- package/bin/runners/lib/agent-firewall/claims/claim-types.js +21 -0
- package/bin/runners/lib/agent-firewall/claims/extractor.js +303 -0
- package/bin/runners/lib/agent-firewall/claims/patterns.js +24 -0
- package/bin/runners/lib/agent-firewall/critic/index.js +151 -0
- package/bin/runners/lib/agent-firewall/critic/judge.js +432 -0
- package/bin/runners/lib/agent-firewall/critic/prompts.js +305 -0
- package/bin/runners/lib/agent-firewall/evidence/auth-evidence.js +88 -0
- package/bin/runners/lib/agent-firewall/evidence/contract-evidence.js +75 -0
- package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +127 -0
- package/bin/runners/lib/agent-firewall/evidence/resolver.js +102 -0
- package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +213 -0
- package/bin/runners/lib/agent-firewall/evidence/side-effect-evidence.js +145 -0
- package/bin/runners/lib/agent-firewall/fs-hook/daemon.js +19 -0
- package/bin/runners/lib/agent-firewall/fs-hook/installer.js +87 -0
- package/bin/runners/lib/agent-firewall/fs-hook/watcher.js +184 -0
- package/bin/runners/lib/agent-firewall/git-hook/pre-commit.js +163 -0
- package/bin/runners/lib/agent-firewall/ide-extension/cursor.js +107 -0
- package/bin/runners/lib/agent-firewall/ide-extension/vscode.js +68 -0
- package/bin/runners/lib/agent-firewall/ide-extension/windsurf.js +66 -0
- package/bin/runners/lib/agent-firewall/interceptor/base.js +304 -0
- package/bin/runners/lib/agent-firewall/interceptor/cursor.js +35 -0
- package/bin/runners/lib/agent-firewall/interceptor/vscode.js +35 -0
- package/bin/runners/lib/agent-firewall/interceptor/windsurf.js +34 -0
- package/bin/runners/lib/agent-firewall/lawbook/distributor.js +465 -0
- package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +604 -0
- package/bin/runners/lib/agent-firewall/lawbook/index.js +304 -0
- package/bin/runners/lib/agent-firewall/lawbook/registry.js +514 -0
- package/bin/runners/lib/agent-firewall/lawbook/schema.js +420 -0
- package/bin/runners/lib/agent-firewall/logger.js +141 -0
- package/bin/runners/lib/agent-firewall/policy/default-policy.json +90 -0
- package/bin/runners/lib/agent-firewall/policy/engine.js +103 -0
- package/bin/runners/lib/agent-firewall/policy/loader.js +451 -0
- package/bin/runners/lib/agent-firewall/policy/rules/auth-drift.js +50 -0
- package/bin/runners/lib/agent-firewall/policy/rules/contract-drift.js +50 -0
- package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +86 -0
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +162 -0
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +189 -0
- package/bin/runners/lib/agent-firewall/policy/rules/scope.js +93 -0
- package/bin/runners/lib/agent-firewall/policy/rules/unsafe-side-effect.js +57 -0
- package/bin/runners/lib/agent-firewall/policy/schema.json +183 -0
- package/bin/runners/lib/agent-firewall/policy/verdict.js +54 -0
- package/bin/runners/lib/agent-firewall/proposal/extractor.js +394 -0
- package/bin/runners/lib/agent-firewall/proposal/index.js +212 -0
- package/bin/runners/lib/agent-firewall/proposal/schema.js +251 -0
- package/bin/runners/lib/agent-firewall/proposal/validator.js +386 -0
- package/bin/runners/lib/agent-firewall/reality/index.js +332 -0
- package/bin/runners/lib/agent-firewall/reality/state.js +625 -0
- package/bin/runners/lib/agent-firewall/reality/watcher.js +322 -0
- package/bin/runners/lib/agent-firewall/risk/index.js +173 -0
- package/bin/runners/lib/agent-firewall/risk/scorer.js +328 -0
- package/bin/runners/lib/agent-firewall/risk/thresholds.js +321 -0
- package/bin/runners/lib/agent-firewall/risk/vectors.js +421 -0
- package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +472 -0
- package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +346 -0
- package/bin/runners/lib/agent-firewall/simulator/index.js +181 -0
- package/bin/runners/lib/agent-firewall/simulator/route-validator.js +380 -0
- package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +661 -0
- package/bin/runners/lib/agent-firewall/time-machine/index.js +267 -0
- package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +436 -0
- package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +490 -0
- package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +530 -0
- package/bin/runners/lib/agent-firewall/truthpack/index.js +67 -0
- package/bin/runners/lib/agent-firewall/truthpack/loader.js +137 -0
- package/bin/runners/lib/agent-firewall/unblock/planner.js +337 -0
- package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +118 -0
- package/bin/runners/lib/analysis-core.js +220 -182
- package/bin/runners/lib/analyzers.js +2145 -224
- package/bin/runners/lib/api-client.js +269 -0
- package/bin/runners/lib/authority-badge.js +425 -0
- package/bin/runners/lib/cli-output.js +242 -210
- package/bin/runners/lib/default-config.js +127 -0
- package/bin/runners/lib/detectors-v2.js +547 -785
- package/bin/runners/lib/doctor/modules/security.js +3 -1
- package/bin/runners/lib/engine/ast-cache.js +210 -0
- package/bin/runners/lib/engine/auth-extractor.js +211 -0
- package/bin/runners/lib/engine/billing-extractor.js +112 -0
- package/bin/runners/lib/engine/enforcement-extractor.js +100 -0
- package/bin/runners/lib/engine/env-extractor.js +207 -0
- package/bin/runners/lib/engine/express-extractor.js +208 -0
- package/bin/runners/lib/engine/extractors.js +849 -0
- package/bin/runners/lib/engine/index.js +207 -0
- package/bin/runners/lib/engine/repo-index.js +514 -0
- package/bin/runners/lib/engine/types.js +124 -0
- package/bin/runners/lib/engines/accessibility-engine.js +190 -0
- package/bin/runners/lib/engines/api-consistency-engine.js +162 -0
- package/bin/runners/lib/engines/ast-cache.js +99 -0
- package/bin/runners/lib/engines/code-quality-engine.js +255 -0
- package/bin/runners/lib/engines/console-logs-engine.js +115 -0
- package/bin/runners/lib/engines/cross-file-analysis-engine.js +268 -0
- package/bin/runners/lib/engines/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/deprecated-api-engine.js +226 -0
- package/bin/runners/lib/engines/empty-catch-engine.js +150 -0
- package/bin/runners/lib/engines/file-filter.js +131 -0
- package/bin/runners/lib/engines/hardcoded-secrets-engine.js +251 -0
- package/bin/runners/lib/engines/mock-data-engine.js +272 -0
- package/bin/runners/lib/engines/parallel-processor.js +71 -0
- package/bin/runners/lib/engines/performance-issues-engine.js +265 -0
- package/bin/runners/lib/engines/security-vulnerabilities-engine.js +243 -0
- package/bin/runners/lib/engines/todo-fixme-engine.js +115 -0
- package/bin/runners/lib/engines/type-aware-engine.js +152 -0
- package/bin/runners/lib/engines/unsafe-regex-engine.js +225 -0
- package/bin/runners/lib/engines/vibecheck-engines/README.md +53 -0
- package/bin/runners/lib/engines/vibecheck-engines/index.js +15 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +139 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
- package/bin/runners/lib/engines/vibecheck-engines/package.json +13 -0
- package/bin/runners/lib/entitlements-v2.js +152 -446
- package/bin/runners/lib/error-handler.js +60 -12
- package/bin/runners/lib/error-messages.js +289 -0
- package/bin/runners/lib/evidence-pack.js +7 -1
- package/bin/runners/lib/exit-codes.js +275 -0
- package/bin/runners/lib/finding-id.js +69 -0
- package/bin/runners/lib/finding-sorter.js +89 -0
- package/bin/runners/lib/fingerprint.js +377 -0
- package/bin/runners/lib/global-flags.js +37 -0
- package/bin/runners/lib/help-formatter.js +413 -0
- package/bin/runners/lib/logger.js +38 -0
- package/bin/runners/lib/next-action.js +560 -0
- package/bin/runners/lib/prerequisites.js +149 -0
- package/bin/runners/lib/route-detection.js +137 -68
- package/bin/runners/lib/route-truth.js +1167 -322
- package/bin/runners/lib/scan-output.js +504 -463
- package/bin/runners/lib/scan-runner.js +135 -0
- package/bin/runners/lib/schemas/ajv-validator.js +464 -0
- package/bin/runners/lib/schemas/error-envelope.schema.json +105 -0
- package/bin/runners/lib/schemas/finding-v3.schema.json +151 -0
- package/bin/runners/lib/schemas/report-artifact.schema.json +120 -0
- package/bin/runners/lib/schemas/run-request.schema.json +108 -0
- package/bin/runners/lib/schemas/validator.js +27 -0
- package/bin/runners/lib/schemas/verdict.schema.json +140 -0
- package/bin/runners/lib/ship-output-enterprise.js +239 -0
- package/bin/runners/lib/ship-output.js +328 -31
- package/bin/runners/lib/terminal-ui.js +234 -731
- package/bin/runners/lib/truth.js +1332 -308
- package/bin/runners/lib/unified-cli-output.js +604 -0
- package/bin/runners/lib/unified-output.js +163 -155
- package/bin/runners/lib/upsell.js +104 -204
- package/bin/runners/runAgent.d.ts +5 -0
- package/bin/runners/runAgent.js +161 -0
- package/bin/runners/runAllowlist.js +166 -101
- package/bin/runners/runApprove.js +1200 -0
- package/bin/runners/runAuth.js +373 -95
- package/bin/runners/runCheckpoint.js +59 -21
- package/bin/runners/runClassify.js +926 -0
- package/bin/runners/runContext.d.ts +4 -0
- package/bin/runners/runContext.js +136 -24
- package/bin/runners/runDoctor.js +115 -67
- package/bin/runners/runEvidencePack.js +239 -96
- package/bin/runners/runFirewall.d.ts +5 -0
- package/bin/runners/runFirewall.js +134 -0
- package/bin/runners/runFirewallHook.d.ts +5 -0
- package/bin/runners/runFirewallHook.js +56 -0
- package/bin/runners/runFix.js +6 -5
- package/bin/runners/runGuard.js +212 -118
- package/bin/runners/runInit.js +66 -21
- package/bin/runners/runLabs.js +204 -121
- package/bin/runners/runMcp.js +131 -60
- package/bin/runners/runPolish.d.ts +4 -0
- package/bin/runners/runPolish.js +43 -20
- package/bin/runners/runProof.zip +0 -0
- package/bin/runners/runProve.js +15 -5
- package/bin/runners/runQuickstart.js +531 -0
- package/bin/runners/runReality.js +14 -0
- package/bin/runners/runReport.js +36 -4
- package/bin/runners/runScan.js +689 -91
- package/bin/runners/runShip.js +96 -40
- package/bin/runners/runTruth.d.ts +5 -0
- package/bin/runners/runTruth.js +101 -0
- package/bin/runners/runValidate.js +21 -4
- package/bin/runners/runWatch.js +118 -54
- package/bin/scan.js +6 -1
- package/bin/vibecheck.js +297 -52
- package/mcp-server/HARDENING_SUMMARY.md +299 -0
- package/mcp-server/agent-firewall-interceptor.js +500 -0
- package/mcp-server/authority-tools.js +569 -0
- package/mcp-server/conductor/conflict-resolver.js +588 -0
- package/mcp-server/conductor/execution-planner.js +544 -0
- package/mcp-server/conductor/index.js +377 -0
- package/mcp-server/conductor/lock-manager.js +615 -0
- package/mcp-server/conductor/request-queue.js +550 -0
- package/mcp-server/conductor/session-manager.js +500 -0
- package/mcp-server/conductor/tools.js +510 -0
- package/mcp-server/deprecation-middleware.js +282 -0
- package/mcp-server/handlers/index.ts +15 -0
- package/mcp-server/handlers/tool-handler.ts +474 -591
- package/mcp-server/index.js +1748 -1099
- package/mcp-server/lib/api-client.cjs +13 -0
- package/mcp-server/lib/cache-wrapper.cjs +383 -0
- package/mcp-server/lib/error-envelope.js +138 -0
- package/mcp-server/lib/executor.ts +428 -721
- package/mcp-server/lib/index.ts +19 -0
- package/mcp-server/lib/logger.cjs +30 -0
- package/mcp-server/lib/rate-limiter.js +166 -0
- package/mcp-server/lib/sandbox.test.ts +519 -0
- package/mcp-server/lib/sandbox.ts +342 -284
- package/mcp-server/lib/types.ts +267 -0
- package/mcp-server/logger.js +173 -0
- package/mcp-server/package.json +11 -27
- package/mcp-server/premium-tools.js +2 -2
- package/mcp-server/registry/tool-registry.js +794 -0
- package/mcp-server/registry/tools.json +507 -378
- package/mcp-server/registry.test.ts +334 -0
- package/mcp-server/tests/tier-gating.test.js +297 -0
- package/mcp-server/tier-auth.js +492 -347
- package/mcp-server/tools-v3.js +950 -0
- package/mcp-server/truth-context.js +131 -90
- package/mcp-server/truth-firewall-tools.js +1612 -1001
- package/mcp-server/tsconfig.json +8 -5
- package/mcp-server/vibecheck-2.0-tools.js +14 -1
- package/mcp-server/vibecheck-mcp-server-3.2.0.tgz +0 -0
- package/mcp-server/vibecheck-tools.js +2 -2
- package/package.json +4 -3
- package/bin/runners/runInstall.js +0 -281
- package/mcp-server/ARCHITECTURE.md +0 -339
- package/mcp-server/__tests__/cache.test.ts +0 -313
- package/mcp-server/__tests__/executor.test.ts +0 -239
- package/mcp-server/__tests__/fixtures/exclusion-test/.cache/webpack/cache.pack +0 -1
- package/mcp-server/__tests__/fixtures/exclusion-test/.next/server/chunk.js +0 -3
- package/mcp-server/__tests__/fixtures/exclusion-test/.turbo/cache.json +0 -3
- package/mcp-server/__tests__/fixtures/exclusion-test/.venv/lib/env.py +0 -3
- package/mcp-server/__tests__/fixtures/exclusion-test/dist/bundle.js +0 -3
- package/mcp-server/__tests__/fixtures/exclusion-test/package.json +0 -5
- package/mcp-server/__tests__/fixtures/exclusion-test/src/app.ts +0 -5
- package/mcp-server/__tests__/fixtures/exclusion-test/venv/lib/config.py +0 -4
- package/mcp-server/__tests__/ids.test.ts +0 -345
- package/mcp-server/__tests__/integration/tools.test.ts +0 -410
- package/mcp-server/__tests__/registry.test.ts +0 -365
- package/mcp-server/__tests__/sandbox.test.ts +0 -323
- package/mcp-server/__tests__/schemas.test.ts +0 -372
- package/mcp-server/benchmarks/run-benchmarks.ts +0 -304
- package/mcp-server/examples/doctor.request.json +0 -14
- package/mcp-server/examples/doctor.response.json +0 -53
- package/mcp-server/examples/error.response.json +0 -15
- package/mcp-server/examples/scan.request.json +0 -14
- package/mcp-server/examples/scan.response.json +0 -108
- package/mcp-server/index-v3.ts +0 -293
- package/mcp-server/index.old.js +0 -4137
- package/mcp-server/lib/cache.ts +0 -341
- package/mcp-server/lib/errors.ts +0 -346
- package/mcp-server/lib/ids.ts +0 -238
- package/mcp-server/lib/logger.ts +0 -368
- package/mcp-server/lib/metrics.ts +0 -365
- package/mcp-server/lib/validator.ts +0 -229
- package/mcp-server/package-lock.json +0 -165
- package/mcp-server/schemas/error-envelope.schema.json +0 -125
- package/mcp-server/schemas/finding.schema.json +0 -167
- package/mcp-server/schemas/report-artifact.schema.json +0 -88
- package/mcp-server/schemas/run-request.schema.json +0 -75
- package/mcp-server/schemas/verdict.schema.json +0 -168
- package/mcp-server/tier-auth.d.ts +0 -71
- package/mcp-server/vitest.config.ts +0 -16
package/bin/registry.js
CHANGED
|
@@ -1,42 +1,47 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Vibecheck CLI Command Registry
|
|
2
|
+
* Vibecheck CLI Command Registry
|
|
3
3
|
*
|
|
4
4
|
* Single source of truth for the public CLI surface.
|
|
5
5
|
* If it isn't here, it does not exist.
|
|
6
|
+
*
|
|
7
|
+
* Simple 2-tier model:
|
|
8
|
+
* - FREE ($0): Inspect & Observe
|
|
9
|
+
* - PRO ($69/mo): Fix, Prove & Enforce
|
|
6
10
|
*/
|
|
7
11
|
|
|
8
12
|
"use strict";
|
|
9
13
|
|
|
10
14
|
// ─────────────────────────────────────────────────────────────
|
|
11
|
-
//
|
|
15
|
+
// CLI COMMANDS (2-tier: FREE / PRO)
|
|
12
16
|
// ─────────────────────────────────────────────────────────────
|
|
13
17
|
const ALLOWED_COMMANDS = new Set([
|
|
14
|
-
//
|
|
15
|
-
"init",
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
|
|
33
|
-
//
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
18
|
+
// FREE (14) - Inspect & Observe
|
|
19
|
+
"init", // one-time setup
|
|
20
|
+
"quickstart", // 2-minute onboarding (NEW)
|
|
21
|
+
"doctor", // health check
|
|
22
|
+
"watch", // continuous mode
|
|
23
|
+
"scan", // static analysis
|
|
24
|
+
"report", // generate reports
|
|
25
|
+
"context", // generate IDE rules
|
|
26
|
+
"classify", // Authority: inventory (read-only)
|
|
27
|
+
"login", // authenticate
|
|
28
|
+
"logout", // remove credentials
|
|
29
|
+
"whoami", // show current user
|
|
30
|
+
"allowlist", // manage finding allowlist
|
|
31
|
+
"evidence-pack", // bundle proof artifacts
|
|
32
|
+
"labs", // experimental features
|
|
33
|
+
|
|
34
|
+
// PRO (9) - Fix, Prove & Enforce
|
|
35
|
+
"ship", // verdict engine (GO/NO-GO)
|
|
36
|
+
"fix", // AI-powered fixes
|
|
37
|
+
"prove", // runtime proof
|
|
38
|
+
"reality", // browser verification
|
|
39
|
+
"gate", // CI/CD enforcement
|
|
40
|
+
"guard", // AI guardrails
|
|
41
|
+
"mcp", // MCP server
|
|
42
|
+
"checkpoint", // baseline comparison
|
|
43
|
+
"approve", // Authority: verdicts
|
|
44
|
+
"polish", // production polish
|
|
40
45
|
]);
|
|
41
46
|
|
|
42
47
|
function assertAllowedOnly(obj) {
|
|
@@ -47,241 +52,488 @@ function assertAllowedOnly(obj) {
|
|
|
47
52
|
}
|
|
48
53
|
|
|
49
54
|
// ─────────────────────────────────────────────────────────────
|
|
50
|
-
// COMMANDS (
|
|
55
|
+
// COMMANDS - 2-Tier: FREE and PRO ($69/mo)
|
|
51
56
|
// ─────────────────────────────────────────────────────────────
|
|
52
57
|
const COMMANDS = {
|
|
53
|
-
//
|
|
58
|
+
// ══════════════════════════════════════════════════════════════
|
|
59
|
+
// FREE TIER - Inspect & Observe
|
|
60
|
+
// ══════════════════════════════════════════════════════════════
|
|
61
|
+
|
|
54
62
|
init: {
|
|
55
63
|
description: "One-time setup (config + contracts + scripts)",
|
|
64
|
+
longDescription: "Initialize vibecheck in your project. Creates configuration files, sets up IDE rules, and optionally connects to the dashboard.",
|
|
56
65
|
tier: "free",
|
|
57
66
|
category: "setup",
|
|
58
67
|
aliases: ["setup", "configure"],
|
|
59
68
|
runner: () => require("./runners/runInit").runInit,
|
|
69
|
+
examples: [
|
|
70
|
+
{ command: "vibecheck init", description: "Interactive setup wizard" },
|
|
71
|
+
{ command: "vibecheck init --local", description: "Quick local-only setup" },
|
|
72
|
+
{ command: "vibecheck init --quick", description: "Non-interactive defaults" },
|
|
73
|
+
],
|
|
74
|
+
related: ["quickstart", "doctor", "scan"],
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
quickstart: {
|
|
78
|
+
description: "2-minute onboarding: doctor → ctx → scan → ship → report",
|
|
79
|
+
longDescription: "Get your first proof in under 2 minutes. Runs the complete verification pipeline with sensible defaults.",
|
|
80
|
+
tier: "free",
|
|
81
|
+
category: "setup",
|
|
82
|
+
aliases: ["qs", "start", "onboard"],
|
|
83
|
+
runner: () => require("./runners/runQuickstart").runQuickstart,
|
|
84
|
+
examples: [
|
|
85
|
+
{ command: "vibecheck quickstart", description: "Run full 2-minute onboarding" },
|
|
86
|
+
{ command: "vibecheck quickstart --fast", description: "Skip optional checks" },
|
|
87
|
+
{ command: "vibecheck quickstart --no-open", description: "Don't open report in browser" },
|
|
88
|
+
],
|
|
89
|
+
related: ["init", "scan", "ship"],
|
|
60
90
|
},
|
|
61
91
|
|
|
62
92
|
doctor: {
|
|
63
93
|
description: "Environment + dependency + config health check",
|
|
94
|
+
longDescription: "Comprehensive diagnostics for your development environment.",
|
|
64
95
|
tier: "free",
|
|
65
96
|
category: "setup",
|
|
66
97
|
aliases: ["health", "diag"],
|
|
67
98
|
runner: () => require("./runners/runDoctor").runDoctor,
|
|
99
|
+
examples: [
|
|
100
|
+
{ command: "vibecheck doctor", description: "Run all health checks" },
|
|
101
|
+
{ command: "vibecheck doctor --fix", description: "Auto-fix detected issues" },
|
|
102
|
+
{ command: "vibecheck doctor --json", description: "Output as JSON" },
|
|
103
|
+
],
|
|
104
|
+
related: ["init", "scan"],
|
|
68
105
|
},
|
|
69
106
|
|
|
70
107
|
watch: {
|
|
71
108
|
description: "Continuous mode - re-runs on changes",
|
|
109
|
+
longDescription: "File watcher that automatically re-runs scans when your code changes.",
|
|
72
110
|
tier: "free",
|
|
73
111
|
category: "setup",
|
|
74
112
|
aliases: ["w", "dev"],
|
|
75
113
|
runner: () => require("./runners/runWatch").runWatch,
|
|
114
|
+
examples: [
|
|
115
|
+
{ command: "vibecheck watch", description: "Start watching" },
|
|
116
|
+
{ command: "vibecheck watch --path ./src", description: "Watch specific directory" },
|
|
117
|
+
],
|
|
118
|
+
related: ["scan"],
|
|
76
119
|
},
|
|
77
120
|
|
|
78
|
-
// ── ANALYSIS ────────────────────────────────────────────────
|
|
79
|
-
checkpoint: {
|
|
80
|
-
description: "Compare baseline vs current, hallucination scoring",
|
|
81
|
-
tier: "free",
|
|
82
|
-
category: "analysis",
|
|
83
|
-
aliases: ["cp", "compare", "diff"],
|
|
84
|
-
caps: "basic on FREE, hallucination scoring on PRO",
|
|
85
|
-
runner: () => require("./runners/runCheckpoint").runCheckpoint,
|
|
86
|
-
},
|
|
87
|
-
|
|
88
|
-
// ── PROOF LOOP ──────────────────────────────────────────────
|
|
89
121
|
scan: {
|
|
90
|
-
description: "
|
|
122
|
+
description: "Static code analysis; use --allowlist for false positives",
|
|
123
|
+
longDescription: "Scan your codebase for route integrity issues, security vulnerabilities, and code quality problems.",
|
|
91
124
|
tier: "free",
|
|
92
125
|
category: "proof",
|
|
93
126
|
aliases: ["s", "check"],
|
|
94
127
|
runner: () => require("./runners/runScan").runScan,
|
|
128
|
+
examples: [
|
|
129
|
+
{ command: "vibecheck scan", description: "Quick scan" },
|
|
130
|
+
{ command: "vibecheck scan --profile full", description: "Full scan" },
|
|
131
|
+
{ command: "vibecheck scan --allowlist list", description: "View suppressed findings" },
|
|
132
|
+
],
|
|
133
|
+
related: ["ship", "fix", "report"],
|
|
95
134
|
},
|
|
96
135
|
|
|
97
136
|
report: {
|
|
98
137
|
description: "Generate HTML/MD/SARIF reports",
|
|
138
|
+
longDescription: "Create shareable reports from scan results.",
|
|
99
139
|
tier: "free",
|
|
100
140
|
category: "output",
|
|
101
|
-
caps: "HTML/MD only on FREE",
|
|
102
141
|
aliases: ["html", "artifact"],
|
|
103
142
|
runner: () => require("./runners/runReport").runReport,
|
|
143
|
+
examples: [
|
|
144
|
+
{ command: "vibecheck report", description: "Generate HTML report" },
|
|
145
|
+
{ command: "vibecheck report --format md", description: "Markdown report" },
|
|
146
|
+
{ command: "vibecheck report --format sarif", description: "SARIF for GitHub" },
|
|
147
|
+
],
|
|
148
|
+
related: ["scan"],
|
|
104
149
|
},
|
|
105
150
|
|
|
106
|
-
|
|
107
|
-
description: "
|
|
151
|
+
context: {
|
|
152
|
+
description: "Generate IDE rules (.cursorrules, MDC, Copilot)",
|
|
153
|
+
longDescription: "Generate project-aware AI coding rules for your IDE.",
|
|
108
154
|
tier: "free",
|
|
109
|
-
category: "
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
155
|
+
category: "truth",
|
|
156
|
+
aliases: ["rules", "ai-rules", "mdc", "ctx"],
|
|
157
|
+
runner: () => require("./runners/runContext").runContext,
|
|
158
|
+
examples: [
|
|
159
|
+
{ command: "vibecheck context", description: "Generate all IDE rules" },
|
|
160
|
+
{ command: "vibecheck context --format cursor", description: ".cursorrules only" },
|
|
161
|
+
],
|
|
162
|
+
related: ["scan", "guard"],
|
|
113
163
|
},
|
|
114
164
|
|
|
115
|
-
|
|
116
|
-
description: "
|
|
165
|
+
classify: {
|
|
166
|
+
description: "Inventory authority - duplication & legacy code maps",
|
|
167
|
+
longDescription: "Read-only inventory of your codebase including duplication maps and legacy code detection.",
|
|
117
168
|
tier: "free",
|
|
118
|
-
category: "
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
169
|
+
category: "authority",
|
|
170
|
+
aliases: ["inventory", "audit"],
|
|
171
|
+
runner: () => require("./runners/runClassify").runClassify,
|
|
172
|
+
examples: [
|
|
173
|
+
{ command: "vibecheck classify", description: "Quick inventory" },
|
|
174
|
+
{ command: "vibecheck classify --json", description: "JSON output" },
|
|
175
|
+
],
|
|
176
|
+
related: ["approve", "scan"],
|
|
125
177
|
},
|
|
126
178
|
|
|
127
|
-
|
|
128
|
-
description: "
|
|
179
|
+
login: {
|
|
180
|
+
description: "Authenticate with API key",
|
|
181
|
+
longDescription: "Connect your CLI to the vibecheck API.",
|
|
129
182
|
tier: "free",
|
|
130
|
-
category: "
|
|
131
|
-
aliases: ["
|
|
132
|
-
|
|
133
|
-
|
|
183
|
+
category: "account",
|
|
184
|
+
aliases: ["auth", "signin"],
|
|
185
|
+
runner: () => require("./runners/runAuth").runLogin,
|
|
186
|
+
skipAuth: true,
|
|
187
|
+
examples: [
|
|
188
|
+
{ command: "vibecheck login", description: "Interactive login" },
|
|
189
|
+
{ command: "vibecheck login --key YOUR_API_KEY", description: "Login with key" },
|
|
190
|
+
],
|
|
191
|
+
related: ["logout", "whoami"],
|
|
134
192
|
},
|
|
135
193
|
|
|
136
|
-
|
|
137
|
-
description: "
|
|
138
|
-
tier: "
|
|
139
|
-
category: "
|
|
140
|
-
aliases: ["
|
|
141
|
-
|
|
142
|
-
|
|
194
|
+
logout: {
|
|
195
|
+
description: "Remove stored credentials",
|
|
196
|
+
tier: "free",
|
|
197
|
+
category: "account",
|
|
198
|
+
aliases: ["signout"],
|
|
199
|
+
runner: () => require("./runners/runAuth").runLogout,
|
|
200
|
+
skipAuth: true,
|
|
201
|
+
examples: [
|
|
202
|
+
{ command: "vibecheck logout", description: "Clear credentials" },
|
|
203
|
+
],
|
|
204
|
+
related: ["login", "whoami"],
|
|
143
205
|
},
|
|
144
206
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
description: "Bundle proof artifacts (videos, traces, screenshots) into shareable pack",
|
|
207
|
+
whoami: {
|
|
208
|
+
description: "Show current user and plan",
|
|
148
209
|
tier: "free",
|
|
149
|
-
category: "
|
|
150
|
-
aliases: ["
|
|
151
|
-
runner: () => require("./runners/
|
|
210
|
+
category: "account",
|
|
211
|
+
aliases: ["me", "user"],
|
|
212
|
+
runner: () => require("./runners/runAuth").runWhoami,
|
|
213
|
+
skipAuth: true,
|
|
214
|
+
examples: [
|
|
215
|
+
{ command: "vibecheck whoami", description: "Show user info" },
|
|
216
|
+
],
|
|
217
|
+
related: ["login", "logout"],
|
|
152
218
|
},
|
|
153
219
|
|
|
154
220
|
allowlist: {
|
|
155
|
-
description: "Manage finding allowlist
|
|
221
|
+
description: "Manage finding allowlist for false positives",
|
|
222
|
+
longDescription: "Add, remove, or view allowlist entries to suppress known false positives. Supports patterns, file scopes, and expiration.",
|
|
156
223
|
tier: "free",
|
|
157
|
-
category: "
|
|
158
|
-
aliases: ["
|
|
224
|
+
category: "setup",
|
|
225
|
+
aliases: ["al", "suppress"],
|
|
159
226
|
runner: () => require("./runners/runAllowlist").runAllowlist,
|
|
227
|
+
examples: [
|
|
228
|
+
{ command: "vibecheck allowlist", description: "List allowlist entries" },
|
|
229
|
+
{ command: "vibecheck allowlist add --id MOCK_DATA_xyz --reason 'Test fixture'", description: "Add by ID" },
|
|
230
|
+
{ command: "vibecheck allowlist add --pattern 'lorem' --reason 'Placeholder'", description: "Add pattern" },
|
|
231
|
+
{ command: "vibecheck allowlist remove --id AL_abc123", description: "Remove entry" },
|
|
232
|
+
],
|
|
233
|
+
related: ["scan", "ship"],
|
|
160
234
|
},
|
|
161
235
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
236
|
+
"evidence-pack": {
|
|
237
|
+
description: "Bundle proof artifacts into shareable packs",
|
|
238
|
+
longDescription: "Creates shareable evidence packs from proof runs. Bundles videos, traces, screenshots, and findings.",
|
|
165
239
|
tier: "free",
|
|
166
|
-
category: "
|
|
167
|
-
aliases: ["
|
|
168
|
-
runner: () => require("./runners/
|
|
240
|
+
category: "output",
|
|
241
|
+
aliases: ["pack", "bundle"],
|
|
242
|
+
runner: () => require("./runners/runEvidencePack").runEvidencePack,
|
|
243
|
+
examples: [
|
|
244
|
+
{ command: "vibecheck evidence-pack", description: "Bundle latest run" },
|
|
245
|
+
{ command: "vibecheck evidence-pack --run-id abc123", description: "Bundle specific run" },
|
|
246
|
+
{ command: "vibecheck evidence-pack --markdown", description: "Markdown report" },
|
|
247
|
+
{ command: "vibecheck evidence-pack --no-videos", description: "Exclude large files" },
|
|
248
|
+
],
|
|
249
|
+
related: ["prove", "reality"],
|
|
169
250
|
},
|
|
170
251
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
252
|
+
labs: {
|
|
253
|
+
description: "Experimental & beta features",
|
|
254
|
+
longDescription: "Access experimental features that are in development. Features may change or be removed without notice.",
|
|
174
255
|
tier: "free",
|
|
175
|
-
category: "
|
|
176
|
-
aliases: ["
|
|
177
|
-
runner: () => require("./runners/
|
|
256
|
+
category: "setup",
|
|
257
|
+
aliases: ["experimental", "beta"],
|
|
258
|
+
runner: () => require("./runners/runLabs").runLabs,
|
|
259
|
+
skipAuth: true,
|
|
260
|
+
examples: [
|
|
261
|
+
{ command: "vibecheck labs", description: "List available features" },
|
|
262
|
+
{ command: "vibecheck labs ai-agent --url http://localhost:3000", description: "AI agent" },
|
|
263
|
+
{ command: "vibecheck labs security-audit", description: "Security audit" },
|
|
264
|
+
{ command: "vibecheck labs smart-fix", description: "AI-powered fixes" },
|
|
265
|
+
],
|
|
266
|
+
related: ["scan", "fix"],
|
|
267
|
+
},
|
|
268
|
+
|
|
269
|
+
// ══════════════════════════════════════════════════════════════
|
|
270
|
+
// PRO TIER ($69/mo) - Fix, Prove & Enforce
|
|
271
|
+
// ══════════════════════════════════════════════════════════════
|
|
272
|
+
|
|
273
|
+
ship: {
|
|
274
|
+
description: "Verdict engine - SHIP / WARN / BLOCK",
|
|
275
|
+
longDescription: "The final word on whether your code is ready to ship. Combines all scan results and generates a clear verdict.",
|
|
276
|
+
tier: "pro",
|
|
277
|
+
category: "proof",
|
|
278
|
+
aliases: ["verdict", "go"],
|
|
279
|
+
runner: () => require("./runners/runShip").runShip,
|
|
280
|
+
examples: [
|
|
281
|
+
{ command: "vibecheck ship", description: "Get shipping verdict" },
|
|
282
|
+
{ command: "vibecheck ship --strict", description: "Fail on warnings" },
|
|
283
|
+
{ command: "vibecheck ship --badge", description: "Generate status badge" },
|
|
284
|
+
],
|
|
285
|
+
related: ["scan", "prove", "fix"],
|
|
286
|
+
},
|
|
287
|
+
|
|
288
|
+
fix: {
|
|
289
|
+
description: "AI-powered auto-fix for findings",
|
|
290
|
+
longDescription: "Generate AI prompts to fix detected issues. Use --apply to let AI make changes directly.",
|
|
291
|
+
tier: "pro",
|
|
292
|
+
category: "proof",
|
|
293
|
+
aliases: ["f", "repair"],
|
|
294
|
+
runner: () => require("./runners/runFix").runFix,
|
|
295
|
+
examples: [
|
|
296
|
+
{ command: "vibecheck fix", description: "Generate fix missions" },
|
|
297
|
+
{ command: "vibecheck fix --apply", description: "Apply AI fixes" },
|
|
298
|
+
{ command: "vibecheck fix --loop", description: "Fix loop until clean" },
|
|
299
|
+
],
|
|
300
|
+
related: ["scan", "ship"],
|
|
301
|
+
},
|
|
302
|
+
|
|
303
|
+
prove: {
|
|
304
|
+
description: "Full proof loop with runtime verification",
|
|
305
|
+
longDescription: "Complete verification cycle with runtime testing and evidence generation.",
|
|
306
|
+
tier: "pro",
|
|
307
|
+
category: "proof",
|
|
308
|
+
aliases: ["p", "verify"],
|
|
309
|
+
runner: () => require("./runners/runProve").runProve,
|
|
310
|
+
examples: [
|
|
311
|
+
{ command: "vibecheck prove", description: "Run full proof loop" },
|
|
312
|
+
{ command: "vibecheck prove --url http://localhost:3000", description: "With runtime testing" },
|
|
313
|
+
{ command: "vibecheck prove --bundle", description: "Generate evidence pack" },
|
|
314
|
+
],
|
|
315
|
+
related: ["ship", "reality"],
|
|
316
|
+
},
|
|
317
|
+
|
|
318
|
+
reality: {
|
|
319
|
+
description: "Browser-based runtime verification",
|
|
320
|
+
longDescription: "Verify your app's runtime behavior with Playwright-powered browser testing.",
|
|
321
|
+
tier: "pro",
|
|
322
|
+
category: "proof",
|
|
323
|
+
aliases: ["browser", "e2e"],
|
|
324
|
+
runner: () => require("./runners/runReality").runReality,
|
|
325
|
+
examples: [
|
|
326
|
+
{ command: "vibecheck reality --url http://localhost:3000", description: "Test localhost" },
|
|
327
|
+
{ command: "vibecheck reality --auth email:pass", description: "With authentication" },
|
|
328
|
+
{ command: "vibecheck reality --agent", description: "AI agent testing" },
|
|
329
|
+
],
|
|
330
|
+
related: ["prove", "ship"],
|
|
331
|
+
},
|
|
332
|
+
|
|
333
|
+
gate: {
|
|
334
|
+
description: "CI/CD enforcement - fail builds on issues",
|
|
335
|
+
longDescription: "Enforce quality gates in your CI/CD pipeline.",
|
|
336
|
+
tier: "pro",
|
|
337
|
+
category: "automation",
|
|
338
|
+
aliases: ["ci", "enforce"],
|
|
339
|
+
runner: () => require("./runners/runGuard").runGate,
|
|
340
|
+
examples: [
|
|
341
|
+
{ command: "vibecheck gate", description: "Run CI gate check" },
|
|
342
|
+
{ command: "vibecheck gate --strict", description: "Strict mode" },
|
|
343
|
+
],
|
|
344
|
+
related: ["ship", "scan"],
|
|
178
345
|
},
|
|
179
346
|
|
|
180
347
|
guard: {
|
|
181
348
|
description: "AI guardrails - prompt firewall & hallucination checking",
|
|
182
|
-
|
|
349
|
+
longDescription: "Validate AI-generated code and prompts. Detects prompt injection and verifies claims.",
|
|
350
|
+
tier: "pro",
|
|
183
351
|
category: "truth",
|
|
184
352
|
aliases: ["ai-guard", "firewall", "validate"],
|
|
185
353
|
runner: () => require("./runners/runGuard").runGuard,
|
|
354
|
+
examples: [
|
|
355
|
+
{ command: "vibecheck guard", description: "Run all guardrail checks" },
|
|
356
|
+
{ command: "vibecheck guard --claims", description: "Verify AI claims" },
|
|
357
|
+
],
|
|
358
|
+
related: ["context", "fix"],
|
|
186
359
|
},
|
|
187
360
|
|
|
188
|
-
// ── AUTOMATION ─────────────────────────────────────────────
|
|
189
361
|
mcp: {
|
|
190
362
|
description: "Start MCP server for AI IDEs",
|
|
191
|
-
|
|
363
|
+
longDescription: "Launch an MCP server for AI IDE integration.",
|
|
364
|
+
tier: "pro",
|
|
192
365
|
category: "automation",
|
|
193
366
|
aliases: [],
|
|
194
367
|
runner: () => require("./runners/runMcp").runMcp,
|
|
368
|
+
examples: [
|
|
369
|
+
{ command: "vibecheck mcp", description: "Start MCP server" },
|
|
370
|
+
{ command: "vibecheck mcp --port 3099", description: "Custom port" },
|
|
371
|
+
],
|
|
372
|
+
related: ["context"],
|
|
195
373
|
},
|
|
196
374
|
|
|
197
|
-
|
|
198
|
-
description: "
|
|
375
|
+
checkpoint: {
|
|
376
|
+
description: "Compare baseline vs current, hallucination scoring",
|
|
377
|
+
longDescription: "Track changes between scan runs. Detects new issues, resolved issues, and regressions.",
|
|
199
378
|
tier: "pro",
|
|
200
|
-
category: "
|
|
201
|
-
aliases: ["
|
|
202
|
-
runner: () =>
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
// ── ACCOUNT (skipAuth) ────────────────────────────────────
|
|
209
|
-
login: {
|
|
210
|
-
description: "Authenticate with API key",
|
|
211
|
-
tier: "free",
|
|
212
|
-
category: "account",
|
|
213
|
-
aliases: ["auth", "signin"],
|
|
214
|
-
runner: () => require("./runners/runAuth").runLogin,
|
|
215
|
-
skipAuth: true,
|
|
216
|
-
},
|
|
217
|
-
|
|
218
|
-
logout: {
|
|
219
|
-
description: "Remove stored credentials",
|
|
220
|
-
tier: "free",
|
|
221
|
-
category: "account",
|
|
222
|
-
aliases: ["signout"],
|
|
223
|
-
runner: () => require("./runners/runAuth").runLogout,
|
|
224
|
-
skipAuth: true,
|
|
379
|
+
category: "analysis",
|
|
380
|
+
aliases: ["cp", "compare", "diff"],
|
|
381
|
+
runner: () => require("./runners/runCheckpoint").runCheckpoint,
|
|
382
|
+
examples: [
|
|
383
|
+
{ command: "vibecheck checkpoint", description: "Compare against baseline" },
|
|
384
|
+
{ command: "vibecheck checkpoint --set", description: "Save new baseline" },
|
|
385
|
+
],
|
|
386
|
+
related: ["scan", "fix"],
|
|
225
387
|
},
|
|
226
388
|
|
|
227
|
-
|
|
228
|
-
description: "
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
389
|
+
approve: {
|
|
390
|
+
description: "Authority verdicts - PROCEED/STOP/DEFER with proofs",
|
|
391
|
+
longDescription: "Execute authorities to get structured verdicts with proofs.",
|
|
392
|
+
tier: "pro",
|
|
393
|
+
category: "authority",
|
|
394
|
+
aliases: ["auth-verdict", "authority"],
|
|
395
|
+
runner: () => require("./runners/runApprove").runApprove,
|
|
396
|
+
examples: [
|
|
397
|
+
{ command: "vibecheck approve safe-consolidation", description: "Run authority" },
|
|
398
|
+
{ command: "vibecheck approve --list", description: "List authorities" },
|
|
399
|
+
],
|
|
400
|
+
related: ["classify", "ship"],
|
|
234
401
|
},
|
|
235
402
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
tier: "
|
|
240
|
-
category: "
|
|
241
|
-
aliases: ["
|
|
242
|
-
runner: () => require("./runners/
|
|
403
|
+
polish: {
|
|
404
|
+
description: "Production polish - final cleanup before deploy",
|
|
405
|
+
longDescription: "Final production readiness checks and cleanup.",
|
|
406
|
+
tier: "pro",
|
|
407
|
+
category: "proof",
|
|
408
|
+
aliases: ["prod", "final"],
|
|
409
|
+
runner: () => require("./runners/runPolish").runPolish,
|
|
410
|
+
examples: [
|
|
411
|
+
{ command: "vibecheck polish", description: "Run polish checks" },
|
|
412
|
+
],
|
|
413
|
+
related: ["ship", "prove"],
|
|
243
414
|
},
|
|
244
415
|
};
|
|
245
416
|
|
|
417
|
+
// Validate that only allowed commands are defined
|
|
246
418
|
assertAllowedOnly(COMMANDS);
|
|
247
419
|
|
|
248
420
|
// ─────────────────────────────────────────────────────────────
|
|
249
|
-
//
|
|
421
|
+
// TIER HELPERS
|
|
250
422
|
// ─────────────────────────────────────────────────────────────
|
|
423
|
+
function isPro(tier) {
|
|
424
|
+
return tier === "pro";
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
function requiresPro(commandName) {
|
|
428
|
+
const cmd = COMMANDS[commandName];
|
|
429
|
+
return cmd && cmd.tier === "pro";
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
function getFreeCommands() {
|
|
433
|
+
return Object.entries(COMMANDS)
|
|
434
|
+
.filter(([, cmd]) => cmd.tier === "free")
|
|
435
|
+
.map(([name]) => name);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
function getProCommands() {
|
|
439
|
+
return Object.entries(COMMANDS)
|
|
440
|
+
.filter(([, cmd]) => cmd.tier === "pro")
|
|
441
|
+
.map(([name]) => name);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// ─────────────────────────────────────────────────────────────
|
|
445
|
+
// BUILD DERIVED DATA STRUCTURES
|
|
446
|
+
// ─────────────────────────────────────────────────────────────
|
|
447
|
+
|
|
448
|
+
// Build alias map: { alias -> command }
|
|
251
449
|
const ALIAS_MAP = {};
|
|
252
|
-
for (const [
|
|
253
|
-
|
|
450
|
+
for (const [cmdName, cmd] of Object.entries(COMMANDS)) {
|
|
451
|
+
if (cmd.aliases) {
|
|
452
|
+
for (const alias of cmd.aliases) {
|
|
453
|
+
ALIAS_MAP[alias] = cmdName;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
254
456
|
}
|
|
255
457
|
|
|
256
|
-
|
|
458
|
+
// All command names including aliases
|
|
459
|
+
const ALL_COMMANDS = new Set([
|
|
257
460
|
...Object.keys(COMMANDS),
|
|
258
|
-
...Object.
|
|
259
|
-
];
|
|
461
|
+
...Object.keys(ALIAS_MAP),
|
|
462
|
+
]);
|
|
260
463
|
|
|
261
464
|
// ─────────────────────────────────────────────────────────────
|
|
262
|
-
//
|
|
465
|
+
// GETTERS
|
|
263
466
|
// ─────────────────────────────────────────────────────────────
|
|
264
|
-
function getRunner(cmd, styles = {}) {
|
|
265
|
-
const def = COMMANDS[cmd];
|
|
266
|
-
if (!def) return null;
|
|
267
|
-
|
|
268
|
-
const red = styles.red || "";
|
|
269
|
-
const reset = styles.reset || "";
|
|
270
|
-
const errorSym = styles.errorSymbol || "✗";
|
|
271
467
|
|
|
468
|
+
function getRunner(cmd, opts = {}) {
|
|
469
|
+
// Resolve alias to canonical command
|
|
470
|
+
const canonicalCmd = ALIAS_MAP[cmd] || cmd;
|
|
471
|
+
const def = COMMANDS[canonicalCmd];
|
|
472
|
+
|
|
473
|
+
if (!def) {
|
|
474
|
+
return null;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
if (!def.runner) {
|
|
478
|
+
return null;
|
|
479
|
+
}
|
|
480
|
+
|
|
272
481
|
try {
|
|
273
482
|
return def.runner();
|
|
274
483
|
} catch (e) {
|
|
275
|
-
|
|
276
|
-
console.error(`${red}${
|
|
277
|
-
|
|
278
|
-
|
|
484
|
+
if (opts.red && opts.reset) {
|
|
485
|
+
console.error(`${opts.red}${opts.errorSymbol || '×'} Failed to load runner for ${cmd}: ${e.message}${opts.reset}`);
|
|
486
|
+
}
|
|
487
|
+
return null;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
function getCommand(name) {
|
|
492
|
+
// Check direct name
|
|
493
|
+
if (COMMANDS[name]) return COMMANDS[name];
|
|
494
|
+
|
|
495
|
+
// Check alias map
|
|
496
|
+
const canonical = ALIAS_MAP[name];
|
|
497
|
+
if (canonical && COMMANDS[canonical]) {
|
|
498
|
+
return { ...COMMANDS[canonical], _resolvedFrom: name, _canonicalName: canonical };
|
|
279
499
|
}
|
|
500
|
+
|
|
501
|
+
return null;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
function resolveCommand(name) {
|
|
505
|
+
return ALIAS_MAP[name] || name;
|
|
280
506
|
}
|
|
281
507
|
|
|
508
|
+
// ─────────────────────────────────────────────────────────────
|
|
509
|
+
// EXPORTS
|
|
510
|
+
// ─────────────────────────────────────────────────────────────
|
|
282
511
|
module.exports = {
|
|
512
|
+
// Core data
|
|
283
513
|
COMMANDS,
|
|
514
|
+
ALLOWED_COMMANDS,
|
|
284
515
|
ALIAS_MAP,
|
|
285
516
|
ALL_COMMANDS,
|
|
517
|
+
|
|
518
|
+
// Tier helpers
|
|
519
|
+
isPro,
|
|
520
|
+
requiresPro,
|
|
521
|
+
getFreeCommands,
|
|
522
|
+
getProCommands,
|
|
523
|
+
|
|
524
|
+
// Getters
|
|
286
525
|
getRunner,
|
|
526
|
+
getCommand,
|
|
527
|
+
resolveCommand,
|
|
528
|
+
listCommands: () => Object.keys(COMMANDS),
|
|
529
|
+
|
|
530
|
+
getCommandsByTier: (tier) =>
|
|
531
|
+
Object.entries(COMMANDS)
|
|
532
|
+
.filter(([, cmd]) => cmd.tier === tier)
|
|
533
|
+
.map(([name, cmd]) => ({ name, ...cmd })),
|
|
534
|
+
|
|
535
|
+
getCommandsByCategory: (category) =>
|
|
536
|
+
Object.entries(COMMANDS)
|
|
537
|
+
.filter(([, cmd]) => cmd.category === category)
|
|
538
|
+
.map(([name, cmd]) => ({ name, ...cmd })),
|
|
287
539
|
};
|