@shepai/cli 1.167.0 → 1.168.0-pr509.b1dd877

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 (479) hide show
  1. package/apis/json-schema/Feature.yaml +10 -0
  2. package/apis/json-schema/SkillInjectionConfig.yaml +17 -0
  3. package/apis/json-schema/SkillSource.yaml +21 -0
  4. package/apis/json-schema/SkillSourceType.yaml +7 -0
  5. package/apis/json-schema/WorkflowConfig.yaml +3 -0
  6. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.d.ts +38 -2
  7. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
  9. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  10. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts +16 -1
  11. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts.map +1 -1
  12. package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.d.ts +39 -0
  13. package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.d.ts.map +1 -0
  14. package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.js +8 -0
  15. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.d.ts.map +1 -1
  16. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.js +1 -0
  17. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +3 -1
  18. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  19. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +22 -3
  20. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +2 -0
  21. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
  22. package/dist/packages/core/src/application/use-cases/interactive/index.d.ts +2 -0
  23. package/dist/packages/core/src/application/use-cases/interactive/index.d.ts.map +1 -1
  24. package/dist/packages/core/src/application/use-cases/interactive/index.js +1 -0
  25. package/dist/packages/core/src/application/use-cases/interactive/respond-to-interaction.use-case.d.ts +17 -0
  26. package/dist/packages/core/src/application/use-cases/interactive/respond-to-interaction.use-case.d.ts.map +1 -0
  27. package/dist/packages/core/src/application/use-cases/interactive/respond-to-interaction.use-case.js +34 -0
  28. package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.d.ts.map +1 -1
  29. package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.js +6 -2
  30. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  31. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +55 -1
  32. package/dist/packages/core/src/domain/generated/output.d.ts +50 -0
  33. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  34. package/dist/packages/core/src/domain/generated/output.js +5 -0
  35. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  36. package/dist/packages/core/src/infrastructure/di/container.js +7 -0
  37. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +2 -0
  38. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
  39. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +6 -0
  40. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +2 -0
  41. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  42. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +27 -0
  43. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-skill-injection-config.d.ts +15 -0
  44. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-skill-injection-config.d.ts.map +1 -0
  45. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-skill-injection-config.js +23 -0
  46. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-injected-skills-to-features.d.ts +11 -0
  47. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-injected-skills-to-features.d.ts.map +1 -0
  48. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-injected-skills-to-features.js +19 -0
  49. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
  50. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +8 -4
  51. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts +3 -0
  52. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts.map +1 -1
  53. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.js +59 -6
  54. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts +7 -0
  55. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts.map +1 -1
  56. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.js +101 -1
  57. package/dist/packages/core/src/infrastructure/services/skill-injector.service.d.ts +26 -0
  58. package/dist/packages/core/src/infrastructure/services/skill-injector.service.d.ts.map +1 -0
  59. package/dist/packages/core/src/infrastructure/services/skill-injector.service.js +201 -0
  60. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  61. package/dist/src/presentation/cli/commands/feat/new.command.js +3 -0
  62. package/dist/src/presentation/web/app/actions/add-injected-skill.d.ts +7 -0
  63. package/dist/src/presentation/web/app/actions/add-injected-skill.d.ts.map +1 -0
  64. package/dist/src/presentation/web/app/actions/add-injected-skill.js +34 -0
  65. package/dist/src/presentation/web/app/actions/create-feature.d.ts +2 -0
  66. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
  67. package/dist/src/presentation/web/app/actions/create-feature.js +3 -1
  68. package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts +1 -0
  69. package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts.map +1 -1
  70. package/dist/src/presentation/web/app/actions/get-workflow-defaults.js +1 -0
  71. package/dist/src/presentation/web/app/actions/remove-injected-skill.d.ts +6 -0
  72. package/dist/src/presentation/web/app/actions/remove-injected-skill.d.ts.map +1 -0
  73. package/dist/src/presentation/web/app/actions/remove-injected-skill.js +35 -0
  74. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/respond/route.d.ts +19 -0
  75. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/respond/route.d.ts.map +1 -0
  76. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/respond/route.js +33 -0
  77. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/stream/route.d.ts.map +1 -1
  78. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/stream/route.js +7 -0
  79. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  80. package/dist/src/presentation/web/app/build-feature-node-data.js +2 -0
  81. package/dist/src/presentation/web/app/layout.d.ts +0 -1
  82. package/dist/src/presentation/web/app/layout.d.ts.map +1 -1
  83. package/dist/src/presentation/web/app/layout.js +0 -1
  84. package/dist/src/presentation/web/app/skills/page.d.ts.map +1 -1
  85. package/dist/src/presentation/web/app/skills/page.js +6 -1
  86. package/dist/src/presentation/web/components/assistant-ui/thread.d.ts +3 -2
  87. package/dist/src/presentation/web/components/assistant-ui/thread.d.ts.map +1 -1
  88. package/dist/src/presentation/web/components/assistant-ui/thread.js +26 -3
  89. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +2 -0
  90. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  91. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +6 -2
  92. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  93. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +1 -0
  94. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
  95. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +10 -4
  96. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +2 -0
  97. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
  98. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +12 -0
  99. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +4 -0
  100. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  101. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog.d.ts.map +1 -1
  102. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog.js +68 -56
  103. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.d.ts +1 -0
  104. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.d.ts.map +1 -1
  105. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.js +7 -1
  106. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.stories.d.ts +1 -0
  107. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.stories.d.ts.map +1 -1
  108. package/dist/src/presentation/web/components/features/chat/ChatDotIndicator.stories.js +3 -0
  109. package/dist/src/presentation/web/components/features/chat/ChatSheet.d.ts.map +1 -1
  110. package/dist/src/presentation/web/components/features/chat/ChatSheet.js +3 -1
  111. package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts.map +1 -1
  112. package/dist/src/presentation/web/components/features/chat/ChatTab.js +3 -2
  113. package/dist/src/presentation/web/components/features/chat/InteractionBubble.d.ts +33 -0
  114. package/dist/src/presentation/web/components/features/chat/InteractionBubble.d.ts.map +1 -0
  115. package/dist/src/presentation/web/components/features/chat/InteractionBubble.js +155 -0
  116. package/dist/src/presentation/web/components/features/chat/InteractionBubble.stories.d.ts +22 -0
  117. package/dist/src/presentation/web/components/features/chat/InteractionBubble.stories.d.ts.map +1 -0
  118. package/dist/src/presentation/web/components/features/chat/InteractionBubble.stories.js +107 -0
  119. package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts +16 -0
  120. package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts.map +1 -1
  121. package/dist/src/presentation/web/components/features/chat/useChatRuntime.js +62 -1
  122. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  123. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +18 -3
  124. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -0
  125. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  126. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +1 -1
  127. package/dist/src/presentation/web/components/features/skills/add-skill-dialog.d.ts +10 -0
  128. package/dist/src/presentation/web/components/features/skills/add-skill-dialog.d.ts.map +1 -0
  129. package/dist/src/presentation/web/components/features/skills/add-skill-dialog.js +56 -0
  130. package/dist/src/presentation/web/components/features/skills/add-skill-dialog.stories.d.ts +16 -0
  131. package/dist/src/presentation/web/components/features/skills/add-skill-dialog.stories.d.ts.map +1 -0
  132. package/dist/src/presentation/web/components/features/skills/add-skill-dialog.stories.js +66 -0
  133. package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.d.ts +8 -0
  134. package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.d.ts.map +1 -0
  135. package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.js +42 -0
  136. package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.stories.d.ts +16 -0
  137. package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.stories.d.ts.map +1 -0
  138. package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.stories.js +69 -0
  139. package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts +3 -1
  140. package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts.map +1 -1
  141. package/dist/src/presentation/web/components/features/skills/skills-page-client.js +5 -3
  142. package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.d.ts +1 -0
  143. package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.d.ts.map +1 -1
  144. package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.js +27 -0
  145. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  146. package/dist/src/presentation/web/hooks/use-graph-state.js +16 -0
  147. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts +1 -1
  148. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts.map +1 -1
  149. package/dist/src/presentation/web/hooks/use-turn-statuses.js +1 -1
  150. package/dist/translations/ar/cli.json +2 -0
  151. package/dist/translations/ar/web.json +15 -11
  152. package/dist/translations/de/cli.json +2 -0
  153. package/dist/translations/de/web.json +35 -17
  154. package/dist/translations/en/cli.json +2 -0
  155. package/dist/translations/en/web.json +4 -0
  156. package/dist/translations/es/cli.json +2 -0
  157. package/dist/translations/es/web.json +16 -12
  158. package/dist/translations/fr/cli.json +2 -0
  159. package/dist/translations/fr/web.json +16 -12
  160. package/dist/translations/he/cli.json +2 -0
  161. package/dist/translations/he/web.json +16 -12
  162. package/dist/translations/pt/cli.json +2 -0
  163. package/dist/translations/pt/web.json +16 -12
  164. package/dist/translations/ru/cli.json +2 -0
  165. package/dist/translations/ru/web.json +16 -12
  166. package/dist/tsconfig.build.tsbuildinfo +1 -1
  167. package/package.json +1 -1
  168. package/web/.next/BUILD_ID +1 -1
  169. package/web/.next/app-path-routes-manifest.json +1 -0
  170. package/web/.next/build-manifest.json +7 -7
  171. package/web/.next/fallback-build-manifest.json +2 -2
  172. package/web/.next/prerender-manifest.json +3 -3
  173. package/web/.next/required-server-files.js +3 -3
  174. package/web/.next/required-server-files.json +3 -3
  175. package/web/.next/routes-manifest.json +8 -0
  176. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/build-manifest.json +5 -5
  177. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/react-loadable-manifest.json +1 -8
  178. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  179. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
  180. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  181. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  182. package/web/.next/server/app/(dashboard)/@drawer/chat/page/build-manifest.json +5 -5
  183. package/web/.next/server/app/(dashboard)/@drawer/chat/page/react-loadable-manifest.json +1 -8
  184. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  185. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +1 -1
  186. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  187. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  188. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +5 -5
  189. package/web/.next/server/app/(dashboard)/@drawer/create/page/react-loadable-manifest.json +1 -8
  190. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
  191. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  192. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  193. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  194. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +5 -5
  195. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/react-loadable-manifest.json +1 -8
  196. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
  197. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  198. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  199. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  200. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +5 -5
  201. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/react-loadable-manifest.json +1 -8
  202. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +38 -38
  203. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  204. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  205. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  206. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/build-manifest.json +5 -5
  207. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +1 -8
  208. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  209. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +1 -1
  210. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  211. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  212. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +5 -5
  213. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/react-loadable-manifest.json +1 -8
  214. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  215. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  216. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  217. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  218. package/web/.next/server/app/(dashboard)/chat/page/build-manifest.json +5 -5
  219. package/web/.next/server/app/(dashboard)/chat/page/react-loadable-manifest.json +1 -8
  220. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  221. package/web/.next/server/app/(dashboard)/chat/page.js +1 -1
  222. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  223. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  224. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +5 -5
  225. package/web/.next/server/app/(dashboard)/create/page/react-loadable-manifest.json +1 -8
  226. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
  227. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  228. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  229. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  230. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +5 -5
  231. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/react-loadable-manifest.json +1 -8
  232. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
  233. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  234. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  235. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  236. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +5 -5
  237. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/react-loadable-manifest.json +1 -8
  238. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +38 -38
  239. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  240. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  241. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  242. package/web/.next/server/app/(dashboard)/page/build-manifest.json +5 -5
  243. package/web/.next/server/app/(dashboard)/page/react-loadable-manifest.json +1 -8
  244. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  245. package/web/.next/server/app/(dashboard)/page.js +1 -1
  246. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  247. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  248. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/build-manifest.json +5 -5
  249. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/react-loadable-manifest.json +1 -8
  250. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  251. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +1 -1
  252. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  253. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  254. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +5 -5
  255. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/react-loadable-manifest.json +1 -8
  256. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  257. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  258. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  259. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  260. package/web/.next/server/app/_global-error/page/build-manifest.json +5 -5
  261. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  262. package/web/.next/server/app/_global-error.html +2 -2
  263. package/web/.next/server/app/_global-error.rsc +7 -7
  264. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  265. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  266. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  267. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  268. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  269. package/web/.next/server/app/_not-found/page/build-manifest.json +5 -5
  270. package/web/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -8
  271. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  272. package/web/.next/server/app/_not-found/page.js +1 -1
  273. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  274. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  275. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  276. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  277. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  278. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  279. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route/app-paths-manifest.json +3 -0
  280. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route/build-manifest.json +11 -0
  281. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route/server-reference-manifest.json +4 -0
  282. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route.js +7 -0
  283. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route.js.map +5 -0
  284. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route.js.nft.json +1 -0
  285. package/web/.next/server/app/api/interactive/chat/[featureId]/respond/route_client-reference-manifest.js +2 -0
  286. package/web/.next/server/app/settings/page/build-manifest.json +5 -5
  287. package/web/.next/server/app/settings/page/react-loadable-manifest.json +1 -8
  288. package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
  289. package/web/.next/server/app/settings/page.js +3 -3
  290. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  291. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  292. package/web/.next/server/app/skills/page/build-manifest.json +5 -5
  293. package/web/.next/server/app/skills/page/react-loadable-manifest.json +1 -8
  294. package/web/.next/server/app/skills/page/server-reference-manifest.json +52 -22
  295. package/web/.next/server/app/skills/page.js +3 -2
  296. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  297. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  298. package/web/.next/server/app/tools/page/build-manifest.json +5 -5
  299. package/web/.next/server/app/tools/page/react-loadable-manifest.json +1 -8
  300. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  301. package/web/.next/server/app/tools/page.js +1 -1
  302. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  303. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  304. package/web/.next/server/app/version/page/build-manifest.json +5 -5
  305. package/web/.next/server/app/version/page/react-loadable-manifest.json +1 -8
  306. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  307. package/web/.next/server/app/version/page.js +1 -1
  308. package/web/.next/server/app/version/page.js.nft.json +1 -1
  309. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  310. package/web/.next/server/app-paths-manifest.json +1 -0
  311. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_[featureId]_respond_route_actions_990d51bd.js +3 -0
  312. package/web/.next/server/chunks/8ba4b_server_app_api_interactive_chat_[featureId]_respond_route_actions_990d51bd.js.map +1 -0
  313. package/web/.next/server/chunks/[root-of-the-server]__31944fa2._.js +3 -0
  314. package/web/.next/server/chunks/[root-of-the-server]__31944fa2._.js.map +1 -0
  315. package/web/.next/server/chunks/[root-of-the-server]__8a281f8d._.js +9 -3
  316. package/web/.next/server/chunks/[root-of-the-server]__8a281f8d._.js.map +1 -1
  317. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  318. package/web/.next/server/chunks/[root-of-the-server]__c78383b1._.js +1 -1
  319. package/web/.next/server/chunks/[root-of-the-server]__c78383b1._.js.map +1 -1
  320. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  321. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  322. package/web/.next/server/chunks/ssr/{_0727935d._.js → 403f9_next_8a33ddee._.js} +2 -2
  323. package/web/.next/server/chunks/ssr/403f9_next_8a33ddee._.js.map +1 -0
  324. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  325. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  326. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +3 -3
  327. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  328. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1abe77bb._.js → [root-of-the-server]__1b4846fd._.js} +3 -3
  329. package/web/.next/server/chunks/ssr/[root-of-the-server]__1b4846fd._.js.map +1 -0
  330. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
  331. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
  332. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  333. package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js +1 -1
  334. package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js.map +1 -1
  335. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js +2 -2
  336. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js.map +1 -1
  337. package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js +1 -1
  338. package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js.map +1 -1
  339. package/web/.next/server/chunks/ssr/{[root-of-the-server]__8b0aac03._.js → [root-of-the-server]__7ded596d._.js} +2 -2
  340. package/web/.next/server/chunks/ssr/[root-of-the-server]__7ded596d._.js.map +1 -0
  341. package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js +2 -2
  342. package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js.map +1 -1
  343. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
  344. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
  345. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js +1 -1
  346. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js.map +1 -1
  347. package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js +1 -1
  348. package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js.map +1 -1
  349. package/web/.next/server/chunks/ssr/[root-of-the-server]__e07df893._.js +3 -0
  350. package/web/.next/server/chunks/ssr/[root-of-the-server]__e07df893._.js.map +1 -0
  351. package/web/.next/server/chunks/ssr/_02e01240._.js +1 -1
  352. package/web/.next/server/chunks/ssr/_02e01240._.js.map +1 -1
  353. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  354. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  355. package/web/.next/server/chunks/ssr/_08e6a4c5._.js +3 -0
  356. package/web/.next/server/chunks/ssr/_08e6a4c5._.js.map +1 -0
  357. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  358. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  359. package/web/.next/server/chunks/ssr/_18886033._.js +1 -1
  360. package/web/.next/server/chunks/ssr/_18886033._.js.map +1 -1
  361. package/web/.next/server/chunks/ssr/_1e08a336._.js.map +1 -1
  362. package/web/.next/server/chunks/ssr/_22e00a14._.js +1 -1
  363. package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -1
  364. package/web/.next/server/chunks/ssr/_45496654._.js +3 -0
  365. package/web/.next/server/chunks/ssr/_45496654._.js.map +1 -0
  366. package/web/.next/server/chunks/ssr/_4cbb7f95._.js +3 -0
  367. package/web/.next/server/chunks/ssr/_4cbb7f95._.js.map +1 -0
  368. package/web/.next/server/chunks/ssr/_5119a3df._.js.map +1 -1
  369. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  370. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  371. package/web/.next/server/chunks/ssr/{_a5913a26._.js → _79b66f37._.js} +2 -2
  372. package/web/.next/server/chunks/ssr/{_a5913a26._.js.map → _79b66f37._.js.map} +1 -1
  373. package/web/.next/server/chunks/ssr/{_b4c3ffcc._.js → _8b9129da._.js} +2 -2
  374. package/web/.next/server/chunks/ssr/{_b4c3ffcc._.js.map → _8b9129da._.js.map} +1 -1
  375. package/web/.next/server/chunks/ssr/_a5a5901d._.js +1 -1
  376. package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -1
  377. package/web/.next/server/chunks/ssr/_a963dd3c._.js +3 -0
  378. package/web/.next/server/chunks/ssr/_a963dd3c._.js.map +1 -0
  379. package/web/.next/server/chunks/ssr/_ad09f271._.js +1 -1
  380. package/web/.next/server/chunks/ssr/_ad09f271._.js.map +1 -1
  381. package/web/.next/server/chunks/ssr/_c3f595c6._.js +1 -1
  382. package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -1
  383. package/web/.next/server/chunks/ssr/_d78b2b6e._.js +3 -0
  384. package/web/.next/server/chunks/ssr/_d78b2b6e._.js.map +1 -0
  385. package/web/.next/server/chunks/ssr/_df737cce._.js +3 -0
  386. package/web/.next/server/chunks/ssr/_df737cce._.js.map +1 -0
  387. package/web/.next/server/chunks/ssr/_e3f14907._.js +9 -0
  388. package/web/.next/server/chunks/ssr/_e3f14907._.js.map +1 -0
  389. package/web/.next/server/chunks/ssr/_ea9e1556._.js +1 -1
  390. package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +1 -1
  391. package/web/.next/server/chunks/ssr/_f1ba9be6._.js +2 -2
  392. package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -1
  393. package/web/.next/server/chunks/ssr/_f33cd07e._.js +2 -2
  394. package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -1
  395. package/web/.next/server/chunks/ssr/_f8b45233._.js +1 -1
  396. package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -1
  397. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  398. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  399. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  400. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  401. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  402. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  403. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  404. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  405. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  406. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +3 -0
  407. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -0
  408. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js +1 -1
  409. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js.map +1 -1
  410. package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js +1 -1
  411. package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js.map +1 -1
  412. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js +1 -1
  413. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js.map +1 -1
  414. package/web/.next/server/middleware-build-manifest.js +5 -5
  415. package/web/.next/server/pages/500.html +2 -2
  416. package/web/.next/server/server-reference-manifest.js +1 -1
  417. package/web/.next/server/server-reference-manifest.json +89 -59
  418. package/web/.next/static/chunks/0839854125212e6b.js +1 -0
  419. package/web/.next/static/chunks/{fe70e73feb07bcfd.js → 08ec4c9ab61717aa.js} +1 -1
  420. package/web/.next/static/chunks/{dedf6ca63c5468fa.js → 09edd35d194bec06.js} +3 -3
  421. package/web/.next/static/chunks/{d4d8f0a137bd2eb4.js → 12803afee7d0afc8.js} +2 -2
  422. package/web/.next/static/chunks/19680940c0bb3c3a.js +1 -0
  423. package/web/.next/static/chunks/{0be57768a211221a.js → 37a345c8f447ab56.js} +1 -1
  424. package/web/.next/static/chunks/3cbeac4d756302bc.js +5 -0
  425. package/web/.next/static/chunks/4355f7c193b01832.js +1 -0
  426. package/web/.next/static/chunks/{7a7d7e71cf9b5a4e.js → 4669ea9953c265d2.js} +1 -1
  427. package/web/.next/static/chunks/55e9df1e73af0b3e.js +7 -0
  428. package/web/.next/static/chunks/6deedc27548cd1df.js +1 -0
  429. package/web/.next/static/chunks/7b669373b268c12b.js +1 -0
  430. package/web/.next/static/chunks/7e22b815fb2a5b1b.js +3 -0
  431. package/web/.next/static/chunks/84a181ff3270fd9f.js +1 -0
  432. package/web/.next/static/chunks/89aac43287d73b02.js +1 -0
  433. package/web/.next/static/chunks/{d7eebb5c0aa9e101.js → a818bb026935d536.js} +2 -2
  434. package/web/.next/static/chunks/b2d1da8faf0da41d.js +1 -0
  435. package/web/.next/static/chunks/b7228e77a05ccbba.js +1 -0
  436. package/web/.next/static/chunks/ba251fd9b9fd254b.js +1 -0
  437. package/web/.next/static/chunks/c11bb4718643147f.js +5 -0
  438. package/web/.next/static/chunks/{3f404f608aebc7bb.js → d4a8e02e4be71dcf.js} +1 -1
  439. package/web/.next/static/chunks/f49e0076b62c6826.js +1 -0
  440. package/web/.next/static/chunks/fbff2864f22e8c88.css +1 -0
  441. package/web/.next/static/chunks/{turbopack-432ef324fc27240c.js → turbopack-9f7dcf06ca44886d.js} +1 -1
  442. package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js.map +0 -1
  443. package/web/.next/server/chunks/ssr/[root-of-the-server]__2d0c3840._.js +0 -3
  444. package/web/.next/server/chunks/ssr/[root-of-the-server]__2d0c3840._.js.map +0 -1
  445. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js.map +0 -1
  446. package/web/.next/server/chunks/ssr/_0727935d._.js.map +0 -1
  447. package/web/.next/server/chunks/ssr/_0dc06d07._.js +0 -3
  448. package/web/.next/server/chunks/ssr/_0dc06d07._.js.map +0 -1
  449. package/web/.next/server/chunks/ssr/_3bcda5d7._.js +0 -3
  450. package/web/.next/server/chunks/ssr/_3bcda5d7._.js.map +0 -1
  451. package/web/.next/server/chunks/ssr/_4d49a312._.js +0 -3
  452. package/web/.next/server/chunks/ssr/_4d49a312._.js.map +0 -1
  453. package/web/.next/server/chunks/ssr/_506a3bc3._.js +0 -9
  454. package/web/.next/server/chunks/ssr/_506a3bc3._.js.map +0 -1
  455. package/web/.next/server/chunks/ssr/_5ab8e97d._.js +0 -3
  456. package/web/.next/server/chunks/ssr/_5ab8e97d._.js.map +0 -1
  457. package/web/.next/server/chunks/ssr/_9215e9ec._.js +0 -3
  458. package/web/.next/server/chunks/ssr/_9215e9ec._.js.map +0 -1
  459. package/web/.next/static/chunks/16eea21868510afd.js +0 -5
  460. package/web/.next/static/chunks/3208dc997aaee4d3.css +0 -1
  461. package/web/.next/static/chunks/3deefc76ea55047c.js +0 -1
  462. package/web/.next/static/chunks/40b6bcf1a2de4a0f.js +0 -1
  463. package/web/.next/static/chunks/420eb8b33d83c4cb.js +0 -1
  464. package/web/.next/static/chunks/63b0ad1dbc27a5d0.js +0 -1
  465. package/web/.next/static/chunks/65440524d7ee7d13.js +0 -1
  466. package/web/.next/static/chunks/6c634b447a6a0db8.js +0 -7
  467. package/web/.next/static/chunks/6d7b999c99d6d175.js +0 -9
  468. package/web/.next/static/chunks/6eb32cd5d2795a7c.js +0 -1
  469. package/web/.next/static/chunks/7f4d1ec4e9f921a3.js +0 -1
  470. package/web/.next/static/chunks/8180973e9cd6a99e.css +0 -1
  471. package/web/.next/static/chunks/8866edda931a81c2.js +0 -1
  472. package/web/.next/static/chunks/c0e13e7d1601bc5d.js +0 -1
  473. package/web/.next/static/chunks/c7e793951b20a67f.js +0 -1
  474. package/web/.next/static/chunks/d6a1facd04a52af5.js +0 -5
  475. package/web/.next/static/chunks/da6d0839a24602eb.js +0 -3
  476. package/web/.next/static/chunks/db3bf9eb0b519bae.js +0 -1
  477. /package/web/.next/static/{JjjyVzk5ESdcMWkH6999z → QTub9VF21lk2PO7IJDkNp}/_buildManifest.js +0 -0
  478. /package/web/.next/static/{JjjyVzk5ESdcMWkH6999z → QTub9VF21lk2PO7IJDkNp}/_clientMiddlewareManifest.json +0 -0
  479. /package/web/.next/static/{JjjyVzk5ESdcMWkH6999z → QTub9VF21lk2PO7IJDkNp}/_ssgManifest.js +0 -0
@@ -32,6 +32,9 @@
32
32
  * errors when shep itself is running inside a Claude Code session.
33
33
  * - SDK message types are mapped to our own InteractiveAgentEvent to
34
34
  * keep the application layer decoupled from SDK specifics.
35
+ * - AskUserQuestion is intercepted via the SDK's `canUseTool` callback,
36
+ * which pauses the stream until the user responds. The callback delegates
37
+ * to the `onUserQuestion` option provided by the session service.
35
38
  */
36
39
  import { unstable_v2_createSession, unstable_v2_resumeSession, } from '@anthropic-ai/claude-agent-sdk';
37
40
  /** Default model used when options.model is not specified. */
@@ -83,9 +86,37 @@ export class ClaudeCodeInteractiveExecutor {
83
86
  buildSdkOptions(options) {
84
87
  // Strip CLAUDECODE env var to prevent nested-session detection errors.
85
88
  const { CLAUDECODE: _, ...cleanEnv } = process.env;
89
+ // Build the canUseTool callback that intercepts AskUserQuestion.
90
+ // When the agent calls AskUserQuestion, this callback:
91
+ // 1. Delegates to onUserQuestion (which notifies the UI and waits for user response)
92
+ // 2. Returns { behavior: 'allow', updatedInput } with the user's answers injected
93
+ // 3. The SDK passes the updated input to AskUserQuestion, which sees pre-filled answers
94
+ //
95
+ // For ALL other tools: auto-allow (same effect as bypassPermissions).
96
+ const canUseTool = options.onUserQuestion
97
+ ? async (toolName, input, opts) => {
98
+ if (toolName === 'AskUserQuestion') {
99
+ const questions = input.questions ?? [];
100
+ const answers = await options.onUserQuestion({
101
+ toolCallId: opts.toolUseID,
102
+ questions,
103
+ });
104
+ // Inject answers into the tool input so the SDK treats it as already answered
105
+ return {
106
+ behavior: 'allow',
107
+ updatedInput: { ...input, answers },
108
+ };
109
+ }
110
+ // Auto-allow all other tools
111
+ return { behavior: 'allow' };
112
+ }
113
+ : undefined;
86
114
  return {
87
115
  model: options.model ?? DEFAULT_MODEL,
88
- permissionMode: 'bypassPermissions',
116
+ // When onUserQuestion is provided, use canUseTool to intercept AskUserQuestion
117
+ // while auto-allowing everything else (replaces bypassPermissions).
118
+ // When not provided, use bypassPermissions for backward compatibility.
119
+ ...(canUseTool ? { canUseTool } : { permissionMode: 'bypassPermissions' }),
89
120
  env: cleanEnv,
90
121
  // Forward system prompt using preset+append pattern
91
122
  ...(options.systemPrompt && {
@@ -106,6 +137,22 @@ export class ClaudeCodeInteractiveExecutor {
106
137
  return resolvedSessionId;
107
138
  },
108
139
  send: (message) => sdkSession.send(message),
140
+ sendToolResult: (toolResult) => sdkSession.send({
141
+ type: 'user',
142
+ session_id: sdkSession.sessionId,
143
+ parent_tool_use_id: toolResult.toolCallId,
144
+ tool_use_result: toolResult.result,
145
+ message: {
146
+ role: 'user',
147
+ content: [
148
+ {
149
+ type: 'tool_result',
150
+ tool_use_id: toolResult.toolCallId,
151
+ content: JSON.stringify(toolResult.result),
152
+ },
153
+ ],
154
+ },
155
+ }),
109
156
  stream: () => this.mapStream(sdkSession, (id) => (resolvedSessionId = id)),
110
157
  close: async () => sdkSession.close(),
111
158
  abort: () => {
@@ -189,11 +236,17 @@ export class ClaudeCodeInteractiveExecutor {
189
236
  }
190
237
  }
191
238
  else if (block.type === 'tool_use') {
192
- events.push({
193
- type: 'tool_use',
194
- label: block.name,
195
- detail: JSON.stringify(block.input ?? {}),
196
- });
239
+ // AskUserQuestion is handled by canUseTool callback — don't emit as tool_use
240
+ if (block.name === 'AskUserQuestion') {
241
+ // Silently skip — the canUseTool callback already handled this
242
+ }
243
+ else {
244
+ events.push({
245
+ type: 'tool_use',
246
+ label: block.name,
247
+ detail: JSON.stringify(block.input ?? {}),
248
+ });
249
+ }
197
250
  }
198
251
  }
199
252
  }
@@ -75,6 +75,13 @@ export declare class InteractiveSessionService implements IInteractiveSessionSer
75
75
  markRead(featureId: string): Promise<void>;
76
76
  getTurnStatuses(featureIds: string[]): Promise<Map<string, string>>;
77
77
  getAllActiveTurnStatuses(): Promise<Map<string, string>>;
78
+ respondToInteraction(featureId: string, answers: Record<string, string>): Promise<void>;
79
+ /**
80
+ * Build the onUserQuestion callback for a session.
81
+ * Called by the SDK's canUseTool when the agent invokes AskUserQuestion.
82
+ * Returns a Promise that doesn't resolve until the user submits their answers.
83
+ */
84
+ private buildOnUserQuestionCallback;
78
85
  /** Find the in-memory state for an active session for a feature. */
79
86
  private findActiveStateForFeature;
80
87
  /** Resolve the agent type from an explicit override or settings. */
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-session.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/interactive/interactive-session.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,0BAA0B,EAC1B,WAAW,EACX,aAAa,EACb,SAAS,EACV,MAAM,qFAAqF,CAAC;AAC7F,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4FAA4F,CAAC;AAChJ,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4FAA4F,CAAC;AAChJ,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8EAA8E,CAAC;AAE1H,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gFAAgF,CAAC;AACzH,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AASlG,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AA0C1E;;;;;;;;;;;;;;GAcG;AACH,qBAAa,yBAA0B,YAAW,0BAA0B;IAexE,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAlBjC,0CAA0C;IAC1C,OAAO,CAAC,QAAQ,CAAmC;IACnD,wEAAwE;IACxE,OAAO,CAAC,sBAAsB,CAA6B;IAC3D;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB,CAAwD;gBAG/D,WAAW,EAAE,6BAA6B,EAC1C,WAAW,EAAE,6BAA6B,EAC1C,eAAe,EAAE,qBAAqB,EACtC,WAAW,EAAE,kBAAkB,EAC/B,cAAc,EAAE,qBAAqB;IAOlD,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC;IAgE9B;;;;;OAKG;YACW,iBAAiB;IAgRzB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0C7C,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAuClF;;OAEG;YACW,qBAAqB;IAyP7B,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAI7E,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAIvE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,aAAa;IAc5E,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC;IA2ExB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAmFzD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,aAAa;IAkBrF,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc1C,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAInE,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI9D,oEAAoE;IACpE,OAAO,CAAC,yBAAyB;IAWjC,oEAAoE;IACpE,OAAO,CAAC,gBAAgB;IAUxB,mEAAmE;IACnE,OAAO,CAAC,iBAAiB;IAezB;;;OAGG;YACW,gBAAgB;IA0B9B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM;IAYd,6DAA6D;IAC7D,OAAO,CAAC,UAAU;IAQlB,2CAA2C;IAC3C,OAAO,CAAC,UAAU;IAOlB,mEAAmE;IACnE,OAAO,CAAC,YAAY;IAOpB,6EAA6E;IAC7E,OAAO,CAAC,MAAM;CAKf"}
1
+ {"version":3,"file":"interactive-session.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/interactive/interactive-session.service.ts"],"names":[],"mappings":"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"}
@@ -80,6 +80,8 @@ export class InteractiveSessionService {
80
80
  updatedAt: now,
81
81
  };
82
82
  await this.sessionRepo.create(session);
83
+ // Mark as processing immediately so the FAB shows the spinner during boot
84
+ void this.sessionRepo.updateTurnStatus(session.id, 'processing');
83
85
  // Carry over agentSessionId from previous session so resumption works
84
86
  let previousAgentSessionId;
85
87
  for (const [, s] of this.sessions) {
@@ -113,6 +115,8 @@ export class InteractiveSessionService {
113
115
  subscribers: new Set(),
114
116
  turnInProgress: false,
115
117
  turnQueue: [],
118
+ pendingInteraction: null,
119
+ pendingInteractionResolver: null,
116
120
  };
117
121
  this.sessions.set(session.id, state);
118
122
  // Fire-and-forget the async boot sequence. The API returns the session
@@ -189,6 +193,9 @@ export class InteractiveSessionService {
189
193
  // Create the interactive executor and session
190
194
  const executor = this.executorFactory.createInteractiveExecutor(resolvedAgentType, authConfig);
191
195
  let handle;
196
+ // Build the onUserQuestion callback that pauses the SDK stream
197
+ // and waits for user input via the UI.
198
+ const onUserQuestion = this.buildOnUserQuestionCallback(state);
192
199
  const previousAgentSessionId = state.agentSessionId;
193
200
  if (previousAgentSessionId) {
194
201
  // Resume existing SDK session
@@ -196,6 +203,7 @@ export class InteractiveSessionService {
196
203
  cwd: worktreePath,
197
204
  model: state.model,
198
205
  systemPrompt: context,
206
+ onUserQuestion,
199
207
  });
200
208
  }
201
209
  else {
@@ -204,6 +212,7 @@ export class InteractiveSessionService {
204
212
  cwd: worktreePath,
205
213
  model: state.model,
206
214
  systemPrompt: context,
215
+ onUserQuestion,
207
216
  });
208
217
  }
209
218
  state.handle = handle;
@@ -585,6 +594,12 @@ export class InteractiveSessionService {
585
594
  });
586
595
  }
587
596
  break;
597
+ case 'user_question':
598
+ // AskUserQuestion is now handled by the canUseTool callback
599
+ // (buildOnUserQuestionCallback) which pauses the SDK stream.
600
+ // This event should not appear in the stream anymore, but if it
601
+ // does (e.g. from a different code path), ignore it here.
602
+ break;
588
603
  }
589
604
  }
590
605
  }
@@ -819,7 +834,9 @@ export class InteractiveSessionService {
819
834
  turnStatus = statuses.get(featureId) ?? 'idle';
820
835
  }
821
836
  }
822
- return { messages, sessionStatus, streamingText, sessionInfo, turnStatus };
837
+ // Include pending interaction if one exists
838
+ const pendingInteraction = state?.pendingInteraction ?? null;
839
+ return { messages, sessionStatus, streamingText, sessionInfo, turnStatus, pendingInteraction };
823
840
  }
824
841
  subscribeByFeature(featureId, onChunk) {
825
842
  // Subscribe at the feature level so the callback survives session restarts.
@@ -863,6 +880,89 @@ export class InteractiveSessionService {
863
880
  async getAllActiveTurnStatuses() {
864
881
  return this.sessionRepo.getAllActiveTurnStatuses();
865
882
  }
883
+ async respondToInteraction(featureId, answers) {
884
+ const state = this.findActiveStateForFeature(featureId);
885
+ if (!state?.pendingInteraction || !state.pendingInteractionResolver) {
886
+ throw new Error(`No pending interaction for feature ${featureId}`);
887
+ }
888
+ // Persist the user's answers as a structured user message.
889
+ // The {{interaction}} prefix lets the frontend detect and render it
890
+ // as a compact green bubble instead of a regular text message.
891
+ const interactionPayload = {
892
+ questions: state.pendingInteraction.questions.map((q) => ({
893
+ header: q.header,
894
+ question: q.question,
895
+ })),
896
+ answers,
897
+ };
898
+ const now = new Date();
899
+ const userMsg = {
900
+ id: crypto.randomUUID(),
901
+ featureId: state.featureId,
902
+ sessionId: state.sessionId,
903
+ role: InteractiveMessageRole.user,
904
+ content: `{{interaction}}${JSON.stringify(interactionPayload)}`,
905
+ createdAt: now,
906
+ updatedAt: now,
907
+ };
908
+ await this.messageRepo.create(userMsg);
909
+ // Resolve the Promise that the canUseTool callback is awaiting.
910
+ // This unblocks the SDK stream — the agent resumes with the user's answers.
911
+ state.pendingInteractionResolver(answers);
912
+ // Clear pending interaction state
913
+ state.pendingInteraction = null;
914
+ state.pendingInteractionResolver = null;
915
+ // Update turn status back to processing
916
+ void this.sessionRepo.updateTurnStatus(state.sessionId, 'processing');
917
+ // Clear the "Waiting for your response..." log
918
+ state.subscribers.forEach((sub) => sub({ delta: '', done: false }));
919
+ }
920
+ /**
921
+ * Build the onUserQuestion callback for a session.
922
+ * Called by the SDK's canUseTool when the agent invokes AskUserQuestion.
923
+ * Returns a Promise that doesn't resolve until the user submits their answers.
924
+ */
925
+ buildOnUserQuestionCallback(state) {
926
+ return async (interaction) => {
927
+ // Flush any accumulated assistant text as a separate message BEFORE
928
+ // the interaction. This ensures the agent's question text appears
929
+ // above the green answer bubble in the conversation history.
930
+ if (state.currentAssistantBuffer.trim()) {
931
+ const now = new Date();
932
+ const msg = {
933
+ id: crypto.randomUUID(),
934
+ featureId: state.featureId,
935
+ sessionId: state.sessionId,
936
+ role: InteractiveMessageRole.assistant,
937
+ content: state.currentAssistantBuffer,
938
+ createdAt: now,
939
+ updatedAt: now,
940
+ };
941
+ await this.messageRepo.create(msg);
942
+ state.currentAssistantBuffer = '';
943
+ state.toolEventsLog = [];
944
+ // Notify subscribers so the frontend picks up the new message
945
+ state.subscribers.forEach((sub) => sub({ delta: '', done: true }));
946
+ // Small delay so the refetch completes before the interaction appears
947
+ await new Promise((r) => setTimeout(r, 100));
948
+ }
949
+ // Store the interaction data for the frontend
950
+ state.pendingInteraction = interaction;
951
+ // Update turn status so the dot indicator shows amber
952
+ void this.sessionRepo.updateTurnStatus(state.sessionId, 'awaiting_input');
953
+ // Notify subscribers so SSE pushes the interaction to the frontend
954
+ state.subscribers.forEach((sub) => sub({
955
+ delta: '',
956
+ done: false,
957
+ log: 'Waiting for your response...',
958
+ interaction,
959
+ }));
960
+ // Create a Promise that will be resolved when the user calls respondToInteraction
961
+ return new Promise((resolve) => {
962
+ state.pendingInteractionResolver = resolve;
963
+ });
964
+ };
965
+ }
866
966
  /** Find the in-memory state for an active session for a feature. */
867
967
  findActiveStateForFeature(featureId) {
868
968
  for (const state of this.sessions.values()) {
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Skill Injector Service Implementation
3
+ *
4
+ * Injects curated agent skills into worktrees during feature creation.
5
+ * Handles local skill copying via fs.cp, remote skill installation via npx,
6
+ * SKILL.md idempotency checks, and .gitignore management.
7
+ *
8
+ * Uses constructor-injected ExecFunction for process execution (npx, git)
9
+ * and direct fs/promises imports for filesystem operations, following
10
+ * the established codebase conventions.
11
+ */
12
+ import type { SkillInjectionConfig } from '../../domain/generated/output.js';
13
+ import type { ISkillInjectorService, SkillInjectionResult } from '../../application/ports/output/services/skill-injector.interface.js';
14
+ import type { ExecFunction } from './git/worktree.service.js';
15
+ export declare class SkillInjectorService implements ISkillInjectorService {
16
+ private readonly execFile;
17
+ constructor(execFile: ExecFunction);
18
+ inject(worktreePath: string, config: SkillInjectionConfig, repoRoot?: string): Promise<SkillInjectionResult>;
19
+ private validateSkill;
20
+ private isSkillPresent;
21
+ private injectLocalSkill;
22
+ private injectRemoteSkill;
23
+ private isTrackedInGit;
24
+ private updateGitignore;
25
+ }
26
+ //# sourceMappingURL=skill-injector.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-injector.service.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/services/skill-injector.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,oBAAoB,EAAe,MAAM,kCAAkC,CAAC;AAE1F,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,qEAAqE,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAY9D,qBACa,oBAAqB,YAAW,qBAAqB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,oBAAoB,CAAC;IAgDhC,OAAO,CAAC,aAAa;YAoBP,cAAc;YASd,gBAAgB;YAkBhB,iBAAiB;YAiCjB,cAAc;YAWd,eAAe;CA4C9B"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Skill Injector Service Implementation
3
+ *
4
+ * Injects curated agent skills into worktrees during feature creation.
5
+ * Handles local skill copying via fs.cp, remote skill installation via npx,
6
+ * SKILL.md idempotency checks, and .gitignore management.
7
+ *
8
+ * Uses constructor-injected ExecFunction for process execution (npx, git)
9
+ * and direct fs/promises imports for filesystem operations, following
10
+ * the established codebase conventions.
11
+ */
12
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
13
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
15
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
16
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
17
+ };
18
+ var __metadata = (this && this.__metadata) || function (k, v) {
19
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
20
+ };
21
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
22
+ return function (target, key) { decorator(target, key, paramIndex); }
23
+ };
24
+ import { access, cp, mkdir, readFile, writeFile } from 'node:fs/promises';
25
+ import { join } from 'node:path';
26
+ import { injectable, inject } from 'tsyringe';
27
+ import { SkillSourceType } from '../../domain/generated/output.js';
28
+ const SKILLS_DIR = '.claude/skills';
29
+ const SKILL_MARKER = 'SKILL.md';
30
+ const REMOTE_SKILL_TIMEOUT_MS = 30_000;
31
+ /** Shell metacharacters that must not appear in skill source strings */
32
+ const SHELL_METACHAR_PATTERN = /[;|&$`\\(){}< >]/;
33
+ /** Patterns that indicate path traversal in skill names */
34
+ const PATH_TRAVERSAL_PATTERN = /\.\./;
35
+ let SkillInjectorService = class SkillInjectorService {
36
+ execFile;
37
+ constructor(execFile) {
38
+ this.execFile = execFile;
39
+ }
40
+ async inject(worktreePath, config, repoRoot) {
41
+ // Validate worktree path exists
42
+ await access(worktreePath);
43
+ const result = {
44
+ injected: [],
45
+ skipped: [],
46
+ failed: [],
47
+ };
48
+ if (!config.skills.length) {
49
+ return result;
50
+ }
51
+ // Bootstrap .claude/skills/ directory
52
+ const skillsDir = join(worktreePath, SKILLS_DIR);
53
+ await mkdir(skillsDir, { recursive: true });
54
+ // Process each skill
55
+ for (const skill of config.skills) {
56
+ // Validate skill name and source
57
+ const validationError = this.validateSkill(skill);
58
+ if (validationError) {
59
+ result.failed.push({ name: skill.name, error: validationError });
60
+ continue;
61
+ }
62
+ // Idempotency check: skip if SKILL.md already exists
63
+ if (await this.isSkillPresent(worktreePath, skill.name)) {
64
+ result.skipped.push(skill.name);
65
+ continue;
66
+ }
67
+ // Inject based on type
68
+ if (skill.type === SkillSourceType.Local) {
69
+ await this.injectLocalSkill(worktreePath, skill, repoRoot, result);
70
+ }
71
+ else {
72
+ await this.injectRemoteSkill(worktreePath, skill, result);
73
+ }
74
+ }
75
+ // Update .gitignore for injected and skipped untracked skills
76
+ const allSkillNames = [...result.injected, ...result.skipped];
77
+ await this.updateGitignore(worktreePath, allSkillNames);
78
+ return result;
79
+ }
80
+ validateSkill(skill) {
81
+ // Validate skill name
82
+ if (PATH_TRAVERSAL_PATTERN.test(skill.name)) {
83
+ return `invalid skill name '${skill.name}': contains path traversal`;
84
+ }
85
+ if (skill.name.startsWith('/')) {
86
+ return `invalid skill name '${skill.name}': absolute path not allowed`;
87
+ }
88
+ if (skill.name.includes('\\')) {
89
+ return `invalid skill name '${skill.name}': backslash not allowed`;
90
+ }
91
+ // Validate source for remote skills (shell injection prevention)
92
+ if (skill.type === SkillSourceType.Remote && SHELL_METACHAR_PATTERN.test(skill.source)) {
93
+ return `invalid source '${skill.source}': contains shell metacharacters`;
94
+ }
95
+ return undefined;
96
+ }
97
+ async isSkillPresent(worktreePath, skillName) {
98
+ try {
99
+ await access(join(worktreePath, SKILLS_DIR, skillName, SKILL_MARKER));
100
+ return true;
101
+ }
102
+ catch {
103
+ return false;
104
+ }
105
+ }
106
+ async injectLocalSkill(worktreePath, skill, repoRoot, result) {
107
+ const sourcePath = repoRoot ? join(repoRoot, skill.source) : skill.source;
108
+ const destPath = join(worktreePath, SKILLS_DIR, skill.name);
109
+ try {
110
+ await cp(sourcePath, destPath, { recursive: true });
111
+ result.injected.push(skill.name);
112
+ }
113
+ catch (error) {
114
+ const message = error instanceof Error ? error.message : String(error);
115
+ result.failed.push({ name: skill.name, error: message });
116
+ }
117
+ }
118
+ async injectRemoteSkill(worktreePath, skill, result) {
119
+ const controller = new AbortController();
120
+ const timer = setTimeout(() => controller.abort(), REMOTE_SKILL_TIMEOUT_MS);
121
+ try {
122
+ const args = ['skills', 'add', skill.source, '--yes'];
123
+ if (skill.remoteSkillName) {
124
+ args.push('--skill', skill.remoteSkillName);
125
+ }
126
+ await this.execFile('npx', args, {
127
+ cwd: worktreePath,
128
+ signal: controller.signal,
129
+ });
130
+ result.injected.push(skill.name);
131
+ }
132
+ catch (error) {
133
+ const isTimeout = error instanceof Error && error.name === 'AbortError';
134
+ const message = isTimeout
135
+ ? `timeout: remote skill installation exceeded ${REMOTE_SKILL_TIMEOUT_MS / 1000}s`
136
+ : error instanceof Error
137
+ ? error.message
138
+ : String(error);
139
+ result.failed.push({ name: skill.name, error: message });
140
+ }
141
+ finally {
142
+ clearTimeout(timer);
143
+ }
144
+ }
145
+ async isTrackedInGit(worktreePath, skillName) {
146
+ try {
147
+ await this.execFile('git', ['ls-files', '--error-unmatch', `${SKILLS_DIR}/${skillName}/`], {
148
+ cwd: worktreePath,
149
+ });
150
+ return true;
151
+ }
152
+ catch {
153
+ return false;
154
+ }
155
+ }
156
+ async updateGitignore(worktreePath, skillNames) {
157
+ if (!skillNames.length)
158
+ return;
159
+ // Determine which skills need .gitignore entries (untracked only)
160
+ const untrackedSkills = [];
161
+ for (const name of skillNames) {
162
+ if (!(await this.isTrackedInGit(worktreePath, name))) {
163
+ untrackedSkills.push(name);
164
+ }
165
+ }
166
+ if (!untrackedSkills.length)
167
+ return;
168
+ const gitignorePath = join(worktreePath, '.gitignore');
169
+ // Read existing .gitignore (or start with empty string)
170
+ let existingContent = '';
171
+ try {
172
+ const content = await readFile(gitignorePath, 'utf-8');
173
+ existingContent = typeof content === 'string' ? content : '';
174
+ }
175
+ catch {
176
+ // File doesn't exist — will create it
177
+ }
178
+ // Determine which entries are new
179
+ const existingLines = new Set(existingContent.split('\n').map((line) => line.trim()));
180
+ const newEntries = [];
181
+ for (const name of untrackedSkills) {
182
+ const pattern = `${SKILLS_DIR}/${name}/`;
183
+ if (!existingLines.has(pattern)) {
184
+ newEntries.push(pattern);
185
+ }
186
+ }
187
+ if (!newEntries.length)
188
+ return;
189
+ // Append new entries, ensuring trailing newline
190
+ const needsNewline = existingContent.length > 0 && !existingContent.endsWith('\n');
191
+ const separator = needsNewline ? '\n' : '';
192
+ const updatedContent = `${existingContent + separator + newEntries.join('\n')}\n`;
193
+ await writeFile(gitignorePath, updatedContent);
194
+ }
195
+ };
196
+ SkillInjectorService = __decorate([
197
+ injectable(),
198
+ __param(0, inject('ExecFunction')),
199
+ __metadata("design:paramtypes", [Function])
200
+ ], SkillInjectorService);
201
+ export { SkillInjectorService };
@@ -1 +1 @@
1
- {"version":3,"file":"new.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/new.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwEpC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAmK1C"}
1
+ {"version":3,"file":"new.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/new.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyEpC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAsK1C"}
@@ -70,6 +70,8 @@ export function createNewCommand() {
70
70
  .option('--no-fast', t('cli:commands.feat.new.noFastOption'))
71
71
  .option('--model <model>', t('cli:commands.feat.new.modelOption'))
72
72
  .option('--no-rebase', t('cli:commands.feat.new.noRebaseOption'))
73
+ .option('--inject-skills', t('cli:commands.feat.new.injectSkillsOption'))
74
+ .option('--no-inject-skills', t('cli:commands.feat.new.noInjectSkillsOption'))
73
75
  .option('--attach <path>', t('cli:commands.feat.new.attachOption'), collect, [])
74
76
  .action(async (description, options) => {
75
77
  try {
@@ -131,6 +133,7 @@ export function createNewCommand() {
131
133
  ...(fast && { fast: true }),
132
134
  ...(options.model !== undefined && { model: options.model }),
133
135
  ...(attachmentPaths.length > 0 && { attachmentPaths }),
136
+ ...(options.injectSkills !== undefined && { injectSkills: options.injectSkills }),
134
137
  rebaseBeforeBranch: options.rebase,
135
138
  }));
136
139
  const { feature, warning } = result;
@@ -0,0 +1,7 @@
1
+ import type { SkillSource } from '../../../../../packages/core/src/domain/generated/output.js';
2
+ export interface AddInjectedSkillResult {
3
+ success: boolean;
4
+ error?: string;
5
+ }
6
+ export declare function addInjectedSkill(skill: SkillSource): Promise<AddInjectedSkillResult>;
7
+ //# sourceMappingURL=add-injected-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-injected-skill.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/add-injected-skill.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAExE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAgC1F"}
@@ -0,0 +1,34 @@
1
+ 'use server';
2
+ import { revalidatePath } from 'next/cache';
3
+ import { resolve } from '../../lib/server-container.js';
4
+ import { updateSettings as updateSettingsSingleton } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
5
+ export async function addInjectedSkill(skill) {
6
+ try {
7
+ const loadUseCase = resolve('LoadSettingsUseCase');
8
+ const current = await loadUseCase.execute();
9
+ const existingSkills = current.workflow.skillInjection?.skills ?? [];
10
+ if (existingSkills.some((s) => s.name === skill.name)) {
11
+ return { success: false, error: `Skill "${skill.name}" is already configured` };
12
+ }
13
+ const updated = {
14
+ ...current,
15
+ workflow: {
16
+ ...current.workflow,
17
+ skillInjection: {
18
+ enabled: current.workflow.skillInjection?.enabled ?? true,
19
+ skills: [...existingSkills, skill],
20
+ },
21
+ },
22
+ updatedAt: new Date(),
23
+ };
24
+ const updateUseCase = resolve('UpdateSettingsUseCase');
25
+ await updateUseCase.execute(updated);
26
+ updateSettingsSingleton(updated);
27
+ revalidatePath('/skills');
28
+ return { success: true };
29
+ }
30
+ catch (error) {
31
+ const message = error instanceof Error ? error.message : 'Failed to add skill';
32
+ return { success: false, error: message };
33
+ }
34
+ }
@@ -37,6 +37,8 @@ interface CreateFeatureInput {
37
37
  model?: string;
38
38
  /** Sync main from remote before creating the feature branch (default: true). */
39
39
  rebaseBeforeBranch?: boolean;
40
+ /** Inject curated skills into the feature worktree. */
41
+ injectSkills?: boolean;
40
42
  }
41
43
  export declare function createFeature(input: CreateFeatureInput): Promise<{
42
44
  feature?: Feature;
@@ -1 +1 @@
1
- {"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAGpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uFAAuF;IACvF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiGhD"}
1
+ {"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAGpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uFAAuF;IACvF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uDAAuD;IACvD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoGhD"}
@@ -2,7 +2,7 @@
2
2
  import { resolve } from '../../lib/server-container.js';
3
3
  import { composeUserInput } from './compose-user-input.js';
4
4
  export async function createFeature(input) {
5
- const { description, repositoryPath, attachments, sessionId, approvalGates, push, openPr, parentId, fast, pending, forkAndPr, commitSpecs, ciWatchEnabled, enableEvidence, commitEvidence, agentType, model, rebaseBeforeBranch, } = input;
5
+ const { description, repositoryPath, attachments, sessionId, approvalGates, push, openPr, parentId, fast, pending, forkAndPr, commitSpecs, ciWatchEnabled, enableEvidence, commitEvidence, agentType, model, rebaseBeforeBranch, injectSkills, } = input;
6
6
  if (!description?.trim()) {
7
7
  return { error: 'description is required' };
8
8
  }
@@ -36,6 +36,7 @@ export async function createFeature(input) {
36
36
  ...(agentType ? { agentType } : {}),
37
37
  ...(model ? { model } : {}),
38
38
  ...(rebaseBeforeBranch != null ? { rebaseBeforeBranch } : {}),
39
+ ...(injectSkills != null ? { injectSkills } : {}),
39
40
  });
40
41
  // Phase 2 (background): metadata generation, worktree, spec, agent spawn
41
42
  // Fire-and-forget — the UI gets the real feature ID immediately
@@ -58,6 +59,7 @@ export async function createFeature(input) {
58
59
  ...(model ? { model } : {}),
59
60
  ...(sessionId ? { sessionId } : {}),
60
61
  ...(rebaseBeforeBranch != null ? { rebaseBeforeBranch } : {}),
62
+ ...(injectSkills != null ? { injectSkills } : {}),
61
63
  }, shouldSpawn)
62
64
  .catch((err) => {
63
65
  // eslint-disable-next-line no-console
@@ -10,6 +10,7 @@ export interface WorkflowDefaults {
10
10
  enableEvidence: boolean;
11
11
  commitEvidence: boolean;
12
12
  fast: boolean;
13
+ injectSkills: boolean;
13
14
  }
14
15
  export declare function getWorkflowDefaults(): Promise<WorkflowDefaults>;
15
16
  //# sourceMappingURL=get-workflow-defaults.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-workflow-defaults.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-workflow-defaults.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAiBrE"}
1
+ {"version":3,"file":"get-workflow-defaults.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-workflow-defaults.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAkBrE"}
@@ -15,5 +15,6 @@ export async function getWorkflowDefaults() {
15
15
  enableEvidence: workflow.enableEvidence,
16
16
  commitEvidence: workflow.commitEvidence,
17
17
  fast: workflow.defaultFastMode,
18
+ injectSkills: workflow.skillInjection?.enabled ?? false,
18
19
  };
19
20
  }