@shepai/cli 1.69.0 → 1.70.1
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/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts +1 -1
- package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/deployment/deployment-logger.d.ts +7 -0
- package/dist/packages/core/src/infrastructure/services/deployment/deployment-logger.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/deployment/deployment-logger.js +17 -0
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.js +60 -7
- package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.js +13 -6
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +17 -2
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/CLAUDE.md +45 -18
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/alacritty.json +18 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/iterm2.json +17 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/kitty.json +18 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/tmux.json +27 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/warp.json +17 -0
- package/dist/src/presentation/web/app/actions/deploy-feature.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/deploy-feature.js +11 -0
- package/dist/src/presentation/web/app/actions/deploy-repository.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/deploy-repository.js +8 -0
- package/dist/src/presentation/web/components/features/tools/tool-card.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/tools/tool-card.js +1 -0
- package/dist/src/presentation/web/components/features/tools/tools-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/tools/tools-page-client.js +2 -1
- package/dist/src/presentation/web/hooks/use-deploy-action.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-deploy-action.js +36 -5
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__09413611._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_49bf495c._.js +1 -1
- package/web/.next/server/chunks/ssr/_49bf495c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_68b5e0de._.js +1 -1
- package/web/.next/server/chunks/ssr/_68b5e0de._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_690ea95f._.js +1 -1
- package/web/.next/server/chunks/ssr/_690ea95f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_725584e5._.js +1 -1
- package/web/.next/server/chunks/ssr/_725584e5._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +19 -19
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +18 -18
- package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_49bf495c._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_68b5e0de._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_690ea95f._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_725584e5._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +19 -19
- package/web/.next/standalone/src/presentation/web/app/actions/deploy-feature.ts +16 -0
- package/web/.next/standalone/src/presentation/web/app/actions/deploy-repository.ts +10 -0
- package/web/.next/standalone/src/presentation/web/components/features/tools/tool-card.tsx +1 -0
- package/web/.next/standalone/src/presentation/web/components/features/tools/tools-page-client.tsx +5 -1
- package/web/.next/standalone/src/presentation/web/hooks/use-deploy-action.ts +45 -5
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/16e380b8dd9d11bc.js +1 -0
- package/web/.next/static/chunks/{5bc5d426870feb7e.js → 1ed0df845a1625f6.js} +1 -1
- package/web/.next/static/chunks/{2da52289a4a8f9e2.js → 24e1d97cab8bad6d.js} +1 -1
- package/web/.next/static/chunks/{491ae2bbae40857c.js → 505c6a9e4c5d0808.js} +1 -1
- package/web/.next/static/chunks/{5ef9d8b7401f2f1f.js → 9db5c06001f3e664.js} +2 -2
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/static/chunks/faf8ad4c823884d7.js +0 -1
- /package/web/.next/static/{7ktIn83yR3rYLLF00uLSx → 8xZoRkWykApYNlvamCGUe}/_buildManifest.js +0 -0
- /package/web/.next/static/{7ktIn83yR3rYLLF00uLSx → 8xZoRkWykApYNlvamCGUe}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{7ktIn83yR3rYLLF00uLSx → 8xZoRkWykApYNlvamCGUe}/_ssgManifest.js +0 -0
|
@@ -1,21 +1,29 @@
|
|
|
1
1
|
'use server';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { resolve } from '../../lib/server-container.js';
|
|
4
|
+
import { createDeploymentLogger } from '../../../../../packages/core/src/infrastructure/services/deployment/deployment-logger.js';
|
|
4
5
|
import { DeploymentState } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
6
|
+
const log = createDeploymentLogger('[deployRepository]');
|
|
5
7
|
export async function deployRepository(repositoryPath) {
|
|
8
|
+
log.info(`called — repositoryPath="${repositoryPath}"`);
|
|
6
9
|
if (!repositoryPath?.startsWith('/')) {
|
|
10
|
+
log.warn('rejected — not an absolute path');
|
|
7
11
|
return { success: false, error: 'repositoryPath must be an absolute path' };
|
|
8
12
|
}
|
|
9
13
|
try {
|
|
10
14
|
if (!existsSync(repositoryPath)) {
|
|
15
|
+
log.warn(`directory does not exist: "${repositoryPath}"`);
|
|
11
16
|
return { success: false, error: `Directory does not exist: ${repositoryPath}` };
|
|
12
17
|
}
|
|
18
|
+
log.info('directory exists, calling deploymentService.start()');
|
|
13
19
|
const deploymentService = resolve('IDeploymentService');
|
|
14
20
|
deploymentService.start(repositoryPath, repositoryPath);
|
|
21
|
+
log.info('start() returned successfully — state=Booting');
|
|
15
22
|
return { success: true, state: DeploymentState.Booting };
|
|
16
23
|
}
|
|
17
24
|
catch (error) {
|
|
18
25
|
const message = error instanceof Error ? error.message : 'Failed to deploy repository';
|
|
26
|
+
log.error(`error: ${message}`, error);
|
|
19
27
|
return { success: false, error: message };
|
|
20
28
|
}
|
|
21
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-card.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/tools/tool-card.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8DAA8D,CAAC;AAE7F,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"tool-card.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/tools/tool-card.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8DAA8D,CAAC;AAE7F,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,aAAa,2CA2JrE"}
|
|
@@ -9,6 +9,7 @@ const TAG_CONFIG = {
|
|
|
9
9
|
ide: { label: 'IDE', icon: Monitor },
|
|
10
10
|
'cli-agent': { label: 'CLI Agent', icon: Terminal },
|
|
11
11
|
vcs: { label: 'VCS', icon: GitBranch },
|
|
12
|
+
terminal: { label: 'Terminal', icon: Terminal },
|
|
12
13
|
};
|
|
13
14
|
export function ToolCard({ tool, onRefresh, className }) {
|
|
14
15
|
const [installDrawerOpen, setInstallDrawerOpen] = useState(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/tools/tools-page-client.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8DAA8D,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"tools-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/tools/tools-page-client.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8DAA8D,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAYD,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CA+EvF"}
|
|
@@ -10,6 +10,7 @@ const TAB_FILTER = {
|
|
|
10
10
|
ide: (tool) => tool.tags.includes('ide'),
|
|
11
11
|
'cli-agent': (tool) => tool.tags.includes('cli-agent'),
|
|
12
12
|
vcs: (tool) => tool.tags.includes('vcs'),
|
|
13
|
+
terminal: (tool) => tool.tags.includes('terminal'),
|
|
13
14
|
};
|
|
14
15
|
export function ToolsPageClient({ tools: initialTools, className }) {
|
|
15
16
|
const [tools, setTools] = useState(initialTools);
|
|
@@ -27,5 +28,5 @@ export function ToolsPageClient({ tools: initialTools, className }) {
|
|
|
27
28
|
}
|
|
28
29
|
}
|
|
29
30
|
const filtered = tools.filter(TAB_FILTER[activeTab]);
|
|
30
|
-
return (_jsxs("div", { "data-testid": "tools-page-client", className: cn('space-y-4', className), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Wrench, { className: "text-muted-foreground h-4 w-4" }), _jsx("h1", { className: "text-sm font-bold tracking-tight", children: "Tools" }), _jsxs("span", { className: "text-muted-foreground text-[10px]", children: [tools.filter((t) => t.status.status === 'available').length, "/", tools.length, " installed"] })] }), _jsxs(Tabs, { value: activeTab, onValueChange: (value) => setActiveTab(value), "data-testid": "tools-page-tabs", children: [_jsxs(TabsList, { className: "h-7", children: [_jsx(TabsTrigger, { value: "all", "data-testid": "tools-tab-all", className: "px-2.5 text-xs", children: "All" }), _jsx(TabsTrigger, { value: "ide", "data-testid": "tools-tab-ide", className: "px-2.5 text-xs", children: "IDEs" }), _jsx(TabsTrigger, { value: "cli-agent", "data-testid": "tools-tab-cli-agent", className: "px-2.5 text-xs", children: "CLI Agents" }), _jsx(TabsTrigger, { value: "vcs", "data-testid": "tools-tab-vcs", className: "px-2.5 text-xs", children: "Version Control" })] }), _jsx(TabsContent, { value: activeTab, className: "mt-3", children: filtered.length === 0 ? (_jsxs("div", { "data-testid": "tools-page-empty", className: "text-muted-foreground flex flex-col items-center justify-center py-12 text-center", children: [_jsx(Wrench, { className: "mb-2 h-6 w-6 opacity-20" }), _jsx("p", { className: "text-xs", children: "No tools in this category." })] })) : (_jsx("div", { "data-testid": "tools-page-grid", className: "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4", children: filtered.map((tool) => (_jsx(ToolCard, { tool: tool, onRefresh: refreshTools }, tool.id))) })) })] })] }));
|
|
31
|
+
return (_jsxs("div", { "data-testid": "tools-page-client", className: cn('space-y-4', className), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Wrench, { className: "text-muted-foreground h-4 w-4" }), _jsx("h1", { className: "text-sm font-bold tracking-tight", children: "Tools" }), _jsxs("span", { className: "text-muted-foreground text-[10px]", children: [tools.filter((t) => t.status.status === 'available').length, "/", tools.length, " installed"] })] }), _jsxs(Tabs, { value: activeTab, onValueChange: (value) => setActiveTab(value), "data-testid": "tools-page-tabs", children: [_jsxs(TabsList, { className: "h-7", children: [_jsx(TabsTrigger, { value: "all", "data-testid": "tools-tab-all", className: "px-2.5 text-xs", children: "All" }), _jsx(TabsTrigger, { value: "ide", "data-testid": "tools-tab-ide", className: "px-2.5 text-xs", children: "IDEs" }), _jsx(TabsTrigger, { value: "cli-agent", "data-testid": "tools-tab-cli-agent", className: "px-2.5 text-xs", children: "CLI Agents" }), _jsx(TabsTrigger, { value: "vcs", "data-testid": "tools-tab-vcs", className: "px-2.5 text-xs", children: "Version Control" }), _jsx(TabsTrigger, { value: "terminal", "data-testid": "tools-tab-terminal", className: "px-2.5 text-xs", children: "Terminals" })] }), _jsx(TabsContent, { value: activeTab, className: "mt-3", children: filtered.length === 0 ? (_jsxs("div", { "data-testid": "tools-page-empty", className: "text-muted-foreground flex flex-col items-center justify-center py-12 text-center", children: [_jsx(Wrench, { className: "mb-2 h-6 w-6 opacity-20" }), _jsx("p", { className: "text-xs", children: "No tools in this category." })] })) : (_jsx("div", { "data-testid": "tools-page-grid", className: "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4", children: filtered.map((tool) => (_jsx(ToolCard, { tool: tool, onRefresh: refreshTools }, tool.id))) })) })] })] }));
|
|
31
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-deploy-action.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-deploy-action.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-deploy-action.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-deploy-action.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAM5E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,GAAG,YAAY,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAeD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,iBAAiB,CAgKlF"}
|
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
'use client';
|
|
2
|
+
/* eslint-disable no-console */
|
|
2
3
|
import { useState, useCallback, useRef, useEffect } from 'react';
|
|
3
4
|
import { deployFeature } from '../app/actions/deploy-feature.js';
|
|
4
5
|
import { deployRepository } from '../app/actions/deploy-repository.js';
|
|
5
6
|
import { stopDeployment } from '../app/actions/stop-deployment.js';
|
|
6
7
|
import { getDeploymentStatus } from '../app/actions/get-deployment-status.js';
|
|
8
|
+
const PREFIX = '[useDeployAction]';
|
|
9
|
+
const isDebug = !!process.env.NEXT_PUBLIC_DEBUG;
|
|
10
|
+
const noop = () => undefined;
|
|
11
|
+
const log = {
|
|
12
|
+
info: isDebug ? (...args) => console.info(PREFIX, ...args) : noop,
|
|
13
|
+
debug: isDebug ? (...args) => console.debug(PREFIX, ...args) : noop,
|
|
14
|
+
warn: (...args) => console.warn(PREFIX, ...args),
|
|
15
|
+
error: (...args) => console.error(PREFIX, ...args),
|
|
16
|
+
};
|
|
7
17
|
const ERROR_CLEAR_DELAY = 5000;
|
|
8
18
|
const POLL_INTERVAL = 3000;
|
|
9
19
|
export function useDeployAction(input) {
|
|
@@ -33,12 +43,14 @@ export function useDeployAction(input) {
|
|
|
33
43
|
}, []);
|
|
34
44
|
const stopPolling = useCallback(() => {
|
|
35
45
|
if (pollIntervalRef.current) {
|
|
46
|
+
log.debug('stopping polling');
|
|
36
47
|
clearInterval(pollIntervalRef.current);
|
|
37
48
|
pollIntervalRef.current = null;
|
|
38
49
|
}
|
|
39
50
|
}, []);
|
|
40
51
|
const startPolling = useCallback((targetId) => {
|
|
41
52
|
stopPolling();
|
|
53
|
+
log.debug(`starting polling for "${targetId}" every ${POLL_INTERVAL}ms`);
|
|
42
54
|
pollIntervalRef.current = setInterval(async () => {
|
|
43
55
|
if (!mountedRef.current) {
|
|
44
56
|
stopPolling();
|
|
@@ -48,19 +60,30 @@ export function useDeployAction(input) {
|
|
|
48
60
|
if (!mountedRef.current)
|
|
49
61
|
return;
|
|
50
62
|
if (!result || result.state === 'Stopped') {
|
|
63
|
+
log.info(`poll result: ${result ? `state=${result.state}` : 'null (deployment gone)'} — stopping poll`);
|
|
51
64
|
setStatus(null);
|
|
52
65
|
setUrl(null);
|
|
53
66
|
stopPolling();
|
|
54
67
|
}
|
|
55
68
|
else {
|
|
69
|
+
if (result.state !== status) {
|
|
70
|
+
log.info(`poll state changed: ${status} → ${result.state}, url=${result.url}`);
|
|
71
|
+
}
|
|
56
72
|
setStatus(result.state);
|
|
57
73
|
setUrl(result.url);
|
|
58
74
|
}
|
|
59
75
|
}, POLL_INTERVAL);
|
|
60
|
-
}, [stopPolling]);
|
|
76
|
+
}, [stopPolling, status]);
|
|
61
77
|
const handleDeploy = useCallback(async () => {
|
|
62
|
-
if (!input
|
|
78
|
+
if (!input) {
|
|
79
|
+
log.warn('deploy() called but input is null — no-op');
|
|
63
80
|
return;
|
|
81
|
+
}
|
|
82
|
+
if (deployLoading) {
|
|
83
|
+
log.warn('deploy() called but already loading — no-op');
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
log.info(`deploy() — targetType="${input.targetType}", targetId="${input.targetId}", repositoryPath="${input.repositoryPath}"`);
|
|
64
87
|
if (errorTimerRef.current)
|
|
65
88
|
clearTimeout(errorTimerRef.current);
|
|
66
89
|
setDeployLoading(true);
|
|
@@ -69,14 +92,19 @@ export function useDeployAction(input) {
|
|
|
69
92
|
const result = input.targetType === 'feature'
|
|
70
93
|
? await deployFeature(input.targetId)
|
|
71
94
|
: await deployRepository(input.repositoryPath);
|
|
72
|
-
|
|
95
|
+
log.info('server action result:', result);
|
|
96
|
+
if (!mountedRef.current) {
|
|
97
|
+
log.warn('component unmounted after deploy — discarding result');
|
|
73
98
|
return;
|
|
99
|
+
}
|
|
74
100
|
if (!result.success) {
|
|
75
101
|
const errorMessage = result.error ?? 'An unexpected error occurred';
|
|
102
|
+
log.error(`deploy failed: ${errorMessage}`);
|
|
76
103
|
setDeployError(errorMessage);
|
|
77
104
|
errorTimerRef.current = setTimeout(() => setDeployError(null), ERROR_CLEAR_DELAY);
|
|
78
105
|
}
|
|
79
106
|
else {
|
|
107
|
+
log.info(`deploy succeeded — initial state=${result.state}, starting polling`);
|
|
80
108
|
setStatus(result.state ?? null);
|
|
81
109
|
setUrl(null);
|
|
82
110
|
startPolling(input.targetId);
|
|
@@ -86,6 +114,7 @@ export function useDeployAction(input) {
|
|
|
86
114
|
if (!mountedRef.current)
|
|
87
115
|
return;
|
|
88
116
|
const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred';
|
|
117
|
+
log.error(`deploy threw exception: ${errorMessage}`, err);
|
|
89
118
|
setDeployError(errorMessage);
|
|
90
119
|
errorTimerRef.current = setTimeout(() => setDeployError(null), ERROR_CLEAR_DELAY);
|
|
91
120
|
}
|
|
@@ -98,9 +127,11 @@ export function useDeployAction(input) {
|
|
|
98
127
|
const handleStop = useCallback(async () => {
|
|
99
128
|
if (!input || stopLoading)
|
|
100
129
|
return;
|
|
130
|
+
log.info(`stop() — targetId="${input.targetId}"`);
|
|
101
131
|
setStopLoading(true);
|
|
102
132
|
try {
|
|
103
133
|
const result = await stopDeployment(input.targetId);
|
|
134
|
+
log.info('stop result:', result);
|
|
104
135
|
if (!mountedRef.current)
|
|
105
136
|
return;
|
|
106
137
|
if (result.success) {
|
|
@@ -109,8 +140,8 @@ export function useDeployAction(input) {
|
|
|
109
140
|
setUrl(null);
|
|
110
141
|
}
|
|
111
142
|
}
|
|
112
|
-
catch {
|
|
113
|
-
|
|
143
|
+
catch (err) {
|
|
144
|
+
log.warn('stop error (non-critical):', err);
|
|
114
145
|
}
|
|
115
146
|
finally {
|
|
116
147
|
if (mountedRef.current) {
|