claudeship 0.2.14 → 0.2.16
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/README.md +18 -0
- package/apps/server/dist/app.module.js +2 -0
- package/apps/server/dist/app.module.js.map +1 -1
- package/apps/server/dist/env/env.controller.d.ts +14 -0
- package/apps/server/dist/env/env.controller.js +84 -0
- package/apps/server/dist/env/env.controller.js.map +1 -0
- package/apps/server/dist/env/env.module.d.ts +2 -0
- package/apps/server/dist/env/env.module.js +25 -0
- package/apps/server/dist/env/env.module.js.map +1 -0
- package/apps/server/dist/env/env.service.d.ts +21 -0
- package/apps/server/dist/env/env.service.js +194 -0
- package/apps/server/dist/env/env.service.js.map +1 -0
- package/apps/server/dist/tsconfig.tsbuildinfo +1 -1
- package/apps/server/package.json +1 -1
- package/apps/web/.env.local +1 -0
- package/apps/web/.next/BUILD_ID +1 -1
- package/apps/web/.next/app-build-manifest.json +7 -7
- package/apps/web/.next/app-path-routes-manifest.json +2 -2
- package/apps/web/.next/build-manifest.json +2 -2
- package/apps/web/.next/cache/.previewinfo +1 -1
- package/apps/web/.next/cache/.rscinfo +1 -1
- package/apps/web/.next/cache/.tsbuildinfo +1 -1
- package/apps/web/.next/cache/config.json +3 -3
- package/apps/web/.next/cache/eslint/.cache_j3uhuz +1 -1
- package/apps/web/.next/cache/webpack/client-production/0.pack +0 -0
- package/apps/web/.next/cache/webpack/client-production/index.pack +0 -0
- package/apps/web/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/apps/web/.next/cache/webpack/server-production/0.pack +0 -0
- package/apps/web/.next/cache/webpack/server-production/index.pack +0 -0
- package/apps/web/.next/prerender-manifest.json +10 -10
- package/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/server/app/_not-found.html +1 -1
- package/apps/web/.next/server/app/_not-found.rsc +2 -2
- package/apps/web/.next/server/app/index.html +1 -1
- package/apps/web/.next/server/app/index.rsc +3 -3
- package/apps/web/.next/server/app/page.js +2 -2
- package/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/server/app/project/[id]/page.js +2 -2
- package/apps/web/.next/server/app/project/[id]/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/server/app/settings.html +1 -1
- package/apps/web/.next/server/app/settings.rsc +3 -3
- package/apps/web/.next/server/app-paths-manifest.json +2 -2
- package/apps/web/.next/server/chunks/392.js +1 -1
- package/apps/web/.next/server/pages/404.html +1 -1
- package/apps/web/.next/server/pages/500.html +1 -1
- package/apps/web/.next/server/server-reference-manifest.json +1 -1
- package/apps/web/.next/static/chunks/574-1fe2bcd6cfb41646.js +1 -0
- package/apps/web/.next/static/chunks/app/page-8310956d8eae9762.js +1 -0
- package/apps/web/.next/static/chunks/app/project/[id]/page-c28098a9b8a94336.js +1 -0
- package/apps/web/.next/static/chunks/app/settings/page-3532fad509d55b77.js +1 -0
- package/apps/web/.next/static/css/0a24552d9794f8c8.css +3 -0
- package/apps/web/.next/trace +18 -18
- package/apps/web/package.json +1 -1
- package/apps/web/src/components/workspace/WorkspaceLayout.tsx +66 -4
- package/package.json +2 -2
- package/scripts/setup.sh +89 -0
- package/apps/web/.next/static/chunks/712-11fca77fb30a2a06.js +0 -1
- package/apps/web/.next/static/chunks/app/page-0db1c152fbd48359.js +0 -1
- package/apps/web/.next/static/chunks/app/project/[id]/page-7c44ae18c8984726.js +0 -1
- package/apps/web/.next/static/chunks/app/settings/page-d1318c2fd58729a5.js +0 -1
- package/apps/web/.next/static/css/d0f1b036f222bc16.css +0 -3
- package/scripts/setup-hooks.sh +0 -26
- /package/apps/web/.next/static/{tV_Qc76rupeogXvWEMw6p → KPVdAK1JjO7W2NYgwPhFs}/_buildManifest.js +0 -0
- /package/apps/web/.next/static/{tV_Qc76rupeogXvWEMw6p → KPVdAK1JjO7W2NYgwPhFs}/_ssgManifest.js +0 -0
package/apps/web/package.json
CHANGED
|
@@ -5,7 +5,19 @@ import { ChatPanel } from "@/components/chat/ChatPanel";
|
|
|
5
5
|
import { PreviewPanel } from "@/components/preview/PreviewPanel";
|
|
6
6
|
import { FileExplorer } from "@/components/file/FileExplorer";
|
|
7
7
|
import { FileViewer } from "@/components/file/FileViewer";
|
|
8
|
-
import {
|
|
8
|
+
import { DatabasePanel } from "@/components/database/DatabasePanel";
|
|
9
|
+
import { TestRunner } from "@/components/testing/TestRunner";
|
|
10
|
+
import { CheckpointPanel } from "@/components/checkpoint/CheckpointPanel";
|
|
11
|
+
import { EnvPanel } from "@/components/env/EnvPanel";
|
|
12
|
+
import {
|
|
13
|
+
FolderTree,
|
|
14
|
+
X,
|
|
15
|
+
Eye,
|
|
16
|
+
Database,
|
|
17
|
+
FlaskConical,
|
|
18
|
+
GitBranch,
|
|
19
|
+
Settings2,
|
|
20
|
+
} from "lucide-react";
|
|
9
21
|
import { Button } from "@/components/ui/button";
|
|
10
22
|
import { useTranslation } from "@/lib/i18n";
|
|
11
23
|
|
|
@@ -19,10 +31,21 @@ interface SelectedFile {
|
|
|
19
31
|
extension: string;
|
|
20
32
|
}
|
|
21
33
|
|
|
34
|
+
type RightPanelTab = "preview" | "database" | "testing" | "checkpoint" | "env";
|
|
35
|
+
|
|
36
|
+
const tabConfig: { id: RightPanelTab; icon: React.ReactNode; label: string }[] = [
|
|
37
|
+
{ id: "preview", icon: <Eye className="h-4 w-4" />, label: "Preview" },
|
|
38
|
+
{ id: "database", icon: <Database className="h-4 w-4" />, label: "Database" },
|
|
39
|
+
{ id: "testing", icon: <FlaskConical className="h-4 w-4" />, label: "Testing" },
|
|
40
|
+
{ id: "checkpoint", icon: <GitBranch className="h-4 w-4" />, label: "Checkpoint" },
|
|
41
|
+
{ id: "env", icon: <Settings2 className="h-4 w-4" />, label: "Env" },
|
|
42
|
+
];
|
|
43
|
+
|
|
22
44
|
export function WorkspaceLayout({ projectId }: WorkspaceLayoutProps) {
|
|
23
45
|
const { t } = useTranslation();
|
|
24
46
|
const [showFileExplorer, setShowFileExplorer] = useState(false);
|
|
25
47
|
const [selectedFile, setSelectedFile] = useState<SelectedFile | null>(null);
|
|
48
|
+
const [activeTab, setActiveTab] = useState<RightPanelTab>("preview");
|
|
26
49
|
|
|
27
50
|
const handleFileSelect = (path: string, content: string) => {
|
|
28
51
|
const extension = path.split(".").pop() || "";
|
|
@@ -33,6 +56,23 @@ export function WorkspaceLayout({ projectId }: WorkspaceLayoutProps) {
|
|
|
33
56
|
setSelectedFile(null);
|
|
34
57
|
};
|
|
35
58
|
|
|
59
|
+
const renderTabContent = () => {
|
|
60
|
+
switch (activeTab) {
|
|
61
|
+
case "preview":
|
|
62
|
+
return <PreviewPanel projectId={projectId} />;
|
|
63
|
+
case "database":
|
|
64
|
+
return <DatabasePanel projectId={projectId} />;
|
|
65
|
+
case "testing":
|
|
66
|
+
return <TestRunner projectId={projectId} />;
|
|
67
|
+
case "checkpoint":
|
|
68
|
+
return <CheckpointPanel projectId={projectId} />;
|
|
69
|
+
case "env":
|
|
70
|
+
return <EnvPanel projectId={projectId} />;
|
|
71
|
+
default:
|
|
72
|
+
return <PreviewPanel projectId={projectId} />;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
36
76
|
return (
|
|
37
77
|
<div className="flex h-[calc(100vh-3.5rem)]">
|
|
38
78
|
{/* File Explorer Toggle Button */}
|
|
@@ -65,12 +105,34 @@ export function WorkspaceLayout({ projectId }: WorkspaceLayoutProps) {
|
|
|
65
105
|
<ChatPanel projectId={projectId} />
|
|
66
106
|
</div>
|
|
67
107
|
|
|
68
|
-
{/*
|
|
108
|
+
{/* Right Panel - 70% width */}
|
|
69
109
|
<div
|
|
70
|
-
className="flex-1"
|
|
110
|
+
className="flex-1 flex flex-col"
|
|
71
111
|
style={{ width: showFileExplorer ? "calc(70%)" : "70%" }}
|
|
72
112
|
>
|
|
73
|
-
|
|
113
|
+
{/* Tab Bar */}
|
|
114
|
+
<div className="flex items-center border-b bg-muted/30 px-2">
|
|
115
|
+
{tabConfig.map((tab) => (
|
|
116
|
+
<button
|
|
117
|
+
key={tab.id}
|
|
118
|
+
onClick={() => setActiveTab(tab.id)}
|
|
119
|
+
className={`flex items-center gap-1.5 px-3 py-2 text-sm font-medium transition-colors border-b-2 -mb-px ${
|
|
120
|
+
activeTab === tab.id
|
|
121
|
+
? "border-primary text-primary"
|
|
122
|
+
: "border-transparent text-muted-foreground hover:text-foreground"
|
|
123
|
+
}`}
|
|
124
|
+
title={tab.label}
|
|
125
|
+
>
|
|
126
|
+
{tab.icon}
|
|
127
|
+
<span className="hidden lg:inline">{tab.label}</span>
|
|
128
|
+
</button>
|
|
129
|
+
))}
|
|
130
|
+
</div>
|
|
131
|
+
|
|
132
|
+
{/* Tab Content */}
|
|
133
|
+
<div className="flex-1 overflow-hidden">
|
|
134
|
+
{renderTabContent()}
|
|
135
|
+
</div>
|
|
74
136
|
</div>
|
|
75
137
|
|
|
76
138
|
{/* File Viewer Modal */}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claudeship",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.16",
|
|
4
4
|
"description": "AI-Powered App Builder using Claude Code CLI",
|
|
5
5
|
"bin": {
|
|
6
6
|
"claudeship": "./bin/claudeship.js"
|
|
7
7
|
},
|
|
8
8
|
"scripts": {
|
|
9
|
-
"prepare": "bash scripts/setup
|
|
9
|
+
"prepare": "bash scripts/setup.sh || true",
|
|
10
10
|
"dev": "node scripts/dev.js",
|
|
11
11
|
"dev:parallel": "pnpm run --parallel dev",
|
|
12
12
|
"dev:web": "pnpm --filter @claudeship/web dev",
|
package/scripts/setup.sh
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# 프로젝트 초기 설정 스크립트
|
|
4
|
+
# - Git hooks 설치
|
|
5
|
+
# - .env 파일 생성
|
|
6
|
+
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
9
|
+
HOOKS_DIR="$SCRIPT_DIR/hooks"
|
|
10
|
+
|
|
11
|
+
echo "=========================================="
|
|
12
|
+
echo " Claudeship 프로젝트 초기 설정"
|
|
13
|
+
echo "=========================================="
|
|
14
|
+
echo ""
|
|
15
|
+
|
|
16
|
+
# ===========================================
|
|
17
|
+
# 1. Git hooks 설치
|
|
18
|
+
# ===========================================
|
|
19
|
+
setup_git_hooks() {
|
|
20
|
+
GIT_HOOKS_DIR="$(git rev-parse --git-dir 2>/dev/null)/hooks"
|
|
21
|
+
|
|
22
|
+
if [ ! -d "$GIT_HOOKS_DIR" ]; then
|
|
23
|
+
echo "⚠️ Git 저장소가 아닙니다. Git hooks 설치를 건너뜁니다."
|
|
24
|
+
return
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
echo "📌 Git hooks 설치 중..."
|
|
28
|
+
|
|
29
|
+
for hook in "$HOOKS_DIR"/*; do
|
|
30
|
+
if [ -f "$hook" ]; then
|
|
31
|
+
hook_name=$(basename "$hook")
|
|
32
|
+
cp "$hook" "$GIT_HOOKS_DIR/$hook_name"
|
|
33
|
+
chmod +x "$GIT_HOOKS_DIR/$hook_name"
|
|
34
|
+
echo " ✓ $hook_name"
|
|
35
|
+
fi
|
|
36
|
+
done
|
|
37
|
+
|
|
38
|
+
echo " 완료!"
|
|
39
|
+
echo ""
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
# ===========================================
|
|
43
|
+
# 2. .env 파일 생성
|
|
44
|
+
# ===========================================
|
|
45
|
+
setup_env_files() {
|
|
46
|
+
echo "📌 환경 설정 파일(.env) 확인 중..."
|
|
47
|
+
|
|
48
|
+
local env_created=false
|
|
49
|
+
|
|
50
|
+
# apps/server/.env
|
|
51
|
+
if [ ! -f "$ROOT_DIR/apps/server/.env" ]; then
|
|
52
|
+
if [ -f "$ROOT_DIR/apps/server/.env.example" ]; then
|
|
53
|
+
cp "$ROOT_DIR/apps/server/.env.example" "$ROOT_DIR/apps/server/.env"
|
|
54
|
+
echo " ✓ apps/server/.env 생성됨"
|
|
55
|
+
env_created=true
|
|
56
|
+
fi
|
|
57
|
+
else
|
|
58
|
+
echo " - apps/server/.env 이미 존재함"
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
# apps/web/.env.local (있으면)
|
|
62
|
+
if [ ! -f "$ROOT_DIR/apps/web/.env.local" ]; then
|
|
63
|
+
if [ -f "$ROOT_DIR/apps/web/.env.local.example" ]; then
|
|
64
|
+
cp "$ROOT_DIR/apps/web/.env.local.example" "$ROOT_DIR/apps/web/.env.local"
|
|
65
|
+
echo " ✓ apps/web/.env.local 생성됨"
|
|
66
|
+
env_created=true
|
|
67
|
+
fi
|
|
68
|
+
else
|
|
69
|
+
echo " - apps/web/.env.local 이미 존재함"
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
if [ "$env_created" = true ]; then
|
|
73
|
+
echo ""
|
|
74
|
+
echo " 💡 생성된 .env 파일을 확인하고 필요한 값을 설정하세요."
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
echo " 완료!"
|
|
78
|
+
echo ""
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
# ===========================================
|
|
82
|
+
# 실행
|
|
83
|
+
# ===========================================
|
|
84
|
+
setup_git_hooks
|
|
85
|
+
setup_env_files
|
|
86
|
+
|
|
87
|
+
echo "=========================================="
|
|
88
|
+
echo " ✅ 초기 설정 완료!"
|
|
89
|
+
echo "=========================================="
|