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,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checkpoint Manager
|
|
3
|
+
* Strategic pause points and rollback capability
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs-extra');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
const CHECKPOINT_TYPES = {
|
|
10
|
+
REQUIREMENTS_COMPLETE: 'requirements-complete',
|
|
11
|
+
DESIGN_COMPLETE: 'design-complete',
|
|
12
|
+
TASKS_COMPLETE: 'tasks-complete',
|
|
13
|
+
PHASE_COMPLETE: 'phase-complete',
|
|
14
|
+
FATAL_ERROR: 'fatal-error',
|
|
15
|
+
EXTERNAL_RESOURCE_NEEDED: 'external-resource',
|
|
16
|
+
FINAL_REVIEW: 'final-review'
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
class CheckpointManager {
|
|
20
|
+
constructor(config = {}) {
|
|
21
|
+
this.config = config;
|
|
22
|
+
this.checkpointDir = path.join(process.cwd(), '.kiro', 'auto', 'checkpoints');
|
|
23
|
+
this.checkpoints = [];
|
|
24
|
+
this.maxCheckpoints = 5;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Initialize checkpoint directory
|
|
29
|
+
*/
|
|
30
|
+
async initialize() {
|
|
31
|
+
await fs.ensureDir(this.checkpointDir);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Create checkpoint
|
|
36
|
+
* @param {string} type - Checkpoint type
|
|
37
|
+
* @param {Object} data - Checkpoint data
|
|
38
|
+
* @returns {Object} - Created checkpoint
|
|
39
|
+
*/
|
|
40
|
+
async createCheckpoint(type, data = {}) {
|
|
41
|
+
await this.initialize();
|
|
42
|
+
|
|
43
|
+
const checkpoint = {
|
|
44
|
+
id: this.generateCheckpointId(),
|
|
45
|
+
type,
|
|
46
|
+
timestamp: new Date().toISOString(),
|
|
47
|
+
phase: data.phase || 'unknown',
|
|
48
|
+
data: {
|
|
49
|
+
filesModified: data.filesModified || [],
|
|
50
|
+
tasksCompleted: data.tasksCompleted || [],
|
|
51
|
+
decisions: data.decisions || [],
|
|
52
|
+
errors: data.errors || []
|
|
53
|
+
},
|
|
54
|
+
state: data.state || {},
|
|
55
|
+
requiresUserApproval: this.shouldRequireApproval(type),
|
|
56
|
+
approved: null
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// Save checkpoint
|
|
60
|
+
const checkpointFile = path.join(this.checkpointDir, `${checkpoint.id}.json`);
|
|
61
|
+
await fs.writeJson(checkpointFile, checkpoint, { spaces: 2 });
|
|
62
|
+
|
|
63
|
+
this.checkpoints.push(checkpoint);
|
|
64
|
+
|
|
65
|
+
// Cleanup old checkpoints
|
|
66
|
+
await this.cleanupOldCheckpoints();
|
|
67
|
+
|
|
68
|
+
return checkpoint;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* List all checkpoints
|
|
73
|
+
* @returns {Array} - Checkpoints
|
|
74
|
+
*/
|
|
75
|
+
async listCheckpoints() {
|
|
76
|
+
await this.initialize();
|
|
77
|
+
|
|
78
|
+
const files = await fs.readdir(this.checkpointDir);
|
|
79
|
+
const checkpoints = [];
|
|
80
|
+
|
|
81
|
+
for (const file of files) {
|
|
82
|
+
if (file.endsWith('.json')) {
|
|
83
|
+
const checkpoint = await fs.readJson(path.join(this.checkpointDir, file));
|
|
84
|
+
checkpoints.push(checkpoint);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Sort by timestamp (newest first)
|
|
89
|
+
checkpoints.sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp));
|
|
90
|
+
|
|
91
|
+
return checkpoints;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Get checkpoint by ID
|
|
96
|
+
* @param {string} id - Checkpoint ID
|
|
97
|
+
* @returns {Object|null} - Checkpoint or null
|
|
98
|
+
*/
|
|
99
|
+
async getCheckpoint(id) {
|
|
100
|
+
const checkpointFile = path.join(this.checkpointDir, `${id}.json`);
|
|
101
|
+
|
|
102
|
+
if (await fs.pathExists(checkpointFile)) {
|
|
103
|
+
return await fs.readJson(checkpointFile);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Delete checkpoint
|
|
111
|
+
* @param {string} id - Checkpoint ID
|
|
112
|
+
*/
|
|
113
|
+
async deleteCheckpoint(id) {
|
|
114
|
+
const checkpointFile = path.join(this.checkpointDir, `${id}.json`);
|
|
115
|
+
|
|
116
|
+
if (await fs.pathExists(checkpointFile)) {
|
|
117
|
+
await fs.remove(checkpointFile);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Request user approval for checkpoint
|
|
123
|
+
* @param {Object} checkpoint - Checkpoint object
|
|
124
|
+
* @returns {boolean} - Approval result
|
|
125
|
+
*/
|
|
126
|
+
async requestUserApproval(checkpoint) {
|
|
127
|
+
// This would integrate with CLI to request user input
|
|
128
|
+
// For now, return true (actual implementation would prompt user)
|
|
129
|
+
console.log(`Checkpoint created: ${checkpoint.type}`);
|
|
130
|
+
console.log(`Phase: ${checkpoint.phase}`);
|
|
131
|
+
console.log(`Requires approval: ${checkpoint.requiresUserApproval}`);
|
|
132
|
+
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Wait for user input with timeout
|
|
138
|
+
* @param {Object} checkpoint - Checkpoint object
|
|
139
|
+
* @param {number} timeout - Timeout in milliseconds
|
|
140
|
+
* @returns {boolean} - User response
|
|
141
|
+
*/
|
|
142
|
+
async waitForUserInput(checkpoint, timeout = 300000) {
|
|
143
|
+
// This would wait for user input with timeout
|
|
144
|
+
// For now, return true immediately
|
|
145
|
+
return await this.requestUserApproval(checkpoint);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Rollback to checkpoint
|
|
150
|
+
* @param {string} id - Checkpoint ID
|
|
151
|
+
* @returns {Object} - Rollback result
|
|
152
|
+
*/
|
|
153
|
+
async rollbackToCheckpoint(id) {
|
|
154
|
+
const checkpoint = await this.getCheckpoint(id);
|
|
155
|
+
|
|
156
|
+
if (!checkpoint) {
|
|
157
|
+
throw new Error(`Checkpoint not found: ${id}`);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const result = {
|
|
161
|
+
success: true,
|
|
162
|
+
checkpoint,
|
|
163
|
+
filesRestored: [],
|
|
164
|
+
errors: []
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
// Restore files (simplified - actual implementation would restore file contents)
|
|
168
|
+
for (const file of checkpoint.data.filesModified) {
|
|
169
|
+
try {
|
|
170
|
+
// In real implementation, restore file from backup
|
|
171
|
+
result.filesRestored.push(file);
|
|
172
|
+
} catch (error) {
|
|
173
|
+
result.errors.push({ file, error: error.message });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
result.success = result.errors.length === 0;
|
|
178
|
+
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Create rollback point (backup current state)
|
|
184
|
+
* @returns {string} - Rollback point ID
|
|
185
|
+
*/
|
|
186
|
+
async createRollbackPoint() {
|
|
187
|
+
const rollbackId = this.generateCheckpointId();
|
|
188
|
+
|
|
189
|
+
// In real implementation, backup current file state
|
|
190
|
+
// For now, just return ID
|
|
191
|
+
|
|
192
|
+
return rollbackId;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Validate rollback feasibility
|
|
197
|
+
* @param {string} id - Checkpoint ID
|
|
198
|
+
* @returns {Object} - Validation result
|
|
199
|
+
*/
|
|
200
|
+
async validateRollback(id) {
|
|
201
|
+
const checkpoint = await this.getCheckpoint(id);
|
|
202
|
+
|
|
203
|
+
if (!checkpoint) {
|
|
204
|
+
return {
|
|
205
|
+
valid: false,
|
|
206
|
+
reason: 'Checkpoint not found'
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Check for conflicts (files modified outside autonomous execution)
|
|
211
|
+
const conflicts = [];
|
|
212
|
+
|
|
213
|
+
return {
|
|
214
|
+
valid: conflicts.length === 0,
|
|
215
|
+
conflicts
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Check if checkpoint should be created for type
|
|
221
|
+
* @param {string} type - Checkpoint type
|
|
222
|
+
* @returns {boolean}
|
|
223
|
+
*/
|
|
224
|
+
shouldCreateCheckpoint(type) {
|
|
225
|
+
if (!this.config.checkpoints) return true;
|
|
226
|
+
|
|
227
|
+
const typeMap = {
|
|
228
|
+
[CHECKPOINT_TYPES.REQUIREMENTS_COMPLETE]: 'requirementsReview',
|
|
229
|
+
[CHECKPOINT_TYPES.DESIGN_COMPLETE]: 'designReview',
|
|
230
|
+
[CHECKPOINT_TYPES.TASKS_COMPLETE]: 'tasksReview',
|
|
231
|
+
[CHECKPOINT_TYPES.PHASE_COMPLETE]: 'phaseCompletion',
|
|
232
|
+
[CHECKPOINT_TYPES.FINAL_REVIEW]: 'finalReview'
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
const configKey = typeMap[type];
|
|
236
|
+
if (configKey && this.config.checkpoints[configKey] !== undefined) {
|
|
237
|
+
return this.config.checkpoints[configKey];
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Check if checkpoint requires user approval
|
|
245
|
+
* @param {string} type - Checkpoint type
|
|
246
|
+
* @returns {boolean}
|
|
247
|
+
*/
|
|
248
|
+
shouldRequireApproval(type) {
|
|
249
|
+
const approvalRequired = [
|
|
250
|
+
CHECKPOINT_TYPES.FATAL_ERROR,
|
|
251
|
+
CHECKPOINT_TYPES.EXTERNAL_RESOURCE_NEEDED,
|
|
252
|
+
CHECKPOINT_TYPES.FINAL_REVIEW
|
|
253
|
+
];
|
|
254
|
+
|
|
255
|
+
return approvalRequired.includes(type);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Get checkpoint configuration
|
|
260
|
+
* @returns {Object} - Configuration
|
|
261
|
+
*/
|
|
262
|
+
getCheckpointConfig() {
|
|
263
|
+
return this.config.checkpoints || {};
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Cleanup old checkpoints (keep only last N)
|
|
268
|
+
*/
|
|
269
|
+
async cleanupOldCheckpoints() {
|
|
270
|
+
const checkpoints = await this.listCheckpoints();
|
|
271
|
+
|
|
272
|
+
if (checkpoints.length > this.maxCheckpoints) {
|
|
273
|
+
const toDelete = checkpoints.slice(this.maxCheckpoints);
|
|
274
|
+
|
|
275
|
+
for (const checkpoint of toDelete) {
|
|
276
|
+
await this.deleteCheckpoint(checkpoint.id);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Handle phase completion
|
|
283
|
+
* @param {string} phase - Phase name
|
|
284
|
+
*/
|
|
285
|
+
async onPhaseComplete(phase) {
|
|
286
|
+
if (this.shouldCreateCheckpoint(CHECKPOINT_TYPES.PHASE_COMPLETE)) {
|
|
287
|
+
await this.createCheckpoint(CHECKPOINT_TYPES.PHASE_COMPLETE, { phase });
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Generate unique checkpoint ID
|
|
293
|
+
* @returns {string} - Checkpoint ID
|
|
294
|
+
*/
|
|
295
|
+
generateCheckpointId() {
|
|
296
|
+
return `checkpoint-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
module.exports = { CheckpointManager, CHECKPOINT_TYPES };
|