@viberaven/cli 1.4.1 → 1.4.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/dist/cli.js +199 -24
- package/dist/cli.js.map +2 -2
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -11558,7 +11558,7 @@ var VERSION;
|
|
|
11558
11558
|
var init_version = __esm({
|
|
11559
11559
|
"src/version.ts"() {
|
|
11560
11560
|
"use strict";
|
|
11561
|
-
VERSION = "1.4.
|
|
11561
|
+
VERSION = "1.4.3";
|
|
11562
11562
|
}
|
|
11563
11563
|
});
|
|
11564
11564
|
|
|
@@ -15468,6 +15468,7 @@ function providerStatusText(state) {
|
|
|
15468
15468
|
case "connect_live":
|
|
15469
15469
|
return "Connect live";
|
|
15470
15470
|
case "not_detected":
|
|
15471
|
+
return "Not detected";
|
|
15471
15472
|
default:
|
|
15472
15473
|
return "Missing";
|
|
15473
15474
|
}
|
|
@@ -15488,6 +15489,16 @@ function verifyActionForGap(gap) {
|
|
|
15488
15489
|
};
|
|
15489
15490
|
}
|
|
15490
15491
|
function proofForProvider(providerId, gap) {
|
|
15492
|
+
if (providerId === "posthog") {
|
|
15493
|
+
return {
|
|
15494
|
+
level: "dashboard_needed",
|
|
15495
|
+
summary: "PostHog dashboard ingestion can only be confirmed in the PostHog dashboard, not from repo code.",
|
|
15496
|
+
checks: [
|
|
15497
|
+
{ label: "Code found", status: "yes", source: "repo" },
|
|
15498
|
+
{ label: "Dashboard ingestion proof", status: "unknown", source: "dashboard" }
|
|
15499
|
+
]
|
|
15500
|
+
};
|
|
15501
|
+
}
|
|
15491
15502
|
if (!gap) {
|
|
15492
15503
|
return {
|
|
15493
15504
|
level: "code_only",
|
|
@@ -15518,6 +15529,8 @@ function whereToClick(providerId) {
|
|
|
15518
15529
|
return "Table editor -> select table -> Policies -> Enable RLS";
|
|
15519
15530
|
case "vercel":
|
|
15520
15531
|
return "Project settings -> Environment variables -> Production";
|
|
15532
|
+
case "posthog":
|
|
15533
|
+
return "Data management -> Events";
|
|
15521
15534
|
default:
|
|
15522
15535
|
return "Open provider dashboard -> complete the selected production action";
|
|
15523
15536
|
}
|
|
@@ -15541,6 +15554,12 @@ function youLane(providerId, providerName, gap) {
|
|
|
15541
15554
|
body: "Open Vercel and confirm the production environment, deployment, or domain setting that blocks launch."
|
|
15542
15555
|
};
|
|
15543
15556
|
}
|
|
15557
|
+
if (providerId === "posthog") {
|
|
15558
|
+
return {
|
|
15559
|
+
title: "Confirm PostHog dashboard ingestion",
|
|
15560
|
+
body: "Open PostHog and confirm live events are arriving from production. Repo code alone cannot prove ingestion."
|
|
15561
|
+
};
|
|
15562
|
+
}
|
|
15544
15563
|
return {
|
|
15545
15564
|
title: `Confirm ${providerName} provider proof`,
|
|
15546
15565
|
body: gap?.detail ?? `Open ${providerName} and complete the selected production action.`
|
|
@@ -15767,9 +15786,19 @@ function emptyLocalUiState(cwd) {
|
|
|
15767
15786
|
empty: true
|
|
15768
15787
|
};
|
|
15769
15788
|
}
|
|
15770
|
-
function mapArtifactToLocalUiState(artifact) {
|
|
15789
|
+
function mapArtifactToLocalUiState(artifact, presentProviderIds) {
|
|
15771
15790
|
const projectName = projectNameFromPath(artifact.workspacePath);
|
|
15772
|
-
const providers = listLocalUiProviderCatalog().map((template) => mapProvider(template, artifact, projectName)).map((provider2) =>
|
|
15791
|
+
const providers = listLocalUiProviderCatalog().map((template) => mapProvider(template, artifact, projectName)).map((provider2) => {
|
|
15792
|
+
if (presentProviderIds && !presentProviderIds.has(provider2.id)) {
|
|
15793
|
+
const missing = {
|
|
15794
|
+
...provider2,
|
|
15795
|
+
state: "not_detected",
|
|
15796
|
+
statusText: providerStatusText("not_detected")
|
|
15797
|
+
};
|
|
15798
|
+
return { ...missing, grade: providerGrade(missing) };
|
|
15799
|
+
}
|
|
15800
|
+
return { ...provider2, grade: providerGrade(provider2) };
|
|
15801
|
+
});
|
|
15773
15802
|
const globalProviderId = providerIdForGap(primaryGap(artifact));
|
|
15774
15803
|
const selectedProvider = providers.find((provider2) => provider2.id === globalProviderId) ?? providers.find((provider2) => provider2.state === "needs_repo_fix") ?? providers.find((provider2) => provider2.state === "repo_evidence_found") ?? providers[0];
|
|
15775
15804
|
const missionCards = buildMissionCards(artifact, providers);
|
|
@@ -16223,7 +16252,7 @@ function providerHealth(raw, normalized) {
|
|
|
16223
16252
|
const allReady = total > 0 && ready === total;
|
|
16224
16253
|
const summary = providerScopedDetail(raw || normalized || {});
|
|
16225
16254
|
if (state === 'not_detected') {
|
|
16226
|
-
return { label: '
|
|
16255
|
+
return { label: 'Not detected', tone: 'orange', summary, meta: 'Not in this project' };
|
|
16227
16256
|
}
|
|
16228
16257
|
if (state === 'live_verified') {
|
|
16229
16258
|
return { label: 'Ready', tone: 'green', summary, meta: checks + ' checks' };
|
|
@@ -16242,7 +16271,7 @@ function providerHealth(raw, normalized) {
|
|
|
16242
16271
|
|
|
16243
16272
|
function providerHealthIcon(health) {
|
|
16244
16273
|
if (health.tone === 'green' && (health.label === 'Ready' || health.label === 'Detected')) return Icon('heart');
|
|
16245
|
-
if (health.label === '
|
|
16274
|
+
if (health.label === 'Not detected') return Icon('flag');
|
|
16246
16275
|
return Icon('refresh');
|
|
16247
16276
|
}
|
|
16248
16277
|
|
|
@@ -16326,6 +16355,19 @@ function TradingCard(provider, variant, options) {
|
|
|
16326
16355
|
const placedClass = opts.placed ? ' is-placed' : '';
|
|
16327
16356
|
const tagOpen = opts.asDiv ? 'div' : 'button type="button"';
|
|
16328
16357
|
const tagClose = opts.asDiv ? 'div' : 'button';
|
|
16358
|
+
if (provider.state === 'not_detected') {
|
|
16359
|
+
// Locked card: the provider isn't in this project. Keep the logo (dimmed)
|
|
16360
|
+
// behind a lock seal so you can see which provider it is and that it's
|
|
16361
|
+
// there to unlock by adding it \u2014 never a fake grade or a blank back.
|
|
16362
|
+
return '<' + tagOpen + ' class="vr-tcard is-locked ' + size + placedClass + '" data-foil="' + foil + '"' +
|
|
16363
|
+
(opts.asDiv ? '' : ' data-action="deal-provider" data-provider="' + foil + '" aria-label="' + escapeHtml(provider.name) + ' is not in this project \u2014 add it to unlock this card" title="' + escapeHtml(provider.name) + ' \xB7 not in this project \u2014 add to unlock"') +
|
|
16364
|
+
(opts.style ? ' style="' + opts.style + '"' : '') + '>' +
|
|
16365
|
+
(opts.placed ? '<span class="vr-tcard-unplace" data-action="unplace-card" data-unplace="' + foil + '" title="Remove from the table" role="button" aria-label="Remove from the table">✕</span>' : '') +
|
|
16366
|
+
'<span class="vr-tcard-lockart">' + ProviderToken(provider, 'is-locked') + '<span class="vr-tcard-lockbadge">' + Icon('lock') + '</span></span>' +
|
|
16367
|
+
'<span class="vr-tcard-backname">' + escapeHtml(provider.name) + '</span>' +
|
|
16368
|
+
'<span class="vr-tcard-lockhint">Not in this project</span>' +
|
|
16369
|
+
'</' + tagClose + '>';
|
|
16370
|
+
}
|
|
16329
16371
|
if (grade.tier === 'facedown' && !opts.forceFace) {
|
|
16330
16372
|
return '<' + tagOpen + ' class="vr-tcard is-back ' + size + placedClass + '"' +
|
|
16331
16373
|
(opts.asDiv ? '' : ' data-action="deal-provider" data-provider="' + foil + '" aria-label="Flip ' + escapeHtml(provider.name) + ' \u2014 run its first checks" title="' + escapeHtml(provider.name) + ' \xB7 face down \u2014 click to flip"') +
|
|
@@ -18292,15 +18334,25 @@ function QuickstartModal() {
|
|
|
18292
18334
|
|
|
18293
18335
|
function DiscoveryModal() {
|
|
18294
18336
|
const found = providers.filter((provider) => provider.state !== 'not_detected');
|
|
18295
|
-
const
|
|
18296
|
-
const
|
|
18337
|
+
const hashRank = (id) => { let h = 0; for (let i = 0; i < id.length; i += 1) h = (h * 31 + id.charCodeAt(i)) >>> 0; return h; };
|
|
18338
|
+
const rankFor = (provider) => {
|
|
18297
18339
|
const tier = provider.grade ? provider.grade.tier : 'review';
|
|
18298
|
-
|
|
18340
|
+
if (tier === 'flawless') return ['legendary', 'LEGENDARY'];
|
|
18341
|
+
if (tier === 'clear') return ['epic', 'EPIC'];
|
|
18342
|
+
// ungraded providers still deal a real pack spread (common..legendary)
|
|
18343
|
+
const r = hashRank(provider.id) % 12;
|
|
18344
|
+
if (r === 0) return ['legendary', 'LEGENDARY'];
|
|
18345
|
+
if (r < 4) return ['epic', 'EPIC'];
|
|
18346
|
+
if (r < 10) return ['rare', 'RARE'];
|
|
18347
|
+
return ['common', 'COMMON'];
|
|
18348
|
+
};
|
|
18349
|
+
const cards = found.map((provider, index) => {
|
|
18350
|
+
const rank = rankFor(provider);
|
|
18299
18351
|
return '<div class="vr-discover-card' + (demo.flippedCards['disc:' + provider.id] ? ' is-flipped' : '') + '" data-flip-card data-flip-id="disc:' + escapeHtml(provider.id) + '" data-rank="' + rank[0] + '" style="--vr-i:' + String(index) + '">' +
|
|
18300
18352
|
'<span class="vr-flip-inner">' +
|
|
18301
18353
|
'<span class="vr-flip-back vr-tcard is-back is-dealt" data-action="flip-discover" role="button" tabindex="0" aria-label="Flip to reveal ' + escapeHtml(provider.name) + '">' +
|
|
18302
|
-
'<span class="vr-tcard-backart"><
|
|
18303
|
-
'<span class="vr-tcard-backname">
|
|
18354
|
+
'<span class="vr-tcard-backart"><span class="vr-pack-seal" aria-hidden="true">✦</span></span>' +
|
|
18355
|
+
'<span class="vr-tcard-backname">Flip to reveal</span>' +
|
|
18304
18356
|
'</span>' +
|
|
18305
18357
|
'<span class="vr-flip-face">' +
|
|
18306
18358
|
TradingCard(provider, 'dealt', { asDiv: true, forceFace: true }) +
|
|
@@ -35112,7 +35164,9 @@ button.vr-chat-gate-chip.vr-stamp i { display: none; }
|
|
|
35112
35164
|
.vr-start-here-cta:hover { background: #e6e9ef; }
|
|
35113
35165
|
.vr-start-here-cta:active { transform: translateY(2px); box-shadow: 0 1px 0 rgba(0, 0, 0, 0.55); }
|
|
35114
35166
|
.vr-start-here-cta svg { stroke: #0a0b0e; color: #0a0b0e; }
|
|
35115
|
-
.vr-start-here-cta
|
|
35167
|
+
.vr-start-here-cta,
|
|
35168
|
+
.vr-start-here-cta span { font-family: Geist, Inter, "Segoe UI", system-ui, sans-serif !important; }
|
|
35169
|
+
.vr-start-here-cta span { color: #0a0b0e; letter-spacing: 0.02em; text-transform: none; font-weight: 700; }
|
|
35116
35170
|
|
|
35117
35171
|
/* ==========================================================================
|
|
35118
35172
|
HUD layer: manga ink pass \u2014 the perceptual redesign.
|
|
@@ -37718,6 +37772,29 @@ button.vr-tcard { appearance: none; }
|
|
|
37718
37772
|
.vr-discover-card.is-flipped[data-rank='legendary'] .vr-flip-face .vr-tcard { animation: vr-reveal-legendary 1100ms ease-out 240ms both; }
|
|
37719
37773
|
.vr-discover-card.is-flipped[data-rank='epic'] .vr-flip-face .vr-tcard { animation: vr-reveal-epic 1100ms ease-out 240ms both; }
|
|
37720
37774
|
.vr-discover-card.is-flipped[data-rank='rare'] .vr-flip-face .vr-tcard { animation: vr-reveal-rare 1100ms ease-out 240ms both; }
|
|
37775
|
+
/* --- pack-opening polish --- */
|
|
37776
|
+
/* contain the collector raven so it never overlaps the first card + separate the header */
|
|
37777
|
+
.vr-modal-discover .vr-qs-head {
|
|
37778
|
+
align-items: center;
|
|
37779
|
+
gap: 16px;
|
|
37780
|
+
margin: 0 0 16px;
|
|
37781
|
+
padding-bottom: 14px;
|
|
37782
|
+
border-bottom: 1px solid rgba(255, 215, 110, 0.14);
|
|
37783
|
+
}
|
|
37784
|
+
.vr-modal-discover .vr-qs-raven { width: 72px; height: 72px; }
|
|
37785
|
+
/* COMMON tier (silver) so the pack reads like a real spread, not all-RARE */
|
|
37786
|
+
.vr-discover-card[data-rank='common'] .vr-discover-rank { color: #cbd5e1; text-shadow: 0 0 6px rgba(148, 163, 184, 0.55); }
|
|
37787
|
+
@keyframes vr-reveal-common {
|
|
37788
|
+
0% { box-shadow: 0 0 0 rgba(148, 163, 184, 0); }
|
|
37789
|
+
35% { box-shadow: 0 0 24px rgba(203, 213, 225, 0.55), 0 0 48px rgba(148, 163, 184, 0.28); }
|
|
37790
|
+
100% { box-shadow: 0 0 8px rgba(148, 163, 184, 0.22); }
|
|
37791
|
+
}
|
|
37792
|
+
.vr-discover-card.is-flipped[data-rank='common'] .vr-flip-face .vr-tcard { animation: vr-reveal-common 1000ms ease-out 240ms both; }
|
|
37793
|
+
/* Hearthstone-style: a rare pull jumps forward as it flips (not on stable re-renders) */
|
|
37794
|
+
.vr-modal-card:not(.is-stable-render) .vr-discover-card.is-flipped[data-rank='legendary'] { animation: vr-pop-hi 720ms cubic-bezier(0.2, 1.5, 0.3, 1) 180ms both; z-index: 5; }
|
|
37795
|
+
.vr-modal-card:not(.is-stable-render) .vr-discover-card.is-flipped[data-rank='epic'] { animation: vr-pop-mid 660ms cubic-bezier(0.2, 1.45, 0.3, 1) 180ms both; z-index: 4; }
|
|
37796
|
+
@keyframes vr-pop-hi { 0%, 100% { transform: scale(1); } 45% { transform: scale(1.16); } }
|
|
37797
|
+
@keyframes vr-pop-mid { 0%, 100% { transform: scale(1); } 45% { transform: scale(1.1); } }
|
|
37721
37798
|
.vr-discover-take {
|
|
37722
37799
|
border-color: var(--vr-gold-bright) !important;
|
|
37723
37800
|
background: var(--vr-gold-bright) !important;
|
|
@@ -37875,6 +37952,99 @@ button.vr-tcard { appearance: none; }
|
|
|
37875
37952
|
drop-shadow(0 5px 12px rgba(0, 0, 0, 0.65))
|
|
37876
37953
|
drop-shadow(0 0 22px rgba(232, 193, 90, 0.65));
|
|
37877
37954
|
}
|
|
37955
|
+
/* Locked card: a provider that is not in this project. Dimmed logo + gold
|
|
37956
|
+
lock seal, dashed inner frame (vs the solid frame of a graded card). */
|
|
37957
|
+
.vr-tcard.is-locked {
|
|
37958
|
+
position: relative;
|
|
37959
|
+
border: 2.5px solid rgba(184, 135, 63, 0.5);
|
|
37960
|
+
padding: 0;
|
|
37961
|
+
gap: 0;
|
|
37962
|
+
display: flex;
|
|
37963
|
+
flex-direction: column;
|
|
37964
|
+
align-items: center;
|
|
37965
|
+
justify-content: flex-end;
|
|
37966
|
+
background:
|
|
37967
|
+
radial-gradient(circle at 50% 40%, rgba(232, 193, 90, 0.08), transparent 55%),
|
|
37968
|
+
conic-gradient(from 210deg at 50% 46%, #141418, #1b1b21 22%, #141419 48%, #191922 74%, #141418),
|
|
37969
|
+
#0b0b0f;
|
|
37970
|
+
}
|
|
37971
|
+
.vr-tcard.is-locked::after {
|
|
37972
|
+
content: '';
|
|
37973
|
+
position: absolute;
|
|
37974
|
+
inset: 5px;
|
|
37975
|
+
border: 1.5px dashed rgba(232, 193, 90, 0.26);
|
|
37976
|
+
border-radius: 7px;
|
|
37977
|
+
pointer-events: none;
|
|
37978
|
+
}
|
|
37979
|
+
.vr-tcard.is-locked .vr-tcard-lockart {
|
|
37980
|
+
position: relative;
|
|
37981
|
+
flex: 1;
|
|
37982
|
+
width: 100%;
|
|
37983
|
+
display: grid;
|
|
37984
|
+
place-items: center;
|
|
37985
|
+
}
|
|
37986
|
+
.vr-tcard.is-locked .vr-provider-token {
|
|
37987
|
+
width: 48%;
|
|
37988
|
+
opacity: 0.35;
|
|
37989
|
+
filter: grayscale(1) brightness(1.3);
|
|
37990
|
+
}
|
|
37991
|
+
.vr-tcard.is-locked .vr-provider-token svg,
|
|
37992
|
+
.vr-tcard.is-locked .vr-provider-token img {
|
|
37993
|
+
width: 100%;
|
|
37994
|
+
height: auto;
|
|
37995
|
+
}
|
|
37996
|
+
.vr-tcard.is-locked .vr-tcard-lockbadge {
|
|
37997
|
+
position: absolute;
|
|
37998
|
+
top: 50%;
|
|
37999
|
+
left: 50%;
|
|
38000
|
+
transform: translate(-50%, -50%);
|
|
38001
|
+
width: 30%;
|
|
38002
|
+
aspect-ratio: 1 / 1;
|
|
38003
|
+
display: grid;
|
|
38004
|
+
place-items: center;
|
|
38005
|
+
border-radius: 50%;
|
|
38006
|
+
color: #e8c15a;
|
|
38007
|
+
background: radial-gradient(circle at 42% 34%, #2b2b34, #121216);
|
|
38008
|
+
border: 1.5px solid rgba(232, 193, 90, 0.6);
|
|
38009
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.6), inset 0 0 8px rgba(232, 193, 90, 0.15);
|
|
38010
|
+
}
|
|
38011
|
+
.vr-tcard.is-locked .vr-tcard-lockbadge svg {
|
|
38012
|
+
width: 52%;
|
|
38013
|
+
height: 52%;
|
|
38014
|
+
}
|
|
38015
|
+
.vr-tcard.is-locked .vr-tcard-lockhint {
|
|
38016
|
+
font-size: 7.5px;
|
|
38017
|
+
letter-spacing: 0.2px;
|
|
38018
|
+
text-transform: uppercase;
|
|
38019
|
+
font-weight: 800;
|
|
38020
|
+
color: #2a1c02;
|
|
38021
|
+
text-shadow: 0 1px 0 rgba(255, 245, 205, 0.45);
|
|
38022
|
+
margin-bottom: 6px;
|
|
38023
|
+
}
|
|
38024
|
+
.vr-tcard.is-locked .vr-tcard-backname {
|
|
38025
|
+
margin-bottom: 3px;
|
|
38026
|
+
font-size: 10px;
|
|
38027
|
+
letter-spacing: 0.3px;
|
|
38028
|
+
font-weight: 800;
|
|
38029
|
+
color: #1a1201;
|
|
38030
|
+
text-shadow: 0 1px 0 rgba(255, 245, 205, 0.45);
|
|
38031
|
+
}
|
|
38032
|
+
.vr-tcard.is-locked:hover {
|
|
38033
|
+
border-color: rgba(232, 193, 90, 0.7);
|
|
38034
|
+
}
|
|
38035
|
+
.vr-tcard.is-locked:hover .vr-provider-token {
|
|
38036
|
+
opacity: 0.5;
|
|
38037
|
+
}
|
|
38038
|
+
.vr-tcard.is-locked:hover .vr-tcard-lockbadge {
|
|
38039
|
+
box-shadow: 0 4px 14px rgba(0, 0, 0, 0.6), 0 0 14px rgba(232, 193, 90, 0.4), inset 0 0 8px rgba(232, 193, 90, 0.2);
|
|
38040
|
+
}
|
|
38041
|
+
/* Pack card back: a sealed mystery \u2014 no provider identity until you flip. */
|
|
38042
|
+
.vr-discover-card .vr-flip-back .vr-pack-seal {
|
|
38043
|
+
font-size: 34px;
|
|
38044
|
+
line-height: 1;
|
|
38045
|
+
color: rgba(232, 193, 90, 0.5);
|
|
38046
|
+
text-shadow: 0 0 18px rgba(232, 193, 90, 0.4);
|
|
38047
|
+
}
|
|
37878
38048
|
/* inside a flip card the back must stay an absolute overlay \u2014 the
|
|
37879
38049
|
position: relative above would otherwise stack it under the face */
|
|
37880
38050
|
[data-flip-card] .vr-flip-back,
|
|
@@ -40208,25 +40378,25 @@ function hasFile(files, needles) {
|
|
|
40208
40378
|
function providerDetected(providerId, deps, files) {
|
|
40209
40379
|
switch (providerId) {
|
|
40210
40380
|
case "supabase":
|
|
40211
|
-
return hasDependency(deps, ["@supabase/supabase-js", "supabase"]) || hasFile(files, ["supabase/", "supabase
|
|
40381
|
+
return hasDependency(deps, ["@supabase/supabase-js", "@supabase/ssr", "supabase"]) || hasFile(files, ["supabase/", "supabase.ts"]);
|
|
40212
40382
|
case "vercel":
|
|
40213
|
-
return hasFile(files, ["vercel.json", ".vercel/project.json"])
|
|
40383
|
+
return hasDependency(deps, ["@vercel/"]) || hasFile(files, ["vercel.json", ".vercel/project.json"]);
|
|
40214
40384
|
case "stripe":
|
|
40215
|
-
return hasDependency(deps, ["stripe", "@stripe/stripe-js"]) || hasFile(files, ["stripe"
|
|
40385
|
+
return hasDependency(deps, ["stripe", "@stripe/stripe-js"]) || hasFile(files, ["stripe."]);
|
|
40216
40386
|
case "github":
|
|
40217
|
-
return hasFile(files, [".github/workflows", ".github/dependabot.yml"])
|
|
40387
|
+
return hasFile(files, [".github/workflows", ".github/dependabot.yml"]);
|
|
40218
40388
|
case "sentry":
|
|
40219
|
-
return hasDependency(deps, ["@sentry/"]) || hasFile(files, ["sentry."
|
|
40389
|
+
return hasDependency(deps, ["@sentry/"]) || hasFile(files, ["sentry."]);
|
|
40220
40390
|
case "posthog":
|
|
40221
|
-
return hasDependency(deps, ["posthog", "posthog-js"]) || hasFile(files, ["posthog"]);
|
|
40391
|
+
return hasDependency(deps, ["posthog", "posthog-js", "posthog-node"]) || hasFile(files, ["posthog."]);
|
|
40222
40392
|
case "clerk":
|
|
40223
|
-
return hasDependency(deps, ["@clerk/"]) || hasFile(files, ["clerk
|
|
40393
|
+
return hasDependency(deps, ["@clerk/"]) || hasFile(files, ["clerk."]);
|
|
40224
40394
|
case "authjs":
|
|
40225
|
-
return hasDependency(deps, ["next-auth", "@auth/"]) || hasFile(files, ["
|
|
40395
|
+
return hasDependency(deps, ["next-auth", "@auth/"]) || hasFile(files, ["nextauth", "auth.config."]);
|
|
40226
40396
|
case "resend":
|
|
40227
|
-
return hasDependency(deps, ["resend"]) || hasFile(files, ["resend"
|
|
40397
|
+
return hasDependency(deps, ["resend"]) || hasFile(files, ["resend."]);
|
|
40228
40398
|
case "upstash":
|
|
40229
|
-
return hasDependency(deps, ["@upstash/", "upstash"])
|
|
40399
|
+
return hasDependency(deps, ["@upstash/", "upstash"]);
|
|
40230
40400
|
default:
|
|
40231
40401
|
return false;
|
|
40232
40402
|
}
|
|
@@ -40251,7 +40421,7 @@ function applyProviderDetection(state, deps, files) {
|
|
|
40251
40421
|
return {
|
|
40252
40422
|
...provider2,
|
|
40253
40423
|
state: providerState2,
|
|
40254
|
-
statusText: detected ? "Detected in repo" : "
|
|
40424
|
+
statusText: detected ? "Detected in repo" : "Not detected",
|
|
40255
40425
|
connectLabel: detected ? "Open slot" : "Add provider",
|
|
40256
40426
|
launchPath: provider2.launchPath.map((item4, index) => ({
|
|
40257
40427
|
...item4,
|
|
@@ -40727,7 +40897,11 @@ async function readState(cwd) {
|
|
|
40727
40897
|
let state;
|
|
40728
40898
|
try {
|
|
40729
40899
|
const raw = await (0, import_promises23.readFile)((0, import_node_path30.join)(cwd, ".viberaven", "last-scan.json"), "utf8");
|
|
40730
|
-
|
|
40900
|
+
const packageJson = await readPackageJson(cwd);
|
|
40901
|
+
const deps = dependencyNames(packageJson);
|
|
40902
|
+
const files = await listProjectFiles(cwd);
|
|
40903
|
+
const present = new Set(PROVIDER_IDS.filter((id) => providerDetected(id, deps, files)));
|
|
40904
|
+
state = mapArtifactToLocalUiState(JSON.parse(raw), present);
|
|
40731
40905
|
} catch {
|
|
40732
40906
|
state = emptyLocalUiState(cwd);
|
|
40733
40907
|
}
|
|
@@ -41878,7 +42052,7 @@ async function waitForServerShutdown() {
|
|
|
41878
42052
|
process.once("SIGTERM", done);
|
|
41879
42053
|
});
|
|
41880
42054
|
}
|
|
41881
|
-
var import_node_http, import_node_child_process4, import_promises23, import_node_path30, CLI_AGENT_SETUP, MCP_CONFIG_PATHS, MCP_PROVIDER_NEEDLES, MCP_CONNECT_COMMANDS, MCP_SERVER_RECIPES, CLI_AUTH_PROBE;
|
|
42055
|
+
var import_node_http, import_node_child_process4, import_promises23, import_node_path30, CLI_AGENT_SETUP, MCP_CONFIG_PATHS, MCP_PROVIDER_NEEDLES, MCP_CONNECT_COMMANDS, MCP_SERVER_RECIPES, PROVIDER_IDS, CLI_AUTH_PROBE;
|
|
41882
42056
|
var init_server = __esm({
|
|
41883
42057
|
"src/local-ui/server.ts"() {
|
|
41884
42058
|
"use strict";
|
|
@@ -41992,6 +42166,7 @@ var init_server = __esm({
|
|
|
41992
42166
|
note: "Set UPSTASH_EMAIL and UPSTASH_API_KEY in your shell before the agent starts."
|
|
41993
42167
|
}
|
|
41994
42168
|
};
|
|
42169
|
+
PROVIDER_IDS = ["supabase", "vercel", "stripe", "github", "sentry", "posthog", "clerk", "authjs", "resend", "upstash"];
|
|
41995
42170
|
CLI_AUTH_PROBE = {
|
|
41996
42171
|
codex: "codex login status",
|
|
41997
42172
|
claude: "claude auth status",
|