feat: Vibe Architect dedicated mode, SEO follow-up fix (v1.8.0)

This commit is contained in:
admin
2026-03-18 21:02:37 +00:00
Unverified
parent 5e4927624e
commit 2e90246130
5 changed files with 59 additions and 11 deletions

View File

@@ -5,6 +5,25 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.8.0] - 2026-03-18 21:02 UTC
### Added
- **Vibe Architect Dedicated Mode** — Full-screen immersive AI coding experience
- New route: `/vibe` ([rommark.dev/tools/promptarch/vibe/](https://rommark.dev/tools/promptarch/vibe/))
- No sidebar, no navigation — just AI Assist in full screen
- Rebranded as "Vibe Architect" with dedicated messaging
- `vibeMode` prop on AIAssist component for label overrides
### Fixed
- **SEO follow-up preview** — Canvas no longer breaks when asking follow-up questions after SEO audit
- `isModifying` overlay only triggers for visual agents (code, web, app, design) — not SEO/content/SMM
- Non-visual agent follow-ups preserve existing canvas if no new preview is generated
### Technical Details
- Files added: 1 (`app/vibe/page.tsx`)
- Files modified: 1 (AIAssist.tsx: +8/-3 lines)
- New prop: `vibeMode` on AIAssist component
## [1.7.0] - 2026-03-18 20:44 UTC
### Added

View File

@@ -1,6 +1,6 @@
# PromptArch: AI Orchestration Platform
> **Latest Version**: [v1.7.0](CHANGELOG.md#170---2026-03-18) (2026-03-18)
> **Latest Version**: [v1.8.0](CHANGELOG.md#180---2026-03-18) (2026-03-18)
> **Development Note**: This entire platform was developed exclusively using [TRAE.AI IDE](https://trae.ai) powered by elite [GLM 4.7 model](https://z.ai/subscribe?ic=R0K78RJKNW).
> **Learn more about this architecture [here](https://z.ai/subscribe?ic=R0K78RJKNW).**
@@ -143,6 +143,7 @@ This project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
| Version | Date | Highlights |
|---------|------|------------|
| [1.8.0](CHANGELOG.md#180---2026-03-18) | 2026-03-18 21:02 UTC | Vibe Architect dedicated mode, SEO follow-up fix |
| [1.7.0](CHANGELOG.md#170---2026-03-18) | 2026-03-18 20:44 UTC | Industry-grade SEO audit, plan flow fix for non-code agents |
| [1.6.0](CHANGELOG.md#160---2026-03-18) | 2026-03-18 20:34 | SEO web audit, URL fetching, auto web search for SEO mode |
| [1.5.0](CHANGELOG.md#150---2026-03-18) | 2026-03-18 20:29 | Modification progress overlay, preview blink fix |

20
app/vibe/page.tsx Normal file
View File

@@ -0,0 +1,20 @@
"use client";
import { useEffect } from "react";
import dynamic from 'next/dynamic';
import modelAdapter from "@/lib/services/adapter-instance";
const AIAssist = dynamic(() => import("@/components/AIAssist"), { ssr: false });
export default function VibePage() {
useEffect(() => {
console.log("[Vibe] Initializing services...");
modelAdapter["qwenService"]["initialize"]?.();
}, []);
return (
<div className="fixed inset-0 bg-[#050508] overflow-hidden">
<AIAssist vibeMode />
</div>
);
}

View File

@@ -477,7 +477,7 @@ function parsePlanFromResponse(text: string): { plan: Record<string, any> | null
// --- Main Component ---
export default function AIAssist() {
export default function AIAssist({ vibeMode = false }: { vibeMode?: boolean } = {}) {
const {
language,
aiAssistTabs,
@@ -496,6 +496,8 @@ export default function AIAssist() {
} = useStore();
const t = translations[language].aiAssist;
const common = translations[language].common;
// Vibe mode: override labels
const _vibe = vibeMode ? { studioTitle: "Vibe Architect", studioDesc: "Describe your vision. Get plans, code, and live previews." } : {};
const activeTab = aiAssistTabs?.find(tab => tab.id === activeTabId) || aiAssistTabs?.[0] || {
id: 'default',
@@ -642,8 +644,9 @@ export default function AIAssist() {
// SEO, content, smm, design, web, app agents go straight to preview
const isCodeAgent = currentAgent === "code" || currentAgent === "general";
const wasIdle = !isApproval && isCodeAgent && (assistStep === "idle" || assistStep === "plan");
// Detect if user is modifying existing code
if (assistStep === "preview") setIsModifying(true);
// Detect if user is modifying an existing visual artifact (not text-only agents like SEO/content)
const isVisualAgent = currentAgent === "code" || currentAgent === "web" || currentAgent === "app" || currentAgent === "design" || currentAgent === "general";
if (assistStep === "preview" && isVisualAgent) setIsModifying(true);
setIsProcessing(true);
if (assistStep === "idle" && isCodeAgent) setAssistStep("plan");
@@ -866,15 +869,20 @@ export default function AIAssist() {
setShowCanvas(true);
if (isPreviewRenderable(lastParsedPreview)) setViewMode("preview");
} else if (!isCodeAgent && !wasIdle) {
// Non-code agent without preview: just return to idle
setAssistStep("idle");
// Non-code agent follow-up without new preview:
// Keep existing canvas if we had one, otherwise go idle
if (previewData?.data) {
setAssistStep("preview");
} else {
setAssistStep("idle");
}
} else {
setAssistStep("idle");
}
} catch (error) {
console.error("Assist error:", error);
const message = error instanceof Error ? error.message : "AI Assist failed";
const message = error instanceof Error ? error.message : "Vibe Architect failed";
const errorMsg: AIAssistMessage = { role: "assistant", content: message, timestamp: new Date() };
updateTabById(requestTabId, { history: [...aiAssistHistory, errorMsg] });
} finally {
@@ -1159,7 +1167,7 @@ export default function AIAssist() {
</div>
<div className="flex-1">
<h4 className="text-sm font-black text-amber-600 dark:text-amber-400">Qwen Authentication Required</h4>
<p className="text-xs text-amber-700/70 dark:text-amber-300/70 mt-0.5">Sign in with Qwen to use AI Assist with this provider</p>
<p className="text-xs text-amber-700/70 dark:text-amber-300/70 mt-0.5">Sign in with Qwen to use Vibe Architect with this provider</p>
{qwenAuthError && (
<p className="text-xs text-red-500 mt-1">{qwenAuthError}</p>
)}
@@ -1181,9 +1189,9 @@ export default function AIAssist() {
<Ghost className="h-20 w-20 text-blue-400/40 animate-bounce duration-[3s]" />
<div className="absolute inset-0 bg-blue-500/10 blur-3xl rounded-full" />
</div>
<h3 className="text-3xl font-black text-slate-900 dark:text-blue-50 mb-3 tracking-tighter">{t.studioTitle}</h3>
<h3 className="text-3xl font-black text-slate-900 dark:text-blue-50 mb-3 tracking-tighter">{(_vibe as any).studioTitle || t.studioTitle}</h3>
<p className="max-w-xs text-sm font-medium text-slate-600 dark:text-blue-100/70 leading-relaxed">
{t.studioDesc}
{(_vibe as any).studioDesc || t.studioDesc}
</p>
<div className="mt-10 flex flex-wrap justify-center gap-3">
{t.suggestions.map((chip: any) => (

View File

@@ -1,6 +1,6 @@
{
"name": "promptarch",
"version": "1.7.0",
"version": "1.8.0",
"description": "Transform vague ideas into production-ready prompts and PRDs",
"scripts": {
"dev": "next dev",