claudeship 0.2.14 → 0.2.15

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.
Files changed (59) hide show
  1. package/README.md +18 -0
  2. package/apps/server/dist/app.module.js +2 -0
  3. package/apps/server/dist/app.module.js.map +1 -1
  4. package/apps/server/dist/env/env.controller.d.ts +14 -0
  5. package/apps/server/dist/env/env.controller.js +84 -0
  6. package/apps/server/dist/env/env.controller.js.map +1 -0
  7. package/apps/server/dist/env/env.module.d.ts +2 -0
  8. package/apps/server/dist/env/env.module.js +25 -0
  9. package/apps/server/dist/env/env.module.js.map +1 -0
  10. package/apps/server/dist/env/env.service.d.ts +21 -0
  11. package/apps/server/dist/env/env.service.js +194 -0
  12. package/apps/server/dist/env/env.service.js.map +1 -0
  13. package/apps/server/dist/tsconfig.tsbuildinfo +1 -1
  14. package/apps/server/package.json +1 -1
  15. package/apps/web/.next/BUILD_ID +1 -1
  16. package/apps/web/.next/app-build-manifest.json +7 -7
  17. package/apps/web/.next/app-path-routes-manifest.json +2 -2
  18. package/apps/web/.next/build-manifest.json +2 -2
  19. package/apps/web/.next/cache/.previewinfo +1 -1
  20. package/apps/web/.next/cache/.rscinfo +1 -1
  21. package/apps/web/.next/cache/.tsbuildinfo +1 -1
  22. package/apps/web/.next/cache/config.json +3 -3
  23. package/apps/web/.next/cache/eslint/.cache_j3uhuz +1 -1
  24. package/apps/web/.next/cache/webpack/client-production/0.pack +0 -0
  25. package/apps/web/.next/cache/webpack/client-production/index.pack +0 -0
  26. package/apps/web/.next/cache/webpack/edge-server-production/index.pack +0 -0
  27. package/apps/web/.next/cache/webpack/server-production/0.pack +0 -0
  28. package/apps/web/.next/cache/webpack/server-production/index.pack +0 -0
  29. package/apps/web/.next/prerender-manifest.json +13 -13
  30. package/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  31. package/apps/web/.next/server/app/_not-found.html +1 -1
  32. package/apps/web/.next/server/app/_not-found.rsc +2 -2
  33. package/apps/web/.next/server/app/index.html +1 -1
  34. package/apps/web/.next/server/app/index.rsc +3 -3
  35. package/apps/web/.next/server/app/page.js +2 -2
  36. package/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  37. package/apps/web/.next/server/app/project/[id]/page.js +2 -2
  38. package/apps/web/.next/server/app/project/[id]/page_client-reference-manifest.js +1 -1
  39. package/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  40. package/apps/web/.next/server/app/settings.html +1 -1
  41. package/apps/web/.next/server/app/settings.rsc +2 -2
  42. package/apps/web/.next/server/app-paths-manifest.json +2 -2
  43. package/apps/web/.next/server/pages/404.html +1 -1
  44. package/apps/web/.next/server/pages/500.html +1 -1
  45. package/apps/web/.next/server/server-reference-manifest.json +1 -1
  46. package/apps/web/.next/static/chunks/574-1fe2bcd6cfb41646.js +1 -0
  47. package/apps/web/.next/static/chunks/app/page-f19cfa58541ca83d.js +1 -0
  48. package/apps/web/.next/static/chunks/app/project/[id]/page-dffaa1d02f012216.js +1 -0
  49. package/apps/web/.next/static/css/0a24552d9794f8c8.css +3 -0
  50. package/apps/web/.next/trace +18 -18
  51. package/apps/web/package.json +1 -1
  52. package/apps/web/src/components/workspace/WorkspaceLayout.tsx +66 -4
  53. package/package.json +1 -1
  54. package/apps/web/.next/static/chunks/712-11fca77fb30a2a06.js +0 -1
  55. package/apps/web/.next/static/chunks/app/page-0db1c152fbd48359.js +0 -1
  56. package/apps/web/.next/static/chunks/app/project/[id]/page-7c44ae18c8984726.js +0 -1
  57. package/apps/web/.next/static/css/d0f1b036f222bc16.css +0 -3
  58. /package/apps/web/.next/static/{tV_Qc76rupeogXvWEMw6p → mkY_TTl_ho_ehDKiX10AN}/_buildManifest.js +0 -0
  59. /package/apps/web/.next/static/{tV_Qc76rupeogXvWEMw6p → mkY_TTl_ho_ehDKiX10AN}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@claudeship/web",
3
- "version": "0.2.14",
3
+ "version": "0.2.15",
4
4
  "private": true,
5
5
  "scripts": {
6
6
  "dev": "node scripts/dev-with-recovery.mjs",
@@ -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 { FolderTree, X } from "lucide-react";
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
- {/* Preview Panel - 70% width */}
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
- <PreviewPanel projectId={projectId} />
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,6 +1,6 @@
1
1
  {
2
2
  "name": "claudeship",
3
- "version": "0.2.14",
3
+ "version": "0.2.15",
4
4
  "description": "AI-Powered App Builder using Claude Code CLI",
5
5
  "bin": {
6
6
  "claudeship": "./bin/claudeship.js"