@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.
- package/apis/json-schema/Feature.yaml +10 -0
- package/apis/json-schema/SkillInjectionConfig.yaml +17 -0
- package/apis/json-schema/SkillSource.yaml +21 -0
- package/apis/json-schema/SkillSourceType.yaml +7 -0
- package/apis/json-schema/WorkflowConfig.yaml +3 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.d.ts +39 -0
- package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.js +8 -0
- package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.js +1 -0
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +3 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +22 -3
- package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +2 -0
- package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +55 -1
- package/dist/packages/core/src/domain/generated/output.d.ts +50 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/domain/generated/output.js +5 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +2 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +2 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +6 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +2 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +27 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-skill-injection-config.d.ts +15 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-skill-injection-config.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-skill-injection-config.js +23 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-injected-skills-to-features.d.ts +11 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-injected-skills-to-features.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-add-injected-skills-to-features.js +19 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +8 -4
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.js +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +1 -1
- package/dist/packages/core/src/infrastructure/services/skill-injector.service.d.ts +26 -0
- package/dist/packages/core/src/infrastructure/services/skill-injector.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/skill-injector.service.js +201 -0
- package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/new.command.js +3 -0
- package/dist/src/presentation/web/app/actions/add-injected-skill.d.ts +7 -0
- package/dist/src/presentation/web/app/actions/add-injected-skill.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/add-injected-skill.js +34 -0
- package/dist/src/presentation/web/app/actions/create-feature.d.ts +2 -0
- package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/create-feature.js +3 -1
- package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts +1 -0
- package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/get-workflow-defaults.js +1 -0
- package/dist/src/presentation/web/app/actions/remove-injected-skill.d.ts +6 -0
- package/dist/src/presentation/web/app/actions/remove-injected-skill.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/remove-injected-skill.js +35 -0
- package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-feature-node-data.js +2 -0
- package/dist/src/presentation/web/app/skills/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/skills/page.js +6 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +2 -0
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +6 -2
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +10 -4
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +12 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +4 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/skills/add-skill-dialog.d.ts +10 -0
- package/dist/src/presentation/web/components/features/skills/add-skill-dialog.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/add-skill-dialog.js +56 -0
- package/dist/src/presentation/web/components/features/skills/add-skill-dialog.stories.d.ts +16 -0
- package/dist/src/presentation/web/components/features/skills/add-skill-dialog.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/add-skill-dialog.stories.js +66 -0
- package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.d.ts +8 -0
- package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.js +42 -0
- package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.stories.d.ts +16 -0
- package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/skills/auto-injected-skills-section.stories.js +69 -0
- package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts +3 -1
- package/dist/src/presentation/web/components/features/skills/skills-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/skills/skills-page-client.js +5 -3
- package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/skills/skills-page-client.stories.js +27 -0
- package/dist/translations/ar/cli.json +2 -0
- package/dist/translations/ar/web.json +15 -11
- package/dist/translations/de/cli.json +2 -0
- package/dist/translations/de/web.json +35 -17
- package/dist/translations/en/cli.json +2 -0
- package/dist/translations/en/web.json +4 -0
- package/dist/translations/es/cli.json +2 -0
- package/dist/translations/es/web.json +16 -12
- package/dist/translations/fr/cli.json +2 -0
- package/dist/translations/fr/web.json +16 -12
- package/dist/translations/he/cli.json +2 -0
- package/dist/translations/he/web.json +16 -12
- package/dist/translations/pt/cli.json +2 -0
- package/dist/translations/pt/web.json +16 -12
- package/dist/translations/ru/cli.json +2 -0
- package/dist/translations/ru/web.json +16 -12
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +5 -5
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +38 -38
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/chat/page.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
- package/web/.next/server/app/(dashboard)/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +38 -38
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/page.js +1 -1
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/_not-found/page.js +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
- package/web/.next/server/app/features/page/build-manifest.json +3 -3
- package/web/.next/server/app/features/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/features/page.js +1 -1
- package/web/.next/server/app/features/page.js.nft.json +1 -1
- package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/build-manifest.json +3 -3
- package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/settings/page.js +3 -3
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/build-manifest.json +3 -3
- package/web/.next/server/app/skills/page/server-reference-manifest.json +52 -22
- package/web/.next/server/app/skills/page.js +3 -2
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/build-manifest.json +3 -3
- package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
- package/web/.next/server/app/tools/page.js +1 -1
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/build-manifest.json +3 -3
- package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/version/page.js +1 -1
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__c78383b1._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__c78383b1._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0727935d._.js → 403f9_next_8a33ddee._.js} +2 -2
- package/web/.next/server/chunks/ssr/403f9_next_8a33ddee._.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +3 -3
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__e88da4ee._.js → [root-of-the-server]__1cd4327c._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__7ffd3598._.js → [root-of-the-server]__92ffd5ee._.js} +3 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fa525872._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fa525872._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_02e01240._.js +1 -1
- package/web/.next/server/chunks/ssr/_02e01240._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_10a571b8._.js +3 -0
- package/web/.next/server/chunks/ssr/{_fecec23a._.js.map → _10a571b8._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_2b63b860._.js → _11cbed18._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_2b63b860._.js.map → _11cbed18._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_18886033._.js +1 -1
- package/web/.next/server/chunks/ssr/_18886033._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_22e00a14._.js +1 -1
- package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_45496654._.js +3 -0
- package/web/.next/server/chunks/ssr/_45496654._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_4cbb7f95._.js +1 -1
- package/web/.next/server/chunks/ssr/_4cbb7f95._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_5119a3df._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_6f35fb9a._.js +3 -0
- package/web/.next/server/chunks/ssr/_6f35fb9a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_a5a5901d._.js +1 -1
- package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_a963dd3c._.js +3 -0
- package/web/.next/server/chunks/ssr/_a963dd3c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_ad09f271._.js +1 -1
- package/web/.next/server/chunks/ssr/_ad09f271._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_c3f595c6._.js +1 -1
- package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_a104e947._.js → _d55b34d1._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_a104e947._.js.map → _d55b34d1._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_df737cce._.js +3 -0
- package/web/.next/server/chunks/ssr/_df737cce._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_e3f14907._.js +9 -0
- package/web/.next/server/chunks/ssr/_e3f14907._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_ea9e1556._.js +1 -1
- package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f1ba9be6._.js +2 -2
- package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f33cd07e._.js +2 -2
- package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f8b45233._.js +1 -1
- package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
- package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
- package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js.map +1 -1
- package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js +1 -1
- package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js.map +1 -1
- package/web/.next/server/middleware-build-manifest.js +3 -3
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +89 -59
- package/web/.next/static/chunks/008a238e3827134a.js +1 -0
- package/web/.next/static/chunks/185e4f36cb6efb24.js +1 -0
- package/web/.next/static/chunks/{f8f63039d0d6f80b.js → 205b4659bdfc9b72.js} +1 -1
- package/web/.next/static/chunks/24ef0e36f68901cd.js +1 -0
- package/web/.next/static/chunks/74729cbad964be13.js +1 -0
- package/web/.next/static/chunks/{f1885dd59965e0f9.js → 783b3ac450c8199b.js} +2 -2
- package/web/.next/static/chunks/{57e11c48bcd1d9b8.js → 853459c5497533d4.js} +1 -1
- package/web/.next/static/chunks/86b3891618d9e165.js +1 -0
- package/web/.next/static/chunks/8cedbf904e6bca33.js +3 -0
- package/web/.next/static/chunks/9ba70e315d9b5dd6.js +1 -0
- package/web/.next/static/chunks/{32d411963c1ef448.js → a4668ef7bb93c465.js} +1 -1
- package/web/.next/static/chunks/b0ed1ec320a0e51a.js +1 -0
- package/web/.next/static/chunks/b14085e99b88e7f7.css +1 -0
- package/web/.next/static/chunks/b65e555419a0c664.js +1 -0
- package/web/.next/static/chunks/c669da1a499f4683.js +7 -0
- package/web/.next/static/chunks/{0f17267e5c90b232.js → cb638c28c942e3ca.js} +1 -1
- package/web/.next/static/chunks/cc5fe8d1d9e1e519.js +5 -0
- package/web/.next/static/chunks/cf1c386f350d1f1b.js +5 -0
- package/web/.next/static/chunks/d52622eb492eadb1.js +1 -0
- package/web/.next/static/chunks/{3c730d304bc35629.js → f1a5cda6353fe321.js} +1 -1
- package/web/.next/static/chunks/{9fa49aeaf54d09fd.js → f844d62e4159c965.js} +1 -1
- package/web/.next/static/chunks/{turbopack-57bb0674e2cd1d31.js → turbopack-b38a68b1b1c41a87.js} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__20a36a42._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__20a36a42._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7ffd3598._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e88da4ee._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0727935d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0dc06d07._.js +0 -3
- package/web/.next/server/chunks/ssr/_0dc06d07._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_682fc996._.js +0 -9
- package/web/.next/server/chunks/ssr/_682fc996._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_6892e3b9._.js +0 -3
- package/web/.next/server/chunks/ssr/_6892e3b9._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a1068852._.js +0 -3
- package/web/.next/server/chunks/ssr/_a1068852._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_fecec23a._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_12a7ede0._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_12a7ede0._.js.map +0 -1
- package/web/.next/static/chunks/20f7cc98a013b11c.js +0 -1
- package/web/.next/static/chunks/4cec255f2754e5ec.js +0 -1
- package/web/.next/static/chunks/4d5d80adb4397ced.js +0 -3
- package/web/.next/static/chunks/5b7275374d2696b3.css +0 -1
- package/web/.next/static/chunks/647140fe96a7c88a.js +0 -1
- package/web/.next/static/chunks/6d6f70ff5151b8cb.js +0 -7
- package/web/.next/static/chunks/725e8bc88459d9d0.js +0 -1
- package/web/.next/static/chunks/7f3ce661fcc57b65.js +0 -5
- package/web/.next/static/chunks/84586f075208b491.js +0 -1
- package/web/.next/static/chunks/982aef195c118996.js +0 -1
- package/web/.next/static/chunks/99bfac1c0b8b19b7.js +0 -1
- package/web/.next/static/chunks/9d57e438c993d9f3.js +0 -1
- package/web/.next/static/chunks/c3ef3b892f7794ec.js +0 -1
- package/web/.next/static/chunks/dc134f3f58cdf850.js +0 -5
- /package/web/.next/static/{t2E8atZdYFJbeTbPcqx9J → w_8Pssf6--RSvCF6kGM86}/_buildManifest.js +0 -0
- /package/web/.next/static/{t2E8atZdYFJbeTbPcqx9J → w_8Pssf6--RSvCF6kGM86}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{t2E8atZdYFJbeTbPcqx9J → w_8Pssf6--RSvCF6kGM86}/_ssgManifest.js +0 -0
package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
};
|
package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts
CHANGED
|
@@ -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.
|
package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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
|
+
}
|
package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map
CHANGED
|
@@ -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;
|
|
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,
|
|
44
|
-
|
|
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,
|
|
58
|
-
@
|
|
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
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js
CHANGED
|
@@ -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 });
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js
CHANGED
|
@@ -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;
|
|
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;
|
|
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
|