@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.
Files changed (136) hide show
  1. package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts +1 -1
  2. package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts.map +1 -1
  3. package/dist/packages/core/src/infrastructure/services/deployment/deployment-logger.d.ts +7 -0
  4. package/dist/packages/core/src/infrastructure/services/deployment/deployment-logger.d.ts.map +1 -0
  5. package/dist/packages/core/src/infrastructure/services/deployment/deployment-logger.js +17 -0
  6. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map +1 -1
  7. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.js +60 -7
  8. package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.d.ts.map +1 -1
  9. package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.js +13 -6
  10. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts +2 -1
  11. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +17 -2
  13. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +1 -1
  14. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/CLAUDE.md +45 -18
  16. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/alacritty.json +18 -0
  17. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/iterm2.json +17 -0
  18. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/kitty.json +18 -0
  19. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/tmux.json +27 -0
  20. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/warp.json +17 -0
  21. package/dist/src/presentation/web/app/actions/deploy-feature.d.ts.map +1 -1
  22. package/dist/src/presentation/web/app/actions/deploy-feature.js +11 -0
  23. package/dist/src/presentation/web/app/actions/deploy-repository.d.ts.map +1 -1
  24. package/dist/src/presentation/web/app/actions/deploy-repository.js +8 -0
  25. package/dist/src/presentation/web/components/features/tools/tool-card.d.ts.map +1 -1
  26. package/dist/src/presentation/web/components/features/tools/tool-card.js +1 -0
  27. package/dist/src/presentation/web/components/features/tools/tools-page-client.d.ts.map +1 -1
  28. package/dist/src/presentation/web/components/features/tools/tools-page-client.js +2 -1
  29. package/dist/src/presentation/web/hooks/use-deploy-action.d.ts.map +1 -1
  30. package/dist/src/presentation/web/hooks/use-deploy-action.js +36 -5
  31. package/dist/tsconfig.build.tsbuildinfo +1 -1
  32. package/package.json +1 -1
  33. package/web/.next/BUILD_ID +1 -1
  34. package/web/.next/build-manifest.json +2 -2
  35. package/web/.next/cache/.previewinfo +1 -1
  36. package/web/.next/cache/.rscinfo +1 -1
  37. package/web/.next/cache/.tsbuildinfo +1 -1
  38. package/web/.next/cache/config.json +3 -3
  39. package/web/.next/fallback-build-manifest.json +2 -2
  40. package/web/.next/prerender-manifest.json +3 -3
  41. package/web/.next/required-server-files.js +1 -1
  42. package/web/.next/required-server-files.json +1 -1
  43. package/web/.next/server/app/_global-error.html +2 -2
  44. package/web/.next/server/app/_global-error.rsc +1 -1
  45. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  46. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  47. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  48. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  49. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  50. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  51. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/page/server-reference-manifest.json +18 -18
  53. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  54. package/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
  55. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  57. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  59. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/chunks/[root-of-the-server]__09413611._.js.map +1 -1
  61. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  62. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
  63. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  64. package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
  65. package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js.map +1 -1
  66. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  67. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  68. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  69. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  70. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
  71. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
  72. package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +2 -2
  73. package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js.map +1 -1
  74. package/web/.next/server/chunks/ssr/_49bf495c._.js +1 -1
  75. package/web/.next/server/chunks/ssr/_49bf495c._.js.map +1 -1
  76. package/web/.next/server/chunks/ssr/_68b5e0de._.js +1 -1
  77. package/web/.next/server/chunks/ssr/_68b5e0de._.js.map +1 -1
  78. package/web/.next/server/chunks/ssr/_690ea95f._.js +1 -1
  79. package/web/.next/server/chunks/ssr/_690ea95f._.js.map +1 -1
  80. package/web/.next/server/chunks/ssr/_725584e5._.js +1 -1
  81. package/web/.next/server/chunks/ssr/_725584e5._.js.map +1 -1
  82. package/web/.next/server/pages/500.html +2 -2
  83. package/web/.next/server/server-reference-manifest.js +1 -1
  84. package/web/.next/server/server-reference-manifest.json +19 -19
  85. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  86. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  87. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  88. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  89. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  90. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  91. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  92. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  93. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  94. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  95. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  96. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  97. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  98. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +18 -18
  99. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  100. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
  101. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  102. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  103. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  104. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  105. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  106. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  107. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  108. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
  109. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  110. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  111. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
  112. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +2 -2
  113. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_49bf495c._.js +1 -1
  114. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_68b5e0de._.js +1 -1
  115. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_690ea95f._.js +1 -1
  116. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_725584e5._.js +1 -1
  117. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  118. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  119. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +19 -19
  120. package/web/.next/standalone/src/presentation/web/app/actions/deploy-feature.ts +16 -0
  121. package/web/.next/standalone/src/presentation/web/app/actions/deploy-repository.ts +10 -0
  122. package/web/.next/standalone/src/presentation/web/components/features/tools/tool-card.tsx +1 -0
  123. package/web/.next/standalone/src/presentation/web/components/features/tools/tools-page-client.tsx +5 -1
  124. package/web/.next/standalone/src/presentation/web/hooks/use-deploy-action.ts +45 -5
  125. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  126. package/web/.next/static/chunks/16e380b8dd9d11bc.js +1 -0
  127. package/web/.next/static/chunks/{5bc5d426870feb7e.js → 1ed0df845a1625f6.js} +1 -1
  128. package/web/.next/static/chunks/{2da52289a4a8f9e2.js → 24e1d97cab8bad6d.js} +1 -1
  129. package/web/.next/static/chunks/{491ae2bbae40857c.js → 505c6a9e4c5d0808.js} +1 -1
  130. package/web/.next/static/chunks/{5ef9d8b7401f2f1f.js → 9db5c06001f3e664.js} +2 -2
  131. package/web/.next/trace +1 -1
  132. package/web/.next/trace-build +1 -1
  133. package/web/.next/static/chunks/faf8ad4c823884d7.js +0 -1
  134. /package/web/.next/static/{7ktIn83yR3rYLLF00uLSx → 8xZoRkWykApYNlvamCGUe}/_buildManifest.js +0 -0
  135. /package/web/.next/static/{7ktIn83yR3rYLLF00uLSx → 8xZoRkWykApYNlvamCGUe}/_clientMiddlewareManifest.json +0 -0
  136. /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;AAQD,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,aAAa,2CA2JrE"}
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;AAWD,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CA4EvF"}
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":"AAGA,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;AAKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,iBAAiB,CAmIlF"}
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 || deployLoading)
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
- if (!mountedRef.current)
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
- // Stop errors are non-critical; process may have already exited
143
+ catch (err) {
144
+ log.warn('stop error (non-critical):', err);
114
145
  }
115
146
  finally {
116
147
  if (mountedRef.current) {