scene-capability-engine 3.0.0
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/CHANGELOG.md +2513 -0
- package/LICENSE +21 -0
- package/README.md +765 -0
- package/README.zh.md +630 -0
- package/bin/kiro-spec-engine.js +796 -0
- package/bin/kse.js +3 -0
- package/bin/sce.js +3 -0
- package/bin/sco.js +3 -0
- package/docs/331-poc-adaptation-roadmap.md +156 -0
- package/docs/331-poc-dual-track-integration-guide.md +120 -0
- package/docs/331-poc-weekly-delivery-checklist.md +52 -0
- package/docs/OFFLINE_INSTALL.md +96 -0
- package/docs/README.md +279 -0
- package/docs/adopt-migration-guide.md +599 -0
- package/docs/adoption-guide.md +616 -0
- package/docs/agent-hooks-analysis.md +815 -0
- package/docs/architecture.md +733 -0
- package/docs/articles/ai-driven-development-philosophy-and-practice-review.md +208 -0
- package/docs/articles/ai-driven-development-philosophy-and-practice.en.md +459 -0
- package/docs/articles/ai-driven-development-philosophy-and-practice.md +492 -0
- package/docs/autonomous-control-guide.md +851 -0
- package/docs/command-reference.md +1368 -0
- package/docs/community.md +115 -0
- package/docs/cross-tool-guide.md +555 -0
- package/docs/developer-guide.md +619 -0
- package/docs/document-governance.md +865 -0
- package/docs/environment-management-guide.md +526 -0
- package/docs/examples/add-export-command/design.md +194 -0
- package/docs/examples/add-export-command/requirements.md +110 -0
- package/docs/examples/add-export-command/tasks.md +88 -0
- package/docs/examples/add-rest-api/design.md +855 -0
- package/docs/examples/add-rest-api/requirements.md +323 -0
- package/docs/examples/add-rest-api/tasks.md +355 -0
- package/docs/examples/add-user-dashboard/design.md +192 -0
- package/docs/examples/add-user-dashboard/requirements.md +143 -0
- package/docs/examples/add-user-dashboard/tasks.md +91 -0
- package/docs/faq.md +697 -0
- package/docs/handoffs/evidence/ontology/moqui-template-baseline-2026-02-17-232922.json +156 -0
- package/docs/handoffs/evidence/ontology/moqui-template-baseline-2026-02-17-232922.md +24 -0
- package/docs/images/wechat-qr.png +0 -0
- package/docs/integration-modes.md +529 -0
- package/docs/integration-philosophy.md +313 -0
- package/docs/knowledge-management-guide.md +263 -0
- package/docs/manual-workflows-guide.md +418 -0
- package/docs/moqui-capability-matrix.md +73 -0
- package/docs/moqui-template-core-library-playbook.md +109 -0
- package/docs/multi-agent-coordination-guide.md +553 -0
- package/docs/multi-repo-management-guide.md +1344 -0
- package/docs/quick-start-with-ai-tools.md +375 -0
- package/docs/quick-start.md +146 -0
- package/docs/release-checklist.md +121 -0
- package/docs/releases/README.md +13 -0
- package/docs/releases/v1.46.2-validation.md +45 -0
- package/docs/releases/v1.46.2.md +50 -0
- package/docs/scene-runtime-guide.md +347 -0
- package/docs/spec-collaboration-guide.md +369 -0
- package/docs/spec-locking-guide.md +225 -0
- package/docs/spec-numbering-guide.md +348 -0
- package/docs/spec-workflow.md +519 -0
- package/docs/steering-strategy-guide.md +196 -0
- package/docs/team-collaboration-guide.md +465 -0
- package/docs/testing-strategy.md +272 -0
- package/docs/tools/claude-guide.md +654 -0
- package/docs/tools/cursor-guide.md +706 -0
- package/docs/tools/generic-guide.md +446 -0
- package/docs/tools/kiro-guide.md +308 -0
- package/docs/tools/vscode-guide.md +445 -0
- package/docs/tools/windsurf-guide.md +391 -0
- package/docs/troubleshooting.md +1135 -0
- package/docs/upgrade-guide.md +639 -0
- package/docs/value-observability-guide.md +127 -0
- package/docs/zh/README.md +341 -0
- package/docs/zh/quick-start.md +764 -0
- package/docs/zh/release-checklist.md +121 -0
- package/docs/zh/releases/README.md +13 -0
- package/docs/zh/releases/v1.46.2-validation.md +45 -0
- package/docs/zh/releases/v1.46.2.md +50 -0
- package/docs/zh/spec-numbering-guide.md +348 -0
- package/docs/zh/tools/claude-guide.md +349 -0
- package/docs/zh/tools/cursor-guide.md +281 -0
- package/docs/zh/tools/generic-guide.md +499 -0
- package/docs/zh/tools/kiro-guide.md +342 -0
- package/docs/zh/tools/vscode-guide.md +449 -0
- package/docs/zh/tools/windsurf-guide.md +378 -0
- package/docs/zh/value-observability-guide.md +127 -0
- package/docs//344/272/244/344/273/230/346/270/205/345/215/225.md +75 -0
- package/lib/adoption/adoption-logger.js +487 -0
- package/lib/adoption/adoption-strategy.js +538 -0
- package/lib/adoption/backup-manager.js +420 -0
- package/lib/adoption/conflict-resolver.js +410 -0
- package/lib/adoption/detection-engine.js +275 -0
- package/lib/adoption/diff-viewer.js +226 -0
- package/lib/adoption/error-formatter.js +509 -0
- package/lib/adoption/file-classifier.js +385 -0
- package/lib/adoption/progress-reporter.js +534 -0
- package/lib/adoption/smart-orchestrator.js +470 -0
- package/lib/adoption/strategy-selector.js +218 -0
- package/lib/adoption/summary-generator.js +493 -0
- package/lib/adoption/template-sync.js +605 -0
- package/lib/auto/autonomous-engine.js +485 -0
- package/lib/auto/checkpoint-manager.js +300 -0
- package/lib/auto/close-loop-runner.js +2476 -0
- package/lib/auto/config-schema.js +176 -0
- package/lib/auto/decision-engine.js +344 -0
- package/lib/auto/error-recovery-manager.js +580 -0
- package/lib/auto/goal-decomposer.js +278 -0
- package/lib/auto/progress-tracker.js +502 -0
- package/lib/auto/safety-manager.js +186 -0
- package/lib/auto/semantic-decomposer.js +137 -0
- package/lib/auto/state-manager.js +126 -0
- package/lib/auto/task-queue-manager.js +340 -0
- package/lib/backup/backup-system.js +372 -0
- package/lib/backup/selective-backup.js +207 -0
- package/lib/collab/agent-registry.js +240 -0
- package/lib/collab/collab-manager.js +285 -0
- package/lib/collab/contract-manager.js +320 -0
- package/lib/collab/coordinator.js +370 -0
- package/lib/collab/dependency-manager.js +280 -0
- package/lib/collab/index.js +20 -0
- package/lib/collab/integration-manager.js +202 -0
- package/lib/collab/merge-coordinator.js +252 -0
- package/lib/collab/metadata-manager.js +233 -0
- package/lib/collab/multi-agent-config.js +120 -0
- package/lib/collab/spec-lifecycle-manager.js +304 -0
- package/lib/collab/sync-barrier.js +88 -0
- package/lib/collab/visualizer.js +208 -0
- package/lib/commands/adopt.js +749 -0
- package/lib/commands/auto.js +19559 -0
- package/lib/commands/collab.js +275 -0
- package/lib/commands/context.js +99 -0
- package/lib/commands/docs.js +808 -0
- package/lib/commands/doctor.js +273 -0
- package/lib/commands/env.js +420 -0
- package/lib/commands/knowledge.js +309 -0
- package/lib/commands/lock.js +235 -0
- package/lib/commands/ops.js +409 -0
- package/lib/commands/orchestrate.js +446 -0
- package/lib/commands/prompt.js +105 -0
- package/lib/commands/repo.js +118 -0
- package/lib/commands/rollback.js +219 -0
- package/lib/commands/scene.js +15549 -0
- package/lib/commands/spec-bootstrap.js +147 -0
- package/lib/commands/spec-gate.js +157 -0
- package/lib/commands/spec-pipeline.js +205 -0
- package/lib/commands/status.js +321 -0
- package/lib/commands/task.js +199 -0
- package/lib/commands/templates.js +654 -0
- package/lib/commands/upgrade.js +231 -0
- package/lib/commands/value.js +569 -0
- package/lib/commands/watch.js +684 -0
- package/lib/commands/workflows.js +240 -0
- package/lib/commands/workspace-multi.js +325 -0
- package/lib/commands/workspace.js +189 -0
- package/lib/context/context-exporter.js +378 -0
- package/lib/context/prompt-generator.js +482 -0
- package/lib/data/moqui-capability-lexicon.json +45 -0
- package/lib/environment/backup-system.js +189 -0
- package/lib/environment/environment-manager.js +379 -0
- package/lib/environment/environment-registry.js +168 -0
- package/lib/gitignore/gitignore-backup.js +229 -0
- package/lib/gitignore/gitignore-detector.js +239 -0
- package/lib/gitignore/gitignore-integration.js +267 -0
- package/lib/gitignore/gitignore-transformer.js +193 -0
- package/lib/gitignore/layered-rules-template.js +42 -0
- package/lib/governance/archive-tool.js +284 -0
- package/lib/governance/cleanup-tool.js +237 -0
- package/lib/governance/config-manager.js +186 -0
- package/lib/governance/diagnostic-engine.js +271 -0
- package/lib/governance/doc-reference-checker.js +200 -0
- package/lib/governance/execution-logger.js +243 -0
- package/lib/governance/file-scanner.js +285 -0
- package/lib/governance/hooks-manager.js +333 -0
- package/lib/governance/reporter.js +337 -0
- package/lib/governance/validation-engine.js +181 -0
- package/lib/i18n.js +79 -0
- package/lib/knowledge/entry-manager.js +208 -0
- package/lib/knowledge/index-manager.js +261 -0
- package/lib/knowledge/knowledge-manager.js +273 -0
- package/lib/knowledge/template-manager.js +191 -0
- package/lib/lock/index.js +21 -0
- package/lib/lock/lock-file.js +192 -0
- package/lib/lock/lock-manager.js +321 -0
- package/lib/lock/machine-identifier.js +135 -0
- package/lib/lock/steering-file-lock.js +207 -0
- package/lib/lock/task-lock-manager.js +345 -0
- package/lib/operations/audit-logger.js +293 -0
- package/lib/operations/feedback-manager.js +1147 -0
- package/lib/operations/index.js +23 -0
- package/lib/operations/models/index.js +170 -0
- package/lib/operations/operations-manager.js +151 -0
- package/lib/operations/operations-validator.js +280 -0
- package/lib/operations/permission-manager.js +354 -0
- package/lib/operations/template-loader.js +143 -0
- package/lib/orchestrator/agent-spawner.js +629 -0
- package/lib/orchestrator/bootstrap-prompt-builder.js +236 -0
- package/lib/orchestrator/index.js +19 -0
- package/lib/orchestrator/orchestration-engine.js +1270 -0
- package/lib/orchestrator/orchestrator-config.js +173 -0
- package/lib/orchestrator/status-monitor.js +591 -0
- package/lib/python-checker.js +209 -0
- package/lib/repo/config-manager.js +580 -0
- package/lib/repo/errors/config-error.js +13 -0
- package/lib/repo/errors/git-error.js +15 -0
- package/lib/repo/errors/repo-error.js +14 -0
- package/lib/repo/git-operations.js +181 -0
- package/lib/repo/handlers/.gitkeep +1 -0
- package/lib/repo/handlers/exec-handler.js +155 -0
- package/lib/repo/handlers/health-handler.js +169 -0
- package/lib/repo/handlers/init-handler.js +197 -0
- package/lib/repo/handlers/status-handler.js +176 -0
- package/lib/repo/output-formatter.js +184 -0
- package/lib/repo/path-resolver.js +178 -0
- package/lib/repo/repo-manager.js +514 -0
- package/lib/scene-runtime/audit-emitter.js +59 -0
- package/lib/scene-runtime/binding-plugin-loader.js +351 -0
- package/lib/scene-runtime/binding-registry.js +349 -0
- package/lib/scene-runtime/eval-bridge.js +44 -0
- package/lib/scene-runtime/index.js +19 -0
- package/lib/scene-runtime/moqui-adapter.js +620 -0
- package/lib/scene-runtime/moqui-client.js +606 -0
- package/lib/scene-runtime/moqui-extractor.js +2029 -0
- package/lib/scene-runtime/plan-compiler.js +208 -0
- package/lib/scene-runtime/policy-gate.js +58 -0
- package/lib/scene-runtime/runtime-executor.js +358 -0
- package/lib/scene-runtime/scene-loader.js +96 -0
- package/lib/scene-runtime/scene-ontology.js +959 -0
- package/lib/scene-runtime/scene-template-linter.js +852 -0
- package/lib/scene-runtime/templates/scene-template-erp-query-v0.1.yaml +28 -0
- package/lib/scene-runtime/templates/scene-template-hybrid-shadow-v0.1.yaml +34 -0
- package/lib/spec/bootstrap/context-collector.js +48 -0
- package/lib/spec/bootstrap/draft-generator.js +158 -0
- package/lib/spec/bootstrap/questionnaire-engine.js +70 -0
- package/lib/spec/bootstrap/trace-emitter.js +59 -0
- package/lib/spec/multi-spec-orchestrate.js +93 -0
- package/lib/spec/pipeline/constants.js +6 -0
- package/lib/spec/pipeline/stage-adapters.js +118 -0
- package/lib/spec/pipeline/stage-runner.js +146 -0
- package/lib/spec/pipeline/state-store.js +119 -0
- package/lib/spec-gate/engine/gate-engine.js +165 -0
- package/lib/spec-gate/policy/default-policy.js +22 -0
- package/lib/spec-gate/policy/policy-loader.js +103 -0
- package/lib/spec-gate/result-emitter.js +81 -0
- package/lib/spec-gate/rules/default-rules.js +156 -0
- package/lib/spec-gate/rules/rule-registry.js +51 -0
- package/lib/steering/adoption-config.js +164 -0
- package/lib/steering/compliance-auto-fixer.js +204 -0
- package/lib/steering/compliance-cache.js +99 -0
- package/lib/steering/compliance-error-reporter.js +70 -0
- package/lib/steering/context-sync-manager.js +273 -0
- package/lib/steering/index.js +92 -0
- package/lib/steering/spec-steering.js +230 -0
- package/lib/steering/steering-compliance-checker.js +73 -0
- package/lib/steering/steering-loader.js +144 -0
- package/lib/steering/steering-manager.js +289 -0
- package/lib/task/index.js +12 -0
- package/lib/task/task-claimer.js +489 -0
- package/lib/task/task-status-store.js +418 -0
- package/lib/templates/cache-manager.js +440 -0
- package/lib/templates/content-generalizer.js +247 -0
- package/lib/templates/frontmatter-generator.js +128 -0
- package/lib/templates/git-handler.js +471 -0
- package/lib/templates/metadata-collector.js +328 -0
- package/lib/templates/path-utils.js +144 -0
- package/lib/templates/registry-parser.js +505 -0
- package/lib/templates/spec-reader.js +216 -0
- package/lib/templates/template-applicator.js +249 -0
- package/lib/templates/template-creator.js +256 -0
- package/lib/templates/template-error.js +143 -0
- package/lib/templates/template-exporter.js +502 -0
- package/lib/templates/template-manager.js +782 -0
- package/lib/templates/template-validator.js +361 -0
- package/lib/upgrade/migration-engine.js +382 -0
- package/lib/upgrade/migrations/.gitkeep +52 -0
- package/lib/upgrade/migrations/1.0.0-to-1.1.0.js +78 -0
- package/lib/utils/file-diff.js +177 -0
- package/lib/utils/fs-utils.js +274 -0
- package/lib/utils/tool-detector.js +383 -0
- package/lib/utils/validation.js +324 -0
- package/lib/value/gate-summary-emitter.js +99 -0
- package/lib/value/metric-contract-loader.js +210 -0
- package/lib/value/risk-evaluator.js +117 -0
- package/lib/value/weekly-snapshot-builder.js +61 -0
- package/lib/version/version-checker.js +156 -0
- package/lib/version/version-manager.js +327 -0
- package/lib/watch/action-executor.js +458 -0
- package/lib/watch/event-debouncer.js +323 -0
- package/lib/watch/execution-logger.js +550 -0
- package/lib/watch/file-watcher.js +499 -0
- package/lib/watch/presets.js +266 -0
- package/lib/watch/watch-manager.js +533 -0
- package/lib/workspace/multi/global-config.js +150 -0
- package/lib/workspace/multi/index.js +22 -0
- package/lib/workspace/multi/path-utils.js +173 -0
- package/lib/workspace/multi/workspace-context-resolver.js +244 -0
- package/lib/workspace/multi/workspace-registry.js +196 -0
- package/lib/workspace/multi/workspace-state-manager.js +537 -0
- package/lib/workspace/multi/workspace.js +90 -0
- package/lib/workspace/workspace-manager.js +370 -0
- package/lib/workspace/workspace-sync.js +356 -0
- package/locales/en.json +114 -0
- package/locales/zh.json +114 -0
- package/package.json +102 -0
- package/template/.kiro/README.md +247 -0
- package/template/.kiro/hooks/check-spec-on-create.kiro.hook +17 -0
- package/template/.kiro/hooks/run-tests-on-save.kiro.hook +13 -0
- package/template/.kiro/hooks/sync-tasks-on-edit.kiro.hook +16 -0
- package/template/.kiro/specs/SPEC_WORKFLOW_GUIDE.md +134 -0
- package/template/.kiro/steering/CORE_PRINCIPLES.md +133 -0
- package/template/.kiro/steering/CURRENT_CONTEXT.md +30 -0
- package/template/.kiro/steering/ENVIRONMENT.md +35 -0
- package/template/.kiro/steering/RULES_GUIDE.md +46 -0
- package/template/.kiro/templates/operations/default/change-impact.md +112 -0
- package/template/.kiro/templates/operations/default/deployment.md +91 -0
- package/template/.kiro/templates/operations/default/feedback-response.md +269 -0
- package/template/.kiro/templates/operations/default/migration-plan.md +172 -0
- package/template/.kiro/templates/operations/default/monitoring.md +135 -0
- package/template/.kiro/templates/operations/default/operations.md +135 -0
- package/template/.kiro/templates/operations/default/rollback.md +143 -0
- package/template/.kiro/templates/operations/default/tools.yaml +364 -0
- package/template/.kiro/templates/operations/default/troubleshooting.md +123 -0
- package/template/.kiro/tools/backup_manager.py +295 -0
- package/template/.kiro/tools/configuration_manager.py +218 -0
- package/template/.kiro/tools/document_evaluator.py +550 -0
- package/template/.kiro/tools/enhancement_logger.py +168 -0
- package/template/.kiro/tools/error_handler.py +335 -0
- package/template/.kiro/tools/improvement_identifier.py +444 -0
- package/template/.kiro/tools/modification_applicator.py +737 -0
- package/template/.kiro/tools/quality_gate_enforcer.py +207 -0
- package/template/.kiro/tools/quality_scorer.py +305 -0
- package/template/.kiro/tools/report_generator.py +154 -0
- package/template/.kiro/tools/ultrawork_enhancer.py +676 -0
- package/template/.kiro/tools/ultrawork_enhancer_refactored.py +0 -0
- package/template/.kiro/tools/ultrawork_enhancer_v2.py +463 -0
- package/template/.kiro/tools/ultrawork_enhancer_v3.py +606 -0
- package/template/.kiro/tools/workflow_quality_gate.py +100 -0
- package/template/README.md +111 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
apiVersion: kse.scene/v0.2
|
|
2
|
+
kind: scene
|
|
3
|
+
metadata:
|
|
4
|
+
obj_id: scene.template.erp-order-query
|
|
5
|
+
obj_version: 0.2.0
|
|
6
|
+
title: ERP Order Query Template
|
|
7
|
+
spec:
|
|
8
|
+
domain: erp
|
|
9
|
+
intent:
|
|
10
|
+
goal: Query order detail and return normalized response
|
|
11
|
+
model_scope:
|
|
12
|
+
read:
|
|
13
|
+
- moqui.OrderHeader.orderId
|
|
14
|
+
- moqui.OrderHeader.statusId
|
|
15
|
+
write: []
|
|
16
|
+
capability_contract:
|
|
17
|
+
bindings:
|
|
18
|
+
- type: query
|
|
19
|
+
ref: spec.erp.order-query-service
|
|
20
|
+
timeout_ms: 2000
|
|
21
|
+
retry: 0
|
|
22
|
+
governance_contract:
|
|
23
|
+
risk_level: low
|
|
24
|
+
approval:
|
|
25
|
+
required: false
|
|
26
|
+
idempotency:
|
|
27
|
+
required: true
|
|
28
|
+
key: orderId
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
apiVersion: kse.scene/v0.2
|
|
2
|
+
kind: scene
|
|
3
|
+
metadata:
|
|
4
|
+
obj_id: scene.template.hybrid-pick-shadow
|
|
5
|
+
obj_version: 0.2.0
|
|
6
|
+
title: Hybrid Pick Shadow Template
|
|
7
|
+
spec:
|
|
8
|
+
domain: hybrid
|
|
9
|
+
intent:
|
|
10
|
+
goal: Simulate ERP reserve and robot mission dispatch in dry_run
|
|
11
|
+
model_scope:
|
|
12
|
+
read:
|
|
13
|
+
- moqui.OrderHeader.orderId
|
|
14
|
+
write:
|
|
15
|
+
- moqui.OrderItem.statusId
|
|
16
|
+
capability_contract:
|
|
17
|
+
bindings:
|
|
18
|
+
- type: service
|
|
19
|
+
ref: spec.erp.reserve-pick-items
|
|
20
|
+
side_effect: true
|
|
21
|
+
timeout_ms: 3000
|
|
22
|
+
retry: 0
|
|
23
|
+
- type: adapter
|
|
24
|
+
ref: spec.robot.dispatch-pick-mission
|
|
25
|
+
side_effect: true
|
|
26
|
+
timeout_ms: 6000
|
|
27
|
+
retry: 0
|
|
28
|
+
governance_contract:
|
|
29
|
+
risk_level: high
|
|
30
|
+
approval:
|
|
31
|
+
required: true
|
|
32
|
+
idempotency:
|
|
33
|
+
required: true
|
|
34
|
+
key: orderId
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
class ContextCollector {
|
|
5
|
+
constructor(projectPath = process.cwd()) {
|
|
6
|
+
this.projectPath = projectPath;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
async collect() {
|
|
10
|
+
const kiroDir = path.join(this.projectPath, '.kiro');
|
|
11
|
+
const specsDir = path.join(kiroDir, 'specs');
|
|
12
|
+
const hasKiro = await fs.pathExists(kiroDir);
|
|
13
|
+
const existingSpecs = await this._listSpecs(specsDir);
|
|
14
|
+
|
|
15
|
+
return {
|
|
16
|
+
projectPath: this.projectPath,
|
|
17
|
+
hasKiro,
|
|
18
|
+
specsDir,
|
|
19
|
+
existingSpecs,
|
|
20
|
+
totalSpecs: existingSpecs.length,
|
|
21
|
+
preferredLanguage: this._detectLanguagePreference()
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async _listSpecs(specsDir) {
|
|
26
|
+
if (!await fs.pathExists(specsDir)) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const entries = await fs.readdir(specsDir, { withFileTypes: true });
|
|
31
|
+
return entries
|
|
32
|
+
.filter(entry => entry.isDirectory())
|
|
33
|
+
.map(entry => entry.name)
|
|
34
|
+
.sort((left, right) => left.localeCompare(right));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
_detectLanguagePreference() {
|
|
38
|
+
const lang = `${process.env.KSE_LANG || process.env.LANG || ''}`.toLowerCase();
|
|
39
|
+
if (lang.includes('zh')) {
|
|
40
|
+
return 'zh';
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return 'en';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
module.exports = { ContextCollector };
|
|
48
|
+
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
class DraftGenerator {
|
|
2
|
+
generate(input = {}) {
|
|
3
|
+
const specName = input.specName;
|
|
4
|
+
const profile = input.profile || 'general';
|
|
5
|
+
const template = input.template || 'default';
|
|
6
|
+
const context = input.context || {};
|
|
7
|
+
const answers = input.answers || {};
|
|
8
|
+
|
|
9
|
+
const requirementIds = ['Requirement 1', 'Requirement 2', 'Requirement 3'];
|
|
10
|
+
const designIds = ['Design 1', 'Design 2', 'Design 3'];
|
|
11
|
+
|
|
12
|
+
const requirements = this._buildRequirements(specName, profile, template, answers);
|
|
13
|
+
const design = this._buildDesign(specName, profile, template, requirementIds, designIds, answers);
|
|
14
|
+
const tasks = this._buildTasks(requirementIds, designIds);
|
|
15
|
+
|
|
16
|
+
return {
|
|
17
|
+
requirements,
|
|
18
|
+
design,
|
|
19
|
+
tasks,
|
|
20
|
+
metadata: {
|
|
21
|
+
profile,
|
|
22
|
+
template,
|
|
23
|
+
projectPath: context.projectPath,
|
|
24
|
+
preferredLanguage: context.preferredLanguage || 'en',
|
|
25
|
+
existingSpecCount: context.totalSpecs || 0,
|
|
26
|
+
mapping: {
|
|
27
|
+
requirements: requirementIds,
|
|
28
|
+
design: designIds,
|
|
29
|
+
taskCount: 6
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
_buildRequirements(specName, profile, template, answers) {
|
|
36
|
+
return `# Requirements Document
|
|
37
|
+
|
|
38
|
+
## Introduction
|
|
39
|
+
|
|
40
|
+
This Spec bootstrap draft was generated for ${specName} with profile ${profile} and template hint ${template}.
|
|
41
|
+
|
|
42
|
+
## Context Snapshot
|
|
43
|
+
|
|
44
|
+
- Problem statement: ${answers.problemStatement}
|
|
45
|
+
- Primary flow: ${answers.primaryFlow}
|
|
46
|
+
- Verification plan: ${answers.verificationPlan}
|
|
47
|
+
|
|
48
|
+
## Requirements
|
|
49
|
+
|
|
50
|
+
### Requirement 1: Establish command entry
|
|
51
|
+
|
|
52
|
+
**User Story:** As a user, I want one command to initialize a complete Spec draft.
|
|
53
|
+
|
|
54
|
+
#### Acceptance Criteria
|
|
55
|
+
|
|
56
|
+
1. THE CLI SHALL expose an entry command for bootstrap generation
|
|
57
|
+
2. THE command SHALL support explicit naming and non-interactive execution
|
|
58
|
+
|
|
59
|
+
### Requirement 2: Collect minimum context
|
|
60
|
+
|
|
61
|
+
**User Story:** As an implementer, I want the wizard to use project context with a controlled question set.
|
|
62
|
+
|
|
63
|
+
#### Acceptance Criteria
|
|
64
|
+
|
|
65
|
+
1. THE SYSTEM SHALL collect project metadata and existing Spec inventory
|
|
66
|
+
2. THE wizard SHALL keep the questionnaire small and default-driven
|
|
67
|
+
3. WHEN non-interactive mode is enabled THEN generation SHALL rely on arguments and defaults only
|
|
68
|
+
|
|
69
|
+
### Requirement 3: Generate traceable draft docs
|
|
70
|
+
|
|
71
|
+
**User Story:** As a team member, I want requirements/design/tasks to stay mapped and auditable.
|
|
72
|
+
|
|
73
|
+
#### Acceptance Criteria
|
|
74
|
+
|
|
75
|
+
1. THE SYSTEM SHALL output requirements.md, design.md, and tasks.md together
|
|
76
|
+
2. THE output SHALL contain requirement-design-task mapping references
|
|
77
|
+
3. THE output SHALL capture generation trace information for governance and audit
|
|
78
|
+
`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
_buildDesign(specName, profile, template, requirementIds, designIds, answers) {
|
|
82
|
+
return `# Design Document
|
|
83
|
+
|
|
84
|
+
## Overview
|
|
85
|
+
|
|
86
|
+
This design document defines the bootstrap generation flow for ${specName}.
|
|
87
|
+
|
|
88
|
+
- Profile: ${profile}
|
|
89
|
+
- Template hint: ${template}
|
|
90
|
+
|
|
91
|
+
## Requirement Mapping
|
|
92
|
+
|
|
93
|
+
| Requirement | Design Component | Notes |
|
|
94
|
+
| --- | --- | --- |
|
|
95
|
+
| ${requirementIds[0]} | ${designIds[0]} | CLI entry and argument handling |
|
|
96
|
+
| ${requirementIds[1]} | ${designIds[1]} | Context collector and questionnaire |
|
|
97
|
+
| ${requirementIds[2]} | ${designIds[2]} | Draft generation and trace output |
|
|
98
|
+
|
|
99
|
+
## Design Components
|
|
100
|
+
|
|
101
|
+
### Design 1: Bootstrap command orchestration
|
|
102
|
+
|
|
103
|
+
- Parse name/template/profile/non-interactive/dry-run/json options
|
|
104
|
+
- Handle write mode and dry-run preview mode consistently
|
|
105
|
+
|
|
106
|
+
### Design 2: Context and prompt pipeline
|
|
107
|
+
|
|
108
|
+
- Collect project metadata and existing Spec list
|
|
109
|
+
- Keep questionnaire minimal with defaults
|
|
110
|
+
- Input guidance: ${answers.primaryFlow}
|
|
111
|
+
|
|
112
|
+
### Design 3: Draft and trace emitter
|
|
113
|
+
|
|
114
|
+
- Generate linked requirements/design/tasks content
|
|
115
|
+
- Emit trace metadata (template, profile, key parameters)
|
|
116
|
+
- Validation guidance: ${answers.verificationPlan}
|
|
117
|
+
`;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
_buildTasks(requirementIds, designIds) {
|
|
121
|
+
return `# Implementation Tasks
|
|
122
|
+
|
|
123
|
+
## Task List
|
|
124
|
+
|
|
125
|
+
- [ ] 1. Implement command entry and option parsing
|
|
126
|
+
- **Requirement**: ${requirementIds[0]}
|
|
127
|
+
- **Design**: ${designIds[0]}
|
|
128
|
+
- **Validation**: Acceptance Criteria 1.1, 1.2
|
|
129
|
+
|
|
130
|
+
- [ ] 2. Implement dry-run and write-mode behavior
|
|
131
|
+
- **Requirement**: ${requirementIds[0]}
|
|
132
|
+
- **Design**: ${designIds[0]}
|
|
133
|
+
- **Validation**: Acceptance Criteria 1.1
|
|
134
|
+
|
|
135
|
+
- [ ] 3. Implement context collector
|
|
136
|
+
- **Requirement**: ${requirementIds[1]}
|
|
137
|
+
- **Design**: ${designIds[1]}
|
|
138
|
+
- **Validation**: Acceptance Criteria 2.1
|
|
139
|
+
|
|
140
|
+
- [ ] 4. Implement minimal questionnaire with defaults
|
|
141
|
+
- **Requirement**: ${requirementIds[1]}
|
|
142
|
+
- **Design**: ${designIds[1]}
|
|
143
|
+
- **Validation**: Acceptance Criteria 2.2, 2.3
|
|
144
|
+
|
|
145
|
+
- [ ] 5. Implement linked document generation
|
|
146
|
+
- **Requirement**: ${requirementIds[2]}
|
|
147
|
+
- **Design**: ${designIds[2]}
|
|
148
|
+
- **Validation**: Acceptance Criteria 3.1, 3.2
|
|
149
|
+
|
|
150
|
+
- [ ] 6. Implement trace output and JSON mode
|
|
151
|
+
- **Requirement**: ${requirementIds[2]}
|
|
152
|
+
- **Design**: ${designIds[2]}
|
|
153
|
+
- **Validation**: Acceptance Criteria 3.3
|
|
154
|
+
`;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
module.exports = { DraftGenerator };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
const inquirer = require('inquirer');
|
|
2
|
+
|
|
3
|
+
const DEFAULT_ANSWERS = {
|
|
4
|
+
problemStatement: 'Define the feature scope and the expected business outcome.',
|
|
5
|
+
primaryFlow: 'Capture user flow, data flow, and observable outputs.',
|
|
6
|
+
verificationPlan: 'Define verification checks and acceptance coverage.'
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
class QuestionnaireEngine {
|
|
10
|
+
constructor(options = {}) {
|
|
11
|
+
this.maxQuestions = options.maxQuestions || 3;
|
|
12
|
+
this.prompt = options.prompt || inquirer.prompt;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async collect(options = {}) {
|
|
16
|
+
const defaults = this._buildDefaults(options);
|
|
17
|
+
|
|
18
|
+
if (options.nonInteractive) {
|
|
19
|
+
return defaults;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const questions = [
|
|
23
|
+
{
|
|
24
|
+
type: 'input',
|
|
25
|
+
name: 'specName',
|
|
26
|
+
message: 'Spec name (for example: 112-00-feature-name):',
|
|
27
|
+
default: defaults.specName,
|
|
28
|
+
validate: input => input && input.trim() ? true : 'Spec name is required'
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
type: 'input',
|
|
32
|
+
name: 'problemStatement',
|
|
33
|
+
message: 'What problem should this Spec solve?',
|
|
34
|
+
default: defaults.problemStatement
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
type: 'input',
|
|
38
|
+
name: 'primaryFlow',
|
|
39
|
+
message: 'What is the primary implementation flow?',
|
|
40
|
+
default: defaults.primaryFlow
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
type: 'input',
|
|
44
|
+
name: 'verificationPlan',
|
|
45
|
+
message: 'How should this Spec be validated?',
|
|
46
|
+
default: defaults.verificationPlan
|
|
47
|
+
}
|
|
48
|
+
].slice(0, this.maxQuestions + 1);
|
|
49
|
+
|
|
50
|
+
const answers = await this.prompt(questions);
|
|
51
|
+
return {
|
|
52
|
+
...defaults,
|
|
53
|
+
...answers,
|
|
54
|
+
questionCount: questions.length
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
_buildDefaults(options = {}) {
|
|
59
|
+
return {
|
|
60
|
+
specName: options.specName || '',
|
|
61
|
+
problemStatement: options.problemStatement || DEFAULT_ANSWERS.problemStatement,
|
|
62
|
+
primaryFlow: options.primaryFlow || DEFAULT_ANSWERS.primaryFlow,
|
|
63
|
+
verificationPlan: options.verificationPlan || DEFAULT_ANSWERS.verificationPlan,
|
|
64
|
+
questionCount: 0
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
module.exports = { QuestionnaireEngine, DEFAULT_ANSWERS };
|
|
70
|
+
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const chalk = require('chalk');
|
|
2
|
+
|
|
3
|
+
class TraceEmitter {
|
|
4
|
+
emit(result, options = {}) {
|
|
5
|
+
if (options.json) {
|
|
6
|
+
console.log(JSON.stringify(result, null, 2));
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
console.log(chalk.red('🔥') + ' Spec Bootstrap Wizard');
|
|
11
|
+
console.log();
|
|
12
|
+
console.log(`${chalk.gray('Spec:')} ${result.specName}`);
|
|
13
|
+
console.log(`${chalk.gray('Mode:')} ${result.dryRun ? 'dry-run' : 'write'}`);
|
|
14
|
+
console.log(`${chalk.gray('Template:')} ${result.trace.template}`);
|
|
15
|
+
console.log(`${chalk.gray('Profile:')} ${result.trace.profile}`);
|
|
16
|
+
console.log();
|
|
17
|
+
|
|
18
|
+
if (result.dryRun) {
|
|
19
|
+
console.log(chalk.yellow('âš Dry-run mode: no files were written.'));
|
|
20
|
+
console.log();
|
|
21
|
+
this._printPreview(result.preview || {});
|
|
22
|
+
} else {
|
|
23
|
+
console.log(chalk.green('✅ Draft files generated:'));
|
|
24
|
+
Object.values(result.files || {}).forEach(filePath => {
|
|
25
|
+
console.log(` - ${filePath}`);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
console.log();
|
|
30
|
+
console.log(chalk.blue('📌 Trace Summary'));
|
|
31
|
+
console.log(` - existing specs: ${result.trace.context.totalSpecs}`);
|
|
32
|
+
console.log(` - preferred language: ${result.trace.context.preferredLanguage}`);
|
|
33
|
+
console.log(` - non-interactive: ${result.trace.parameters.nonInteractive}`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
_printPreview(preview) {
|
|
37
|
+
const sections = ['requirements', 'design', 'tasks'];
|
|
38
|
+
|
|
39
|
+
sections.forEach(section => {
|
|
40
|
+
const content = preview[section];
|
|
41
|
+
if (!content) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const lines = content
|
|
46
|
+
.split(/\r?\n/)
|
|
47
|
+
.filter(Boolean)
|
|
48
|
+
.slice(0, 5);
|
|
49
|
+
|
|
50
|
+
console.log(chalk.cyan(`--- ${section}.md preview ---`));
|
|
51
|
+
lines.forEach(line => console.log(` ${line}`));
|
|
52
|
+
console.log(' ...');
|
|
53
|
+
console.log();
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
module.exports = { TraceEmitter };
|
|
59
|
+
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const chalk = require('chalk');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Parse --spec / --specs options into a de-duplicated list.
|
|
7
|
+
*
|
|
8
|
+
* @param {object} options
|
|
9
|
+
* @returns {string[]}
|
|
10
|
+
*/
|
|
11
|
+
function parseSpecTargets(options = {}) {
|
|
12
|
+
const fromSpec = (options.spec || '').trim();
|
|
13
|
+
const fromSpecs = `${options.specs || ''}`
|
|
14
|
+
.split(',')
|
|
15
|
+
.map(item => item.trim())
|
|
16
|
+
.filter(Boolean);
|
|
17
|
+
|
|
18
|
+
const merged = [];
|
|
19
|
+
if (fromSpec) {
|
|
20
|
+
merged.push(fromSpec);
|
|
21
|
+
}
|
|
22
|
+
merged.push(...fromSpecs);
|
|
23
|
+
|
|
24
|
+
return Array.from(new Set(merged));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Execute multi-spec work through orchestrate mode.
|
|
29
|
+
*
|
|
30
|
+
* @param {object} options
|
|
31
|
+
* @param {string[]} options.specTargets
|
|
32
|
+
* @param {string} options.projectPath
|
|
33
|
+
* @param {object} options.commandOptions
|
|
34
|
+
* @param {Function} options.runOrchestration
|
|
35
|
+
* @param {string} options.commandLabel
|
|
36
|
+
* @param {string} options.nextActionLabel
|
|
37
|
+
* @returns {Promise<object>}
|
|
38
|
+
*/
|
|
39
|
+
async function runMultiSpecViaOrchestrate(options = {}) {
|
|
40
|
+
const {
|
|
41
|
+
specTargets,
|
|
42
|
+
projectPath,
|
|
43
|
+
commandOptions,
|
|
44
|
+
runOrchestration,
|
|
45
|
+
commandLabel,
|
|
46
|
+
nextActionLabel
|
|
47
|
+
} = options;
|
|
48
|
+
|
|
49
|
+
const orchestrationResult = await runOrchestration({
|
|
50
|
+
specs: specTargets.join(','),
|
|
51
|
+
maxParallel: commandOptions.maxParallel,
|
|
52
|
+
json: false,
|
|
53
|
+
silent: true
|
|
54
|
+
}, {
|
|
55
|
+
workspaceRoot: projectPath
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const result = {
|
|
59
|
+
mode: 'orchestrate',
|
|
60
|
+
spec_ids: specTargets,
|
|
61
|
+
status: orchestrationResult.status,
|
|
62
|
+
orchestrate_result: orchestrationResult,
|
|
63
|
+
next_actions: [
|
|
64
|
+
nextActionLabel,
|
|
65
|
+
'Use kse orchestrate status to inspect live orchestration state.'
|
|
66
|
+
]
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
if (commandOptions.out) {
|
|
70
|
+
const outPath = path.isAbsolute(commandOptions.out)
|
|
71
|
+
? commandOptions.out
|
|
72
|
+
: path.join(projectPath, commandOptions.out);
|
|
73
|
+
await fs.ensureDir(path.dirname(outPath));
|
|
74
|
+
await fs.writeJson(outPath, result, { spaces: 2 });
|
|
75
|
+
result.output_file = outPath;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (commandOptions.json) {
|
|
79
|
+
console.log(JSON.stringify(result, null, 2));
|
|
80
|
+
} else {
|
|
81
|
+
console.log(chalk.blue('🚀') + ` ${commandLabel} defaulted to orchestrate mode for ${specTargets.length} specs.`);
|
|
82
|
+
console.log(chalk.gray(` Specs: ${specTargets.join(', ')}`));
|
|
83
|
+
console.log(chalk.gray(` Status: ${orchestrationResult.status}`));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
module.exports = {
|
|
90
|
+
parseSpecTargets,
|
|
91
|
+
runMultiSpecViaOrchestrate
|
|
92
|
+
};
|
|
93
|
+
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const { runSpecBootstrap } = require('../../commands/spec-bootstrap');
|
|
4
|
+
const { runSpecGate } = require('../../commands/spec-gate');
|
|
5
|
+
|
|
6
|
+
function createDefaultStageAdapters(projectPath = process.cwd()) {
|
|
7
|
+
return {
|
|
8
|
+
requirements: async context => {
|
|
9
|
+
const specDir = path.join(projectPath, '.kiro', 'specs', context.specId);
|
|
10
|
+
const requirementsPath = path.join(specDir, 'requirements.md');
|
|
11
|
+
|
|
12
|
+
if (!await fs.pathExists(requirementsPath)) {
|
|
13
|
+
await runSpecBootstrap({
|
|
14
|
+
name: context.specId,
|
|
15
|
+
nonInteractive: true,
|
|
16
|
+
profile: 'pipeline',
|
|
17
|
+
dryRun: false,
|
|
18
|
+
json: false
|
|
19
|
+
}, {
|
|
20
|
+
projectPath
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
success: true,
|
|
25
|
+
details: {
|
|
26
|
+
action: 'bootstrap-generated'
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
success: true,
|
|
33
|
+
details: {
|
|
34
|
+
action: 'requirements-existing'
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
design: async context => {
|
|
40
|
+
const designPath = path.join(projectPath, '.kiro', 'specs', context.specId, 'design.md');
|
|
41
|
+
const exists = await fs.pathExists(designPath);
|
|
42
|
+
|
|
43
|
+
if (!exists) {
|
|
44
|
+
await runSpecBootstrap({
|
|
45
|
+
name: context.specId,
|
|
46
|
+
nonInteractive: true,
|
|
47
|
+
profile: 'pipeline',
|
|
48
|
+
dryRun: false,
|
|
49
|
+
json: false
|
|
50
|
+
}, {
|
|
51
|
+
projectPath
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
success: true,
|
|
57
|
+
warnings: exists ? [] : ['design.md was created from bootstrap defaults'],
|
|
58
|
+
details: {
|
|
59
|
+
action: exists ? 'design-existing' : 'design-generated'
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
tasks: async context => {
|
|
65
|
+
const tasksPath = path.join(projectPath, '.kiro', 'specs', context.specId, 'tasks.md');
|
|
66
|
+
const exists = await fs.pathExists(tasksPath);
|
|
67
|
+
|
|
68
|
+
if (!exists) {
|
|
69
|
+
await runSpecBootstrap({
|
|
70
|
+
name: context.specId,
|
|
71
|
+
nonInteractive: true,
|
|
72
|
+
profile: 'pipeline',
|
|
73
|
+
dryRun: false,
|
|
74
|
+
json: false
|
|
75
|
+
}, {
|
|
76
|
+
projectPath
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
success: true,
|
|
82
|
+
warnings: exists ? [] : ['tasks.md was created from bootstrap defaults'],
|
|
83
|
+
details: {
|
|
84
|
+
action: exists ? 'tasks-existing' : 'tasks-generated'
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
gate: async context => {
|
|
90
|
+
const gateResult = await runSpecGate({
|
|
91
|
+
spec: context.specId,
|
|
92
|
+
json: false,
|
|
93
|
+
strict: !!context.strict,
|
|
94
|
+
out: context.gateOut,
|
|
95
|
+
silent: true
|
|
96
|
+
}, {
|
|
97
|
+
projectPath
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
const success = gateResult.decision === 'go' || gateResult.decision === 'conditional-go';
|
|
101
|
+
|
|
102
|
+
return {
|
|
103
|
+
success,
|
|
104
|
+
warnings: gateResult.warnings ? gateResult.warnings.map(item => item.message) : [],
|
|
105
|
+
details: {
|
|
106
|
+
decision: gateResult.decision,
|
|
107
|
+
score: gateResult.score,
|
|
108
|
+
failed_checks: gateResult.failed_checks || []
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
module.exports = {
|
|
116
|
+
createDefaultStageAdapters
|
|
117
|
+
};
|
|
118
|
+
|