Skip to content

Commit 8304c8e

Browse files
authored
Merge pull request #29 from devakone/develop
Release: develop → main
2 parents 967c5b6 + cb5f40c commit 8304c8e

25 files changed

Lines changed: 249 additions & 57 deletions
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
".": "0.1.0-alpha.10",
3-
"apps/web": "0.1.0-alpha.10",
2+
".": "0.1.0-alpha.11",
3+
"apps/web": "0.1.0-alpha.11",
44
"apps/worker": "0.1.0-alpha.3"
55
}

CHANGELOG-DEVELOP.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
# Changelog
22

3+
## [0.1.0-alpha.11](https://github.com/devakone/vibe-coding-profiler/compare/vibe-coding-profiler-v0.1.0-alpha.10...vibe-coding-profiler-v0.1.0-alpha.11) (2026-02-01)
4+
5+
6+
### Features
7+
8+
* replace Montoya slash with vibe echo effect ([f3d869d](https://github.com/devakone/vibe-coding-profiler/commit/f3d869d7d1a5565736948ea80e507a9b476c9018))
9+
* unify brand colors and add Montoya slash flourish ([e699083](https://github.com/devakone/vibe-coding-profiler/commit/e699083367370545957ff0d0f9cf428166c113df))
10+
11+
12+
### Bug Fixes
13+
14+
* enable share image generation for repo analysis pages ([01a4d0c](https://github.com/devakone/vibe-coding-profiler/commit/01a4d0ce920a057e551255fdfbde96969000f2a1))
15+
* remove old vibed.dev fallbacks and update branding references ([0954d0b](https://github.com/devakone/vibe-coding-profiler/commit/0954d0b9bb7c42cd83cfde00df015c86a094852e))
16+
* restore rounded corners on analysis cards after overflow-hidden removal ([6416a65](https://github.com/devakone/vibe-coding-profiler/commit/6416a654b20907ed24dbac574a579c729ce8fdde))
17+
* use maybeSingle for profile share route to avoid PGRST116 crash ([6193cea](https://github.com/devakone/vibe-coding-profiler/commit/6193cea160fd8a130b67ee8e7fa18a735e8e4f7f))
18+
319
## [0.1.0-alpha.10](https://github.com/devakone/vibe-coding-profiler/compare/vibe-coding-profiler-v0.1.0-alpha.9...vibe-coding-profiler-v0.1.0-alpha.10) (2026-01-31)
420

521

apps/web/CHANGELOG-DEVELOP.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
# Changelog
22

3+
## [0.1.0-alpha.11](https://github.com/devakone/vibe-coding-profiler/compare/web-v0.1.0-alpha.10...web-v0.1.0-alpha.11) (2026-02-01)
4+
5+
6+
### Features
7+
8+
* replace Montoya slash with vibe echo effect ([f3d869d](https://github.com/devakone/vibe-coding-profiler/commit/f3d869d7d1a5565736948ea80e507a9b476c9018))
9+
* unify brand colors and add Montoya slash flourish ([e699083](https://github.com/devakone/vibe-coding-profiler/commit/e699083367370545957ff0d0f9cf428166c113df))
10+
11+
12+
### Bug Fixes
13+
14+
* enable share image generation for repo analysis pages ([01a4d0c](https://github.com/devakone/vibe-coding-profiler/commit/01a4d0ce920a057e551255fdfbde96969000f2a1))
15+
* remove old vibed.dev fallbacks and update branding references ([0954d0b](https://github.com/devakone/vibe-coding-profiler/commit/0954d0b9bb7c42cd83cfde00df015c86a094852e))
16+
* restore rounded corners on analysis cards after overflow-hidden removal ([6416a65](https://github.com/devakone/vibe-coding-profiler/commit/6416a654b20907ed24dbac574a579c729ce8fdde))
17+
* use maybeSingle for profile share route to avoid PGRST116 crash ([6193cea](https://github.com/devakone/vibe-coding-profiler/commit/6193cea160fd8a130b67ee8e7fa18a735e8e4f7f))
18+
319
## [0.1.0-alpha.10](https://github.com/devakone/vibe-coding-profiler/compare/web-v0.1.0-alpha.9...web-v0.1.0-alpha.10) (2026-01-31)
420

521

apps/web/src/app/admin/jobs/page.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ export default async function AdminJobsPage({
115115
</td>
116116
<td className="px-4 py-3">
117117
{job.profile_updated ? (
118-
<span className="inline-flex items-center gap-1 rounded-full bg-fuchsia-100 px-2 py-1 text-xs font-medium text-fuchsia-700">
119-
<span className="text-fuchsia-500"></span>
118+
<span className="inline-flex items-center gap-1 rounded-full bg-violet-100 px-2 py-1 text-xs font-medium text-violet-700">
119+
<span className="text-violet-500"></span>
120120
{job.profile_persona ? (
121121
<span title={job.profile_persona}>Updated</span>
122122
) : (
@@ -182,7 +182,7 @@ function StatusBadge({ status }: { status: string }) {
182182
const styles: Record<string, string> = {
183183
done: "bg-emerald-100 text-emerald-700",
184184
queued: "bg-amber-100 text-amber-700",
185-
running: "bg-blue-100 text-blue-700",
185+
running: "bg-indigo-100 text-indigo-700",
186186
failed: "bg-red-100 text-red-700",
187187
};
188188

apps/web/src/app/admin/users/[userId]/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ function StatusBadge({ status }: { status: string }) {
294294
const styles: Record<string, string> = {
295295
done: "bg-emerald-100 text-emerald-700",
296296
queued: "bg-amber-100 text-amber-700",
297-
running: "bg-blue-100 text-blue-700",
297+
running: "bg-indigo-100 text-indigo-700",
298298
failed: "bg-red-100 text-red-700",
299299
};
300300

apps/web/src/app/analysis/AnalysisListClient.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ interface AnalysisListClientProps {
3636

3737
const STATUS_COLORS: Record<string, { bg: string; text: string; dot: string }> = {
3838
pending: { bg: "bg-amber-50", text: "text-amber-700", dot: "bg-amber-400" },
39-
running: { bg: "bg-blue-50", text: "text-blue-700", dot: "bg-blue-400 animate-pulse" },
39+
running: { bg: "bg-indigo-50", text: "text-indigo-700", dot: "bg-indigo-400 animate-pulse" },
4040
done: { bg: "bg-green-50", text: "text-green-700", dot: "bg-green-500" },
4141
failed: { bg: "bg-red-50", text: "text-red-700", dot: "bg-red-500" },
4242
};
@@ -128,8 +128,8 @@ export default function AnalysisListClient({ initialReports, initialJobs }: Anal
128128
>
129129
Jobs
130130
{activeJobsCount > 0 && (
131-
<span className="ml-2 inline-flex items-center gap-1 rounded-full bg-blue-100 px-2 py-0.5 text-xs text-blue-700">
132-
<span className="h-1.5 w-1.5 animate-pulse rounded-full bg-blue-500" />
131+
<span className="ml-2 inline-flex items-center gap-1 rounded-full bg-indigo-100 px-2 py-0.5 text-xs text-indigo-700">
132+
<span className="h-1.5 w-1.5 animate-pulse rounded-full bg-indigo-500" />
133133
{activeJobsCount}
134134
</span>
135135
)}
@@ -223,7 +223,7 @@ export default function AnalysisListClient({ initialReports, initialJobs }: Anal
223223
<p className="text-sm text-zinc-600">
224224
{isPolling ? (
225225
<span className="inline-flex items-center gap-2">
226-
<span className="h-2 w-2 animate-pulse rounded-full bg-blue-500" />
226+
<span className="h-2 w-2 animate-pulse rounded-full bg-indigo-500" />
227227
Watching for updates...
228228
</span>
229229
) : (
@@ -254,7 +254,7 @@ export default function AnalysisListClient({ initialReports, initialJobs }: Anal
254254
key={job.id}
255255
className={`rounded-xl border p-4 transition-colors ${
256256
job.status === "running"
257-
? "border-blue-200 bg-blue-50/50"
257+
? "border-indigo-200 bg-indigo-50/50"
258258
: job.status === "failed"
259259
? "border-red-200 bg-red-50/50"
260260
: "border-black/5 bg-white/70"
@@ -289,7 +289,7 @@ export default function AnalysisListClient({ initialReports, initialJobs }: Anal
289289
</Link>
290290
)}
291291
{job.status === "running" && (
292-
<div className="flex items-center gap-2 text-xs text-blue-600">
292+
<div className="flex items-center gap-2 text-xs text-indigo-600">
293293
<svg className="h-4 w-4 animate-spin" viewBox="0 0 24 24" fill="none">
294294
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" />
295295
<path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />

apps/web/src/app/analysis/[jobId]/AnalysisClient.tsx

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,7 @@ export default function AnalysisClient({ jobId }: { jobId: string }) {
715715
if (job.status === "queued" || job.status === "running") {
716716
return (
717717
<div className="flex flex-col items-center justify-center gap-4 py-16">
718-
<div className="h-8 w-8 animate-spin rounded-full border-4 border-zinc-200 border-t-fuchsia-500" />
718+
<div className="h-8 w-8 animate-spin rounded-full border-4 border-zinc-200 border-t-violet-500" />
719719
<p className="text-sm text-zinc-600">
720720
{job.status === "queued" ? "Waiting to analyze…" : "Analyzing your commits…"}
721721
</p>
@@ -779,14 +779,14 @@ export default function AnalysisClient({ jobId }: { jobId: string }) {
779779
? "border-red-200 bg-red-50"
780780
: profileRebuildStatus === "success"
781781
? "border-green-200 bg-green-50"
782-
: "border-fuchsia-200 bg-fuchsia-50"
782+
: "border-violet-200 bg-violet-50"
783783
}`}
784784
>
785785
<div className="flex items-center gap-3">
786786
{rebuildingProfile ? (
787787
<>
788-
<div className="h-4 w-4 animate-spin rounded-full border-2 border-fuchsia-200 border-t-fuchsia-500" />
789-
<p className="text-sm font-medium text-fuchsia-800">
788+
<div className="h-4 w-4 animate-spin rounded-full border-2 border-violet-200 border-t-violet-500" />
789+
<p className="text-sm font-medium text-violet-800">
790790
Rebuilding your Unified VCP with latest analysis...
791791
</p>
792792
</>
@@ -832,7 +832,7 @@ export default function AnalysisClient({ jobId }: { jobId: string }) {
832832
footer={{
833833
left: process.env.NEXT_PUBLIC_APP_URL
834834
? new URL(process.env.NEXT_PUBLIC_APP_URL).hostname
835-
: "vibed.dev",
835+
: "Vibe Coding Profiler",
836836
right: `${wrapped.totals.commits} commits${metricsJson?.active_days ? ` · ${metricsJson.active_days} active days` : ""}`,
837837
}}
838838
colors={shareTemplate.colors}
@@ -846,6 +846,7 @@ export default function AnalysisClient({ jobId }: { jobId: string }) {
846846
shareHeadline={shareTemplate.headline}
847847
shareTemplate={shareImageTemplate}
848848
entityId={jobId}
849+
userId={data?.userId ?? undefined}
849850
storyEndpoint={storyEndpoint}
850851
/>
851852
</div>
@@ -857,7 +858,7 @@ export default function AnalysisClient({ jobId }: { jobId: string }) {
857858
<div className="flex items-center gap-2">
858859
<span className="text-xs font-medium text-zinc-500">Version:</span>
859860
<select
860-
className="rounded-lg border border-black/10 bg-white px-3 py-1.5 text-sm font-medium text-zinc-700 shadow-sm focus:border-fuchsia-500 focus:outline-none focus:ring-1 focus:ring-fuchsia-500"
861+
className="rounded-lg border border-black/10 bg-white px-3 py-1.5 text-sm font-medium text-zinc-700 shadow-sm focus:border-violet-500 focus:outline-none focus:ring-1 focus:ring-violet-500"
861862
value={jobId}
862863
onChange={(e) => {
863864
if (e.target.value !== jobId) {
@@ -908,8 +909,8 @@ export default function AnalysisClient({ jobId }: { jobId: string }) {
908909
</div>
909910

910911
{/* Detailed Analysis Card */}
911-
<div className="relative overflow-hidden rounded-[2rem] border border-black/5 bg-white shadow-sm">
912-
<div className="absolute inset-0 bg-gradient-to-br from-violet-500/8 via-transparent to-indigo-500/8" />
912+
<div className="vibe-echo relative rounded-[2rem] border border-black/5 bg-white shadow-sm">
913+
<div className="absolute inset-0 rounded-[inherit] bg-gradient-to-br from-violet-500/8 via-transparent to-indigo-500/8" />
913914
<div className="relative p-8">
914915
<RepoIdentitySection
915916
persona={persona}
@@ -942,7 +943,7 @@ export default function AnalysisClient({ jobId }: { jobId: string }) {
942943
<span
943944
className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${
944945
wrapped.artifact_traceability.workflow_style === "orchestrator"
945-
? "bg-cyan-100 text-cyan-800"
946+
? "bg-indigo-100 text-indigo-800"
946947
: wrapped.artifact_traceability.workflow_style === "conductor"
947948
? "bg-amber-100 text-amber-800"
948949
: "bg-violet-100 text-violet-800"
@@ -999,7 +1000,7 @@ export default function AnalysisClient({ jobId }: { jobId: string }) {
9991000
{wrapped.artifact_traceability.scores ? (
10001001
<div className="mt-4 flex items-center justify-center gap-4 text-xs text-zinc-500">
10011002
<span>
1002-
Orchestrator: <span className="font-semibold text-cyan-700">{wrapped.artifact_traceability.scores.orchestrator_score}</span>
1003+
Orchestrator: <span className="font-semibold text-indigo-700">{wrapped.artifact_traceability.scores.orchestrator_score}</span>
10031004
</span>
10041005
<span>vs</span>
10051006
<span>
@@ -1113,7 +1114,7 @@ export default function AnalysisClient({ jobId }: { jobId: string }) {
11131114
</div>
11141115
</div>
11151116

1116-
<details className="rounded-3xl border border-black/5 bg-white p-6 shadow-sm">
1117+
<details className="vibe-echo rounded-3xl border border-black/5 bg-white p-6 shadow-sm">
11171118
<summary className="cursor-pointer text-sm font-semibold text-zinc-900">
11181119
Timeline and details
11191120
</summary>

apps/web/src/app/api/share/[format]/[userId]/route.tsx

Lines changed: 66 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ export async function GET(
1111
) {
1212
try {
1313
const { format, userId } = await params;
14-
14+
const jobId = new URL(request.url).searchParams.get("jobId");
15+
1516
if (!["og", "square", "story"].includes(format)) {
1617
return new Response("Invalid format", { status: 400 });
1718
}
@@ -60,21 +61,73 @@ export async function GET(
6061

6162
const supabase = createClient(supabaseUrl, supabaseKey);
6263

63-
// Fetch Profile
64-
const { data: profile, error } = await supabase
65-
.from("user_profiles")
66-
.select("persona_id, persona_name, persona_tagline, persona_confidence, total_repos, total_commits, axes_json, narrative_json")
67-
.eq("user_id", userId)
68-
.single();
64+
// Fetch data: job-specific or unified profile
65+
let profile: {
66+
persona_id: string;
67+
persona_name: string | null;
68+
persona_tagline: string | null;
69+
persona_confidence: string | null;
70+
total_repos: number | null;
71+
total_commits: number | null;
72+
axes_json: Record<string, { score: number }> | null;
73+
narrative_json: { insight?: string; summary?: string } | null;
74+
} | null = null;
75+
76+
if (jobId) {
77+
// Job-specific share: fetch from vibe_insights + analysis_jobs
78+
const [vibeResult, jobResult, insightsResult] = await Promise.all([
79+
supabase
80+
.from("vibe_insights")
81+
.select("persona_id, persona_name, persona_tagline, persona_confidence, axes_json")
82+
.eq("job_id", jobId)
83+
.maybeSingle(),
84+
supabase
85+
.from("analysis_jobs")
86+
.select("commit_count")
87+
.eq("id", jobId)
88+
.eq("user_id", userId)
89+
.maybeSingle(),
90+
supabase
91+
.from("analysis_insights")
92+
.select("persona_label, persona_confidence, persona_id, narrative_json")
93+
.eq("job_id", jobId)
94+
.maybeSingle(),
95+
]);
6996

70-
if (error) {
71-
console.error("Supabase error:", error);
72-
throw new Error(`Profile fetch failed: ${error.message}`);
97+
const vibe = vibeResult.data;
98+
const job = jobResult.data;
99+
const insights = insightsResult.data;
100+
101+
if (vibe || insights) {
102+
profile = {
103+
persona_id: vibe?.persona_id ?? insights?.persona_id ?? "balanced_builder",
104+
persona_name: vibe?.persona_name ?? insights?.persona_label ?? null,
105+
persona_tagline: vibe?.persona_tagline ?? null,
106+
persona_confidence: vibe?.persona_confidence ?? insights?.persona_confidence ?? null,
107+
total_repos: 1,
108+
total_commits: job?.commit_count ?? null,
109+
axes_json: vibe?.axes_json ?? null,
110+
narrative_json: insights?.narrative_json ?? null,
111+
};
112+
}
113+
} else {
114+
// Unified profile share
115+
const { data, error } = await supabase
116+
.from("user_profiles")
117+
.select("persona_id, persona_name, persona_tagline, persona_confidence, total_repos, total_commits, axes_json, narrative_json")
118+
.eq("user_id", userId)
119+
.maybeSingle();
120+
121+
if (error) {
122+
console.error("Supabase error:", error);
123+
throw new Error(`Profile fetch failed: ${error.message}`);
124+
}
125+
profile = data;
73126
}
74-
127+
75128
if (!profile) {
76-
console.error(`Profile not found for userId: ${userId}`);
77-
return new Response("Profile not found - check if userId is correct or if RLS policies prevent access (Service Role Key required for private profiles)", { status: 404 });
129+
console.error(`Profile not found for userId: ${userId}${jobId ? `, jobId: ${jobId}` : ""}`);
130+
return new Response("Profile not found", { status: 404 });
78131
}
79132

80133
// Prepare Data

apps/web/src/app/api/share/story/[userId]/route.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ async function buildProfileStory(
145145
const topAxes = axes ? formatAxesList(axes) : [];
146146

147147
return {
148-
headline: "My Vibed Profile",
148+
headline: "My Vibe Coding Profile",
149149
subhead,
150150
personaName: profileRow.persona_name ?? "Vibe Coder",
151151
personaTagline: subhead,

0 commit comments

Comments
 (0)