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/),
|
||||
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
|
||||
|
||||
@@ -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
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 ---
|
||||
|
||||
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) => (
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user