feat: Vibe Architect dedicated mode, SEO follow-up fix (v1.8.0)
This commit is contained in:
19
CHANGELOG.md
19
CHANGELOG.md
@@ -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/),
|
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).
|
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
|
## [1.7.0] - 2026-03-18 20:44 UTC
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# PromptArch: AI Orchestration Platform
|
# 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).
|
> **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).**
|
> **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 |
|
| 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.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.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 |
|
| [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
20
app/vibe/page.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -477,7 +477,7 @@ function parsePlanFromResponse(text: string): { plan: Record<string, any> | null
|
|||||||
|
|
||||||
// --- Main Component ---
|
// --- Main Component ---
|
||||||
|
|
||||||
export default function AIAssist() {
|
export default function AIAssist({ vibeMode = false }: { vibeMode?: boolean } = {}) {
|
||||||
const {
|
const {
|
||||||
language,
|
language,
|
||||||
aiAssistTabs,
|
aiAssistTabs,
|
||||||
@@ -496,6 +496,8 @@ export default function AIAssist() {
|
|||||||
} = useStore();
|
} = useStore();
|
||||||
const t = translations[language].aiAssist;
|
const t = translations[language].aiAssist;
|
||||||
const common = translations[language].common;
|
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] || {
|
const activeTab = aiAssistTabs?.find(tab => tab.id === activeTabId) || aiAssistTabs?.[0] || {
|
||||||
id: 'default',
|
id: 'default',
|
||||||
@@ -642,8 +644,9 @@ export default function AIAssist() {
|
|||||||
// SEO, content, smm, design, web, app agents go straight to preview
|
// SEO, content, smm, design, web, app agents go straight to preview
|
||||||
const isCodeAgent = currentAgent === "code" || currentAgent === "general";
|
const isCodeAgent = currentAgent === "code" || currentAgent === "general";
|
||||||
const wasIdle = !isApproval && isCodeAgent && (assistStep === "idle" || assistStep === "plan");
|
const wasIdle = !isApproval && isCodeAgent && (assistStep === "idle" || assistStep === "plan");
|
||||||
// Detect if user is modifying existing code
|
// Detect if user is modifying an existing visual artifact (not text-only agents like SEO/content)
|
||||||
if (assistStep === "preview") setIsModifying(true);
|
const isVisualAgent = currentAgent === "code" || currentAgent === "web" || currentAgent === "app" || currentAgent === "design" || currentAgent === "general";
|
||||||
|
if (assistStep === "preview" && isVisualAgent) setIsModifying(true);
|
||||||
setIsProcessing(true);
|
setIsProcessing(true);
|
||||||
if (assistStep === "idle" && isCodeAgent) setAssistStep("plan");
|
if (assistStep === "idle" && isCodeAgent) setAssistStep("plan");
|
||||||
|
|
||||||
@@ -866,15 +869,20 @@ export default function AIAssist() {
|
|||||||
setShowCanvas(true);
|
setShowCanvas(true);
|
||||||
if (isPreviewRenderable(lastParsedPreview)) setViewMode("preview");
|
if (isPreviewRenderable(lastParsedPreview)) setViewMode("preview");
|
||||||
} else if (!isCodeAgent && !wasIdle) {
|
} else if (!isCodeAgent && !wasIdle) {
|
||||||
// Non-code agent without preview: just return to idle
|
// Non-code agent follow-up without new preview:
|
||||||
setAssistStep("idle");
|
// Keep existing canvas if we had one, otherwise go idle
|
||||||
|
if (previewData?.data) {
|
||||||
|
setAssistStep("preview");
|
||||||
|
} else {
|
||||||
|
setAssistStep("idle");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
setAssistStep("idle");
|
setAssistStep("idle");
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Assist error:", 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() };
|
const errorMsg: AIAssistMessage = { role: "assistant", content: message, timestamp: new Date() };
|
||||||
updateTabById(requestTabId, { history: [...aiAssistHistory, errorMsg] });
|
updateTabById(requestTabId, { history: [...aiAssistHistory, errorMsg] });
|
||||||
} finally {
|
} finally {
|
||||||
@@ -1159,7 +1167,7 @@ export default function AIAssist() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<h4 className="text-sm font-black text-amber-600 dark:text-amber-400">Qwen Authentication Required</h4>
|
<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 && (
|
{qwenAuthError && (
|
||||||
<p className="text-xs text-red-500 mt-1">{qwenAuthError}</p>
|
<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]" />
|
<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 className="absolute inset-0 bg-blue-500/10 blur-3xl rounded-full" />
|
||||||
</div>
|
</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">
|
<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>
|
</p>
|
||||||
<div className="mt-10 flex flex-wrap justify-center gap-3">
|
<div className="mt-10 flex flex-wrap justify-center gap-3">
|
||||||
{t.suggestions.map((chip: any) => (
|
{t.suggestions.map((chip: any) => (
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "promptarch",
|
"name": "promptarch",
|
||||||
"version": "1.7.0",
|
"version": "1.8.0",
|
||||||
"description": "Transform vague ideas into production-ready prompts and PRDs",
|
"description": "Transform vague ideas into production-ready prompts and PRDs",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
|
|||||||
Reference in New Issue
Block a user