@shepai/cli 1.169.0-pr523.2f53944 → 1.169.0-pr524.54c51f4

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 (184) hide show
  1. package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.d.ts +1 -0
  2. package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.js +37 -1
  4. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js +1 -1
  5. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.js +1 -1
  6. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js +1 -1
  7. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +1 -1
  8. package/dist/src/presentation/cli/commands/upgrade.command.d.ts.map +1 -1
  9. package/dist/src/presentation/cli/commands/upgrade.command.js +45 -2
  10. package/dist/translations/ar/cli.json +2 -0
  11. package/dist/translations/de/cli.json +2 -0
  12. package/dist/translations/en/cli.json +2 -0
  13. package/dist/translations/es/cli.json +2 -0
  14. package/dist/translations/fr/cli.json +2 -0
  15. package/dist/translations/he/cli.json +2 -0
  16. package/dist/translations/pt/cli.json +2 -0
  17. package/dist/translations/ru/cli.json +2 -0
  18. package/dist/tsconfig.build.tsbuildinfo +1 -1
  19. package/package.json +1 -2
  20. package/web/.next/BUILD_ID +1 -1
  21. package/web/.next/build-manifest.json +2 -2
  22. package/web/.next/fallback-build-manifest.json +2 -2
  23. package/web/.next/prerender-manifest.json +3 -3
  24. package/web/.next/required-server-files.js +1 -1
  25. package/web/.next/required-server-files.json +1 -1
  26. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  27. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  28. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  29. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  30. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  31. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  32. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
  33. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  34. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  35. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
  36. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  37. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  38. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +38 -38
  39. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  40. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  42. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  45. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  46. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  48. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  49. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
  51. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  52. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
  54. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +38 -38
  57. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  58. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  59. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  60. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  61. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  62. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  63. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  64. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  65. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  66. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  67. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  68. package/web/.next/server/app/_global-error.html +2 -2
  69. package/web/.next/server/app/_global-error.rsc +1 -1
  70. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  71. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  72. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  73. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  74. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  75. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  76. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  77. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/features/page/server-reference-manifest.json +6 -6
  79. package/web/.next/server/app/features/page.js.nft.json +1 -1
  80. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  81. package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
  82. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  83. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  85. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  86. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  88. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  89. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  91. package/web/.next/server/app/version/page.js.nft.json +1 -1
  92. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  93. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  94. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  95. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  96. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  97. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__7ffd3598._.js +2 -2
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__7ffd3598._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js +2 -2
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__e88da4ee._.js +1 -1
  118. package/web/.next/server/chunks/ssr/_02e01240._.js +1 -1
  119. package/web/.next/server/chunks/ssr/_02e01240._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  121. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/_0727935d._.js +1 -1
  123. package/web/.next/server/chunks/ssr/_0727935d._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  125. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/_18886033._.js +1 -1
  127. package/web/.next/server/chunks/ssr/_18886033._.js.map +1 -1
  128. package/web/.next/server/chunks/ssr/_22e00a14._.js +1 -1
  129. package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -1
  130. package/web/.next/server/chunks/ssr/{_6e9b9005._.js → _312a7379._.js} +2 -2
  131. package/web/.next/server/chunks/ssr/{_6e9b9005._.js.map → _312a7379._.js.map} +1 -1
  132. package/web/.next/server/chunks/ssr/_4cbb7f95._.js +1 -1
  133. package/web/.next/server/chunks/ssr/_4cbb7f95._.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  135. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/{_faecc602._.js → _84019a97._.js} +2 -2
  137. package/web/.next/server/chunks/ssr/{_faecc602._.js.map → _84019a97._.js.map} +1 -1
  138. package/web/.next/server/chunks/ssr/_a1068852._.js +1 -1
  139. package/web/.next/server/chunks/ssr/_a5a5901d._.js +1 -1
  140. package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/_ad09f271._.js +1 -1
  142. package/web/.next/server/chunks/ssr/_ad09f271._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/{_a8b3bc2c._.js → _b0791eff._.js} +2 -2
  144. package/web/.next/server/chunks/ssr/{_a8b3bc2c._.js.map → _b0791eff._.js.map} +1 -1
  145. package/web/.next/server/chunks/ssr/_c3f595c6._.js +1 -1
  146. package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/_ea9e1556._.js +1 -1
  148. package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/_f1ba9be6._.js +2 -2
  150. package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/_f33cd07e._.js +2 -2
  152. package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/_f8b45233._.js +1 -1
  154. package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  156. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  158. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  160. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  161. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  163. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  164. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js +1 -1
  165. package/web/.next/server/pages/500.html +2 -2
  166. package/web/.next/server/server-reference-manifest.js +1 -1
  167. package/web/.next/server/server-reference-manifest.json +48 -48
  168. package/web/.next/static/chunks/{54ea8b84cb2cc0d1.js → 12dbd44d29de81e6.js} +1 -1
  169. package/web/.next/static/chunks/{0ccb9c0b9b1b041f.js → 1c2a7ce17665c0a1.js} +2 -2
  170. package/web/.next/static/chunks/{e6c45e81b87d2959.js → 20568580dfe8b7f5.js} +1 -1
  171. package/web/.next/static/chunks/{c5d2fa6c6353309a.js → 252ef5d9424f1962.js} +1 -1
  172. package/web/.next/static/chunks/{be1d829fb4281be0.js → 253b4cb30306c280.js} +1 -1
  173. package/web/.next/static/chunks/{21acf592ead7608f.js → 2dc3e1fe820e11dc.js} +2 -2
  174. package/web/.next/static/chunks/{c3ef3b892f7794ec.js → 3421835c6fe6fdc9.js} +1 -1
  175. package/web/.next/static/chunks/{e29d3d0d18276e72.js → 452a2aefb87c7ea4.js} +1 -1
  176. package/web/.next/static/chunks/{f7112ebae57c20f9.js → 6a81a9b4c8a91437.js} +1 -1
  177. package/web/.next/static/chunks/{76fc822ad8b3b7e2.js → 7b6f79edae9172eb.js} +1 -1
  178. package/web/.next/static/chunks/{36cb1a6e3e35de17.js → 7d68eecb6c9fb328.js} +1 -1
  179. package/web/.next/static/chunks/{6c2beffb5a815c5a.js → c9dabe754cf4c63a.js} +1 -1
  180. package/web/.next/static/chunks/{65b62ac34ef4422a.js → ef458d654df0eb67.js} +1 -1
  181. package/web/.next/static/chunks/{d888abaf53aa7b66.js → f677f0187ac826b8.js} +2 -2
  182. /package/web/.next/static/{kPxrKArrmlja9IjXEI6-W → Q7nBER7xocT91xgzMb11R}/_buildManifest.js +0 -0
  183. /package/web/.next/static/{kPxrKArrmlja9IjXEI6-W → Q7nBER7xocT91xgzMb11R}/_clientMiddlewareManifest.json +0 -0
  184. /package/web/.next/static/{kPxrKArrmlja9IjXEI6-W → Q7nBER7xocT91xgzMb11R}/_ssgManifest.js +0 -0
@@ -24,6 +24,7 @@ export declare class UpgradeCliUseCase {
24
24
  constructor(versionService: IVersionService, daemonService: IDaemonService);
25
25
  execute(onOutput?: (data: string) => void): Promise<UpgradeResult>;
26
26
  private getLatestVersion;
27
+ private preDownloadPackage;
27
28
  /**
28
29
  * Schedule a daemon self-restart after upgrade.
29
30
  * Reads the current daemon port, spawns a new daemon process with the
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade-cli.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yDAAyD,CAAC;AAE9F,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAOD,qBACa,iBAAiB;IAG1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAFb,cAAc,EAAE,eAAe,EAE/B,aAAa,EAAE,cAAc;IAG1C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAkCxE,OAAO,CAAC,gBAAgB;IA6CxB;;;;OAIG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B5C,OAAO,CAAC,aAAa;CAuBtB"}
1
+ {"version":3,"file":"upgrade-cli.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yDAAyD,CAAC;AAE9F,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAQD,qBACa,iBAAiB;IAG1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAFb,cAAc,EAAE,eAAe,EAE/B,aAAa,EAAE,cAAc;IAG1C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAyCxE,OAAO,CAAC,gBAAgB;IA6CxB,OAAO,CAAC,kBAAkB;IAkC1B;;;;OAIG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B5C,OAAO,CAAC,aAAa;CAuBtB"}
@@ -25,6 +25,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
25
25
  import { injectable, inject } from 'tsyringe';
26
26
  import { spawn } from 'node:child_process';
27
27
  const VERSION_CHECK_TIMEOUT_MS = 10_000;
28
+ const NPM_CACHE_ADD_TIMEOUT_MS = 120_000;
28
29
  /** Delay (ms) before the current process exits to allow the SSE response to flush. */
29
30
  const SELF_RESTART_DELAY_MS = 1_000;
30
31
  let UpgradeCliUseCase = class UpgradeCliUseCase {
@@ -43,8 +44,14 @@ let UpgradeCliUseCase = class UpgradeCliUseCase {
43
44
  onOutput?.(`Already up to date (v${currentVersion})\n`);
44
45
  return { status: 'up-to-date', currentVersion, latestVersion };
45
46
  }
46
- // 3. Run upgrade
47
+ // 3. Pre-download the package into npm cache before install
47
48
  const target = latestVersion ? `v${latestVersion}` : 'latest';
49
+ onOutput?.(`Downloading @shepai/cli@latest...\n`);
50
+ const cached = await this.preDownloadPackage();
51
+ if (!cached) {
52
+ onOutput?.('Pre-download did not complete — proceeding with install...\n');
53
+ }
54
+ // 4. Run install (fast if cached)
48
55
  onOutput?.(`Upgrading from v${currentVersion} to ${target}...\n`);
49
56
  try {
50
57
  const exitCode = await this.runNpmInstall(onOutput);
@@ -104,6 +111,35 @@ let UpgradeCliUseCase = class UpgradeCliUseCase {
104
111
  });
105
112
  });
106
113
  }
114
+ preDownloadPackage() {
115
+ return new Promise((resolve) => {
116
+ let settled = false;
117
+ const child = spawn('npm', ['cache', 'add', '@shepai/cli@latest'], {
118
+ stdio: ['ignore', 'ignore', 'pipe'],
119
+ });
120
+ const timeout = setTimeout(() => {
121
+ if (!settled) {
122
+ settled = true;
123
+ child.kill();
124
+ resolve(false);
125
+ }
126
+ }, NPM_CACHE_ADD_TIMEOUT_MS);
127
+ child.on('close', (code) => {
128
+ if (!settled) {
129
+ settled = true;
130
+ clearTimeout(timeout);
131
+ resolve(code === 0);
132
+ }
133
+ });
134
+ child.on('error', () => {
135
+ if (!settled) {
136
+ settled = true;
137
+ clearTimeout(timeout);
138
+ resolve(false);
139
+ }
140
+ });
141
+ });
142
+ }
107
143
  /**
108
144
  * Schedule a daemon self-restart after upgrade.
109
145
  * Reads the current daemon port, spawns a new daemon process with the
@@ -86,7 +86,7 @@ export function createEvidenceNode(executor) {
86
86
  const commitEvidence = state.commitEvidence;
87
87
  const settings = hasSettings() ? getSettings() : undefined;
88
88
  const maxRetries = settings?.workflow.evidenceRetries ?? DEFAULT_MAX_RETRIES;
89
- const options = buildExecutorOptions(state, undefined, 'evidence');
89
+ const options = buildExecutorOptions(state);
90
90
  const tasks = parseTasks(state.specDir);
91
91
  // --- Validation retry loop ---
92
92
  let allEvidence = [];
@@ -48,7 +48,7 @@ export function createFastImplementNode(executor) {
48
48
  agentType: executor.agentType,
49
49
  });
50
50
  try {
51
- const options = buildExecutorOptions(state, undefined, 'fast-implement');
51
+ const options = buildExecutorOptions(state);
52
52
  log.info(`Executing agent at cwd=${options.cwd}`);
53
53
  log.info(`Prompt length: ${prompt.length} chars`);
54
54
  const result = await retryExecute(executor, prompt, options, { logger: log });
@@ -112,7 +112,7 @@ export function createImplementNode(executor) {
112
112
  }
113
113
  log.info(`Phase ${phase.id} "${phase.name}" — ${phaseTasks.length} task(s), parallel: ${phase.parallel}`);
114
114
  updateFeatureProgress(state.specDir, completedTasks, totalTasks, `implementing-${phase.id}`, phaseTasks[0].id, log);
115
- const options = buildExecutorOptions(state, undefined, 'implement');
115
+ const options = buildExecutorOptions(state);
116
116
  const promptContext = { isLastPhase, phaseIndex: i, totalPhases };
117
117
  const phaseStartTime = Date.now();
118
118
  const phaseTimingId = await recordPhaseStart(`implement:${phase.id}`, {
@@ -83,7 +83,7 @@ export function createMergeNode(deps) {
83
83
  const feature = await deps.featureRepository.findById(state.featureId);
84
84
  const branch = feature?.branch ?? `feat/${state.featureId}`;
85
85
  const baseBranch = await deps.getDefaultBranch(cwd);
86
- const options = buildExecutorOptions(state, undefined, 'merge');
86
+ const options = buildExecutorOptions(state);
87
87
  let commitHash = state.commitHash;
88
88
  let prUrl = state.prUrl;
89
89
  let prNumber = state.prNumber;
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/upgrade.command.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,IAAI,YAAY,EAAqB,MAAM,oBAAoB,CAAC;AAS9E,KAAK,OAAO,GAAG,OAAO,YAAY,CAAC;AA8EnC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,OAAsB,GAAG,OAAO,CAqE7E"}
1
+ {"version":3,"file":"upgrade.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/upgrade.command.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,IAAI,YAAY,EAAqB,MAAM,oBAAoB,CAAC;AAS9E,KAAK,OAAO,GAAG,OAAO,YAAY,CAAC;AAuHnC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,OAAsB,GAAG,OAAO,CA6E7E"}
@@ -14,6 +14,7 @@ import { getCliI18n } from '../i18n.js';
14
14
  import { stopDaemon } from './daemon/stop-daemon.js';
15
15
  import { startDaemon } from './daemon/start-daemon.js';
16
16
  const VERSION_CHECK_TIMEOUT_MS = 10_000;
17
+ const NPM_CACHE_ADD_TIMEOUT_MS = 120_000;
17
18
  /** On Windows, npm is a .cmd batch file — spawn() needs shell: true to resolve it. */
18
19
  const IS_WINDOWS = process.platform === 'win32';
19
20
  /**
@@ -61,6 +62,41 @@ function getLatestVersion(spawnFn) {
61
62
  });
62
63
  });
63
64
  }
65
+ /**
66
+ * Pre-download the package into npm's cache so the subsequent install is fast.
67
+ * Uses `npm cache add` which downloads without installing.
68
+ * Returns true if the cache add succeeded, false otherwise (fail-open).
69
+ */
70
+ function preDownloadPackage(spawnFn) {
71
+ return new Promise((resolve) => {
72
+ let settled = false;
73
+ const child = spawnFn('npm', ['cache', 'add', '@shepai/cli@latest'], {
74
+ stdio: ['ignore', 'ignore', 'pipe'],
75
+ ...(IS_WINDOWS && { shell: true }),
76
+ });
77
+ const timeout = setTimeout(() => {
78
+ if (!settled) {
79
+ settled = true;
80
+ child.kill();
81
+ resolve(false);
82
+ }
83
+ }, NPM_CACHE_ADD_TIMEOUT_MS);
84
+ child.on('close', (code) => {
85
+ if (!settled) {
86
+ settled = true;
87
+ clearTimeout(timeout);
88
+ resolve(code === 0);
89
+ }
90
+ });
91
+ child.on('error', () => {
92
+ if (!settled) {
93
+ settled = true;
94
+ clearTimeout(timeout);
95
+ resolve(false);
96
+ }
97
+ });
98
+ });
99
+ }
64
100
  /**
65
101
  * Run npm i -g @shepai/cli@latest with inherited stdio.
66
102
  * Returns the exit code, or rejects on spawn error.
@@ -107,7 +143,14 @@ export function createUpgradeCommand(spawnFn = defaultSpawn) {
107
143
  else {
108
144
  messages.info(t('cli:commands.upgrade.upgradingToLatest', { current: currentVersion }));
109
145
  }
110
- // 4. Check daemon state before install (FR-1)
146
+ // 4. Pre-download the package into npm cache BEFORE stopping the daemon.
147
+ // This minimizes downtime — the actual install will read from cache.
148
+ messages.info(t('cli:commands.upgrade.downloadingPackage'));
149
+ const cached = await preDownloadPackage(spawnFn);
150
+ if (!cached) {
151
+ messages.warning(t('cli:commands.upgrade.downloadFailed'));
152
+ }
153
+ // 5. Check daemon state and stop if running
111
154
  const daemonService = container.resolve('IDaemonService');
112
155
  const daemonState = await daemonService.read();
113
156
  const daemonWasRunning = daemonState !== null && daemonService.isAlive(daemonState.pid);
@@ -116,7 +159,7 @@ export function createUpgradeCommand(spawnFn = defaultSpawn) {
116
159
  messages.info(t('cli:commands.upgrade.stoppingDaemon'));
117
160
  await stopDaemon(daemonService);
118
161
  }
119
- // 5. Run npm i -g @shepai/cli@latest; always restore daemon in finally (FR-2, FR-3)
162
+ // 6. Run npm i -g @shepai/cli@latest; always restore daemon in finally
120
163
  let installExitCode = 1;
121
164
  try {
122
165
  installExitCode = await runNpmInstall(spawnFn);
@@ -565,6 +565,8 @@
565
565
  "alreadyUpToDate": "محدّث بالفعل (v{{version}})",
566
566
  "upgradingFromTo": "الترقية من v{{current}} إلى v{{latest}}",
567
567
  "upgradingToLatest": "الترقية من v{{current}} إلى الأحدث",
568
+ "downloadingPackage": "جارٍ تنزيل الإصدار الجديد...",
569
+ "downloadFailed": "لم يكتمل التنزيل المسبق — المتابعة بالتثبيت",
568
570
  "stoppingDaemon": "جارٍ إيقاف الخدمة الخلفية قبل الترقية...",
569
571
  "restartingDaemon": "جارٍ إعادة تشغيل الخدمة الخلفية...",
570
572
  "daemonRestarted": "تمت إعادة تشغيل الخدمة الخلفية بنجاح.",
@@ -565,6 +565,8 @@
565
565
  "alreadyUpToDate": "Bereits aktuell (v{{version}})",
566
566
  "upgradingFromTo": "Aktualisierung von v{{current}} auf v{{latest}}",
567
567
  "upgradingToLatest": "Aktualisierung von v{{current}} auf die neueste Version",
568
+ "downloadingPackage": "Neue Version wird heruntergeladen...",
569
+ "downloadFailed": "Vorab-Download nicht abgeschlossen — Installation wird fortgesetzt",
568
570
  "stoppingDaemon": "Dienst wird vor Aktualisierung gestoppt...",
569
571
  "restartingDaemon": "Dienst wird neu gestartet...",
570
572
  "daemonRestarted": "Dienst erfolgreich neu gestartet.",
@@ -565,6 +565,8 @@
565
565
  "alreadyUpToDate": "Already up to date (v{{version}})",
566
566
  "upgradingFromTo": "Upgrading from v{{current}} to v{{latest}}",
567
567
  "upgradingToLatest": "Upgrading from v{{current}} to latest",
568
+ "downloadingPackage": "Downloading new version...",
569
+ "downloadFailed": "Pre-download did not complete — proceeding with install",
568
570
  "stoppingDaemon": "Stopping daemon before upgrade...",
569
571
  "restartingDaemon": "Restarting daemon...",
570
572
  "daemonRestarted": "Daemon restarted successfully.",
@@ -565,6 +565,8 @@
565
565
  "alreadyUpToDate": "Ya está actualizado (v{{version}})",
566
566
  "upgradingFromTo": "Actualizando de v{{current}} a v{{latest}}",
567
567
  "upgradingToLatest": "Actualizando de v{{current}} a la última versión",
568
+ "downloadingPackage": "Descargando nueva versión...",
569
+ "downloadFailed": "La descarga previa no se completó — continuando con la instalación",
568
570
  "stoppingDaemon": "Deteniendo el demonio antes de actualizar...",
569
571
  "restartingDaemon": "Reiniciando el demonio...",
570
572
  "daemonRestarted": "Demonio reiniciado exitosamente.",
@@ -565,6 +565,8 @@
565
565
  "alreadyUpToDate": "Déjà à jour (v{{version}})",
566
566
  "upgradingFromTo": "Mise à jour de v{{current}} vers v{{latest}}",
567
567
  "upgradingToLatest": "Mise à jour de v{{current}} vers la dernière version",
568
+ "downloadingPackage": "Téléchargement de la nouvelle version...",
569
+ "downloadFailed": "Le pré-téléchargement n'a pas abouti — poursuite de l'installation",
568
570
  "stoppingDaemon": "Arrêt du démon avant la mise à jour...",
569
571
  "restartingDaemon": "Redémarrage du démon...",
570
572
  "daemonRestarted": "Démon redémarré avec succès.",
@@ -565,6 +565,8 @@
565
565
  "alreadyUpToDate": "כבר מעודכן (v{{version}})",
566
566
  "upgradingFromTo": "משדרג מ-v{{current}} ל-v{{latest}}",
567
567
  "upgradingToLatest": "משדרג מ-v{{current}} לגרסה האחרונה",
568
+ "downloadingPackage": "מוריד גרסה חדשה...",
569
+ "downloadFailed": "ההורדה המוקדמת לא הושלמה — ממשיך בהתקנה",
568
570
  "stoppingDaemon": "עוצר תהליך לפני שדרוג...",
569
571
  "restartingDaemon": "מפעיל מחדש תהליך...",
570
572
  "daemonRestarted": "התהליך הופעל מחדש בהצלחה.",
@@ -565,6 +565,8 @@
565
565
  "alreadyUpToDate": "Já está atualizado (v{{version}})",
566
566
  "upgradingFromTo": "Atualizando de v{{current}} para v{{latest}}",
567
567
  "upgradingToLatest": "Atualizando de v{{current}} para a mais recente",
568
+ "downloadingPackage": "Baixando nova versão...",
569
+ "downloadFailed": "Download prévio não concluído — prosseguindo com a instalação",
568
570
  "stoppingDaemon": "Parando daemon antes da atualização...",
569
571
  "restartingDaemon": "Reiniciando daemon...",
570
572
  "daemonRestarted": "Daemon reiniciado com sucesso.",
@@ -565,6 +565,8 @@
565
565
  "alreadyUpToDate": "Уже актуальная версия (v{{version}})",
566
566
  "upgradingFromTo": "Обновление с v{{current}} до v{{latest}}",
567
567
  "upgradingToLatest": "Обновление с v{{current}} до последней версии",
568
+ "downloadingPackage": "Загрузка новой версии...",
569
+ "downloadFailed": "Предварительная загрузка не завершена — продолжение установки",
568
570
  "stoppingDaemon": "Остановка демона перед обновлением...",
569
571
  "restartingDaemon": "Перезапуск демона...",
570
572
  "daemonRestarted": "Демон успешно перезапущен.",