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,485 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autonomous Engine
|
|
3
|
+
* Central orchestrator for autonomous execution
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const StateManager = require('./state-manager');
|
|
7
|
+
const TaskQueueManager = require('./task-queue-manager');
|
|
8
|
+
const ErrorRecoveryManager = require('./error-recovery-manager');
|
|
9
|
+
const ProgressTracker = require('./progress-tracker');
|
|
10
|
+
const DecisionEngine = require('./decision-engine');
|
|
11
|
+
const { CheckpointManager, CHECKPOINT_TYPES } = require('./checkpoint-manager');
|
|
12
|
+
const SafetyManager = require('./safety-manager');
|
|
13
|
+
const { mergeConfigs } = require('./config-schema');
|
|
14
|
+
const path = require('path');
|
|
15
|
+
|
|
16
|
+
class AutonomousEngine {
|
|
17
|
+
constructor(specName, config = {}) {
|
|
18
|
+
this.specName = specName;
|
|
19
|
+
this.config = config;
|
|
20
|
+
|
|
21
|
+
// Initialize managers
|
|
22
|
+
this.stateManager = new StateManager(specName);
|
|
23
|
+
this.taskQueue = new TaskQueueManager();
|
|
24
|
+
this.errorRecovery = new ErrorRecoveryManager(config.errorRecovery);
|
|
25
|
+
this.progress = new ProgressTracker();
|
|
26
|
+
this.decisions = new DecisionEngine();
|
|
27
|
+
this.checkpoints = new CheckpointManager(config);
|
|
28
|
+
this.safety = new SafetyManager(config);
|
|
29
|
+
|
|
30
|
+
// State
|
|
31
|
+
this.isRunning = false;
|
|
32
|
+
this.isPaused = false;
|
|
33
|
+
this.currentTask = null;
|
|
34
|
+
|
|
35
|
+
// Set pause callback for error recovery
|
|
36
|
+
this.errorRecovery.setPauseCallback(async (data) => {
|
|
37
|
+
await this.pause();
|
|
38
|
+
await this.checkpoints.createCheckpoint(CHECKPOINT_TYPES.FATAL_ERROR, data);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Initialize engine
|
|
44
|
+
* @param {Object} options - Initialization options
|
|
45
|
+
*/
|
|
46
|
+
async initialize(options = {}) {
|
|
47
|
+
await this.stateManager.initialize();
|
|
48
|
+
await this.checkpoints.initialize();
|
|
49
|
+
|
|
50
|
+
// Verify CORE_PRINCIPLES compliance
|
|
51
|
+
await this.verifyCoreCompliance();
|
|
52
|
+
|
|
53
|
+
// Load or create state
|
|
54
|
+
const existingState = await this.stateManager.loadState();
|
|
55
|
+
if (existingState) {
|
|
56
|
+
this.state = existingState;
|
|
57
|
+
} else {
|
|
58
|
+
this.state = this.stateManager.createInitialState({ config: this.config });
|
|
59
|
+
await this.stateManager.saveState(this.state);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
await this.progress.logAction('engine-initialized', { specName: this.specName });
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Verify CORE_PRINCIPLES compliance
|
|
67
|
+
*/
|
|
68
|
+
async verifyCoreCompliance() {
|
|
69
|
+
const fs = require('fs-extra');
|
|
70
|
+
|
|
71
|
+
// Check for .kiro directory (接管标志)
|
|
72
|
+
const kiroDir = path.join(process.cwd(), '.kiro');
|
|
73
|
+
if (!await fs.pathExists(kiroDir)) {
|
|
74
|
+
throw new Error('CORE_PRINCIPLES violation: .kiro directory not found. Project not adopted by kse.');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Check for version.json
|
|
78
|
+
const versionFile = path.join(kiroDir, 'version.json');
|
|
79
|
+
if (!await fs.pathExists(versionFile)) {
|
|
80
|
+
console.warn('Warning: version.json not found. Consider running kse adoption.');
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Check for specs directory
|
|
84
|
+
const specsDir = path.join(kiroDir, 'specs');
|
|
85
|
+
if (!await fs.pathExists(specsDir)) {
|
|
86
|
+
await fs.ensureDir(specsDir);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Check for steering directory
|
|
90
|
+
const steeringDir = path.join(kiroDir, 'steering');
|
|
91
|
+
if (!await fs.pathExists(steeringDir)) {
|
|
92
|
+
console.warn('Warning: steering directory not found.');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
await this.progress.logAction('core-compliance-verified');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Start autonomous execution
|
|
100
|
+
*/
|
|
101
|
+
async start() {
|
|
102
|
+
if (this.isRunning) {
|
|
103
|
+
throw new Error('Engine is already running');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
this.isRunning = true;
|
|
107
|
+
this.isPaused = false;
|
|
108
|
+
|
|
109
|
+
this.state.status.isRunning = true;
|
|
110
|
+
this.state.status.isPaused = false;
|
|
111
|
+
await this.stateManager.saveState(this.state);
|
|
112
|
+
|
|
113
|
+
await this.progress.logAction('engine-started');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Pause execution
|
|
118
|
+
*/
|
|
119
|
+
async pause() {
|
|
120
|
+
this.isPaused = true;
|
|
121
|
+
|
|
122
|
+
this.state.status.isPaused = true;
|
|
123
|
+
await this.stateManager.saveState(this.state);
|
|
124
|
+
|
|
125
|
+
await this.progress.logAction('engine-paused');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Resume execution
|
|
130
|
+
*/
|
|
131
|
+
async resume() {
|
|
132
|
+
if (!this.isPaused) {
|
|
133
|
+
throw new Error('Engine is not paused');
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
this.isPaused = false;
|
|
137
|
+
|
|
138
|
+
this.state.status.isPaused = false;
|
|
139
|
+
await this.stateManager.saveState(this.state);
|
|
140
|
+
|
|
141
|
+
await this.progress.logAction('engine-resumed');
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Stop execution
|
|
146
|
+
*/
|
|
147
|
+
async stop() {
|
|
148
|
+
this.isRunning = false;
|
|
149
|
+
this.isPaused = false;
|
|
150
|
+
|
|
151
|
+
this.state.status.isRunning = false;
|
|
152
|
+
this.state.status.isPaused = false;
|
|
153
|
+
await this.stateManager.saveState(this.state);
|
|
154
|
+
|
|
155
|
+
await this.progress.logAction('engine-stopped');
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Execute task queue
|
|
160
|
+
*/
|
|
161
|
+
async executeTaskQueue() {
|
|
162
|
+
const tasksFile = path.join(process.cwd(), '.kiro', 'specs', this.specName, 'tasks.md');
|
|
163
|
+
await this.taskQueue.loadTasks(tasksFile);
|
|
164
|
+
|
|
165
|
+
const queueStatus = this.taskQueue.getQueueStatus();
|
|
166
|
+
this.progress.updateTaskCounts(queueStatus.completed, queueStatus.total);
|
|
167
|
+
|
|
168
|
+
await this.progress.updateProgress('implementation', 0);
|
|
169
|
+
|
|
170
|
+
while (this.taskQueue.hasRemainingTasks() && this.isRunning && !this.isPaused) {
|
|
171
|
+
const task = this.taskQueue.getNextTask();
|
|
172
|
+
|
|
173
|
+
if (!task) {
|
|
174
|
+
// No ready tasks, check if blocked
|
|
175
|
+
const blocked = this.taskQueue.getBlockedTasks();
|
|
176
|
+
if (blocked.length > 0) {
|
|
177
|
+
await this.progress.logAction('tasks-blocked', { count: blocked.length });
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
await this.executeTask(task);
|
|
184
|
+
|
|
185
|
+
// Update progress
|
|
186
|
+
const status = this.taskQueue.getQueueStatus();
|
|
187
|
+
const progress = (status.completed / status.total) * 100;
|
|
188
|
+
await this.progress.updateProgress('implementation', progress);
|
|
189
|
+
this.progress.updateTaskCounts(status.completed, status.total);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return this.progress.getExecutionLog();
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Execute single task
|
|
197
|
+
* @param {Object} task - Task to execute
|
|
198
|
+
*/
|
|
199
|
+
async executeTask(task) {
|
|
200
|
+
this.currentTask = task.id;
|
|
201
|
+
this.progress.setCurrentTask(task.id);
|
|
202
|
+
|
|
203
|
+
await this.progress.logAction('task-started', { taskId: task.id, title: task.title });
|
|
204
|
+
|
|
205
|
+
try {
|
|
206
|
+
// Check safety boundaries before execution
|
|
207
|
+
const safetyCheck = await this.safety.checkOperation('task-execution', {
|
|
208
|
+
taskId: task.id,
|
|
209
|
+
taskTitle: task.title
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
if (!safetyCheck.allowed) {
|
|
213
|
+
if (safetyCheck.requiresConfirmation) {
|
|
214
|
+
const confirmed = await this.safety.requestUserConfirmation(safetyCheck);
|
|
215
|
+
if (!confirmed) {
|
|
216
|
+
await this.progress.logAction('task-blocked-by-safety', {
|
|
217
|
+
taskId: task.id,
|
|
218
|
+
reason: safetyCheck.reason
|
|
219
|
+
});
|
|
220
|
+
this.taskQueue.markTaskFailed(task.id, new Error(safetyCheck.reason));
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
} else {
|
|
224
|
+
await this.progress.logAction('task-blocked-by-safety', {
|
|
225
|
+
taskId: task.id,
|
|
226
|
+
reason: safetyCheck.reason
|
|
227
|
+
});
|
|
228
|
+
this.taskQueue.markTaskFailed(task.id, new Error(safetyCheck.reason));
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Log operation
|
|
234
|
+
this.safety.logOperation('task-execution', { taskId: task.id }, true);
|
|
235
|
+
|
|
236
|
+
// Mark task as in progress
|
|
237
|
+
task.status = 'in-progress';
|
|
238
|
+
|
|
239
|
+
// Simulate task execution (actual implementation would execute real task)
|
|
240
|
+
// For MVP, we just mark as complete
|
|
241
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
242
|
+
|
|
243
|
+
// Mark task as complete
|
|
244
|
+
this.taskQueue.markTaskComplete(task.id);
|
|
245
|
+
|
|
246
|
+
await this.progress.logAction('task-completed', { taskId: task.id });
|
|
247
|
+
|
|
248
|
+
} catch (error) {
|
|
249
|
+
await this.handleTaskError(task, error);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Handle task error
|
|
255
|
+
* @param {Object} task - Task that failed
|
|
256
|
+
* @param {Error} error - Error object
|
|
257
|
+
*/
|
|
258
|
+
async handleTaskError(task, error) {
|
|
259
|
+
await this.progress.logError(error, { taskId: task.id });
|
|
260
|
+
|
|
261
|
+
// Attempt recovery
|
|
262
|
+
const recovery = await this.errorRecovery.attemptRecovery(error, { task });
|
|
263
|
+
|
|
264
|
+
if (recovery.success) {
|
|
265
|
+
await this.progress.logAction('error-recovered', {
|
|
266
|
+
taskId: task.id,
|
|
267
|
+
strategy: recovery.strategy
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
// Retry task
|
|
271
|
+
await this.executeTask(task);
|
|
272
|
+
} else {
|
|
273
|
+
// Mark task as failed
|
|
274
|
+
this.taskQueue.markTaskFailed(task.id, error);
|
|
275
|
+
|
|
276
|
+
await this.progress.logError(error, {
|
|
277
|
+
taskId: task.id,
|
|
278
|
+
success: false,
|
|
279
|
+
attemptNumber: recovery.attemptNumber
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
if (recovery.requiresUserIntervention) {
|
|
283
|
+
await this.pause();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Create checkpoint
|
|
290
|
+
* @param {string} type - Checkpoint type
|
|
291
|
+
* @param {Object} data - Checkpoint data
|
|
292
|
+
*/
|
|
293
|
+
async createCheckpoint(type, data = {}) {
|
|
294
|
+
const checkpoint = await this.checkpoints.createCheckpoint(type, {
|
|
295
|
+
...data,
|
|
296
|
+
phase: this.state.status.phase,
|
|
297
|
+
state: this.state
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
this.state.checkpoints.latest = checkpoint.id;
|
|
301
|
+
this.state.checkpoints.history.push(checkpoint.id);
|
|
302
|
+
await this.stateManager.saveState(this.state);
|
|
303
|
+
|
|
304
|
+
return checkpoint;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Wait for user approval at checkpoint
|
|
309
|
+
* @param {Object} checkpoint - Checkpoint object
|
|
310
|
+
*/
|
|
311
|
+
async waitForUserApproval(checkpoint) {
|
|
312
|
+
if (!checkpoint.requiresUserApproval) {
|
|
313
|
+
return true;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
await this.pause();
|
|
317
|
+
return await this.checkpoints.waitForUserInput(checkpoint);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Skip checkpoint
|
|
322
|
+
* @param {Object} checkpoint - Checkpoint object
|
|
323
|
+
*/
|
|
324
|
+
async skipCheckpoint(checkpoint) {
|
|
325
|
+
await this.progress.logAction('checkpoint-skipped', {
|
|
326
|
+
checkpointId: checkpoint.id,
|
|
327
|
+
type: checkpoint.type
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Save current state
|
|
333
|
+
*/
|
|
334
|
+
async saveState() {
|
|
335
|
+
this.state.status.lastUpdated = new Date().toISOString();
|
|
336
|
+
await this.stateManager.saveState(this.state);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Load saved state
|
|
341
|
+
*/
|
|
342
|
+
async loadState() {
|
|
343
|
+
const state = await this.stateManager.loadState();
|
|
344
|
+
if (state) {
|
|
345
|
+
this.state = state;
|
|
346
|
+
}
|
|
347
|
+
return state;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Create Spec autonomously from description
|
|
352
|
+
* @param {string} featureDescription - Feature description
|
|
353
|
+
* @returns {Object} - Creation result
|
|
354
|
+
*/
|
|
355
|
+
async createSpecAutonomously(featureDescription) {
|
|
356
|
+
await this.progress.logAction('spec-creation-started', { description: featureDescription });
|
|
357
|
+
|
|
358
|
+
const result = {
|
|
359
|
+
requirementsCreated: false,
|
|
360
|
+
designCreated: false,
|
|
361
|
+
tasksCreated: false,
|
|
362
|
+
userConfirmationsRequested: 0
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
try {
|
|
366
|
+
// Generate requirements
|
|
367
|
+
await this.generateRequirements(featureDescription);
|
|
368
|
+
result.requirementsCreated = true;
|
|
369
|
+
|
|
370
|
+
// Generate design
|
|
371
|
+
await this.generateDesign(featureDescription);
|
|
372
|
+
result.designCreated = true;
|
|
373
|
+
|
|
374
|
+
// Generate tasks
|
|
375
|
+
await this.generateTasks(featureDescription);
|
|
376
|
+
result.tasksCreated = true;
|
|
377
|
+
|
|
378
|
+
await this.progress.logAction('spec-creation-completed');
|
|
379
|
+
|
|
380
|
+
} catch (error) {
|
|
381
|
+
await this.progress.logError(error, { phase: 'spec-creation' });
|
|
382
|
+
throw error;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
return result;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Generate requirements document
|
|
390
|
+
* @param {string} featureDescription - Feature description
|
|
391
|
+
*/
|
|
392
|
+
async generateRequirements(featureDescription) {
|
|
393
|
+
await this.progress.updateProgress('requirements', 0);
|
|
394
|
+
|
|
395
|
+
// Check safety for file write
|
|
396
|
+
const reqPath = path.join(process.cwd(), '.kiro', 'specs', this.specName, 'requirements.md');
|
|
397
|
+
const safetyCheck = await this.safety.checkOperation('file-write', { filePath: reqPath });
|
|
398
|
+
|
|
399
|
+
if (!safetyCheck.allowed) {
|
|
400
|
+
throw new Error(`Safety check failed: ${safetyCheck.reason}`);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Simplified: In real implementation, this would use AI to generate requirements
|
|
404
|
+
const requirements = `# Requirements: ${featureDescription}\n\n## User Stories\n\nTBD\n`;
|
|
405
|
+
|
|
406
|
+
const fs = require('fs-extra');
|
|
407
|
+
await fs.writeFile(reqPath, requirements, 'utf-8');
|
|
408
|
+
|
|
409
|
+
this.safety.logOperation('file-write', { filePath: reqPath }, true);
|
|
410
|
+
|
|
411
|
+
await this.progress.updateProgress('requirements', 100);
|
|
412
|
+
await this.progress.logAction('requirements-generated');
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Generate design document
|
|
417
|
+
* @param {string} featureDescription - Feature description
|
|
418
|
+
*/
|
|
419
|
+
async generateDesign(featureDescription) {
|
|
420
|
+
await this.progress.updateProgress('design', 0);
|
|
421
|
+
|
|
422
|
+
// Check safety for file write
|
|
423
|
+
const designPath = path.join(process.cwd(), '.kiro', 'specs', this.specName, 'design.md');
|
|
424
|
+
const safetyCheck = await this.safety.checkOperation('file-write', { filePath: designPath });
|
|
425
|
+
|
|
426
|
+
if (!safetyCheck.allowed) {
|
|
427
|
+
throw new Error(`Safety check failed: ${safetyCheck.reason}`);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// Simplified: In real implementation, this would use AI to generate design
|
|
431
|
+
const design = `# Design: ${featureDescription}\n\n## Architecture\n\nTBD\n`;
|
|
432
|
+
|
|
433
|
+
const fs = require('fs-extra');
|
|
434
|
+
await fs.writeFile(designPath, design, 'utf-8');
|
|
435
|
+
|
|
436
|
+
this.safety.logOperation('file-write', { filePath: designPath }, true);
|
|
437
|
+
|
|
438
|
+
await this.progress.updateProgress('design', 100);
|
|
439
|
+
await this.progress.logAction('design-generated');
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Generate tasks document
|
|
444
|
+
* @param {string} featureDescription - Feature description
|
|
445
|
+
*/
|
|
446
|
+
async generateTasks(featureDescription) {
|
|
447
|
+
await this.progress.updateProgress('tasks', 0);
|
|
448
|
+
|
|
449
|
+
// Check safety for file write
|
|
450
|
+
const tasksPath = path.join(process.cwd(), '.kiro', 'specs', this.specName, 'tasks.md');
|
|
451
|
+
const safetyCheck = await this.safety.checkOperation('file-write', { filePath: tasksPath });
|
|
452
|
+
|
|
453
|
+
if (!safetyCheck.allowed) {
|
|
454
|
+
throw new Error(`Safety check failed: ${safetyCheck.reason}`);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// Simplified: In real implementation, this would use AI to generate tasks
|
|
458
|
+
const tasks = `# Tasks: ${featureDescription}\n\n- [ ] 1. Implement feature\n`;
|
|
459
|
+
|
|
460
|
+
const fs = require('fs-extra');
|
|
461
|
+
await fs.writeFile(tasksPath, tasks, 'utf-8');
|
|
462
|
+
|
|
463
|
+
this.safety.logOperation('file-write', { filePath: tasksPath }, true);
|
|
464
|
+
|
|
465
|
+
await this.progress.updateProgress('tasks', 100);
|
|
466
|
+
await this.progress.logAction('tasks-generated');
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* Get current status
|
|
471
|
+
* @returns {Object} - Status object
|
|
472
|
+
*/
|
|
473
|
+
getStatus() {
|
|
474
|
+
return {
|
|
475
|
+
specName: this.specName,
|
|
476
|
+
isRunning: this.isRunning,
|
|
477
|
+
isPaused: this.isPaused,
|
|
478
|
+
currentTask: this.currentTask,
|
|
479
|
+
progress: this.progress.getCurrentStatus(),
|
|
480
|
+
queueStatus: this.taskQueue.getQueueStatus()
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
module.exports = AutonomousEngine;
|