@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
package/bin/.generated
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
================================================================================
|
|
2
|
+
⚠️ GENERATED CODE - DO NOT EDIT
|
|
3
|
+
================================================================================
|
|
4
|
+
|
|
5
|
+
This directory contains GENERATED build output.
|
|
6
|
+
|
|
7
|
+
All JavaScript files here are compiled from TypeScript sources.
|
|
8
|
+
Manual edits will be OVERWRITTEN on the next build.
|
|
9
|
+
|
|
10
|
+
SOURCE OF TRUTH:
|
|
11
|
+
packages/cli/src/ TypeScript CLI source
|
|
12
|
+
packages/cli/src/commands/ Command implementations
|
|
13
|
+
packages/cli/src/index.ts Main entry point
|
|
14
|
+
|
|
15
|
+
TO MAKE CHANGES:
|
|
16
|
+
1. Edit the TypeScript source in packages/cli/src/
|
|
17
|
+
2. Run: pnpm build
|
|
18
|
+
3. Changes will be reflected here automatically
|
|
19
|
+
|
|
20
|
+
BUILD COMMAND:
|
|
21
|
+
pnpm --filter @vibecheck/cli build
|
|
22
|
+
|
|
23
|
+
================================================================================
|
|
24
|
+
Generated: 2026-01-17
|
|
25
|
+
================================================================================
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Run Spec v2 Torture Suite
|
|
4
|
-
*
|
|
5
|
-
* Quick confidence builder for spec v2 implementation.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* node bin/dev/run-v2-torture.js
|
|
9
|
-
* pnpm test:v2
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
"use strict";
|
|
13
|
-
|
|
14
|
-
const path = require("path");
|
|
15
|
-
|
|
16
|
-
// Run the torture suite
|
|
17
|
-
const { TortureTestRunner } = require("../../tests/e2e/spec-v2.torture.test.js");
|
|
18
|
-
|
|
19
|
-
async function main() {
|
|
20
|
-
const runner = new TortureTestRunner();
|
|
21
|
-
const results = await runner.run();
|
|
22
|
-
|
|
23
|
-
// Exit with appropriate code
|
|
24
|
-
process.exit(results.failed > 0 ? 1 : 0);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
main().catch(err => {
|
|
28
|
-
console.error("❌ Torture suite crashed:", err);
|
|
29
|
-
process.exit(1);
|
|
30
|
-
});
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Run Spec v2 Torture Suite
|
|
4
|
+
*
|
|
5
|
+
* Quick confidence builder for spec v2 implementation.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* node bin/dev/run-v2-torture.js
|
|
9
|
+
* pnpm test:v2
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
"use strict";
|
|
13
|
+
|
|
14
|
+
const path = require("path");
|
|
15
|
+
|
|
16
|
+
// Run the torture suite
|
|
17
|
+
const { TortureTestRunner } = require("../../tests/e2e/spec-v2.torture.test.js");
|
|
18
|
+
|
|
19
|
+
async function main() {
|
|
20
|
+
const runner = new TortureTestRunner();
|
|
21
|
+
const results = await runner.run();
|
|
22
|
+
|
|
23
|
+
// Exit with appropriate code
|
|
24
|
+
process.exit(results.failed > 0 ? 1 : 0);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
main().catch(err => {
|
|
28
|
+
console.error("❌ Torture suite crashed:", err);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
});
|
package/bin/registry.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vibecheck CLI Command Registry
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for all CLI commands.
|
|
5
|
+
* Tiers match entitlements-v2.js EXACTLY.
|
|
6
|
+
*
|
|
7
|
+
* @module bin/registry
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
"use strict";
|
|
11
|
+
|
|
12
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
13
|
+
// COMMAND REGISTRY - Tiers match entitlements-v2.js EXACTLY
|
|
14
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
15
|
+
const COMMANDS = {
|
|
16
|
+
// PROOF LOOP
|
|
17
|
+
scan: { description: "Static analysis - routes, secrets, contracts", tier: "free", category: "proof", aliases: ["s", "check"], runner: () => require("./runners/runScan").runScan },
|
|
18
|
+
ship: { description: "Verdict engine - SHIP / WARN / BLOCK", tier: "free", category: "proof", aliases: ["verdict"], caps: "static-only on FREE", runner: () => require("./runners/runShip").runShip },
|
|
19
|
+
reality: { description: "Runtime proof - Playwright clicks every button", tier: "free", category: "proof", aliases: ["r", "test", "e2e"], caps: "preview mode on FREE (5 pages, no auth)", runner: () => { try { return require("./runners/runReality").runReality; } catch (e) { return async () => { console.error("Reality runner unavailable:", e.message); return 1; }; } } },
|
|
20
|
+
prove: { description: "Full proof loop - ctx → reality → ship → fix", tier: "pro", category: "proof", aliases: ["p", "full", "all"], runner: () => require("./runners/runProve").runProve },
|
|
21
|
+
fix: { description: "AI-powered auto-fix", tier: "free", category: "proof", caps: "--plan-only on FREE/PRO", aliases: ["f", "repair"], runner: () => require("./runners/runFix").runFix },
|
|
22
|
+
report: { description: "Generate HTML/MD/SARIF reports", tier: "free", category: "proof", caps: "HTML/MD only on FREE", aliases: ["html", "artifact"], runner: () => require("./runners/runReport").runReport },
|
|
23
|
+
replay: { description: "Record and replay user sessions", tier: "pro", category: "proof", aliases: ["record", "playback"], runner: () => async (args) => { try { const { runReplay } = require("./runners/runReplay"); return await runReplay(args); } catch (e) { if (args && (args.includes("--help") || args.includes("-h") || args.length === 0)) { console.log("\n vibecheck replay - Record and replay user sessions\n\n Subcommands:\n record <url> Record a user session\n play <capsule> Replay a recorded session\n list List available replay capsules\n show <id> Show details of a replay capsule\n delete <id> Delete a replay capsule\n export <id> Export a replay capsule\n import <file> Import a replay capsule\n\n Note: Requires 'chalk' and 'playwright' dependencies.\n Install: npm install chalk playwright\n"); return 0; } console.error("Replay runner error:", e.message); return 1; } } },
|
|
24
|
+
permissions: { description: "AuthZ matrix & IDOR detection", tier: "complete", category: "proof", aliases: ["authz", "idor"], runner: () => require("./runners/runPermissions").runPermissions },
|
|
25
|
+
graph: { description: "Reality proof graph visualization", tier: "complete", category: "proof", aliases: ["graphviz", "causal"], runner: () => require("./runners/runGraph").runGraph },
|
|
26
|
+
|
|
27
|
+
// SETUP & DX
|
|
28
|
+
install: { description: "Zero-friction onboarding", tier: "free", category: "setup", aliases: ["i", "bootstrap"], runner: () => require("./runners/runInstall").runInstall },
|
|
29
|
+
init: { description: "Project setup wizard", tier: "free", category: "setup", aliases: ["setup", "configure"], runner: () => require("./runners/runInit").runInit },
|
|
30
|
+
doctor: { description: "Environment diagnostics", tier: "free", category: "setup", aliases: ["health", "diag"], runner: () => require("./runners/runDoctor").runDoctor },
|
|
31
|
+
status: { description: "Project health dashboard", tier: "free", category: "setup", aliases: ["st"], runner: () => require("./runners/runStatus").runStatus },
|
|
32
|
+
watch: { description: "Continuous mode - re-runs on changes", tier: "free", category: "setup", aliases: ["w", "dev"], runner: () => require("./runners/runWatch").runWatch },
|
|
33
|
+
launch: { description: "Pre-launch checklist wizard", tier: "starter", category: "setup", aliases: ["checklist", "preflight"], runner: () => require("./runners/runLaunch").runLaunch },
|
|
34
|
+
preflight: { description: "Deployment validation checks", tier: "free", category: "setup", aliases: ["validate", "check"], runner: () => require("./runners/runPreflight").runPreflight },
|
|
35
|
+
|
|
36
|
+
// AI TRUTH
|
|
37
|
+
ctx: { description: "Generate truthpack for AI agents", tier: "free", category: "truth", aliases: ["truthpack", "tp"], subcommands: ["build", "diff", "guard", "sync", "search"], runner: () => require("./runners/runCtx").runCtx },
|
|
38
|
+
guard: { description: "Validate AI claims against truth", tier: "free", category: "truth", aliases: ["validate", "trust"], runner: () => require("./runners/runGuard").runGuard },
|
|
39
|
+
verify: { description: "Verify AI-generated code output", tier: "free", category: "truth", aliases: ["v", "check-output"], runner: () => require("./runners/runVerify").main },
|
|
40
|
+
context: { description: "Generate .cursorrules, .windsurf/rules", tier: "free", category: "truth", aliases: ["rules", "ai-rules"], runner: () => require("./runners/runContext").runContext },
|
|
41
|
+
mdc: { description: "Generate MDC specifications", tier: "free", category: "truth", aliases: [], runner: () => require("./runners/runMdc").runMdc },
|
|
42
|
+
|
|
43
|
+
// CI & COLLABORATION (STARTER+)
|
|
44
|
+
gate: { description: "CI/CD gate - blocks deploys on failures", tier: "starter", category: "ci", aliases: ["ci", "block"], runner: () => require("./runners/runGate").runGate },
|
|
45
|
+
pr: { description: "Generate PR comment with findings", tier: "starter", category: "ci", aliases: ["pull-request"], runner: () => require("./runners/runPR").runPR },
|
|
46
|
+
badge: { description: "Generate ship badge for README", tier: "starter", category: "ci", aliases: ["b"], runner: () => require("./runners/runBadge").runBadge },
|
|
47
|
+
|
|
48
|
+
// AUTOMATION (STARTER+/PRO)
|
|
49
|
+
mcp: { description: "Start MCP server for AI IDEs", tier: "starter", category: "automation", aliases: [], runner: () => require("./runners/runMcp").runMcp },
|
|
50
|
+
share: { description: "Generate share pack for PR/docs", tier: "pro", category: "automation", aliases: [], runner: () => require("./runners/runShare").runShare },
|
|
51
|
+
"ai-test": { description: "AI autonomous test generation", tier: "pro", category: "automation", aliases: ["ai", "agent"], runner: () => require("./runners/runAIAgent").runAIAgent },
|
|
52
|
+
|
|
53
|
+
// ACCOUNT (always free)
|
|
54
|
+
login: { description: "Authenticate with API key", tier: "free", category: "account", aliases: ["auth", "signin"], runner: () => require("./runners/runAuth").runLogin, skipAuth: true },
|
|
55
|
+
logout: { description: "Remove stored credentials", tier: "free", category: "account", aliases: ["signout"], runner: () => require("./runners/runAuth").runLogout, skipAuth: true },
|
|
56
|
+
whoami: { description: "Show current user and plan", tier: "free", category: "account", aliases: ["me", "user"], runner: () => require("./runners/runAuth").runWhoami, skipAuth: true },
|
|
57
|
+
|
|
58
|
+
// EXTRAS
|
|
59
|
+
labs: { description: "Experimental features", tier: "free", category: "extras", aliases: ["experimental", "beta"], runner: () => require("./runners/runLabs").runLabs },
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
63
|
+
// DERIVED DATA STRUCTURES
|
|
64
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
65
|
+
const ALIAS_MAP = {};
|
|
66
|
+
for (const [cmd, def] of Object.entries(COMMANDS)) {
|
|
67
|
+
for (const alias of def.aliases || []) ALIAS_MAP[alias] = cmd;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const ALL_COMMANDS = [...Object.keys(COMMANDS), ...Object.values(COMMANDS).flatMap(c => c.aliases || [])];
|
|
71
|
+
|
|
72
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
73
|
+
// RUNNER LOADER
|
|
74
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
75
|
+
/**
|
|
76
|
+
* Get runner function for a command
|
|
77
|
+
* @param {string} cmd - Command name
|
|
78
|
+
* @param {object} styles - Optional styling object with { red, reset, errorSymbol }
|
|
79
|
+
* @returns {Function|null} Runner function or null if not found
|
|
80
|
+
*/
|
|
81
|
+
function getRunner(cmd, styles = {}) {
|
|
82
|
+
const def = COMMANDS[cmd];
|
|
83
|
+
if (!def) return null;
|
|
84
|
+
const red = styles.red || "";
|
|
85
|
+
const reset = styles.reset || "";
|
|
86
|
+
const errorSym = styles.errorSymbol || "✗";
|
|
87
|
+
try {
|
|
88
|
+
return def.runner();
|
|
89
|
+
} catch (e) {
|
|
90
|
+
return async () => {
|
|
91
|
+
console.error(`${red}${errorSym}${reset} Failed to load ${cmd}: ${e.message}`);
|
|
92
|
+
return 1;
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
98
|
+
// EXPORTS
|
|
99
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
100
|
+
module.exports = {
|
|
101
|
+
COMMANDS,
|
|
102
|
+
ALIAS_MAP,
|
|
103
|
+
ALL_COMMANDS,
|
|
104
|
+
getRunner,
|
|
105
|
+
};
|