@shepai/cli 1.62.0 → 1.64.0

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 (221) hide show
  1. package/dist/packages/core/src/application/ports/output/agents/agent-executor-factory.interface.d.ts +18 -0
  2. package/dist/packages/core/src/application/ports/output/agents/agent-executor-factory.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/agents/index.d.ts +1 -1
  4. package/dist/packages/core/src/application/ports/output/agents/index.d.ts.map +1 -1
  5. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts +2 -1
  6. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts.map +1 -1
  7. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.js +7 -0
  8. package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.d.ts +2 -1
  9. package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.d.ts.map +1 -1
  10. package/dist/packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.js +3 -0
  11. package/dist/packages/core/src/infrastructure/services/filesystem/shep-directory.service.d.ts +7 -0
  12. package/dist/packages/core/src/infrastructure/services/filesystem/shep-directory.service.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/services/filesystem/shep-directory.service.js +9 -0
  14. package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +18 -4
  16. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js +1 -1
  17. package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts.map +1 -1
  18. package/dist/src/presentation/cli/commands/daemon/start-daemon.js +24 -15
  19. package/dist/src/presentation/cli/commands/status.command.d.ts +7 -0
  20. package/dist/src/presentation/cli/commands/status.command.d.ts.map +1 -1
  21. package/dist/src/presentation/cli/commands/status.command.js +167 -3
  22. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts +17 -0
  23. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts.map +1 -0
  24. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +23 -0
  25. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts +22 -0
  26. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts.map +1 -0
  27. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.js +56 -0
  28. package/dist/src/presentation/web/components/common/base-drawer/index.d.ts +2 -0
  29. package/dist/src/presentation/web/components/common/base-drawer/index.d.ts.map +1 -0
  30. package/dist/src/presentation/web/components/common/base-drawer/index.js +1 -0
  31. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  32. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +9 -16
  33. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +1 -1
  34. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +1 -1
  35. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
  36. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +14 -14
  37. package/dist/src/presentation/web/components/common/repository-node/index.d.ts +1 -0
  38. package/dist/src/presentation/web/components/common/repository-node/index.d.ts.map +1 -1
  39. package/dist/src/presentation/web/components/common/repository-node/index.js +1 -0
  40. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts +7 -0
  41. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -0
  42. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +12 -0
  43. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts +9 -0
  44. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts.map +1 -0
  45. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +34 -0
  46. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +1 -1
  47. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +4 -6
  48. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  49. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +20 -2
  50. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +3 -1
  51. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  52. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +4 -2
  53. package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.d.ts.map +1 -1
  54. package/dist/src/presentation/web/components/features/skills/skill-detail-drawer.js +3 -6
  55. package/dist/tsconfig.build.tsbuildinfo +1 -1
  56. package/package.json +1 -1
  57. package/web/.next/BUILD_ID +1 -1
  58. package/web/.next/build-manifest.json +2 -2
  59. package/web/.next/cache/.previewinfo +1 -1
  60. package/web/.next/cache/.rscinfo +1 -1
  61. package/web/.next/cache/.tsbuildinfo +1 -1
  62. package/web/.next/cache/config.json +3 -3
  63. package/web/.next/fallback-build-manifest.json +2 -2
  64. package/web/.next/prerender-manifest.json +3 -3
  65. package/web/.next/required-server-files.js +1 -1
  66. package/web/.next/required-server-files.json +1 -1
  67. package/web/.next/server/app/_global-error.html +2 -2
  68. package/web/.next/server/app/_global-error.rsc +1 -1
  69. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  70. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  71. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  72. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  73. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  74. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  75. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  76. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/page/server-reference-manifest.json +14 -14
  78. package/web/.next/server/app/page.js.nft.json +1 -1
  79. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/skills/page/server-reference-manifest.json +1 -1
  81. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  82. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  84. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  85. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  86. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  87. package/web/.next/server/app/version/page.js.nft.json +1 -1
  88. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js +3 -0
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js.map +1 -0
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js +3 -0
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js.map +1 -0
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +2 -2
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__dd5b62cb._.js +3 -0
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__dd5b62cb._.js.map +1 -0
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
  108. package/web/.next/server/chunks/ssr/_73d14b70._.js +3 -0
  109. package/web/.next/server/chunks/ssr/_73d14b70._.js.map +1 -0
  110. package/web/.next/server/chunks/ssr/_7f386377._.js +3 -0
  111. package/web/.next/server/chunks/ssr/_7f386377._.js.map +1 -0
  112. package/web/.next/server/chunks/ssr/_d3711354._.js +2 -2
  113. package/web/.next/server/chunks/ssr/_d3711354._.js.map +1 -1
  114. package/web/.next/server/chunks/ssr/{_a64b7b24._.js → _d81184e2._.js} +2 -2
  115. package/web/.next/server/chunks/ssr/_d81184e2._.js.map +1 -0
  116. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_fe355030._.js → server/chunks/ssr/node_modules__pnpm_87f920e7._.js} +2 -2
  117. package/web/.next/server/chunks/ssr/{node_modules__pnpm_fe355030._.js.map → node_modules__pnpm_87f920e7._.js.map} +1 -1
  118. package/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js +3 -0
  119. package/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js.map +1 -0
  120. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +3 -0
  121. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -0
  122. package/web/.next/server/pages/500.html +2 -2
  123. package/web/.next/server/server-reference-manifest.js +1 -1
  124. package/web/.next/server/server-reference-manifest.json +15 -15
  125. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  126. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  127. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  128. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  129. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  130. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  131. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  132. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  133. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  134. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  135. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  136. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  137. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  138. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  139. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +14 -14
  140. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  141. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  142. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +1 -1
  143. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  144. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  145. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  146. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  147. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  148. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  149. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  150. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  151. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  152. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js +3 -0
  153. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  154. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  155. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  156. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js +3 -0
  157. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +2 -2
  158. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +1 -1
  159. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__dd5b62cb._.js +3 -0
  160. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
  161. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_73d14b70._.js +3 -0
  162. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_7f386377._.js +3 -0
  163. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_d3711354._.js +2 -2
  164. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_a64b7b24._.js → _d81184e2._.js} +2 -2
  165. package/web/.next/{server/chunks/ssr/node_modules__pnpm_fe355030._.js → standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_87f920e7._.js} +2 -2
  166. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js +3 -0
  167. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +3 -0
  168. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  169. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  170. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +15 -15
  171. package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.stories.tsx +207 -0
  172. package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.tsx +90 -0
  173. package/web/.next/standalone/src/presentation/web/components/common/base-drawer/index.ts +1 -0
  174. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx +1 -1
  175. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +143 -172
  176. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +119 -133
  177. package/web/.next/standalone/src/presentation/web/components/common/repository-node/index.ts +1 -0
  178. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-drawer.stories.tsx +58 -0
  179. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-drawer.tsx +82 -0
  180. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.tsx +79 -96
  181. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +30 -2
  182. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +7 -0
  183. package/web/.next/standalone/src/presentation/web/components/features/skills/skill-detail-drawer.tsx +71 -77
  184. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  185. package/web/.next/static/chunks/04d22f0d67c6671b.js +10 -0
  186. package/web/.next/static/chunks/0c6654ec27f11c7e.js +1 -0
  187. package/web/.next/static/chunks/12c70bfd5951cf9b.js +1 -0
  188. package/web/.next/static/chunks/21541b346dd4dd28.js +1 -0
  189. package/web/.next/static/chunks/{cb1b27e4a21415d3.js → 3b941e59ac013e12.js} +2 -2
  190. package/web/.next/static/chunks/{09d898be63c54f20.js → 78919481e7c5ad4f.js} +1 -1
  191. package/web/.next/static/chunks/a5b6a22de303e877.css +2 -0
  192. package/web/.next/static/chunks/af7a5bcb7c49e46e.js +1 -0
  193. package/web/.next/static/chunks/bcd97add650ece51.js +1 -0
  194. package/web/.next/static/chunks/be784143669bb992.js +1 -0
  195. package/web/.next/trace +1 -1
  196. package/web/.next/trace-build +1 -1
  197. package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +0 -3
  198. package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js.map +0 -1
  199. package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +0 -3
  200. package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js.map +0 -1
  201. package/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js +0 -3
  202. package/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js.map +0 -1
  203. package/web/.next/server/chunks/ssr/_9915d2a7._.js +0 -3
  204. package/web/.next/server/chunks/ssr/_9915d2a7._.js.map +0 -1
  205. package/web/.next/server/chunks/ssr/_a64b7b24._.js.map +0 -1
  206. package/web/.next/server/chunks/ssr/_e7a4b0e4._.js +0 -3
  207. package/web/.next/server/chunks/ssr/_e7a4b0e4._.js.map +0 -1
  208. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +0 -3
  209. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +0 -3
  210. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__ee7cffe1._.js +0 -3
  211. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9915d2a7._.js +0 -3
  212. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_e7a4b0e4._.js +0 -3
  213. package/web/.next/static/chunks/13664c029245afc8.js +0 -1
  214. package/web/.next/static/chunks/25f42652257ff43d.js +0 -1
  215. package/web/.next/static/chunks/2934854f0378f815.js +0 -1
  216. package/web/.next/static/chunks/45f510f84c7c417d.css +0 -2
  217. package/web/.next/static/chunks/8e4c719503d9387e.js +0 -1
  218. package/web/.next/static/chunks/cd44f06f18e3425a.js +0 -10
  219. /package/web/.next/static/{2z-UoCok36_D1hh1-N88G → R37CbaEU-TK9xR6x4aI_Z}/_buildManifest.js +0 -0
  220. /package/web/.next/static/{2z-UoCok36_D1hh1-N88G → R37CbaEU-TK9xR6x4aI_Z}/_clientMiddlewareManifest.json +0 -0
  221. /package/web/.next/static/{2z-UoCok36_D1hh1-N88G → R37CbaEU-TK9xR6x4aI_Z}/_ssgManifest.js +0 -0
@@ -18,6 +18,17 @@
18
18
  */
19
19
  import type { AgentType, AgentConfig } from '../../../../domain/generated/output.js';
20
20
  import type { IAgentExecutor } from './agent-executor.interface.js';
21
+ /**
22
+ * CLI binary info for an agent executor, used for version detection.
23
+ */
24
+ export interface AgentCliInfo {
25
+ /** Agent type identifier (e.g. 'claude-code') */
26
+ agentType: AgentType;
27
+ /** CLI binary name (e.g. 'claude') */
28
+ cmd: string;
29
+ /** Arguments to get version (e.g. ['--version']) */
30
+ versionArgs: string[];
31
+ }
21
32
  /**
22
33
  * Port interface for creating agent executor instances.
23
34
  *
@@ -41,5 +52,12 @@ export interface IAgentExecutorFactory {
41
52
  * @returns Array of supported agent types
42
53
  */
43
54
  getSupportedAgents(): AgentType[];
55
+ /**
56
+ * Get CLI binary info for each agent executor (for version detection).
57
+ * Excludes non-CLI agents (e.g. 'dev').
58
+ *
59
+ * @returns Array of CLI info for version-checkable agents
60
+ */
61
+ getCliInfo(): AgentCliInfo[];
44
62
  }
45
63
  //# sourceMappingURL=agent-executor-factory.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-executor-factory.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/agent-executor-factory.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,GAAG,cAAc,CAAC;IAE9E;;;;OAIG;IACH,kBAAkB,IAAI,SAAS,EAAE,CAAC;CACnC"}
1
+ {"version":3,"file":"agent-executor-factory.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/agent-executor-factory.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,SAAS,EAAE,SAAS,CAAC;IACrB,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,oDAAoD;IACpD,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,GAAG,cAAc,CAAC;IAE9E;;;;OAIG;IACH,kBAAkB,IAAI,SAAS,EAAE,CAAC;IAElC;;;;;OAKG;IACH,UAAU,IAAI,YAAY,EAAE,CAAC;CAC9B"}
@@ -4,7 +4,7 @@
4
4
  * Interfaces for agent execution, orchestration, and persistence.
5
5
  */
6
6
  export type { IAgentExecutor, AgentExecutionResult, AgentExecutionStreamEvent, AgentExecutionOptions, } from './agent-executor.interface.js';
7
- export type { IAgentExecutorFactory } from './agent-executor-factory.interface.js';
7
+ export type { IAgentExecutorFactory, AgentCliInfo } from './agent-executor-factory.interface.js';
8
8
  export type { IAgentExecutorProvider } from './agent-executor-provider.interface.js';
9
9
  export type { IAgentRegistry, AgentDefinitionWithFactory } from './agent-registry.interface.js';
10
10
  export type { IAgentRunner, AgentRunOptions } from './agent-runner.interface.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACnF,YAAY,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACrF,YAAY,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChG,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACjF,YAAY,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,YAAY,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACrF,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC7F,YAAY,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACxF,YAAY,EACV,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EACV,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,yCAAyC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACjG,YAAY,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACrF,YAAY,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChG,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACjF,YAAY,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,YAAY,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACrF,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC7F,YAAY,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACxF,YAAY,EACV,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EACV,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,yCAAyC,CAAC"}
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import type { AgentType, AgentConfig } from '../../../../domain/generated/output.js';
11
11
  import type { IAgentExecutor } from '../../../../application/ports/output/agents/agent-executor.interface.js';
12
- import type { IAgentExecutorFactory } from '../../../../application/ports/output/agents/agent-executor-factory.interface.js';
12
+ import type { IAgentExecutorFactory, AgentCliInfo } from '../../../../application/ports/output/agents/agent-executor-factory.interface.js';
13
13
  import type { SpawnFunction } from './types.js';
14
14
  /**
15
15
  * Factory that creates and caches agent executor instances.
@@ -39,5 +39,6 @@ export declare class AgentExecutorFactory implements IAgentExecutorFactory {
39
39
  * @returns Array of supported agent types
40
40
  */
41
41
  getSupportedAgents(): AgentType[];
42
+ getCliInfo(): AgentCliInfo[];
42
43
  }
43
44
  //# sourceMappingURL=agent-executor-factory.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-executor-factory.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yEAAyE,CAAC;AAC9G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iFAAiF,CAAC;AAK7H,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,qBAAqB;IAMpD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAE3D;;OAEG;gBAC0B,KAAK,EAAE,aAAa;IAEjD;;;;;;;OAOG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG,cAAc;IA6B9E;;;;OAIG;IACH,kBAAkB,IAAI,SAAS,EAAE;CAQlC"}
1
+ {"version":3,"file":"agent-executor-factory.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yEAAyE,CAAC;AAC9G,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACb,MAAM,iFAAiF,CAAC;AAKzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,qBAAqB;IAMpD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAE3D;;OAEG;gBAC0B,KAAK,EAAE,aAAa;IAEjD;;;;;;;OAOG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG,cAAc;IA6B9E;;;;OAIG;IACH,kBAAkB,IAAI,SAAS,EAAE;IASjC,UAAU,IAAI,YAAY,EAAE;CAO7B"}
@@ -72,4 +72,11 @@ export class AgentExecutorFactory {
72
72
  'gemini-cli',
73
73
  ];
74
74
  }
75
+ getCliInfo() {
76
+ return [
77
+ { agentType: 'claude-code', cmd: 'claude', versionArgs: ['--version'] },
78
+ { agentType: 'gemini-cli', cmd: 'gemini', versionArgs: ['--version'] },
79
+ { agentType: 'cursor', cmd: 'cursor', versionArgs: ['--version'] },
80
+ ];
81
+ }
75
82
  }
@@ -6,10 +6,11 @@
6
6
  */
7
7
  import type { AgentType, AgentConfig } from '../../../../../domain/generated/output.js';
8
8
  import type { IAgentExecutor } from '../../../../../application/ports/output/agents/agent-executor.interface.js';
9
- import type { IAgentExecutorFactory } from '../../../../../application/ports/output/agents/agent-executor-factory.interface.js';
9
+ import type { IAgentExecutorFactory, AgentCliInfo } from '../../../../../application/ports/output/agents/agent-executor-factory.interface.js';
10
10
  export declare class MockAgentExecutorFactory implements IAgentExecutorFactory {
11
11
  private readonly executor;
12
12
  createExecutor(_agentType: AgentType, _authConfig: AgentConfig): IAgentExecutor;
13
13
  getSupportedAgents(): AgentType[];
14
+ getCliInfo(): AgentCliInfo[];
14
15
  }
15
16
  //# sourceMappingURL=mock-executor-factory.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock-executor-factory.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4EAA4E,CAAC;AACjH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oFAAoF,CAAC;AAGhI,qBAAa,wBAAyB,YAAW,qBAAqB;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAE3D,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG,cAAc;IAI/E,kBAAkB,IAAI,SAAS,EAAE;CAGlC"}
1
+ {"version":3,"file":"mock-executor-factory.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/mock-executor-factory.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4EAA4E,CAAC;AACjH,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACb,MAAM,oFAAoF,CAAC;AAG5F,qBAAa,wBAAyB,YAAW,qBAAqB;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAE3D,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,GAAG,cAAc;IAI/E,kBAAkB,IAAI,SAAS,EAAE;IAIjC,UAAU,IAAI,YAAY,EAAE;CAG7B"}
@@ -13,4 +13,7 @@ export class MockAgentExecutorFactory {
13
13
  getSupportedAgents() {
14
14
  return ['claude-code'];
15
15
  }
16
+ getCliInfo() {
17
+ return [];
18
+ }
16
19
  }
@@ -26,6 +26,13 @@ export declare function getShepDbPath(): string;
26
26
  * @returns Path to daemon.json
27
27
  */
28
28
  export declare function getDaemonStatePath(): string;
29
+ /**
30
+ * Gets the path to the daemon log file.
31
+ * Uses SHEP_HOME env var if set (for test isolation), otherwise ~/.shep/daemon.log
32
+ *
33
+ * @returns Path to daemon.log
34
+ */
35
+ export declare function getDaemonLogPath(): string;
29
36
  /**
30
37
  * Ensures the shep home directory exists with correct permissions.
31
38
  * Creates the directory if it doesn't exist.
@@ -1 +1 @@
1
- {"version":3,"file":"shep-directory.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBzD"}
1
+ {"version":3,"file":"shep-directory.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBzD"}
@@ -43,6 +43,15 @@ export function getShepDbPath() {
43
43
  export function getDaemonStatePath() {
44
44
  return join(resolveShepHomeDir(), 'daemon.json');
45
45
  }
46
+ /**
47
+ * Gets the path to the daemon log file.
48
+ * Uses SHEP_HOME env var if set (for test isolation), otherwise ~/.shep/daemon.log
49
+ *
50
+ * @returns Path to daemon.log
51
+ */
52
+ export function getDaemonLogPath() {
53
+ return join(resolveShepHomeDir(), 'daemon.log');
54
+ }
46
55
  /**
47
56
  * Ensures the shep home directory exists with correct permissions.
48
57
  * Creates the directory if it doesn't exist.
@@ -1 +1 @@
1
- {"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAOlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAqBlB,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB1D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAMzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAU9B"}
1
+ {"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAOlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAqBlB,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAMzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAU9B"}
@@ -78,16 +78,30 @@ let WorktreeService = class WorktreeService {
78
78
  }
79
79
  }
80
80
  async ensureGitRepository(repoPath) {
81
+ let isExistingRepo = false;
81
82
  try {
82
83
  await this.execFile('git', ['rev-parse', '--is-inside-work-tree'], { cwd: repoPath });
83
- return; // Already a git repo
84
+ isExistingRepo = true;
84
85
  }
85
86
  catch {
86
- // Not a git repo — initialize it
87
+ // Not a git repo — will initialize below
88
+ }
89
+ if (isExistingRepo) {
90
+ // Repo exists but may have an unborn branch (no commits).
91
+ // git worktree add requires at least one commit as a start-point.
92
+ try {
93
+ await this.execFile('git', ['rev-parse', 'HEAD'], { cwd: repoPath });
94
+ return; // Has commits — nothing to do
95
+ }
96
+ catch {
97
+ // Unborn branch (no commits) — create initial commit below
98
+ }
87
99
  }
88
100
  try {
89
- mkdirSync(repoPath, { recursive: true });
90
- await this.execFile('git', ['init'], { cwd: repoPath });
101
+ if (!isExistingRepo) {
102
+ mkdirSync(repoPath, { recursive: true });
103
+ await this.execFile('git', ['init'], { cwd: repoPath });
104
+ }
91
105
  await this.execFile('git', ['config', 'user.name', GIT_AUTO_INIT_USER], { cwd: repoPath });
92
106
  await this.execFile('git', ['config', 'user.email', GIT_AUTO_INIT_EMAIL], { cwd: repoPath });
93
107
  await this.execFile('git', ['commit', '--allow-empty', '-m', 'Initial commit'], {
@@ -10,7 +10,7 @@
10
10
  * repositoryPath for batch `gh pr list` queries.
11
11
  */
12
12
  import { SdlcLifecycle, PrStatus, CiStatus, AgentRunStatus, NotificationEventType, NotificationSeverity, } from '../../../domain/generated/output.js';
13
- const DEFAULT_POLL_INTERVAL_MS = 3000;
13
+ const DEFAULT_POLL_INTERVAL_MS = 30_000;
14
14
  const TAG = '[PrSyncWatcher]';
15
15
  const CI_STATUS_MAP = {
16
16
  success: CiStatus.Success,
@@ -1 +1 @@
1
- {"version":3,"file":"start-daemon.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/daemon/start-daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAkBH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0F9E"}
1
+ {"version":3,"file":"start-daemon.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/daemon/start-daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAoBH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+F9E"}
@@ -17,10 +17,12 @@
17
17
  * 7. Open browser via BrowserOpenerService
18
18
  */
19
19
  import { spawn } from 'node:child_process';
20
+ import { closeSync, openSync, renameSync, existsSync } from 'node:fs';
20
21
  import http from 'node:http';
21
22
  import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
22
23
  import { findAvailablePort, DEFAULT_PORT } from '../../../../../packages/core/src/infrastructure/services/port.service.js';
23
24
  import { BrowserOpenerService } from '../../../../../packages/core/src/infrastructure/services/browser-opener.service.js';
25
+ import { getDaemonLogPath } from '../../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.js';
24
26
  import { fmt, messages, spinner } from '../../ui/index.js';
25
27
  /** How long to wait (ms) after spawn to verify the child is still alive. */
26
28
  const SPAWN_SETTLE_MS = 500;
@@ -46,17 +48,26 @@ export async function startDaemon(opts = {}) {
46
48
  // Resolve the port
47
49
  const startPort = opts.port ?? DEFAULT_PORT;
48
50
  const port = await findAvailablePort(startPort);
51
+ // Rotate existing daemon.log → daemon.log.old (keep 1 backup)
52
+ const logPath = getDaemonLogPath();
53
+ try {
54
+ if (existsSync(logPath)) {
55
+ renameSync(logPath, `${logPath}.old`);
56
+ }
57
+ }
58
+ catch {
59
+ // Best-effort rotation — continue even if rename fails
60
+ }
61
+ // Open log file for daemon stdout+stderr redirection
62
+ const logFd = openSync(logPath, 'a', 0o600);
49
63
  // Spawn the daemon as a detached child process.
50
64
  // Propagate process.execArgv so tsx loader hooks (--require / --import) are
51
65
  // available in dev mode. In production (compiled JS), execArgv is empty.
66
+ // stdout and stderr are both redirected to daemon.log.
52
67
  const child = spawn(process.execPath, [...process.execArgv, process.argv[1], '_serve', '--port', String(port)], {
53
68
  detached: true,
54
- // Keep stderr piped so we can surface startup errors; stdin/stdout detached.
55
- stdio: ['ignore', 'ignore', 'pipe'],
69
+ stdio: ['ignore', logFd, logFd],
56
70
  });
57
- // Collect stderr in case the child crashes during startup.
58
- let stderrChunks = [];
59
- child.stderr.on('data', (chunk) => stderrChunks.push(chunk));
60
71
  // Wait briefly for the child to either settle or crash.
61
72
  const exitCode = await Promise.race([
62
73
  new Promise((resolve) => child.on('exit', (code) => resolve(code))),
@@ -64,21 +75,17 @@ export async function startDaemon(opts = {}) {
64
75
  ]);
65
76
  if (exitCode !== undefined) {
66
77
  // Child exited during the settle window — startup failed.
67
- const stderr = Buffer.concat(stderrChunks).toString().trim();
78
+ closeSync(logFd);
68
79
  messages.newline();
69
80
  messages.error(`Daemon failed to start (exit code ${exitCode ?? 'unknown'}).`);
70
- if (stderr) {
71
- console.error(stderr);
72
- }
81
+ messages.info(`Check logs: ${fmt.code(logPath)}`);
73
82
  messages.newline();
74
83
  // Clean up stale daemon.json if it exists
75
84
  await daemonService.delete();
76
85
  return;
77
86
  }
78
- // Child is alive — detach fully.
79
- // Unref stderr so the parent event loop is not held open, then unref the child.
80
- child.stderr.destroy();
81
- stderrChunks = [];
87
+ // Child is alive — close the log fd in the parent and detach fully.
88
+ closeSync(logFd);
82
89
  child.unref();
83
90
  // Write daemon.json atomically
84
91
  await daemonService.write({
@@ -119,8 +126,10 @@ function waitForServer(url, timeoutMs) {
119
126
  const probe = () => {
120
127
  if (Date.now() > deadline)
121
128
  return resolve(false);
122
- const req = http.get(url, () => {
123
- resolve(true);
129
+ const req = http.get(url, (res) => {
130
+ // Drain the response so the socket doesn't keep the event loop alive
131
+ res.resume();
132
+ res.on('end', () => resolve(true));
124
133
  });
125
134
  req.on('error', () => {
126
135
  setTimeout(probe, READY_POLL_MS);
@@ -7,10 +7,17 @@
7
7
  * - PID, port, URL (from daemon.json)
8
8
  * - Uptime (computed from startedAt)
9
9
  * - CPU%, RSS memory (from ps shell-out via execFile — injection-safe)
10
+ * - Environment: paths, versions, agent executor versions
11
+ *
12
+ * Flags:
13
+ * --logs [N] Show last N lines of daemon.log (default 50)
14
+ * -f, --follow Follow daemon.log in real-time (like tail -f)
10
15
  *
11
16
  * Gracefully degrades if ps is unavailable (timeout or error).
12
17
  *
13
18
  * Usage: shep status
19
+ * shep status --logs
20
+ * shep status --logs 100 --follow
14
21
  */
15
22
  import { Command } from 'commander';
16
23
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"status.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/status.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+EpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CA2C7C"}
1
+ {"version":3,"file":"status.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/status.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwLpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAqH7C"}
@@ -7,16 +7,29 @@
7
7
  * - PID, port, URL (from daemon.json)
8
8
  * - Uptime (computed from startedAt)
9
9
  * - CPU%, RSS memory (from ps shell-out via execFile — injection-safe)
10
+ * - Environment: paths, versions, agent executor versions
11
+ *
12
+ * Flags:
13
+ * --logs [N] Show last N lines of daemon.log (default 50)
14
+ * -f, --follow Follow daemon.log in real-time (like tail -f)
10
15
  *
11
16
  * Gracefully degrades if ps is unavailable (timeout or error).
12
17
  *
13
18
  * Usage: shep status
19
+ * shep status --logs
20
+ * shep status --logs 100 --follow
14
21
  */
15
22
  import { Command } from 'commander';
16
23
  import { execFile } from 'node:child_process';
24
+ import { createReadStream, existsSync, statSync } from 'node:fs';
25
+ import { createInterface } from 'node:readline';
26
+ import { watch } from 'node:fs';
17
27
  import { container } from '../../../../packages/core/src/infrastructure/di/container.js';
18
- import { renderDetailView, messages } from '../ui/index.js';
28
+ import { getShepHomeDir, getShepDbPath, getDaemonStatePath, getDaemonLogPath, } from '../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.js';
29
+ import { renderDetailView, messages, colors } from '../ui/index.js';
19
30
  const PS_TIMEOUT_MS = 2000;
31
+ const VERSION_CMD_TIMEOUT_MS = 3000;
32
+ const DEFAULT_LOG_LINES = 50;
20
33
  /**
21
34
  * Parse ps output: "pid cpu% rss_kb\n"
22
35
  * Returns formatted strings for display.
@@ -75,13 +88,129 @@ function fetchPsMetrics(pid) {
75
88
  });
76
89
  });
77
90
  }
91
+ /**
92
+ * Detect the version of an agent executor CLI.
93
+ * Returns version string or 'not installed'.
94
+ */
95
+ function detectAgentVersion(cmd, args) {
96
+ return new Promise((resolve) => {
97
+ execFile(cmd, args, { timeout: VERSION_CMD_TIMEOUT_MS }, (err, stdout) => {
98
+ if (err) {
99
+ resolve('not installed');
100
+ }
101
+ else {
102
+ // Extract first line, strip leading labels like "claude-code v1.2.3" → "v1.2.3"
103
+ const line = stdout.trim().split('\n')[0] ?? '';
104
+ // Try to extract version-like string
105
+ const match = line.match(/v?\d+\.\d+[\w.-]*/);
106
+ resolve(match ? match[0] : line || 'unknown');
107
+ }
108
+ });
109
+ });
110
+ }
111
+ /**
112
+ * Read the last N lines of a file.
113
+ */
114
+ async function tailFile(filePath, lineCount) {
115
+ const lines = [];
116
+ const stream = createReadStream(filePath, { encoding: 'utf-8' });
117
+ const rl = createInterface({ input: stream, crlfDelay: Infinity });
118
+ for await (const line of rl) {
119
+ lines.push(line);
120
+ if (lines.length > lineCount) {
121
+ lines.shift();
122
+ }
123
+ }
124
+ return lines;
125
+ }
126
+ /**
127
+ * Follow a file in real-time (like tail -f).
128
+ * Reads new content as the file grows.
129
+ */
130
+ function followFile(filePath) {
131
+ let position = 0;
132
+ try {
133
+ position = statSync(filePath).size;
134
+ }
135
+ catch {
136
+ // File doesn't exist yet, start from 0
137
+ }
138
+ const readNewContent = () => {
139
+ try {
140
+ const currentSize = statSync(filePath).size;
141
+ if (currentSize <= position) {
142
+ if (currentSize < position)
143
+ position = 0; // File was truncated
144
+ return;
145
+ }
146
+ const stream = createReadStream(filePath, {
147
+ encoding: 'utf-8',
148
+ start: position,
149
+ });
150
+ let buffer = '';
151
+ stream.on('data', (chunk) => {
152
+ buffer += chunk;
153
+ });
154
+ stream.on('end', () => {
155
+ position = currentSize;
156
+ if (buffer) {
157
+ process.stdout.write(buffer);
158
+ }
159
+ });
160
+ }
161
+ catch {
162
+ // File may have been deleted/rotated
163
+ }
164
+ };
165
+ const watcher = watch(filePath, () => {
166
+ readNewContent();
167
+ });
168
+ // Also poll every 1s as a fallback (fs.watch can miss events)
169
+ const interval = setInterval(readNewContent, 1000);
170
+ process.on('SIGINT', () => {
171
+ watcher.close();
172
+ clearInterval(interval);
173
+ process.exit(0);
174
+ });
175
+ }
78
176
  /**
79
177
  * Create the status command.
80
178
  */
81
179
  export function createStatusCommand() {
82
180
  return new Command('status')
83
181
  .description('Show the status of the Shep web UI daemon')
84
- .action(async () => {
182
+ .option('--logs [lines]', 'Show last N lines of daemon log (default 50)')
183
+ .option('-f, --follow', 'Follow daemon log output in real-time')
184
+ .action(async (options) => {
185
+ const logPath = getDaemonLogPath();
186
+ // Handle --logs flag
187
+ if (options.logs !== undefined || options.follow) {
188
+ if (!existsSync(logPath)) {
189
+ messages.newline();
190
+ messages.info('No daemon log file found.');
191
+ messages.info(`Expected at: ${logPath}`);
192
+ messages.newline();
193
+ return;
194
+ }
195
+ // Show tail lines
196
+ const lineCount = typeof options.logs === 'string'
197
+ ? parseInt(options.logs, 10) || DEFAULT_LOG_LINES
198
+ : DEFAULT_LOG_LINES;
199
+ const lines = await tailFile(logPath, lineCount);
200
+ if (lines.length > 0) {
201
+ console.log(lines.join('\n'));
202
+ }
203
+ else {
204
+ messages.info('Log file is empty.');
205
+ }
206
+ // Follow mode
207
+ if (options.follow) {
208
+ console.log(colors.muted('--- following daemon.log (Ctrl+C to stop) ---'));
209
+ followFile(logPath);
210
+ return; // Block forever (followFile handles SIGINT)
211
+ }
212
+ return;
213
+ }
85
214
  const daemonService = container.resolve('IDaemonService');
86
215
  const state = await daemonService.read();
87
216
  if (!state || !daemonService.isAlive(state.pid)) {
@@ -95,7 +224,24 @@ export function createStatusCommand() {
95
224
  const url = `http://localhost:${port}`;
96
225
  const uptimeMs = Date.now() - Date.parse(startedAt);
97
226
  const uptime = humanizeUptime(uptimeMs);
98
- const { cpu, rssMb } = await fetchPsMetrics(pid);
227
+ // Get agent CLI info from the factory
228
+ const factory = container.resolve('IAgentExecutorFactory');
229
+ const agentClis = factory.getCliInfo();
230
+ // Fetch ps metrics and agent versions in parallel
231
+ const [psMetrics, ...agentVersions] = await Promise.all([
232
+ fetchPsMetrics(pid),
233
+ ...agentClis.map((a) => detectAgentVersion(a.cmd, a.versionArgs)),
234
+ ]);
235
+ const { cpu, rssMb } = psMetrics;
236
+ // Get CLI version
237
+ let cliVersion = 'unknown';
238
+ try {
239
+ const versionService = container.resolve('IVersionService');
240
+ cliVersion = versionService.getVersion().version;
241
+ }
242
+ catch {
243
+ // Version service not available
244
+ }
99
245
  renderDetailView({
100
246
  title: 'Shep Daemon Status',
101
247
  sections: [
@@ -113,6 +259,24 @@ export function createStatusCommand() {
113
259
  },
114
260
  ],
115
261
  },
262
+ {
263
+ title: 'Environment',
264
+ fields: [
265
+ { label: 'Shep Home', value: getShepHomeDir() },
266
+ { label: 'CLI Version', value: cliVersion },
267
+ { label: 'Node Version', value: process.version },
268
+ { label: 'DB Path', value: getShepDbPath() },
269
+ { label: 'Log File', value: logPath },
270
+ { label: 'Daemon Config', value: getDaemonStatePath() },
271
+ ],
272
+ },
273
+ {
274
+ title: 'Agent Executors',
275
+ fields: agentClis.map((agent, i) => ({
276
+ label: agent.agentType,
277
+ value: agentVersions[i],
278
+ })),
279
+ },
116
280
  ],
117
281
  });
118
282
  });
@@ -0,0 +1,17 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ declare const drawerVariants: (props?: ({
3
+ size?: "md" | "sm" | null | undefined;
4
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
5
+ export interface BaseDrawerProps extends VariantProps<typeof drawerVariants> {
6
+ open: boolean;
7
+ onClose: () => void;
8
+ modal?: boolean;
9
+ header?: React.ReactNode;
10
+ children: React.ReactNode;
11
+ footer?: React.ReactNode;
12
+ className?: string;
13
+ 'data-testid'?: string;
14
+ }
15
+ export declare function BaseDrawer({ open, onClose, modal, size, header, children, footer, className, 'data-testid': testId, }: BaseDrawerProps): import("react/jsx-runtime").JSX.Element;
16
+ export {};
17
+ //# sourceMappingURL=base-drawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/base-drawer/base-drawer.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAUlE,QAAA,MAAM,cAAc;;8EAUlB,CAAC;AAEH,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,OAAO,cAAc,CAAC;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,OAAO,EACP,KAAa,EACb,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,aAAa,EAAE,MAAM,GACtB,EAAE,eAAe,2CA2CjB"}
@@ -0,0 +1,23 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { XIcon } from 'lucide-react';
4
+ import { cva } from 'class-variance-authority';
5
+ import { cn } from '../../../lib/utils.js';
6
+ import { Drawer, DrawerContent, DrawerHeader, DrawerFooter, DrawerOverlay, } from '../../ui/drawer.js';
7
+ const drawerVariants = cva('', {
8
+ variants: {
9
+ size: {
10
+ sm: 'w-96',
11
+ md: 'w-xl',
12
+ },
13
+ },
14
+ defaultVariants: {
15
+ size: 'sm',
16
+ },
17
+ });
18
+ export function BaseDrawer({ open, onClose, modal = false, size, header, children, footer, className, 'data-testid': testId, }) {
19
+ return (_jsxs(Drawer, { direction: "right", modal: modal, handleOnly: true, open: open, onOpenChange: (isOpen) => {
20
+ if (!isOpen)
21
+ onClose();
22
+ }, children: [modal ? _jsx(DrawerOverlay, {}) : null, _jsxs(DrawerContent, { direction: "right", showCloseButton: false, className: cn(drawerVariants({ size }), className), "data-testid": testId, children: [_jsxs("button", { type: "button", "aria-label": "Close", onClick: onClose, className: "ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden", "data-testid": testId ? `${testId}-close-button` : undefined, children: [_jsx(XIcon, { className: "size-4" }), _jsx("span", { className: "sr-only", children: "Close" })] }), header ? _jsx(DrawerHeader, { children: header }) : null, _jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx("div", { className: "flex flex-col", children: children }) }), footer ? _jsx(DrawerFooter, { children: footer }) : null] })] }));
23
+ }
@@ -0,0 +1,22 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { BaseDrawer } from './base-drawer.js';
3
+ declare const meta: Meta<typeof BaseDrawer>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof BaseDrawer>;
6
+ /** Default drawer with sm size, non-modal, children only. */
7
+ export declare const Default: Story;
8
+ /** Explicit sm size with inspector-style content. */
9
+ export declare const SmallSize: Story;
10
+ /** Medium size with content-rich review-style content. */
11
+ export declare const MediumSize: Story;
12
+ /** Modal drawer with overlay. */
13
+ export declare const Modal: Story;
14
+ /** Drawer with header slot containing DrawerTitle and DrawerDescription. */
15
+ export declare const WithHeader: Story;
16
+ /** Drawer with footer slot containing action buttons. */
17
+ export declare const WithFooter: Story;
18
+ /** Drawer with both header and footer slots populated. */
19
+ export declare const WithHeaderAndFooter: Story;
20
+ /** Drawer with content that exceeds viewport to demonstrate scroll behavior. */
21
+ export declare const ScrollableContent: Story;
22
+ //# sourceMappingURL=base-drawer.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/base-drawer/base-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAI3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAOjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,UAAU,CAAC,CAAC;AAuBzC,6DAA6D;AAC7D,eAAO,MAAM,OAAO,EAAE,KAQrB,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,SAAS,EAAE,KAkBvB,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,UAAU,EAAE,KAiBxB,CAAC;AAEF,iCAAiC;AACjC,eAAO,MAAM,KAAK,EAAE,KAUnB,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,UAAU,EAAE,KAexB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAiBxB,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,EAAE,KAsCjC,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,EAAE,KAsB/B,CAAC"}