gherkin-ai 2.6.1 → 2.6.2
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/README.md +31 -69
- package/dist/commands/add.d.ts +2 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +13 -7
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/agent-log.d.ts +8 -0
- package/dist/commands/agent-log.d.ts.map +1 -0
- package/dist/commands/agent-log.js +30 -0
- package/dist/commands/agent-log.js.map +1 -0
- package/dist/commands/audit.d.ts +6 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +29 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/autopilot.d.ts.map +1 -1
- package/dist/commands/autopilot.js +142 -7
- package/dist/commands/autopilot.js.map +1 -1
- package/dist/commands/create.d.ts +2 -0
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +16 -15
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/detect.d.ts +4 -1
- package/dist/commands/detect.d.ts.map +1 -1
- package/dist/commands/detect.js +8 -6
- package/dist/commands/detect.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +172 -22
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/implement.d.ts +9 -0
- package/dist/commands/implement.d.ts.map +1 -0
- package/dist/commands/implement.js +229 -0
- package/dist/commands/implement.js.map +1 -0
- package/dist/commands/init.d.ts +17 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +471 -79
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +22 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +97 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/quality.d.ts.map +1 -1
- package/dist/commands/quality.js +23 -14
- package/dist/commands/quality.js.map +1 -1
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +126 -15
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +62 -1
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +4 -0
- package/dist/commands/web.js.map +1 -1
- package/dist/core/agent-adapter.d.ts +2 -1
- package/dist/core/agent-adapter.d.ts.map +1 -1
- package/dist/core/agent-adapter.js +139 -138
- package/dist/core/agent-adapter.js.map +1 -1
- package/dist/core/agent-logger.d.ts +18 -0
- package/dist/core/agent-logger.d.ts.map +1 -0
- package/dist/core/agent-logger.js +103 -0
- package/dist/core/agent-logger.js.map +1 -0
- package/dist/core/analysis/cross-service-impact.d.ts +20 -0
- package/dist/core/analysis/cross-service-impact.d.ts.map +1 -0
- package/dist/core/analysis/cross-service-impact.js +75 -0
- package/dist/core/analysis/cross-service-impact.js.map +1 -0
- package/dist/core/arch-rules.d.ts.map +1 -1
- package/dist/core/arch-rules.js +27 -1
- package/dist/core/arch-rules.js.map +1 -1
- package/dist/core/ast/adapters/multi-lang-adapter.d.ts +20 -0
- package/dist/core/ast/adapters/multi-lang-adapter.d.ts.map +1 -0
- package/dist/core/ast/adapters/multi-lang-adapter.js +54 -0
- package/dist/core/ast/adapters/multi-lang-adapter.js.map +1 -0
- package/dist/core/ast/monorepo-ast-indexer.d.ts +25 -0
- package/dist/core/ast/monorepo-ast-indexer.d.ts.map +1 -0
- package/dist/core/ast/monorepo-ast-indexer.js +78 -0
- package/dist/core/ast/monorepo-ast-indexer.js.map +1 -0
- package/dist/core/asyncapi-validator.d.ts +22 -0
- package/dist/core/asyncapi-validator.d.ts.map +1 -0
- package/dist/core/asyncapi-validator.js +302 -0
- package/dist/core/asyncapi-validator.js.map +1 -0
- package/dist/core/config.d.ts +19 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +16 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/convergence-engine.d.ts.map +1 -1
- package/dist/core/convergence-engine.js +81 -0
- package/dist/core/convergence-engine.js.map +1 -1
- package/dist/core/execution-sandbox.d.ts +1 -0
- package/dist/core/execution-sandbox.d.ts.map +1 -1
- package/dist/core/execution-sandbox.js +37 -1
- package/dist/core/execution-sandbox.js.map +1 -1
- package/dist/core/gherkin-parser.d.ts.map +1 -1
- package/dist/core/gherkin-parser.js +3 -0
- package/dist/core/gherkin-parser.js.map +1 -1
- package/dist/core/governance/agent-policy-engine.d.ts +26 -0
- package/dist/core/governance/agent-policy-engine.d.ts.map +1 -0
- package/dist/core/governance/agent-policy-engine.js +95 -0
- package/dist/core/governance/agent-policy-engine.js.map +1 -0
- package/dist/core/governance/spec-hash-baseline.d.ts +36 -0
- package/dist/core/governance/spec-hash-baseline.d.ts.map +1 -0
- package/dist/core/governance/spec-hash-baseline.js +102 -0
- package/dist/core/governance/spec-hash-baseline.js.map +1 -0
- package/dist/core/inventory.d.ts +40 -0
- package/dist/core/inventory.d.ts.map +1 -0
- package/dist/core/inventory.js +176 -0
- package/dist/core/inventory.js.map +1 -0
- package/dist/core/ir-builder.d.ts.map +1 -1
- package/dist/core/ir-builder.js +128 -4
- package/dist/core/ir-builder.js.map +1 -1
- package/dist/core/metrics-engine.d.ts +28 -0
- package/dist/core/metrics-engine.d.ts.map +1 -0
- package/dist/core/metrics-engine.js +114 -0
- package/dist/core/metrics-engine.js.map +1 -0
- package/dist/core/patterns-suggester.d.ts.map +1 -1
- package/dist/core/patterns-suggester.js +4 -0
- package/dist/core/patterns-suggester.js.map +1 -1
- package/dist/core/profiles/base-profile.d.ts +41 -0
- package/dist/core/profiles/base-profile.d.ts.map +1 -0
- package/dist/core/profiles/base-profile.js +10 -0
- package/dist/core/profiles/base-profile.js.map +1 -0
- package/dist/core/profiles/payment-profile.d.ts +12 -0
- package/dist/core/profiles/payment-profile.d.ts.map +1 -0
- package/dist/core/profiles/payment-profile.js +73 -0
- package/dist/core/profiles/payment-profile.js.map +1 -0
- package/dist/core/profiles/profile-registry.d.ts +10 -0
- package/dist/core/profiles/profile-registry.d.ts.map +1 -0
- package/dist/core/profiles/profile-registry.js +31 -0
- package/dist/core/profiles/profile-registry.js.map +1 -0
- package/dist/core/requirement-validator.d.ts +5 -1
- package/dist/core/requirement-validator.d.ts.map +1 -1
- package/dist/core/requirement-validator.js +85 -8
- package/dist/core/requirement-validator.js.map +1 -1
- package/dist/core/risk-engine.d.ts +13 -0
- package/dist/core/risk-engine.d.ts.map +1 -0
- package/dist/core/risk-engine.js +119 -0
- package/dist/core/risk-engine.js.map +1 -0
- package/dist/core/semantic-ir.d.ts +87 -1
- package/dist/core/semantic-ir.d.ts.map +1 -1
- package/dist/core/stack-detector.d.ts.map +1 -1
- package/dist/core/stack-detector.js +75 -51
- package/dist/core/stack-detector.js.map +1 -1
- package/dist/core/stack-setup.d.ts +27 -0
- package/dist/core/stack-setup.d.ts.map +1 -0
- package/dist/core/stack-setup.js +151 -0
- package/dist/core/stack-setup.js.map +1 -0
- package/dist/core/stack-specs.d.ts +2 -0
- package/dist/core/stack-specs.d.ts.map +1 -1
- package/dist/core/stack-specs.js +68 -12
- package/dist/core/stack-specs.js.map +1 -1
- package/dist/core/validators/angular-ngrx-validator.d.ts +3 -0
- package/dist/core/validators/angular-ngrx-validator.d.ts.map +1 -0
- package/dist/core/validators/angular-ngrx-validator.js +29 -0
- package/dist/core/validators/angular-ngrx-validator.js.map +1 -0
- package/dist/core/validators/c4-sync-validator.d.ts +3 -0
- package/dist/core/validators/c4-sync-validator.d.ts.map +1 -0
- package/dist/core/validators/c4-sync-validator.js +21 -0
- package/dist/core/validators/c4-sync-validator.js.map +1 -0
- package/dist/core/validators/distributed-topology-validator.d.ts +3 -0
- package/dist/core/validators/distributed-topology-validator.d.ts.map +1 -0
- package/dist/core/validators/distributed-topology-validator.js +68 -0
- package/dist/core/validators/distributed-topology-validator.js.map +1 -0
- package/dist/core/validators/dotnet-cqrs-validator.d.ts +14 -0
- package/dist/core/validators/dotnet-cqrs-validator.d.ts.map +1 -0
- package/dist/core/validators/dotnet-cqrs-validator.js +38 -0
- package/dist/core/validators/dotnet-cqrs-validator.js.map +1 -0
- package/dist/core/validators/financial-gates.d.ts +3 -0
- package/dist/core/validators/financial-gates.d.ts.map +1 -0
- package/dist/core/validators/financial-gates.js +32 -0
- package/dist/core/validators/financial-gates.js.map +1 -0
- package/dist/core/validators/index.d.ts +14 -0
- package/dist/core/validators/index.d.ts.map +1 -0
- package/dist/core/validators/index.js +29 -0
- package/dist/core/validators/index.js.map +1 -0
- package/dist/core/validators/java-spring-validator.d.ts +3 -0
- package/dist/core/validators/java-spring-validator.d.ts.map +1 -0
- package/dist/core/validators/java-spring-validator.js +31 -0
- package/dist/core/validators/java-spring-validator.js.map +1 -0
- package/dist/core/validators/react-validator.d.ts +3 -0
- package/dist/core/validators/react-validator.d.ts.map +1 -0
- package/dist/core/validators/react-validator.js +23 -0
- package/dist/core/validators/react-validator.js.map +1 -0
- package/dist/core/validators/telemetry-validator.d.ts +3 -0
- package/dist/core/validators/telemetry-validator.d.ts.map +1 -0
- package/dist/core/validators/telemetry-validator.js +26 -0
- package/dist/core/validators/telemetry-validator.js.map +1 -0
- package/dist/core/validators/vue-validator.d.ts +7 -0
- package/dist/core/validators/vue-validator.d.ts.map +1 -0
- package/dist/core/validators/vue-validator.js +37 -0
- package/dist/core/validators/vue-validator.js.map +1 -0
- package/dist/generators/c4-model.d.ts +4 -0
- package/dist/generators/c4-model.d.ts.map +1 -0
- package/dist/generators/c4-model.js +47 -0
- package/dist/generators/c4-model.js.map +1 -0
- package/dist/generators/contracts-csharp.d.ts +2 -1
- package/dist/generators/contracts-csharp.d.ts.map +1 -1
- package/dist/generators/contracts-csharp.js +91 -22
- package/dist/generators/contracts-csharp.js.map +1 -1
- package/dist/generators/contracts-go.d.ts +2 -1
- package/dist/generators/contracts-go.d.ts.map +1 -1
- package/dist/generators/contracts-go.js +6 -6
- package/dist/generators/contracts-go.js.map +1 -1
- package/dist/generators/contracts-php.d.ts +2 -1
- package/dist/generators/contracts-php.d.ts.map +1 -1
- package/dist/generators/contracts-php.js +8 -3
- package/dist/generators/contracts-php.js.map +1 -1
- package/dist/generators/contracts-python.d.ts +2 -1
- package/dist/generators/contracts-python.d.ts.map +1 -1
- package/dist/generators/contracts-python.js +3 -3
- package/dist/generators/contracts-python.js.map +1 -1
- package/dist/generators/contracts.d.ts +9 -1
- package/dist/generators/contracts.d.ts.map +1 -1
- package/dist/generators/contracts.js +189 -60
- package/dist/generators/contracts.js.map +1 -1
- package/dist/generators/dotnet/aspire-generator.d.ts +3 -0
- package/dist/generators/dotnet/aspire-generator.d.ts.map +1 -0
- package/dist/generators/dotnet/aspire-generator.js +109 -0
- package/dist/generators/dotnet/aspire-generator.js.map +1 -0
- package/dist/generators/dotnet/cqrs-handlers-generator.d.ts +2 -0
- package/dist/generators/dotnet/cqrs-handlers-generator.d.ts.map +1 -0
- package/dist/generators/dotnet/cqrs-handlers-generator.js +86 -0
- package/dist/generators/dotnet/cqrs-handlers-generator.js.map +1 -0
- package/dist/generators/dotnet/dotnet-testcontainers-generator.d.ts +2 -0
- package/dist/generators/dotnet/dotnet-testcontainers-generator.d.ts.map +1 -0
- package/dist/generators/dotnet/dotnet-testcontainers-generator.js +119 -0
- package/dist/generators/dotnet/dotnet-testcontainers-generator.js.map +1 -0
- package/dist/generators/dotnet/idempotency-generator.d.ts +2 -0
- package/dist/generators/dotnet/idempotency-generator.d.ts.map +1 -0
- package/dist/generators/dotnet/idempotency-generator.js +136 -0
- package/dist/generators/dotnet/idempotency-generator.js.map +1 -0
- package/dist/generators/dotnet/inbox-generator.d.ts +2 -0
- package/dist/generators/dotnet/inbox-generator.d.ts.map +1 -0
- package/dist/generators/dotnet/inbox-generator.js +66 -0
- package/dist/generators/dotnet/inbox-generator.js.map +1 -0
- package/dist/generators/dotnet/opentelemetry-generator.d.ts +2 -0
- package/dist/generators/dotnet/opentelemetry-generator.d.ts.map +1 -0
- package/dist/generators/dotnet/opentelemetry-generator.js +60 -0
- package/dist/generators/dotnet/opentelemetry-generator.js.map +1 -0
- package/dist/generators/dotnet/outbox-generator.d.ts +2 -0
- package/dist/generators/dotnet/outbox-generator.d.ts.map +1 -0
- package/dist/generators/dotnet/outbox-generator.js +151 -0
- package/dist/generators/dotnet/outbox-generator.js.map +1 -0
- package/dist/generators/dotnet/resilience-generator.d.ts +2 -0
- package/dist/generators/dotnet/resilience-generator.d.ts.map +1 -0
- package/dist/generators/dotnet/resilience-generator.js +73 -0
- package/dist/generators/dotnet/resilience-generator.js.map +1 -0
- package/dist/generators/dotnet/saga-generator.d.ts +2 -0
- package/dist/generators/dotnet/saga-generator.d.ts.map +1 -0
- package/dist/generators/dotnet/saga-generator.js +92 -0
- package/dist/generators/dotnet/saga-generator.js.map +1 -0
- package/dist/generators/dotnet/signalr-generator.d.ts +2 -0
- package/dist/generators/dotnet/signalr-generator.d.ts.map +1 -0
- package/dist/generators/dotnet/signalr-generator.js +74 -0
- package/dist/generators/dotnet/signalr-generator.js.map +1 -0
- package/dist/generators/frontend/angular-ngrx-generator.d.ts +2 -0
- package/dist/generators/frontend/angular-ngrx-generator.d.ts.map +1 -0
- package/dist/generators/frontend/angular-ngrx-generator.js +167 -0
- package/dist/generators/frontend/angular-ngrx-generator.js.map +1 -0
- package/dist/generators/frontend/angular-signalr-service.d.ts +2 -0
- package/dist/generators/frontend/angular-signalr-service.d.ts.map +1 -0
- package/dist/generators/frontend/angular-signalr-service.js +75 -0
- package/dist/generators/frontend/angular-signalr-service.js.map +1 -0
- package/dist/generators/frontend/react-generator.d.ts +2 -0
- package/dist/generators/frontend/react-generator.d.ts.map +1 -0
- package/dist/generators/frontend/react-generator.js +94 -0
- package/dist/generators/frontend/react-generator.js.map +1 -0
- package/dist/generators/frontend/vue-pinia-generator.d.ts +3 -0
- package/dist/generators/frontend/vue-pinia-generator.d.ts.map +1 -0
- package/dist/generators/frontend/vue-pinia-generator.js +118 -0
- package/dist/generators/frontend/vue-pinia-generator.js.map +1 -0
- package/dist/generators/infra.d.ts +6 -0
- package/dist/generators/infra.d.ts.map +1 -1
- package/dist/generators/infra.js +107 -16
- package/dist/generators/infra.js.map +1 -1
- package/dist/generators/infrastructure/aws-cdk-generator.d.ts +2 -0
- package/dist/generators/infrastructure/aws-cdk-generator.d.ts.map +1 -0
- package/dist/generators/infrastructure/aws-cdk-generator.js +78 -0
- package/dist/generators/infrastructure/aws-cdk-generator.js.map +1 -0
- package/dist/generators/java/java-cqrs-generator.d.ts +2 -0
- package/dist/generators/java/java-cqrs-generator.d.ts.map +1 -0
- package/dist/generators/java/java-cqrs-generator.js +58 -0
- package/dist/generators/java/java-cqrs-generator.js.map +1 -0
- package/dist/generators/java/java-idempotency-generator.d.ts +5 -0
- package/dist/generators/java/java-idempotency-generator.d.ts.map +1 -0
- package/dist/generators/java/java-idempotency-generator.js +126 -0
- package/dist/generators/java/java-idempotency-generator.js.map +1 -0
- package/dist/generators/java/java-opentelemetry-generator.d.ts +2 -0
- package/dist/generators/java/java-opentelemetry-generator.d.ts.map +1 -0
- package/dist/generators/java/java-opentelemetry-generator.js +51 -0
- package/dist/generators/java/java-opentelemetry-generator.js.map +1 -0
- package/dist/generators/java/java-outbox-generator.d.ts +5 -0
- package/dist/generators/java/java-outbox-generator.d.ts.map +1 -0
- package/dist/generators/java/java-outbox-generator.js +159 -0
- package/dist/generators/java/java-outbox-generator.js.map +1 -0
- package/dist/generators/java/java-saga-generator.d.ts +5 -0
- package/dist/generators/java/java-saga-generator.d.ts.map +1 -0
- package/dist/generators/java/java-saga-generator.js +130 -0
- package/dist/generators/java/java-saga-generator.js.map +1 -0
- package/dist/generators/nestjs/cqrs-generator.d.ts +2 -0
- package/dist/generators/nestjs/cqrs-generator.d.ts.map +1 -0
- package/dist/generators/nestjs/cqrs-generator.js +42 -0
- package/dist/generators/nestjs/cqrs-generator.js.map +1 -0
- package/dist/generators/nestjs/idempotency-generator.d.ts +2 -0
- package/dist/generators/nestjs/idempotency-generator.d.ts.map +1 -0
- package/dist/generators/nestjs/idempotency-generator.js +66 -0
- package/dist/generators/nestjs/idempotency-generator.js.map +1 -0
- package/dist/generators/nestjs/opentelemetry-generator.d.ts +2 -0
- package/dist/generators/nestjs/opentelemetry-generator.d.ts.map +1 -0
- package/dist/generators/nestjs/opentelemetry-generator.js +36 -0
- package/dist/generators/nestjs/opentelemetry-generator.js.map +1 -0
- package/dist/generators/nestjs/outbox-generator.d.ts +2 -0
- package/dist/generators/nestjs/outbox-generator.d.ts.map +1 -0
- package/dist/generators/nestjs/outbox-generator.js +71 -0
- package/dist/generators/nestjs/outbox-generator.js.map +1 -0
- package/dist/generators/preset-csharp-dotnet.d.ts +2 -1
- package/dist/generators/preset-csharp-dotnet.d.ts.map +1 -1
- package/dist/generators/preset-csharp-dotnet.js +262 -13
- package/dist/generators/preset-csharp-dotnet.js.map +1 -1
- package/dist/generators/preset-flutter.js +1 -1
- package/dist/generators/preset-go.d.ts.map +1 -1
- package/dist/generators/preset-go.js +2 -3
- package/dist/generators/preset-go.js.map +1 -1
- package/dist/generators/preset-java-spring.d.ts.map +1 -1
- package/dist/generators/preset-java-spring.js +33 -7
- package/dist/generators/preset-java-spring.js.map +1 -1
- package/dist/generators/preset-php-laravel.js +2 -2
- package/dist/generators/preset-php-laravel.js.map +1 -1
- package/dist/generators/preset-rust-axum.d.ts.map +1 -1
- package/dist/generators/preset-rust-axum.js +1 -2
- package/dist/generators/preset-rust-axum.js.map +1 -1
- package/dist/generators/presets.d.ts.map +1 -1
- package/dist/generators/presets.js +60 -11
- package/dist/generators/presets.js.map +1 -1
- package/dist/generators/prompts.d.ts.map +1 -1
- package/dist/generators/prompts.js +11 -0
- package/dist/generators/prompts.js.map +1 -1
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/mcp-server.d.ts.map +1 -1
- package/dist/mcp/mcp-server.js +350 -5
- package/dist/mcp/mcp-server.js.map +1 -1
- package/dist/plugins/core-generators-plugin.d.ts.map +1 -1
- package/dist/plugins/core-generators-plugin.js +54 -3
- package/dist/plugins/core-generators-plugin.js.map +1 -1
- package/dist/ui/public/index.html +146 -12
- package/dist/ui/server.d.ts.map +1 -1
- package/dist/ui/server.js +164 -17
- package/dist/ui/server.js.map +1 -1
- package/dist/utils/file-system.d.ts +1 -0
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +9 -0
- package/dist/utils/file-system.js.map +1 -1
- package/dist/utils/gitignore-manager.d.ts +2 -0
- package/dist/utils/gitignore-manager.d.ts.map +1 -0
- package/dist/utils/gitignore-manager.js +71 -0
- package/dist/utils/gitignore-manager.js.map +1 -0
- package/dist/utils/i18n-cli.d.ts +38 -0
- package/dist/utils/i18n-cli.d.ts.map +1 -1
- package/dist/utils/i18n-cli.js +50 -2
- package/dist/utils/i18n-cli.js.map +1 -1
- package/dist/utils/token-estimator.d.ts +11 -0
- package/dist/utils/token-estimator.d.ts.map +1 -0
- package/dist/utils/token-estimator.js +25 -0
- package/dist/utils/token-estimator.js.map +1 -0
- package/dist/utils/workspace-detector.d.ts.map +1 -1
- package/dist/utils/workspace-detector.js +9 -3
- package/dist/utils/workspace-detector.js.map +1 -1
- package/docs/COMMANDS.md +86 -10
- package/docs/USAGE_GUIDE.md +35 -3
- package/package.json +7 -3
package/README.md
CHANGED
|
@@ -3,78 +3,37 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/gherkin-ai)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
|
|
6
|
-
> **The Closed-Loop Agentic Testing & Orchestration Engine for
|
|
7
|
-
> Turn product requirements into verifiable Gherkin specifications, execute dual-stack implementations (React + Java
|
|
6
|
+
> **The Closed-Loop Agentic Testing & Orchestration Engine for Full-Stack Applications.**
|
|
7
|
+
> Turn product requirements into verifiable Gherkin specifications, execute dual-stack implementations (React + Java / PHP / .NET / Python), and experiment with self-healing agent loops.
|
|
8
|
+
>
|
|
9
|
+
> [](https://github.com/FennerEduardo/gherkin-ai-cli/actions/workflows/ci.yml)
|
|
10
|
+
> []()
|
|
8
11
|
|
|
9
12
|
---
|
|
10
13
|
|
|
11
|
-
## 🌟 Strategic Capabilities
|
|
14
|
+
## 🌟 Strategic Capabilities
|
|
12
15
|
|
|
13
|
-
While basic AI spec tools only generate text prompts, `gherkin-ai` acts as an **executable contract and verification harness** between Product Intent, AI Agents (Cursor, Claude Code, Windsurf,
|
|
16
|
+
While basic AI spec tools only generate text prompts, `gherkin-ai` acts as an **executable contract and verification harness** between Product Intent, AI Agents (Cursor, Antigravity, Claude Code, Windsurf, Copilot), Code Implementation, and CI/CD Quality Gates:
|
|
14
17
|
|
|
15
|
-
- 🤖 **
|
|
18
|
+
- 🤖 **AI Agent Implementation Orchestration (`ghk implement`)**: Compiles `.ghkgovernance.yaml`, domain contracts (`*.contract.php`, `.ts`, `.py`, `.java`), ADRs, and Gherkin features into a copy-pasteable Master Agent Implementation Prompt.
|
|
19
|
+
- 🐳 **Docker Container Sandbox & Host Protection (`--docker`)**: Generates stack-specific dev container environments (`mcr.microsoft.com/dotnet/sdk:8.0`, `eclipse-temurin:21-jdk-alpine`, `php:8.3-cli-alpine`, `python:3.11-slim`, `node:20-alpine`, `golang:1.22-alpine`, `ruby:3.3-alpine`) so AI agents run tests inside isolated Docker containers without polluting host OS.
|
|
20
|
+
- 📋 **Feature Inventory & Developer Audit Trail (`ghk audit`)**: Auto-detects developer identity (`git config user.name`/`email`), SHA-256 spec & prompt hashes, timestamps, and execution records stored in `.ghe/inventory.json` with LRU retention limit (`maxEntries: 50`) and `--json` export for CI/CD audit pipelines.
|
|
21
|
+
- ⚡ **Token Efficiency & Ultra-Compact Mode (`-C, --compact`)**: Uses direct `@` file pointers for on-demand context resolution (70–85% token savings vs code dumping) and provides a dense ~90-token compact prompt mode for cost-sensitive LLMs.
|
|
22
|
+
- 🌐 **Multilingual CLI & English Prompt Rationale (`ghk lang`)**: Full interactive CLI support in Spanish (`es`) and English (`en`). Master AI Prompts are intentionally generated in **English** for maximum BPE token density (~30% cheaper) and LLM reasoning accuracy.
|
|
23
|
+
- 🤖 **True Agentic Engine & Self-Healing (EXPERIMENTAL - `ghk verify --auto-fix` & `ghk autopilot`)**: Connects natively with LLMs (OpenAI, Anthropic, Ollama), modifies source code, intercepts test failures, and recursively applies repairs in a true **Closed-Loop**. *Note: Agentic execution is currently experimental and should be run with human supervision.*
|
|
16
24
|
- 🌐 **Web Studio UI (`ghk web`)**: Launch a premium local graphical interface to interactively generate your Gherkin specifications, detect your stack, and orchestrate agent prompts visually.
|
|
17
|
-
- 🌳 **Official Cucumber AST Parser**: 100% compliant with the Gherkin standard using the official `@cucumber/gherkin` package.
|
|
18
|
-
- 🔗 **AST Step Definitions Indexer**: Prevents AI hallucinations by statically analyzing your E2E project (Cypress/Playwright/Cucumber-JS) via `ts-morph`, extracting existing `Given/When/Then` steps, and forcing the LLM to reuse them.
|
|
19
|
-
- 🛡️ **Semantically Typed Contracts**: Extracts variables straight from your Gherkin data tables (like `@validate:email`) and outputs strictly typed Zod DTOs instead of generic objects.
|
|
20
|
-
- ⚙️ **Headless CI/CD Mode**: Fully decoupled non-interactive mode (`--yes`, `--non-interactive`, `--project <dir>`) designed for frictionless integration into GitHub Actions, Azure DevOps, and automated pipelines.
|
|
21
|
-
- 📋 **Pre-flight Requirement Validation**: Built-in semantic validator inside `ghk autopilot` that analyzes requirements before triggering LLM agents, preventing token waste on vague features.
|
|
22
|
-
- 🔌 **Native MCP Server & Cursor Skills (`ghk mcp install` & `ghk skill`)**: Zero-config Model Context Protocol (MCP) server. The new `ghk skill` command injects native Cursor and Windsurf `.cursorrules` to let your IDE automatically invoke Gherkin AI as an internal skill.
|
|
23
|
-
- 📦 **Context Engineering & Guardrails Engine (`ghk context`)**: Structurally packages project architecture, conventions, and security policies into `.ghe/`, enforcing strict path protection and agent change limits.
|
|
24
|
-
- 🏗️ **DOM & Data Model Anchor**: Automatically extracts `schema.prisma` models and Page Object Model (POM) `data-test` selectors, injecting them into the agent's context to ensure generated tests are grounded in technical reality.
|
|
25
|
-
- 🏆 **Dynamic Quality Gate Index (`ghk quality`)**: Measures spec coverage, unit tests, E2E, type safety, and security dynamically by parsing your real test coverage (`coverage-summary.json`) and linter outputs.
|
|
26
|
-
- ☕ **Enterprise Java, React, Rust & Go Templates**: Extensive boilerplate support. Scaffolds Spring Boot, Next.js, Rust Axum, Go Fiber, and mobile (Flutter/React Native) architectures out-of-the-box.
|
|
27
|
-
- 🕵️ **Interactive Stack & Pattern Detection (`ghk detect`)**: Auto-detects existing brownfield architectures and intelligently injects industry-standard design patterns (e.g., Hooks, CQRS, MVC) into Agent prompts.
|
|
28
|
-
- 📡 **Event-Driven & AsyncAPI Support**: Automatically extracts domain events from Gherkin and scaffolds standard `asyncapi.json` contracts.
|
|
29
|
-
- 🔍 **Deep AST Drift Detection (`ghk diff`)**: Validates in CI/CD pipelines if the implemented DTOs and code have drifted from the `.feature` file. Now cross-references semantic fields, HTTP status codes, and API Endpoints.
|
|
25
|
+
- 🌳 **Official Cucumber AST Parser**: 100% compliant with the Gherkin standard using the official `@cucumber/gherkin` package.
|
|
30
26
|
|
|
31
27
|
---
|
|
32
28
|
|
|
33
|
-
## 📥 Installation & Execution
|
|
29
|
+
## 📥 Installation & Execution
|
|
34
30
|
|
|
35
|
-
You can use `gherkin-ai` via global `npm` installation, on-demand zero-install `npx`, or as a project local dev dependency:
|
|
36
|
-
|
|
37
|
-
### Option 1: Global Installation (`npm`)
|
|
38
31
|
```bash
|
|
32
|
+
# Global Installation
|
|
39
33
|
npm install -g gherkin-ai
|
|
40
|
-
```
|
|
41
|
-
Once installed globally, you can use `ghk` or `gherkin-ai` CLI commands directly:
|
|
42
|
-
```bash
|
|
43
|
-
ghk mcp install
|
|
44
|
-
ghk verify --auto-fix
|
|
45
|
-
ghk context build
|
|
46
|
-
ghk quality
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### Option 2: Zero-Install On-Demand (`npx`)
|
|
50
|
-
Run any `gherkin-ai` command instantly without global installation:
|
|
51
|
-
```bash
|
|
52
|
-
# Auto-install MCP server for Cursor & Claude Desktop
|
|
53
|
-
npx -y gherkin-ai mcp install
|
|
54
|
-
|
|
55
|
-
# Run closed-loop verification test harness
|
|
56
|
-
npx -y gherkin-ai verify --auto-fix
|
|
57
34
|
|
|
58
|
-
#
|
|
59
|
-
npx -y gherkin-ai
|
|
60
|
-
|
|
61
|
-
# Calculate feature quality score index
|
|
62
|
-
npx -y gherkin-ai quality
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### Option 3: Local Project Dev Dependency
|
|
66
|
-
Add to your project's `devDependencies`:
|
|
67
|
-
```bash
|
|
68
|
-
npm install --save-dev gherkin-ai
|
|
69
|
-
```
|
|
70
|
-
Then invoke via `npx` or add scripts to your `package.json`:
|
|
71
|
-
```json
|
|
72
|
-
{
|
|
73
|
-
"scripts": {
|
|
74
|
-
"test:verify": "ghk verify --auto-fix",
|
|
75
|
-
"quality:check": "ghk quality"
|
|
76
|
-
}
|
|
77
|
-
}
|
|
35
|
+
# Or Zero-Install On-Demand
|
|
36
|
+
npx -y gherkin-ai implement --feature ./features/01-customer-management.feature
|
|
78
37
|
```
|
|
79
38
|
|
|
80
39
|
---
|
|
@@ -82,20 +41,23 @@ Then invoke via `npx` or add scripts to your `package.json`:
|
|
|
82
41
|
## 🚀 Quick Start Commands
|
|
83
42
|
|
|
84
43
|
```bash
|
|
85
|
-
# 1.
|
|
86
|
-
ghk
|
|
44
|
+
# 1. Generate Master AI Agent Implementation Prompt & Context Package
|
|
45
|
+
ghk implement --feature ./features/01-customer-management.feature
|
|
87
46
|
|
|
88
|
-
# 2.
|
|
89
|
-
ghk
|
|
47
|
+
# 2. Generate Ultra-Compact Prompt for Low-Cost LLMs (~90 tokens)
|
|
48
|
+
ghk implement --feature ./features/01-customer-management.feature --compact
|
|
90
49
|
|
|
91
|
-
# 3.
|
|
92
|
-
ghk
|
|
50
|
+
# 3. View Feature Inventory & Developer Audit Trail History
|
|
51
|
+
ghk audit
|
|
93
52
|
|
|
94
|
-
# 4.
|
|
95
|
-
ghk
|
|
53
|
+
# 4. Export Audit History as JSON for CI/CD Compliance Pipelines
|
|
54
|
+
ghk audit --json
|
|
96
55
|
|
|
97
|
-
# 5.
|
|
98
|
-
ghk
|
|
56
|
+
# 5. Configure CLI Language (English or Spanish)
|
|
57
|
+
ghk lang --set es
|
|
58
|
+
|
|
59
|
+
# 6. Run Closed-Loop Test Verification with Auto-Fix Loop
|
|
60
|
+
ghk verify --auto-fix
|
|
99
61
|
```
|
|
100
62
|
|
|
101
63
|
---
|
package/dist/commands/add.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAgBA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsG9J"}
|
package/dist/commands/add.js
CHANGED
|
@@ -8,35 +8,36 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.handleAddCommand = handleAddCommand;
|
|
10
10
|
const path_1 = __importDefault(require("path"));
|
|
11
|
-
const inquirer_1 = __importDefault(require("inquirer"));
|
|
12
11
|
const config_1 = require("../core/config");
|
|
13
12
|
const stack_detector_1 = require("../core/stack-detector");
|
|
14
13
|
const gherkin_parser_1 = require("../core/gherkin-parser");
|
|
15
14
|
const contracts_1 = require("../generators/contracts");
|
|
16
15
|
const prompts_1 = require("../generators/prompts");
|
|
16
|
+
const ir_builder_1 = require("../core/ir-builder");
|
|
17
17
|
const create_1 = require("./create");
|
|
18
18
|
const file_system_1 = require("../utils/file-system");
|
|
19
19
|
const logger_1 = require("../utils/logger");
|
|
20
20
|
async function handleAddCommand(options) {
|
|
21
21
|
logger_1.logger.banner();
|
|
22
|
+
const { promptOrFallback } = require('../utils/i18n-cli');
|
|
22
23
|
if (!options.feature) {
|
|
23
24
|
logger_1.logger.info('No --feature file specified. Launching interactive spec wizard...');
|
|
24
|
-
await (0, create_1.handleCreateCommand)({ target: options.target });
|
|
25
|
+
await (0, create_1.handleCreateCommand)({ target: options.target, yes: options.yes, nonInteractive: options.nonInteractive });
|
|
25
26
|
return;
|
|
26
27
|
}
|
|
27
28
|
const featurePath = path_1.default.resolve(process.cwd(), options.feature);
|
|
28
29
|
if (!(0, file_system_1.fileExistsSync)(featurePath)) {
|
|
29
30
|
logger_1.logger.warn(`Feature file not found at: ${featurePath}`);
|
|
30
|
-
const answer = await
|
|
31
|
+
const answer = await promptOrFallback([
|
|
31
32
|
{
|
|
32
33
|
type: 'confirm',
|
|
33
34
|
name: 'createNow',
|
|
34
35
|
message: '¿Deseas crear la especificación Gherkin paso a paso ahora (wizard interactivo)?',
|
|
35
36
|
default: true
|
|
36
37
|
}
|
|
37
|
-
]);
|
|
38
|
+
], options);
|
|
38
39
|
if (answer.createNow) {
|
|
39
|
-
await (0, create_1.handleCreateCommand)({ output: options.feature, target: options.target });
|
|
40
|
+
await (0, create_1.handleCreateCommand)({ output: options.feature, target: options.target, yes: options.yes, nonInteractive: options.nonInteractive });
|
|
40
41
|
return;
|
|
41
42
|
}
|
|
42
43
|
else {
|
|
@@ -53,13 +54,18 @@ async function handleAddCommand(options) {
|
|
|
53
54
|
const gherkinText = (0, file_system_1.readFileSync)(featurePath);
|
|
54
55
|
const parsed = (0, gherkin_parser_1.parseGherkinText)(gherkinText);
|
|
55
56
|
const featurePascal = parsed.featureName.replace(/[^a-zA-Z0-9]/g, '') || 'Feature';
|
|
56
|
-
|
|
57
|
+
let targetDir = options.target
|
|
57
58
|
? path_1.default.resolve(process.cwd(), options.target)
|
|
58
59
|
: path_1.default.resolve(process.cwd(), 'src', 'modules', featurePascal.toLowerCase());
|
|
60
|
+
if (!targetDir.startsWith(process.cwd())) {
|
|
61
|
+
logger_1.logger.error(`Security Violation: Target path escapes the current workspace: ${targetDir}`);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
59
64
|
(0, file_system_1.ensureDirSync)(targetDir);
|
|
60
65
|
logger_1.logger.info(`Injecting contracts & AI prompts into: ${targetDir}`);
|
|
61
66
|
// 1. Generate Contracts, OpenAPI, AsyncAPI & Native Language Contract
|
|
62
|
-
const
|
|
67
|
+
const ir = (0, ir_builder_1.buildSpecificationIR)(parsed, featurePath, { domainProfile: config.domainProfile });
|
|
68
|
+
const { contractsTs, adrMd, openApiJson, asyncApiJson, nativeContract } = (0, contracts_1.generateContracts)(parsed, ir, config);
|
|
63
69
|
const contractFileName = `${featurePascal.toLowerCase()}.contract.ts`;
|
|
64
70
|
(0, file_system_1.writeFileSync)(path_1.default.join(targetDir, contractFileName), contractsTs);
|
|
65
71
|
(0, file_system_1.writeFileSync)(path_1.default.join(targetDir, `${featurePascal.toLowerCase()}.openapi.json`), openApiJson);
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;;;;
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-log.d.ts","sourceRoot":"","sources":["../../src/commands/agent-log.ts"],"names":[],"mappings":"AAQA,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBhB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* ==========================================================================
|
|
3
|
+
gherkin-ai-cli - 'agent-log' Command Handler
|
|
4
|
+
========================================================================== */
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.handleAgentLogCommand = handleAgentLogCommand;
|
|
7
|
+
const agent_logger_1 = require("../core/agent-logger");
|
|
8
|
+
const logger_1 = require("../utils/logger");
|
|
9
|
+
async function handleAgentLogCommand(options) {
|
|
10
|
+
const manager = new agent_logger_1.AgentLogManager(process.cwd());
|
|
11
|
+
if (options.clear) {
|
|
12
|
+
manager.clearLogs();
|
|
13
|
+
logger_1.logger.success('Agent action logs cleared successfully.');
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (options.action) {
|
|
17
|
+
const featureName = options.feature || 'Global Action';
|
|
18
|
+
manager.recordAction(featureName, options.action);
|
|
19
|
+
logger_1.logger.success(`Agent action logged for feature: ${featureName}`);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
// Display logs (list mode)
|
|
23
|
+
const records = manager.getLogs(options.feature);
|
|
24
|
+
if (options.json) {
|
|
25
|
+
console.log(JSON.stringify(records, null, 2));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
console.log(manager.formatCLIReport(records));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=agent-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-log.js","sourceRoot":"","sources":["../../src/commands/agent-log.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAMhF,sDA+BC;AAnCD,uDAAuD;AACvD,4CAAyC;AAGlC,KAAK,UAAU,qBAAqB,CAAC,OAM3C;IACC,MAAM,OAAO,GAAG,IAAI,8BAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEnD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,eAAM,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;QACvD,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,eAAM,CAAC,OAAO,CAAC,oCAAoC,WAAW,EAAE,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAOA,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBtH"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* ==========================================================================
|
|
3
|
+
gherkin-ai-cli - 'audit' Command Handler (Feature Inventory & Audit Trail)
|
|
4
|
+
========================================================================== */
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.handleAuditCommand = handleAuditCommand;
|
|
7
|
+
const logger_1 = require("../utils/logger");
|
|
8
|
+
const inventory_1 = require("../core/inventory");
|
|
9
|
+
async function handleAuditCommand(options) {
|
|
10
|
+
const manager = new inventory_1.InventoryManager();
|
|
11
|
+
if (options.clear) {
|
|
12
|
+
manager.clearInventory();
|
|
13
|
+
logger_1.logger.success('Feature audit trail inventory cleared successfully.');
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const isJson = options.json || process.argv.includes('--json');
|
|
17
|
+
if (!isJson) {
|
|
18
|
+
logger_1.logger.banner();
|
|
19
|
+
logger_1.logger.info('Retrieving Feature Implementation & Prompt Audit Records...');
|
|
20
|
+
}
|
|
21
|
+
const records = manager.getInventory(options.feature);
|
|
22
|
+
if (isJson) {
|
|
23
|
+
console.log(JSON.stringify(records, null, 2));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
console.log(manager.formatCLIReport(records));
|
|
27
|
+
logger_1.logger.success(`Audit trail query complete. (${records.length} record(s) found)`);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":";AAAA;;gFAEgF;;AAKhF,gDAyBC;AA5BD,4CAAyC;AACzC,iDAAqD;AAE9C,KAAK,UAAU,kBAAkB,CAAC,OAA8D;IACrG,MAAM,OAAO,GAAG,IAAI,4BAAgB,EAAE,CAAC;IAEvC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,cAAc,EAAE,CAAC;QACzB,eAAM,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE/D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,eAAM,CAAC,MAAM,EAAE,CAAC;QAChB,eAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9C,eAAM,CAAC,OAAO,CAAC,gCAAgC,OAAO,CAAC,MAAM,mBAAmB,CAAC,CAAC;AACpF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autopilot.d.ts","sourceRoot":"","sources":["../../src/commands/autopilot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"autopilot.d.ts","sourceRoot":"","sources":["../../src/commands/autopilot.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAiBD,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyS1F"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/* ==========================================================================
|
|
3
3
|
gherkin-ai-cli - 'autopilot' Command Handler (Multi-Agent Orchestrator)
|
|
4
|
+
|
|
5
|
+
Enhanced with:
|
|
6
|
+
- Pre-lint validation of generated specifications
|
|
7
|
+
- IR structural validation (commands, events, scenarios)
|
|
8
|
+
- Structured JSON run logging for traceability
|
|
4
9
|
========================================================================== */
|
|
5
10
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
11
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -11,39 +16,77 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
11
16
|
const fs_1 = __importDefault(require("fs"));
|
|
12
17
|
const path_1 = __importDefault(require("path"));
|
|
13
18
|
const context_builder_1 = require("../core/context-builder");
|
|
14
|
-
const
|
|
19
|
+
const risk_engine_1 = require("../core/risk-engine");
|
|
15
20
|
const agent_adapter_1 = require("../core/agent-adapter");
|
|
16
21
|
const verify_1 = require("./verify");
|
|
17
22
|
const config_1 = require("../core/config");
|
|
18
23
|
const spec_dir_resolver_1 = require("../utils/spec-dir-resolver");
|
|
19
24
|
const requirement_validator_1 = require("../core/requirement-validator");
|
|
25
|
+
const metrics_engine_1 = require("../core/metrics-engine");
|
|
20
26
|
async function handleAutopilotCommand(options = {}) {
|
|
21
27
|
console.log(chalk_1.default.bold.cyan('\n🚀 Launching gherkin-ai Autopilot Autonomous Delivery Orchestrator...\n'));
|
|
28
|
+
const runLog = {
|
|
29
|
+
runId: `run-${Date.now()}`,
|
|
30
|
+
timestamp: new Date().toISOString(),
|
|
31
|
+
requirementFile: '',
|
|
32
|
+
requirementScore: 0,
|
|
33
|
+
specGenerated: false,
|
|
34
|
+
lintScore: null,
|
|
35
|
+
irValidation: null,
|
|
36
|
+
scaffoldingResult: 'skipped',
|
|
37
|
+
verifyIterations: 0,
|
|
38
|
+
riskLevel: 'UNKNOWN',
|
|
39
|
+
riskScore: 0,
|
|
40
|
+
finalStatus: 'failed'
|
|
41
|
+
};
|
|
42
|
+
const metricsEngine = new metrics_engine_1.MetricsEngine();
|
|
43
|
+
const execEvents = [];
|
|
44
|
+
const execErrors = [];
|
|
22
45
|
const reqFile = options.requirement || 'requirement.md';
|
|
46
|
+
runLog.requirementFile = reqFile;
|
|
23
47
|
if (!fs_1.default.existsSync(reqFile)) {
|
|
24
48
|
console.log(chalk_1.default.red(`\n✖ Requirement file not found: ${reqFile}`));
|
|
25
49
|
console.log(chalk_1.default.yellow(` → Fix: Provide a valid path with --requirement <file>`));
|
|
26
50
|
console.log(chalk_1.default.yellow(` → Example: ghk autopilot --requirement docs/user-crud.md\n`));
|
|
51
|
+
saveRunLog(runLog);
|
|
27
52
|
process.exitCode = 1;
|
|
28
53
|
return;
|
|
29
54
|
}
|
|
30
55
|
const reqContent = fs_1.default.readFileSync(reqFile, 'utf8');
|
|
31
56
|
// Validate requirement before proceeding with agents
|
|
32
57
|
const validation = (0, requirement_validator_1.validateRequirement)(reqContent);
|
|
58
|
+
runLog.requirementScore = validation.score;
|
|
33
59
|
if (!validation.isValid) {
|
|
34
60
|
console.log(chalk_1.default.red('\n✖ Requirement validation failed:'));
|
|
35
61
|
for (const issue of validation.issues) {
|
|
36
|
-
|
|
62
|
+
const icon = issue.severity === 'error' ? '✖' : issue.severity === 'warning' ? '⚠' : 'ℹ';
|
|
63
|
+
const color = issue.severity === 'error' ? chalk_1.default.red : issue.severity === 'warning' ? chalk_1.default.yellow : chalk_1.default.gray;
|
|
64
|
+
console.log(color(` ${icon} [${issue.severity.toUpperCase()}] ${issue.message}`));
|
|
37
65
|
console.log(chalk_1.default.gray(` → ${issue.suggestion}`));
|
|
38
66
|
}
|
|
67
|
+
console.log(chalk_1.default.cyan(`\n Requirement quality score: ${validation.score}/100`));
|
|
68
|
+
saveRunLog(runLog);
|
|
39
69
|
process.exitCode = 1;
|
|
40
70
|
return;
|
|
41
71
|
}
|
|
72
|
+
// Show warnings even if valid
|
|
73
|
+
const warnings = validation.issues.filter(i => i.severity !== 'error');
|
|
74
|
+
if (warnings.length > 0) {
|
|
75
|
+
console.log(chalk_1.default.yellow(`\n⚠ Requirement passed with ${warnings.length} warning(s) (score: ${validation.score}/100):`));
|
|
76
|
+
for (const w of warnings) {
|
|
77
|
+
console.log(chalk_1.default.yellow(` ⚠ ${w.message}`));
|
|
78
|
+
}
|
|
79
|
+
console.log('');
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
console.log(chalk_1.default.green(`✓ Requirement validation passed (score: ${validation.score}/100)\n`));
|
|
83
|
+
}
|
|
42
84
|
const { detectPromptInjection } = require('../core/security-sanitizer');
|
|
43
85
|
const securityCheck = detectPromptInjection(reqContent);
|
|
44
86
|
if (!securityCheck.isSafe) {
|
|
45
87
|
console.log(chalk_1.default.red('\n✖ SECURITY ALERT: Prompt Injection Attempt Blocked!'));
|
|
46
88
|
console.log(chalk_1.default.red(` ⚠ Reason: ${securityCheck.reason}`));
|
|
89
|
+
saveRunLog(runLog);
|
|
47
90
|
process.exitCode = 1;
|
|
48
91
|
return;
|
|
49
92
|
}
|
|
@@ -65,11 +108,14 @@ async function handleAutopilotCommand(options = {}) {
|
|
|
65
108
|
}
|
|
66
109
|
catch (error) {
|
|
67
110
|
console.log(chalk_1.default.red(`\n✖ Spec Agent execution crashed: ${error.message}`));
|
|
111
|
+
saveRunLog(runLog);
|
|
68
112
|
process.exitCode = 1;
|
|
69
113
|
return;
|
|
70
114
|
}
|
|
71
115
|
let specContent = '';
|
|
72
116
|
if (specRes.success && specRes.codeModifications && specRes.codeModifications.length > 0) {
|
|
117
|
+
metricsEngine.recordAgentAttempt(specRes.tokensUsed || 0, specRes.codeModifications.length);
|
|
118
|
+
execEvents.push({ type: 'spec_agent_attempt', tokens: specRes.tokensUsed });
|
|
73
119
|
let specDirPath = process.env.GHK_SPEC_DIR || configInstance.specDir || 'specs';
|
|
74
120
|
try {
|
|
75
121
|
specDirPath = (0, spec_dir_resolver_1.resolveSpecDir)(configInstance.specDir);
|
|
@@ -85,7 +131,8 @@ async function handleAutopilotCommand(options = {}) {
|
|
|
85
131
|
else if (!p.includes('/') && !p.includes('\\')) {
|
|
86
132
|
p = path_1.default.join(specDirPath, p);
|
|
87
133
|
}
|
|
88
|
-
const
|
|
134
|
+
const { resolveSafePath } = require('../utils/file-system');
|
|
135
|
+
const fullPath = resolveSafePath(process.cwd(), p);
|
|
89
136
|
if (process.env.GHK_DRY_RUN === 'true') {
|
|
90
137
|
if (process.env.GHK_STDOUT === 'true') {
|
|
91
138
|
console.log(chalk_1.default.yellow(` [DRY RUN] Proposed spec for ${p}:\n${mod.content}`));
|
|
@@ -107,6 +154,7 @@ async function handleAutopilotCommand(options = {}) {
|
|
|
107
154
|
specContent = mod.content;
|
|
108
155
|
}
|
|
109
156
|
}
|
|
157
|
+
runLog.specGenerated = true;
|
|
110
158
|
}
|
|
111
159
|
else {
|
|
112
160
|
const { saveFailedAttemptLog } = require('../core/agent-adapter');
|
|
@@ -114,9 +162,46 @@ async function handleAutopilotCommand(options = {}) {
|
|
|
114
162
|
console.log(chalk_1.default.red(`\n✖ Spec Agent failed to generate valid code blocks.`));
|
|
115
163
|
console.log(chalk_1.default.yellow(` Response from Agent:\n${specRes.agentResponse.substring(0, 300)}...\n`));
|
|
116
164
|
console.log(chalk_1.default.cyan(` → Diagnostics log saved to: ${logPath}\n`));
|
|
165
|
+
saveRunLog(runLog);
|
|
117
166
|
process.exitCode = 1;
|
|
118
167
|
return;
|
|
119
168
|
}
|
|
169
|
+
// ── Pre-Lint Validation of Generated Spec ──────────────────────────
|
|
170
|
+
if (specContent) {
|
|
171
|
+
try {
|
|
172
|
+
const { parseGherkinText } = require('../core/gherkin-parser');
|
|
173
|
+
const { lintSpecification } = require('../core/specification-linter');
|
|
174
|
+
const { buildIR } = require('../core/ir-builder');
|
|
175
|
+
const parsed = parseGherkinText(specContent);
|
|
176
|
+
const lintResult = lintSpecification(parsed, 'autopilot-generated.feature');
|
|
177
|
+
runLog.lintScore = lintResult.score;
|
|
178
|
+
console.log(chalk_1.default.blue(` 🔍 Pre-lint score of generated spec: ${lintResult.score}/100`));
|
|
179
|
+
if (lintResult.score < 60) {
|
|
180
|
+
console.log(chalk_1.default.red(` ✖ Generated specification quality is too low (${lintResult.score}/100). Minimum: 60.`));
|
|
181
|
+
for (const d of lintResult.diagnostics.filter((d) => d.severity === 'error').slice(0, 5)) {
|
|
182
|
+
console.log(chalk_1.default.red(` ✖ [${d.ruleId}] ${d.message}`));
|
|
183
|
+
}
|
|
184
|
+
console.log(chalk_1.default.yellow(` → Consider improving the requirement document and retrying.\n`));
|
|
185
|
+
saveRunLog(runLog);
|
|
186
|
+
process.exitCode = 1;
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// IR Structural Validation
|
|
190
|
+
const ir = buildIR(parsed, 'autopilot-generated.feature');
|
|
191
|
+
runLog.irValidation = {
|
|
192
|
+
commands: ir.commands?.length || 0,
|
|
193
|
+
events: ir.events?.length || 0,
|
|
194
|
+
scenarios: ir.scenarios?.length || 0
|
|
195
|
+
};
|
|
196
|
+
console.log(chalk_1.default.blue(` 🧠 IR Validation: ${ir.commands?.length || 0} command(s), ${ir.events?.length || 0} event(s), ${ir.scenarios?.length || 0} scenario(s)`));
|
|
197
|
+
if ((ir.commands?.length || 0) === 0 && (ir.events?.length || 0) === 0) {
|
|
198
|
+
console.log(chalk_1.default.yellow(` ⚠ Warning: Generated spec has no extractable commands or events. Agent prompts may lack context.`));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch (lintErr) {
|
|
202
|
+
console.log(chalk_1.default.yellow(` ⚠ Pre-lint skipped: ${lintErr.message}`));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
120
205
|
console.log(chalk_1.default.blue(`3. Invoking Scaffolding Agent -> Generating Bindings...`));
|
|
121
206
|
let scaffoldRes;
|
|
122
207
|
try {
|
|
@@ -129,17 +214,35 @@ async function handleAutopilotCommand(options = {}) {
|
|
|
129
214
|
}
|
|
130
215
|
catch (error) {
|
|
131
216
|
console.log(chalk_1.default.red(`\n✖ Scaffolding Agent execution crashed: ${error.message}`));
|
|
217
|
+
runLog.scaffoldingResult = 'failed';
|
|
218
|
+
saveRunLog(runLog);
|
|
132
219
|
process.exitCode = 1;
|
|
133
220
|
return;
|
|
134
221
|
}
|
|
135
222
|
if (scaffoldRes.success && scaffoldRes.codeModifications && scaffoldRes.codeModifications.length > 0) {
|
|
223
|
+
metricsEngine.recordAgentAttempt(scaffoldRes.tokensUsed || 0, scaffoldRes.codeModifications.length);
|
|
224
|
+
execEvents.push({ type: 'scaffold_agent_attempt', tokens: scaffoldRes.tokensUsed });
|
|
225
|
+
runLog.scaffoldingResult = 'success';
|
|
136
226
|
const { validateTypeScriptSyntax } = require('../core/syntax-validator');
|
|
137
227
|
for (const mod of scaffoldRes.codeModifications) {
|
|
138
228
|
if (!validateTypeScriptSyntax(mod.filePath, mod.content)) {
|
|
139
229
|
console.log(chalk_1.default.yellow(` ✖ Skipped writing ${mod.filePath} due to syntax errors.`));
|
|
140
230
|
continue;
|
|
141
231
|
}
|
|
142
|
-
const
|
|
232
|
+
const { validateGuardrails } = require('../core/guardrails');
|
|
233
|
+
const guardrailValidation = validateGuardrails({
|
|
234
|
+
action: 'generate_code',
|
|
235
|
+
targetFiles: [mod.filePath]
|
|
236
|
+
}, process.cwd());
|
|
237
|
+
if (!guardrailValidation.allowed) {
|
|
238
|
+
console.log(chalk_1.default.red(` ✖ GUARDRAIL VIOLATION: Agent changes rejected for ${mod.filePath}.`));
|
|
239
|
+
for (const v of guardrailValidation.violations) {
|
|
240
|
+
console.log(chalk_1.default.red(` - ${v}`));
|
|
241
|
+
}
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
const { resolveSafePath } = require('../utils/file-system');
|
|
245
|
+
const fullPath = resolveSafePath(process.cwd(), mod.filePath);
|
|
143
246
|
if (process.env.GHK_DRY_RUN === 'true') {
|
|
144
247
|
if (process.env.GHK_STDOUT === 'true') {
|
|
145
248
|
console.log(chalk_1.default.yellow(` [DRY RUN] Proposed bindings for ${mod.filePath}:\n${mod.content}`));
|
|
@@ -165,14 +268,46 @@ async function handleAutopilotCommand(options = {}) {
|
|
|
165
268
|
console.log(chalk_1.default.red(`\n✖ Scaffolding Agent failed to generate valid code blocks.`));
|
|
166
269
|
console.log(chalk_1.default.yellow(` Response from Agent:\n${scaffoldRes.agentResponse.substring(0, 300)}...\n`));
|
|
167
270
|
console.log(chalk_1.default.cyan(` → Diagnostics log saved to: ${logPath}\n`));
|
|
271
|
+
runLog.scaffoldingResult = 'failed';
|
|
272
|
+
saveRunLog(runLog);
|
|
168
273
|
process.exitCode = 1;
|
|
169
274
|
return;
|
|
170
275
|
}
|
|
171
276
|
console.log(chalk_1.default.blue(`4. Invoking Verification Agent & Closed-Loop Repair...`));
|
|
172
277
|
await (0, verify_1.handleVerifyCommand)({ autoFix: true, maxRetries: 2, command: options.command });
|
|
173
278
|
console.log(chalk_1.default.blue(`5. Evaluating Enterprise Quality Score Gate...`));
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
279
|
+
const riskCard = (0, risk_engine_1.calculateDeliveryRisk)(process.cwd(), configInstance.specDir);
|
|
280
|
+
runLog.riskLevel = riskCard.riskLevel;
|
|
281
|
+
runLog.riskScore = riskCard.overallRiskScore;
|
|
282
|
+
console.log('\n======================================================');
|
|
283
|
+
console.log(chalk_1.default.bold(' Autopilot Deployment Risk Assessment'));
|
|
284
|
+
console.log('======================================================');
|
|
285
|
+
const riskColor = riskCard.riskLevel === 'CRITICAL' || riskCard.riskLevel === 'HIGH' ? chalk_1.default.red :
|
|
286
|
+
riskCard.riskLevel === 'MEDIUM' ? chalk_1.default.yellow : chalk_1.default.green;
|
|
287
|
+
console.log(chalk_1.default.bold(`Risk Level: ${riskColor(riskCard.riskLevel)} (Score: ${riskCard.overallRiskScore})`));
|
|
288
|
+
if (riskCard.requiresHumanApproval) {
|
|
289
|
+
console.log(chalk_1.default.red('⚠ This change is highly risky and requires human approval.'));
|
|
290
|
+
runLog.finalStatus = 'failed';
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
console.log(chalk_1.default.green('✅ This change is considered safe for autonomous delivery.'));
|
|
294
|
+
runLog.finalStatus = 'success';
|
|
295
|
+
}
|
|
296
|
+
console.log('\nRun `ghk quality` to see a detailed risk breakdown.\n');
|
|
297
|
+
metricsEngine.setRequirements(validation.score > 70 ? 10 : 5, 10); // Mock coverage mapping
|
|
298
|
+
const logPath = metricsEngine.saveExecutionLog(execEvents, execErrors);
|
|
299
|
+
console.log(chalk_1.default.bold.magenta(`\n📊 DVE Metrics & Execution Log saved to: ${logPath}`));
|
|
300
|
+
saveRunLog(runLog);
|
|
301
|
+
}
|
|
302
|
+
function saveRunLog(log) {
|
|
303
|
+
try {
|
|
304
|
+
const logDir = path_1.default.resolve('.gherkin-ai', 'logs', 'autopilot');
|
|
305
|
+
fs_1.default.mkdirSync(logDir, { recursive: true });
|
|
306
|
+
const logPath = path_1.default.join(logDir, `${log.runId}.json`);
|
|
307
|
+
fs_1.default.writeFileSync(logPath, JSON.stringify(log, null, 2), 'utf8');
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
// Non-critical: don't crash if logging fails
|
|
311
|
+
}
|
|
177
312
|
}
|
|
178
313
|
//# sourceMappingURL=autopilot.js.map
|