@shepai/cli 1.170.0-pr513.cff27cb → 1.171.0-pr527.e2ee839
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/ActionDispositionEntry.yaml +14 -0
- package/apis/json-schema/DependencyFinding.yaml +28 -0
- package/apis/json-schema/DependencyRiskType.yaml +11 -0
- package/apis/json-schema/DependencyRules.yaml +38 -0
- package/apis/json-schema/EffectivePolicySnapshot.yaml +24 -0
- package/apis/json-schema/Feature.yaml +5 -17
- package/apis/json-schema/ReleaseIntegrityCheck.yaml +22 -0
- package/apis/json-schema/ReleaseIntegrityCheckType.yaml +9 -0
- package/apis/json-schema/ReleaseIntegrityResult.yaml +16 -0
- package/apis/json-schema/ReleaseRules.yaml +21 -0
- package/apis/json-schema/SdlcLifecycle.yaml +0 -1
- package/apis/json-schema/SecurityActionCategory.yaml +10 -0
- package/apis/json-schema/SecurityActionDisposition.yaml +8 -0
- package/apis/json-schema/SecurityConfig.yaml +17 -0
- package/apis/json-schema/SecurityEvent.yaml +36 -0
- package/apis/json-schema/SecurityMode.yaml +8 -0
- package/apis/json-schema/SecurityPolicy.yaml +24 -0
- package/apis/json-schema/SecuritySeverity.yaml +9 -0
- package/apis/json-schema/Settings.yaml +3 -0
- package/apis/json-schema/WorkflowConfig.yaml +5 -10
- package/dist/packages/core/src/application/ports/output/agents/agent-executor.interface.d.ts +15 -1
- package/dist/packages/core/src/application/ports/output/agents/agent-executor.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts +4 -2
- package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/repositories/security-event.repository.interface.d.ts +76 -0
- package/dist/packages/core/src/application/ports/output/repositories/security-event.repository.interface.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/repositories/security-event.repository.interface.js +11 -0
- package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts +38 -0
- package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.js +9 -0
- package/dist/packages/core/src/application/ports/output/services/security-policy-service.interface.d.ts +77 -0
- package/dist/packages/core/src/application/ports/output/services/security-policy-service.interface.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/security-policy-service.interface.js +13 -0
- package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts +14 -4
- package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.js +4 -2
- package/dist/packages/core/src/application/use-cases/agents/reject-agent-run.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/agents/reject-agent-run.use-case.js +4 -2
- 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 +2 -3
- package/dist/packages/core/src/application/use-cases/features/check-and-unblock-features.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/check-and-unblock-features.use-case.js +4 -2
- 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 +8 -18
- package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +2 -3
- package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.js +0 -13
- package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +4 -2
- package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.js +5 -5
- package/dist/packages/core/src/application/use-cases/security/enforce-security.use-case.d.ts +71 -0
- package/dist/packages/core/src/application/use-cases/security/enforce-security.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/security/enforce-security.use-case.js +215 -0
- package/dist/packages/core/src/application/use-cases/security/evaluate-security-policy.use-case.d.ts +24 -0
- package/dist/packages/core/src/application/use-cases/security/evaluate-security-policy.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/security/evaluate-security-policy.use-case.js +56 -0
- package/dist/packages/core/src/application/use-cases/security/get-security-state.use-case.d.ts +36 -0
- package/dist/packages/core/src/application/use-cases/security/get-security-state.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/security/get-security-state.use-case.js +76 -0
- package/dist/packages/core/src/application/use-cases/security/record-security-event.use-case.d.ts +14 -0
- package/dist/packages/core/src/application/use-cases/security/record-security-event.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/security/record-security-event.use-case.js +46 -0
- package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.d.ts +1 -0
- package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.js +59 -2
- package/dist/packages/core/src/domain/errors/security-violation.error.d.ts +15 -0
- package/dist/packages/core/src/domain/errors/security-violation.error.d.ts.map +1 -0
- package/dist/packages/core/src/domain/errors/security-violation.error.js +20 -0
- 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 +6 -3
- package/dist/packages/core/src/domain/generated/output.d.ts +263 -22
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/domain/generated/output.js +43 -7
- package/dist/packages/core/src/domain/lifecycle-gates.d.ts +6 -21
- package/dist/packages/core/src/domain/lifecycle-gates.d.ts.map +1 -1
- package/dist/packages/core/src/domain/lifecycle-gates.js +6 -25
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +57 -5
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +1 -3
- 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 +4 -10
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/security-event.mapper.d.ts +44 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/security-event.mapper.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/security-event.mapper.js +55 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +4 -2
- 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 +16 -7
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-security-settings-columns.d.ts +18 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-security-settings-columns.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-security-settings-columns.js +31 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-create-security-events-table.d.ts +29 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-create-security-events-table.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/054-create-security-events-table.js +53 -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 +3 -5
- package/dist/packages/core/src/infrastructure/repositories/sqlite-security-event.repository.d.ts +24 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-security-event.repository.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-security-event.repository.js +96 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +15 -6
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts +2 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +12 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/security-constraint-validator.d.ts +22 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/security-constraint-validator.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/security-constraint-validator.js +30 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +10 -20
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +34 -68
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +4 -2
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +9 -3
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +4 -2
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +39 -19
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/lifecycle-context.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/lifecycle-context.js +0 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +19 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/security-pre-check.d.ts +45 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/security-pre-check.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/security-pre-check.js +70 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +4 -5
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.js +6 -13
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts +10 -1
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js +101 -1
- package/dist/packages/core/src/infrastructure/services/security/dependency-risk-evaluator.d.ts +53 -0
- package/dist/packages/core/src/infrastructure/services/security/dependency-risk-evaluator.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/security/dependency-risk-evaluator.js +241 -0
- package/dist/packages/core/src/infrastructure/services/security/release-integrity-evaluator.d.ts +44 -0
- package/dist/packages/core/src/infrastructure/services/security/release-integrity-evaluator.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/security/release-integrity-evaluator.js +194 -0
- package/dist/packages/core/src/infrastructure/services/security/security-policy-file-reader.d.ts +28 -0
- package/dist/packages/core/src/infrastructure/services/security/security-policy-file-reader.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/security/security-policy-file-reader.js +50 -0
- package/dist/packages/core/src/infrastructure/services/security/security-policy-validator.d.ts +26 -0
- package/dist/packages/core/src/infrastructure/services/security/security-policy-validator.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/security/security-policy-validator.js +147 -0
- package/dist/packages/core/src/infrastructure/services/security/security-policy.service.d.ts +44 -0
- package/dist/packages/core/src/infrastructure/services/security/security-policy.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/security/security-policy.service.js +174 -0
- package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.js +65 -7
- package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/index.js +1 -5
- package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/new.command.js +5 -18
- package/dist/src/presentation/cli/commands/security.command.d.ts +16 -0
- package/dist/src/presentation/cli/commands/security.command.d.ts.map +1 -0
- package/dist/src/presentation/cli/commands/security.command.js +118 -0
- package/dist/src/presentation/cli/commands/upgrade.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/upgrade.command.js +68 -3
- package/dist/src/presentation/cli/index.js +2 -0
- package/dist/src/presentation/web/app/actions/create-feature.d.ts +2 -3
- 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 -3
- package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts +1 -2
- 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 -2
- package/dist/src/presentation/web/app/actions/security.d.ts +28 -0
- package/dist/src/presentation/web/app/actions/security.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/security.js +59 -0
- package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
- package/dist/src/presentation/web/app/api/agent-events/route.js +0 -1
- 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 -4
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts +3 -1
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-graph-nodes.js +4 -4
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +0 -3
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +1 -65
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +2 -3
- 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 +11 -15
- 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 -2
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +1 -6
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +4 -16
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +0 -2
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +4 -6
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +0 -12
- package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.js +3 -7
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts +3 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +3 -2
- package/dist/src/presentation/web/components/common/repository-node/security-panel.d.ts +6 -0
- package/dist/src/presentation/web/components/common/repository-node/security-panel.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/repository-node/security-panel.js +29 -0
- package/dist/src/presentation/web/components/common/repository-node/security-panel.stories.d.ts +10 -0
- package/dist/src/presentation/web/components/common/repository-node/security-panel.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/repository-node/security-panel.stories.js +53 -0
- package/dist/src/presentation/web/components/common/security-badge.d.ts +7 -0
- package/dist/src/presentation/web/components/common/security-badge.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/security-badge.js +30 -0
- package/dist/src/presentation/web/components/common/security-badge.stories.d.ts +12 -0
- package/dist/src/presentation/web/components/common/security-badge.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/security-badge.stories.js +20 -0
- package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.js +22 -9
- package/dist/src/presentation/web/components/features/settings/supply-chain-security-settings-section.d.ts +6 -0
- package/dist/src/presentation/web/components/features/settings/supply-chain-security-settings-section.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/settings/supply-chain-security-settings-section.js +60 -0
- package/dist/src/presentation/web/components/features/settings/supply-chain-security-settings-section.stories.d.ts +14 -0
- package/dist/src/presentation/web/components/features/settings/supply-chain-security-settings-section.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/settings/supply-chain-security-settings-section.stories.js +116 -0
- package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.js +3 -3
- package/dist/translations/ar/cli.json +22 -24
- package/dist/translations/ar/web.json +45 -7
- package/dist/translations/de/cli.json +22 -24
- package/dist/translations/de/web.json +45 -7
- package/dist/translations/en/cli.json +22 -24
- package/dist/translations/en/web.json +45 -7
- package/dist/translations/es/cli.json +22 -24
- package/dist/translations/es/web.json +45 -7
- package/dist/translations/fr/cli.json +22 -24
- package/dist/translations/fr/web.json +45 -7
- package/dist/translations/he/cli.json +22 -24
- package/dist/translations/he/web.json +45 -7
- package/dist/translations/pt/cli.json +22 -24
- package/dist/translations/pt/web.json +45 -7
- package/dist/translations/ru/cli.json +22 -24
- package/dist/translations/ru/web.json +45 -7
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +2 -2
- package/web/.next/required-server-files.json +2 -2
- 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 +2 -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/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +2 -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/server-reference-manifest.json +30 -30
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -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/server-reference-manifest.json +76 -121
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
- 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/server-reference-manifest.json +76 -121
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
- 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/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +2 -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/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -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/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/chat/page.js +2 -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/server-reference-manifest.json +30 -30
- package/web/.next/server/app/(dashboard)/create/page.js +2 -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/server-reference-manifest.json +76 -121
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
- 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/server-reference-manifest.json +76 -121
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
- 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/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/page.js +2 -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/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +2 -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/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -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.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/server-reference-manifest.json +6 -6
- 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/api/sessions/route.js.nft.json +1 -1
- package/web/.next/server/app/api/sessions-batch/route.js.nft.json +1 -1
- package/web/.next/server/app/features/page/server-reference-manifest.json +6 -6
- 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/server-reference-manifest.json +33 -18
- package/web/.next/server/app/settings/page.js +1 -1
- 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/server-reference-manifest.json +13 -13
- package/web/.next/server/app/skills/page.js +2 -1
- 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/server-reference-manifest.json +11 -11
- package/web/.next/server/app/tools/page.js +2 -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/server-reference-manifest.json +6 -6
- 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/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +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/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_ad0071c9.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_ad0071c9.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_90d98b2b.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_90d98b2b.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_d3828105.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_d3828105.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]__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]__4ed9b909._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__51ec77a8._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__51ec77a8._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__540c615f._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__540c615f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__66047a1b._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__66047a1b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__69dd3217._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__69dd3217._.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]__9a9cb046._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9a9cb046._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a2d6c0ac._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a2d6c0ac._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a932cd3a._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a932cd3a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aa72e794._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aa72e794._.js.map +1 -0
- 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]__c1262d08._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_02580450._.js +3 -0
- package/web/.next/server/chunks/ssr/_02580450._.js.map +1 -0
- 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/_1594e369._.js +9 -0
- package/web/.next/server/chunks/ssr/_1594e369._.js.map +1 -0
- 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/_21d37090._.js +3 -0
- package/web/.next/server/chunks/ssr/_21d37090._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_45496654._.js +1 -1
- package/web/.next/server/chunks/ssr/_45496654._.js.map +1 -1
- 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 +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/{_0fd635d7._.js → _767748d2._.js} +2 -2
- package/web/.next/server/chunks/ssr/_767748d2._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_df737cce._.js +1 -1
- package/web/.next/server/chunks/ssr/{_34d897da._.js → _ee42a212._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_34d897da._.js.map → _ee42a212._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_f8c55130._.js +4 -0
- package/web/.next/server/chunks/ssr/_f8c55130._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_ff04802c._.js +3 -0
- package/web/.next/server/chunks/ssr/_ff04802c._.js.map +1 -0
- 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/src_presentation_web_17d39233._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_17d39233._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_54b02639._.js +5 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_54b02639._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_7b7b9e3b._.js +5 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_7b7b9e3b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_807cba76._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_807cba76._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_90b5e66e.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_90b5e66e.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.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_ca99d62d._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +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 +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
- 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/src_presentation_web_e1cd1869._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_e1cd1869._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_e3a30e30._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_e3a30e30._.js.map +1 -0
- 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/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +226 -319
- package/web/.next/static/chunks/051873309d87fb45.css +1 -0
- package/web/.next/static/chunks/{52681a7f14138e48.js → 16fa4d3877c28fe2.js} +1 -1
- package/web/.next/static/chunks/23d80bb760e7dc4c.js +1 -0
- package/web/.next/static/chunks/30a0ba9015f94405.js +7 -0
- package/web/.next/static/chunks/{0f30a983f3467cd5.js → 39f6ad3f9005703a.js} +1 -1
- package/web/.next/static/chunks/3aba9d2242420cb5.js +1 -0
- package/web/.next/static/chunks/{d5bf9c963b5346e1.js → 7a6f56f37aaa17ea.js} +1 -1
- package/web/.next/static/chunks/{09a25231e5fc1ab8.js → 7e05e7e25220ee9a.js} +1 -1
- package/web/.next/static/chunks/{4219ddfde68a6d0b.js → 89dd90bf14488ec0.js} +1 -1
- package/web/.next/static/chunks/{e93ae5725b0babeb.js → 9374d251360e808b.js} +1 -1
- package/web/.next/static/chunks/{fc595d95626ac9bb.js → 9423dc2310202fda.js} +1 -1
- package/web/.next/static/chunks/a794cf7a1a5648dd.js +1 -0
- package/web/.next/static/chunks/{37f9543560c58ea6.js → a8edb9423086e83f.js} +1 -1
- package/web/.next/static/chunks/ae81796726a9bba3.js +1 -0
- package/web/.next/static/chunks/{9a78b4c5dcd28196.js → b9c62932ed987239.js} +2 -2
- package/web/.next/static/chunks/{478adf5d5156f002.js → d1c3e0ee8e788c87.js} +1 -1
- package/web/.next/static/chunks/e8c3c12f92e9a521.js +5 -0
- package/web/.next/static/chunks/f3d5e0ae13def35a.js +1 -0
- package/web/.next/static/chunks/{2a9af061f4fbe7f5.js → fb8dadb64c0ffc6b.js} +1 -1
- package/web/.next/static/chunks/fd232b88b5b50b2e.js +1 -0
- package/apis/json-schema/FeatureMode.yaml +0 -8
- package/dist/packages/core/src/application/use-cases/features/promote/promote-exploration.use-case.d.ts +0 -40
- package/dist/packages/core/src/application/use-cases/features/promote/promote-exploration.use-case.d.ts.map +0 -1
- package/dist/packages/core/src/application/use-cases/features/promote/promote-exploration.use-case.js +0 -125
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/051-replace-fast-with-mode.d.ts +0 -19
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/051-replace-fast-with-mode.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/051-replace-fast-with-mode.js +0 -46
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/052-replace-default-fast-mode-with-default-mode.d.ts +0 -17
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/052-replace-default-fast-mode-with-default-mode.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/052-replace-default-fast-mode-with-default-mode.js +0 -37
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-exploration-max-iterations.d.ts +0 -12
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-exploration-max-iterations.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-exploration-max-iterations.js +0 -17
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/exploration-agent-graph.d.ts +0 -362
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/exploration-agent-graph.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/exploration-agent-graph.js +0 -72
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/apply-feedback.node.d.ts +0 -18
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/apply-feedback.node.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/apply-feedback.node.js +0 -52
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/apply-feedback.prompt.d.ts +0 -24
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/apply-feedback.prompt.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/apply-feedback.prompt.js +0 -38
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/prototype-generate.prompt.d.ts +0 -31
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/prototype-generate.prompt.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/prototype-generate.prompt.js +0 -240
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prototype-generate.node.d.ts +0 -21
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prototype-generate.node.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prototype-generate.node.js +0 -134
- package/dist/src/presentation/cli/commands/feat/feedback.command.d.ts +0 -12
- package/dist/src/presentation/cli/commands/feat/feedback.command.d.ts.map +0 -1
- package/dist/src/presentation/cli/commands/feat/feedback.command.js +0 -64
- package/dist/src/presentation/cli/commands/feat/promote.command.d.ts +0 -13
- package/dist/src/presentation/cli/commands/feat/promote.command.d.ts.map +0 -1
- package/dist/src/presentation/cli/commands/feat/promote.command.js +0 -41
- package/dist/src/presentation/web/app/actions/discard-exploration.d.ts +0 -9
- package/dist/src/presentation/web/app/actions/discard-exploration.d.ts.map +0 -1
- package/dist/src/presentation/web/app/actions/discard-exploration.js +0 -29
- package/dist/src/presentation/web/app/actions/promote-exploration.d.ts +0 -11
- package/dist/src/presentation/web/app/actions/promote-exploration.d.ts.map +0 -1
- package/dist/src/presentation/web/app/actions/promote-exploration.js +0 -21
- package/dist/src/presentation/web/app/actions/submit-exploration-feedback.d.ts +0 -12
- package/dist/src/presentation/web/app/actions/submit-exploration-feedback.d.ts.map +0 -1
- package/dist/src/presentation/web/app/actions/submit-exploration-feedback.js +0 -40
- package/dist/src/presentation/web/components/common/feature-create-drawer/mode-selector.d.ts +0 -8
- package/dist/src/presentation/web/components/common/feature-create-drawer/mode-selector.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/mode-selector.js +0 -33
- package/dist/src/presentation/web/components/common/feature-create-drawer/mode-selector.stories.d.ts +0 -10
- package/dist/src/presentation/web/components/common/feature-create-drawer/mode-selector.stories.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/mode-selector.stories.js +0 -33
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/prototype-tab.d.ts +0 -11
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/prototype-tab.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/prototype-tab.js +0 -34
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/prototype-tab.stories.d.ts +0 -16
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/prototype-tab.stories.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/prototype-tab.stories.js +0 -70
- package/dist/src/presentation/web/components/ui/toggle-group.d.ts +0 -10
- package/dist/src/presentation/web/components/ui/toggle-group.d.ts.map +0 -1
- package/dist/src/presentation/web/components/ui/toggle-group.js +0 -22
- package/dist/src/presentation/web/components/ui/toggle.d.ts +0 -10
- package/dist/src/presentation/web/components/ui/toggle.d.ts.map +0 -1
- package/dist/src/presentation/web/components/ui/toggle.js +0 -26
- package/web/.next/server/chunks/ssr/[root-of-the-server]__03c66352._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__03c66352._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__403afc23._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__403afc23._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__df550e85._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__df550e85._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__df5602bf._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__df5602bf._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e9f4767a._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e9f4767a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_02e01240._.js +0 -4
- package/web/.next/server/chunks/ssr/_02e01240._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0fd635d7._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_18886033._.js +0 -4
- package/web/.next/server/chunks/ssr/_18886033._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_22e00a14._.js +0 -4
- package/web/.next/server/chunks/ssr/_22e00a14._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_30ddea9d._.js +0 -9
- package/web/.next/server/chunks/ssr/_30ddea9d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_43ba79e7._.js +0 -3
- package/web/.next/server/chunks/ssr/_43ba79e7._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_6e79a2cc._.js +0 -3
- package/web/.next/server/chunks/ssr/_6e79a2cc._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a5a5901d._.js +0 -4
- package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_ad09f271._.js +0 -4
- package/web/.next/server/chunks/ssr/_ad09f271._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_c3f595c6._.js +0 -4
- package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_cac4abe6._.js +0 -3
- package/web/.next/server/chunks/ssr/_cac4abe6._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_ea9e1556._.js +0 -4
- package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f1ba9be6._.js +0 -6
- package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f33cd07e._.js +0 -6
- package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f8b45233._.js +0 -4
- package/web/.next/server/chunks/ssr/_f8b45233._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_9453ce8b._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_9453ce8b._.js.map +0 -1
- package/web/.next/static/chunks/0769c695d6b663c7.js +0 -1
- package/web/.next/static/chunks/2ceebcc839ee0d4b.js +0 -1
- package/web/.next/static/chunks/5743a9c1c63e5261.js +0 -5
- package/web/.next/static/chunks/5cf9745e2ef3837c.js +0 -1
- package/web/.next/static/chunks/5e20f692bbfcfb94.js +0 -7
- package/web/.next/static/chunks/8b0a9cb5109fe899.js +0 -1
- package/web/.next/static/chunks/c80e8e3d0cf5baa6.css +0 -1
- package/web/.next/static/chunks/d60cee2e7318f425.js +0 -1
- package/web/.next/static/chunks/da565c85277c2461.js +0 -1
- package/web/.next/static/chunks/fb89cf91c10b2e8b.js +0 -1
- /package/web/.next/static/{G895CgnbZl4YvWN_DaRC- → t6SUt71jyk_PYf152Imog}/_buildManifest.js +0 -0
- /package/web/.next/static/{G895CgnbZl4YvWN_DaRC- → t6SUt71jyk_PYf152Imog}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{G895CgnbZl4YvWN_DaRC- → t6SUt71jyk_PYf152Imog}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-pre-check.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/security-pre-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,YAAY,EACb,MAAM,8BAA8B,CAAC;AAWtC;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAElF;AAED,8CAA8C;AAC9C,MAAM,MAAM,mBAAmB,GAC3B;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,sBAAsB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,sBAAsB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,MAAM,EAAE,mBAAmB,CAAC;IAAC,QAAQ,EAAE,sBAAsB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAExF;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,CAAC,GACrF,mBAAmB,CAyCrB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Pre-Check for Feature Agent Nodes
|
|
3
|
+
*
|
|
4
|
+
* Classifies node actions by SecurityActionCategory and evaluates
|
|
5
|
+
* the effective disposition based on the security policy mode and
|
|
6
|
+
* per-category overrides from FeatureAgentState.
|
|
7
|
+
*
|
|
8
|
+
* Used by executeNode() to enforce or warn about security policy
|
|
9
|
+
* before executing agent prompts.
|
|
10
|
+
*/
|
|
11
|
+
import { SecurityActionCategory, SecurityActionDisposition, SecurityMode, } from '../../../../../domain/generated/output.js';
|
|
12
|
+
/** Map node names to the security action category they represent. */
|
|
13
|
+
const NODE_ACTION_MAP = {
|
|
14
|
+
implement: SecurityActionCategory.PackageScriptExec,
|
|
15
|
+
'fast-implement': SecurityActionCategory.PackageScriptExec,
|
|
16
|
+
evidence: SecurityActionCategory.PackageScriptExec,
|
|
17
|
+
merge: SecurityActionCategory.CiWorkflowModify,
|
|
18
|
+
'ci-fix': SecurityActionCategory.CiWorkflowModify,
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Classify a node name into its SecurityActionCategory.
|
|
22
|
+
* Returns null for read-only nodes (requirements, research, plan, analyze)
|
|
23
|
+
* that have no security-sensitive actions.
|
|
24
|
+
*/
|
|
25
|
+
export function classifyNodeAction(nodeName) {
|
|
26
|
+
return NODE_ACTION_MAP[nodeName] ?? null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check the security disposition for a node based on the effective policy.
|
|
30
|
+
*
|
|
31
|
+
* @param nodeName - The graph node name (e.g. 'implement', 'merge')
|
|
32
|
+
* @param securityMode - Effective security mode from state
|
|
33
|
+
* @param actionDispositions - Per-category disposition overrides from state
|
|
34
|
+
* @returns The action to take: skip, allow, warn, deny, or approval_required
|
|
35
|
+
*/
|
|
36
|
+
export function checkSecurityDisposition(nodeName, securityMode, actionDispositions) {
|
|
37
|
+
// Disabled mode — no checks
|
|
38
|
+
if (securityMode === SecurityMode.Disabled) {
|
|
39
|
+
return { action: 'skip' };
|
|
40
|
+
}
|
|
41
|
+
// Read-only nodes have no security-sensitive actions
|
|
42
|
+
const category = classifyNodeAction(nodeName);
|
|
43
|
+
if (!category) {
|
|
44
|
+
return { action: 'skip' };
|
|
45
|
+
}
|
|
46
|
+
// Look up the disposition for this category
|
|
47
|
+
const disposition = actionDispositions[category];
|
|
48
|
+
// No disposition configured — default to allow
|
|
49
|
+
if (!disposition) {
|
|
50
|
+
return { action: 'allow' };
|
|
51
|
+
}
|
|
52
|
+
if (disposition === SecurityActionDisposition.Allowed) {
|
|
53
|
+
return { action: 'allow' };
|
|
54
|
+
}
|
|
55
|
+
if (disposition === SecurityActionDisposition.Denied) {
|
|
56
|
+
// In Enforce mode, deny the action; in Advisory mode, just warn
|
|
57
|
+
if (securityMode === SecurityMode.Enforce) {
|
|
58
|
+
return { action: 'deny', category, nodeName };
|
|
59
|
+
}
|
|
60
|
+
return { action: 'warn', category, nodeName };
|
|
61
|
+
}
|
|
62
|
+
if (disposition === SecurityActionDisposition.ApprovalRequired) {
|
|
63
|
+
// In Enforce mode, require approval; in Advisory mode, just warn
|
|
64
|
+
if (securityMode === SecurityMode.Enforce) {
|
|
65
|
+
return { action: 'approval_required', category, nodeName };
|
|
66
|
+
}
|
|
67
|
+
return { action: 'warn', category, nodeName };
|
|
68
|
+
}
|
|
69
|
+
return { action: 'allow' };
|
|
70
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { ApprovalGates, CiFixRecord, Evidence } from '../../../../domain/generated/output.js';
|
|
1
|
+
import type { ApprovalGates, CiFixRecord, Evidence, SecurityActionCategory, SecurityActionDisposition } from '../../../../domain/generated/output.js';
|
|
2
|
+
import { SecurityMode } from '../../../../domain/generated/output.js';
|
|
2
3
|
/**
|
|
3
4
|
* State annotation for the feature-agent graph.
|
|
4
5
|
*
|
|
@@ -59,10 +60,8 @@ export declare const FeatureAgentAnnotation: import("@langchain/langgraph").Anno
|
|
|
59
60
|
ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
|
|
60
61
|
ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<CiFixRecord[], CiFixRecord[]>;
|
|
61
62
|
ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
feedbackHistory: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
|
|
65
|
-
explorationStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"generating" | "waiting-feedback" | "applying-feedback" | "promoting" | "discarding" | undefined, "generating" | "waiting-feedback" | "applying-feedback" | "promoting" | "discarding" | undefined>;
|
|
63
|
+
securityMode: import("@langchain/langgraph").BinaryOperatorAggregate<SecurityMode, SecurityMode>;
|
|
64
|
+
securityActionDispositions: import("@langchain/langgraph").BinaryOperatorAggregate<Partial<Record<SecurityActionCategory, SecurityActionDisposition>>, Partial<Record<SecurityActionCategory, SecurityActionDisposition>>>;
|
|
66
65
|
}>;
|
|
67
66
|
export type FeatureAgentState = typeof FeatureAgentAnnotation.State;
|
|
68
67
|
//# sourceMappingURL=state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,QAAQ,EACR,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmIjC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,OAAO,sBAAsB,CAAC,KAAK,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Annotation } from '@langchain/langgraph';
|
|
2
|
+
import { SecurityMode } from '../../../../domain/generated/output.js';
|
|
2
3
|
/**
|
|
3
4
|
* State annotation for the feature-agent graph.
|
|
4
5
|
*
|
|
@@ -126,21 +127,13 @@ export const FeatureAgentAnnotation = Annotation.Root({
|
|
|
126
127
|
reducer: (_prev, next) => next,
|
|
127
128
|
default: () => 'idle',
|
|
128
129
|
}),
|
|
129
|
-
// ---
|
|
130
|
-
|
|
130
|
+
// --- Security policy state (set once at spawn, read by nodes) ---
|
|
131
|
+
securityMode: Annotation({
|
|
131
132
|
reducer: (_prev, next) => next,
|
|
132
|
-
default: () =>
|
|
133
|
+
default: () => SecurityMode.Disabled,
|
|
133
134
|
}),
|
|
134
|
-
|
|
135
|
+
securityActionDispositions: Annotation({
|
|
135
136
|
reducer: (_prev, next) => next,
|
|
136
|
-
default: () =>
|
|
137
|
-
}),
|
|
138
|
-
feedbackHistory: Annotation({
|
|
139
|
-
reducer: (prev, next) => [...prev, ...next],
|
|
140
|
-
default: () => [],
|
|
141
|
-
}),
|
|
142
|
-
explorationStatus: Annotation({
|
|
143
|
-
reducer: (_prev, next) => next,
|
|
144
|
-
default: () => undefined,
|
|
137
|
+
default: () => ({}),
|
|
145
138
|
}),
|
|
146
139
|
});
|
package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* checks, repository listing, cloning (with progress streaming), and URL parsing.
|
|
6
6
|
*/
|
|
7
7
|
import type { ExecFunction } from '../git/worktree.service.js';
|
|
8
|
-
import type { IGitHubRepositoryService, GitHubRepo, GitHubOrganization, ListUserRepositoriesOptions, CloneOptions, ParsedGitHubUrl } from '../../../application/ports/output/services/github-repository-service.interface.js';
|
|
8
|
+
import type { IGitHubRepositoryService, GitHubRepo, GitHubOrganization, ListUserRepositoriesOptions, CloneOptions, ParsedGitHubUrl, GovernanceFinding } from '../../../application/ports/output/services/github-repository-service.interface.js';
|
|
9
9
|
export declare class GitHubRepositoryService implements IGitHubRepositoryService {
|
|
10
10
|
private readonly execFile;
|
|
11
11
|
constructor(execFile: ExecFunction);
|
|
@@ -15,6 +15,15 @@ export declare class GitHubRepositoryService implements IGitHubRepositoryService
|
|
|
15
15
|
cloneRepository(nameWithOwner: string, destination: string, options?: CloneOptions): Promise<void>;
|
|
16
16
|
parseGitHubUrl(url: string): ParsedGitHubUrl;
|
|
17
17
|
getViewerPermission(repoPath: string): Promise<string>;
|
|
18
|
+
auditRepositoryGovernance(owner: string, repo: string, defaultBranch?: string): Promise<GovernanceFinding[]>;
|
|
19
|
+
private checkBranchProtection;
|
|
20
|
+
private checkCodeowners;
|
|
21
|
+
/**
|
|
22
|
+
* Handle errors from governance API calls gracefully.
|
|
23
|
+
* 404 errors are treated as findings (missing config).
|
|
24
|
+
* Auth/permission errors are treated as Unknown severity findings.
|
|
25
|
+
*/
|
|
26
|
+
private handleGovernanceCheckError;
|
|
18
27
|
private cleanupPartialClone;
|
|
19
28
|
}
|
|
20
29
|
//# sourceMappingURL=github-repository.service.d.ts.map
|
package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-repository.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/external/github-repository.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EACV,wBAAwB,EACxB,UAAU,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,YAAY,EACZ,eAAe,
|
|
1
|
+
{"version":3,"file":"github-repository.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/external/github-repository.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EACV,wBAAwB,EACxB,UAAU,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,YAAY,EACZ,eAAe,EACf,iBAAiB,EAClB,MAAM,mFAAmF,CAAC;AA0B3F,qBACa,uBAAwB,YAAW,wBAAwB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB1B,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAuClF,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA2BlD,eAAe,CACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,IAAI,CAAC;IAgDhB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe;IA2CtC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBtD,yBAAyB,CAC7B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,aAAa,SAAS,GACrB,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAcjB,qBAAqB;YAmCrB,eAAe;IA6B7B;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;YA6CpB,mBAAmB;CAOlC"}
|
package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js
CHANGED
|
@@ -20,7 +20,7 @@ import { injectable, inject } from 'tsyringe';
|
|
|
20
20
|
import { resolve, normalize } from 'node:path';
|
|
21
21
|
import { rm } from 'node:fs/promises';
|
|
22
22
|
import { spawn } from 'node:child_process';
|
|
23
|
-
import { GitHubAuthError, GitHubCloneError, GitHubPermissionError, GitHubRepoListError, GitHubUrlParseError, } from '../../../application/ports/output/services/github-repository-service.interface.js';
|
|
23
|
+
import { GitHubAuthError, GitHubCloneError, GitHubPermissionError, GitHubRepoListError, GitHubUrlParseError, GovernanceFindingCategory, } from '../../../application/ports/output/services/github-repository-service.interface.js';
|
|
24
24
|
// ---------------------------------------------------------------------------
|
|
25
25
|
// URL regex patterns
|
|
26
26
|
// ---------------------------------------------------------------------------
|
|
@@ -191,6 +191,106 @@ let GitHubRepositoryService = class GitHubRepositoryService {
|
|
|
191
191
|
throw new GitHubPermissionError(`Failed to check repository permission: ${cause?.message ?? String(error)}`, cause);
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
|
+
async auditRepositoryGovernance(owner, repo, defaultBranch = 'main') {
|
|
195
|
+
const findings = [];
|
|
196
|
+
// Check branch protection
|
|
197
|
+
const branchFindings = await this.checkBranchProtection(owner, repo, defaultBranch);
|
|
198
|
+
findings.push(...branchFindings);
|
|
199
|
+
// Check CODEOWNERS presence
|
|
200
|
+
const codeownersFindings = await this.checkCodeowners(owner, repo);
|
|
201
|
+
findings.push(...codeownersFindings);
|
|
202
|
+
return findings;
|
|
203
|
+
}
|
|
204
|
+
async checkBranchProtection(owner, repo, branch) {
|
|
205
|
+
try {
|
|
206
|
+
const { stdout } = await this.execFile('gh', [
|
|
207
|
+
'api',
|
|
208
|
+
`/repos/${owner}/${repo}/branches/${branch}/protection`,
|
|
209
|
+
]);
|
|
210
|
+
const protection = JSON.parse(stdout);
|
|
211
|
+
// Protection exists — check for PR review requirements
|
|
212
|
+
if (!protection.required_pull_request_reviews) {
|
|
213
|
+
return [
|
|
214
|
+
{
|
|
215
|
+
category: GovernanceFindingCategory.BranchProtection,
|
|
216
|
+
severity: 'Medium',
|
|
217
|
+
message: `Branch "${branch}" has protection enabled but does not require pull request reviews.`,
|
|
218
|
+
remediation: `Enable "Require a pull request before merging" in branch protection settings for "${branch}".`,
|
|
219
|
+
},
|
|
220
|
+
];
|
|
221
|
+
}
|
|
222
|
+
return [];
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
return this.handleGovernanceCheckError(error, GovernanceFindingCategory.BranchProtection, `Branch "${branch}" has no branch protection rules configured.`, `Enable branch protection for "${branch}" in repository settings. Require pull request reviews and status checks.`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
async checkCodeowners(owner, repo) {
|
|
229
|
+
// CODEOWNERS can live in repo root or .github/ directory
|
|
230
|
+
const paths = [
|
|
231
|
+
`/repos/${owner}/${repo}/contents/CODEOWNERS`,
|
|
232
|
+
`/repos/${owner}/${repo}/contents/.github/CODEOWNERS`,
|
|
233
|
+
];
|
|
234
|
+
for (const path of paths) {
|
|
235
|
+
try {
|
|
236
|
+
await this.execFile('gh', ['api', path]);
|
|
237
|
+
// Found CODEOWNERS — no finding needed
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
// Not found at this path — try next
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Neither location found
|
|
245
|
+
return [
|
|
246
|
+
{
|
|
247
|
+
category: GovernanceFindingCategory.Codeowners,
|
|
248
|
+
severity: 'Medium',
|
|
249
|
+
message: 'No CODEOWNERS file found in the repository.',
|
|
250
|
+
remediation: 'Add a CODEOWNERS file to the repository root or .github/ directory to enforce code review ownership.',
|
|
251
|
+
},
|
|
252
|
+
];
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Handle errors from governance API calls gracefully.
|
|
256
|
+
* 404 errors are treated as findings (missing config).
|
|
257
|
+
* Auth/permission errors are treated as Unknown severity findings.
|
|
258
|
+
*/
|
|
259
|
+
handleGovernanceCheckError(error, category, notFoundMessage, notFoundRemediation) {
|
|
260
|
+
const errMessage = error instanceof Error ? error.message : String(error);
|
|
261
|
+
const errnoCode = error?.code;
|
|
262
|
+
// gh not installed
|
|
263
|
+
if (errnoCode === 'ENOENT') {
|
|
264
|
+
return [
|
|
265
|
+
{
|
|
266
|
+
category,
|
|
267
|
+
severity: 'Unknown',
|
|
268
|
+
message: 'GitHub CLI (gh) is not installed. Cannot audit repository governance.',
|
|
269
|
+
remediation: 'Install the GitHub CLI from https://cli.github.com/',
|
|
270
|
+
},
|
|
271
|
+
];
|
|
272
|
+
}
|
|
273
|
+
// 404 = resource not configured (branch protection, file missing, etc.)
|
|
274
|
+
if (errMessage.includes('404')) {
|
|
275
|
+
return [
|
|
276
|
+
{
|
|
277
|
+
category,
|
|
278
|
+
severity: 'High',
|
|
279
|
+
message: notFoundMessage,
|
|
280
|
+
remediation: notFoundRemediation,
|
|
281
|
+
},
|
|
282
|
+
];
|
|
283
|
+
}
|
|
284
|
+
// Auth/permission errors or other unexpected failures — return Unknown finding
|
|
285
|
+
return [
|
|
286
|
+
{
|
|
287
|
+
category,
|
|
288
|
+
severity: 'Unknown',
|
|
289
|
+
message: `Unable to audit ${category}: ${errMessage}`,
|
|
290
|
+
remediation: 'Verify that the GitHub CLI is authenticated with sufficient permissions. Run `gh auth login`.',
|
|
291
|
+
},
|
|
292
|
+
];
|
|
293
|
+
}
|
|
194
294
|
async cleanupPartialClone(destination) {
|
|
195
295
|
try {
|
|
196
296
|
await rm(destination, { recursive: true, force: true });
|
package/dist/packages/core/src/infrastructure/services/security/dependency-risk-evaluator.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Risk Evaluator
|
|
3
|
+
*
|
|
4
|
+
* Evaluates repository-local dependency risk signals without
|
|
5
|
+
* external services. Checks:
|
|
6
|
+
* - Manifest-lockfile consistency (package.json vs lockfile)
|
|
7
|
+
* - Dependency source types (registry vs git vs file)
|
|
8
|
+
* - Risky lifecycle scripts (preinstall, postinstall, prepare)
|
|
9
|
+
* - Allowlist/denylist enforcement
|
|
10
|
+
* - Version-range strictness
|
|
11
|
+
*
|
|
12
|
+
* Returns an array of DependencyFinding objects with severity and remediation.
|
|
13
|
+
*/
|
|
14
|
+
import type { DependencyFinding, DependencyRules } from '../../../domain/generated/output.js';
|
|
15
|
+
export declare class DependencyRiskEvaluator {
|
|
16
|
+
/**
|
|
17
|
+
* Evaluate dependency risk for a repository.
|
|
18
|
+
*
|
|
19
|
+
* @param repositoryPath - Absolute path to the repository root
|
|
20
|
+
* @param rules - Dependency risk policy rules
|
|
21
|
+
* @returns Array of dependency findings
|
|
22
|
+
*/
|
|
23
|
+
evaluate(repositoryPath: string, rules: DependencyRules): DependencyFinding[];
|
|
24
|
+
/**
|
|
25
|
+
* Collect all dependencies from package.json (dependencies + devDependencies).
|
|
26
|
+
*/
|
|
27
|
+
private collectDependencies;
|
|
28
|
+
/**
|
|
29
|
+
* Check that a lockfile exists when there are dependencies.
|
|
30
|
+
*/
|
|
31
|
+
private checkLockfileConsistency;
|
|
32
|
+
/**
|
|
33
|
+
* Check for dependencies installed from non-registry sources.
|
|
34
|
+
*/
|
|
35
|
+
private checkNonRegistrySources;
|
|
36
|
+
/**
|
|
37
|
+
* Check installed packages for risky lifecycle scripts.
|
|
38
|
+
*/
|
|
39
|
+
private checkLifecycleScripts;
|
|
40
|
+
/**
|
|
41
|
+
* Check dependencies against the denylist.
|
|
42
|
+
*/
|
|
43
|
+
private checkDenylist;
|
|
44
|
+
/**
|
|
45
|
+
* Check dependencies against the allowlist (non-empty allowlist = only listed packages allowed).
|
|
46
|
+
*/
|
|
47
|
+
private checkAllowlist;
|
|
48
|
+
/**
|
|
49
|
+
* Check version ranges for strictness (no ^, ~, *, >= patterns).
|
|
50
|
+
*/
|
|
51
|
+
private checkVersionRangeStrictness;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=dependency-risk-evaluator.d.ts.map
|
package/dist/packages/core/src/infrastructure/services/security/dependency-risk-evaluator.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-risk-evaluator.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/security/dependency-risk-evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAsB9F,qBAAa,uBAAuB;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,iBAAiB,EAAE;IAmD7E;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA0BhC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAqB/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA8C7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAoBrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;OAEG;IACH,OAAO,CAAC,2BAA2B;CAwBpC"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Risk Evaluator
|
|
3
|
+
*
|
|
4
|
+
* Evaluates repository-local dependency risk signals without
|
|
5
|
+
* external services. Checks:
|
|
6
|
+
* - Manifest-lockfile consistency (package.json vs lockfile)
|
|
7
|
+
* - Dependency source types (registry vs git vs file)
|
|
8
|
+
* - Risky lifecycle scripts (preinstall, postinstall, prepare)
|
|
9
|
+
* - Allowlist/denylist enforcement
|
|
10
|
+
* - Version-range strictness
|
|
11
|
+
*
|
|
12
|
+
* Returns an array of DependencyFinding objects with severity and remediation.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { DependencyRiskType, SecuritySeverity } from '../../../domain/generated/output.js';
|
|
17
|
+
/**
|
|
18
|
+
* Lockfile names in priority order.
|
|
19
|
+
*/
|
|
20
|
+
const LOCKFILE_NAMES = ['pnpm-lock.yaml', 'package-lock.json', 'yarn.lock'];
|
|
21
|
+
/**
|
|
22
|
+
* Lifecycle script names that execute arbitrary code during install.
|
|
23
|
+
*/
|
|
24
|
+
const RISKY_LIFECYCLE_SCRIPTS = ['preinstall', 'install', 'postinstall', 'prepare'];
|
|
25
|
+
/**
|
|
26
|
+
* Patterns indicating a non-registry dependency source.
|
|
27
|
+
*/
|
|
28
|
+
const NON_REGISTRY_PREFIXES = ['git+', 'git:', 'github:', 'file:', 'link:', 'http:', 'https:'];
|
|
29
|
+
/**
|
|
30
|
+
* Patterns indicating loose version ranges.
|
|
31
|
+
*/
|
|
32
|
+
const LOOSE_RANGE_PATTERNS = [/^\*$/, /^\^/, /^~/, /^>=/, /^>(?!=)/];
|
|
33
|
+
export class DependencyRiskEvaluator {
|
|
34
|
+
/**
|
|
35
|
+
* Evaluate dependency risk for a repository.
|
|
36
|
+
*
|
|
37
|
+
* @param repositoryPath - Absolute path to the repository root
|
|
38
|
+
* @param rules - Dependency risk policy rules
|
|
39
|
+
* @returns Array of dependency findings
|
|
40
|
+
*/
|
|
41
|
+
evaluate(repositoryPath, rules) {
|
|
42
|
+
const packageJsonPath = join(repositoryPath, 'package.json');
|
|
43
|
+
if (!existsSync(packageJsonPath)) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
let packageJson;
|
|
47
|
+
try {
|
|
48
|
+
packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
const findings = [];
|
|
54
|
+
// Collect all dependencies
|
|
55
|
+
const allDeps = this.collectDependencies(packageJson);
|
|
56
|
+
// Check lockfile consistency
|
|
57
|
+
if (rules.checkLockfileConsistency) {
|
|
58
|
+
findings.push(...this.checkLockfileConsistency(repositoryPath, allDeps));
|
|
59
|
+
}
|
|
60
|
+
// Check non-registry sources
|
|
61
|
+
if (rules.checkNonRegistrySource) {
|
|
62
|
+
findings.push(...this.checkNonRegistrySources(allDeps));
|
|
63
|
+
}
|
|
64
|
+
// Check lifecycle scripts
|
|
65
|
+
if (rules.checkLifecycleScripts) {
|
|
66
|
+
findings.push(...this.checkLifecycleScripts(repositoryPath, allDeps));
|
|
67
|
+
}
|
|
68
|
+
// Check denylist
|
|
69
|
+
if (rules.denylist.length > 0) {
|
|
70
|
+
findings.push(...this.checkDenylist(allDeps, rules.denylist));
|
|
71
|
+
}
|
|
72
|
+
// Check allowlist
|
|
73
|
+
if (rules.allowlist.length > 0) {
|
|
74
|
+
findings.push(...this.checkAllowlist(allDeps, rules.allowlist));
|
|
75
|
+
}
|
|
76
|
+
// Check version-range strictness
|
|
77
|
+
if (rules.enforceStrictVersionRanges) {
|
|
78
|
+
findings.push(...this.checkVersionRangeStrictness(allDeps));
|
|
79
|
+
}
|
|
80
|
+
return findings;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Collect all dependencies from package.json (dependencies + devDependencies).
|
|
84
|
+
*/
|
|
85
|
+
collectDependencies(packageJson) {
|
|
86
|
+
const deps = new Map();
|
|
87
|
+
const depSections = ['dependencies', 'devDependencies'];
|
|
88
|
+
for (const section of depSections) {
|
|
89
|
+
const sectionDeps = packageJson[section];
|
|
90
|
+
if (sectionDeps && typeof sectionDeps === 'object') {
|
|
91
|
+
for (const [name, version] of Object.entries(sectionDeps)) {
|
|
92
|
+
deps.set(name, version);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return deps;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check that a lockfile exists when there are dependencies.
|
|
100
|
+
*/
|
|
101
|
+
checkLockfileConsistency(repositoryPath, deps) {
|
|
102
|
+
if (deps.size === 0) {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
const hasLockfile = LOCKFILE_NAMES.some((name) => existsSync(join(repositoryPath, name)));
|
|
106
|
+
if (!hasLockfile) {
|
|
107
|
+
return [
|
|
108
|
+
{
|
|
109
|
+
packageName: '*',
|
|
110
|
+
severity: SecuritySeverity.High,
|
|
111
|
+
riskType: DependencyRiskType.LockfileInconsistency,
|
|
112
|
+
message: 'No lockfile found. Dependencies are not pinned to specific versions.',
|
|
113
|
+
remediation: 'Run your package manager install command to generate a lockfile (e.g., pnpm install).',
|
|
114
|
+
},
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Check for dependencies installed from non-registry sources.
|
|
121
|
+
*/
|
|
122
|
+
checkNonRegistrySources(deps) {
|
|
123
|
+
const findings = [];
|
|
124
|
+
for (const [name, version] of deps) {
|
|
125
|
+
const isNonRegistry = NON_REGISTRY_PREFIXES.some((prefix) => version.startsWith(prefix));
|
|
126
|
+
if (isNonRegistry) {
|
|
127
|
+
findings.push({
|
|
128
|
+
packageName: name,
|
|
129
|
+
version,
|
|
130
|
+
severity: SecuritySeverity.Medium,
|
|
131
|
+
riskType: DependencyRiskType.NonRegistrySource,
|
|
132
|
+
message: `Package "${name}" is installed from a non-registry source: ${version}`,
|
|
133
|
+
remediation: `Consider using a registry-published version of "${name}" instead of a direct source reference.`,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return findings;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Check installed packages for risky lifecycle scripts.
|
|
141
|
+
*/
|
|
142
|
+
checkLifecycleScripts(repositoryPath, deps) {
|
|
143
|
+
const findings = [];
|
|
144
|
+
const nodeModules = join(repositoryPath, 'node_modules');
|
|
145
|
+
if (!existsSync(nodeModules)) {
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
148
|
+
for (const [name] of deps) {
|
|
149
|
+
const pkgJsonPath = join(nodeModules, name, 'package.json');
|
|
150
|
+
if (!existsSync(pkgJsonPath)) {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
|
|
155
|
+
const scripts = pkgJson.scripts;
|
|
156
|
+
if (!scripts || typeof scripts !== 'object') {
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const riskyScripts = RISKY_LIFECYCLE_SCRIPTS.filter((s) => typeof scripts[s] === 'string' && scripts[s].length > 0);
|
|
160
|
+
if (riskyScripts.length > 0) {
|
|
161
|
+
findings.push({
|
|
162
|
+
packageName: name,
|
|
163
|
+
version: pkgJson.version,
|
|
164
|
+
severity: SecuritySeverity.Medium,
|
|
165
|
+
riskType: DependencyRiskType.LifecycleScript,
|
|
166
|
+
message: `Package "${name}" has lifecycle scripts that execute during install: ${riskyScripts.join(', ')}`,
|
|
167
|
+
remediation: `Review the lifecycle scripts in "${name}" or add it to the allowlist if trusted. Consider using --ignore-scripts during install.`,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// Skip packages with unreadable package.json
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return findings;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Check dependencies against the denylist.
|
|
179
|
+
*/
|
|
180
|
+
checkDenylist(deps, denylist) {
|
|
181
|
+
const findings = [];
|
|
182
|
+
const denySet = new Set(denylist);
|
|
183
|
+
for (const [name, version] of deps) {
|
|
184
|
+
if (denySet.has(name)) {
|
|
185
|
+
findings.push({
|
|
186
|
+
packageName: name,
|
|
187
|
+
version,
|
|
188
|
+
severity: SecuritySeverity.Critical,
|
|
189
|
+
riskType: DependencyRiskType.DenylistViolation,
|
|
190
|
+
message: `Package "${name}" is on the denylist and must be removed.`,
|
|
191
|
+
remediation: `Remove "${name}" from your dependencies. It has been explicitly denied by security policy.`,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return findings;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Check dependencies against the allowlist (non-empty allowlist = only listed packages allowed).
|
|
199
|
+
*/
|
|
200
|
+
checkAllowlist(deps, allowlist) {
|
|
201
|
+
const findings = [];
|
|
202
|
+
const allowSet = new Set(allowlist);
|
|
203
|
+
for (const [name, version] of deps) {
|
|
204
|
+
if (!allowSet.has(name)) {
|
|
205
|
+
findings.push({
|
|
206
|
+
packageName: name,
|
|
207
|
+
version,
|
|
208
|
+
severity: SecuritySeverity.High,
|
|
209
|
+
riskType: DependencyRiskType.AllowlistViolation,
|
|
210
|
+
message: `Package "${name}" is not on the allowlist.`,
|
|
211
|
+
remediation: `Add "${name}" to the allowlist in shep.security.yaml if it is a trusted dependency, or remove it.`,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return findings;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Check version ranges for strictness (no ^, ~, *, >= patterns).
|
|
219
|
+
*/
|
|
220
|
+
checkVersionRangeStrictness(deps) {
|
|
221
|
+
const findings = [];
|
|
222
|
+
for (const [name, version] of deps) {
|
|
223
|
+
// Skip non-registry sources (already flagged separately)
|
|
224
|
+
if (NON_REGISTRY_PREFIXES.some((prefix) => version.startsWith(prefix))) {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
const isLoose = LOOSE_RANGE_PATTERNS.some((pattern) => pattern.test(version));
|
|
228
|
+
if (isLoose) {
|
|
229
|
+
findings.push({
|
|
230
|
+
packageName: name,
|
|
231
|
+
version,
|
|
232
|
+
severity: SecuritySeverity.Medium,
|
|
233
|
+
riskType: DependencyRiskType.VersionRangePolicy,
|
|
234
|
+
message: `Package "${name}" uses a loose version range "${version}". Strict version pinning is required by policy.`,
|
|
235
|
+
remediation: `Pin "${name}" to an exact version (e.g., "4.17.21" instead of "${version}").`,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return findings;
|
|
240
|
+
}
|
|
241
|
+
}
|
package/dist/packages/core/src/infrastructure/services/security/release-integrity-evaluator.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release Integrity Evaluator
|
|
3
|
+
*
|
|
4
|
+
* Checks release pipeline integrity for a repository:
|
|
5
|
+
* - CI workflow exists and publishes from CI (not local)
|
|
6
|
+
* - NPM_TOKEN and RELEASE_TOKEN referenced as secrets (not hardcoded)
|
|
7
|
+
* - npm provenance flags (--provenance) present in publish steps
|
|
8
|
+
* - Release workflow integrity (semantic-release configured)
|
|
9
|
+
*
|
|
10
|
+
* Returns a ReleaseIntegrityResult with individual check results and overall pass/fail.
|
|
11
|
+
*/
|
|
12
|
+
import type { ReleaseIntegrityResult, ReleaseRules } from '../../../domain/generated/output.js';
|
|
13
|
+
export declare class ReleaseIntegrityEvaluator {
|
|
14
|
+
/**
|
|
15
|
+
* Evaluate release pipeline integrity.
|
|
16
|
+
*
|
|
17
|
+
* @param repositoryPath - Absolute path to the repository root
|
|
18
|
+
* @param rules - Release integrity policy rules
|
|
19
|
+
* @returns Aggregated result with individual check details
|
|
20
|
+
*/
|
|
21
|
+
evaluate(repositoryPath: string, rules: ReleaseRules): ReleaseIntegrityResult;
|
|
22
|
+
/**
|
|
23
|
+
* Read all YAML workflow files from .github/workflows/.
|
|
24
|
+
*/
|
|
25
|
+
private readWorkflowFiles;
|
|
26
|
+
/**
|
|
27
|
+
* Check that CI workflow files exist (publishing happens in CI, not locally).
|
|
28
|
+
*/
|
|
29
|
+
private checkCiOnlyPublishing;
|
|
30
|
+
/**
|
|
31
|
+
* Check that tokens are referenced as secrets, not hardcoded.
|
|
32
|
+
* Scans for known token env var names and verifies they use ${{ secrets.* }}.
|
|
33
|
+
*/
|
|
34
|
+
private checkSecretConfiguration;
|
|
35
|
+
/**
|
|
36
|
+
* Check that npm publish commands include --provenance flag.
|
|
37
|
+
*/
|
|
38
|
+
private checkProvenanceConfiguration;
|
|
39
|
+
/**
|
|
40
|
+
* Check workflow integrity (semantic-release is configured).
|
|
41
|
+
*/
|
|
42
|
+
private checkWorkflowIntegrity;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=release-integrity-evaluator.d.ts.map
|
package/dist/packages/core/src/infrastructure/services/security/release-integrity-evaluator.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-integrity-evaluator.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/security/release-integrity-evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAEV,sBAAsB,EACtB,YAAY,EACb,MAAM,qCAAqC,CAAC;AA2B7C,qBAAa,yBAAyB;IACpC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,sBAAsB;IAiC7E;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAsB7B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAkChC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAyCpC;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAoB/B"}
|