@shepai/cli 1.169.0 → 1.169.1-pr509.3238903

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 (384) 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/services/index.d.ts +1 -0
  7. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.d.ts +39 -0
  9. package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.d.ts.map +1 -0
  10. package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.js +8 -0
  11. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.d.ts.map +1 -1
  12. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.js +1 -0
  13. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +3 -1
  14. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  15. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +22 -3
  16. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +2 -0
  17. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
  18. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  19. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +55 -1
  20. package/dist/packages/core/src/domain/generated/output.d.ts +50 -0
  21. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  22. package/dist/packages/core/src/domain/generated/output.js +5 -0
  23. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/di/container.js +2 -0
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +2 -0
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +6 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +2 -0
  29. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +27 -0
  31. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-skill-injection-config.d.ts +15 -0
  32. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-skill-injection-config.d.ts.map +1 -0
  33. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-skill-injection-config.js +23 -0
  34. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-injected-skills-to-features.d.ts +11 -0
  35. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-injected-skills-to-features.d.ts.map +1 -0
  36. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-injected-skills-to-features.js +19 -0
  37. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
  38. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +8 -4
  39. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js +1 -1
  40. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.js +1 -1
  41. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js +1 -1
  42. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +1 -1
  43. package/dist/packages/core/src/infrastructure/services/skill-injector.service.d.ts +26 -0
  44. package/dist/packages/core/src/infrastructure/services/skill-injector.service.d.ts.map +1 -0
  45. package/dist/packages/core/src/infrastructure/services/skill-injector.service.js +201 -0
  46. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  47. package/dist/src/presentation/cli/commands/feat/new.command.js +3 -0
  48. package/dist/src/presentation/web/app/actions/add-injected-skill.d.ts +7 -0
  49. package/dist/src/presentation/web/app/actions/add-injected-skill.d.ts.map +1 -0
  50. package/dist/src/presentation/web/app/actions/add-injected-skill.js +34 -0
  51. package/dist/src/presentation/web/app/actions/create-feature.d.ts +2 -0
  52. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
  53. package/dist/src/presentation/web/app/actions/create-feature.js +3 -1
  54. package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts +1 -0
  55. package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts.map +1 -1
  56. package/dist/src/presentation/web/app/actions/get-workflow-defaults.js +1 -0
  57. package/dist/src/presentation/web/app/actions/remove-injected-skill.d.ts +6 -0
  58. package/dist/src/presentation/web/app/actions/remove-injected-skill.d.ts.map +1 -0
  59. package/dist/src/presentation/web/app/actions/remove-injected-skill.js +35 -0
  60. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  61. package/dist/src/presentation/web/app/build-feature-node-data.js +2 -0
  62. package/dist/src/presentation/web/app/skills/page.d.ts.map +1 -1
  63. package/dist/src/presentation/web/app/skills/page.js +6 -1
  64. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +2 -0
  65. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  66. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +6 -2
  67. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  68. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +1 -0
  69. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
  70. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +10 -4
  71. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +2 -0
  72. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
  73. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +12 -0
  74. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +4 -0
  75. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  76. package/dist/src/presentation/web/components/features/skills/add-skill-dialog.d.ts +10 -0
  77. package/dist/src/presentation/web/components/features/skills/add-skill-dialog.d.ts.map +1 -0
  78. package/dist/src/presentation/web/components/features/skills/add-skill-dialog.js +56 -0
  79. package/dist/src/presentation/web/components/features/skills/add-skill-dialog.stories.d.ts +16 -0
  80. package/dist/src/presentation/web/components/features/skills/add-skill-dialog.stories.d.ts.map +1 -0
  81. package/dist/src/presentation/web/components/features/skills/add-skill-dialog.stories.js +66 -0
  82. package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.d.ts +8 -0
  83. package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.d.ts.map +1 -0
  84. package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.js +42 -0
  85. package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.stories.d.ts +16 -0
  86. package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.stories.d.ts.map +1 -0
  87. package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.stories.js +69 -0
  88. package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts +3 -1
  89. package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts.map +1 -1
  90. package/dist/src/presentation/web/components/features/skills/skills-page-client.js +5 -3
  91. package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.d.ts +1 -0
  92. package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.d.ts.map +1 -1
  93. package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.js +27 -0
  94. package/dist/translations/ar/cli.json +2 -0
  95. package/dist/translations/ar/web.json +15 -11
  96. package/dist/translations/de/cli.json +2 -0
  97. package/dist/translations/de/web.json +35 -17
  98. package/dist/translations/en/cli.json +2 -0
  99. package/dist/translations/en/web.json +4 -0
  100. package/dist/translations/es/cli.json +2 -0
  101. package/dist/translations/es/web.json +16 -12
  102. package/dist/translations/fr/cli.json +2 -0
  103. package/dist/translations/fr/web.json +16 -12
  104. package/dist/translations/he/cli.json +2 -0
  105. package/dist/translations/he/web.json +16 -12
  106. package/dist/translations/pt/cli.json +2 -0
  107. package/dist/translations/pt/web.json +16 -12
  108. package/dist/translations/ru/cli.json +2 -0
  109. package/dist/translations/ru/web.json +16 -12
  110. package/dist/tsconfig.build.tsbuildinfo +1 -1
  111. package/package.json +2 -1
  112. package/web/.next/BUILD_ID +1 -1
  113. package/web/.next/build-manifest.json +5 -5
  114. package/web/.next/fallback-build-manifest.json +2 -2
  115. package/web/.next/prerender-manifest.json +3 -3
  116. package/web/.next/required-server-files.js +3 -3
  117. package/web/.next/required-server-files.json +3 -3
  118. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/build-manifest.json +3 -3
  119. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  120. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
  121. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  122. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  123. package/web/.next/server/app/(dashboard)/@drawer/chat/page/build-manifest.json +3 -3
  124. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  125. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +1 -1
  126. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  127. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +3 -3
  129. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
  130. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  131. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  132. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  133. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +3 -3
  134. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
  135. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  136. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  137. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  138. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +3 -3
  139. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +38 -38
  140. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  141. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  142. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  143. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/build-manifest.json +3 -3
  144. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  145. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +1 -1
  146. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  147. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  148. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +3 -3
  149. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  150. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  151. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  152. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  153. package/web/.next/server/app/(dashboard)/chat/page/build-manifest.json +3 -3
  154. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  155. package/web/.next/server/app/(dashboard)/chat/page.js +1 -1
  156. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  157. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  158. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +3 -3
  159. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
  160. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  161. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  162. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  163. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +3 -3
  164. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
  165. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  166. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  167. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  168. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +3 -3
  169. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +38 -38
  170. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  171. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  172. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  173. package/web/.next/server/app/(dashboard)/page/build-manifest.json +3 -3
  174. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  175. package/web/.next/server/app/(dashboard)/page.js +1 -1
  176. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  177. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  178. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/build-manifest.json +3 -3
  179. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  180. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +1 -1
  181. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  182. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  183. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +3 -3
  184. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  185. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  186. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  187. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  188. package/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
  189. package/web/.next/server/app/_global-error.html +2 -2
  190. package/web/.next/server/app/_global-error.rsc +1 -1
  191. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  192. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  193. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  194. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  195. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  196. package/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
  197. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  198. package/web/.next/server/app/_not-found/page.js +1 -1
  199. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  200. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  201. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  202. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  203. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  204. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  205. package/web/.next/server/app/features/page/build-manifest.json +3 -3
  206. package/web/.next/server/app/features/page/server-reference-manifest.json +6 -6
  207. package/web/.next/server/app/features/page.js +1 -1
  208. package/web/.next/server/app/features/page.js.nft.json +1 -1
  209. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  210. package/web/.next/server/app/settings/page/build-manifest.json +3 -3
  211. package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
  212. package/web/.next/server/app/settings/page.js +3 -3
  213. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  214. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  215. package/web/.next/server/app/skills/page/build-manifest.json +3 -3
  216. package/web/.next/server/app/skills/page/server-reference-manifest.json +52 -22
  217. package/web/.next/server/app/skills/page.js +3 -2
  218. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  219. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  220. package/web/.next/server/app/tools/page/build-manifest.json +3 -3
  221. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  222. package/web/.next/server/app/tools/page.js +1 -1
  223. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  224. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  225. package/web/.next/server/app/version/page/build-manifest.json +3 -3
  226. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  227. package/web/.next/server/app/version/page.js +1 -1
  228. package/web/.next/server/app/version/page.js.nft.json +1 -1
  229. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  230. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  231. package/web/.next/server/chunks/[root-of-the-server]__c78383b1._.js +1 -1
  232. package/web/.next/server/chunks/[root-of-the-server]__c78383b1._.js.map +1 -1
  233. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  234. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  235. package/web/.next/server/chunks/ssr/{_0727935d._.js → 403f9_next_8a33ddee._.js} +2 -2
  236. package/web/.next/server/chunks/ssr/403f9_next_8a33ddee._.js.map +1 -0
  237. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  238. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  239. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +3 -3
  240. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  241. package/web/.next/server/chunks/ssr/{[root-of-the-server]__e88da4ee._.js → [root-of-the-server]__1cd4327c._.js} +2 -2
  242. package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js.map +1 -0
  243. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
  244. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
  245. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  246. package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js +1 -1
  247. package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js.map +1 -1
  248. package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js +1 -1
  249. package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js.map +1 -1
  250. package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js +1 -1
  251. package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js.map +1 -1
  252. package/web/.next/server/chunks/ssr/{[root-of-the-server]__7ffd3598._.js → [root-of-the-server]__92ffd5ee._.js} +3 -3
  253. package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js.map +1 -0
  254. package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js +2 -2
  255. package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js.map +1 -1
  256. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
  257. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
  258. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js +1 -1
  259. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js.map +1 -1
  260. package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js +1 -1
  261. package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js.map +1 -1
  262. package/web/.next/server/chunks/ssr/[root-of-the-server]__fa525872._.js +3 -0
  263. package/web/.next/server/chunks/ssr/[root-of-the-server]__fa525872._.js.map +1 -0
  264. package/web/.next/server/chunks/ssr/_02e01240._.js +1 -1
  265. package/web/.next/server/chunks/ssr/_02e01240._.js.map +1 -1
  266. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  267. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  268. package/web/.next/server/chunks/ssr/_10a571b8._.js +3 -0
  269. package/web/.next/server/chunks/ssr/{_fecec23a._.js.map → _10a571b8._.js.map} +1 -1
  270. package/web/.next/server/chunks/ssr/{_2b63b860._.js → _11cbed18._.js} +2 -2
  271. package/web/.next/server/chunks/ssr/{_2b63b860._.js.map → _11cbed18._.js.map} +1 -1
  272. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  273. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  274. package/web/.next/server/chunks/ssr/_18886033._.js +1 -1
  275. package/web/.next/server/chunks/ssr/_18886033._.js.map +1 -1
  276. package/web/.next/server/chunks/ssr/_22e00a14._.js +1 -1
  277. package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -1
  278. package/web/.next/server/chunks/ssr/_45496654._.js +3 -0
  279. package/web/.next/server/chunks/ssr/_45496654._.js.map +1 -0
  280. package/web/.next/server/chunks/ssr/_4cbb7f95._.js +1 -1
  281. package/web/.next/server/chunks/ssr/_4cbb7f95._.js.map +1 -1
  282. package/web/.next/server/chunks/ssr/_5119a3df._.js.map +1 -1
  283. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  284. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  285. package/web/.next/server/chunks/ssr/_6f35fb9a._.js +3 -0
  286. package/web/.next/server/chunks/ssr/_6f35fb9a._.js.map +1 -0
  287. package/web/.next/server/chunks/ssr/_a5a5901d._.js +1 -1
  288. package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -1
  289. package/web/.next/server/chunks/ssr/_a963dd3c._.js +3 -0
  290. package/web/.next/server/chunks/ssr/_a963dd3c._.js.map +1 -0
  291. package/web/.next/server/chunks/ssr/_ad09f271._.js +1 -1
  292. package/web/.next/server/chunks/ssr/_ad09f271._.js.map +1 -1
  293. package/web/.next/server/chunks/ssr/_c3f595c6._.js +1 -1
  294. package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -1
  295. package/web/.next/server/chunks/ssr/{_a104e947._.js → _d55b34d1._.js} +2 -2
  296. package/web/.next/server/chunks/ssr/{_a104e947._.js.map → _d55b34d1._.js.map} +1 -1
  297. package/web/.next/server/chunks/ssr/_df737cce._.js +3 -0
  298. package/web/.next/server/chunks/ssr/_df737cce._.js.map +1 -0
  299. package/web/.next/server/chunks/ssr/_e3f14907._.js +9 -0
  300. package/web/.next/server/chunks/ssr/_e3f14907._.js.map +1 -0
  301. package/web/.next/server/chunks/ssr/_ea9e1556._.js +1 -1
  302. package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +1 -1
  303. package/web/.next/server/chunks/ssr/_f1ba9be6._.js +2 -2
  304. package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -1
  305. package/web/.next/server/chunks/ssr/_f33cd07e._.js +2 -2
  306. package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -1
  307. package/web/.next/server/chunks/ssr/_f8b45233._.js +1 -1
  308. package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -1
  309. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  310. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  311. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  312. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  313. package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js +3 -0
  314. package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js.map +1 -0
  315. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  316. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  317. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  318. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  319. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  320. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +3 -0
  321. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -0
  322. package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js +1 -1
  323. package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js.map +1 -1
  324. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js +1 -1
  325. package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js.map +1 -1
  326. package/web/.next/server/middleware-build-manifest.js +3 -3
  327. package/web/.next/server/pages/500.html +2 -2
  328. package/web/.next/server/server-reference-manifest.js +1 -1
  329. package/web/.next/server/server-reference-manifest.json +89 -59
  330. package/web/.next/static/chunks/008a238e3827134a.js +1 -0
  331. package/web/.next/static/chunks/185e4f36cb6efb24.js +1 -0
  332. package/web/.next/static/chunks/{f8f63039d0d6f80b.js → 205b4659bdfc9b72.js} +1 -1
  333. package/web/.next/static/chunks/24ef0e36f68901cd.js +1 -0
  334. package/web/.next/static/chunks/74729cbad964be13.js +1 -0
  335. package/web/.next/static/chunks/{f1885dd59965e0f9.js → 783b3ac450c8199b.js} +2 -2
  336. package/web/.next/static/chunks/{57e11c48bcd1d9b8.js → 853459c5497533d4.js} +1 -1
  337. package/web/.next/static/chunks/86b3891618d9e165.js +1 -0
  338. package/web/.next/static/chunks/8cedbf904e6bca33.js +3 -0
  339. package/web/.next/static/chunks/9ba70e315d9b5dd6.js +1 -0
  340. package/web/.next/static/chunks/{32d411963c1ef448.js → a4668ef7bb93c465.js} +1 -1
  341. package/web/.next/static/chunks/b0ed1ec320a0e51a.js +1 -0
  342. package/web/.next/static/chunks/b14085e99b88e7f7.css +1 -0
  343. package/web/.next/static/chunks/b65e555419a0c664.js +1 -0
  344. package/web/.next/static/chunks/c669da1a499f4683.js +7 -0
  345. package/web/.next/static/chunks/{0f17267e5c90b232.js → cb638c28c942e3ca.js} +1 -1
  346. package/web/.next/static/chunks/cc5fe8d1d9e1e519.js +5 -0
  347. package/web/.next/static/chunks/cf1c386f350d1f1b.js +5 -0
  348. package/web/.next/static/chunks/d52622eb492eadb1.js +1 -0
  349. package/web/.next/static/chunks/{3c730d304bc35629.js → f1a5cda6353fe321.js} +1 -1
  350. package/web/.next/static/chunks/{9fa49aeaf54d09fd.js → f844d62e4159c965.js} +1 -1
  351. package/web/.next/static/chunks/{turbopack-57bb0674e2cd1d31.js → turbopack-b38a68b1b1c41a87.js} +1 -1
  352. package/web/.next/server/chunks/ssr/[root-of-the-server]__20a36a42._.js +0 -3
  353. package/web/.next/server/chunks/ssr/[root-of-the-server]__20a36a42._.js.map +0 -1
  354. package/web/.next/server/chunks/ssr/[root-of-the-server]__7ffd3598._.js.map +0 -1
  355. package/web/.next/server/chunks/ssr/[root-of-the-server]__e88da4ee._.js.map +0 -1
  356. package/web/.next/server/chunks/ssr/_0727935d._.js.map +0 -1
  357. package/web/.next/server/chunks/ssr/_0dc06d07._.js +0 -3
  358. package/web/.next/server/chunks/ssr/_0dc06d07._.js.map +0 -1
  359. package/web/.next/server/chunks/ssr/_682fc996._.js +0 -9
  360. package/web/.next/server/chunks/ssr/_682fc996._.js.map +0 -1
  361. package/web/.next/server/chunks/ssr/_6892e3b9._.js +0 -3
  362. package/web/.next/server/chunks/ssr/_6892e3b9._.js.map +0 -1
  363. package/web/.next/server/chunks/ssr/_a1068852._.js +0 -3
  364. package/web/.next/server/chunks/ssr/_a1068852._.js.map +0 -1
  365. package/web/.next/server/chunks/ssr/_fecec23a._.js +0 -3
  366. package/web/.next/server/chunks/ssr/node_modules__pnpm_12a7ede0._.js +0 -3
  367. package/web/.next/server/chunks/ssr/node_modules__pnpm_12a7ede0._.js.map +0 -1
  368. package/web/.next/static/chunks/20f7cc98a013b11c.js +0 -1
  369. package/web/.next/static/chunks/4cec255f2754e5ec.js +0 -1
  370. package/web/.next/static/chunks/4d5d80adb4397ced.js +0 -3
  371. package/web/.next/static/chunks/5b7275374d2696b3.css +0 -1
  372. package/web/.next/static/chunks/647140fe96a7c88a.js +0 -1
  373. package/web/.next/static/chunks/6d6f70ff5151b8cb.js +0 -7
  374. package/web/.next/static/chunks/725e8bc88459d9d0.js +0 -1
  375. package/web/.next/static/chunks/7f3ce661fcc57b65.js +0 -5
  376. package/web/.next/static/chunks/84586f075208b491.js +0 -1
  377. package/web/.next/static/chunks/982aef195c118996.js +0 -1
  378. package/web/.next/static/chunks/99bfac1c0b8b19b7.js +0 -1
  379. package/web/.next/static/chunks/9d57e438c993d9f3.js +0 -1
  380. package/web/.next/static/chunks/c3ef3b892f7794ec.js +0 -1
  381. package/web/.next/static/chunks/dc134f3f58cdf850.js +0 -5
  382. /package/web/.next/static/{t2E8atZdYFJbeTbPcqx9J → w_8Pssf6--RSvCF6kGM86}/_buildManifest.js +0 -0
  383. /package/web/.next/static/{t2E8atZdYFJbeTbPcqx9J → w_8Pssf6--RSvCF6kGM86}/_clientMiddlewareManifest.json +0 -0
  384. /package/web/.next/static/{t2E8atZdYFJbeTbPcqx9J → w_8Pssf6--RSvCF6kGM86}/_ssgManifest.js +0 -0
@@ -60,6 +60,8 @@ export interface FeatureRow {
60
60
  parent_id: string | null;
61
61
  previous_lifecycle: string | null;
62
62
  attachments: string;
63
+ inject_skills: number;
64
+ injected_skills: string | null;
63
65
  deleted_at: number | null;
64
66
  created_at: number;
65
67
  updated_at: number;
@@ -1 +1 @@
1
- {"version":3,"file":"feature.mapper.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAGtE;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,IAAI,EAAE,MAAM,CAAC;IAEb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,WAAW,EAAE,MAAM,CAAC;IAEpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CA0DvD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAgErD"}
1
+ {"version":3,"file":"feature.mapper.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAGtE;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,IAAI,EAAE,MAAM,CAAC;IAEb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,WAAW,EAAE,MAAM,CAAC;IAEpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CA6DvD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAmErD"}
@@ -70,6 +70,9 @@ export function toDatabase(feature) {
70
70
  previous_lifecycle: feature.previousLifecycle ?? null,
71
71
  // User attachments
72
72
  attachments: JSON.stringify((feature.attachments ?? []).map((a) => ({ ...a, size: Number(a.size) }))),
73
+ // Skill injection
74
+ inject_skills: feature.injectSkills ? 1 : 0,
75
+ injected_skills: feature.injectedSkills?.length ? JSON.stringify(feature.injectedSkills) : null,
73
76
  // Soft delete
74
77
  deleted_at: feature.deletedAt instanceof Date ? feature.deletedAt.getTime() : (feature.deletedAt ?? null),
75
78
  created_at: feature.createdAt instanceof Date ? feature.createdAt.getTime() : feature.createdAt,
@@ -144,6 +147,9 @@ export function fromDatabase(row) {
144
147
  }),
145
148
  // User attachments
146
149
  attachments: JSON.parse(row.attachments ?? '[]'),
150
+ // Skill injection
151
+ injectSkills: row.inject_skills === 1,
152
+ ...(row.injected_skills != null && { injectedSkills: JSON.parse(row.injected_skills) }),
147
153
  // Soft delete
148
154
  ...(row.deleted_at != null && { deletedAt: new Date(row.deleted_at) }),
149
155
  };
@@ -85,6 +85,8 @@ export interface SettingsRow {
85
85
  interactive_agent_max_concurrent_sessions: number;
86
86
  auto_archive_delay_minutes: number;
87
87
  fab_position_swapped: number;
88
+ skill_injection_enabled: number;
89
+ skill_injection_skills: string | null;
88
90
  }
89
91
  /**
90
92
  * Maps Settings domain object to database row.
@@ -1 +1 @@
1
- {"version":3,"file":"settings.mapper.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings.mapper.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,wCAAwC,CAAC;AAUhD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAE1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IAInB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IAGtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,uBAAuB,EAAE,MAAM,CAAC;IAGhC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uBAAuB,EAAE,MAAM,CAAC;IAGhC,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IAGtB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAG3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uBAAuB,EAAE,MAAM,CAAC;IAChC,yBAAyB,EAAE,MAAM,CAAC;IAClC,0BAA0B,EAAE,MAAM,CAAC;IACnC,yBAAyB,EAAE,MAAM,CAAC;IAClC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0BAA0B,EAAE,MAAM,CAAC;IACnC,0BAA0B,EAAE,MAAM,CAAC;IACnC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,4BAA4B,EAAE,MAAM,CAAC;IAGrC,iCAAiC,EAAE,MAAM,CAAC;IAG1C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IAGzB,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,6BAA6B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,0BAA0B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,+BAA+B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IAGtC,+BAA+B,EAAE,MAAM,GAAG,IAAI,CAAC;IAG/C,mBAAmB,EAAE,MAAM,CAAC;IAG5B,uBAAuB,EAAE,MAAM,CAAC;IAChC,wBAAwB,EAAE,MAAM,CAAC;IACjC,yBAAyB,EAAE,MAAM,CAAC;IAClC,mCAAmC,EAAE,MAAM,CAAC;IAG5C,wBAAwB,EAAE,MAAM,CAAC;IACjC,wBAAwB,EAAE,MAAM,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAG1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,0BAA0B,EAAE,MAAM,CAAC;IACnC,yBAAyB,EAAE,MAAM,CAAC;IAClC,4BAA4B,EAAE,MAAM,CAAC;IACrC,+BAA+B,EAAE,MAAM,CAAC;IACxC,sBAAsB,EAAE,MAAM,CAAC;IAE/B,yBAAyB,EAAE,MAAM,CAAC;IAClC,sCAAsC,EAAE,MAAM,CAAC;IAC/C,yCAAyC,EAAE,MAAM,CAAC;IAGlD,0BAA0B,EAAE,MAAM,CAAC;IAGnC,oBAAoB,EAAE,MAAM,CAAC;IAG7B,uBAAuB,EAAE,MAAM,CAAC;IAChC,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAuH1D;AAiED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,QAAQ,CA8GvD"}
@@ -10,6 +10,7 @@
10
10
  * - Dates stored as ISO 8601 strings
11
11
  * - Optional fields stored as NULL when missing
12
12
  */
13
+ import { createDefaultSettings } from '../../../../domain/factories/settings-defaults.factory.js';
13
14
  /**
14
15
  * Maps Settings domain object to database row.
15
16
  * Flattens nested objects and converts types for SQL storage.
@@ -109,6 +110,11 @@ export function toDatabase(settings) {
109
110
  auto_archive_delay_minutes: settings.workflow.autoArchiveDelayMinutes ?? 10,
110
111
  // FAB layout config (default: not swapped)
111
112
  fab_position_swapped: (settings.fabLayout?.swapPosition ?? false) ? 1 : 0,
113
+ // Skill injection config (default: disabled, no skills)
114
+ skill_injection_enabled: settings.workflow.skillInjection?.enabled ? 1 : 0,
115
+ skill_injection_skills: settings.workflow.skillInjection?.skills?.length
116
+ ? JSON.stringify(settings.workflow.skillInjection.skills)
117
+ : null,
112
118
  };
113
119
  }
114
120
  /**
@@ -146,6 +152,26 @@ function buildAnalyzeRepoTimeoutsFromRow(row) {
146
152
  return {};
147
153
  return { analyzeRepoTimeouts: { analyzeMs: row.analyze_repo_timeout_analyze_ms } };
148
154
  }
155
+ /**
156
+ * Build the skillInjection spread from DB row columns.
157
+ * Returns `{ skillInjection: { ... } }` when the enabled flag or skills JSON is present,
158
+ * or an empty object `{}` when both are default/null (so the field stays undefined).
159
+ */
160
+ function buildSkillInjectionFromRow(row) {
161
+ const hasSkills = row.skill_injection_skills !== null;
162
+ const isEnabled = row.skill_injection_enabled === 1;
163
+ if (!isEnabled && !hasSkills)
164
+ return {};
165
+ const skills = hasSkills
166
+ ? JSON.parse(row.skill_injection_skills)
167
+ : (createDefaultSettings().workflow.skillInjection?.skills ?? []);
168
+ return {
169
+ skillInjection: {
170
+ enabled: isEnabled,
171
+ skills,
172
+ },
173
+ };
174
+ }
149
175
  /**
150
176
  * Maps database row to Settings domain object.
151
177
  * Reconstructs nested objects and converts types from SQL.
@@ -220,6 +246,7 @@ export function fromDatabase(row) {
220
246
  ...(row.ci_log_max_chars !== null && { ciLogMaxChars: row.ci_log_max_chars }),
221
247
  ...buildStageTimeoutsFromRow(row),
222
248
  ...buildAnalyzeRepoTimeoutsFromRow(row),
249
+ ...buildSkillInjectionFromRow(row),
223
250
  ciWatchEnabled: row.ci_watch_enabled !== 0,
224
251
  enableEvidence: row.workflow_enable_evidence === 1,
225
252
  commitEvidence: row.workflow_commit_evidence === 1,
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Migration 050: Add skill injection config columns to the settings table.
3
+ *
4
+ * Adds two new columns for configuring skill injection during feature creation:
5
+ * - skill_injection_enabled (INTEGER DEFAULT 0): whether skill injection is active
6
+ * - skill_injection_skills (TEXT, nullable): JSON array of SkillSource objects
7
+ *
8
+ * Default value of 0 means skill injection is opt-in (disabled by default).
9
+ * Guards against duplicate column errors using table_info pragma.
10
+ */
11
+ import type { MigrationParams } from 'umzug';
12
+ import type Database from 'better-sqlite3';
13
+ export declare function up({ context: db }: MigrationParams<Database.Database>): Promise<void>;
14
+ export declare function down({ context: db }: MigrationParams<Database.Database>): Promise<void>;
15
+ //# sourceMappingURL=053-add-skill-injection-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"053-add-skill-injection-config.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-skill-injection-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,wBAAsB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3F;AAED,wBAAsB,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7F"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Migration 050: Add skill injection config columns to the settings table.
3
+ *
4
+ * Adds two new columns for configuring skill injection during feature creation:
5
+ * - skill_injection_enabled (INTEGER DEFAULT 0): whether skill injection is active
6
+ * - skill_injection_skills (TEXT, nullable): JSON array of SkillSource objects
7
+ *
8
+ * Default value of 0 means skill injection is opt-in (disabled by default).
9
+ * Guards against duplicate column errors using table_info pragma.
10
+ */
11
+ export async function up({ context: db }) {
12
+ const columns = db.pragma('table_info(settings)');
13
+ const names = new Set(columns.map((c) => c.name));
14
+ if (!names.has('skill_injection_enabled')) {
15
+ db.exec('ALTER TABLE settings ADD COLUMN skill_injection_enabled INTEGER NOT NULL DEFAULT 0');
16
+ }
17
+ if (!names.has('skill_injection_skills')) {
18
+ db.exec('ALTER TABLE settings ADD COLUMN skill_injection_skills TEXT');
19
+ }
20
+ }
21
+ export async function down({ context: db }) {
22
+ void db;
23
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Migration 054: Add inject_skills and injected_skills columns to features table.
3
+ *
4
+ * inject_skills: boolean flag indicating skill injection was enabled for this feature.
5
+ * injected_skills: JSON array of skill names that were injected into the worktree.
6
+ */
7
+ import type { MigrationParams } from 'umzug';
8
+ import type Database from 'better-sqlite3';
9
+ export declare function up({ context: db }: MigrationParams<Database.Database>): Promise<void>;
10
+ export declare function down({ context: db }: MigrationParams<Database.Database>): Promise<void>;
11
+ //# sourceMappingURL=054-add-injected-skills-to-features.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"054-add-injected-skills-to-features.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-injected-skills-to-features.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,wBAAsB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3F;AAED,wBAAsB,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7F"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Migration 054: Add inject_skills and injected_skills columns to features table.
3
+ *
4
+ * inject_skills: boolean flag indicating skill injection was enabled for this feature.
5
+ * injected_skills: JSON array of skill names that were injected into the worktree.
6
+ */
7
+ export async function up({ context: db }) {
8
+ const columns = db.pragma('table_info(features)');
9
+ const names = new Set(columns.map((c) => c.name));
10
+ if (!names.has('inject_skills')) {
11
+ db.exec('ALTER TABLE features ADD COLUMN inject_skills INTEGER NOT NULL DEFAULT 0');
12
+ }
13
+ if (!names.has('injected_skills')) {
14
+ db.exec('ALTER TABLE features ADD COLUMN injected_skills TEXT');
15
+ }
16
+ }
17
+ export async function down({ context: db }) {
18
+ void db;
19
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-feature.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-feature.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,6EAA6E,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAOhE;;;GAGG;AACH,qBACa,uBAAwB,YAAW,kBAAkB;IACpD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAE5C,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCvC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAW7C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAcvD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAazE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAa7E,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA8BtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAQpD,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAqDvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK5C"}
1
+ {"version":3,"file":"sqlite-feature.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-feature.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,6EAA6E,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAOhE;;;GAGG;AACH,qBACa,uBAAwB,YAAW,kBAAkB;IACpD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAE5C,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCvC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAW7C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAcvD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAazE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAa7E,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA8BtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAQpD,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAuDvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK5C"}
@@ -40,8 +40,9 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
40
40
  pr_url, pr_number, pr_status, commit_hash, ci_status,
41
41
  ci_fix_attempts, ci_fix_history, pr_mergeable,
42
42
  upstream_pr_url, upstream_pr_number, upstream_pr_status,
43
- parent_id, previous_lifecycle, attachments, deleted_at,
44
- created_at, updated_at
43
+ parent_id, previous_lifecycle, attachments,
44
+ inject_skills, injected_skills,
45
+ deleted_at, created_at, updated_at
45
46
  ) VALUES (
46
47
  @id, @name, @slug, @description, @user_query, @repository_path, @branch,
47
48
  @lifecycle, @messages, @plan, @related_artifacts,
@@ -54,8 +55,9 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
54
55
  @pr_url, @pr_number, @pr_status, @commit_hash, @ci_status,
55
56
  @ci_fix_attempts, @ci_fix_history, @pr_mergeable,
56
57
  @upstream_pr_url, @upstream_pr_number, @upstream_pr_status,
57
- @parent_id, @previous_lifecycle, @attachments, @deleted_at,
58
- @created_at, @updated_at
58
+ @parent_id, @previous_lifecycle, @attachments,
59
+ @inject_skills, @injected_skills,
60
+ @deleted_at, @created_at, @updated_at
59
61
  )
60
62
  `);
61
63
  stmt.run(row);
@@ -166,6 +168,8 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
166
168
  parent_id = @parent_id,
167
169
  previous_lifecycle = @previous_lifecycle,
168
170
  attachments = @attachments,
171
+ inject_skills = @inject_skills,
172
+ injected_skills = @injected_skills,
169
173
  deleted_at = @deleted_at,
170
174
  updated_at = @updated_at
171
175
  WHERE id = @id
@@ -86,7 +86,7 @@ export function createEvidenceNode(executor) {
86
86
  const commitEvidence = state.commitEvidence;
87
87
  const settings = hasSettings() ? getSettings() : undefined;
88
88
  const maxRetries = settings?.workflow.evidenceRetries ?? DEFAULT_MAX_RETRIES;
89
- const options = buildExecutorOptions(state);
89
+ const options = buildExecutorOptions(state, undefined, 'evidence');
90
90
  const tasks = parseTasks(state.specDir);
91
91
  // --- Validation retry loop ---
92
92
  let allEvidence = [];
@@ -48,7 +48,7 @@ export function createFastImplementNode(executor) {
48
48
  agentType: executor.agentType,
49
49
  });
50
50
  try {
51
- const options = buildExecutorOptions(state);
51
+ const options = buildExecutorOptions(state, undefined, 'fast-implement');
52
52
  log.info(`Executing agent at cwd=${options.cwd}`);
53
53
  log.info(`Prompt length: ${prompt.length} chars`);
54
54
  const result = await retryExecute(executor, prompt, options, { logger: log });
@@ -112,7 +112,7 @@ export function createImplementNode(executor) {
112
112
  }
113
113
  log.info(`Phase ${phase.id} "${phase.name}" — ${phaseTasks.length} task(s), parallel: ${phase.parallel}`);
114
114
  updateFeatureProgress(state.specDir, completedTasks, totalTasks, `implementing-${phase.id}`, phaseTasks[0].id, log);
115
- const options = buildExecutorOptions(state);
115
+ const options = buildExecutorOptions(state, undefined, 'implement');
116
116
  const promptContext = { isLastPhase, phaseIndex: i, totalPhases };
117
117
  const phaseStartTime = Date.now();
118
118
  const phaseTimingId = await recordPhaseStart(`implement:${phase.id}`, {
@@ -83,7 +83,7 @@ export function createMergeNode(deps) {
83
83
  const feature = await deps.featureRepository.findById(state.featureId);
84
84
  const branch = feature?.branch ?? `feat/${state.featureId}`;
85
85
  const baseBranch = await deps.getDefaultBranch(cwd);
86
- const options = buildExecutorOptions(state);
86
+ const options = buildExecutorOptions(state, undefined, 'merge');
87
87
  let commitHash = state.commitHash;
88
88
  let prUrl = state.prUrl;
89
89
  let prNumber = state.prNumber;
@@ -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